company_product.go 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683
  1. package services
  2. import (
  3. "context"
  4. "fmt"
  5. "hongze/hongze_task/models"
  6. "hongze/hongze_task/services/cygx"
  7. "hongze/hongze_task/utils"
  8. "strconv"
  9. "strings"
  10. "time"
  11. )
  12. // 客户自动冻结->试用两个月结束后,进入冻结
  13. func CompanyFreeze(cont context.Context) (err error) {
  14. defer func() {
  15. if err != nil {
  16. go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "试用两个月结束后,进入冻结 ErrMsg:"+err.Error(), utils.EmailSendToUsers)
  17. }
  18. }()
  19. endDate := time.Now().AddDate(0, 0, -1).Format(utils.FormatDate)
  20. items, err := models.GetCompanyNeedFreeze(endDate)
  21. if err != nil {
  22. fmt.Println("GetCompanyNeedFreeze Err:" + err.Error())
  23. utils.FileLog.Info("GetCompanyNeedFreeze Err:%s" + err.Error())
  24. return
  25. }
  26. for k, v := range items {
  27. fmt.Println(k, v.CompanyId)
  28. count, err := models.GetCompanyApprovalCount(v.CompanyId, v.ProductId)
  29. if err != nil {
  30. return err
  31. }
  32. if count > 0 {
  33. continue
  34. }
  35. //试用转冻结
  36. companyReportPermissionList, err := models.CompanyFreeze(v.CompanyId, v.ProductId)
  37. if err != nil {
  38. utils.FileLog.Info("CompanyFreeze Err:%s" + err.Error())
  39. return err
  40. }
  41. //新增操作记录
  42. {
  43. remark := "试用转冻结"
  44. operation := "freeze"
  45. approveContent := ""
  46. go AddCompanyOperationRecord(v.CompanyId, utils.AdminId, v.ProductId, utils.AdminId, v.CompanyName,
  47. v.ProductName, utils.RealName, remark, operation, approveContent, approveContent, "", v.Status)
  48. //新增 客户产品权限 试用 转 冻结 的日志
  49. for _, v := range companyReportPermissionList {
  50. _ = AddCompanyReportPermissionLog(v.CompanyReportPermissionId, v.CompanyId, v.ProductId, utils.AdminId, v.ProductName, utils.RealName, remark, operation, v.Status)
  51. }
  52. }
  53. }
  54. return
  55. }
  56. // 客户自动流失->冻结超3个月未处理
  57. func CompanyLoss(cont context.Context) (err error) {
  58. defer func() {
  59. if err != nil {
  60. go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "自动流失->冻结超3个月未处理 ErrMsg:"+err.Error(), utils.EmailSendToUsers)
  61. }
  62. }()
  63. endDate := time.Now().AddDate(0, 0, -1).Format(utils.FormatDate)
  64. items, err := models.GetCompanyNeedLoss(endDate)
  65. if err != nil {
  66. fmt.Println("GetCompanyNeedLoss Err:" + err.Error())
  67. utils.FileLog.Info("GetCompanyNeedLoss Err:%s" + err.Error())
  68. return
  69. }
  70. for k, v := range items {
  71. fmt.Println(k, v.CompanyId)
  72. count, err := models.GetCompanyApprovalCount(v.CompanyId, v.ProductId)
  73. if err != nil {
  74. return err
  75. }
  76. if count > 0 {
  77. continue
  78. }
  79. err = models.CompanyLoss(v.CompanyId, v.ProductId)
  80. if err != nil {
  81. utils.FileLog.Info("CompanyLoss Err:%s" + err.Error())
  82. return err
  83. }
  84. //新增操作记录
  85. {
  86. remark := "冻结转流失"
  87. operation := "loss"
  88. approveContent := "流失"
  89. AddCompanyOperationRecord(v.CompanyId, utils.AdminId, v.ProductId, utils.AdminId, v.CompanyName,
  90. v.ProductName, utils.RealName, remark, operation, approveContent, approveContent, "", v.Status)
  91. }
  92. }
  93. return
  94. }
  95. // 正式客户自动试用->合同到期未续约转试用
  96. func CompanyTryOut(cont context.Context) (err error) {
  97. defer func() {
  98. if err != nil {
  99. go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "正式客户自动试用->合同到期未续约转试用 ErrMsg:"+err.Error(), utils.EmailSendToUsers)
  100. }
  101. }()
  102. endDate := time.Now().AddDate(0, 0, -1).Format(utils.FormatDate)
  103. items, err := models.GetCompanyNeedTryOut(endDate)
  104. if err != nil {
  105. fmt.Println("GetCompanyNeedTryOut Err:" + err.Error())
  106. utils.FileLog.Info("GetCompanyNeedTryOut Err:%s" + err.Error())
  107. return
  108. }
  109. for k, v := range items {
  110. count, err := models.GetCompanyApprovalCount(v.CompanyId, v.ProductId)
  111. if err != nil {
  112. return err
  113. }
  114. if count > 0 {
  115. continue
  116. }
  117. fmt.Println(k, v.CompanyId)
  118. //客户正式转试用
  119. companyReportPermissionList, err := models.CompanyTryOut(v.CompanyId, v.ProductId)
  120. if err != nil {
  121. utils.FileLog.Info("CompanyLoss Err:%s" + err.Error())
  122. return err
  123. }
  124. //新增操作记录
  125. {
  126. remark := "正式转试用"
  127. operation := "try_out"
  128. approveContent := "试用"
  129. AddCompanyOperationRecord(v.CompanyId, utils.AdminId, v.ProductId, utils.AdminId, v.CompanyName,
  130. v.ProductName, utils.RealName, remark, operation, approveContent, approveContent, "", v.Status)
  131. //新增 客户产品权限 正式 转 试用 的日志
  132. for _, v := range companyReportPermissionList {
  133. _ = AddCompanyReportPermissionLog(v.CompanyReportPermissionId, v.CompanyId, v.ProductId, utils.AdminId, v.ProductName, utils.RealName, remark, operation, v.Status)
  134. }
  135. }
  136. //正式专试用定时任务更新研选扣点
  137. {
  138. cygx.YanXuanCompanyCompanyTryOut(v.CompanyId)
  139. }
  140. }
  141. return
  142. }
  143. func AddCompanyOperationRecord(companyId, sysUserId, productId, approveAdminId int, companyName, productName, sysUserRealName, remark, operation, approveContent, approveUserRealName, approveRemark, status string) (err error) {
  144. defer func() {
  145. if err != nil {
  146. go utils.SendEmail(utils.APPNAME+"失败提醒"+utils.RunMode, "services:AddCompanyOperationRecord;Err"+err.Error(), utils.EmailSendToUsers)
  147. }
  148. }()
  149. record := new(models.CompanyOperationRecord)
  150. record.CompanyId = companyId
  151. record.CompanyName = companyName
  152. record.SysUserId = sysUserId
  153. record.SysRealName = sysUserRealName
  154. record.Remark = remark
  155. record.Operation = operation
  156. record.CreateTime = time.Now()
  157. record.ProductId = productId
  158. record.ProductName = productName
  159. record.ApproveUserId = approveAdminId
  160. record.ApproveRealName = approveUserRealName
  161. record.ApproveContent = approveContent
  162. record.ApproveRemark = approveRemark
  163. record.Status = status
  164. _, err = models.AddCompanyOperationRecord(record)
  165. return
  166. }
  167. // 客户老数据同步
  168. func CompanyOldDataSync() {
  169. companyItems, err := models.GetCompanyOldDataSync()
  170. if err != nil {
  171. fmt.Println("GetCompanyOldDataSync Err:" + err.Error())
  172. return
  173. }
  174. productId := 1
  175. productName := "ficc"
  176. for k, v := range companyItems {
  177. fmt.Println(k, v.CompanyName, v.CompanyId)
  178. productItem := new(models.CompanyProduct)
  179. productItem.CompanyId = v.CompanyId
  180. productItem.ProductId = productId
  181. productItem.ProductName = productName
  182. productItem.CompanyName = v.CompanyName
  183. //客户标签,1:付费客户,2:试用客户,3:流失客户,4:潜在客户,5:永续
  184. //'试用','永续','冻结','流失','正式','潜在'
  185. status := ""
  186. if v.CompanyType == 1 {
  187. status = "正式"
  188. } else if v.CompanyType == 2 {
  189. status = "试用"
  190. } else if v.CompanyType == 3 {
  191. status = "流失"
  192. } else if v.CompanyType == 4 {
  193. status = "潜在"
  194. } else if v.CompanyType == 5 {
  195. status = "永续"
  196. } else {
  197. fmt.Println("无效的客户状态:"+status, v.CompanyType)
  198. return
  199. }
  200. if status == "" {
  201. fmt.Println("无效的客户状态:"+status, v.CompanyType)
  202. return
  203. }
  204. productItem.Status = status
  205. //获取销售
  206. seller, err := models.GetAdminByAdminId(v.SellsId)
  207. if err != nil && err.Error() != utils.ErrNoRow() {
  208. fmt.Println("获取销售失败,Err:"+err.Error(), v.SellsId)
  209. return
  210. }
  211. var adminId, groupId, departmentId int
  212. var sellerRealName string
  213. if seller == nil {
  214. fmt.Println("销售不存在:", v.SellsId)
  215. //return
  216. } else {
  217. adminId = seller.AdminId
  218. sellerRealName = seller.RealName
  219. groupId = seller.GroupId
  220. departmentId = seller.DepartmentId
  221. }
  222. productItem.SellerId = adminId
  223. productItem.SellerName = sellerRealName
  224. productItem.GroupId = groupId
  225. productItem.DepartmentId = departmentId
  226. productItem.CreateTime = time.Now()
  227. productItem.ModifyTime = time.Now()
  228. productItem.StartDate = v.StartDate
  229. productItem.EndDate = v.EndDate
  230. productItem.LoseReason = v.LoseReason
  231. productItem.LossTime = v.LossTime
  232. _, err = models.AddCompanyProduct(productItem)
  233. if err != nil {
  234. fmt.Println("新增客户产品失败,Err:" + err.Error())
  235. return
  236. }
  237. //权限处理
  238. err = models.ModifyCompanyOldPermission(v.StartDate, v.EndDate, productName, v.CompanyId, productId)
  239. if err != nil {
  240. fmt.Println("客户权限处理失败,Err:" + err.Error())
  241. return
  242. }
  243. if k > 500 {
  244. return
  245. }
  246. }
  247. }
  248. // CompanyRemind 正式/试用客户--到期提醒
  249. func CompanyRemind(cont context.Context) (err error) {
  250. defer func() {
  251. if err != nil {
  252. go utils.SendEmail(utils.APPNAME+"失败提醒"+utils.RunMode, "到期提醒失败:CompanyRemind;Err"+err.Error(), utils.EmailSendToUsers)
  253. }
  254. }()
  255. //获取销售
  256. sellers, err := models.GetSellersOpenId()
  257. for k, v := range sellers {
  258. fmt.Println(k, v.AdminId, v.Mobile)
  259. CompanyRemind30Day(v)
  260. time.Sleep(5 * time.Second)
  261. CompanyRemind15Day(v)
  262. time.Sleep(5 * time.Second)
  263. CompanyRemind7Day(v)
  264. time.Sleep(5 * time.Second)
  265. CompanyRemind1Day(v)
  266. time.Sleep(5 * time.Second)
  267. }
  268. return
  269. }
  270. // CompanyRemind30Day 30天后到期客户
  271. func CompanyRemind30Day(seller *models.Sellers) {
  272. var err error
  273. defer func() {
  274. if err != nil {
  275. go utils.SendEmail(utils.APPNAME+"失败提醒"+utils.RunMode, "到期提醒失败:CompanyRemind;Err"+err.Error(), utils.EmailSendToUsers)
  276. }
  277. }()
  278. companyRemindRecordList := make([]*models.CompanyRemindRecord, 0)
  279. remindType := 4
  280. uniqueCode := fmt.Sprint(seller.AdminId, time.Now().Format(utils.FormatDateUnSpace), remindType, utils.GetRandString(5))
  281. //remindEndDate := "2020-12-31" //time.Now().AddDate(0, 0, 30).Format(utils.FormatDate)
  282. remindEndDate := time.Now().AddDate(0, 0, 30).Format(utils.FormatDate)
  283. companyItems, err := models.GetRemindCompany(seller.AdminId, remindEndDate)
  284. if err != nil {
  285. return
  286. }
  287. emailContents := "<div><p>您有【" + strconv.Itoa(len(companyItems)) + "】 客户将于30天后到期,请注意查看</p>"
  288. emailContents += "<table border='1'><tr><td width='200'>30天后到期客户名称</td><td width='200'>到期日期</td><td width='200'>销售人员</td><td>客户类型</td></tr>"
  289. var isSend bool
  290. msgContent := ``
  291. for _, v := range companyItems {
  292. endTime := v.EndDate
  293. if v.Status == "正式" {
  294. endTime = v.ContractEndDate
  295. }
  296. emailContents += `<tr><td>` + v.CompanyName + `</td><td>` + endTime + `</td><td>` + seller.RealName + `</td><td>` + v.Status + `</td></tr>`
  297. msgContent += `客户:` + v.CompanyName + ";状态:" + v.Status + "\n"
  298. isSend = true
  299. // 数据入库
  300. companyRemindRecordList = append(companyRemindRecordList, &models.CompanyRemindRecord{
  301. //CompanyRemindRecordId: 0,
  302. Type: remindType,
  303. SellerId: seller.AdminId,
  304. SellerName: seller.RealName,
  305. CompanyId: v.CompanyId,
  306. CompanyName: v.CompanyName,
  307. Status: v.Status,
  308. EndDate: endTime,
  309. UniqueCode: uniqueCode,
  310. CreateTime: time.Now(),
  311. })
  312. }
  313. emailContents += "</table></br>"
  314. if isSend {
  315. if seller.Email != "" {
  316. utils.SendEmailByHongze("到期前30天提醒", emailContents, seller.Email, "", "")
  317. }
  318. if seller.OpenId != "" {
  319. first := "您有【" + strconv.Itoa(len(companyItems)) + "】 客户将于30天后到期,请注意查看"
  320. //keyword1 := "到期前30天提醒"
  321. keyword1 := fmt.Sprintf(`【%d】客户到期前30天提醒,点击查看`, len(companyItems))
  322. keyword2 := remindEndDate
  323. remark := msgContent
  324. openIdList := make([]*models.OpenIdList, 0)
  325. openIdItem := new(models.OpenIdList)
  326. openIdItem.OpenId = seller.OpenId
  327. openIdList = append(openIdList, openIdItem)
  328. SendWxMsgWithCompanyRemind(first, keyword1, keyword2, remark, uniqueCode, openIdList)
  329. }
  330. }
  331. // 数据入库
  332. if len(companyRemindRecordList) > 0 {
  333. models.AddMultiCompanyRemindRecord(companyRemindRecordList)
  334. }
  335. }
  336. // CompanyRemind15Day 15天后到期客户
  337. func CompanyRemind15Day(seller *models.Sellers) {
  338. var err error
  339. defer func() {
  340. if err != nil {
  341. go utils.SendEmail(utils.APPNAME+"失败提醒"+utils.RunMode, "到期提醒失败:CompanyRemind;Err"+err.Error(), utils.EmailSendToUsers)
  342. }
  343. }()
  344. companyRemindRecordList := make([]*models.CompanyRemindRecord, 0)
  345. remindType := 3
  346. uniqueCode := fmt.Sprint(seller.AdminId, time.Now().Format(utils.FormatDateUnSpace), remindType, utils.GetRandString(5))
  347. remindEndDate := time.Now().AddDate(0, 0, 15).Format(utils.FormatDate)
  348. companyItems, err := models.GetRemindCompany(seller.AdminId, remindEndDate)
  349. if err != nil {
  350. return
  351. }
  352. var isSend bool
  353. msgContent := ``
  354. emailContents := "<div><p>您有【" + strconv.Itoa(len(companyItems)) + "】 客户将于15天后到期,请注意查看</p>"
  355. emailContents += "<table border='1'><tr><td width='200'>15天后到期客户名称</td><td width='200'>到期日期</td><td width='200'>销售人员</td><td>客户类型</td></tr>"
  356. for _, v := range companyItems {
  357. endTime := v.EndDate
  358. if v.Status == "正式" {
  359. endTime = v.ContractEndDate
  360. }
  361. emailContents += `<tr><td>` + v.CompanyName + `</td><td>` + endTime + `</td><td>` + seller.RealName + `</td><td>` + v.Status + `</td></tr>`
  362. msgContent += `客户:` + v.CompanyName + ";状态:" + v.Status + "\n"
  363. isSend = true
  364. // 数据入库
  365. companyRemindRecordList = append(companyRemindRecordList, &models.CompanyRemindRecord{
  366. //CompanyRemindRecordId: 0,
  367. Type: remindType,
  368. SellerId: seller.AdminId,
  369. SellerName: seller.RealName,
  370. CompanyId: v.CompanyId,
  371. CompanyName: v.CompanyName,
  372. Status: v.Status,
  373. EndDate: endTime,
  374. UniqueCode: uniqueCode,
  375. CreateTime: time.Now(),
  376. })
  377. }
  378. emailContents += "</table></br>"
  379. if isSend {
  380. if seller.Email != "" {
  381. utils.SendEmailByHongze("到期前15天提醒", emailContents, seller.Email, "", "")
  382. }
  383. if seller.OpenId != "" {
  384. first := "您有【" + strconv.Itoa(len(companyItems)) + "】 客户将于15天后到期,请注意查看"
  385. //keyword1 := "到期前15天提醒"
  386. keyword1 := fmt.Sprintf(`【%d】客户到期前15天提醒,点击查看`, len(companyItems))
  387. keyword2 := remindEndDate
  388. remark := msgContent
  389. openIdList := make([]*models.OpenIdList, 0)
  390. openIdItem := new(models.OpenIdList)
  391. openIdItem.OpenId = seller.OpenId
  392. openIdList = append(openIdList, openIdItem)
  393. SendWxMsgWithCompanyRemind(first, keyword1, keyword2, remark, uniqueCode, openIdList)
  394. }
  395. }
  396. // 数据入库
  397. if len(companyRemindRecordList) > 0 {
  398. models.AddMultiCompanyRemindRecord(companyRemindRecordList)
  399. }
  400. }
  401. // CompanyRemind7Day 7天后到期客户名称
  402. func CompanyRemind7Day(seller *models.Sellers) {
  403. var err error
  404. defer func() {
  405. if err != nil {
  406. go utils.SendEmail(utils.APPNAME+"失败提醒"+utils.RunMode, "到期提醒失败:CompanyRemind;Err"+err.Error(), utils.EmailSendToUsers)
  407. }
  408. }()
  409. companyRemindRecordList := make([]*models.CompanyRemindRecord, 0)
  410. remindType := 2
  411. uniqueCode := fmt.Sprint(seller.AdminId, time.Now().Format(utils.FormatDateUnSpace), remindType, utils.GetRandString(5))
  412. remindEndDate := time.Now().AddDate(0, 0, 7).Format(utils.FormatDate)
  413. companyItems, err := models.GetRemindCompany(seller.AdminId, remindEndDate)
  414. if err != nil {
  415. return
  416. }
  417. var isSend bool
  418. msgContent := ``
  419. emailContents := "<div><p>您有【" + strconv.Itoa(len(companyItems)) + "】 客户将于7天后到期,请注意查看</p>"
  420. emailContents += "<table border='1'><tr><td width='200'>7天后到期客户名称</td><td width='200'>到期日期</td><td width='200'>销售人员</td><td>客户类型</td></tr>"
  421. for _, v := range companyItems {
  422. endTime := v.EndDate
  423. if v.Status == "正式" {
  424. endTime = v.ContractEndDate
  425. }
  426. emailContents += `<tr><td>` + v.CompanyName + `</td><td>` + endTime + `</td><td>` + seller.RealName + `</td><td>` + v.Status + `</td></tr>`
  427. msgContent += `客户:` + v.CompanyName + ";状态:" + v.Status + "\n"
  428. isSend = true
  429. // 数据入库
  430. companyRemindRecordList = append(companyRemindRecordList, &models.CompanyRemindRecord{
  431. //CompanyRemindRecordId: 0,
  432. Type: remindType,
  433. SellerId: seller.AdminId,
  434. SellerName: seller.RealName,
  435. CompanyId: v.CompanyId,
  436. CompanyName: v.CompanyName,
  437. Status: v.Status,
  438. EndDate: endTime,
  439. UniqueCode: uniqueCode,
  440. CreateTime: time.Now(),
  441. })
  442. }
  443. emailContents += "</table></br>"
  444. if isSend {
  445. if seller.Email != "" {
  446. utils.SendEmailByHongze("到期前7天提醒", emailContents, seller.Email, "", "")
  447. }
  448. if seller.OpenId != "" {
  449. first := "您有【" + strconv.Itoa(len(companyItems)) + "】 客户将于7天后到期,请注意查看"
  450. //keyword1 := "到期前7天提醒"
  451. keyword1 := fmt.Sprintf(`【%d】客户到期前7天提醒,点击查看`, len(companyItems))
  452. keyword2 := remindEndDate
  453. remark := msgContent
  454. openIdList := make([]*models.OpenIdList, 0)
  455. openIdItem := new(models.OpenIdList)
  456. openIdItem.OpenId = seller.OpenId
  457. openIdList = append(openIdList, openIdItem)
  458. SendWxMsgWithCompanyRemind(first, keyword1, keyword2, remark, uniqueCode, openIdList)
  459. }
  460. }
  461. // 数据入库
  462. if len(companyRemindRecordList) > 0 {
  463. models.AddMultiCompanyRemindRecord(companyRemindRecordList)
  464. }
  465. }
  466. // CompanyRemind1Day到期当天提醒
  467. func CompanyRemind1Day(seller *models.Sellers) {
  468. var err error
  469. defer func() {
  470. if err != nil {
  471. go utils.SendEmail(utils.APPNAME+"失败提醒"+utils.RunMode, "到期提醒失败:CompanyRemind;Err"+err.Error(), utils.EmailSendToUsers)
  472. }
  473. }()
  474. companyRemindRecordList := make([]*models.CompanyRemindRecord, 0)
  475. remindType := 1
  476. uniqueCode := fmt.Sprint(seller.AdminId, time.Now().Format(utils.FormatDateUnSpace), remindType, utils.GetRandString(5))
  477. remindEndDate := time.Now().AddDate(0, 0, 0).Format(utils.FormatDate)
  478. companyItems, err := models.GetRemindCompany(seller.AdminId, remindEndDate)
  479. if err != nil {
  480. return
  481. }
  482. var isSend bool
  483. msgContent := ``
  484. emailContents := "<div><p>您有【" + strconv.Itoa(len(companyItems)) + "】 客户将于今天后到期,请注意查看</p>"
  485. emailContents += "<table border='1'><tr><td width='200'>1天后到期客户名称</td><td width='200'>到期日期</td><td width='200'>销售人员</td><td>客户类型</td></tr>"
  486. for _, v := range companyItems {
  487. endTime := v.EndDate
  488. if v.Status == "正式" {
  489. endTime = v.ContractEndDate
  490. }
  491. emailContents += `<tr><td>` + v.CompanyName + `</td><td>` + endTime + `</td><td>` + seller.RealName + `</td><td>` + v.Status + `</td></tr>`
  492. msgContent += `客户:` + v.CompanyName + ";状态:" + v.Status + "\n"
  493. isSend = true
  494. // 数据入库
  495. companyRemindRecordList = append(companyRemindRecordList, &models.CompanyRemindRecord{
  496. //CompanyRemindRecordId: 0,
  497. Type: remindType,
  498. SellerId: seller.AdminId,
  499. SellerName: seller.RealName,
  500. CompanyId: v.CompanyId,
  501. CompanyName: v.CompanyName,
  502. Status: v.Status,
  503. EndDate: endTime,
  504. UniqueCode: uniqueCode,
  505. CreateTime: time.Now(),
  506. })
  507. }
  508. emailContents += "</table></br>"
  509. if isSend {
  510. if seller.Email != "" {
  511. utils.SendEmailByHongze("到期前1天提醒", emailContents, seller.Email, "", "")
  512. }
  513. if seller.OpenId != "" {
  514. first := "您有【" + strconv.Itoa(len(companyItems)) + "】 客户将于1天后到期,请注意查看"
  515. //keyword1 := "到期前1天提醒"
  516. keyword1 := fmt.Sprintf(`【%d】客户到期前1天提醒,点击查看`, len(companyItems))
  517. keyword2 := remindEndDate
  518. remark := msgContent
  519. openIdList := make([]*models.OpenIdList, 0)
  520. openIdItem := new(models.OpenIdList)
  521. openIdItem.OpenId = seller.OpenId
  522. openIdList = append(openIdList, openIdItem)
  523. SendWxMsgWithCompanyRemind(first, keyword1, keyword2, remark, uniqueCode, openIdList)
  524. }
  525. }
  526. // 数据入库
  527. if len(companyRemindRecordList) > 0 {
  528. models.AddMultiCompanyRemindRecord(companyRemindRecordList)
  529. }
  530. }
  531. // StaticCompanyTryDay 定时任务每天更新客户试用总天数
  532. func StaticCompanyTryDay(cont context.Context) (err error) {
  533. errList := make([]string, 0)
  534. defer func() {
  535. if len(errList) > 0 {
  536. go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "定时任务每天更新客户试用总天数 ErrMsg:"+strings.Join(errList, "\n"), utils.EmailSendToUsers)
  537. }
  538. }()
  539. list, err := models.GetCompanyProductTryOutUpdateNoStopGroup()
  540. if err != nil {
  541. fmt.Println("获取客户变更数据失败:", err)
  542. return
  543. }
  544. for _, v := range list {
  545. isAdd := false //是否要增加一天,默认不加
  546. permissionList, tmpErr := models.GetCompanyReportPermissionByStatus(v.CompanyId, v.ProductId, "试用")
  547. if tmpErr != nil {
  548. errList = append(errList, fmt.Sprint("company_id:", v.CompanyId, ";product_id:", v.ProductId, ";寻找对应的试用品种失败,Err:", tmpErr))
  549. continue
  550. }
  551. currPermissionIdList := make([]int, 0) //当前试用的品种
  552. for _, permission := range permissionList {
  553. currPermissionIdList = append(currPermissionIdList, permission.ChartPermissionId)
  554. }
  555. //获取所有未停止的记录列表
  556. logList, tmpErr := models.GetCompanyProductTryOutUpdateNoStopListByEndDate(v.CompanyId, v.ProductId)
  557. if tmpErr != nil {
  558. errList = append(errList, fmt.Sprint("company_id:", v.CompanyId, ";product_id:", v.ProductId, ";寻找客户的试用日志失败,Err:", tmpErr))
  559. continue
  560. }
  561. logPermissionIdList := make([]int, 0) //当前日志中的试用的品种
  562. for _, log := range logList {
  563. //获取所有未停止的品种试用记录列表
  564. logPermissionList, tmpErr := models.GetCompanyProductTryOutPermissionUpdateNoStopListByEndDate(log.Id)
  565. if tmpErr != nil {
  566. errList = append(errList, fmt.Sprint("company_id:", v.CompanyId, ";product_id:", v.ProductId, ";logId:", v.Id, ";寻找客户的试用品种日志失败,Err:", tmpErr))
  567. continue
  568. }
  569. lenLogPermissionList := len(logPermissionList) //当前日志存在试用的品种数量
  570. stopPermission := 0 //当前日志需要停止的品种数量
  571. currTime := time.Now() //当前时间
  572. for _, logPermission := range logPermissionList {
  573. if utils.InArrayByInt(logPermissionIdList, logPermission.ChartPermissionId) {
  574. // 如果已经被其他记录使用了,那么就将当前记录给标记停止
  575. logPermission.IsStop = 1
  576. // 如果当前时间晚于结束日期,那么实际结束日期就是今天之前一天,否则就是当天
  577. if currTime.After(logPermission.EndDate) {
  578. logPermission.RealEndDate = currTime.AddDate(0, 0, -1)
  579. } else {
  580. logPermission.RealEndDate = time.Now()
  581. }
  582. logPermission.Update([]string{"IsStop", "RealEndDate"})
  583. stopPermission++
  584. continue
  585. } else if !utils.InArrayByInt(currPermissionIdList, logPermission.ChartPermissionId) {
  586. // 如果该品种不在当前客户的品种里面,那么也要将当前记录给标记停止
  587. logPermission.IsStop = 1
  588. // 如果当前时间晚于结束日期,那么实际结束日期就是今天之前一天,否则就是当天
  589. if currTime.After(logPermission.EndDate) {
  590. logPermission.RealEndDate = currTime.AddDate(0, 0, -1)
  591. } else {
  592. logPermission.RealEndDate = time.Now()
  593. }
  594. logPermission.Update([]string{"IsStop", "RealEndDate"})
  595. stopPermission++
  596. continue
  597. }
  598. // 说明当天还是试用状态,需要变更实际结束日期
  599. logPermission.RealEndDate = currTime
  600. logPermission.Update([]string{"RealEndDate"})
  601. // 剩下的说明还处于试用状态,需要添加1天试用期,且需要把该品种加入到当前日志中的试用的品种列表
  602. isAdd = true
  603. logPermissionIdList = append(logPermissionIdList, logPermission.ChartPermissionId)
  604. }
  605. //如果当前日志存在试用的品种数量 == 当前日志需要停止的品种数量
  606. // 那么当前日志也是处于停用状态
  607. if lenLogPermissionList == stopPermission {
  608. log.IsStop = 1
  609. // 如果当前时间晚于结束日期,那么实际结束日期就是今天之前一天,否则就是当天
  610. if currTime.After(log.EndDate) {
  611. log.RealEndDate = currTime.AddDate(0, 0, -1)
  612. } else {
  613. log.RealEndDate = time.Now()
  614. }
  615. log.Update([]string{"IsStop", "RealEndDate"})
  616. }
  617. }
  618. // 如果需要添加,那么将该客户品种添加1天
  619. if isAdd {
  620. }
  621. // 更新客户产品的试用天数
  622. tmpErr = models.AddCompanyProductTryOutDayTotal(v.CompanyId, v.ProductId)
  623. if tmpErr != nil {
  624. errList = append(errList, fmt.Sprint("company_id:", v.CompanyId, ";product_id:", v.ProductId, ";logId:", v.Id, ";更新客户产品的试用天数,Err:", tmpErr))
  625. continue
  626. }
  627. }
  628. return
  629. }