calendar.go 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164
  1. package roadshow
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "github.com/rdlucklib/rdluck_tools/http"
  7. "hongze/hz_crm_api/models/company"
  8. "hongze/hz_crm_api/models/cygx"
  9. "hongze/hz_crm_api/models/roadshow"
  10. "hongze/hz_crm_api/models/system"
  11. "hongze/hz_crm_api/services/alarm_msg"
  12. "hongze/hz_crm_api/utils"
  13. "io/ioutil"
  14. netHttp "net/http"
  15. "net/url"
  16. "strconv"
  17. "strings"
  18. "time"
  19. )
  20. type SyncCalendarFromShanghaiRecord struct {
  21. UserPhone string `description:"手机号"`
  22. StartDate string `description:"开始时间"`
  23. EndDate string `description:"结束时间"`
  24. }
  25. // 上海路演数据同步到自系统 从Redis获取
  26. func InsertSyncCalendarFromShanghai() {
  27. var err error
  28. defer func() {
  29. if err != nil {
  30. go alarm_msg.SendAlarmMsg("上海路演数据同步到自系统 失败;InsertSyncCalendarFromShanghai ERR:"+err.Error(), 3)
  31. }
  32. }()
  33. for {
  34. utils.Rc.Brpop(utils.CACHE_KEY_SHANG_HAI_RS_CALENDAR_API, func(b []byte) {
  35. record := new(SyncCalendarFromShanghaiRecord)
  36. if err := json.Unmarshal(b, &record); err != nil {
  37. fmt.Println("json unmarshal wrong!")
  38. }
  39. //fmt.Println(record.UserPhone)
  40. _ = SyncCalendarFromShanghai(record.UserPhone, record.StartDate, record.EndDate)
  41. })
  42. }
  43. }
  44. // 上海路演数据同步到自系统请求放到Redis
  45. func InsertSyncCalendarFromShanghaiLPush(userPhone, startDate, endDate string) bool {
  46. log := &SyncCalendarFromShanghaiRecord{UserPhone: userPhone, StartDate: startDate, EndDate: endDate}
  47. if utils.Re == nil {
  48. err := utils.Rc.LPush(utils.CACHE_KEY_SHANG_HAI_RS_CALENDAR_API, log)
  49. if err != nil {
  50. fmt.Println(err)
  51. go alarm_msg.SendAlarmMsg("上海路演数据同步到自系统 失败;InsertSyncCalendarFromShanghaiLPush ERR:"+err.Error(), 3)
  52. }
  53. return true
  54. }
  55. return false
  56. }
  57. // getAccessToken token内部请求接口
  58. func getAccessToken() (tokenData roadshow.TokenData, err error) {
  59. defer func() {
  60. if err != nil {
  61. go alarm_msg.SendAlarmMsg("更新上海的token失败;ERR:"+err.Error(), 3)
  62. //go utils.SendEmail(utils.APPNAME+"更新上海的token失败:"+time.Now().Format("2006-01-02 15:04:05"), err.Error(), utils.EmailSendToUsers)
  63. }
  64. }()
  65. getUrl := fmt.Sprintf(utils.CRM_OPEN_API_URL+"/v1/auth/getAccessToken?app_key=%s&app_secret=%s", utils.CRM_OPEN_API_APP_KEY, utils.CRM_OPEN_API_APP_SECRET)
  66. body, err := http.Get(getUrl)
  67. if err != nil {
  68. err = errors.New("NewRequest Err:" + err.Error())
  69. return
  70. }
  71. var tokenResp roadshow.GetTokenResp
  72. err = json.Unmarshal(body, &tokenResp)
  73. if err != nil {
  74. err = errors.New("Unmarshal Err:" + err.Error())
  75. return
  76. }
  77. if tokenResp.Code != 1 {
  78. err = errors.New("getAccessToken err:" + tokenResp.Msg)
  79. return
  80. }
  81. tokenData = tokenResp.TokenData
  82. return
  83. }
  84. // refreshAccessToken 强制刷新获取accessToken
  85. func refreshAccessToken() (token string, err error) {
  86. defer func() {
  87. if err != nil {
  88. go alarm_msg.SendAlarmMsg("刷新上海的token失败;ERR:"+err.Error(), 3)
  89. //go utils.SendEmail(utils.APPNAME+"刷新上海的token失败:"+time.Now().Format("2006-01-02 15:04:05"), err.Error(), utils.EmailSendToUsers)
  90. }
  91. }()
  92. tokenInfo, tmpErr := getAccessToken()
  93. if tmpErr != nil {
  94. err = tmpErr
  95. return
  96. }
  97. token = tokenInfo.AccessToken
  98. //token存入redis
  99. err = utils.Rc.Put("SH_ACCESS_TOKEN", token, time.Duration(tokenInfo.ExpireIn-600)*time.Second)
  100. if err != nil {
  101. go alarm_msg.SendAlarmMsg("获取上海的token失败;上海token存入redis失败,ERR:"+err.Error(), 3)
  102. //go utils.SendEmail(utils.APPNAME+"获取上海的token失败:"+time.Now().Format("2006-01-02 15:04:05"), "上海token存入redis失败:", utils.EmailSendToUsers)
  103. }
  104. return
  105. }
  106. // getCalendarFrom 获取上海方的路演活动列表
  107. func getCalendarFrom(userPhone, startDate, endDate string) (list []roadshow.UserCalendar, err error) {
  108. exUrl := utils.CRM_OPEN_API_URL + "/v1/calendar/userCalendarList"
  109. form := url.Values{
  110. "user_phone": {userPhone},
  111. "start_time": {startDate},
  112. "end_time": {endDate},
  113. }
  114. body, err := getCurl(exUrl, form, 0)
  115. if err != nil {
  116. err = errors.New("NewRequest Err:" + err.Error())
  117. return
  118. }
  119. var userCalendarList roadshow.UserCalendarList
  120. err = json.Unmarshal(body, &userCalendarList)
  121. if err != nil {
  122. err = errors.New("Unmarshal Err:" + err.Error())
  123. return
  124. }
  125. list = userCalendarList.Data
  126. //fmt.Println(response)
  127. //userCalendarList := response.([]interface{})
  128. //
  129. //for _, userCalendar := range userCalendarList {
  130. // fmt.Println(userCalendar)
  131. // fmt.Printf("type :%T;\n", userCalendar)
  132. // //list = append(list, userCalendar.(roadshow.UserCalendar))
  133. //}
  134. //fmt.Println(userCalendarList)
  135. //list = userCalendarList
  136. return
  137. }
  138. // creatSHCalendar 新增上海日历活动
  139. func creatSHCalendar(userPhone, toUserPhone, content, startTime, endTime string, calendarType int8, selfCalendarId int) (err error, errMsg string) {
  140. logMsg := ``
  141. defer func() {
  142. if err != nil {
  143. if logMsg != `` {
  144. errMsg = logMsg
  145. }
  146. }
  147. }()
  148. finalUrl := utils.CRM_OPEN_API_URL + "/v1/Calendar/create"
  149. form := url.Values{
  150. "user_phone": {userPhone},
  151. "to_user_phone": {toUserPhone},
  152. "content": {content},
  153. "start_time": {startTime},
  154. "end_time": {endTime},
  155. }
  156. //发送创建请求
  157. body, err, logMsg := postCurl(finalUrl, form, 0)
  158. if err != nil {
  159. err = errors.New("NewRequest Err:" + err.Error())
  160. return
  161. }
  162. var creatSHCalendarResp roadshow.CreatSHCalendarResp
  163. err = json.Unmarshal(body, &creatSHCalendarResp)
  164. if err != nil {
  165. err = errors.New("Unmarshal Err:" + err.Error())
  166. return
  167. }
  168. calendar := creatSHCalendarResp.Data
  169. //上海系统id
  170. sThirdId := calendar.CalendarID
  171. thirdId, err := strconv.Atoi(sThirdId)
  172. if err != nil {
  173. err = errors.New("string to int Err:" + err.Error())
  174. return
  175. }
  176. // 添加自系统与上海系统的路演关系
  177. relationItem := roadshow.RsCalendarRelation{
  178. UserPhone: userPhone,
  179. CalendarType: calendarType,
  180. SelfCalendarId: selfCalendarId,
  181. ThirdCalendarId: thirdId,
  182. Title: content,
  183. ResearcherMobile: toUserPhone,
  184. ModifyTime: time.Now(),
  185. CreateTime: time.Now(),
  186. }
  187. _, err = roadshow.AddRsCalendarRelation(&relationItem)
  188. if err != nil {
  189. err = errors.New("AddRsCalendarRelation Err:" + err.Error())
  190. fmt.Println(err)
  191. return
  192. }
  193. return
  194. }
  195. // updateSHCalendar 内部函数,只用于发送修改上海日历的http请求
  196. func updateSHCalendar(thirdCalendarId, researcherMobile, content, startTime, endTime string) (calendarResp roadshow.CreatSHCalendarResp, err error) {
  197. finalUrl := utils.CRM_OPEN_API_URL + "/v1/Calendar/update"
  198. form := url.Values{
  199. "calendar_id": {thirdCalendarId},
  200. "to_user_phone": {researcherMobile},
  201. "content": {content},
  202. "start_time": {startTime},
  203. "end_time": {endTime},
  204. }
  205. //发送创建请求
  206. _, err, _ = postCurl(finalUrl, form, 0)
  207. if err != nil {
  208. err = errors.New("NewRequest Err:" + err.Error())
  209. return
  210. }
  211. return
  212. }
  213. // deleteSHCalendar 删除上海方的路演
  214. func deleteSHCalendar(userPhone string, calendarId int) (err error) {
  215. finalUrl := utils.CRM_OPEN_API_URL + "/v1/Calendar/delete"
  216. form := url.Values{
  217. "user_phone": {userPhone},
  218. "calendar_id": {fmt.Sprintf("%v", calendarId)},
  219. }
  220. //发送创建请求
  221. _, err, _ = postCurl(finalUrl, form, 0)
  222. if err != nil {
  223. err = errors.New("NewRequest Err:" + err.Error())
  224. return
  225. }
  226. return
  227. }
  228. // ShResponse 上海数据返回结构体
  229. type ShResponse struct {
  230. Code int `json:"code" description:"1:正常返回;4001:token失效"`
  231. Msg string `json:"msg" description:"文字描述"`
  232. Time int `json:"time" description:"时间戳"`
  233. Data interface{} `json:"data" description:"业务数据"`
  234. }
  235. // getCurl get请求上海接口
  236. func getCurl(urlStr string, params url.Values, num int) (body []byte, err error) {
  237. if err != nil {
  238. go alarm_msg.SendAlarmMsg("get请求上海接口失败,ERR:"+err.Error(), 3)
  239. //go utils.SendEmail(utils.APPNAME+"get请求上海接口失败:"+time.Now().Format("2006-01-02 15:04:05"), "get请求上海接口失败:"+err.Error(), utils.EmailSendToUsers)
  240. }
  241. token, err := GetAccessToken(false)
  242. if err != nil {
  243. return
  244. }
  245. params.Add("access_token", token)
  246. getUrl := urlStr + "?" + params.Encode()
  247. body, err = http.Get(getUrl)
  248. if err != nil {
  249. utils.FileLog.Info(fmt.Sprint("get Err:", err.Error(), ";url:", getUrl, ";params:", params.Encode(), ";response:", string(body)))
  250. err = errors.New("NewRequest Err:" + err.Error())
  251. return
  252. }
  253. var response ShResponse
  254. err = json.Unmarshal(body, &response)
  255. if err != nil {
  256. utils.FileLog.Info(fmt.Sprint("get Err:", err.Error(), ";url:", getUrl, ";params:", params.Encode(), ";response:", string(body)))
  257. err = errors.New("Unmarshal Err:" + err.Error())
  258. return
  259. }
  260. //如果是token失效,同时只是第一次请求(没有尝试强制刷新token,那么重新请求)
  261. if response.Code == 4001 && num <= 0 {
  262. utils.FileLog.Info(fmt.Sprint("get data err", ";url:", getUrl, ";params:", params.Encode(), ";response:", string(body)))
  263. //token失效
  264. _, tmpErr := refreshAccessToken()
  265. if tmpErr != nil {
  266. err = tmpErr
  267. }
  268. num++
  269. params.Del("access_token")
  270. return getCurl(urlStr, params, num)
  271. } else if response.Code != 1 {
  272. utils.FileLog.Info(fmt.Sprint("get data err", ";url:", getUrl, ";params:", params.Encode(), ";response:", string(body)))
  273. err = errors.New(response.Msg)
  274. return
  275. }
  276. itemApiLog := new(roadshow.RsCalendarApiLog)
  277. itemApiLog.CreateTime = time.Now()
  278. itemApiLog.Remark = "get请求上海接口"
  279. itemApiLog.Url = getUrl
  280. itemApiLog.Body = utils.ReplaceSpaceAndWrap(fmt.Sprint(params))
  281. itemApiLog.Result = string(body)
  282. go roadshow.AddRsCalendarApiLog(itemApiLog)
  283. return
  284. }
  285. // postCurl post请求上海接口
  286. func postCurl(urlStr string, form url.Values, num int) (body []byte, err error, errMsg string) {
  287. logMsg := ``
  288. defer func() {
  289. if err != nil {
  290. if logMsg != `` {
  291. errMsg = logMsg
  292. go alarm_msg.SendAlarmMsg("post请求上海接口失败,ERR:"+err.Error()+";errMsg:"+errMsg, 3)
  293. //go utils.SendEmail(utils.APPNAME+"post请求上海接口失败:"+time.Now().Format("2006-01-02 15:04:05"), "post请求上海接口失败:"+errMsg, utils.EmailSendToUsers)
  294. }
  295. }
  296. }()
  297. token, err := GetAccessToken(false)
  298. if err != nil {
  299. return
  300. }
  301. finalUrl := urlStr + "?access_token=" + token
  302. //发送创建请求
  303. resp, err := netHttp.PostForm(finalUrl, form)
  304. if err != nil {
  305. err = errors.New("NewRequest Err:" + err.Error())
  306. return
  307. }
  308. defer resp.Body.Close()
  309. //解析resp并且存入关联表
  310. body, err = ioutil.ReadAll(resp.Body)
  311. if err != nil {
  312. logMsg = fmt.Sprint("post err; request:", form.Encode(), "; errMsg:", err.Error())
  313. utils.FileLog.Info(logMsg)
  314. return
  315. }
  316. logMsg = fmt.Sprint("post request:", form.Encode(), "; response:", string(body))
  317. utils.FileLog.Info(logMsg)
  318. var response ShResponse
  319. err = json.Unmarshal(body, &response)
  320. if err != nil {
  321. utils.FileLog.Info("post Err:", err.Error(), ";url:", finalUrl, ";params:", form.Encode(), ";response:", string(body))
  322. err = errors.New("Unmarshal Err:" + err.Error())
  323. return
  324. }
  325. utils.FileLog.Info(fmt.Sprint("post request url:", finalUrl, ";params:", form.Encode(), ";response:", string(body)))
  326. itemApiLog := new(roadshow.RsCalendarApiLog)
  327. itemApiLog.CreateTime = time.Now()
  328. itemApiLog.Remark = "post请求上海接口"
  329. itemApiLog.Url = urlStr
  330. itemApiLog.Body = utils.ReplaceSpaceAndWrap(fmt.Sprint(form))
  331. itemApiLog.Result = string(body)
  332. go roadshow.AddRsCalendarApiLog(itemApiLog)
  333. //如果是token失效,同时只是第一次请求(没有尝试强制刷新token,那么重新请求)
  334. if response.Code == 4001 && num <= 0 {
  335. //token失效
  336. _, tmpErr := refreshAccessToken()
  337. if tmpErr != nil {
  338. err = tmpErr
  339. }
  340. num++
  341. return postCurl(urlStr, form, num)
  342. } else if response.Code != 1 {
  343. utils.FileLog.Info(fmt.Sprint("post data err", ";url:", finalUrl, ";params:", form.Encode(), ";response:", string(body)))
  344. err = errors.New(response.Msg)
  345. return
  346. }
  347. return
  348. }
  349. // GetAccessToken 获取accessToken
  350. func GetAccessToken(isRefresh bool) (token string, err error) {
  351. defer func() {
  352. if err != nil {
  353. go alarm_msg.SendAlarmMsg("获取上海的token失败,ERR:"+err.Error(), 3)
  354. //go utils.SendEmail(utils.APPNAME+"获取上海的token失败:"+time.Now().Format("2006-01-02 15:04:05"), err.Error(), utils.EmailSendToUsers)
  355. }
  356. }()
  357. token, redisErr := utils.Rc.RedisString("SH_ACCESS_TOKEN")
  358. //如果从redis中accessToken 获取失败或者token为空了,再或者需要强制刷新了,那么重新获取accessToken
  359. if redisErr != nil || token == `` || isRefresh {
  360. return refreshAccessToken()
  361. }
  362. return
  363. }
  364. // CalendarToSH 创建活动时同步上海的前置函数
  365. func CalendarToSH(rsCalendar roadshow.RsCalendar, researcher roadshow.RsCalendarResearcher) {
  366. if researcher.Status != 2 { //研究员的路演申请,需要研究员接受后,再同步到老CRM
  367. return
  368. }
  369. var err error
  370. errMsg := ``
  371. defer func() {
  372. if err != nil {
  373. errMsg = err.Error() + ";" + errMsg
  374. go alarm_msg.SendAlarmMsg("新建上海研究员日历失败,ERR:"+err.Error()+";errMsg:"+errMsg, 3)
  375. //go utils.SendEmail(utils.APPNAME+"新建上海研究员日历失败:"+time.Now().Format("2006-01-02 15:04:05"), err.Error(), utils.EmailSendToUsers)
  376. }
  377. }()
  378. //redis获取创建者及研究员信息
  379. userInfo, err := getAdminInfoById(rsCalendar.SysUserId)
  380. if err != nil {
  381. utils.FileLog.Info("getAdminInfoById err: " + err.Error())
  382. return
  383. }
  384. researcherInfo, err := getAdminInfoById(researcher.ResearcherId)
  385. if err != nil {
  386. utils.FileLog.Info("getAdminInfoById err: " + err.Error())
  387. return
  388. }
  389. sTime, _ := time.ParseInLocation(utils.FormatDateTime, researcher.StartDate+" "+researcher.StartTime, time.Now().Location())
  390. startTime := sTime.Format("2006-01-02 15:04")
  391. eTime, _ := time.ParseInLocation(utils.FormatDateTime, researcher.EndDate+" "+researcher.EndTime, time.Now().Location())
  392. endTime := eTime.Format("2006-01-02 15:04")
  393. // 创建上海路演日程
  394. err, errMsg = creatSHCalendar(userInfo.Mobile, researcherInfo.Mobile, rsCalendar.CompanyName+rsCalendar.Title, startTime, endTime, 1, researcher.RsCalendarResearcherId)
  395. if err != nil {
  396. utils.FileLog.Info("CreatSHCalendar err: " + err.Error())
  397. fmt.Println(err)
  398. return
  399. }
  400. // 更新路演与研究员关系表的同步字段
  401. whereParams := make(map[string]interface{})
  402. updateParams := make(map[string]interface{})
  403. whereParams["rs_calendar_researcher_id"] = researcher.RsCalendarResearcherId
  404. updateParams["is_synced"] = 1
  405. updateParams["modify_time"] = time.Now()
  406. err = roadshow.UpdateCalendarResearcher(whereParams, updateParams)
  407. if err != nil {
  408. utils.FileLog.Info("UpdateCalendarResearcher err: " + err.Error())
  409. fmt.Println("UpdateCalendarResearcher err: " + err.Error())
  410. return
  411. }
  412. // 更新路演的同步字段
  413. calWhereParams := make(map[string]interface{})
  414. calWhereParams["rs_calendar_id"] = rsCalendar.RsCalendarId
  415. err = roadshow.UpdateRsCalendar(calWhereParams, updateParams)
  416. if err != nil {
  417. utils.FileLog.Info("UpdateRsCalendar err: " + err.Error())
  418. fmt.Println("UpdateRsCalendar err: " + err.Error())
  419. return
  420. }
  421. }
  422. // MatterToSH 创建事项时同步上海的前置函数
  423. func MatterToSH(matter roadshow.RsMatters) (err error) {
  424. errMsg := ``
  425. defer func() {
  426. if err != nil {
  427. errMsg = err.Error() + ";" + errMsg
  428. go alarm_msg.SendAlarmMsg("新建上海研究员事项失败,ERR:"+err.Error()+";errMsg:"+errMsg, 3)
  429. //go utils.SendEmail(utils.APPNAME+"新建上海研究员事项失败:"+time.Now().Format("2006-01-02 15:04:05"), err.Error(), utils.EmailSendToUsers)
  430. }
  431. }()
  432. //获取研究员信息
  433. researcherInfo, err := getAdminInfoById(matter.SysUserId)
  434. if err != nil {
  435. //utils.FileLog.Info("getAdminInfoById err: " + err.Error())
  436. return
  437. }
  438. sTime, _ := time.ParseInLocation(utils.FormatDateTime, matter.StartDate+" "+matter.StartTime, time.Now().Location())
  439. startTime := sTime.Format("2006-01-02 15:04")
  440. eTime, _ := time.ParseInLocation(utils.FormatDateTime, matter.EndDate+" "+matter.EndTime, time.Now().Location())
  441. endTime := eTime.Format("2006-01-02 15:04")
  442. err, errMsg = creatSHCalendar(researcherInfo.Mobile, researcherInfo.Mobile, matter.MatterContent, startTime, endTime, 2, matter.RsMattersId)
  443. if err != nil {
  444. return
  445. }
  446. // 修改事项的同步字段
  447. updateParams := make(map[string]interface{})
  448. whereParams := make(map[string]interface{})
  449. updateParams["is_synced"] = 1
  450. whereParams["rs_matters_id"] = matter.RsMattersId
  451. err = roadshow.UpdateRsMatters(whereParams, updateParams)
  452. if err != nil {
  453. err = fmt.Errorf("UpdateRsMatters err: " + err.Error())
  454. }
  455. return
  456. }
  457. // UpdateSHCalendar 更新上海日历活动
  458. func UpdateSHCalendar(rsCalendarId, rsCalendarResearcherId int, activityType, roadshowType, activityCategory, roadshowPlatform, province, city string, calendarResearcherList []*roadshow.CalendarResearcher) (err error) {
  459. errMsg := ``
  460. defer func() {
  461. if errMsg != `` {
  462. if err != nil {
  463. errMsg = err.Error() + ";" + errMsg
  464. }
  465. go alarm_msg.SendAlarmMsg("更新上海日历活动失败,errMsg:"+errMsg, 3)
  466. //go utils.SendEmail(utils.APPNAME+"更新上海日历活动失败:"+time.Now().Format("2006-01-02 15:04:05"), errMsg, utils.EmailSendToUsers)
  467. }
  468. }()
  469. //查询关联表获取信息
  470. var condition string
  471. var pars []interface{}
  472. condition = ` AND self_calendar_id = ? and calendar_type = 1 `
  473. pars = append(pars, rsCalendarResearcherId)
  474. relationItem, err := roadshow.GetRelationByPars(condition, pars)
  475. if err != nil {
  476. err = errors.New("GetRelationByPars err:" + err.Error())
  477. fmt.Println(err)
  478. return
  479. }
  480. //需要同时修改创建人及研究员的日历(目前听说只有1个,先按一个处理吧)
  481. for _, researcher := range calendarResearcherList {
  482. sTime, _ := time.ParseInLocation(utils.FormatDateTime, researcher.StartDate+" "+researcher.StartTime, time.Now().Location())
  483. startTime := sTime.Format("2006-01-02 15:04")
  484. eTime, _ := time.ParseInLocation(utils.FormatDateTime, researcher.EndDate+" "+researcher.EndTime, time.Now().Location())
  485. endTime := eTime.Format("2006-01-02 15:04")
  486. title := getTitle(activityType, roadshowType, activityCategory, roadshowPlatform, province, city)
  487. //发送更新请求
  488. _, err = updateSHCalendar(fmt.Sprintf("%v", relationItem.ThirdCalendarId), relationItem.ResearcherMobile, title, startTime, endTime)
  489. if err != nil {
  490. errMsg += fmt.Sprint("更新研究员日历信息:", relationItem.ThirdCalendarId, ";err:"+err.Error(), ";")
  491. }
  492. //// 更新路演活动的信息
  493. //calWhereParams := make(map[string]interface{})
  494. //calWhereParams["rs_calendar_id"] = rsCalendarId
  495. //err = roadshow.UpdateRsCalendarRelation(calWhereParams, updateParams)
  496. //if err != nil {
  497. // errMsg += fmt.Sprint("UpdateRsCalendar:", relationItem.ThirdCalendarId, ";err:"+err.Error(), ";")
  498. // return
  499. //}
  500. }
  501. // 更新路演活动中 研究员的信息
  502. whereParams := make(map[string]interface{})
  503. updateParams := make(map[string]interface{})
  504. whereParams["rs_calendar_researcher_id"] = rsCalendarResearcherId
  505. updateParams["is_synced"] = 1
  506. updateParams["modify_time"] = time.Now()
  507. err = roadshow.UpdateCalendarResearcher(whereParams, updateParams)
  508. if err != nil {
  509. errMsg += fmt.Sprint("UpdateCalendarResearcher:", relationItem.ThirdCalendarId, ";err:"+err.Error(), ";")
  510. return
  511. }
  512. // 更新路演活动的信息
  513. calWhereParams := make(map[string]interface{})
  514. calWhereParams["rs_calendar_id"] = rsCalendarId
  515. err = roadshow.UpdateRsCalendar(calWhereParams, updateParams)
  516. if err != nil {
  517. errMsg += fmt.Sprint("UpdateRsCalendar:", relationItem.ThirdCalendarId, ";err:"+err.Error(), ";")
  518. return
  519. }
  520. return
  521. }
  522. // UpdateSHCalendarByMatter 更新上海日历活动
  523. func UpdateSHCalendarByMatter(req roadshow.UpdateMattersReq) (err error) {
  524. defer func() {
  525. if err != nil {
  526. go alarm_msg.SendAlarmMsg("更新上海日历活动失败,Err:"+err.Error(), 3)
  527. //go utils.SendEmail(utils.APPNAME+"更新上海日历活动失败:"+time.Now().Format("2006-01-02 15:04:05"), err.Error(), utils.EmailSendToUsers)
  528. }
  529. }()
  530. if err != nil {
  531. return
  532. }
  533. //需要同时修改创建人及研究员的日历
  534. //查询关联表获取信息
  535. var condition string
  536. var pars []interface{}
  537. condition = ` AND self_calendar_id = ? and calendar_type = 2 `
  538. pars = append(pars, req.RsMattersId)
  539. relationItem, err := roadshow.GetRelationByPars(condition, pars)
  540. if err != nil {
  541. err = errors.New("GetRelationByPars err:" + err.Error())
  542. fmt.Println(err)
  543. return
  544. }
  545. sTime, _ := time.ParseInLocation(utils.FormatDateTime, req.StartDate+" "+req.StartTime, time.Now().Location())
  546. startTime := sTime.Format("2006-01-02 15:04")
  547. eTime, _ := time.ParseInLocation(utils.FormatDateTime, req.EndDate+" "+req.EndTime, time.Now().Location())
  548. endTime := eTime.Format("2006-01-02 15:04")
  549. //发送更新请求
  550. _, err = updateSHCalendar(fmt.Sprintf("%v", relationItem.ThirdCalendarId), relationItem.ResearcherMobile, relationItem.CustomerName+req.MatterContent, startTime, endTime)
  551. if err == nil {
  552. updateParams := make(map[string]interface{})
  553. whereParams := make(map[string]interface{})
  554. updateParams["is_synced"] = 1
  555. whereParams["rs_matters_id"] = req.RsMattersId
  556. err = roadshow.UpdateRsMatters(whereParams, updateParams)
  557. if err != nil {
  558. utils.FileLog.Info("UpdateRsMatters err: " + err.Error())
  559. fmt.Println("UpdateRsMatters err: " + err.Error())
  560. return
  561. }
  562. }
  563. return
  564. }
  565. // DeleteSHCalendar 删除上海日历活动
  566. func DeleteSHCalendar(rsCalendarResearcherId int) (err error) {
  567. defer func() {
  568. if err != nil {
  569. go alarm_msg.SendAlarmMsg(fmt.Sprint("删除上海日历活动失败,关系id:", rsCalendarResearcherId, ";err:", err.Error()), 3)
  570. //go utils.SendEmail(utils.APPNAME+"删除上海日历活动失败:"+time.Now().Format("2006-01-02 15:04:05"), fmt.Sprint("关系id:", rsCalendarResearcherId, ";err:", err.Error()), utils.EmailSendToUsers)
  571. }
  572. }()
  573. var condition string
  574. var pars []interface{}
  575. condition = ` AND self_calendar_id = ? and calendar_type = 1 `
  576. pars = append(pars, rsCalendarResearcherId)
  577. relationItem, err := roadshow.GetRelationByPars(condition, pars)
  578. if err != nil {
  579. logInfo := fmt.Sprint("删除上海日历活动失败;rsCalendarResearcherId:,", rsCalendarResearcherId, " ;GetRelationByPars err"+err.Error())
  580. err = errors.New(logInfo)
  581. utils.FileLog.Info(logInfo)
  582. if err.Error() == utils.ErrNoRow() {
  583. err = nil
  584. return
  585. }
  586. return
  587. }
  588. //删除上海方的路演
  589. err = deleteSHCalendar(relationItem.UserPhone, relationItem.ThirdCalendarId)
  590. if err != nil {
  591. return
  592. }
  593. //删除活动表及事项表
  594. err = roadshow.DeleteRsCalendarRelation(relationItem.RelationId)
  595. if err != nil {
  596. err = errors.New("DeleteRsCalendarRelation err:" + err.Error())
  597. return
  598. }
  599. return
  600. }
  601. // DeleteSHMatter 删除上海日历事项
  602. func DeleteSHMatter(matterId int) (err error) {
  603. defer func() {
  604. if err != nil {
  605. go alarm_msg.SendAlarmMsg("删除上海研究员日历失败;ERR:"+err.Error(), 3)
  606. //go utils.SendEmail(utils.APPNAME+"删除上海日历事项失败:", "删除上海研究员日历失败 "+err.Error(), utils.EmailSendToUsers)
  607. }
  608. }()
  609. var condition string
  610. var pars []interface{}
  611. condition = ` AND self_calendar_id = ? and calendar_type = 2 `
  612. pars = append(pars, matterId)
  613. relationItem, err := roadshow.GetRelationByPars(condition, pars)
  614. if err != nil {
  615. err = errors.New(fmt.Sprint("删除上海日历事项失败;matterId:,", matterId, " ;GetRelationByPars err"+err.Error()))
  616. utils.FileLog.Info(err.Error())
  617. if err.Error() == utils.ErrNoRow() {
  618. err = nil
  619. return
  620. }
  621. return
  622. }
  623. //删除上海方的路演
  624. err = deleteSHCalendar(relationItem.UserPhone, relationItem.ThirdCalendarId)
  625. //删除活动表及事项表
  626. err = roadshow.DeleteRsCalendarRelation(relationItem.RelationId)
  627. if err != nil {
  628. err = errors.New("DeleteRsCalendarRelation err:" + err.Error())
  629. return
  630. }
  631. return
  632. }
  633. // SyncCalendarFromShanghai 上海路演数据同步到自系统
  634. func SyncCalendarFromShanghai(userPhone, startDate, endDate string) (err error) {
  635. errMsgList := make([]string, 0)
  636. defer func() {
  637. if len(errMsgList) > 0 {
  638. //fmt.Println("err:", errMsg)
  639. if err != nil {
  640. errMsgList = append(errMsgList, fmt.Sprint("ERR:"+err.Error(), ";"))
  641. }
  642. go alarm_msg.SendAlarmMsg("上海路演数据同步到自系统失败;errMsg:"+strings.Join(errMsgList, "\n"), 3)
  643. //go utils.SendEmail(utils.APPNAME+"上海路演数据同步到自系统失败:"+time.Now().Format("2006-01-02 15:04:05"), errMsg, utils.EmailSendToUsers)
  644. }
  645. }()
  646. //fmt.Println(userPhone, startDate, endDate)
  647. endDateTime, err := time.ParseInLocation(utils.FormatDate, endDate, time.Local)
  648. if err != nil {
  649. errMsgList = append(errMsgList, `结束日期转time类型失败,err:`+err.Error())
  650. return
  651. }
  652. //往后延迟一天,避免截止到当天
  653. endDate = endDateTime.AddDate(0, 0, 1).Format(utils.FormatDate)
  654. currDay := time.Now().Format(utils.FormatDate)
  655. nowDateTime, _ := time.ParseInLocation(utils.FormatDate, currDay, time.Local)
  656. //如果传入的结束日期早于当前日期,那么就不去查询了
  657. if endDateTime.Before(nowDateTime) {
  658. return
  659. }
  660. //获取当前研究员信息
  661. userPhoneInfo, err := getAdminInfo(userPhone)
  662. if err != nil {
  663. errMsgList = append(errMsgList, fmt.Sprint("获取手机号信息失败:手机号:", userPhone, ";err:"+err.Error(), ";"))
  664. return
  665. }
  666. //根据研究员和开始/结束日期获取上海的活动路演
  667. rsCalendarResearcherList, err := roadshow.GetRsCalendarResearcherInfoIByResearcherIdAndDate(userPhoneInfo.AdminId, currDay, endDate)
  668. if err != nil {
  669. errMsgList = append(errMsgList, fmt.Sprint("获取研究员日程信息失败:手机号:", userPhone, ";err:"+err.Error(), ";"))
  670. return
  671. }
  672. //待删除的活动路演
  673. deleteRsCalendarResearcherMap := make(map[int][]*roadshow.RsCalendarResearcherRelationInfo)
  674. for _, v := range rsCalendarResearcherList {
  675. tmpList, ok := deleteRsCalendarResearcherMap[v.ThirdCalendarId]
  676. if !ok {
  677. tmpList = make([]*roadshow.RsCalendarResearcherRelationInfo, 0)
  678. }
  679. tmpList = append(tmpList, v)
  680. deleteRsCalendarResearcherMap[v.ThirdCalendarId] = tmpList
  681. }
  682. //以当前日期作为起始日期去同步
  683. list, err := getCalendarFrom(userPhone, currDay, endDate)
  684. if err != nil {
  685. errMsgList = append(errMsgList, fmt.Sprint("获取第三方路演日历数据失败,", "userPhone:", userPhone, ";currDay:", currDay, ";endDate:", endDate, ";err:"+err.Error()))
  686. return
  687. }
  688. thirdIdList := make([]int, 0)
  689. if len(list) > 0 {
  690. for _, v := range list {
  691. thirdIdList = append(thirdIdList, v.ID)
  692. //移除还存在的活动,保留不存在的活动
  693. delete(deleteRsCalendarResearcherMap, v.ID)
  694. }
  695. rsCalendarRelationList, tmpErr := roadshow.GetRsCalendarRelationListByThirdIds(thirdIdList)
  696. if tmpErr != nil {
  697. err = tmpErr
  698. errMsgList = append(errMsgList, "获取关联列表失败,err:"+tmpErr.Error())
  699. return
  700. }
  701. rsCalendarRelationMap := make(map[int]*roadshow.RsCalendarRelation)
  702. for _, rsCalendarRelation := range rsCalendarRelationList {
  703. rsCalendarRelationMap[rsCalendarRelation.ThirdCalendarId] = rsCalendarRelation
  704. }
  705. for _, v := range list {
  706. //展示优先级:1、customer_name 2、project_name 3、title 需求池953
  707. if v.CustomerName != "" {
  708. v.Title = v.CustomerName
  709. } else if v.ProjectName != "" {
  710. v.Title = v.ProjectName
  711. }
  712. if rsCalendarRelation, ok := rsCalendarRelationMap[v.ID]; ok {
  713. //存在的话,那么就去查找对应的信息
  714. if rsCalendarRelation.CalendarType == 1 {
  715. //路演
  716. rsCalendarResearcherInfo, tmpErr := roadshow.GetRsCalendarResearcherById(rsCalendarRelation.SelfCalendarId)
  717. if tmpErr != nil {
  718. errMsgList = append(errMsgList, fmt.Sprint("第三方日历ID:", v.ID, "获取路演研究员信息失败;err:"+tmpErr.Error(), ";"))
  719. continue
  720. }
  721. rsCalendarInfo, tmpErr := roadshow.GetRsCalendarById(rsCalendarResearcherInfo.RsCalendarId)
  722. if tmpErr != nil {
  723. errMsgList = append(errMsgList, fmt.Sprint("第三方日历ID:", v.ID, "获取路演信息失败;err:"+tmpErr.Error(), ";"))
  724. continue
  725. }
  726. if rsCalendarInfo.Source == 0 { //自系统创建的路演活动,不需要依靠上海方来修改
  727. continue
  728. }
  729. //是否去同步变更数据库
  730. isUpdateSync := false
  731. //是否变更
  732. isUpdate := false
  733. if v.StartTime != rsCalendarRelation.StartTime {
  734. isUpdate = true
  735. }
  736. if v.EndTime != rsCalendarRelation.EndTime {
  737. isUpdate = true
  738. }
  739. if v.Title != rsCalendarRelation.Title {
  740. isUpdate = true
  741. }
  742. if rsCalendarResearcherInfo.Status == 4 { // 被删除了,现在是需要更新
  743. isUpdate = true
  744. }
  745. researcherList := make([]system.AdminItem, 0)
  746. researcherMap := make(map[int]system.AdminItem)
  747. addResearcherList := make([]system.AdminItem, 0) // 需要新增的研究员
  748. delResearcherIdList := make([]int, 0) //需要删除的路演活动与研究员的关系id
  749. updateResearcherList := make([]*roadshow.RsCalendarResearcher, 0) //待更新的路演活动中研究员信息
  750. if v.ResearcherMobile != rsCalendarRelation.ResearcherMobile {
  751. //研究员变更了,需要去改表
  752. isUpdateSync = true
  753. researcherMobileList := strings.Split(v.ResearcherMobile, ",")
  754. if len(researcherMobileList) > 0 {
  755. for _, mobile := range researcherMobileList {
  756. researcherInfo, tmpErr := getAdminInfo(mobile)
  757. if tmpErr != nil {
  758. errMsgList = append(errMsgList, fmt.Sprint("第三方日历ID:", v.ID, "获取研究员失败,研究员手机号:", mobile, ";err:"+tmpErr.Error(), ";"))
  759. continue
  760. }
  761. if researcherInfo.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_RESEARCHR ||
  762. researcherInfo.RoleTypeCode == utils.ROLE_TYPE_CODE_RESEARCHR ||
  763. researcherInfo.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_RESEARCHR ||
  764. researcherInfo.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_DEPARTMENT ||
  765. researcherInfo.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_DEPARTMENT ||
  766. researcherInfo.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_SELLER ||
  767. researcherInfo.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_ADMIN {
  768. researcherList = append(researcherList, researcherInfo)
  769. researcherMap[researcherInfo.AdminId] = researcherInfo
  770. }
  771. }
  772. }
  773. //没有研究员
  774. if len(researcherList) <= 0 {
  775. errMsgList = append(errMsgList, fmt.Sprint("第三方日历ID:", v.ID, ";对方研究员信息失败;"))
  776. continue
  777. }
  778. rsCalendarResearcherList, tmpErr := roadshow.GetRsCalendarResearcherListByRsCalendarId(rsCalendarInfo.RsCalendarId)
  779. if tmpErr != nil {
  780. errMsgList = append(errMsgList, fmt.Sprint("第三方日历ID:", v.ID, "获取路演活动中的研究员列表失败,路演活动ID:", rsCalendarInfo.RsCalendarId, ";err:"+tmpErr.Error(), ";"))
  781. continue
  782. }
  783. //现有活动中的研究员
  784. rsCalendarResearcherMap := make(map[int]*roadshow.RsCalendarResearcher)
  785. for _, rsCalendarResearcher := range rsCalendarResearcherList {
  786. if _, ok := researcherMap[rsCalendarResearcher.ResearcherId]; ok {
  787. if isUpdate {
  788. updateResearcherList = append(updateResearcherList, rsCalendarResearcher)
  789. }
  790. } else {
  791. delResearcherIdList = append(delResearcherIdList, rsCalendarResearcher.RsCalendarResearcherId)
  792. }
  793. rsCalendarResearcherMap[rsCalendarResearcher.ResearcherId] = rsCalendarResearcher
  794. }
  795. //校验是否需要新增研究员
  796. for adminId, researcherInfo := range researcherMap {
  797. //如果
  798. if _, ok := rsCalendarResearcherMap[adminId]; !ok {
  799. addResearcherList = append(addResearcherList, researcherInfo)
  800. }
  801. }
  802. } else if isUpdate { //如果有字段更新,那么需要将所有的研究员信息更新
  803. isUpdateSync = true
  804. rsCalendarResearcherList, tmpErr := roadshow.GetRsCalendarResearcherListByRsCalendarId(rsCalendarInfo.RsCalendarId)
  805. if tmpErr != nil {
  806. errMsgList = append(errMsgList, fmt.Sprint("第三方日历ID:", v.ID, "获取路演活动中的研究员列表失败,路演活动ID:", rsCalendarInfo.RsCalendarId, ";err:"+tmpErr.Error(), ";"))
  807. continue
  808. }
  809. for _, rsCalendarResearcher := range rsCalendarResearcherList {
  810. updateResearcherList = append(updateResearcherList, rsCalendarResearcher)
  811. }
  812. }
  813. if isUpdateSync {
  814. tmpErr = roadshow.UpdateSyncRsCalendarRelation(v, rsCalendarInfo, rsCalendarRelation, updateResearcherList, delResearcherIdList, addResearcherList)
  815. if tmpErr != nil {
  816. err = tmpErr
  817. errMsgList = append(errMsgList, fmt.Sprint("第三方日历ID:", v.ID, "修改关联关系失败;err:"+tmpErr.Error(), ";"))
  818. return
  819. }
  820. }
  821. } else {
  822. //事项
  823. //事项都是由自系统创建的,不需要依靠上海方来修改
  824. }
  825. } else {
  826. //数据不存在
  827. createUser, tmpErr := getAdminInfo(v.UserPhone)
  828. if tmpErr != nil {
  829. errMsgList = append(errMsgList, fmt.Sprint("第三方日历ID:", v.ID, "获取创建人失败,创建人手机号:", v.UserPhone, ";err:"+tmpErr.Error(), ";"))
  830. continue
  831. }
  832. //研究员列表
  833. researcherList := make([]system.AdminItem, 0)
  834. researcherMobileList := strings.Split(v.ResearcherMobile, ",")
  835. if len(researcherMobileList) > 0 {
  836. for _, mobile := range researcherMobileList {
  837. researcherInfo, tmpErr := getAdminInfo(mobile)
  838. if tmpErr != nil {
  839. errMsgList = append(errMsgList, fmt.Sprint("第三方日历ID:", v.ID, "获取研究员失败,研究员手机号:", mobile, ";err:"+tmpErr.Error(), ";"))
  840. continue
  841. }
  842. if researcherInfo.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_RESEARCHR ||
  843. researcherInfo.RoleTypeCode == utils.ROLE_TYPE_CODE_RESEARCHR ||
  844. researcherInfo.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_RESEARCHR ||
  845. researcherInfo.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_DEPARTMENT ||
  846. researcherInfo.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_DEPARTMENT ||
  847. researcherInfo.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_SELLER ||
  848. researcherInfo.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_ADMIN ||
  849. researcherInfo.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_ADMIN {
  850. researcherList = append(researcherList, researcherInfo)
  851. }
  852. }
  853. }
  854. //没有研究员
  855. if len(researcherList) <= 0 {
  856. continue
  857. }
  858. //数据入库
  859. tmpErr = roadshow.SyncRsCalendarRelation(v, createUser, researcherList)
  860. if tmpErr != nil {
  861. err = tmpErr
  862. errMsgList = append(errMsgList, fmt.Sprint("第三方日历ID:", v.ID, "绑定关联关系失败;err:"+tmpErr.Error(), ";"))
  863. continue
  864. }
  865. //fmt.Println("createUser:", createUser)
  866. }
  867. }
  868. }
  869. var itemsApiLog []*roadshow.RsCalendarApiLog
  870. //上海那边已经删除了路演,这边也要同步删除
  871. for _, deleteRsCalendarResearcherList := range deleteRsCalendarResearcherMap {
  872. for _, deleteRsCalendarResearcher := range deleteRsCalendarResearcherList {
  873. // 更新路演与研究员关系表的状态字段
  874. whereParams := make(map[string]interface{})
  875. updateParams := make(map[string]interface{})
  876. whereParams["rs_calendar_researcher_id"] = deleteRsCalendarResearcher.RsCalendarResearcherId
  877. updateParams["status"] = 4
  878. updateParams["modify_time"] = time.Now()
  879. tmpErr := roadshow.UpdateCalendarResearcher(whereParams, updateParams)
  880. if tmpErr != nil {
  881. err = tmpErr
  882. errMsgList = append(errMsgList, fmt.Sprint("第三方日历ID:", deleteRsCalendarResearcher.ThirdCalendarId, "删除关联关系失败;err:"+tmpErr.Error(), ";"))
  883. continue
  884. }
  885. itemApiLog := new(roadshow.RsCalendarApiLog)
  886. itemApiLog.CreateTime = time.Now()
  887. itemApiLog.Remark = "对比上海接口之后手动删除"
  888. itemApiLog.Url = fmt.Sprint("userPhone", userPhone, "currDay", currDay, "endDate", endDate)
  889. itemApiLog.Body = ""
  890. itemApiLog.Result = ""
  891. itemApiLog.RsCalendarResearcherId = deleteRsCalendarResearcher.RsCalendarResearcherId
  892. itemsApiLog = append(itemsApiLog, itemApiLog)
  893. // 更新路演的同步字段
  894. //calWhereParams := make(map[string]interface{})
  895. //calUpdateParams := make(map[string]interface{})
  896. //calWhereParams["rs_calendar_id"] = deleteRsCalendarResearcher.RsCalendarId
  897. //updateParams["is_synced"] = 1
  898. //err = roadshow.UpdateRsCalendar(calWhereParams, calUpdateParams)
  899. }
  900. }
  901. if len(itemsApiLog) > 0 {
  902. go roadshow.AddRsCalendarApiLogList(itemsApiLog)
  903. }
  904. return
  905. }
  906. // CreateOaUser 新增系统用户
  907. func CreateOaUser(mobile, username string, groupId int) (err error) {
  908. defer func() {
  909. if err != nil {
  910. errMsg := fmt.Sprint("手机号:", mobile, ";username:", username, ";分组id:", groupId, ";err:", err.Error())
  911. go alarm_msg.SendAlarmMsg("系统用户同步到上海失败;ERR:"+err.Error()+";errMsg:"+errMsg, 3)
  912. //go utils.SendEmail(utils.APPNAME+"系统用户同步到上海失败:"+time.Now().Format("2006-01-02 15:04:05"), errMsg, utils.EmailSendToUsers)
  913. }
  914. }()
  915. finalUrl := utils.CRM_OPEN_API_URL + "/v1/OaUser/create"
  916. //发送创建请求
  917. form := url.Values{}
  918. form.Add("mobile", mobile)
  919. form.Add("username", username)
  920. form.Add("group_id", fmt.Sprint(groupId))
  921. //发送创建请求
  922. _, err, _ = postCurl(finalUrl, form, 0)
  923. if err != nil {
  924. err = errors.New("NewRequest Err:" + err.Error())
  925. return
  926. }
  927. return
  928. }
  929. // getAdminInfo 通过手机号获取用户信息
  930. func getAdminInfo(mobile string) (adminInfo system.AdminItem, err error) {
  931. adminMap := make(map[string]system.AdminItem)
  932. redisAdminData, redisErr := utils.Rc.RedisString(utils.CACHE_KEY_ADMIN)
  933. if redisErr != nil {
  934. list, err := system.GetSysuserList("", []interface{}{}, 0, 1000)
  935. // GetSysuserList
  936. for _, tmpAdminInfo := range list {
  937. adminMap[tmpAdminInfo.Mobile] = *tmpAdminInfo
  938. }
  939. //入缓存
  940. redisJsonData, err := json.Marshal(adminMap)
  941. if err == nil {
  942. _ = utils.Rc.Put(utils.CACHE_KEY_ADMIN, string(redisJsonData), time.Minute*30)
  943. }
  944. } else {
  945. err := json.Unmarshal([]byte(redisAdminData), &adminMap)
  946. if err != nil {
  947. fmt.Println("用户数据,json转换失败:", err)
  948. }
  949. }
  950. adminInfo, ok := adminMap[mobile]
  951. if !ok {
  952. err = fmt.Errorf("找不到该手机号用户,mobile:" + mobile)
  953. }
  954. return
  955. }
  956. // getAdminInfoById 通过用户id获取用户信息
  957. func getAdminInfoById(sysId int) (adminInfo system.AdminItem, err error) {
  958. adminMap := make(map[int]system.AdminItem)
  959. redisAdminData, redisErr := utils.Rc.RedisString(utils.CACHE_KEY_ADMIN_ID)
  960. if redisErr != nil {
  961. list, err := system.GetSysuserList("", []interface{}{}, 0, 1000)
  962. // GetSysuserList
  963. for _, tmpAdminInfo := range list {
  964. adminMap[tmpAdminInfo.AdminId] = *tmpAdminInfo
  965. }
  966. //入缓存
  967. redisJsonData, err := json.Marshal(adminMap)
  968. if err == nil {
  969. _ = utils.Rc.Put(utils.CACHE_KEY_ADMIN_ID, string(redisJsonData), time.Minute*30)
  970. }
  971. } else {
  972. err := json.Unmarshal([]byte(redisAdminData), &adminMap)
  973. if err != nil {
  974. fmt.Println("用户数据,json转换失败:", err)
  975. }
  976. }
  977. adminInfo, ok := adminMap[sysId]
  978. if !ok {
  979. err = fmt.Errorf("找不到该用户id,sysId:" + fmt.Sprint(sysId))
  980. }
  981. return
  982. }
  983. func getTitle(activityType, roadshowType, activityCategory, roadshowPlatform, province, city string) string {
  984. var title string
  985. switch activityType {
  986. case "内部会议":
  987. title = "内部会议"
  988. case "公开会议", "路演":
  989. if roadshowType == "线上" {
  990. title = roadshowType + activityType + roadshowPlatform
  991. } else {
  992. title = roadshowType + activityType + province + city
  993. }
  994. case "报告电话会":
  995. title = activityCategory + "电话会"
  996. }
  997. return title
  998. }
  999. // GetCalendarFrom 获取上海方的路演活动列表
  1000. func GetCalendarFrom(userPhone, startDate, endDate string) (list []roadshow.UserCalendar, err error) {
  1001. list, err = getCalendarFrom(userPhone, startDate, endDate)
  1002. return
  1003. }
  1004. // 公司添加路演的时候,校验公司对应点数,以及研究员关联行业的权限
  1005. func CheckAddRoadShowCompanyPoint(companyId int, researcherList []*roadshow.CalendarResearcher) (points int, addType int, err error) {
  1006. addType = 1
  1007. defer func() {
  1008. if err != nil {
  1009. go alarm_msg.SendAlarmMsg("获取公司剩余点数失败:"+err.Error(), 2)
  1010. }
  1011. }()
  1012. pointsCompany, e := cygx.GetCygxActivitySpecialPermissionPointsCount(companyId)
  1013. if e != nil && e.Error() != utils.ErrNoRow() {
  1014. err = errors.New("GetCygxActivitySpecialPermissionPointsCount, Err: " + e.Error())
  1015. return
  1016. }
  1017. productItemRai, e := company.GetCompanyProductByCompanyIdAndProductId(companyId, utils.COMPANY_PRODUCT_RAI_ID)
  1018. if e != nil {
  1019. err = errors.New("GetCompanyProductByCompanyIdAndProductId, Err: " + e.Error())
  1020. return
  1021. }
  1022. permissionStr, e := cygx.GetCompanyPermission(companyId)
  1023. if e != nil {
  1024. err = errors.New("GetCompanyPermission, Err: " + e.Error())
  1025. return
  1026. }
  1027. //用户没有路演服务,以及研究员所关联行业的权限,就进行报错提示
  1028. var isHaveWangFang bool // 研究员里面是否包含王芳
  1029. if !strings.Contains(permissionStr, utils.LU_YAN_FU_WU) {
  1030. var adminIds []string
  1031. for _, v := range researcherList {
  1032. adminIds = append(adminIds, strconv.Itoa(v.ResearcherId))
  1033. }
  1034. askEmailList, e := cygx.GetAskEmailListByAdminIds(strings.Join(adminIds, ","))
  1035. if e != nil {
  1036. err = errors.New("GetAskEmailListByAdminIds, Err: " + e.Error())
  1037. return
  1038. }
  1039. for _, v := range askEmailList {
  1040. if v.Name == "王芳" { // 王芳,不需要判断权限和点数,以及对应的点数弹窗提示
  1041. isHaveWangFang = true
  1042. continue
  1043. }
  1044. if !strings.Contains(permissionStr, v.ChartPermissionName) {
  1045. addType = 3
  1046. return
  1047. }
  1048. }
  1049. }
  1050. if pointsCompany > 0 || productItemRai.Status == utils.COMPANY_STATUS_FORMAL {
  1051. points = len(researcherList)
  1052. if isHaveWangFang {
  1053. points--
  1054. if points == 0 {
  1055. addType = 2
  1056. }
  1057. }
  1058. } else {
  1059. addType = 2
  1060. }
  1061. return
  1062. }