company_product.go 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932
  1. package services
  2. import (
  3. "context"
  4. "fmt"
  5. "hongze/hongze_task/models"
  6. "hongze/hongze_task/services/alarm_msg"
  7. "hongze/hongze_task/services/company"
  8. "hongze/hongze_task/services/cygx"
  9. "hongze/hongze_task/utils"
  10. "strconv"
  11. "strings"
  12. "time"
  13. )
  14. // 客户自动冻结->试用两个月结束后,进入冻结
  15. func CompanyFreeze(cont context.Context) (err error) {
  16. defer func() {
  17. if err != nil {
  18. go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "试用两个月结束后,进入冻结 ErrMsg:"+err.Error(), utils.EmailSendToUsers)
  19. }
  20. }()
  21. endDate := time.Now().AddDate(0, 0, -1).Format(utils.FormatDate)
  22. items, err := models.GetCompanyNeedFreeze(endDate)
  23. if err != nil {
  24. fmt.Println("GetCompanyNeedFreeze Err:" + err.Error())
  25. utils.FileLog.Info("GetCompanyNeedFreeze Err:%s" + err.Error())
  26. return
  27. }
  28. for k, v := range items {
  29. fmt.Println(k, v.CompanyId)
  30. count, err := models.GetCompanyApprovalCount(v.CompanyId, v.ProductId)
  31. if err != nil {
  32. return err
  33. }
  34. if count > 0 {
  35. continue
  36. }
  37. //试用转冻结
  38. companyReportPermissionList, err := models.CompanyFreeze(v.CompanyId, v.ProductId)
  39. if err != nil {
  40. utils.FileLog.Info("CompanyFreeze Err:%s" + err.Error())
  41. return err
  42. }
  43. //新增操作记录
  44. {
  45. remark := "试用转冻结"
  46. operation := "freeze"
  47. approveContent := ""
  48. go AddCompanyOperationRecord(v.CompanyId, utils.AdminId, v.ProductId, utils.AdminId, v.CompanyName,
  49. v.ProductName, utils.RealName, remark, operation, approveContent, approveContent, "", v.Status)
  50. //新增 客户产品权限 试用 转 冻结 的日志
  51. for _, v := range companyReportPermissionList {
  52. _ = AddCompanyReportPermissionLog(v.CompanyReportPermissionId, v.CompanyId, v.ProductId, utils.AdminId, v.ProductName, utils.RealName, remark, operation, v.Status)
  53. }
  54. }
  55. }
  56. return
  57. }
  58. // 客户自动流失->冻结超3个月未处理
  59. func CompanyLoss(cont context.Context) (err error) {
  60. defer func() {
  61. if err != nil {
  62. go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "自动流失->冻结超3个月未处理 ErrMsg:"+err.Error(), utils.EmailSendToUsers)
  63. }
  64. }()
  65. endDate := time.Now().AddDate(0, 0, -1).Format(utils.FormatDate)
  66. items, err := models.GetCompanyNeedLoss(endDate)
  67. if err != nil {
  68. fmt.Println("GetCompanyNeedLoss Err:" + err.Error())
  69. utils.FileLog.Info("GetCompanyNeedLoss Err:%s" + err.Error())
  70. return
  71. }
  72. for k, v := range items {
  73. fmt.Println(k, v.CompanyId)
  74. count, err := models.GetCompanyApprovalCount(v.CompanyId, v.ProductId)
  75. if err != nil {
  76. return err
  77. }
  78. if count > 0 {
  79. continue
  80. }
  81. err = models.CompanyLoss(v.CompanyId, v.ProductId)
  82. if err != nil {
  83. utils.FileLog.Info("CompanyLoss Err:%s" + err.Error())
  84. return err
  85. }
  86. //新增操作记录
  87. {
  88. remark := "冻结转流失"
  89. operation := "loss"
  90. approveContent := "流失"
  91. AddCompanyOperationRecord(v.CompanyId, utils.AdminId, v.ProductId, utils.AdminId, v.CompanyName,
  92. v.ProductName, utils.RealName, remark, operation, approveContent, approveContent, "", v.Status)
  93. }
  94. }
  95. return
  96. }
  97. // 正式客户自动试用->合同到期未续约转试用
  98. func CompanyTryOut(cont context.Context) (err error) {
  99. defer func() {
  100. if err != nil {
  101. go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "正式客户自动试用->合同到期未续约转试用 ErrMsg:"+err.Error(), utils.EmailSendToUsers)
  102. }
  103. }()
  104. endDate := time.Now().AddDate(0, 0, -1).Format(utils.FormatDate)
  105. items, err := models.GetCompanyNeedTryOut(endDate)
  106. if err != nil {
  107. fmt.Println("GetCompanyNeedTryOut Err:" + err.Error())
  108. utils.FileLog.Info("GetCompanyNeedTryOut Err:%s" + err.Error())
  109. return
  110. }
  111. for k, v := range items {
  112. count, err := models.GetCompanyApprovalCount(v.CompanyId, v.ProductId)
  113. if err != nil {
  114. return err
  115. }
  116. if count > 0 {
  117. continue
  118. }
  119. fmt.Println(k, v.CompanyId)
  120. //// 更新专项调研点数,需要在状态变更之前
  121. //if v.ProductId == 2 {
  122. // cygx.ActivitySpecialCompanyTryOutReduce(v.CompanyId)
  123. //}
  124. //客户正式转试用
  125. companyReportPermissionList, err := models.CompanyTryOut(v.CompanyId, v.ProductId)
  126. if err != nil {
  127. utils.FileLog.Info("CompanyLoss Err:%s" + err.Error())
  128. return err
  129. }
  130. //新增操作记录
  131. {
  132. remark := "正式转试用"
  133. operation := "try_out"
  134. approveContent := "试用"
  135. AddCompanyOperationRecord(v.CompanyId, utils.AdminId, v.ProductId, utils.AdminId, v.CompanyName,
  136. v.ProductName, utils.RealName, remark, operation, approveContent, approveContent, "", v.Status)
  137. //新增 客户产品权限 正式 转 试用 的日志
  138. for _, v := range companyReportPermissionList {
  139. _ = AddCompanyReportPermissionLog(v.CompanyReportPermissionId, v.CompanyId, v.ProductId, utils.AdminId, v.ProductName, utils.RealName, remark, operation, v.Status)
  140. }
  141. }
  142. //{
  143. // //正式转试用,删除不续约归因内容
  144. // company.DeleteCompanNoRenewedAscribe(v.CompanyId, v.ProductId)
  145. //}
  146. //正式转试用定时任务更新研选扣点
  147. if v.ProductId == 2 {
  148. cygx.YanXuanCompanyCompanyTryOut(v.CompanyId)
  149. }
  150. }
  151. return
  152. }
  153. func AddCompanyOperationRecord(companyId, sysUserId, productId, approveAdminId int, companyName, productName, sysUserRealName, remark, operation, approveContent, approveUserRealName, approveRemark, status string) (err error) {
  154. defer func() {
  155. if err != nil {
  156. go utils.SendEmail(utils.APPNAME+"失败提醒"+utils.RunMode, "services:AddCompanyOperationRecord;Err"+err.Error(), utils.EmailSendToUsers)
  157. }
  158. }()
  159. record := new(models.CompanyOperationRecord)
  160. record.CompanyId = companyId
  161. record.CompanyName = companyName
  162. record.SysUserId = sysUserId
  163. record.SysRealName = sysUserRealName
  164. record.Remark = remark
  165. record.Operation = operation
  166. record.CreateTime = time.Now()
  167. record.ProductId = productId
  168. record.ProductName = productName
  169. record.ApproveUserId = approveAdminId
  170. record.ApproveRealName = approveUserRealName
  171. record.ApproveContent = approveContent
  172. record.ApproveRemark = approveRemark
  173. record.Status = status
  174. _, err = models.AddCompanyOperationRecord(record)
  175. return
  176. }
  177. // 客户老数据同步
  178. func CompanyOldDataSync() {
  179. companyItems, err := models.GetCompanyOldDataSync()
  180. if err != nil {
  181. fmt.Println("GetCompanyOldDataSync Err:" + err.Error())
  182. return
  183. }
  184. productId := 1
  185. productName := "ficc"
  186. for k, v := range companyItems {
  187. fmt.Println(k, v.CompanyName, v.CompanyId)
  188. productItem := new(models.CompanyProduct)
  189. productItem.CompanyId = v.CompanyId
  190. productItem.ProductId = productId
  191. productItem.ProductName = productName
  192. productItem.CompanyName = v.CompanyName
  193. //客户标签,1:付费客户,2:试用客户,3:流失客户,4:潜在客户,5:永续
  194. //'试用','永续','冻结','流失','正式','潜在'
  195. status := ""
  196. if v.CompanyType == 1 {
  197. status = "正式"
  198. } else if v.CompanyType == 2 {
  199. status = "试用"
  200. } else if v.CompanyType == 3 {
  201. status = "流失"
  202. } else if v.CompanyType == 4 {
  203. status = "潜在"
  204. } else if v.CompanyType == 5 {
  205. status = "永续"
  206. } else {
  207. fmt.Println("无效的客户状态:"+status, v.CompanyType)
  208. return
  209. }
  210. if status == "" {
  211. fmt.Println("无效的客户状态:"+status, v.CompanyType)
  212. return
  213. }
  214. productItem.Status = status
  215. //获取销售
  216. seller, err := models.GetAdminByAdminId(v.SellsId)
  217. if err != nil && err.Error() != utils.ErrNoRow() {
  218. fmt.Println("获取销售失败,Err:"+err.Error(), v.SellsId)
  219. return
  220. }
  221. var adminId, groupId, departmentId int
  222. var sellerRealName string
  223. if seller == nil {
  224. fmt.Println("销售不存在:", v.SellsId)
  225. //return
  226. } else {
  227. adminId = seller.AdminId
  228. sellerRealName = seller.RealName
  229. groupId = seller.GroupId
  230. departmentId = seller.DepartmentId
  231. }
  232. productItem.SellerId = adminId
  233. productItem.SellerName = sellerRealName
  234. productItem.GroupId = groupId
  235. productItem.DepartmentId = departmentId
  236. productItem.CreateTime = time.Now()
  237. productItem.ModifyTime = time.Now()
  238. productItem.StartDate = v.StartDate
  239. productItem.EndDate = v.EndDate
  240. productItem.LoseReason = v.LoseReason
  241. productItem.LossTime = v.LossTime
  242. _, err = models.AddCompanyProduct(productItem)
  243. if err != nil {
  244. fmt.Println("新增客户产品失败,Err:" + err.Error())
  245. return
  246. }
  247. //权限处理
  248. err = models.ModifyCompanyOldPermission(v.StartDate, v.EndDate, productName, v.CompanyId, productId)
  249. if err != nil {
  250. fmt.Println("客户权限处理失败,Err:" + err.Error())
  251. return
  252. }
  253. if k > 500 {
  254. return
  255. }
  256. }
  257. }
  258. // CompanyRemind 正式/试用客户--到期提醒
  259. func CompanyRemind(cont context.Context) (err error) {
  260. defer func() {
  261. if err != nil {
  262. go utils.SendEmail(utils.APPNAME+"失败提醒"+utils.RunMode, "到期提醒失败:CompanyRemind;Err"+err.Error(), utils.EmailSendToUsers)
  263. }
  264. }()
  265. //获取销售
  266. sellers, err := models.GetSellersOpenId()
  267. for k, v := range sellers {
  268. fmt.Println(k, v.AdminId, v.Mobile)
  269. CompanyRemind60Day(v)
  270. time.Sleep(5 * time.Second)
  271. CompanyRemind30Day(v)
  272. time.Sleep(5 * time.Second)
  273. CompanyRemind15Day(v)
  274. time.Sleep(5 * time.Second)
  275. CompanyRemind7Day(v)
  276. time.Sleep(5 * time.Second)
  277. CompanyRemind1Day(v)
  278. time.Sleep(5 * time.Second)
  279. }
  280. return
  281. }
  282. // CompanyRemind60Day 60天后到期客户
  283. func CompanyRemind60Day(seller *models.Sellers) {
  284. var err error
  285. defer func() {
  286. if err != nil {
  287. go utils.SendEmail(utils.APPNAME+"失败提醒"+utils.RunMode, "到期提醒失败:CompanyRemind;Err"+err.Error(), utils.EmailSendToUsers)
  288. }
  289. }()
  290. companyRemindRecordList := make([]*models.CompanyRemindRecord, 0)
  291. remindType := 5
  292. uniqueCode := fmt.Sprint(seller.AdminId, time.Now().Format(utils.FormatDateUnSpace), remindType, utils.GetRandString(5))
  293. //remindEndDate := "2020-12-31" //time.Now().AddDate(0, 0, 30).Format(utils.FormatDate)
  294. remindEndDate := time.Now().AddDate(0, 0, 60).Format(utils.FormatDate)
  295. companyItems, err := models.GetRemindCompany(seller.AdminId, remindEndDate)
  296. if err != nil {
  297. return
  298. }
  299. emailContents := "<div><p>您有【" + strconv.Itoa(len(companyItems)) + "】 客户将于60天后到期,请注意查看</p>"
  300. emailContents += "<table border='1'><tr><td width='200'>60天后到期客户名称</td><td width='200'>到期日期</td><td width='200'>销售人员</td><td>客户类型</td></tr>"
  301. var isSend bool
  302. msgContent := ``
  303. for _, v := range companyItems {
  304. endTime := v.EndDate
  305. if v.Status == "正式" {
  306. endTime = v.ContractEndDate
  307. }
  308. emailContents += `<tr><td>` + v.CompanyName + `</td><td>` + endTime + `</td><td>` + seller.RealName + `</td><td>` + v.Status + `</td></tr>`
  309. msgContent += `客户:` + v.CompanyName + ";状态:" + v.Status + "\n"
  310. isSend = true
  311. // 数据入库
  312. companyRemindRecordList = append(companyRemindRecordList, &models.CompanyRemindRecord{
  313. //CompanyRemindRecordId: 0,
  314. Type: remindType,
  315. SellerId: seller.AdminId,
  316. SellerName: seller.RealName,
  317. CompanyId: v.CompanyId,
  318. CompanyName: v.CompanyName,
  319. Status: v.Status,
  320. EndDate: endTime,
  321. UniqueCode: uniqueCode,
  322. CreateTime: time.Now(),
  323. })
  324. }
  325. emailContents += "</table></br>"
  326. if isSend {
  327. if seller.Email != "" {
  328. utils.SendEmailByHongze("到期前60天提醒", emailContents, seller.Email, "", "")
  329. }
  330. if seller.OpenId != "" {
  331. first := "您有【" + strconv.Itoa(len(companyItems)) + "】 客户将于60天后到期,请注意查看"
  332. //keyword1 := "到期前30天提醒"
  333. keyword1 := fmt.Sprintf(`【%d】客户到期前60天提醒,点击查看`, len(companyItems))
  334. keyword2 := remindEndDate
  335. remark := msgContent
  336. openIdList := make([]*models.OpenIdList, 0)
  337. openIdItem := new(models.OpenIdList)
  338. openIdItem.OpenId = seller.OpenId
  339. openIdList = append(openIdList, openIdItem)
  340. SendWxMsgWithCompanyRemind(first, keyword1, keyword2, remark, uniqueCode, openIdList)
  341. }
  342. }
  343. // 数据入库
  344. if len(companyRemindRecordList) > 0 {
  345. models.AddMultiCompanyRemindRecord(companyRemindRecordList)
  346. }
  347. }
  348. // CompanyRemind30Day 30天后到期客户
  349. func CompanyRemind30Day(seller *models.Sellers) {
  350. var err error
  351. defer func() {
  352. if err != nil {
  353. go utils.SendEmail(utils.APPNAME+"失败提醒"+utils.RunMode, "到期提醒失败:CompanyRemind;Err"+err.Error(), utils.EmailSendToUsers)
  354. }
  355. }()
  356. companyRemindRecordList := make([]*models.CompanyRemindRecord, 0)
  357. remindType := 4
  358. uniqueCode := fmt.Sprint(seller.AdminId, time.Now().Format(utils.FormatDateUnSpace), remindType, utils.GetRandString(5))
  359. //remindEndDate := "2020-12-31" //time.Now().AddDate(0, 0, 30).Format(utils.FormatDate)
  360. remindEndDate := time.Now().AddDate(0, 0, 30).Format(utils.FormatDate)
  361. companyItems, err := models.GetRemindCompany(seller.AdminId, remindEndDate)
  362. if err != nil {
  363. return
  364. }
  365. emailContents := "<div><p>您有【" + strconv.Itoa(len(companyItems)) + "】 客户将于30天后到期,请注意查看</p>"
  366. emailContents += "<table border='1'><tr><td width='200'>30天后到期客户名称</td><td width='200'>到期日期</td><td width='200'>销售人员</td><td>客户类型</td></tr>"
  367. var isSend bool
  368. msgContent := ``
  369. for _, v := range companyItems {
  370. endTime := v.EndDate
  371. if v.Status == "正式" {
  372. endTime = v.ContractEndDate
  373. }
  374. emailContents += `<tr><td>` + v.CompanyName + `</td><td>` + endTime + `</td><td>` + seller.RealName + `</td><td>` + v.Status + `</td></tr>`
  375. msgContent += `客户:` + v.CompanyName + ";状态:" + v.Status + "\n"
  376. isSend = true
  377. // 数据入库
  378. companyRemindRecordList = append(companyRemindRecordList, &models.CompanyRemindRecord{
  379. //CompanyRemindRecordId: 0,
  380. Type: remindType,
  381. SellerId: seller.AdminId,
  382. SellerName: seller.RealName,
  383. CompanyId: v.CompanyId,
  384. CompanyName: v.CompanyName,
  385. Status: v.Status,
  386. EndDate: endTime,
  387. UniqueCode: uniqueCode,
  388. CreateTime: time.Now(),
  389. })
  390. }
  391. emailContents += "</table></br>"
  392. if isSend {
  393. if seller.Email != "" {
  394. utils.SendEmailByHongze("到期前30天提醒", emailContents, seller.Email, "", "")
  395. }
  396. if seller.OpenId != "" {
  397. first := "您有【" + strconv.Itoa(len(companyItems)) + "】 客户将于30天后到期,请注意查看"
  398. //keyword1 := "到期前30天提醒"
  399. keyword1 := fmt.Sprintf(`【%d】客户到期前30天提醒,点击查看`, len(companyItems))
  400. keyword2 := remindEndDate
  401. remark := msgContent
  402. openIdList := make([]*models.OpenIdList, 0)
  403. openIdItem := new(models.OpenIdList)
  404. openIdItem.OpenId = seller.OpenId
  405. openIdList = append(openIdList, openIdItem)
  406. SendWxMsgWithCompanyRemind(first, keyword1, keyword2, remark, uniqueCode, openIdList)
  407. }
  408. }
  409. // 数据入库
  410. if len(companyRemindRecordList) > 0 {
  411. models.AddMultiCompanyRemindRecord(companyRemindRecordList)
  412. }
  413. }
  414. // CompanyRemind15Day 15天后到期客户
  415. func CompanyRemind15Day(seller *models.Sellers) {
  416. var err error
  417. defer func() {
  418. if err != nil {
  419. go utils.SendEmail(utils.APPNAME+"失败提醒"+utils.RunMode, "到期提醒失败:CompanyRemind;Err"+err.Error(), utils.EmailSendToUsers)
  420. }
  421. }()
  422. companyRemindRecordList := make([]*models.CompanyRemindRecord, 0)
  423. remindType := 3
  424. uniqueCode := fmt.Sprint(seller.AdminId, time.Now().Format(utils.FormatDateUnSpace), remindType, utils.GetRandString(5))
  425. remindEndDate := time.Now().AddDate(0, 0, 15).Format(utils.FormatDate)
  426. companyItems, err := models.GetRemindCompany(seller.AdminId, remindEndDate)
  427. if err != nil {
  428. return
  429. }
  430. var isSend bool
  431. msgContent := ``
  432. emailContents := "<div><p>您有【" + strconv.Itoa(len(companyItems)) + "】 客户将于15天后到期,请注意查看</p>"
  433. emailContents += "<table border='1'><tr><td width='200'>15天后到期客户名称</td><td width='200'>到期日期</td><td width='200'>销售人员</td><td>客户类型</td></tr>"
  434. for _, v := range companyItems {
  435. endTime := v.EndDate
  436. if v.Status == "正式" {
  437. endTime = v.ContractEndDate
  438. }
  439. emailContents += `<tr><td>` + v.CompanyName + `</td><td>` + endTime + `</td><td>` + seller.RealName + `</td><td>` + v.Status + `</td></tr>`
  440. msgContent += `客户:` + v.CompanyName + ";状态:" + v.Status + "\n"
  441. isSend = true
  442. // 数据入库
  443. companyRemindRecordList = append(companyRemindRecordList, &models.CompanyRemindRecord{
  444. //CompanyRemindRecordId: 0,
  445. Type: remindType,
  446. SellerId: seller.AdminId,
  447. SellerName: seller.RealName,
  448. CompanyId: v.CompanyId,
  449. CompanyName: v.CompanyName,
  450. Status: v.Status,
  451. EndDate: endTime,
  452. UniqueCode: uniqueCode,
  453. CreateTime: time.Now(),
  454. })
  455. }
  456. emailContents += "</table></br>"
  457. if isSend {
  458. if seller.Email != "" {
  459. utils.SendEmailByHongze("到期前15天提醒", emailContents, seller.Email, "", "")
  460. }
  461. if seller.OpenId != "" {
  462. first := "您有【" + strconv.Itoa(len(companyItems)) + "】 客户将于15天后到期,请注意查看"
  463. //keyword1 := "到期前15天提醒"
  464. keyword1 := fmt.Sprintf(`【%d】客户到期前15天提醒,点击查看`, len(companyItems))
  465. keyword2 := remindEndDate
  466. remark := msgContent
  467. openIdList := make([]*models.OpenIdList, 0)
  468. openIdItem := new(models.OpenIdList)
  469. openIdItem.OpenId = seller.OpenId
  470. openIdList = append(openIdList, openIdItem)
  471. SendWxMsgWithCompanyRemind(first, keyword1, keyword2, remark, uniqueCode, openIdList)
  472. }
  473. }
  474. // 数据入库
  475. if len(companyRemindRecordList) > 0 {
  476. models.AddMultiCompanyRemindRecord(companyRemindRecordList)
  477. }
  478. }
  479. // CompanyRemind7Day 7天后到期客户名称
  480. func CompanyRemind7Day(seller *models.Sellers) {
  481. var err error
  482. defer func() {
  483. if err != nil {
  484. go utils.SendEmail(utils.APPNAME+"失败提醒"+utils.RunMode, "到期提醒失败:CompanyRemind;Err"+err.Error(), utils.EmailSendToUsers)
  485. }
  486. }()
  487. companyRemindRecordList := make([]*models.CompanyRemindRecord, 0)
  488. remindType := 2
  489. uniqueCode := fmt.Sprint(seller.AdminId, time.Now().Format(utils.FormatDateUnSpace), remindType, utils.GetRandString(5))
  490. remindEndDate := time.Now().AddDate(0, 0, 7).Format(utils.FormatDate)
  491. companyItems, err := models.GetRemindCompany(seller.AdminId, remindEndDate)
  492. if err != nil {
  493. return
  494. }
  495. var isSend bool
  496. msgContent := ``
  497. emailContents := "<div><p>您有【" + strconv.Itoa(len(companyItems)) + "】 客户将于7天后到期,请注意查看</p>"
  498. emailContents += "<table border='1'><tr><td width='200'>7天后到期客户名称</td><td width='200'>到期日期</td><td width='200'>销售人员</td><td>客户类型</td></tr>"
  499. for _, v := range companyItems {
  500. endTime := v.EndDate
  501. if v.Status == "正式" {
  502. endTime = v.ContractEndDate
  503. }
  504. emailContents += `<tr><td>` + v.CompanyName + `</td><td>` + endTime + `</td><td>` + seller.RealName + `</td><td>` + v.Status + `</td></tr>`
  505. msgContent += `客户:` + v.CompanyName + ";状态:" + v.Status + "\n"
  506. isSend = true
  507. // 数据入库
  508. companyRemindRecordList = append(companyRemindRecordList, &models.CompanyRemindRecord{
  509. //CompanyRemindRecordId: 0,
  510. Type: remindType,
  511. SellerId: seller.AdminId,
  512. SellerName: seller.RealName,
  513. CompanyId: v.CompanyId,
  514. CompanyName: v.CompanyName,
  515. Status: v.Status,
  516. EndDate: endTime,
  517. UniqueCode: uniqueCode,
  518. CreateTime: time.Now(),
  519. })
  520. }
  521. emailContents += "</table></br>"
  522. if isSend {
  523. if seller.Email != "" {
  524. utils.SendEmailByHongze("到期前7天提醒", emailContents, seller.Email, "", "")
  525. }
  526. if seller.OpenId != "" {
  527. first := "您有【" + strconv.Itoa(len(companyItems)) + "】 客户将于7天后到期,请注意查看"
  528. //keyword1 := "到期前7天提醒"
  529. keyword1 := fmt.Sprintf(`【%d】客户到期前7天提醒,点击查看`, len(companyItems))
  530. keyword2 := remindEndDate
  531. remark := msgContent
  532. openIdList := make([]*models.OpenIdList, 0)
  533. openIdItem := new(models.OpenIdList)
  534. openIdItem.OpenId = seller.OpenId
  535. openIdList = append(openIdList, openIdItem)
  536. SendWxMsgWithCompanyRemind(first, keyword1, keyword2, remark, uniqueCode, openIdList)
  537. }
  538. }
  539. // 数据入库
  540. if len(companyRemindRecordList) > 0 {
  541. models.AddMultiCompanyRemindRecord(companyRemindRecordList)
  542. }
  543. }
  544. // CompanyRemind1Day到期当天提醒
  545. func CompanyRemind1Day(seller *models.Sellers) {
  546. var err error
  547. defer func() {
  548. if err != nil {
  549. go utils.SendEmail(utils.APPNAME+"失败提醒"+utils.RunMode, "到期提醒失败:CompanyRemind;Err"+err.Error(), utils.EmailSendToUsers)
  550. }
  551. }()
  552. companyRemindRecordList := make([]*models.CompanyRemindRecord, 0)
  553. remindType := 1
  554. uniqueCode := fmt.Sprint(seller.AdminId, time.Now().Format(utils.FormatDateUnSpace), remindType, utils.GetRandString(5))
  555. remindEndDate := time.Now().AddDate(0, 0, 0).Format(utils.FormatDate)
  556. companyItems, err := models.GetRemindCompany(seller.AdminId, remindEndDate)
  557. if err != nil {
  558. return
  559. }
  560. var isSend bool
  561. msgContent := ``
  562. emailContents := "<div><p>您有【" + strconv.Itoa(len(companyItems)) + "】 客户将于今天后到期,请注意查看</p>"
  563. emailContents += "<table border='1'><tr><td width='200'>1天后到期客户名称</td><td width='200'>到期日期</td><td width='200'>销售人员</td><td>客户类型</td></tr>"
  564. for _, v := range companyItems {
  565. endTime := v.EndDate
  566. if v.Status == "正式" {
  567. endTime = v.ContractEndDate
  568. }
  569. emailContents += `<tr><td>` + v.CompanyName + `</td><td>` + endTime + `</td><td>` + seller.RealName + `</td><td>` + v.Status + `</td></tr>`
  570. msgContent += `客户:` + v.CompanyName + ";状态:" + v.Status + "\n"
  571. isSend = true
  572. // 数据入库
  573. companyRemindRecordList = append(companyRemindRecordList, &models.CompanyRemindRecord{
  574. //CompanyRemindRecordId: 0,
  575. Type: remindType,
  576. SellerId: seller.AdminId,
  577. SellerName: seller.RealName,
  578. CompanyId: v.CompanyId,
  579. CompanyName: v.CompanyName,
  580. Status: v.Status,
  581. EndDate: endTime,
  582. UniqueCode: uniqueCode,
  583. CreateTime: time.Now(),
  584. })
  585. }
  586. emailContents += "</table></br>"
  587. if isSend {
  588. if seller.Email != "" {
  589. utils.SendEmailByHongze("到期前1天提醒", emailContents, seller.Email, "", "")
  590. }
  591. if seller.OpenId != "" {
  592. first := "您有【" + strconv.Itoa(len(companyItems)) + "】 客户将于1天后到期,请注意查看"
  593. //keyword1 := "到期前1天提醒"
  594. keyword1 := fmt.Sprintf(`【%d】客户到期前1天提醒,点击查看`, len(companyItems))
  595. keyword2 := remindEndDate
  596. remark := msgContent
  597. openIdList := make([]*models.OpenIdList, 0)
  598. openIdItem := new(models.OpenIdList)
  599. openIdItem.OpenId = seller.OpenId
  600. openIdList = append(openIdList, openIdItem)
  601. SendWxMsgWithCompanyRemind(first, keyword1, keyword2, remark, uniqueCode, openIdList)
  602. }
  603. }
  604. // 数据入库
  605. if len(companyRemindRecordList) > 0 {
  606. models.AddMultiCompanyRemindRecord(companyRemindRecordList)
  607. }
  608. }
  609. // StaticCompanyTryDay 定时任务每天更新客户试用总天数
  610. func StaticCompanyTryDay(cont context.Context) (err error) {
  611. errList := make([]string, 0)
  612. defer func() {
  613. if len(errList) > 0 {
  614. go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "定时任务每天更新客户试用总天数 ErrMsg:"+strings.Join(errList, "\n"), utils.EmailSendToUsers)
  615. }
  616. }()
  617. list, err := models.GetCompanyProductTryOutUpdateNoStopGroup()
  618. if err != nil {
  619. fmt.Println("获取客户变更数据失败:", err)
  620. return
  621. }
  622. for _, v := range list {
  623. isAdd := false //是否要增加一天,默认不加
  624. permissionList, tmpErr := models.GetCompanyReportPermissionByStatus(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. currPermissionIdList := make([]int, 0) //当前试用的品种
  630. for _, permission := range permissionList {
  631. currPermissionIdList = append(currPermissionIdList, permission.ChartPermissionId)
  632. }
  633. //获取所有未停止的记录列表
  634. logList, tmpErr := models.GetCompanyProductTryOutUpdateNoStopListByEndDate(v.CompanyId, v.ProductId)
  635. if tmpErr != nil {
  636. errList = append(errList, fmt.Sprint("company_id:", v.CompanyId, ";product_id:", v.ProductId, ";寻找客户的试用日志失败,Err:", tmpErr))
  637. continue
  638. }
  639. logPermissionIdList := make([]int, 0) //当前日志中的试用的品种
  640. for _, log := range logList {
  641. //获取所有未停止的品种试用记录列表
  642. logPermissionList, tmpErr := models.GetCompanyProductTryOutPermissionUpdateNoStopListByEndDate(log.Id)
  643. if tmpErr != nil {
  644. errList = append(errList, fmt.Sprint("company_id:", v.CompanyId, ";product_id:", v.ProductId, ";logId:", v.Id, ";寻找客户的试用品种日志失败,Err:", tmpErr))
  645. continue
  646. }
  647. lenLogPermissionList := len(logPermissionList) //当前日志存在试用的品种数量
  648. stopPermission := 0 //当前日志需要停止的品种数量
  649. currTime := time.Now() //当前时间
  650. for _, logPermission := range logPermissionList {
  651. if utils.InArrayByInt(logPermissionIdList, logPermission.ChartPermissionId) {
  652. // 如果已经被其他记录使用了,那么就将当前记录给标记停止
  653. logPermission.IsStop = 1
  654. // 如果当前时间晚于结束日期,那么实际结束日期就是今天之前一天,否则就是当天
  655. if currTime.After(logPermission.EndDate) {
  656. logPermission.RealEndDate = currTime.AddDate(0, 0, -1)
  657. } else {
  658. logPermission.RealEndDate = time.Now()
  659. }
  660. logPermission.Update([]string{"IsStop", "RealEndDate"})
  661. stopPermission++
  662. continue
  663. } else if !utils.InArrayByInt(currPermissionIdList, logPermission.ChartPermissionId) {
  664. // 如果该品种不在当前客户的品种里面,那么也要将当前记录给标记停止
  665. logPermission.IsStop = 1
  666. // 如果当前时间晚于结束日期,那么实际结束日期就是今天之前一天,否则就是当天
  667. if currTime.After(logPermission.EndDate) {
  668. logPermission.RealEndDate = currTime.AddDate(0, 0, -1)
  669. } else {
  670. logPermission.RealEndDate = time.Now()
  671. }
  672. logPermission.Update([]string{"IsStop", "RealEndDate"})
  673. stopPermission++
  674. continue
  675. }
  676. // 说明当天还是试用状态,需要变更实际结束日期
  677. logPermission.RealEndDate = currTime
  678. logPermission.Update([]string{"RealEndDate"})
  679. // 剩下的说明还处于试用状态,需要添加1天试用期,且需要把该品种加入到当前日志中的试用的品种列表
  680. isAdd = true
  681. logPermissionIdList = append(logPermissionIdList, logPermission.ChartPermissionId)
  682. }
  683. //如果当前日志存在试用的品种数量 == 当前日志需要停止的品种数量
  684. // 那么当前日志也是处于停用状态
  685. if lenLogPermissionList == stopPermission {
  686. log.IsStop = 1
  687. // 如果当前时间晚于结束日期,那么实际结束日期就是今天之前一天,否则就是当天
  688. if currTime.After(log.EndDate) {
  689. log.RealEndDate = currTime.AddDate(0, 0, -1)
  690. } else {
  691. log.RealEndDate = time.Now()
  692. }
  693. log.Update([]string{"IsStop", "RealEndDate"})
  694. }
  695. }
  696. // 如果需要添加,那么将该客户品种添加1天
  697. if isAdd {
  698. }
  699. // 更新客户产品的试用天数
  700. tmpErr = models.AddCompanyProductTryOutDayTotal(v.CompanyId, v.ProductId)
  701. if tmpErr != nil {
  702. errList = append(errList, fmt.Sprint("company_id:", v.CompanyId, ";product_id:", v.ProductId, ";logId:", v.Id, ";更新客户产品的试用天数,Err:", tmpErr))
  703. continue
  704. }
  705. }
  706. return
  707. }
  708. // 权益正式客户自动转X类试用(永续)->合同到期未续约转X类试用(永续)
  709. func CompanyTryOutXClassRai(cont context.Context) (err error) {
  710. defer func() {
  711. if err != nil {
  712. go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "正式客户自动试用->合同到期未续约转试用 ErrMsg:"+err.Error(), utils.EmailSendToUsers)
  713. }
  714. }()
  715. endDate := time.Now().AddDate(0, 0, -1).Format(utils.FormatDate)
  716. items, err := models.GetCompanyNeedTryOutXClassRai(endDate)
  717. if err != nil {
  718. fmt.Println("GetCompanyNeedTryOutRai Err:" + err.Error())
  719. utils.FileLog.Info("GetCompanyNeedTryOutRai Err:%s" + err.Error())
  720. return
  721. }
  722. for k, v := range items {
  723. count, err := models.GetCompanyApprovalCount(v.CompanyId, v.ProductId)
  724. if err != nil {
  725. return err
  726. }
  727. if count > 0 {
  728. continue
  729. }
  730. fmt.Println(k, v.CompanyId)
  731. // 更新专项调研点数,需要在状态变更之前
  732. if v.ProductId == 2 {
  733. cygx.ActivitySpecialCompanyTryOutReduce(v.CompanyId)
  734. }
  735. //客户正式转试用
  736. companyReportPermissionList, err := models.CompanyTryOutXClassRai(v.CompanyId, v.ProductId)
  737. if err != nil {
  738. utils.FileLog.Info("CompanyTryOutXClassRai Err:%s" + err.Error())
  739. return err
  740. }
  741. //新增操作记录
  742. {
  743. remark := "正式转X类试用"
  744. operation := "try_out_x_class"
  745. approveContent := "X类试用"
  746. AddCompanyOperationRecord(v.CompanyId, utils.AdminId, v.ProductId, utils.AdminId, v.CompanyName,
  747. v.ProductName, utils.RealName, remark, operation, approveContent, approveContent, "", v.Status)
  748. //新增 客户产品权限 正式 转 试用 的日志
  749. for _, v := range companyReportPermissionList {
  750. _ = AddCompanyReportPermissionLog(v.CompanyReportPermissionId, v.CompanyId, v.ProductId, utils.AdminId, v.ProductName, utils.RealName, remark, operation, v.Status)
  751. }
  752. }
  753. //{
  754. // //正式转试用,删除不续约归因内容
  755. // company.DeleteCompanNoRenewedAscribe(v.CompanyId, v.ProductId)
  756. //}
  757. //正式转试用定时任务更新研选扣点
  758. {
  759. cygx.YanXuanCompanyCompanyTryOut(v.CompanyId)
  760. }
  761. }
  762. return
  763. }
  764. // 客户自动冻结->X类试用(永续)三个月结束后,进入冻结
  765. func CompanyFreezeXClassRai(cont context.Context) (err error) {
  766. defer func() {
  767. if err != nil {
  768. go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "X类试用(永续)三个月结束后,进入冻结ErrMsg:"+err.Error(), utils.EmailSendToUsers)
  769. }
  770. }()
  771. endDate := time.Now().AddDate(0, 0, -1).Format(utils.FormatDate)
  772. items, err := models.GetCompanyNeedFreezeXClassRai(endDate)
  773. if err != nil {
  774. fmt.Println("GetCompanyNeedFreezeXClassRai Err:" + err.Error())
  775. utils.FileLog.Info("GetCompanyNeedFreezeXClassRai Err:%s" + err.Error())
  776. return
  777. }
  778. fmt.Println(len(items))
  779. //return
  780. for k, v := range items {
  781. fmt.Println(k, v.CompanyId)
  782. count, err := models.GetCompanyApprovalCount(v.CompanyId, v.ProductId)
  783. if err != nil {
  784. return err
  785. }
  786. if count > 0 {
  787. continue
  788. }
  789. //试用转冻结
  790. companyReportPermissionList, err := models.CompanyFreezeXClassRai(v.CompanyId, v.ProductId)
  791. if err != nil {
  792. utils.FileLog.Info("CompanyFreeze Err:%s" + err.Error())
  793. return err
  794. }
  795. //新增操作记录
  796. {
  797. remark := "X类试用转冻结"
  798. operation := "x_class_freeze"
  799. approveContent := ""
  800. go AddCompanyOperationRecord(v.CompanyId, utils.AdminId, v.ProductId, utils.AdminId, v.CompanyName,
  801. v.ProductName, utils.RealName, remark, operation, approveContent, approveContent, "", v.Status)
  802. //新增 客户产品权限 试用 转 冻结 的日志
  803. for _, v := range companyReportPermissionList {
  804. _ = AddCompanyReportPermissionLog(v.CompanyReportPermissionId, v.CompanyId, v.ProductId, utils.AdminId, v.ProductName, utils.RealName, remark, operation, v.Status)
  805. }
  806. }
  807. }
  808. return
  809. }
  810. // 权益客户部正式转冻结
  811. func CompanyFreezeRai(cont context.Context) (err error) {
  812. defer func() {
  813. if err != nil {
  814. go alarm_msg.SendAlarmMsg("权益客户部正式转冻结失败:"+err.Error(), 2)
  815. }
  816. }()
  817. endDate := time.Now().AddDate(0, 0, -1).Format(utils.FormatDate)
  818. items, err := models.GetCompanyNeedFreezeRai(endDate)
  819. if err != nil {
  820. fmt.Println("GetCompanyNeedFreezeRai Err:" + err.Error())
  821. utils.FileLog.Info("GetCompanyNeedFreezeRai Err:%s" + err.Error())
  822. return
  823. }
  824. for k, v := range items {
  825. fmt.Println(k, v.CompanyId)
  826. // 更新专项调研点数,需要在状态变更之前
  827. if v.ProductId == 2 {
  828. cygx.ActivitySpecialCompanyTryOutReduce(v.CompanyId)
  829. }
  830. //正式转冻结
  831. companyReportPermissionList, err := models.CompanyFreezeRai(v.CompanyId, v.ProductId)
  832. if err != nil {
  833. utils.FileLog.Info("CompanyFreezeRai Err:%s" + err.Error())
  834. return err
  835. }
  836. //新增操作记录
  837. {
  838. remark := "正式转冻结"
  839. operation := "freeze"
  840. approveContent := ""
  841. go AddCompanyOperationRecord(v.CompanyId, utils.AdminId, v.ProductId, utils.AdminId, v.CompanyName,
  842. v.ProductName, utils.RealName, remark, operation, approveContent, approveContent, "", v.Status)
  843. //新增 客户产品权限 正式 转 冻结 的日志
  844. for _, v := range companyReportPermissionList {
  845. _ = AddCompanyReportPermissionLog(v.CompanyReportPermissionId, v.CompanyId, v.ProductId, utils.AdminId, v.ProductName, utils.RealName, remark, operation, v.Status)
  846. }
  847. }
  848. {
  849. //正式转试用,删除不续约归因内容
  850. company.DeleteCompanNoRenewedAscribe(v.CompanyId, v.ProductId)
  851. }
  852. //正式转试用定时任务更新研选扣点
  853. if v.ProductId == 2 {
  854. cygx.YanXuanCompanyCompanyTryOut(v.CompanyId)
  855. }
  856. }
  857. return
  858. }