yidong.go 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939
  1. package services
  2. import (
  3. "context"
  4. "encoding/json"
  5. "errors"
  6. "fmt"
  7. "hongze/hongze_cygx/models"
  8. "hongze/hongze_cygx/utils"
  9. "io/ioutil"
  10. "net/http"
  11. "strings"
  12. "time"
  13. )
  14. // GetActivityTypeIdWithYiDong 根据易董同步过来的活动类型,自动匹配行业
  15. func GetActivityTypeIdWithYiDong(industrySwName string) (chartPermissionId int) {
  16. mapIndustrySwName := map[string]int{
  17. "家用电器": utils.XIAO_FEI_ID,
  18. "纺织服饰": utils.XIAO_FEI_ID,
  19. "休闲服务": utils.XIAO_FEI_ID,
  20. "食品饮料": utils.XIAO_FEI_ID,
  21. "美容护理": utils.XIAO_FEI_ID,
  22. //消费
  23. "汽车": utils.ZHI_ZAO_ID,
  24. "机械设备": utils.ZHI_ZAO_ID,
  25. "电力设备": utils.ZHI_ZAO_ID,
  26. //智造
  27. "电子": utils.KE_JI_ID,
  28. "计算机": utils.KE_JI_ID,
  29. "通信": utils.KE_JI_ID,
  30. //科技
  31. "医药生物": utils.YI_YAO_ID,
  32. //医药
  33. "策略": utils.CE_LUE_ID,
  34. //策略
  35. "非银金融": utils.CHART_PERMISSION_ID_YANXUAN,
  36. "建筑装饰": utils.CHART_PERMISSION_ID_YANXUAN,
  37. "基础化工": utils.CHART_PERMISSION_ID_YANXUAN,
  38. "农林牧渔": utils.CHART_PERMISSION_ID_YANXUAN,
  39. "传媒": utils.CHART_PERMISSION_ID_YANXUAN,
  40. "公用事业": utils.CHART_PERMISSION_ID_YANXUAN,
  41. "建筑材料": utils.CHART_PERMISSION_ID_YANXUAN,
  42. "房地产": utils.CHART_PERMISSION_ID_YANXUAN,
  43. "采掘": utils.CHART_PERMISSION_ID_YANXUAN,
  44. "轻工制造": utils.CHART_PERMISSION_ID_YANXUAN,
  45. "钢铁": utils.CHART_PERMISSION_ID_YANXUAN,
  46. "交通运输": utils.CHART_PERMISSION_ID_YANXUAN,
  47. "国防军工": utils.CHART_PERMISSION_ID_YANXUAN,
  48. "银行": utils.CHART_PERMISSION_ID_YANXUAN,
  49. "有色金属": utils.CHART_PERMISSION_ID_YANXUAN,
  50. "综合": utils.CHART_PERMISSION_ID_YANXUAN,
  51. "商业贸易": utils.CHART_PERMISSION_ID_YANXUAN,
  52. "宏观": utils.CHART_PERMISSION_ID_YANXUAN,
  53. "金融工程": utils.CHART_PERMISSION_ID_YANXUAN,
  54. "商贸零售": utils.CHART_PERMISSION_ID_YANXUAN,
  55. "社会服务": utils.CHART_PERMISSION_ID_YANXUAN,
  56. "煤炭": utils.CHART_PERMISSION_ID_YANXUAN,
  57. "石油石化": utils.CHART_PERMISSION_ID_YANXUAN,
  58. "环保": utils.CHART_PERMISSION_ID_YANXUAN,
  59. //研选
  60. }
  61. chartPermissionId = mapIndustrySwName[industrySwName]
  62. return
  63. }
  64. // GetActivityTypeIdWithYiDong 根据易董同步过来的活动类型,自动匹配行业
  65. func GetActivityTypeNameWithYiDong(industrySwName string) (chartPermissionName string) {
  66. mapIndustrySwName := map[string]string{
  67. "家用电器": utils.XIAO_FEI_NAME,
  68. "纺织服饰": utils.XIAO_FEI_NAME,
  69. "休闲服务": utils.XIAO_FEI_NAME,
  70. "食品饮料": utils.XIAO_FEI_NAME,
  71. "美容护理": utils.XIAO_FEI_NAME,
  72. //消费
  73. "汽车": utils.ZHI_ZAO_NAME,
  74. "机械设备": utils.ZHI_ZAO_NAME,
  75. "电力设备": utils.ZHI_ZAO_NAME,
  76. //智造
  77. "电子": utils.KE_JI_NAME,
  78. "计算机": utils.KE_JI_NAME,
  79. "通信": utils.KE_JI_NAME,
  80. //科技
  81. "医药生物": utils.YI_YAO_NAME,
  82. //医药
  83. "策略": utils.CE_LUE_NAME,
  84. //策略
  85. "非银金融": utils.CHART_PERMISSION_NAME_MF_YANXUAN,
  86. "建筑装饰": utils.CHART_PERMISSION_NAME_MF_YANXUAN,
  87. "基础化工": utils.CHART_PERMISSION_NAME_MF_YANXUAN,
  88. "农林牧渔": utils.CHART_PERMISSION_NAME_MF_YANXUAN,
  89. "传媒": utils.CHART_PERMISSION_NAME_MF_YANXUAN,
  90. "公用事业": utils.CHART_PERMISSION_NAME_MF_YANXUAN,
  91. "建筑材料": utils.CHART_PERMISSION_NAME_MF_YANXUAN,
  92. "房地产": utils.CHART_PERMISSION_NAME_MF_YANXUAN,
  93. "采掘": utils.CHART_PERMISSION_NAME_MF_YANXUAN,
  94. "轻工制造": utils.CHART_PERMISSION_NAME_MF_YANXUAN,
  95. "钢铁": utils.CHART_PERMISSION_NAME_MF_YANXUAN,
  96. "交通运输": utils.CHART_PERMISSION_NAME_MF_YANXUAN,
  97. "国防军工": utils.CHART_PERMISSION_NAME_MF_YANXUAN,
  98. "银行": utils.CHART_PERMISSION_NAME_MF_YANXUAN,
  99. "有色金属": utils.CHART_PERMISSION_NAME_MF_YANXUAN,
  100. "综合": utils.CHART_PERMISSION_NAME_MF_YANXUAN,
  101. "商业贸易": utils.CHART_PERMISSION_NAME_MF_YANXUAN,
  102. "宏观": utils.CHART_PERMISSION_NAME_MF_YANXUAN,
  103. "金融工程": utils.CHART_PERMISSION_NAME_MF_YANXUAN,
  104. "商贸零售": utils.CHART_PERMISSION_NAME_MF_YANXUAN,
  105. "社会服务": utils.CHART_PERMISSION_NAME_MF_YANXUAN,
  106. "煤炭": utils.CHART_PERMISSION_NAME_MF_YANXUAN,
  107. "石油石化": utils.CHART_PERMISSION_NAME_MF_YANXUAN,
  108. "环保": utils.CHART_PERMISSION_NAME_MF_YANXUAN,
  109. //研选
  110. }
  111. chartPermissionName = mapIndustrySwName[industrySwName]
  112. return
  113. }
  114. // 获取易董token
  115. func GetYiDongToken() (token string, err error) {
  116. defer func() {
  117. if err != nil {
  118. fmt.Println(err)
  119. utils.FileLog.Info(err.Error())
  120. }
  121. }()
  122. cacheKey := utils.YI_DONG_ZHENG_TONG_YUN_TOKEN_KEY
  123. ttlTime := utils.Rc.GetRedisTTL(cacheKey)
  124. if ttlTime > 0 {
  125. token, _ = utils.Rc.RedisString(cacheKey)
  126. }
  127. if token == "" {
  128. url := utils.YiDongZhengTongYunUrl + "oauth/token?grant_type=client_credentials&response_type=token&client_id=" + utils.YiDongZhengTongYunAppid + "&client_secret=" + utils.YiDongZhengTongYunSecret
  129. method := "GET"
  130. client := &http.Client{}
  131. req, errReq := http.NewRequest(method, url, nil)
  132. if errReq != nil {
  133. err = errReq
  134. return
  135. }
  136. res, errReq := client.Do(req)
  137. if errReq != nil {
  138. err = errReq
  139. return
  140. }
  141. defer res.Body.Close()
  142. type Ydtoklen struct {
  143. Success bool `json:"success"`
  144. ExpiresIn int `json:"expires_in"`
  145. AccessToken string `json:"access_token"`
  146. }
  147. var ydtoklen Ydtoklen
  148. body, errReq := ioutil.ReadAll(res.Body)
  149. if errReq != nil {
  150. err = errReq
  151. return
  152. }
  153. errReq = json.Unmarshal(body, &ydtoklen)
  154. if errReq != nil {
  155. err = errReq
  156. return
  157. }
  158. token = ydtoklen.AccessToken
  159. utils.Rc.Put(cacheKey, ydtoklen.AccessToken, time.Second*7000)
  160. }
  161. return
  162. }
  163. // 获取易董活动列表
  164. func GetYiDongActivity(cont context.Context) (err error) {
  165. //func GetYiDongActivity() (err error) {
  166. defer func() {
  167. if err != nil {
  168. fmt.Println(err)
  169. go utils.SendAlarmMsg("获取易董活动列表失败:"+err.Error(), 2)
  170. utils.FileLog.Info(err.Error())
  171. }
  172. }()
  173. var token string
  174. token, _ = GetYiDongToken()
  175. url := utils.YiDongZhengTongYunUrl + "interact/activityManageApi/getRoadshowList?access_token=" + token
  176. method := "POST"
  177. payload := strings.NewReader(`{
  178. "meetingStatus": "0"
  179. }`)
  180. client := &http.Client{}
  181. req, err := http.NewRequest(method, url, payload)
  182. if err != nil {
  183. fmt.Println(err)
  184. utils.FileLog.Info(err.Error())
  185. return
  186. }
  187. req.Header.Add("Content-Type", "application/json")
  188. res, err := client.Do(req)
  189. if err != nil {
  190. fmt.Println(err)
  191. utils.FileLog.Info(err.Error())
  192. return
  193. }
  194. defer res.Body.Close()
  195. var ApifoxModal *models.ApifoxModal
  196. body, err := ioutil.ReadAll(res.Body)
  197. if err != nil {
  198. fmt.Println(err)
  199. utils.FileLog.Info(err.Error())
  200. return
  201. }
  202. //添加请求日志记录
  203. itemApiLog := new(models.CygxThreeApiLog)
  204. itemApiLog.CreateTime = time.Now()
  205. itemApiLog.Source = 1
  206. itemApiLog.Url = url
  207. itemApiLog.Body = utils.ReplaceSpaceAndWrap(fmt.Sprint(payload))
  208. itemApiLog.Result = string(body)
  209. go models.AddCygxThreeApiLog(itemApiLog)
  210. err = json.Unmarshal(body, &ApifoxModal)
  211. if err != nil {
  212. fmt.Println("Getres.PublicGetDate Err:", err.Error())
  213. utils.FileLog.Info(err.Error())
  214. return
  215. }
  216. OldActYIdongList, err := models.GetActivityListByYiDong()
  217. if err != nil {
  218. fmt.Println(err)
  219. utils.FileLog.Info(string(err.Error()))
  220. return
  221. }
  222. mapOldYiDong := make(map[string]string)
  223. mapOldYiDongBody := make(map[string]string)
  224. for _, v := range OldActYIdongList {
  225. mapOldYiDong[v.YidongActivityId] = v.YidongActivityId
  226. mapOldYiDongBody[v.YidongActivityId] = fmt.Sprint(v.ActivityName, v.Label, v.ChartPermissionId, v.ActivityTime, v.YidongActivityEndTime, v.DistinguishedGuest)
  227. }
  228. // 通过查研观向观向建会的易董活动
  229. yiDongByCygxList, err := models.GetActivityListByYiDongByCygx()
  230. if err != nil {
  231. fmt.Println(err)
  232. utils.FileLog.Info(string(err.Error()))
  233. return
  234. }
  235. yiDongByCygxMap := make(map[string]string)
  236. for _, v := range yiDongByCygxList {
  237. yiDongByCygxMap[v.YidongActivityIdByCygx] = v.YidongActivityIdByCygx
  238. }
  239. var itemsAdd []*models.CygxActivity
  240. if len(ApifoxModal.Result) > 0 {
  241. actList := ApifoxModal.Result
  242. for _, v := range actList {
  243. //同步有效性 1有效,0失效
  244. if v.SyncFlag == "0" {
  245. continue
  246. }
  247. //如果是通过查研观向观向建会的易董活动,就不进行更新的操作
  248. if _, ok := yiDongByCygxMap[v.ID]; ok {
  249. continue
  250. }
  251. var item = new(models.CygxActivity)
  252. item.YidongActivityId = v.ID
  253. item.ActivityTypeId = 3
  254. item.ActivityTypeName = "公司调研电话会"
  255. sliceCompanyInfo := strings.Split(v.CompanyInfo, "(")
  256. sliceActivityTitle := strings.Split(v.CompanyInfo, ")")
  257. companyInfo := sliceCompanyInfo[0]
  258. if len(sliceActivityTitle) > 1 {
  259. item.ActivityName = companyInfo + v.Title
  260. } else {
  261. item.ActivityName = v.Title
  262. }
  263. //fmt.Println(item.ActivityName)
  264. //return err
  265. item.LastUpdatedTime = time.Now()
  266. item.Label = companyInfo
  267. item.TemporaryLabel = companyInfo
  268. item.ChartPermissionId = GetActivityTypeIdWithYiDong(v.IndustrySwName)
  269. item.ChartPermissionName = GetActivityTypeNameWithYiDong(v.IndustrySwName)
  270. item.ChartPermissionNames = GetActivityTypeNameWithYiDong(v.IndustrySwName)
  271. item.ActivityTime = v.Start
  272. item.YidongActivityEndTime = v.End
  273. item.YidongSignUpStart = v.SignUpStart
  274. item.YidongSignUpEnd = v.SignUpEnd
  275. item.YidongActivityEndTime = v.End
  276. item.ActivityTimeText = GetActivityTextTime(v.Start)
  277. item.YidongActivityUrl = v.URL
  278. item.ActivityJoinType = v.ActivityJoinType
  279. item.IsExternalLabel = 1
  280. detailYidng, err := GetYiDongActivityDetail(v.ID)
  281. if err != nil {
  282. return err
  283. }
  284. detailList := detailYidng.Resultdetail.GuestPersonList
  285. for _, vdetail := range detailList {
  286. item.DistinguishedGuest += vdetail.PersonName + " " + vdetail.JobName + ","
  287. }
  288. item.DistinguishedGuest = strings.TrimRight(item.DistinguishedGuest, ",")
  289. item.Body = "<p>" + "【" + item.ActivityName + "】" + "<p>时间:" + item.ActivityTimeText + "</p>嘉宾:" + item.DistinguishedGuest + "</p>"
  290. //fmt.Println(item.Body)
  291. //return err
  292. if mapOldYiDong[v.ID] == "" {
  293. itemsAdd = append(itemsAdd, item)
  294. newId, err := models.AddCygxActivity(item)
  295. if err != nil {
  296. fmt.Println(err)
  297. utils.FileLog.Info(string(err.Error()))
  298. return err
  299. }
  300. //把公司名称当做标的 对活动进行产业标的的关联
  301. YidongActivityGroup(companyInfo, int(newId))
  302. } else {
  303. //如果内容主体有做变更,就修改内容
  304. if mapOldYiDongBody[v.ID] != fmt.Sprint(item.ActivityName+"12", item.Label, item.ChartPermissionId, item.ActivityTime, item.YidongActivityEndTime, item.DistinguishedGuest) {
  305. updateParams := make(map[string]interface{})
  306. updateParams["ActivityName"] = item.ActivityName
  307. updateParams["Body"] = item.Body
  308. updateParams["Label"] = item.Label
  309. //updateParams["TemporaryLabel"] = item.TemporaryLabel
  310. updateParams["DistinguishedGuest"] = item.DistinguishedGuest
  311. updateParams["ChartPermissionId"] = item.ChartPermissionId
  312. updateParams["ChartPermissionName"] = item.ChartPermissionName
  313. updateParams["ChartPermissionNames"] = item.ChartPermissionNames
  314. updateParams["ActivityTime"] = item.ActivityTime
  315. updateParams["YidongActivityEndTime"] = item.YidongActivityEndTime
  316. updateParams["ActivityTimeText"] = item.ActivityTimeText
  317. updateParams["YidongActivityUrl"] = item.YidongActivityUrl
  318. updateParams["ActivityJoinType"] = item.ActivityJoinType
  319. updateParams["YidongSignUpStart"] = item.YidongSignUpStart
  320. updateParams["YidongSignUpEnd"] = item.YidongSignUpEnd
  321. updateParams["IsExternalLabel"] = 1
  322. updateParams["LastUpdatedTime"] = time.Now()
  323. whereParam := map[string]interface{}{"yidong_activity_id": item.YidongActivityId}
  324. err = models.UpdateByExpr(models.CygxActivity{}, whereParam, updateParams)
  325. if err != nil {
  326. return err
  327. }
  328. }
  329. }
  330. }
  331. }
  332. return
  333. }
  334. // 获取易董活动详情
  335. func GetYiDongActivityDetail(activityId string) (detail *models.ApifoxModaldetail, err error) {
  336. defer func() {
  337. if err != nil {
  338. go utils.SendAlarmMsg("获取易董活动详情失败:"+err.Error(), 2)
  339. }
  340. }()
  341. var token string
  342. token, _ = GetYiDongToken()
  343. url := utils.YiDongZhengTongYunUrl + "interact/activityManageApi/getRoadshowDetail?access_token=" + token
  344. method := "POST"
  345. payload := strings.NewReader(`{"activityId":"` + activityId + `"}`)
  346. client := &http.Client{}
  347. req, err := http.NewRequest(method, url, payload)
  348. if err != nil {
  349. fmt.Println(err)
  350. utils.FileLog.Info(err.Error())
  351. return
  352. }
  353. req.Header.Add("Content-Type", "application/json")
  354. res, err := client.Do(req)
  355. if err != nil {
  356. fmt.Println(err)
  357. utils.FileLog.Info(err.Error())
  358. return
  359. }
  360. defer res.Body.Close()
  361. var ApifoxModal *models.ApifoxModaldetail
  362. body, err := ioutil.ReadAll(res.Body)
  363. if err != nil {
  364. fmt.Println(err)
  365. utils.FileLog.Info(err.Error())
  366. return
  367. }
  368. //添加请求日志记录
  369. itemApiLog := new(models.CygxThreeApiLog)
  370. itemApiLog.CreateTime = time.Now()
  371. itemApiLog.Source = 1
  372. itemApiLog.Url = url
  373. itemApiLog.Body = utils.ReplaceSpaceAndWrap(fmt.Sprint(payload))
  374. itemApiLog.Result = string(body)
  375. go models.AddCygxThreeApiLog(itemApiLog)
  376. err = json.Unmarshal(body, &ApifoxModal)
  377. if err != nil {
  378. fmt.Println("Getres.PublicGetDate Err:", err.Error())
  379. utils.FileLog.Info(err.Error())
  380. return
  381. }
  382. detail = ApifoxModal
  383. return
  384. }
  385. // 生成用户相关信息接口 获取用户tgc
  386. func GetYiDongCreateUserInfo(user *models.WxUserItem) (userTgc string, err error) {
  387. defer func() {
  388. if err != nil {
  389. fmt.Println(err)
  390. go utils.SendAlarmMsg("生成用户相关信息接口 获取用户tgc失败:"+err.Error(), 2)
  391. utils.FileLog.Info(err.Error())
  392. }
  393. }()
  394. url := utils.YiDongHuaWeiYunUrl + "app/hz/createUserInfo"
  395. method := "POST"
  396. payload := strings.NewReader(`{
  397. "phone": "` + user.Mobile + `",
  398. "personName": "` + user.RealName + `",
  399. "companyName": "` + user.CompanyName + `",
  400. "jobName": "` + user.Position + `",
  401. "mobileCountryCode": "+` + user.CountryCode + `",
  402. "sourceFrom": "01"
  403. }`)
  404. client := &http.Client{}
  405. req, err := http.NewRequest(method, url, payload)
  406. if err != nil {
  407. fmt.Println(err)
  408. utils.FileLog.Info(err.Error())
  409. return
  410. }
  411. req.Header.Add("Content-Type", "application/json")
  412. res, err := client.Do(req)
  413. if err != nil {
  414. fmt.Println(err)
  415. utils.FileLog.Info(err.Error())
  416. return
  417. }
  418. defer res.Body.Close()
  419. var ApifoxModal *models.ApifoxModalUserTgc
  420. body, err := ioutil.ReadAll(res.Body)
  421. if err != nil {
  422. fmt.Println(err)
  423. utils.FileLog.Info(err.Error())
  424. return
  425. }
  426. err = json.Unmarshal(body, &ApifoxModal)
  427. if err != nil {
  428. fmt.Println("Getres.PublicGetDate Err:", err.Error())
  429. utils.FileLog.Info(err.Error())
  430. return
  431. }
  432. userTgc = ApifoxModal.Result.Tgc
  433. return
  434. }
  435. // GetYiDongOriginalLink 将易懂的短连接转为长链接
  436. func GetYiDongOriginalLink(item *models.ActivityDetail) (yidongLongLink string, err error) {
  437. defer func() {
  438. if err != nil {
  439. fmt.Println(err)
  440. go utils.SendAlarmMsg("将易懂的短连接转为长链接 失败:"+err.Error(), 2)
  441. utils.FileLog.Info(err.Error())
  442. }
  443. }()
  444. sliceYidongActivityUrl := strings.Split(item.YidongActivityUrl, "/")
  445. var shortLink string
  446. if len(sliceYidongActivityUrl) > 1 {
  447. shortLink = sliceYidongActivityUrl[len(sliceYidongActivityUrl)-1]
  448. }
  449. var token string
  450. token, err = GetYiDongToken()
  451. if err != nil {
  452. fmt.Println(err)
  453. return
  454. }
  455. url := utils.YiDonggetOriginalLink + shortLink + "&access_token=" + token
  456. fmt.Println(url)
  457. method := "GET"
  458. client := &http.Client{}
  459. req, err := http.NewRequest(method, url, nil)
  460. if err != nil {
  461. fmt.Println(err)
  462. return
  463. }
  464. res, err := client.Do(req)
  465. if err != nil {
  466. fmt.Println(err)
  467. return
  468. }
  469. defer res.Body.Close()
  470. var ApifoxModal *models.ApifoxgetOriginalLink
  471. body, err := ioutil.ReadAll(res.Body)
  472. if err != nil {
  473. fmt.Println(err)
  474. utils.FileLog.Info(err.Error())
  475. return
  476. }
  477. err = json.Unmarshal(body, &ApifoxModal)
  478. if err != nil {
  479. fmt.Println("Getres.PublicGetDate Err:", err.Error())
  480. utils.FileLog.Info(err.Error())
  481. return
  482. }
  483. lingLink := ApifoxModal.Result
  484. //fmt.Println(lingLink)
  485. //
  486. //slicelingLink := strings.Split(lingLink, "redirect_uri=")
  487. ////var shortLink string
  488. //if len(slicelingLink) > 1 {
  489. // lingLink = slicelingLink[len(slicelingLink)-1]
  490. //}
  491. yidongLongLink = lingLink
  492. return
  493. }
  494. // 处理易董这边过来的时间格式
  495. func GetActivityTextTime(timeYidong string) (timeText string) {
  496. strTime := timeYidong
  497. startTime := utils.StrTimeToTime(strTime)
  498. week := utils.StrDateTimeToWeek(strTime)
  499. timeStrYmd := startTime.Format(utils.FormatDate)
  500. timeStrHmm := startTime.Format(utils.FormatTime)
  501. timeYmd := utils.StrTimeToTime(timeStrYmd + " 12:00:00") //拼接当天中午12点的时间
  502. var amOrPm string
  503. if startTime.After(timeYmd) {
  504. amOrPm = " PM"
  505. } else {
  506. amOrPm = " AM"
  507. }
  508. timeText = timeStrYmd + "(" + week + ")" + timeStrHmm + amOrPm
  509. return
  510. }
  511. //func init() {
  512. // GetYiDongActivityMeeting()
  513. //}
  514. // GetYiDongActivityMeeting获取易董到会详情
  515. func GetYiDongActivityMeeting(cont context.Context) (err error) {
  516. //func GetYiDongActivityMeeting() (err error) {
  517. var condition string
  518. startDate := time.Now().AddDate(0, 0, -1).Format(utils.FormatDateTime)
  519. endDate := time.Now().Add(-time.Minute * 120).Format(utils.FormatDateTime)
  520. condition += ` AND activity_time > ` + "'" + startDate + "'"
  521. condition += ` AND activity_time < ` + "'" + endDate + "'"
  522. //fmt.Println(startDate)
  523. artivityListYidong, err := models.GetActivityListByYidong(condition)
  524. if err != nil {
  525. fmt.Println("GetActivityListByYidong Err:", err.Error())
  526. return err
  527. }
  528. //fmt.Println(artivityListYidong)
  529. //return
  530. //fmt.Println("artivityListYidong", artivityListYidong)
  531. //return err
  532. if len(artivityListYidong) == 0 {
  533. return err
  534. }
  535. var token string
  536. token, _ = GetYiDongToken()
  537. for _, v := range artivityListYidong {
  538. defer func() {
  539. if err != nil {
  540. go utils.SendAlarmMsg("获取易董到会详情失败:"+err.Error(), 2)
  541. }
  542. }()
  543. var yidongActivityId string
  544. if v.YidongActivityId != "" {
  545. yidongActivityId = v.YidongActivityId
  546. } else if v.YidongActivityIdByCygx != "" {
  547. yidongActivityId = v.YidongActivityIdByCygx
  548. }
  549. url := utils.YiDongZhengTongYunUrl + "interact/activityManageApi/getAttendPersonList?access_token=" + token
  550. method := "POST"
  551. payload := strings.NewReader(`{"activityId":"` + yidongActivityId + `"}`)
  552. client := &http.Client{}
  553. req, err := http.NewRequest(method, url, payload)
  554. if err != nil {
  555. fmt.Println(err)
  556. utils.FileLog.Info(err.Error())
  557. return err
  558. }
  559. req.Header.Add("Content-Type", "application/json")
  560. res, err := client.Do(req)
  561. if err != nil {
  562. fmt.Println(err)
  563. utils.FileLog.Info(err.Error())
  564. return err
  565. }
  566. defer res.Body.Close()
  567. var ApifoxModal *models.ApifoxModaluser
  568. body, err := ioutil.ReadAll(res.Body)
  569. if err != nil {
  570. fmt.Println(err)
  571. utils.FileLog.Info(err.Error())
  572. return err
  573. }
  574. //utils.FileLog.Info(string(body))
  575. //fmt.Println(string(body))
  576. err = json.Unmarshal(body, &ApifoxModal)
  577. if err != nil {
  578. fmt.Println("Getres.PublicGetDate Err:", err.Error())
  579. utils.FileLog.Info(err.Error())
  580. return err
  581. }
  582. //跟易董返回的用户状态修改活动以提交到会状态
  583. err = models.UpdateCygxActivitySubmitMeetingByYidong(yidongActivityId)
  584. if err != nil {
  585. fmt.Println("UpdateCygxActivitySubmitMeetingByYidong Err:", err.Error())
  586. return err
  587. }
  588. var mobiles []string
  589. var mobileStr string
  590. var mobileStrMeet string
  591. mapActivityAttendanceDetail := make(map[string]*models.CygxActivityAttendanceDetail)
  592. if len(ApifoxModal.Result) > 0 {
  593. itemlog := new(models.CygxYidongActivityMeetingApiLog)
  594. itemlog.YidongActivityId = yidongActivityId
  595. itemlog.Data = string(body)
  596. itemlog.CreateTime = time.Now()
  597. err = models.AddCygxYidongActivityMeetingApiLog(itemlog)
  598. if err != nil {
  599. fmt.Println("AddCygxYidongActivityMeetingApiLog Err:", err.Error())
  600. return err
  601. }
  602. var itemsUpdate []*models.CygxActivitySignupDetail
  603. needAddAttendanc := make([]*models.CygxActivityAttendanceDetail, 0)
  604. for _, vresult := range ApifoxModal.Result {
  605. if vresult.PersonTelephone == "" {
  606. continue
  607. }
  608. if vresult.Duration != "" || vresult.DurationReview != "" {
  609. mobiles = append(mobiles, vresult.PersonTelephone)
  610. //err = models.UpdateCygxActivitySignupisMeet(v.ActivityId, vresult.PersonTelephone)
  611. //if err != nil {
  612. // fmt.Println("UpdateCygxActivitySignupisMeet Err:", err.Error())
  613. // return err
  614. //}
  615. var itemDetail = new(models.CygxActivitySignupDetail)
  616. if vresult.Duration != "" {
  617. itemDetail.FirstMeetingTime = vresult.StartTime
  618. itemDetail.LastMeetingTime = vresult.EndTime
  619. itemDetail.Duration = vresult.Duration
  620. itemDetail.MeetingStatusStr = "直播"
  621. } else if vresult.DurationReview != "" {
  622. itemDetail.FirstMeetingTime = vresult.StartTimeReview
  623. itemDetail.LastMeetingTime = vresult.EndTimeReview
  624. itemDetail.Duration = vresult.DurationReview
  625. itemDetail.MeetingStatusStr = "回放"
  626. }
  627. itemDetail.Position = vresult.JobName
  628. itemDetail.RealName = vresult.PersonName
  629. itemDetail.Mobile = vresult.PersonTelephone
  630. itemDetail.OutboundMobile = vresult.PersonTelephone
  631. itemDetail.IsMeeting = 1
  632. itemDetail.ActivityId = v.ActivityId
  633. mapActivityAttendanceDetail[vresult.PersonTelephone] = new(models.CygxActivityAttendanceDetail)
  634. mapActivityAttendanceDetail[vresult.PersonTelephone].FirstMeetingTime = vresult.StartTime
  635. mapActivityAttendanceDetail[vresult.PersonTelephone].LastMeetingTime = vresult.EndTime
  636. mapActivityAttendanceDetail[vresult.PersonTelephone].Duration = utils.GetAttendanceDetailSecondsByYiDong(vresult.Duration)
  637. itemsUpdate = append(itemsUpdate, itemDetail)
  638. }
  639. item := new(models.CygxActivityAttendanceDetail)
  640. item.ActivityId = v.ActivityId
  641. item.Mobile = vresult.PersonTelephone
  642. if vresult.Duration != "" {
  643. if vresult.Duration != "" {
  644. item.FirstMeetingTime = vresult.StartTime
  645. item.LastMeetingTime = vresult.EndTime
  646. item.Duration = vresult.Duration
  647. item.MeetingStatusStr = "直播"
  648. } else if vresult.DurationReview != "" {
  649. item.FirstMeetingTime = vresult.StartTimeReview
  650. item.LastMeetingTime = vresult.EndTimeReview
  651. item.Duration = vresult.DurationReview
  652. item.MeetingStatusStr = "回放"
  653. }
  654. item.Position = vresult.JobName
  655. item.RealName = vresult.PersonName
  656. item.FirstMeetingTime = vresult.StartTime
  657. item.LastMeetingTime = vresult.EndTime
  658. item.Duration = vresult.Duration
  659. item.IsMeetingStr = 1
  660. mobileStrMeet += "'" + vresult.PersonTelephone + "'" + ","
  661. item.CreateTime = time.Now()
  662. needAddAttendanc = append(needAddAttendanc, item)
  663. }
  664. mobileStr += "'" + vresult.PersonTelephone + "'" + ","
  665. }
  666. lenmobiles := len(mobiles)
  667. if lenmobiles > 0 {
  668. var parsYd []interface{}
  669. var conditionYd string
  670. conditionYd = ` AND mobile IN (` + utils.GetOrmInReplace(lenmobiles) + `) AND activity_id=? `
  671. parsYd = append(parsYd, mobiles, v.ActivityId)
  672. err = models.UpdateCygxActivitySignupisMeetList(conditionYd, parsYd)
  673. if err != nil {
  674. fmt.Println("UpdateCygxActivitySignupisMeetList Err:", err.Error())
  675. return err
  676. }
  677. err = models.UpdateActivitySignupDetailMultiByYiDong(itemsUpdate)
  678. if err != nil {
  679. fmt.Println("UpdateActivitySignupDetailMultiByYiDong Err:", err.Error())
  680. return err
  681. }
  682. }
  683. mobileStr = strings.TrimRight(mobileStr, ",")
  684. if mobileStr == "" {
  685. mobileStr = "1"
  686. }
  687. mobileStrMeet = strings.TrimRight(mobileStrMeet, ",")
  688. if mobileStrMeet == "" {
  689. mobileStrMeet = "1"
  690. }
  691. listUser, err := models.GetWxUserOutboundMobile(mobileStr)
  692. if err != nil {
  693. fmt.Println("GetWxUserOutboundMobile Err:", err.Error())
  694. return err
  695. }
  696. for kAdd, vAdd := range needAddAttendanc {
  697. for _, v2 := range listUser {
  698. if v2.OutboundMobile == vAdd.Mobile || v2.Mobile == vAdd.Mobile {
  699. if needAddAttendanc[kAdd].CompanyId <= 1 {
  700. needAddAttendanc[kAdd].CompanyId = v2.CompanyId
  701. needAddAttendanc[kAdd].SellerName = v2.SellerName
  702. needAddAttendanc[kAdd].CompanyName = v2.CompanyName
  703. //needAddAttendanc[k].IsMeetingStr = 1
  704. }
  705. }
  706. }
  707. }
  708. //参会记录
  709. err = models.AddAttendancDetail(needAddAttendanc, v.ActivityId, mobileStrMeet)
  710. if err != nil {
  711. fmt.Println("AddAttendancDetail Err:", err.Error())
  712. return err
  713. }
  714. ////处理是否限制报名
  715. err = AddCygxActivityRestrictSignupByAdmin(v.ActivityId)
  716. if err != nil {
  717. fmt.Println("AddCygxActivityRestrictSignupByAdmin Err:", err.Error())
  718. return err
  719. }
  720. AddctivitySignupDetailByJmcj(needAddAttendanc, v.ActivityId)
  721. }
  722. }
  723. return
  724. }
  725. // YidongActivityGroup 添加活动与产业标的的关联
  726. func YidongActivityGroup(subjectName string, activityId int) (err error) {
  727. subjectList, err := models.GetCygxIndustrialSubjectList(subjectName)
  728. if err != nil {
  729. fmt.Println(err)
  730. return err
  731. }
  732. if len(subjectList) == 0 {
  733. return err
  734. }
  735. fmt.Println("去掉临时标签的活动", activityId)
  736. err = models.UpdateActivityshowSubject(activityId)
  737. if err != nil {
  738. go utils.SendAlarmMsg("UpdateActivityshowSubject :根据易董推过来的匹配信息,判断临时标签是否展示失败"+err.Error(), 2)
  739. }
  740. var industrialActivityItems []*models.CygxIndustrialActivityGroupManagement
  741. var subjectActivityItems []*models.CygxIndustrialActivityGroupSubject
  742. mapSubjectName := make(map[string]string)
  743. for _, v := range subjectList {
  744. industrialActivityItem := new(models.CygxIndustrialActivityGroupManagement)
  745. subjectActivityItem := new(models.CygxIndustrialActivityGroupSubject)
  746. industrialActivityItem.ActivityId = activityId
  747. industrialActivityItem.IndustrialManagementId = v.IndustrialManagementId
  748. industrialActivityItem.Source = 1
  749. industrialActivityItem.CreateTime = time.Now()
  750. industrialActivityItems = append(industrialActivityItems, industrialActivityItem)
  751. subjectActivityItem.ActivityId = activityId
  752. subjectActivityItem.IndustrialSubjectId = v.IndustrialSubjectId
  753. subjectActivityItem.Source = 1
  754. subjectActivityItem.CreateTime = time.Now()
  755. if mapSubjectName[v.SubjectName] == "" {
  756. subjectActivityItems = append(subjectActivityItems, subjectActivityItem)
  757. mapSubjectName[v.SubjectName] = v.SubjectName
  758. }
  759. }
  760. err = models.AddCygxActiuvityGroupMulti(industrialActivityItems, subjectActivityItems)
  761. if err != nil {
  762. go utils.SendAlarmMsg("AddCygxActiuvityGroupMulti :批量添加易董活动关联的活动标签失败"+err.Error(), 2)
  763. }
  764. return
  765. }
  766. // 会前一小时将,报名信息同步到易董
  767. func YiDongSignAppointmentsForThird(cont context.Context) (err error) {
  768. //func YiDongSignAppointmentsForThird() (err error) {
  769. defer func() {
  770. if err != nil {
  771. fmt.Println(err)
  772. go utils.SendAlarmMsg("会前一小时将,报名信息同步到易董,同步失败"+err.Error(), 2)
  773. }
  774. }()
  775. var pars []interface{}
  776. var condition string
  777. startDate := time.Now().Add(+time.Minute * 45).Format(utils.FormatDateTime)
  778. endDate := time.Now().Add(+time.Minute * 60).Format(utils.FormatDateTime)
  779. condition = " AND is_yidong_sign_up = 0 AND yidong_activity_id_by_cygx != '' AND activity_time BETWEEN ? AND ? "
  780. pars = append(pars, startDate, endDate)
  781. activityList, err := models.GetActivityListByCondition(condition, pars)
  782. if err != nil {
  783. return
  784. }
  785. url := utils.YiDongHuaWeiYunUrl + "app/hz/signAppointmentsForThird"
  786. var outCallStatus string
  787. for _, v := range activityList {
  788. go UpdateIsSendYidongSignUp(v.ActivityId)
  789. var parsSignUp []interface{}
  790. var conditionSignUp string
  791. conditionSignUp += ` AND activity_id = ?`
  792. parsSignUp = append(parsSignUp, v.ActivityId)
  793. conditionSignUp += ` AND do_fail_type = 0 `
  794. listSignUp, e := models.GetActivitySignuListByUser(conditionSignUp, parsSignUp)
  795. if e != nil {
  796. err = errors.New("GetActivitySignuListByUser, Err: " + e.Error())
  797. return
  798. }
  799. if len(listSignUp) == 0 {
  800. continue
  801. }
  802. for _, vS := range listSignUp {
  803. if vS.SignupType == 1 {
  804. outCallStatus = "1"
  805. } else {
  806. outCallStatus = "0"
  807. }
  808. params := SignAppointmentsForThirdParam{
  809. ActivityId: v.YidongActivityIdByCygx,
  810. MobileCountryCode: "+" + vS.CountryCode,
  811. PersonTelephone: vS.OutboundMobile,
  812. ThirdPartySource: "01",
  813. InvestorType: "0",
  814. PersonName: vS.RealName,
  815. JoinRole: "2",
  816. CompanyName: vS.CompanyName,
  817. OutCallStatus: outCallStatus,
  818. }
  819. postData, e := json.Marshal(params)
  820. if e != nil {
  821. err = e
  822. fmt.Println("PostData json.Marshal Err:" + err.Error())
  823. utils.FileLog.Info("PostData json.Marshal Err:" + err.Error())
  824. return
  825. }
  826. method := "POST"
  827. client := &http.Client{}
  828. req, e := http.NewRequest(method, url, strings.NewReader(string(postData)))
  829. if e != nil {
  830. err = e
  831. fmt.Println(err)
  832. return
  833. }
  834. req.Header.Add("Content-Type", "application/json")
  835. res, e := client.Do(req)
  836. if e != nil {
  837. err = e
  838. return
  839. }
  840. defer res.Body.Close()
  841. body, e := ioutil.ReadAll(res.Body)
  842. if e != nil {
  843. err = e
  844. return
  845. }
  846. itemApiLog := new(models.CygxThreeApiLog)
  847. itemApiLog.CreateTime = time.Now()
  848. itemApiLog.Source = 1
  849. itemApiLog.Url = url
  850. itemApiLog.Body = string(postData)
  851. itemApiLog.Result = string(body)
  852. go models.AddCygxThreeApiLog(itemApiLog)
  853. var yidongResp *YiDongSignAppointmentsForThirdResp
  854. err = json.Unmarshal(body, &yidongResp)
  855. if err != nil {
  856. return
  857. }
  858. if !yidongResp.Success {
  859. err = errors.New(" 会前一小时将,报名信息同步到易董,同步失败," + yidongResp.ErrorCode + yidongResp.ErrorMsg)
  860. return
  861. }
  862. }
  863. }
  864. return
  865. }
  866. type SignAppointmentsForThirdParam struct {
  867. ActivityId string `description:"易董活动ID" json:"activityId"`
  868. MobileCountryCode string `description:"国际区号注意要带前面+号 " json:"mobileCountryCode"`
  869. PersonTelephone string `description:"手机号" json:"personTelephone"`
  870. ThirdPartySource string `description:"第三方来源;弘则固定:01" json:"thirdPartySource"`
  871. InvestorType string `description:"投资者类型 0个人1机构" json:"investorType"`
  872. PersonName string `description:"姓名" json:"personName"`
  873. CompanyName string `description:"公司名" json:"companyName"`
  874. JoinRole string `description:"1:嘉宾, 2:普通参会人员, 3:会议助理。不传默认取值2" json:"joinRole"`
  875. OutCallStatus string `description:"1:需要,0:不需要。不传取默认值0" json:"outCallStatus"`
  876. }
  877. type YiDongSignAppointmentsForThirdResp struct {
  878. ErrorCode string `json:"errorCode"` // 错误码,001:活动不存在;002:该活动不支持此渠道报名;003:该手机号或邮箱已经被其他账号提交报名;004:不在报名时间;005:报名人数已满
  879. ErrorMsg string `json:"errorMsg"` // 错误信息
  880. Success bool `json:"success"` // 成功标识,true:成功;false:失败。可作为判断报名是否成功的标识
  881. Timestamp float64 `json:"timestamp"` // 时间戳
  882. }