company_product.go 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759
  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. CompanyRemind60Day(v)
  260. time.Sleep(5 * time.Second)
  261. CompanyRemind30Day(v)
  262. time.Sleep(5 * time.Second)
  263. CompanyRemind15Day(v)
  264. time.Sleep(5 * time.Second)
  265. CompanyRemind7Day(v)
  266. time.Sleep(5 * time.Second)
  267. CompanyRemind1Day(v)
  268. time.Sleep(5 * time.Second)
  269. }
  270. return
  271. }
  272. // CompanyRemind60Day 60天后到期客户
  273. func CompanyRemind60Day(seller *models.Sellers) {
  274. var err error
  275. defer func() {
  276. if err != nil {
  277. go utils.SendEmail(utils.APPNAME+"失败提醒"+utils.RunMode, "到期提醒失败:CompanyRemind;Err"+err.Error(), utils.EmailSendToUsers)
  278. }
  279. }()
  280. companyRemindRecordList := make([]*models.CompanyRemindRecord, 0)
  281. remindType := 5
  282. uniqueCode := fmt.Sprint(seller.AdminId, time.Now().Format(utils.FormatDateUnSpace), remindType, utils.GetRandString(5))
  283. //remindEndDate := "2020-12-31" //time.Now().AddDate(0, 0, 30).Format(utils.FormatDate)
  284. remindEndDate := time.Now().AddDate(0, 0, 60).Format(utils.FormatDate)
  285. companyItems, err := models.GetRemindCompany(seller.AdminId, remindEndDate)
  286. if err != nil {
  287. return
  288. }
  289. emailContents := "<div><p>您有【" + strconv.Itoa(len(companyItems)) + "】 客户将于60天后到期,请注意查看</p>"
  290. emailContents += "<table border='1'><tr><td width='200'>60天后到期客户名称</td><td width='200'>到期日期</td><td width='200'>销售人员</td><td>客户类型</td></tr>"
  291. var isSend bool
  292. msgContent := ``
  293. for _, v := range companyItems {
  294. endTime := v.EndDate
  295. if v.Status == "正式" {
  296. endTime = v.ContractEndDate
  297. }
  298. emailContents += `<tr><td>` + v.CompanyName + `</td><td>` + endTime + `</td><td>` + seller.RealName + `</td><td>` + v.Status + `</td></tr>`
  299. msgContent += `客户:` + v.CompanyName + ";状态:" + v.Status + "\n"
  300. isSend = true
  301. // 数据入库
  302. companyRemindRecordList = append(companyRemindRecordList, &models.CompanyRemindRecord{
  303. //CompanyRemindRecordId: 0,
  304. Type: remindType,
  305. SellerId: seller.AdminId,
  306. SellerName: seller.RealName,
  307. CompanyId: v.CompanyId,
  308. CompanyName: v.CompanyName,
  309. Status: v.Status,
  310. EndDate: endTime,
  311. UniqueCode: uniqueCode,
  312. CreateTime: time.Now(),
  313. })
  314. }
  315. emailContents += "</table></br>"
  316. if isSend {
  317. if seller.Email != "" {
  318. utils.SendEmailByHongze("到期前60天提醒", emailContents, seller.Email, "", "")
  319. }
  320. if seller.OpenId != "" {
  321. first := "您有【" + strconv.Itoa(len(companyItems)) + "】 客户将于60天后到期,请注意查看"
  322. //keyword1 := "到期前30天提醒"
  323. keyword1 := fmt.Sprintf(`【%d】客户到期前60天提醒,点击查看`, len(companyItems))
  324. keyword2 := remindEndDate
  325. remark := msgContent
  326. openIdList := make([]*models.OpenIdList, 0)
  327. openIdItem := new(models.OpenIdList)
  328. openIdItem.OpenId = seller.OpenId
  329. openIdList = append(openIdList, openIdItem)
  330. SendWxMsgWithCompanyRemind(first, keyword1, keyword2, remark, uniqueCode, openIdList)
  331. }
  332. }
  333. // 数据入库
  334. if len(companyRemindRecordList) > 0 {
  335. models.AddMultiCompanyRemindRecord(companyRemindRecordList)
  336. }
  337. }
  338. // CompanyRemind30Day 30天后到期客户
  339. func CompanyRemind30Day(seller *models.Sellers) {
  340. var err error
  341. defer func() {
  342. if err != nil {
  343. go utils.SendEmail(utils.APPNAME+"失败提醒"+utils.RunMode, "到期提醒失败:CompanyRemind;Err"+err.Error(), utils.EmailSendToUsers)
  344. }
  345. }()
  346. companyRemindRecordList := make([]*models.CompanyRemindRecord, 0)
  347. remindType := 4
  348. uniqueCode := fmt.Sprint(seller.AdminId, time.Now().Format(utils.FormatDateUnSpace), remindType, utils.GetRandString(5))
  349. //remindEndDate := "2020-12-31" //time.Now().AddDate(0, 0, 30).Format(utils.FormatDate)
  350. remindEndDate := time.Now().AddDate(0, 0, 30).Format(utils.FormatDate)
  351. companyItems, err := models.GetRemindCompany(seller.AdminId, remindEndDate)
  352. if err != nil {
  353. return
  354. }
  355. emailContents := "<div><p>您有【" + strconv.Itoa(len(companyItems)) + "】 客户将于30天后到期,请注意查看</p>"
  356. emailContents += "<table border='1'><tr><td width='200'>30天后到期客户名称</td><td width='200'>到期日期</td><td width='200'>销售人员</td><td>客户类型</td></tr>"
  357. var isSend bool
  358. msgContent := ``
  359. for _, v := range companyItems {
  360. endTime := v.EndDate
  361. if v.Status == "正式" {
  362. endTime = v.ContractEndDate
  363. }
  364. emailContents += `<tr><td>` + v.CompanyName + `</td><td>` + endTime + `</td><td>` + seller.RealName + `</td><td>` + v.Status + `</td></tr>`
  365. msgContent += `客户:` + v.CompanyName + ";状态:" + v.Status + "\n"
  366. isSend = true
  367. // 数据入库
  368. companyRemindRecordList = append(companyRemindRecordList, &models.CompanyRemindRecord{
  369. //CompanyRemindRecordId: 0,
  370. Type: remindType,
  371. SellerId: seller.AdminId,
  372. SellerName: seller.RealName,
  373. CompanyId: v.CompanyId,
  374. CompanyName: v.CompanyName,
  375. Status: v.Status,
  376. EndDate: endTime,
  377. UniqueCode: uniqueCode,
  378. CreateTime: time.Now(),
  379. })
  380. }
  381. emailContents += "</table></br>"
  382. if isSend {
  383. if seller.Email != "" {
  384. utils.SendEmailByHongze("到期前30天提醒", emailContents, seller.Email, "", "")
  385. }
  386. if seller.OpenId != "" {
  387. first := "您有【" + strconv.Itoa(len(companyItems)) + "】 客户将于30天后到期,请注意查看"
  388. //keyword1 := "到期前30天提醒"
  389. keyword1 := fmt.Sprintf(`【%d】客户到期前30天提醒,点击查看`, len(companyItems))
  390. keyword2 := remindEndDate
  391. remark := msgContent
  392. openIdList := make([]*models.OpenIdList, 0)
  393. openIdItem := new(models.OpenIdList)
  394. openIdItem.OpenId = seller.OpenId
  395. openIdList = append(openIdList, openIdItem)
  396. SendWxMsgWithCompanyRemind(first, keyword1, keyword2, remark, uniqueCode, openIdList)
  397. }
  398. }
  399. // 数据入库
  400. if len(companyRemindRecordList) > 0 {
  401. models.AddMultiCompanyRemindRecord(companyRemindRecordList)
  402. }
  403. }
  404. // CompanyRemind15Day 15天后到期客户
  405. func CompanyRemind15Day(seller *models.Sellers) {
  406. var err error
  407. defer func() {
  408. if err != nil {
  409. go utils.SendEmail(utils.APPNAME+"失败提醒"+utils.RunMode, "到期提醒失败:CompanyRemind;Err"+err.Error(), utils.EmailSendToUsers)
  410. }
  411. }()
  412. companyRemindRecordList := make([]*models.CompanyRemindRecord, 0)
  413. remindType := 3
  414. uniqueCode := fmt.Sprint(seller.AdminId, time.Now().Format(utils.FormatDateUnSpace), remindType, utils.GetRandString(5))
  415. remindEndDate := time.Now().AddDate(0, 0, 15).Format(utils.FormatDate)
  416. companyItems, err := models.GetRemindCompany(seller.AdminId, remindEndDate)
  417. if err != nil {
  418. return
  419. }
  420. var isSend bool
  421. msgContent := ``
  422. emailContents := "<div><p>您有【" + strconv.Itoa(len(companyItems)) + "】 客户将于15天后到期,请注意查看</p>"
  423. emailContents += "<table border='1'><tr><td width='200'>15天后到期客户名称</td><td width='200'>到期日期</td><td width='200'>销售人员</td><td>客户类型</td></tr>"
  424. for _, v := range companyItems {
  425. endTime := v.EndDate
  426. if v.Status == "正式" {
  427. endTime = v.ContractEndDate
  428. }
  429. emailContents += `<tr><td>` + v.CompanyName + `</td><td>` + endTime + `</td><td>` + seller.RealName + `</td><td>` + v.Status + `</td></tr>`
  430. msgContent += `客户:` + v.CompanyName + ";状态:" + v.Status + "\n"
  431. isSend = true
  432. // 数据入库
  433. companyRemindRecordList = append(companyRemindRecordList, &models.CompanyRemindRecord{
  434. //CompanyRemindRecordId: 0,
  435. Type: remindType,
  436. SellerId: seller.AdminId,
  437. SellerName: seller.RealName,
  438. CompanyId: v.CompanyId,
  439. CompanyName: v.CompanyName,
  440. Status: v.Status,
  441. EndDate: endTime,
  442. UniqueCode: uniqueCode,
  443. CreateTime: time.Now(),
  444. })
  445. }
  446. emailContents += "</table></br>"
  447. if isSend {
  448. if seller.Email != "" {
  449. utils.SendEmailByHongze("到期前15天提醒", emailContents, seller.Email, "", "")
  450. }
  451. if seller.OpenId != "" {
  452. first := "您有【" + strconv.Itoa(len(companyItems)) + "】 客户将于15天后到期,请注意查看"
  453. //keyword1 := "到期前15天提醒"
  454. keyword1 := fmt.Sprintf(`【%d】客户到期前15天提醒,点击查看`, len(companyItems))
  455. keyword2 := remindEndDate
  456. remark := msgContent
  457. openIdList := make([]*models.OpenIdList, 0)
  458. openIdItem := new(models.OpenIdList)
  459. openIdItem.OpenId = seller.OpenId
  460. openIdList = append(openIdList, openIdItem)
  461. SendWxMsgWithCompanyRemind(first, keyword1, keyword2, remark, uniqueCode, openIdList)
  462. }
  463. }
  464. // 数据入库
  465. if len(companyRemindRecordList) > 0 {
  466. models.AddMultiCompanyRemindRecord(companyRemindRecordList)
  467. }
  468. }
  469. // CompanyRemind7Day 7天后到期客户名称
  470. func CompanyRemind7Day(seller *models.Sellers) {
  471. var err error
  472. defer func() {
  473. if err != nil {
  474. go utils.SendEmail(utils.APPNAME+"失败提醒"+utils.RunMode, "到期提醒失败:CompanyRemind;Err"+err.Error(), utils.EmailSendToUsers)
  475. }
  476. }()
  477. companyRemindRecordList := make([]*models.CompanyRemindRecord, 0)
  478. remindType := 2
  479. uniqueCode := fmt.Sprint(seller.AdminId, time.Now().Format(utils.FormatDateUnSpace), remindType, utils.GetRandString(5))
  480. remindEndDate := time.Now().AddDate(0, 0, 7).Format(utils.FormatDate)
  481. companyItems, err := models.GetRemindCompany(seller.AdminId, remindEndDate)
  482. if err != nil {
  483. return
  484. }
  485. var isSend bool
  486. msgContent := ``
  487. emailContents := "<div><p>您有【" + strconv.Itoa(len(companyItems)) + "】 客户将于7天后到期,请注意查看</p>"
  488. emailContents += "<table border='1'><tr><td width='200'>7天后到期客户名称</td><td width='200'>到期日期</td><td width='200'>销售人员</td><td>客户类型</td></tr>"
  489. for _, v := range companyItems {
  490. endTime := v.EndDate
  491. if v.Status == "正式" {
  492. endTime = v.ContractEndDate
  493. }
  494. emailContents += `<tr><td>` + v.CompanyName + `</td><td>` + endTime + `</td><td>` + seller.RealName + `</td><td>` + v.Status + `</td></tr>`
  495. msgContent += `客户:` + v.CompanyName + ";状态:" + v.Status + "\n"
  496. isSend = true
  497. // 数据入库
  498. companyRemindRecordList = append(companyRemindRecordList, &models.CompanyRemindRecord{
  499. //CompanyRemindRecordId: 0,
  500. Type: remindType,
  501. SellerId: seller.AdminId,
  502. SellerName: seller.RealName,
  503. CompanyId: v.CompanyId,
  504. CompanyName: v.CompanyName,
  505. Status: v.Status,
  506. EndDate: endTime,
  507. UniqueCode: uniqueCode,
  508. CreateTime: time.Now(),
  509. })
  510. }
  511. emailContents += "</table></br>"
  512. if isSend {
  513. if seller.Email != "" {
  514. utils.SendEmailByHongze("到期前7天提醒", emailContents, seller.Email, "", "")
  515. }
  516. if seller.OpenId != "" {
  517. first := "您有【" + strconv.Itoa(len(companyItems)) + "】 客户将于7天后到期,请注意查看"
  518. //keyword1 := "到期前7天提醒"
  519. keyword1 := fmt.Sprintf(`【%d】客户到期前7天提醒,点击查看`, len(companyItems))
  520. keyword2 := remindEndDate
  521. remark := msgContent
  522. openIdList := make([]*models.OpenIdList, 0)
  523. openIdItem := new(models.OpenIdList)
  524. openIdItem.OpenId = seller.OpenId
  525. openIdList = append(openIdList, openIdItem)
  526. SendWxMsgWithCompanyRemind(first, keyword1, keyword2, remark, uniqueCode, openIdList)
  527. }
  528. }
  529. // 数据入库
  530. if len(companyRemindRecordList) > 0 {
  531. models.AddMultiCompanyRemindRecord(companyRemindRecordList)
  532. }
  533. }
  534. // CompanyRemind1Day到期当天提醒
  535. func CompanyRemind1Day(seller *models.Sellers) {
  536. var err error
  537. defer func() {
  538. if err != nil {
  539. go utils.SendEmail(utils.APPNAME+"失败提醒"+utils.RunMode, "到期提醒失败:CompanyRemind;Err"+err.Error(), utils.EmailSendToUsers)
  540. }
  541. }()
  542. companyRemindRecordList := make([]*models.CompanyRemindRecord, 0)
  543. remindType := 1
  544. uniqueCode := fmt.Sprint(seller.AdminId, time.Now().Format(utils.FormatDateUnSpace), remindType, utils.GetRandString(5))
  545. remindEndDate := time.Now().AddDate(0, 0, 0).Format(utils.FormatDate)
  546. companyItems, err := models.GetRemindCompany(seller.AdminId, remindEndDate)
  547. if err != nil {
  548. return
  549. }
  550. var isSend bool
  551. msgContent := ``
  552. emailContents := "<div><p>您有【" + strconv.Itoa(len(companyItems)) + "】 客户将于今天后到期,请注意查看</p>"
  553. emailContents += "<table border='1'><tr><td width='200'>1天后到期客户名称</td><td width='200'>到期日期</td><td width='200'>销售人员</td><td>客户类型</td></tr>"
  554. for _, v := range companyItems {
  555. endTime := v.EndDate
  556. if v.Status == "正式" {
  557. endTime = v.ContractEndDate
  558. }
  559. emailContents += `<tr><td>` + v.CompanyName + `</td><td>` + endTime + `</td><td>` + seller.RealName + `</td><td>` + v.Status + `</td></tr>`
  560. msgContent += `客户:` + v.CompanyName + ";状态:" + v.Status + "\n"
  561. isSend = true
  562. // 数据入库
  563. companyRemindRecordList = append(companyRemindRecordList, &models.CompanyRemindRecord{
  564. //CompanyRemindRecordId: 0,
  565. Type: remindType,
  566. SellerId: seller.AdminId,
  567. SellerName: seller.RealName,
  568. CompanyId: v.CompanyId,
  569. CompanyName: v.CompanyName,
  570. Status: v.Status,
  571. EndDate: endTime,
  572. UniqueCode: uniqueCode,
  573. CreateTime: time.Now(),
  574. })
  575. }
  576. emailContents += "</table></br>"
  577. if isSend {
  578. if seller.Email != "" {
  579. utils.SendEmailByHongze("到期前1天提醒", emailContents, seller.Email, "", "")
  580. }
  581. if seller.OpenId != "" {
  582. first := "您有【" + strconv.Itoa(len(companyItems)) + "】 客户将于1天后到期,请注意查看"
  583. //keyword1 := "到期前1天提醒"
  584. keyword1 := fmt.Sprintf(`【%d】客户到期前1天提醒,点击查看`, len(companyItems))
  585. keyword2 := remindEndDate
  586. remark := msgContent
  587. openIdList := make([]*models.OpenIdList, 0)
  588. openIdItem := new(models.OpenIdList)
  589. openIdItem.OpenId = seller.OpenId
  590. openIdList = append(openIdList, openIdItem)
  591. SendWxMsgWithCompanyRemind(first, keyword1, keyword2, remark, uniqueCode, openIdList)
  592. }
  593. }
  594. // 数据入库
  595. if len(companyRemindRecordList) > 0 {
  596. models.AddMultiCompanyRemindRecord(companyRemindRecordList)
  597. }
  598. }
  599. // StaticCompanyTryDay 定时任务每天更新客户试用总天数
  600. func StaticCompanyTryDay(cont context.Context) (err error) {
  601. errList := make([]string, 0)
  602. defer func() {
  603. if len(errList) > 0 {
  604. go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "定时任务每天更新客户试用总天数 ErrMsg:"+strings.Join(errList, "\n"), utils.EmailSendToUsers)
  605. }
  606. }()
  607. list, err := models.GetCompanyProductTryOutUpdateNoStopGroup()
  608. if err != nil {
  609. fmt.Println("获取客户变更数据失败:", err)
  610. return
  611. }
  612. for _, v := range list {
  613. isAdd := false //是否要增加一天,默认不加
  614. permissionList, tmpErr := models.GetCompanyReportPermissionByStatus(v.CompanyId, v.ProductId, "试用")
  615. if tmpErr != nil {
  616. errList = append(errList, fmt.Sprint("company_id:", v.CompanyId, ";product_id:", v.ProductId, ";寻找对应的试用品种失败,Err:", tmpErr))
  617. continue
  618. }
  619. currPermissionIdList := make([]int, 0) //当前试用的品种
  620. for _, permission := range permissionList {
  621. currPermissionIdList = append(currPermissionIdList, permission.ChartPermissionId)
  622. }
  623. //获取所有未停止的记录列表
  624. logList, tmpErr := models.GetCompanyProductTryOutUpdateNoStopListByEndDate(v.CompanyId, v.ProductId)
  625. if tmpErr != nil {
  626. errList = append(errList, fmt.Sprint("company_id:", v.CompanyId, ";product_id:", v.ProductId, ";寻找客户的试用日志失败,Err:", tmpErr))
  627. continue
  628. }
  629. logPermissionIdList := make([]int, 0) //当前日志中的试用的品种
  630. for _, log := range logList {
  631. //获取所有未停止的品种试用记录列表
  632. logPermissionList, tmpErr := models.GetCompanyProductTryOutPermissionUpdateNoStopListByEndDate(log.Id)
  633. if tmpErr != nil {
  634. errList = append(errList, fmt.Sprint("company_id:", v.CompanyId, ";product_id:", v.ProductId, ";logId:", v.Id, ";寻找客户的试用品种日志失败,Err:", tmpErr))
  635. continue
  636. }
  637. lenLogPermissionList := len(logPermissionList) //当前日志存在试用的品种数量
  638. stopPermission := 0 //当前日志需要停止的品种数量
  639. currTime := time.Now() //当前时间
  640. for _, logPermission := range logPermissionList {
  641. if utils.InArrayByInt(logPermissionIdList, logPermission.ChartPermissionId) {
  642. // 如果已经被其他记录使用了,那么就将当前记录给标记停止
  643. logPermission.IsStop = 1
  644. // 如果当前时间晚于结束日期,那么实际结束日期就是今天之前一天,否则就是当天
  645. if currTime.After(logPermission.EndDate) {
  646. logPermission.RealEndDate = currTime.AddDate(0, 0, -1)
  647. } else {
  648. logPermission.RealEndDate = time.Now()
  649. }
  650. logPermission.Update([]string{"IsStop", "RealEndDate"})
  651. stopPermission++
  652. continue
  653. } else if !utils.InArrayByInt(currPermissionIdList, logPermission.ChartPermissionId) {
  654. // 如果该品种不在当前客户的品种里面,那么也要将当前记录给标记停止
  655. logPermission.IsStop = 1
  656. // 如果当前时间晚于结束日期,那么实际结束日期就是今天之前一天,否则就是当天
  657. if currTime.After(logPermission.EndDate) {
  658. logPermission.RealEndDate = currTime.AddDate(0, 0, -1)
  659. } else {
  660. logPermission.RealEndDate = time.Now()
  661. }
  662. logPermission.Update([]string{"IsStop", "RealEndDate"})
  663. stopPermission++
  664. continue
  665. }
  666. // 说明当天还是试用状态,需要变更实际结束日期
  667. logPermission.RealEndDate = currTime
  668. logPermission.Update([]string{"RealEndDate"})
  669. // 剩下的说明还处于试用状态,需要添加1天试用期,且需要把该品种加入到当前日志中的试用的品种列表
  670. isAdd = true
  671. logPermissionIdList = append(logPermissionIdList, logPermission.ChartPermissionId)
  672. }
  673. //如果当前日志存在试用的品种数量 == 当前日志需要停止的品种数量
  674. // 那么当前日志也是处于停用状态
  675. if lenLogPermissionList == stopPermission {
  676. log.IsStop = 1
  677. // 如果当前时间晚于结束日期,那么实际结束日期就是今天之前一天,否则就是当天
  678. if currTime.After(log.EndDate) {
  679. log.RealEndDate = currTime.AddDate(0, 0, -1)
  680. } else {
  681. log.RealEndDate = time.Now()
  682. }
  683. log.Update([]string{"IsStop", "RealEndDate"})
  684. }
  685. }
  686. // 如果需要添加,那么将该客户品种添加1天
  687. if isAdd {
  688. }
  689. // 更新客户产品的试用天数
  690. tmpErr = models.AddCompanyProductTryOutDayTotal(v.CompanyId, v.ProductId)
  691. if tmpErr != nil {
  692. errList = append(errList, fmt.Sprint("company_id:", v.CompanyId, ";product_id:", v.ProductId, ";logId:", v.Id, ";更新客户产品的试用天数,Err:", tmpErr))
  693. continue
  694. }
  695. }
  696. return
  697. }