activity_special_trip.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488
  1. package services
  2. import (
  3. "errors"
  4. "fmt"
  5. "hongze/hongze_cygx/models"
  6. "hongze/hongze_cygx/utils"
  7. "strconv"
  8. "strings"
  9. "time"
  10. )
  11. func SpecialTripPopupMsg(activityInfo *models.CygxActivitySpecialDetail, user *models.WxUserItem) (signupStatus int, popupMsg, popupMsg2 string, err error) {
  12. //SignupStatus int `description:"返回状态:1:成功 、2 :人数已满 、3:调研次数已用完、 4:超时"`
  13. signupStatus = 1
  14. resultTime := utils.StrTimeToTime(activityInfo.ActivityTime) //时间字符串格式转时间格式
  15. if time.Now().After(resultTime.Add(-time.Minute * 60)) {
  16. signupStatus = 4
  17. popupMsg = "活动开始前1小时内无法报名,请联系对口销售处理"
  18. return
  19. }
  20. errMsg, e := CheckTripRemainingtimesBycompany(user, activityInfo)
  21. if e != nil {
  22. err = errors.New("获取客户剩余报名次数失败 GetActivitySpecialUserType, Err: " + e.Error())
  23. return
  24. }
  25. if errMsg != "" {
  26. popupMsg = errMsg
  27. signupStatus = 3
  28. return
  29. }
  30. var condition string
  31. var pars []interface{}
  32. condition += ` AND activity_id = ? AND is_cancel = 0 `
  33. pars = append(pars, activityInfo.ActivityId)
  34. tripTota, e := models.GetActivitySpecialTripCountByActivityId(condition, pars)
  35. if e != nil {
  36. err = errors.New("GetCygxActivitySpecialDetailList, Err: " + e.Error())
  37. return
  38. }
  39. if activityInfo.LimitPeopleNum-tripTota < 1 {
  40. signupStatus = 2
  41. popupMsg = "此活动报名人数已满,请留意下期活动"
  42. return
  43. }
  44. //signupStatus = 4
  45. popupMsg = "感谢参与,本次报名会扣除一次贵司在弘则的调研点数。"
  46. popupMsg2 = "由于每场活动人数有限,如果不能参加请提前48小时取消,未及时取消导致影响其他客户报名将会维持扣点。"
  47. return
  48. }
  49. // 获取用户剩余报名次数
  50. //func GetTripRemainingtimesBycompany(user *models.WxUserItem, activityInfo *models.CygxActivitySpecialDetail) (errMsg string, tripRemaining int, err error) {
  51. //
  52. // //获取 专项调研客户类型 //1、永续客户 //2、大套餐客户(4个行业全开通的正式客户) //3、分行业套餐客户(开通对应行业的正式客户) //4、仅开通专家套餐的正式客户 //5、开通对应行业套餐或专家套餐的试用客户;6、冻结客户;7、流失客户 8:行业升级套餐客户
  53. // msgTemplate := "您的专项调研次数已用完,如仍想参加,请与您的对口销售商议"
  54. // //var tripTota int
  55. // //var airborneTota int
  56. // //userType, _, e := GetActivitySpecialUserType(user.CompanyId)
  57. // userType, _, e := GetUserType(user.CompanyId)
  58. // if e != nil {
  59. // err = errors.New("获取客户身份信息失败 GetActivitySpecialUserType, Err: " + e.Error())
  60. // return
  61. // }
  62. // if userType == 0 {
  63. // errMsg = msgTemplate
  64. // return
  65. // } else if userType == 1 {
  66. // tripRemaining = 999
  67. // return
  68. // } else if userType == 2 {
  69. // var condition string
  70. // var pars []interface{}
  71. //
  72. // condition += ` AND company_id = ? `
  73. // pars = append(pars, user.CompanyId)
  74. //
  75. // //airborneTota, e = models.GetActivitySpecialTripAirborneCountByActivitySpecial(condition, pars)
  76. // //if e != nil {
  77. // // err = errors.New("GetActivitySpecialTripAirborneCountByActivitySpecial, Err: " + e.Error())
  78. // // return
  79. // //}
  80. // //condition += ` AND is_valid = 1 `
  81. // //查询当年的数据
  82. // condition += ` AND create_time >= ? `
  83. // pars = append(pars, time.Now().Format(utils.FormatYearDate)+"-01-01")
  84. // listTripBill, e := models.GetCygxActivitySpecialTripBill(condition, pars)
  85. // if e != nil {
  86. // err = errors.New("GetActivitySpecialTripCountByActivitySpecial, Err: " + e.Error())
  87. // return
  88. // }
  89. // var TripBillNum int
  90. // for _, v := range listTripBill {
  91. // TripBillNum += v.BillDetailed
  92. // }
  93. // var packageType int
  94. // //大套餐客户,数据库添加标识,
  95. // companyUserTypeDetail, errs := models.GetCygxCompanyUserType(user.CompanyId)
  96. // if errs != nil && errs.Error() != utils.ErrNoRow() {
  97. // err = errs
  98. // return
  99. // }
  100. // if companyUserTypeDetail != nil {
  101. // packageType = companyUserTypeDetail.PackageType
  102. // if companyUserTypeDetail.CustomerTypeId != 0 {
  103. // userType = companyUserTypeDetail.CustomerTypeId
  104. // return
  105. // }
  106. // }
  107. //
  108. // packageTypeMap := map[int]int{1: 16, 2: 10}
  109. // totalTrip := packageTypeMap[packageType]
  110. // //tripRemaining = 10 - airborneTota + TripBillNum
  111. // tripRemaining = totalTrip + TripBillNum
  112. // if tripRemaining <= 0 {
  113. // errMsg = msgTemplate
  114. // return
  115. // }
  116. // //tripRemaining = 12 - tripTota
  117. // } else {
  118. // var condition string
  119. // var pars []interface{}
  120. //
  121. // condition += ` AND company_id = ? `
  122. // pars = append(pars, user.CompanyId)
  123. //
  124. // condition += ` AND chart_permission_id = ? `
  125. // pars = append(pars, activityInfo.ChartPermissionId)
  126. //
  127. // //airborneTota, e = models.GetActivitySpecialTripAirborneCountByActivitySpecial(condition, pars)
  128. // //if e != nil {
  129. // // err = errors.New("GetActivitySpecialTripAirborneCountByActivitySpecial, Err: " + e.Error())
  130. // // return
  131. // //}
  132. // //查询当年的数据
  133. // condition += ` AND create_time >= ? `
  134. // pars = append(pars, time.Now().Format(utils.FormatYearDate)+"-01-01")
  135. // listTripBill, e := models.GetCygxActivitySpecialTripBill(condition, pars)
  136. // if e != nil {
  137. // err = errors.New("GetActivitySpecialTripCountByActivitySpecial, Err: " + e.Error())
  138. // return
  139. // }
  140. // var TripBillNum int
  141. // for _, v := range listTripBill {
  142. // TripBillNum += v.BillDetailed
  143. // }
  144. // //tripRemaining = 5 - airborneTota + TripBillNum
  145. // tripRemaining = 5 + TripBillNum
  146. // if tripRemaining <= 0 {
  147. // errMsg = msgTemplate
  148. // return
  149. // }
  150. // }
  151. // return
  152. //}
  153. // 校验是否还有剩余次数
  154. func CheckTripRemainingtimesBycompany(user *models.WxUserItem, activityInfo *models.CygxActivitySpecialDetail) (errMsg string, err error) {
  155. msgTemplate := "您的专项调研次数已用完,如仍想参加,请与您的对口销售商议"
  156. companyId := user.CompanyId
  157. chartPermissionName := activityInfo.ChartPermissionName
  158. companyDetail, e := models.GetCompanyDetailByIdGroup(companyId)
  159. if e != nil {
  160. err = errors.New("GetCompanyDetailByIdGroup, Err:" + e.Error())
  161. return
  162. }
  163. //永续客户不限制次数
  164. if companyDetail.Status == utils.COMPANY_STATUS_FOREVER {
  165. return
  166. }
  167. var condition string
  168. var pars []interface{}
  169. condition = " AND company_id = ? AND points > 0 ORDER BY chart_permission_id DESC "
  170. pars = append(pars, companyId)
  171. activitySpecialPermissionPointsList, e := models.GetCygxActivitySpecialPermissionPointsList(condition, pars)
  172. if e != nil && e.Error() != utils.ErrNoRow() {
  173. err = errors.New("GetCygxActivitySpecialPermissionPointsList, Err:" + e.Error())
  174. return
  175. }
  176. //如果没有剩余的点数,就返回
  177. if len(activitySpecialPermissionPointsList) == 0 {
  178. errMsg = msgTemplate
  179. return
  180. }
  181. //判断是不是策略行业的活动,策略的任何一个行业有剩余点数都能参加
  182. if chartPermissionName == utils.CE_LUE_NAME {
  183. return
  184. } else {
  185. for _, v := range activitySpecialPermissionPointsList {
  186. if v.ChartPermissionName == chartPermissionName || v.ChartPermissionId == 0 {
  187. return
  188. } // 如果对应行业有剩余次数,或者是属于大套餐且有次数,那么校验也通过
  189. }
  190. }
  191. errMsg = msgTemplate
  192. return
  193. }
  194. // GetSpecialBillMaxChartPermissionId 获取专项调研剩余点数最多的行业
  195. func GetSpecialBillMaxChartPermissionId(user *models.WxUserItem) (maxChartPermissionId int, maxChartPermissionName string, err error) {
  196. companyId := user.CompanyId
  197. var condition string
  198. var pars []interface{}
  199. condition = " AND company_id = ? AND points > 0 ORDER BY points DESC LIMIT 1 "
  200. pars = append(pars, companyId)
  201. activitySpecialPermissionPointsList, e := models.GetCygxActivitySpecialPermissionPointsList(condition, pars)
  202. if e != nil && e.Error() != utils.ErrNoRow() {
  203. err = errors.New("GetCygxActivitySpecialPermissionPointsList, Err:" + e.Error())
  204. return
  205. }
  206. for _, v := range activitySpecialPermissionPointsList {
  207. maxChartPermissionId = v.ChartPermissionId
  208. maxChartPermissionName = v.ChartPermissionName
  209. }
  210. return
  211. }
  212. // DeductTripRemainingtimesByUser 扣除用户专项调研剩余次数
  213. func DeductTripRemainingtimesByUser(user *models.WxUserItem, activityInfo *models.CygxActivitySpecialDetail) (err error) {
  214. msgTemplate := "您的专项调研次数已用完,如仍想参加,请与您的对口销售商议"
  215. companyId := user.CompanyId
  216. chartPermissionName := activityInfo.ChartPermissionName
  217. var condition string
  218. var pars []interface{}
  219. condition = " AND company_id = ? AND points > 0 ORDER BY points DESC LIMIT 1 "
  220. pars = append(pars, companyId)
  221. //判断是不是策略行业的活动,如果不是策略就获取对应行业的点数 ,策略的任何一个行业有剩余点数都能参加
  222. if chartPermissionName != utils.CE_LUE_NAME {
  223. pars = make([]interface{}, 0)
  224. condition = " AND company_id = ? AND chart_permission_id = ? AND points > 0 ORDER BY points DESC LIMIT 1 "
  225. pars = append(pars, companyId, activityInfo.ChartPermissionId)
  226. }
  227. activitySpecialPermissionPointsList, e := models.GetCygxActivitySpecialPermissionPointsList(condition, pars)
  228. if e != nil && e.Error() != utils.ErrNoRow() {
  229. err = errors.New("GetCygxActivitySpecialPermissionPointsList, Err:" + e.Error())
  230. return
  231. }
  232. //如果没有剩余的点数,就返回
  233. if len(activitySpecialPermissionPointsList) == 0 {
  234. err = errors.New(msgTemplate)
  235. return
  236. }
  237. var maxChartPermissionId int // 剩余点数最多的行业
  238. var points int // 剩余点数
  239. for _, v := range activitySpecialPermissionPointsList {
  240. maxChartPermissionId = v.ChartPermissionId
  241. points = v.Points - 1
  242. }
  243. //更新对应行业剩余点数
  244. e = models.UpdateCygxActivitySpecialPermissionPoints(points, companyId, maxChartPermissionId)
  245. if e != nil {
  246. err = errors.New("UpdateCygxActivitySpecialPermissionPoints, Err:" + e.Error())
  247. return
  248. }
  249. return
  250. }
  251. // RebateTripRemainingtimesByUser 返点用户专项调研剩余次数
  252. func RebateTripRemainingtimesByUser(user *models.WxUserItem, activityInfo *models.CygxActivitySpecialDetail) (err error) {
  253. companyId := user.CompanyId
  254. chartPermissionName := activityInfo.ChartPermissionName
  255. var condition string
  256. var pars []interface{}
  257. condition = " AND company_id = ? ORDER BY points DESC LIMIT 1 "
  258. pars = append(pars, companyId)
  259. //判断是不是策略行业的活动,如果不是策略就获取对应行业的点数 ,策略的任何一个行业有剩余点数都能参加
  260. if chartPermissionName != utils.CE_LUE_NAME {
  261. pars = make([]interface{}, 0)
  262. condition = " AND company_id = ? AND chart_permission_id = ? LIMIT 1 "
  263. pars = append(pars, companyId, activityInfo.ChartPermissionId)
  264. } else {
  265. lastTripBill, e := models.GetCygxActivitySpecialTripBillLastDetialByActivityId(activityInfo.ActivityId, user.UserId)
  266. if e != nil {
  267. err = errors.New("GetActivitySpecialTripCountByActivitySpecial, Err: " + e.Error())
  268. return
  269. }
  270. pars = make([]interface{}, 0)
  271. condition = " AND company_id = ? AND chart_permission_id = ? LIMIT 1 "
  272. pars = append(pars, companyId, lastTripBill.ChartPermissionId)
  273. }
  274. activitySpecialPermissionPointsList, e := models.GetCygxActivitySpecialPermissionPointsList(condition, pars)
  275. if e != nil && e.Error() != utils.ErrNoRow() {
  276. err = errors.New("GetCygxActivitySpecialPermissionPointsList, Err:" + e.Error())
  277. return
  278. }
  279. var maxChartPermissionId int // 剩余点数最多的行业(返点行业)
  280. var points int // 剩余点数
  281. for _, v := range activitySpecialPermissionPointsList {
  282. maxChartPermissionId = v.ChartPermissionId
  283. points = v.Points + 1
  284. }
  285. //更新对应行业剩余点数
  286. e = models.UpdateCygxActivitySpecialPermissionPoints(points, companyId, maxChartPermissionId)
  287. if e != nil {
  288. err = errors.New("UpdateCygxActivitySpecialPermissionPoints, Err:" + e.Error())
  289. return
  290. }
  291. return
  292. }
  293. // 预处理专项调研流水明细表描述内容
  294. func HandleActivitySpecialTripBillTotalText(user *models.WxUserItem) (totalText string, err error) {
  295. companyId := user.CompanyId
  296. companyDetail, e := models.GetCompanyDetailByIdGroup(companyId)
  297. if e != nil {
  298. err = errors.New("GetCompanyDetailByIdGroup, Err:" + e.Error())
  299. return
  300. }
  301. //永续客户不限制次数
  302. if companyDetail.Status == utils.COMPANY_STATUS_FOREVER {
  303. totalText = "0次"
  304. return
  305. }
  306. var condition string
  307. var pars []interface{}
  308. pars = make([]interface{}, 0)
  309. condition = " AND company_id = ? AND points != 0 ORDER BY chart_permission_id DESC "
  310. pars = append(pars, companyId)
  311. activitySpecialPermissionPointsList, e := models.GetCygxActivitySpecialPermissionPointsList(condition, pars)
  312. if e != nil && e.Error() != utils.ErrNoRow() {
  313. err = errors.New("GetCygxActivitySpecialPermissionPointsList, Err:" + e.Error())
  314. return
  315. }
  316. var itemBillTotal []string
  317. for _, v := range activitySpecialPermissionPointsList {
  318. if v.ChartPermissionId > 0 {
  319. itemBillTotal = append(itemBillTotal, fmt.Sprint(v.ChartPermissionName, v.Points, "次")) // 行业套餐客户展示规则
  320. }
  321. if v.ChartPermissionId == 0 {
  322. totalText = fmt.Sprint(v.Points, "次") // 大套餐客户展示规则
  323. }
  324. }
  325. if len(itemBillTotal) > 0 {
  326. totalText = strings.Join(itemBillTotal, "+")
  327. }
  328. return
  329. }
  330. // 用户搜专项调研操作操作行为,模板消息推送
  331. func ActivitySpecialUserRmind(user *models.WxUserItem, activityId, TripStatus int) (err error) {
  332. defer func() {
  333. if err != nil {
  334. go utils.SendAlarmMsg("用户搜专项调研操作操作行为,模板消息推送失败"+err.Error(), 2)
  335. }
  336. }()
  337. countUser, err := models.GetUserRemind(user.UserId)
  338. if err != nil {
  339. return err
  340. }
  341. if countUser == 0 {
  342. return err
  343. }
  344. var first string
  345. var keyword1 string
  346. var keyword2 string
  347. var keyword3 string
  348. var keyword4 string
  349. var remark string
  350. //获取销售手机号
  351. sellerItemQy, err := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 2)
  352. if err != nil && err.Error() != utils.ErrNoRow() {
  353. return err
  354. }
  355. if sellerItemQy != nil {
  356. openIdList, e := models.GetWxOpenIdByMobileList(sellerItemQy.Mobile)
  357. if e != nil {
  358. err = errors.New("GetSellerByAdminId, Err: " + e.Error())
  359. return
  360. }
  361. activityInfo, e := models.GetCygxActivitySpecialDetailById(user.UserId, activityId)
  362. if e != nil {
  363. err = errors.New("GetCygxActivitySpecialDetailById, Err: " + e.Error())
  364. return
  365. }
  366. if activityInfo == nil {
  367. return
  368. }
  369. //TripStatus int `description:"行程进行状态 1:预报名,2:确定行程"`
  370. if TripStatus == 1 {
  371. keyword2 = fmt.Sprint("互动:专项调研预报名,", user.RealName, "--", user.CompanyName)
  372. } else {
  373. keyword2 = fmt.Sprint("互动:活动报名,", user.RealName, "--", user.CompanyName)
  374. }
  375. keyword1 = activityInfo.ResearchTheme
  376. //keyword2 = "__"
  377. remark = "点击查看活动详情"
  378. openIdArr := make([]string, 0)
  379. for _, v := range openIdList {
  380. openIdArr = append(openIdArr, v.OpenId)
  381. }
  382. redirectUrl := utils.WX_MSG_PATH_ACTIVITY_SPECIAL_DETAIL + strconv.Itoa(activityId)
  383. sendInfo := new(SendWxTemplate)
  384. sendInfo.First = first
  385. sendInfo.Keyword1 = keyword1
  386. sendInfo.Keyword2 = keyword2
  387. sendInfo.Keyword3 = keyword3
  388. sendInfo.Keyword4 = keyword4
  389. sendInfo.Remark = remark
  390. sendInfo.TemplateId = utils.WxMsgTemplateIdArticleUserRemind
  391. sendInfo.RedirectUrl = redirectUrl
  392. sendInfo.RedirectTarget = 3
  393. sendInfo.Resource = strconv.Itoa(activityId)
  394. sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD
  395. sendInfo.OpenIdArr = openIdArr
  396. err = PublicSendTemplateMsg(sendInfo)
  397. if err != nil {
  398. return
  399. }
  400. }
  401. return
  402. }
  403. // 确定行程用户报名模版消息推送
  404. func ActivitySpecialUserAddTrip(user *models.WxUserItem, activityId int) (err error) {
  405. defer func() {
  406. if err != nil {
  407. go utils.SendAlarmMsg("确定行程用户报名模版消息推送,模板消息推送失败"+err.Error(), 2)
  408. }
  409. }()
  410. var first string
  411. var keyword1 string
  412. var keyword2 string
  413. var keyword3 string
  414. var keyword4 string
  415. var remark string
  416. //获取销售手机号
  417. sellerItemQy, err := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 2)
  418. if err != nil && err.Error() != utils.ErrNoRow() {
  419. return err
  420. }
  421. cnf, _ := models.GetConfigByCode("tpl_msg")
  422. if cnf != nil && sellerItemQy != nil {
  423. openIdList, e := models.GetWxOpenIdByMobileList(cnf.ConfigValue + "," + sellerItemQy.Mobile)
  424. if e != nil {
  425. err = errors.New("GetSellerByAdminId, Err: " + e.Error())
  426. return
  427. }
  428. activityInfo, e := models.GetCygxActivitySpecialDetailById(user.UserId, activityId)
  429. if e != nil {
  430. err = errors.New("GetCygxActivitySpecialDetailById, Err: " + e.Error())
  431. return
  432. }
  433. if activityInfo == nil {
  434. return
  435. }
  436. keyword1 = fmt.Sprint(user.RealName, "--", user.CompanyName, "(所属销售:", sellerItemQy.RealName, ")")
  437. keyword2 = user.Mobile
  438. keyword3 = time.Now().Format(utils.FormatDateTime)
  439. keyword4 = "报名专项调研【" + activityInfo.ResearchTheme + "】 "
  440. remark = ""
  441. openIdArr := make([]string, 0)
  442. for _, v := range openIdList {
  443. openIdArr = append(openIdArr, v.OpenId)
  444. }
  445. redirectUrl := utils.WX_MSG_PATH_ACTIVITY_SPECIAL_DETAIL + strconv.Itoa(activityId)
  446. sendInfo := new(SendWxTemplate)
  447. sendInfo.First = first
  448. sendInfo.Keyword1 = keyword1
  449. sendInfo.Keyword2 = keyword2
  450. sendInfo.Keyword3 = keyword3
  451. sendInfo.Keyword4 = keyword4
  452. sendInfo.Remark = remark
  453. sendInfo.TemplateId = utils.WxMsgTemplateIdApplyXzs
  454. sendInfo.RedirectUrl = redirectUrl
  455. sendInfo.RedirectTarget = 3
  456. sendInfo.Resource = strconv.Itoa(activityId)
  457. sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD
  458. sendInfo.OpenIdArr = openIdArr
  459. err = PublicSendTemplateMsg(sendInfo)
  460. if err != nil {
  461. return
  462. }
  463. }
  464. return
  465. }