xingzai 9 ماه پیش
والد
کامیت
c905878cfb

+ 20 - 0
models/roadshow/calendar.go

@@ -121,6 +121,14 @@ func GetRsCalendarResearcherById(rsCalendarId int) (item *RsCalendarResearcher,
 	return
 }
 
+// 根据会议ID,研究员ID获取会议详情
+func GetRsCalendarResearcherByRsCalendarIdAndResearcherId(rsCalendarId, researcherId int) (item *RsCalendarResearcher, err error) {
+	sql := `SELECT * FROM rs_calendar_researcher WHERE rs_calendar_id=? AND researcher_id = ? `
+	o := orm.NewOrm()
+	err = o.Raw(sql, rsCalendarId, researcherId).QueryRow(&item)
+	return
+}
+
 func GetRsCalendarResearcherByIds(rsCalendarResearcherId []int) (items []*RsCalendarResearcher, err error) {
 	lenArr := len(rsCalendarResearcherId)
 	if lenArr == 0 {
@@ -186,3 +194,15 @@ func ModifyRsCalendarResearcherStatusDel(rsCalendarResearcherIds []int) (err err
 	_, err = o.Raw(sql, rsCalendarResearcherIds).Exec()
 	return
 }
+
+// 更新活动信息
+func UpdateRsCalendar(where, updateParams map[string]interface{}) error {
+	o := orm.NewOrm()
+	ptrStructOrTableName := "rs_calendar"
+	qs := o.QueryTable(ptrStructOrTableName)
+	for expr, exprV := range where {
+		qs = qs.Filter(expr, exprV)
+	}
+	_, err := qs.Update(updateParams)
+	return err
+}

+ 7 - 0
models/roadshow/rs_calendar_relation.go

@@ -322,3 +322,10 @@ func SyncRsCalendarRelation(thirdUserCalendar UserCalendar, createUser *system.A
 
 	return
 }
+
+// AddRsCalendarRelation 添加自系统路演与第三方路演关系
+func AddRsCalendarRelation(item *RsCalendarRelation) (lastId int64, err error) {
+	o := orm.NewOrm()
+	lastId, err = o.Insert(item)
+	return
+}

+ 10 - 0
models/roadshow/shanghai_calendar.go

@@ -39,3 +39,13 @@ type UserCalendarList struct {
 	Time int            `json:"time"`
 	Data []UserCalendar `json:"data"`
 }
+
+type CreatSHCalendarResp struct {
+	Code int      `json:"code"`
+	Msg  string   `json:"msg"`
+	Time int      `json:"time"`
+	Data Calendar `json:"data"`
+}
+type Calendar struct {
+	CalendarID string `json:"calendar_id"`
+}

+ 15 - 1
models/system/sys_admin.go

@@ -1,6 +1,9 @@
 package system
 
-import "time"
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
 
 type AdminItem struct {
 	AdminId                 int    `description:"系统用户id"`
@@ -36,3 +39,14 @@ type AdminItem struct {
 	EmployeeId              string `description:"员工工号(钉钉/每刻报销)"`
 	TelAreaCode             string `description:"手机区号"`
 }
+
+func GetSysuserList(condition string, pars []interface{}, startSize, pageSize int) (items []*AdminItem, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM admin WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	sql += `ORDER BY enabled DESC, last_updated_time DESC, created_time DESC LIMIT ?,?`
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}

+ 179 - 5
services/roadshow/calendar.go

@@ -15,6 +15,7 @@ import (
 	"io/ioutil"
 	netHttp "net/http"
 	"net/url"
+	"strconv"
 	"strings"
 	"sync"
 	"time"
@@ -262,11 +263,11 @@ func getCalendarFrom(userPhone, startDate, endDate string) (list []roadshow.User
 }
 
 //func init() {
-//	SyncCalendarFromShanghai77()
+//	SyncCalendarFromShanghai()
 //}
 
 // SyncCalendarFromShanghai 上海路演数据同步到自系统
-func SyncCalendarFromShanghai77() (err error) {
+func SyncCalendarFromShanghai() (err error) {
 	errMsgList := make([]string, 0)
 	defer func() {
 		if len(errMsgList) > 0 {
@@ -317,8 +318,13 @@ func SyncCalendarFromShanghai77() (err error) {
 		return
 	}
 	mapUserInfo := make(map[string]*system.AdminItem)
+	mapAdminIdMobil := make(map[int]string) // 研究员ID与手机号的关系
 	for _, v := range adminList {
+		if v.Mobile == "" {
+			continue
+		}
 		mapUserInfo[v.Mobile] = v
+		mapAdminIdMobil[v.AdminId] = v.Mobile
 	}
 	//获取前后三十天的信息
 	startDate := time.Now().AddDate(0, 0, -30).Format(utils.FormatDate)
@@ -349,6 +355,7 @@ func SyncCalendarFromShanghai77() (err error) {
 		errMsgList = append(errMsgList, fmt.Sprint("获取研究员日程信息失败:手机号:", userPhone, ";err:"+tmpErr.Error(), ";"))
 		return
 	}
+	//return
 	//待删除的活动路演
 	deleteRsCalendarResearcherMap := make(map[int][]*roadshow.RsCalendarResearcherRelationInfo)
 	for _, v := range rsCalendarResearcherList {
@@ -362,6 +369,8 @@ func SyncCalendarFromShanghai77() (err error) {
 	}
 
 	thirdIdList := make([]int, 0)
+	mapRsCalendar := make(map[int]*roadshow.RsCalendar)
+
 	if len(list) > 0 {
 		for _, v := range list {
 			thirdIdList = append(thirdIdList, v.ID)
@@ -411,7 +420,7 @@ func SyncCalendarFromShanghai77() (err error) {
 			errMsgList = append(errMsgList, fmt.Sprint("日历ID:", rsCalendarIds, "获取路演信息失败;err:"+tmpErr.Error(), ";"))
 			return
 		}
-		mapRsCalendar := make(map[int]*roadshow.RsCalendar)
+
 		for _, v := range rsCalendarInfoList {
 			mapRsCalendar[v.RsCalendarId] = v
 		}
@@ -493,11 +502,11 @@ func SyncCalendarFromShanghai77() (err error) {
 						if len(maprsCalendarResearcherList[rsCalendarInfo.RsCalendarId]) == 0 {
 							continue
 						}
-						rsCalendarResearcherListAdd := maprsCalendarResearcherList[rsCalendarInfo.RsCalendarId]
+						rsCalendarResearcherListUpdate := maprsCalendarResearcherList[rsCalendarInfo.RsCalendarId] // 活动中包含的多个研究员
 
 						//现有活动中的研究员
 						rsCalendarResearcherMap := make(map[int]*roadshow.RsCalendarResearcher)
-						for _, rsCalendarResearcher := range rsCalendarResearcherListAdd {
+						for _, rsCalendarResearcher := range rsCalendarResearcherListUpdate {
 							if _, ok := researcherMap[rsCalendarResearcher.ResearcherId]; ok {
 								if isUpdate {
 									updateResearcherList = append(updateResearcherList, rsCalendarResearcher)
@@ -601,5 +610,170 @@ func SyncCalendarFromShanghai77() (err error) {
 		}
 	}
 
+	mapShangHaiResearcher := make(map[string][]string)
+	for _, v := range list {
+		researcherMobileList := strings.Split(v.ResearcherMobile, ",")
+		for _, vm := range researcherMobileList {
+			mapShangHaiResearcher[vm] = append(mapShangHaiResearcher[vm], time.Unix(int64(v.StartTime), 0).Format(utils.FormatDateTime))
+		}
+	}
+
+	for _, v := range rsCalendarResearcherList {
+		mobileResearcher := mapAdminIdMobil[v.ResearcherId] //研究员手机号
+		if mobileResearcher == "" {
+			continue
+		}
+		//如果手机号对应的开始时间不存在,就把这场活动同步到上海那边
+		if !utils.InArrayByStr(mapShangHaiResearcher[mobileResearcher], fmt.Sprint(v.StartDate, " ", v.StartTime)) {
+			if mapRsCalendar[v.RsCalendarId] == nil {
+				continue
+			}
+			CalendarToSH(mapRsCalendar[v.RsCalendarId], v.ResearcherId)
+			time.Sleep(3000 * time.Millisecond) // 延迟3秒
+		}
+	}
+	return
+}
+
+// CalendarToSH 创建活动时同步上海的前置函数
+func CalendarToSH(rsCalendar *roadshow.RsCalendar, researcherId int) {
+	var err error
+	errMsg := ``
+	defer func() {
+		if err != nil {
+			errMsg = err.Error() + ";" + errMsg
+			fmt.Println(errMsg)
+			go alarm_msg.SendAlarmMsg("新建上海研究员日历失败,ERR:"+err.Error()+";errMsg:"+errMsg, 3)
+			//go utils.SendEmail(utils.APPNAME+"新建上海研究员日历失败:"+time.Now().Format("2006-01-02 15:04:05"), err.Error(), utils.EmailSendToUsers)
+		}
+	}()
+	//redis获取创建者及研究员信息
+	userInfo, err := getAdminInfoById(rsCalendar.SysUserId)
+	if err != nil {
+		utils.FileLog.Info("getAdminInfoById err: " + err.Error())
+		return
+	}
+	researcher, err := roadshow.GetRsCalendarResearcherByRsCalendarIdAndResearcherId(rsCalendar.RsCalendarId, researcherId)
+	if err != nil {
+		utils.FileLog.Info("getAdminInfoById err: " + err.Error())
+		return
+	}
+	researcherInfo, err := getAdminInfoById(researcher.ResearcherId)
+
+	if err != nil {
+		utils.FileLog.Info("getAdminInfoById err: " + err.Error())
+		return
+	}
+
+	sTime, _ := time.ParseInLocation(utils.FormatDateTime, researcher.StartDate+" "+researcher.StartTime, time.Now().Location())
+	startTime := sTime.Format("2006-01-02 15:04")
+	eTime, _ := time.ParseInLocation(utils.FormatDateTime, researcher.EndDate+" "+researcher.EndTime, time.Now().Location())
+	endTime := eTime.Format("2006-01-02 15:04")
+
+	// 创建上海路演日程
+	err, errMsg = creatSHCalendar(userInfo.Mobile, researcherInfo.Mobile, rsCalendar.Title, startTime, endTime, 1, researcher.RsCalendarResearcherId)
+	if err != nil {
+		utils.FileLog.Info("CreatSHCalendar err: " + err.Error())
+		fmt.Println(err)
+		return
+	}
+
+	// 更新路演与研究员关系表的同步字段
+	whereParams := make(map[string]interface{})
+	updateParams := make(map[string]interface{})
+	whereParams["rs_calendar_researcher_id"] = researcher.RsCalendarResearcherId
+	updateParams["is_synced"] = 1
+	updateParams["modify_time"] = time.Now()
+	err = roadshow.UpdateCalendarResearcher(whereParams, updateParams)
+	if err != nil {
+		utils.FileLog.Info("UpdateCalendarResearcher err: " + err.Error())
+		fmt.Println("UpdateCalendarResearcher err: " + err.Error())
+		return
+	}
+
+	// 更新路演的同步字段
+	calWhereParams := make(map[string]interface{})
+	calWhereParams["rs_calendar_id"] = rsCalendar.RsCalendarId
+	err = roadshow.UpdateRsCalendar(calWhereParams, updateParams)
+	if err != nil {
+		utils.FileLog.Info("UpdateRsCalendar err: " + err.Error())
+		fmt.Println("UpdateRsCalendar err: " + err.Error())
+		return
+	}
+}
+
+// creatSHCalendar 新增上海日历活动
+func creatSHCalendar(userPhone, toUserPhone, content, startTime, endTime string, calendarType int8, selfCalendarId int) (err error, errMsg string) {
+	logMsg := ``
+	defer func() {
+		if err != nil {
+			if logMsg != `` {
+				errMsg = logMsg
+			}
+		}
+	}()
+	finalUrl := utils.CRM_OPEN_API_URL + "/v1/Calendar/create"
+
+	form := url.Values{
+		"user_phone":    {userPhone},
+		"to_user_phone": {toUserPhone},
+		"content":       {content},
+		"start_time":    {startTime},
+		"end_time":      {endTime},
+	}
+	//发送创建请求
+	body, err, logMsg := postCurl(finalUrl, form, 0)
+	if err != nil {
+		err = errors.New("NewRequest Err:" + err.Error())
+		return
+	}
+	var creatSHCalendarResp roadshow.CreatSHCalendarResp
+	err = json.Unmarshal(body, &creatSHCalendarResp)
+	if err != nil {
+		err = errors.New("Unmarshal Err:" + err.Error())
+		return
+	}
+	calendar := creatSHCalendarResp.Data
+
+	//上海系统id
+	sThirdId := calendar.CalendarID
+	thirdId, err := strconv.Atoi(sThirdId)
+	if err != nil {
+		err = errors.New("string to int Err:" + err.Error())
+		return
+	}
+	// 添加自系统与上海系统的路演关系
+	relationItem := roadshow.RsCalendarRelation{
+		UserPhone:        userPhone,
+		CalendarType:     calendarType,
+		SelfCalendarId:   selfCalendarId,
+		ThirdCalendarId:  thirdId,
+		Title:            content,
+		ResearcherMobile: toUserPhone,
+		ModifyTime:       time.Now(),
+		CreateTime:       time.Now(),
+	}
+	_, err = roadshow.AddRsCalendarRelation(&relationItem)
+	if err != nil {
+		err = errors.New("AddRsCalendarRelation Err:" + err.Error())
+		fmt.Println(err)
+		return
+	}
+	return
+}
+
+func getAdminInfoById(sysId int) (adminInfo system.AdminItem, err error) {
+	adminMap := make(map[int]system.AdminItem)
+	list, err := system.GetSysuserList("", []interface{}{}, 0, 1000)
+	//	GetSysuserList
+	for _, tmpAdminInfo := range list {
+		adminMap[tmpAdminInfo.AdminId] = *tmpAdminInfo
+	}
+
+	adminInfo, ok := adminMap[sysId]
+	if !ok {
+		err = fmt.Errorf("找不到该用户id,sysId:" + fmt.Sprint(sysId))
+	}
+
 	return
 }

+ 1 - 1
services/task.go

@@ -39,7 +39,7 @@ func InitTask() {
 			go alarm_msg.SendAlarmMsg(utils.APPNAME+"崩了"+time.Now().Format("2006-01-02 15:04:05")+"\n"+stack, 3)
 		}
 	}()
-	comein.SyncWhiteList(nil)
+	//comein.SyncWhiteList(nil)
 	// 实际开始定时任务
 	Task()
 }

+ 29 - 0
utils/constants.go

@@ -223,3 +223,32 @@ const (
 
 	ROLE_TYPE_SELLERS = "'ficc_admin','ficc_seller','ficc_team','rai_admin','rai_seller','ficc_group','rai_group','ficc_department','rai_department','compliance','finance'"
 )
+
+// 缓存key
+const (
+	CACHE_KEY_LOGS                      = "HZ_ADMIN_CACHE_KEY_LOGS"             //api用户操作日志队列
+	CACHE_KEY_ADMIN                     = "calendar:admin:list"                 //系统用户列表缓存key
+	CACHE_KEY_ADMIN_ID                  = "calendar:admin:id:list"              //系统用户列表缓存key
+	CACHE_KEY_OLD_REPORT_PUBLISH        = "HZ_CACHE_KEY_OLD_REPORT_PUBLISH"     //老后台报告发布队列
+	CACHE_ADMIN_YB_CONFIG               = "admin:yb_config:"                    //研报配置相关缓存前缀
+	CACHE_WIND_URL                      = "CACHE_WIND_URL"                      //指标与wind服务器的绑定关系
+	CACHE_CHART_INFO_DATA               = "chart:info:data:"                    //图表数据
+	CACHE_CHART_CLASSIFY                = "chart:classify"                      //图表分类数据
+	CACHE_IMPORT_MANUAL_DATA            = "import:manual:data"                  //手工数据导入后刷新
+	CACHE_ACCESS_TOKEN_LOGIN            = "pc_admin:login:"                     //管理后台登录
+	CACHE_ACCESS_TOKEN_LOGIN_NO_TRUST   = "pc_admin:login:no_trust:"            //管理后台登录(不可信登录态)
+	CACHE_ABNORMAL_LOGIN                = "pc_admin:login:abnormal:"            //管理后台登录-异常登录
+	CACHE_LOGIN_ERR_PASS                = "pc_admin:login:errPass:"             //管理后台登录-输入错误密码次数
+	CACHE_FIND_PASS_VERIFY              = "pc_admin:findPass:verify:"           //找回密码校验成功标记
+	CACHE_KEY_COMPANY_MATCH_PRE         = "admin:company:match:"                //客户名单匹配
+	CACHE_KEY_MYSTEEL_REFRESH           = "mysteel_chemical:refresh"            //钢联化工刷新
+	CACHE_KEY_DAYNEW_REFRESH            = "admin:day_new:refresh"               //每日资讯拉取企业微信聊天记录
+	CACHE_KEY_DAYNEW_TRANSLATE          = "admin:day_new:translate"             //每日资讯中翻英
+	CACHE_KEY_ADMIN_OPERATE_RECORD      = "HZ_ADMIN_CACHE_ADMIN_OPERATE_RECORD" //系统用户操作日志队列
+	CACHE_KEY_SHANG_HAI_RS_CALENDAR_API = "hz_crm_shang_hai_rs_calendar_api"    //上海研究员日历同步队列
+
+	CACHE_SYNC_ADMIN      = "hz_crm_eta:sync_admin"      // 同步用户的缓存队列key
+	CACHE_SYNC_ROLE       = "hz_crm_eta:sync_role"       // 同步角色的缓存队列key
+	CACHE_SYNC_DEPARTMENT = "hz_crm_eta:sync_department" // 同步部门的缓存队列key
+	CACHE_SYNC_GROUP      = "hz_crm_eta:sync_group"      // 同步分组的缓存队列key
+)