calendar.go 35 KB

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