calendar.go 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824
  1. package rs
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "github.com/rdlucklib/rdluck_tools/http"
  7. "hongze/hongze_mobile_admin/models/roadshow"
  8. "hongze/hongze_mobile_admin/models/tables/admin"
  9. "hongze/hongze_mobile_admin/utils"
  10. "io/ioutil"
  11. netHttp "net/http"
  12. "net/url"
  13. "strconv"
  14. "strings"
  15. "time"
  16. )
  17. // getAccessToken token内部请求接口
  18. func getAccessToken() (tokenData roadshow.TokenData, err error) {
  19. 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)
  20. body, err := http.Get(getUrl)
  21. if err != nil {
  22. err = errors.New("NewRequest Err:" + err.Error())
  23. return
  24. }
  25. var tokenResp roadshow.GetTokenResp
  26. err = json.Unmarshal(body, &tokenResp)
  27. if err != nil {
  28. err = errors.New("Unmarshal Err:" + err.Error())
  29. return
  30. }
  31. if tokenResp.Code != 1 {
  32. err = errors.New("getAccessToken err:" + tokenResp.Msg)
  33. return
  34. }
  35. tokenData = tokenResp.TokenData
  36. return
  37. //return tokenResp.TokenData.AccessToken, err
  38. }
  39. // GetAccessToken 获取accessToken
  40. func GetAccessToken() (token string, err error) {
  41. defer func() {
  42. if err != nil {
  43. go utils.SendEmail(utils.APPNAME+"获取上海的token失败:"+time.Now().Format("2006-01-02 15:04:05"), err.Error(), utils.EmailSendToUsers)
  44. }
  45. }()
  46. token, err = utils.Rc.RedisString("SH_ACCESS_TOKEN")
  47. //如果从redis中accessToken 获取失败或者token为空了,那么重新获取accessToken
  48. if err != nil || token == `` {
  49. tokenInfo, tmpErr := getAccessToken()
  50. if tmpErr != nil {
  51. err = tmpErr
  52. return
  53. }
  54. token = tokenInfo.AccessToken
  55. if !utils.Rc.SetNX("SH_ACCESS_TOKEN", token, time.Duration(tokenInfo.ExpireIn-600)*time.Second) {
  56. err = errors.New("set Redis err")
  57. }
  58. }
  59. return
  60. }
  61. func getCalendarFrom(userPhone, startDate, endDate string) (list []roadshow.UserCalendar, err error) {
  62. token, err := GetAccessToken()
  63. if err != nil {
  64. return
  65. }
  66. exUrl := utils.CRM_OPEN_API_URL + "/v1/calendar/userCalendarList?user_phone=%s&start_time=%s&end_time=%s&access_token=%s"
  67. getUrl := fmt.Sprintf(exUrl, userPhone, startDate, endDate, token)
  68. body, err := http.Get(getUrl)
  69. if err != nil {
  70. err = errors.New("NewRequest Err:" + err.Error())
  71. return
  72. }
  73. var userCalendarList roadshow.UserCalendarList
  74. err = json.Unmarshal(body, &userCalendarList)
  75. if err != nil {
  76. utils.FileLog.Info("getCalendarFrom Err:", "url:", getUrl, ";response:", string(body))
  77. err = errors.New("Unmarshal Err:" + err.Error())
  78. return
  79. }
  80. if userCalendarList.Code != 1 {
  81. utils.FileLog.Info("getCalendarFrom:", "url:", getUrl, ";response:", string(body))
  82. err = errors.New(userCalendarList.Msg)
  83. return
  84. }
  85. list = userCalendarList.Data
  86. //fmt.Println("userCalendarList", userCalendarList)
  87. return
  88. }
  89. // CalendarToSH 创建活动时同步上海的前置函数
  90. func CalendarToSH(rsCalendar roadshow.RsCalendar, researcher roadshow.RsCalendarResearcher) {
  91. //获取创建者及研究员的信息,长度应为2
  92. var condition string
  93. var err error
  94. var pars []interface{}
  95. if rsCalendar.SysUserId == researcher.ResearcherId {
  96. condition = ` AND admin_id =? `
  97. pars = append(pars, rsCalendar.SysUserId)
  98. } else {
  99. condition = ` AND admin_id IN (?,?) `
  100. pars = append(pars, rsCalendar.SysUserId, researcher.ResearcherId)
  101. }
  102. lists, err := roadshow.GetResearcherFromAdmin(condition, pars)
  103. if err != nil {
  104. err = errors.New("GetResearcherFromAdmin err:" + err.Error())
  105. fmt.Println(err)
  106. return
  107. }
  108. var userPhone, toUserPhone string
  109. if len(lists) > 0 {
  110. //当研究员也是创建者时,lists长度为1 做兼容
  111. if len(lists) == 1 && rsCalendar.SysUserId == researcher.ResearcherId {
  112. userPhone = lists[0].Mobile
  113. toUserPhone = lists[0].Mobile
  114. } else if lists[0].AdminId == rsCalendar.SysUserId {
  115. userPhone = lists[0].Mobile
  116. toUserPhone = lists[1].Mobile
  117. } else {
  118. userPhone = lists[1].Mobile
  119. toUserPhone = lists[0].Mobile
  120. }
  121. sTime, _ := time.ParseInLocation(utils.FormatDateTime, researcher.StartDate+" "+researcher.StartTime, time.Now().Location())
  122. startTime := sTime.Format("2006-01-02 15:04")
  123. eTime, _ := time.ParseInLocation(utils.FormatDateTime, researcher.EndDate+" "+researcher.EndTime, time.Now().Location())
  124. endTime := eTime.Format("2006-01-02 15:04")
  125. err = CreatSHCalendar(userPhone, toUserPhone, rsCalendar.Title, startTime, endTime, 1, researcher.RsCalendarResearcherId)
  126. if err != nil {
  127. return
  128. }
  129. } else {
  130. err = errors.New("Parameter Err,未查询到创建者或研究员信息" + err.Error())
  131. fmt.Println("Parameter Err: " + err.Error())
  132. return
  133. }
  134. if err != nil {
  135. utils.SendEmail("研究员日历同步失败:", "新建上海研究员日历失败 "+err.Error(), utils.EmailSendToUsers)
  136. } else {
  137. whereParams := make(map[string]interface{})
  138. updateParams := make(map[string]interface{})
  139. whereParams["rs_calendar_researcher_id"] = researcher.RsCalendarResearcherId
  140. updateParams["is_synced"] = 1
  141. err = roadshow.UpdateCalendarResearcher(whereParams, updateParams)
  142. if err != nil {
  143. utils.FileLog.Info("UpdateCalendarResearcher err: " + err.Error())
  144. fmt.Println("UpdateCalendarResearcher err: " + err.Error())
  145. return
  146. }
  147. calWhereParams := make(map[string]interface{})
  148. calWhereParams["rs_calendar_id"] = rsCalendar.RsCalendarId
  149. err = roadshow.UpdateRsCalendar(calWhereParams, updateParams)
  150. if err != nil {
  151. utils.FileLog.Info("UpdateRsCalendar err: " + err.Error())
  152. fmt.Println("UpdateRsCalendar err: " + err.Error())
  153. return
  154. }
  155. }
  156. }
  157. // MatterToSH 创建事项时同步上海的前置函数
  158. func MatterToSH(matter roadshow.RsMatters) {
  159. var condition string
  160. var pars []interface{}
  161. condition = ` AND admin_id =? `
  162. pars = append(pars, matter.SysUserId)
  163. lists, err := roadshow.GetResearcherFromAdmin(condition, pars)
  164. if err != nil || len(lists) == 0 {
  165. err = errors.New("GetResearcherFromAdmin err:" + err.Error())
  166. return
  167. }
  168. sTime, _ := time.ParseInLocation(utils.FormatDateTime, matter.StartDate+" "+matter.StartTime, time.Now().Location())
  169. startTime := sTime.Format("2006-01-02 15:04")
  170. eTime, _ := time.ParseInLocation(utils.FormatDateTime, matter.EndDate+" "+matter.EndTime, time.Now().Location())
  171. endTime := eTime.Format("2006-01-02 15:04")
  172. err = CreatSHCalendar(lists[0].Mobile, lists[0].Mobile, matter.MatterContent, startTime, endTime, 2, matter.RsMattersId)
  173. if err != nil {
  174. return
  175. }
  176. if err != nil {
  177. utils.SendEmail("研究员日历同步失败:", "新建上海研究员日历事项失败 "+err.Error(), utils.EmailSendToUsers)
  178. } else {
  179. updateParams := make(map[string]interface{})
  180. whereParams := make(map[string]interface{})
  181. updateParams["is_synced"] = 1
  182. whereParams["rs_matters_id"] = matter.RsMattersId
  183. err = roadshow.UpdateRsMatters(whereParams, updateParams)
  184. if err != nil {
  185. utils.FileLog.Info("UpdateRsMatters err: " + err.Error())
  186. fmt.Println("UpdateRsMatters err: " + err.Error())
  187. return
  188. }
  189. }
  190. }
  191. // CreatSHCalendar 新增上海日历活动
  192. func CreatSHCalendar(userPhone, toUserPhone, content, startTime, endTime string, calendarType int8, selfCalendarId int) (err error) {
  193. token, err := GetAccessToken()
  194. finalUrl := utils.CRM_OPEN_API_URL + "/v1/Calendar/create?access_token=" + token
  195. //creditCode, err := rs.GetCreditCodeFromCompany(rsCalendar.CompanyId)
  196. //if err != nil {
  197. // err = errors.New("GetCreditCodeFromCompany err:" + err.Error())
  198. // return
  199. //}
  200. //发送创建请求
  201. resp, err := netHttp.PostForm(finalUrl, url.Values{"user_phone": {userPhone}, "to_user_phone": {toUserPhone},
  202. "content": {content}, "start_time": {startTime}, "end_time": {endTime}})
  203. if err != nil {
  204. err = errors.New("NewRequest Err:" + err.Error())
  205. return
  206. }
  207. defer resp.Body.Close()
  208. //解析resp并且存入关联表
  209. body, err := ioutil.ReadAll(resp.Body)
  210. if err != nil {
  211. fmt.Println("reponse error", err)
  212. return
  213. }
  214. var calendarResp roadshow.CreatSHCalendarResp
  215. err = json.Unmarshal(body, &calendarResp)
  216. if calendarResp.Code != 1 {
  217. err = errors.New("Create SHCalendar err:" + calendarResp.Msg)
  218. return
  219. }
  220. sThirdId := calendarResp.Data.CalendarID
  221. thirdId, err := strconv.Atoi(sThirdId)
  222. if err != nil {
  223. err = errors.New("string to int Err:" + err.Error())
  224. return
  225. }
  226. relationItem := roadshow.RsCalendarRelation{
  227. UserPhone: userPhone,
  228. CalendarType: calendarType,
  229. SelfCalendarId: selfCalendarId,
  230. ThirdCalendarId: thirdId,
  231. Title: content,
  232. ResearcherMobile: toUserPhone,
  233. ModifyTime: time.Now(),
  234. CreateTime: time.Now(),
  235. }
  236. _, err = roadshow.AddRsCalendarRelation(&relationItem)
  237. if err != nil {
  238. err = errors.New("AddRsCalendarRelation Err:" + err.Error())
  239. return
  240. }
  241. return
  242. }
  243. // UpdateSHCalendar 更新上海日历活动
  244. func UpdateSHCalendar(req roadshow.EditActivityReq) {
  245. var err error
  246. //需要同时修改创建人及研究员的日历
  247. for _, researcher := range req.ResearcherList {
  248. //查询关联表获取信息
  249. var condition string
  250. var pars []interface{}
  251. condition = ` AND self_calendar_id = ? `
  252. pars = append(pars, req.RsCalendarResearcherId)
  253. relationItem, err := roadshow.GetRelationByPars(condition, pars)
  254. if err != nil {
  255. err = errors.New("GetRelationByPars err:" + err.Error())
  256. go utils.SendEmail(utils.APPNAME+"上海关联表查询失败:"+time.Now().Format("2006-01-02 15:04:05"), err.Error(), utils.EmailSendToUsers)
  257. fmt.Println(err)
  258. return
  259. }
  260. sTime, _ := time.ParseInLocation(utils.FormatDateTime, researcher.StartDate+" "+researcher.StartTime, time.Now().Location())
  261. startTime := sTime.Format("2006-01-02 15:04")
  262. eTime, _ := time.ParseInLocation(utils.FormatDateTime, researcher.EndDate+" "+researcher.EndTime, time.Now().Location())
  263. endTime := eTime.Format("2006-01-02 15:04")
  264. title := getTitle(req.ActivityType, req.RoadshowType, req.ActivityCategory, req.RoadshowPlatform, req.Province, req.City)
  265. //发送更新请求
  266. body, err := updateSHCalendar(fmt.Sprintf("%v", relationItem.ThirdCalendarId), relationItem.ResearcherMobile, title, startTime, endTime)
  267. if err != nil {
  268. fmt.Println(err)
  269. }
  270. //解析resp判断请求结果是否成功
  271. var calendarResp roadshow.CreatSHCalendarResp
  272. err = json.Unmarshal(body, &calendarResp)
  273. if calendarResp.Code != 1 {
  274. err = errors.New("Update SHCalendar err:" + calendarResp.Msg)
  275. fmt.Println(err)
  276. }
  277. }
  278. if err != nil {
  279. fmt.Println(err)
  280. utils.SendEmail("研究员日历同步失败:", "更新上海研究员日历失败 "+err.Error(), utils.EmailSendToUsers)
  281. } else {
  282. whereParams := make(map[string]interface{})
  283. updateParams := make(map[string]interface{})
  284. whereParams["rs_calendar_researcher_id"] = req.RsCalendarResearcherId
  285. updateParams["is_synced"] = 1
  286. err = roadshow.UpdateCalendarResearcher(whereParams, updateParams)
  287. if err != nil {
  288. fmt.Println("UpdateCalendarResearcher err: ", err.Error())
  289. return
  290. }
  291. calWhereParams := make(map[string]interface{})
  292. calWhereParams["rs_calendar_id"] = req.RsCalendarId
  293. err = roadshow.UpdateRsCalendar(calWhereParams, updateParams)
  294. if err != nil {
  295. fmt.Println("UpdateRsCalendar err: ", err.Error())
  296. return
  297. }
  298. }
  299. }
  300. // UpdateSHCalendarByMatter 更新上海日历活动
  301. func UpdateSHCalendarByMatter(req roadshow.UpdateMattersReq) {
  302. token, err := GetAccessToken()
  303. finalUrl := utils.CRM_OPEN_API_URL + "/v1/Calendar/update?access_token=" + token
  304. //需要同时修改创建人及研究员的日历
  305. //查询关联表获取信息
  306. var condition string
  307. var pars []interface{}
  308. condition = ` AND self_calendar_id = ? `
  309. pars = append(pars, req.RsMattersId)
  310. relationItem, err := roadshow.GetRelationByPars(condition, pars)
  311. if err != nil {
  312. err = errors.New("GetRelationByPars err:" + err.Error())
  313. go utils.SendEmail(utils.APPNAME+"上海关联表查询失败:"+time.Now().Format("2006-01-02 15:04:05"), err.Error(), utils.EmailSendToUsers)
  314. fmt.Println(err)
  315. return
  316. }
  317. sTime, _ := time.ParseInLocation(utils.FormatDateTime, req.StartDate+" "+req.StartTime, time.Now().Location())
  318. startTime := sTime.Format("2006-01-02 15:04")
  319. eTime, _ := time.ParseInLocation(utils.FormatDateTime, req.EndDate+" "+req.EndTime, time.Now().Location())
  320. endTime := eTime.Format("2006-01-02 15:04")
  321. //发送更新请求
  322. resp, err := netHttp.PostForm(finalUrl, url.Values{"calendar_id": {fmt.Sprintf("%v", relationItem.ThirdCalendarId)},
  323. "to_user_phone": {relationItem.ResearcherMobile}, "content": {relationItem.Content}, "start_time": {startTime}, "end_time": {endTime}})
  324. if err != nil {
  325. err = errors.New("NewRequest Err:" + err.Error())
  326. return
  327. }
  328. defer resp.Body.Close()
  329. body, err := ioutil.ReadAll(resp.Body)
  330. if err != nil {
  331. fmt.Println("reponse error", err)
  332. return
  333. }
  334. //解析resp判断请求结果是否成功
  335. var calendarResp roadshow.CreatSHCalendarResp
  336. err = json.Unmarshal(body, &calendarResp)
  337. if calendarResp.Code != 1 {
  338. err = errors.New("Update SHCalendar err:" + calendarResp.Msg)
  339. fmt.Println(err)
  340. }
  341. if err != nil {
  342. go utils.SendEmail("研究员日历同步失败:", "更新上海研究员日历失败 "+err.Error(), utils.EmailSendToUsers)
  343. } else {
  344. updateParams := make(map[string]interface{})
  345. whereParams := make(map[string]interface{})
  346. updateParams["is_synced"] = 1
  347. whereParams["rs_matters_id"] = req.RsMattersId
  348. err = roadshow.UpdateRsMatters(whereParams, updateParams)
  349. if err != nil {
  350. utils.FileLog.Info("UpdateRsMatters err: " + err.Error())
  351. fmt.Println("UpdateRsMatters err: " + err.Error())
  352. return
  353. }
  354. }
  355. }
  356. // updateSHCalendar 内部函数,只用于发送修改上海日历的http请求
  357. func updateSHCalendar(thirdCalendarId, researcherMobile, content, startTime, endTime string) (body []byte, err error) {
  358. token, err := GetAccessToken()
  359. finalUrl := utils.CRM_OPEN_API_URL + "/v1/Calendar/update?access_token=" + token
  360. resp, respErr := netHttp.PostForm(finalUrl, url.Values{"calendar_id": {thirdCalendarId},
  361. "to_user_phone": {researcherMobile}, "content": {content}, "start_time": {startTime}, "end_time": {endTime}})
  362. if respErr != nil {
  363. respErr = errors.New("NewRequest Err:" + respErr.Error())
  364. return
  365. }
  366. defer resp.Body.Close()
  367. body, bodyErr := ioutil.ReadAll(resp.Body)
  368. if bodyErr != nil {
  369. fmt.Println("reponse error", bodyErr)
  370. return
  371. }
  372. return
  373. }
  374. // DeleteSHCalendar 删除上海日历活动
  375. func DeleteSHCalendar(rsCalendarResearcherId int) {
  376. var err error
  377. defer func() {
  378. if err != nil {
  379. go utils.SendEmail(utils.APPNAME+"删除上海日历活动失败:"+time.Now().Format("2006-01-02 15:04:05"), fmt.Sprint("关系id:", rsCalendarResearcherId, ";err:", err.Error()), utils.EmailSendToUsers)
  380. }
  381. }()
  382. token, err := GetAccessToken()
  383. finalUrl := utils.CRM_OPEN_API_URL + "/v1/Calendar/delete?access_token=" + token
  384. var condition string
  385. var pars []interface{}
  386. condition = ` AND self_calendar_id = ? `
  387. pars = append(pars, rsCalendarResearcherId)
  388. relationItem, err := roadshow.GetRelationByPars(condition, pars)
  389. if err != nil {
  390. err = errors.New("GetRelationByPars err" + err.Error())
  391. go utils.SendEmail(utils.APPNAME+"上海关联表查询失败:"+time.Now().Format("2006-01-02 15:04:05"), err.Error(), utils.EmailSendToUsers)
  392. return
  393. }
  394. resp, err := netHttp.PostForm(finalUrl, url.Values{"user_phone": {relationItem.UserPhone}, "calendar_id": {fmt.Sprintf("%v", relationItem.ThirdCalendarId)}})
  395. if err != nil {
  396. err = errors.New("NewRequest Err:" + err.Error())
  397. return
  398. }
  399. defer resp.Body.Close()
  400. body, err := ioutil.ReadAll(resp.Body)
  401. if err != nil {
  402. fmt.Println("reponse error", err)
  403. return
  404. }
  405. //解析resp判断请求结果是否成功
  406. var calendarResp roadshow.CreatSHCalendarResp
  407. err = json.Unmarshal(body, &calendarResp)
  408. if calendarResp.Code != 1 {
  409. err = errors.New("Update SHCalendar err:" + calendarResp.Msg)
  410. return
  411. }
  412. //删除活动表及事项表
  413. err = roadshow.DeleteRsCalendarRelation(relationItem.RelationId)
  414. if err != nil {
  415. err = errors.New("DeleteRsCalendarRelation err:" + err.Error())
  416. return
  417. }
  418. if err != nil {
  419. //发送邮件解决异常
  420. utils.SendEmail("研究员日历同步失败:", "删除上海研究员日历失败 "+err.Error(), utils.EmailSendToUsers)
  421. //fmt.Println("DeleteSHCalendar err:",err.Error())
  422. }
  423. }
  424. // DeleteSHMatter 删除上海日历事项
  425. func DeleteSHMatter(matterId int) {
  426. token, err := GetAccessToken()
  427. finalUrl := utils.CRM_OPEN_API_URL + "/v1/Calendar/delete?access_token=" + token
  428. var condition string
  429. var pars []interface{}
  430. condition = ` AND self_calendar_id = ? `
  431. pars = append(pars, matterId)
  432. relationItem, err := roadshow.GetRelationByPars(condition, pars)
  433. if err != nil {
  434. err = errors.New("GetRelationByPars err" + err.Error())
  435. go utils.SendEmail(utils.APPNAME+"上海关联表查询失败:"+time.Now().Format("2006-01-02 15:04:05"), err.Error(), utils.EmailSendToUsers)
  436. return
  437. }
  438. resp, err := netHttp.PostForm(finalUrl, url.Values{"user_phone": {relationItem.UserPhone}, "calendar_id": {fmt.Sprintf("%v", relationItem.ThirdCalendarId)}})
  439. if err != nil {
  440. err = errors.New("NewRequest Err:" + err.Error())
  441. return
  442. }
  443. defer resp.Body.Close()
  444. body, err := ioutil.ReadAll(resp.Body)
  445. if err != nil {
  446. fmt.Println("reponse error", err)
  447. return
  448. }
  449. //解析resp判断请求结果是否成功
  450. var calendarResp roadshow.CreatSHCalendarResp
  451. err = json.Unmarshal(body, &calendarResp)
  452. if calendarResp.Code != 1 {
  453. err = errors.New("Update SHCalendar err:" + calendarResp.Msg)
  454. return
  455. }
  456. //删除活动表及事项表
  457. err = roadshow.DeleteRsCalendarRelation(relationItem.RelationId)
  458. if err != nil {
  459. err = errors.New("DeleteRsCalendarRelation err:" + err.Error())
  460. return
  461. }
  462. if err != nil {
  463. //发送邮件解决异常
  464. utils.SendEmail("研究员日历同步失败:", "删除上海研究员日历失败 "+err.Error(), utils.EmailSendToUsers)
  465. //fmt.Println("DeleteSHCalendar err:",err.Error())
  466. }
  467. }
  468. // SyncCalendarFromShanghai 上海路演数据同步到自系统
  469. func SyncCalendarFromShanghai(userPhone, startDate, endDate string) (err error) {
  470. errMsg := ``
  471. defer func() {
  472. if errMsg != `` {
  473. //fmt.Println("err:", errMsg)
  474. go utils.SendEmail(utils.APPNAME+"上海路演数据同步到自系统失败:"+time.Now().Format("2006-01-02 15:04:05"), errMsg, utils.EmailSendToUsers)
  475. }
  476. }()
  477. //fmt.Println(userPhone, startDate, endDate)
  478. endDateTime, err := time.ParseInLocation(utils.FormatDate, endDate, time.Local)
  479. if err != nil {
  480. errMsg = `结束日期转time类型失败,err:` + err.Error()
  481. return
  482. }
  483. currDay := time.Now().Format(utils.FormatDate)
  484. nowDateTime, _ := time.ParseInLocation(utils.FormatDate, currDay, time.Local)
  485. //如果传入的结束日期早于当前日期,那么就不去查询了
  486. if endDateTime.Before(nowDateTime) {
  487. return
  488. }
  489. //以当前日期作为起始日期去同步
  490. list, err := getCalendarFrom(userPhone, currDay, endDate)
  491. if err != nil {
  492. errMsg = "获取第三方路演日历数据失败,err:" + err.Error()
  493. return
  494. }
  495. thirdIdList := make([]int, 0)
  496. if len(list) > 0 {
  497. for _, v := range list {
  498. thirdIdList = append(thirdIdList, v.ID)
  499. }
  500. rsCalendarRelationList, tmpErr := roadshow.GetRsCalendarRelationListByThirdIds(thirdIdList)
  501. if tmpErr != nil {
  502. err = tmpErr
  503. errMsg = "获取关联列表失败,err:" + tmpErr.Error()
  504. return
  505. }
  506. rsCalendarRelationMap := make(map[int]*roadshow.RsCalendarRelation)
  507. for _, rsCalendarRelation := range rsCalendarRelationList {
  508. rsCalendarRelationMap[rsCalendarRelation.ThirdCalendarId] = rsCalendarRelation
  509. }
  510. for _, v := range list {
  511. fmt.Println(v)
  512. thirdIdList = append(thirdIdList, v.ID)
  513. if rsCalendarRelation, ok := rsCalendarRelationMap[v.ID]; ok {
  514. //存在的话,那么就去查找对应的信息
  515. if rsCalendarRelation.CalendarType == 1 {
  516. //路演
  517. rsCalendarResearcherInfo, tmpErr := roadshow.GetRsCalendarResearcherById(rsCalendarRelation.SelfCalendarId)
  518. if tmpErr != nil {
  519. errMsg += fmt.Sprint("第三方日历ID:", v.ID, "获取路演研究员信息失败;err:"+tmpErr.Error(), ";")
  520. continue
  521. }
  522. rsCalendarInfo, tmpErr := roadshow.GetRsCalendarById(rsCalendarResearcherInfo.RsCalendarId)
  523. if tmpErr != nil {
  524. errMsg += fmt.Sprint("第三方日历ID:", v.ID, "获取路演信息失败;err:"+tmpErr.Error(), ";")
  525. continue
  526. }
  527. if rsCalendarInfo.Source == 0 { //自系统创建的路演活动,不需要依靠上海方来修改
  528. continue
  529. }
  530. //是否去同步变更数据库
  531. isUpdateSync := false
  532. //是否变更
  533. isUpdate := false
  534. if v.StartTime != rsCalendarRelation.StartTime {
  535. isUpdate = true
  536. }
  537. if v.EndTime != rsCalendarRelation.EndTime {
  538. isUpdate = true
  539. }
  540. if v.Title != rsCalendarRelation.Title {
  541. isUpdate = true
  542. }
  543. researcherList := make([]admin.Admin, 0)
  544. researcherMap := make(map[int]admin.Admin)
  545. addResearcherList := make([]admin.Admin, 0) // 需要新增的研究员
  546. delResearcherIdList := make([]int, 0) //需要删除的路演活动与研究员的关系id
  547. updateResearcherList := make([]*roadshow.RsCalendarResearcher, 0) //待更新的路演活动中研究员信息
  548. if v.ResearcherMobile != rsCalendarRelation.ResearcherMobile {
  549. //研究员变更了,需要去改表
  550. isUpdateSync = true
  551. researcherMobileList := strings.Split(v.ResearcherMobile, ",")
  552. if len(researcherMobileList) > 0 {
  553. for _, mobile := range researcherMobileList {
  554. researcherInfo, tmpErr := getAdminInfo(mobile)
  555. if tmpErr != nil {
  556. errMsg += fmt.Sprint("第三方日历ID:", v.ID, "获取研究员失败,研究员手机号:", mobile, ";err:"+tmpErr.Error(), ";")
  557. continue
  558. }
  559. if researcherInfo.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_RESEARCHR ||
  560. researcherInfo.RoleTypeCode == utils.ROLE_TYPE_CODE_RESEARCHR ||
  561. researcherInfo.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_RESEARCHR ||
  562. researcherInfo.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_DEPARTMENT ||
  563. researcherInfo.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_DEPARTMENT {
  564. researcherList = append(researcherList, researcherInfo)
  565. researcherMap[researcherInfo.AdminId] = researcherInfo
  566. }
  567. }
  568. }
  569. //没有研究员
  570. if len(researcherList) <= 0 {
  571. errMsg += fmt.Sprint("第三方日历ID:", v.ID, ";对方研究员信息失败;")
  572. continue
  573. }
  574. rsCalendarResearcherList, tmpErr := roadshow.GetRsCalendarResearcherListByRsCalendarId(rsCalendarInfo.RsCalendarId)
  575. if tmpErr != nil {
  576. errMsg += fmt.Sprint("第三方日历ID:", v.ID, "获取路演活动中的研究员列表失败,路演活动ID:", rsCalendarInfo.RsCalendarId, ";err:"+tmpErr.Error(), ";")
  577. continue
  578. }
  579. //现有活动中的研究员
  580. rsCalendarResearcherMap := make(map[int]*roadshow.RsCalendarResearcher)
  581. for _, rsCalendarResearcher := range rsCalendarResearcherList {
  582. if _, ok := researcherMap[rsCalendarResearcher.ResearcherId]; ok {
  583. if isUpdate {
  584. updateResearcherList = append(updateResearcherList, rsCalendarResearcher)
  585. }
  586. } else {
  587. delResearcherIdList = append(delResearcherIdList, rsCalendarResearcher.RsCalendarResearcherId)
  588. }
  589. rsCalendarResearcherMap[rsCalendarResearcher.ResearcherId] = rsCalendarResearcher
  590. }
  591. //校验是否需要新增研究员
  592. for adminId, researcherInfo := range researcherMap {
  593. //如果
  594. if _, ok := rsCalendarResearcherMap[adminId]; !ok {
  595. addResearcherList = append(addResearcherList, researcherInfo)
  596. }
  597. }
  598. } else if isUpdate { //如果有字段更新,那么需要将所有的研究员信息更新
  599. isUpdateSync = true
  600. rsCalendarResearcherList, tmpErr := roadshow.GetRsCalendarResearcherListByRsCalendarId(rsCalendarInfo.RsCalendarId)
  601. if tmpErr != nil {
  602. errMsg += fmt.Sprint("第三方日历ID:", v.ID, "获取路演活动中的研究员列表失败,路演活动ID:", rsCalendarInfo.RsCalendarId, ";err:"+tmpErr.Error(), ";")
  603. continue
  604. }
  605. for _, rsCalendarResearcher := range rsCalendarResearcherList {
  606. updateResearcherList = append(updateResearcherList, rsCalendarResearcher)
  607. }
  608. }
  609. if isUpdateSync {
  610. tmpErr = roadshow.UpdateSyncRsCalendarRelation(v, rsCalendarInfo, rsCalendarRelation, updateResearcherList, delResearcherIdList, addResearcherList)
  611. if tmpErr != nil {
  612. err = tmpErr
  613. errMsg += fmt.Sprint("第三方日历ID:", v.ID, "修改关联关系失败;err:"+tmpErr.Error(), ";")
  614. return
  615. }
  616. }
  617. } else {
  618. //事项
  619. //事项都是由自系统创建的,不需要依靠上海方来修改
  620. }
  621. } else {
  622. //数据不存在
  623. createUser, tmpErr := getAdminInfo(v.UserPhone)
  624. if tmpErr != nil {
  625. errMsg += fmt.Sprint("第三方日历ID:", v.ID, "获取创建人失败,创建人手机号:", v.UserPhone, ";err:"+tmpErr.Error(), ";")
  626. continue
  627. }
  628. //研究员列表
  629. researcherList := make([]admin.Admin, 0)
  630. researcherMobileList := strings.Split(v.ResearcherMobile, ",")
  631. if len(researcherMobileList) > 0 {
  632. for _, mobile := range researcherMobileList {
  633. researcherInfo, tmpErr := getAdminInfo(mobile)
  634. if tmpErr != nil {
  635. errMsg += fmt.Sprint("第三方日历ID:", v.ID, "获取研究员失败,研究员手机号:", mobile, ";err:"+tmpErr.Error(), ";")
  636. continue
  637. }
  638. if researcherInfo.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_RESEARCHR ||
  639. researcherInfo.RoleTypeCode == utils.ROLE_TYPE_CODE_RESEARCHR ||
  640. researcherInfo.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_RESEARCHR ||
  641. researcherInfo.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_DEPARTMENT ||
  642. researcherInfo.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_DEPARTMENT {
  643. researcherList = append(researcherList, researcherInfo)
  644. }
  645. }
  646. }
  647. //没有研究员
  648. if len(researcherList) <= 0 {
  649. continue
  650. }
  651. //数据入库
  652. tmpErr = roadshow.SyncRsCalendarRelation(v, createUser, researcherList)
  653. if tmpErr != nil {
  654. err = tmpErr
  655. errMsg += fmt.Sprint("第三方日历ID:", v.ID, "绑定关联关系失败;err:"+tmpErr.Error(), ";")
  656. return
  657. }
  658. //fmt.Println("createUser:", createUser)
  659. }
  660. }
  661. }
  662. return
  663. }
  664. // CreateOaUser 新增系统用户
  665. func CreateOaUser(mobile, username string, groupId int) (err error) {
  666. defer func() {
  667. if err != nil {
  668. go utils.SendEmail(utils.APPNAME+"系统用户同步到上海失败:"+time.Now().Format("2006-01-02 15:04:05"), err.Error(), utils.EmailSendToUsers)
  669. }
  670. }()
  671. token, err := GetAccessToken()
  672. finalUrl := utils.CRM_OPEN_API_URL + "/v1/OaUser/create?access_token=" + token
  673. //发送创建请求
  674. form := url.Values{}
  675. form.Add("mobile", mobile)
  676. form.Add("username", username)
  677. form.Add("group_id", fmt.Sprint(groupId))
  678. resp, err := netHttp.PostForm(finalUrl, form)
  679. fmt.Println("form:", form)
  680. if err != nil {
  681. err = errors.New("NewRequest Err:" + err.Error())
  682. return
  683. }
  684. defer resp.Body.Close()
  685. //解析resp并且存入关联表
  686. body, err := ioutil.ReadAll(resp.Body)
  687. if err != nil {
  688. fmt.Println("reponse error", err)
  689. return
  690. }
  691. fmt.Println("body:", string(body))
  692. var calendarResp roadshow.CreatSHCalendarResp
  693. err = json.Unmarshal(body, &calendarResp)
  694. if calendarResp.Code != 1 {
  695. err = errors.New("Create SHCalendar err:" + calendarResp.Msg)
  696. return
  697. }
  698. return
  699. }
  700. // getAdminInfo 通过手机号获取用户信息
  701. func getAdminInfo(mobile string) (adminInfo admin.Admin, err error) {
  702. adminMap := make(map[string]admin.Admin)
  703. redisAdminData, redisErr := utils.Rc.RedisString(utils.CACHE_KEY_ADMIN)
  704. if redisErr != nil {
  705. list, err := admin.GetSysuserList("", []interface{}{}, 0, 1000)
  706. // GetSysuserList
  707. for _, tmpAdminInfo := range list {
  708. adminMap[tmpAdminInfo.Mobile] = *tmpAdminInfo
  709. }
  710. //入缓存
  711. redisJsonData, err := json.Marshal(adminMap)
  712. if err == nil {
  713. _ = utils.Rc.Put(utils.CACHE_KEY_ADMIN, string(redisJsonData), time.Minute*30)
  714. }
  715. } else {
  716. err := json.Unmarshal([]byte(redisAdminData), &adminMap)
  717. if err != nil {
  718. fmt.Println("用户数据,json转换失败:", err)
  719. }
  720. }
  721. adminInfo, ok := adminMap[mobile]
  722. if !ok {
  723. err = fmt.Errorf("找不到该手机号用户,mobile:" + mobile)
  724. }
  725. return
  726. }
  727. func getTitle(activityType, roadshowType, activityCategory, roadshowPlatform, province, city string) string {
  728. var title string
  729. switch activityType {
  730. case "内部会议":
  731. title = "内部会议"
  732. case "公开会议", "路演":
  733. if roadshowType == "线上" {
  734. title = roadshowType + activityType + roadshowPlatform
  735. } else {
  736. title = roadshowType + activityType + province + city
  737. }
  738. case "报告电话会":
  739. title = activityCategory + "电话会"
  740. }
  741. return title
  742. }
  743. // GetAllActivityType 获取全部的活动分类
  744. func GetAllActivityType() (list []*roadshow.ActivityTypeList, err error) {
  745. list, err = roadshow.GetActivityTypeListByActivityTypePId(0)
  746. if err != nil {
  747. return
  748. }
  749. for _, v := range list {
  750. tmpList, tmpErr := roadshow.GetActivityTypeListByActivityTypePId(v.ActivityTypeId)
  751. if tmpErr != nil {
  752. err = tmpErr
  753. return
  754. }
  755. v.ChildList = tmpList
  756. }
  757. return
  758. }