calendar.go 40 KB

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