company_product.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467
  1. package services
  2. import (
  3. "fmt"
  4. "hongze/hongze_task/models"
  5. "hongze/hongze_task/utils"
  6. "strconv"
  7. "time"
  8. "context"
  9. )
  10. //客户自动冻结->试用两个月结束后,进入冻结
  11. func CompanyFreeze(cont context.Context) (err error) {
  12. defer func() {
  13. if err != nil {
  14. go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "试用两个月结束后,进入冻结 ErrMsg:"+err.Error(), utils.EmailSendToUsers)
  15. }
  16. }()
  17. endDate := time.Now().AddDate(0, 0, -1).Format(utils.FormatDate)
  18. items, err := models.GetCompanyNeedFreeze(endDate)
  19. if err != nil {
  20. fmt.Println("GetCompanyNeedFreeze Err:" + err.Error())
  21. utils.FileLog.Info("GetCompanyNeedFreeze Err:%s" + err.Error())
  22. return
  23. }
  24. for k, v := range items {
  25. fmt.Println(k, v.CompanyId)
  26. count, err := models.GetCompanyApprovalCount(v.CompanyId, v.ProductId)
  27. if err != nil {
  28. return err
  29. }
  30. if count > 0 {
  31. continue
  32. }
  33. //试用转冻结
  34. companyReportPermissionList, err := models.CompanyFreeze(v.CompanyId, v.ProductId)
  35. if err != nil {
  36. utils.FileLog.Info("CompanyFreeze Err:%s" + err.Error())
  37. return err
  38. }
  39. //新增操作记录
  40. {
  41. remark := "试用转冻结"
  42. operation := "freeze"
  43. approveContent := ""
  44. go AddCompanyOperationRecord(v.CompanyId, utils.AdminId, v.ProductId, utils.AdminId, v.CompanyName,
  45. v.ProductName, utils.RealName, remark, operation, approveContent, approveContent, "", v.Status)
  46. //新增 客户产品权限 试用 转 冻结 的日志
  47. for _, v := range companyReportPermissionList {
  48. _ = AddCompanyReportPermissionLog(v.CompanyReportPermissionId, v.CompanyId, v.ProductId, utils.AdminId, v.ProductName, utils.RealName, remark, operation, v.Status)
  49. }
  50. }
  51. }
  52. return
  53. }
  54. //客户自动流失->冻结超3个月未处理
  55. func CompanyLoss(cont context.Context) (err error) {
  56. defer func() {
  57. if err != nil {
  58. go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "自动流失->冻结超3个月未处理 ErrMsg:"+err.Error(), utils.EmailSendToUsers)
  59. }
  60. }()
  61. endDate := time.Now().AddDate(0, 0, -1).Format(utils.FormatDate)
  62. items, err := models.GetCompanyNeedLoss(endDate)
  63. if err != nil {
  64. fmt.Println("GetCompanyNeedLoss Err:" + err.Error())
  65. utils.FileLog.Info("GetCompanyNeedLoss Err:%s" + err.Error())
  66. return
  67. }
  68. for k, v := range items {
  69. fmt.Println(k, v.CompanyId)
  70. count, err := models.GetCompanyApprovalCount(v.CompanyId, v.ProductId)
  71. if err != nil {
  72. return err
  73. }
  74. if count > 0 {
  75. continue
  76. }
  77. err = models.CompanyLoss(v.CompanyId, v.ProductId)
  78. if err != nil {
  79. utils.FileLog.Info("CompanyLoss Err:%s" + err.Error())
  80. return err
  81. }
  82. //新增操作记录
  83. {
  84. remark := "冻结转流失"
  85. operation := "loss"
  86. approveContent := "流失"
  87. AddCompanyOperationRecord(v.CompanyId, utils.AdminId, v.ProductId, utils.AdminId, v.CompanyName,
  88. v.ProductName, utils.RealName, remark, operation, approveContent, approveContent, "", v.Status)
  89. }
  90. }
  91. return
  92. }
  93. //正式客户自动试用->合同到期未续约转试用
  94. func CompanyTryOut(cont context.Context) (err error) {
  95. defer func() {
  96. if err != nil {
  97. go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "正式客户自动试用->合同到期未续约转试用 ErrMsg:"+err.Error(), utils.EmailSendToUsers)
  98. }
  99. }()
  100. endDate := time.Now().AddDate(0, 0, -1).Format(utils.FormatDate)
  101. items, err := models.GetCompanyNeedTryOut(endDate)
  102. if err != nil {
  103. fmt.Println("GetCompanyNeedTryOut Err:" + err.Error())
  104. utils.FileLog.Info("GetCompanyNeedTryOut Err:%s" + err.Error())
  105. return
  106. }
  107. for k, v := range items {
  108. count, err := models.GetCompanyApprovalCount(v.CompanyId, v.ProductId)
  109. if err != nil {
  110. return err
  111. }
  112. if count > 0 {
  113. continue
  114. }
  115. fmt.Println(k, v.CompanyId)
  116. //客户正式转试用
  117. companyReportPermissionList, err := models.CompanyTryOut(v.CompanyId, v.ProductId)
  118. if err != nil {
  119. utils.FileLog.Info("CompanyLoss Err:%s" + err.Error())
  120. return err
  121. }
  122. //新增操作记录
  123. {
  124. remark := "正式转试用"
  125. operation := "try_out"
  126. approveContent := "试用"
  127. AddCompanyOperationRecord(v.CompanyId, utils.AdminId, v.ProductId, utils.AdminId, v.CompanyName,
  128. v.ProductName, utils.RealName, remark, operation, approveContent, approveContent, "", v.Status)
  129. //新增 客户产品权限 正式 转 试用 的日志
  130. for _, v := range companyReportPermissionList {
  131. _ = AddCompanyReportPermissionLog(v.CompanyReportPermissionId, v.CompanyId, v.ProductId, utils.AdminId, v.ProductName, utils.RealName, remark, operation, v.Status)
  132. }
  133. }
  134. }
  135. return
  136. }
  137. func AddCompanyOperationRecord(companyId, sysUserId, productId, approveAdminId int, companyName, productName, sysUserRealName, remark, operation, approveContent, approveUserRealName, approveRemark, status string) (err error) {
  138. defer func() {
  139. if err != nil {
  140. go utils.SendEmail(utils.APPNAME+"失败提醒"+utils.RunMode, "services:AddCompanyOperationRecord;Err"+err.Error(), utils.EmailSendToUsers)
  141. }
  142. }()
  143. record := new(models.CompanyOperationRecord)
  144. record.CompanyId = companyId
  145. record.CompanyName = companyName
  146. record.SysUserId = sysUserId
  147. record.SysRealName = sysUserRealName
  148. record.Remark = remark
  149. record.Operation = operation
  150. record.CreateTime = time.Now()
  151. record.ProductId = productId
  152. record.ProductName = productName
  153. record.ApproveUserId = approveAdminId
  154. record.ApproveRealName = approveUserRealName
  155. record.ApproveContent = approveContent
  156. record.ApproveRemark = approveRemark
  157. record.Status = status
  158. _, err = models.AddCompanyOperationRecord(record)
  159. return
  160. }
  161. //客户老数据同步
  162. func CompanyOldDataSync() {
  163. companyItems, err := models.GetCompanyOldDataSync()
  164. if err != nil {
  165. fmt.Println("GetCompanyOldDataSync Err:" + err.Error())
  166. return
  167. }
  168. productId := 1
  169. productName := "ficc"
  170. for k, v := range companyItems {
  171. fmt.Println(k, v.CompanyName, v.CompanyId)
  172. productItem := new(models.CompanyProduct)
  173. productItem.CompanyId = v.CompanyId
  174. productItem.ProductId = productId
  175. productItem.ProductName = productName
  176. productItem.CompanyName = v.CompanyName
  177. //客户标签,1:付费客户,2:试用客户,3:流失客户,4:潜在客户,5:永续
  178. //'试用','永续','冻结','流失','正式','潜在'
  179. status := ""
  180. if v.CompanyType == 1 {
  181. status = "正式"
  182. } else if v.CompanyType == 2 {
  183. status = "试用"
  184. } else if v.CompanyType == 3 {
  185. status = "流失"
  186. } else if v.CompanyType == 4 {
  187. status = "潜在"
  188. } else if v.CompanyType == 5 {
  189. status = "永续"
  190. } else {
  191. fmt.Println("无效的客户状态:"+status, v.CompanyType)
  192. return
  193. }
  194. if status == "" {
  195. fmt.Println("无效的客户状态:"+status, v.CompanyType)
  196. return
  197. }
  198. productItem.Status = status
  199. //获取销售
  200. seller, err := models.GetAdminByAdminId(v.SellsId)
  201. if err != nil && err.Error() != utils.ErrNoRow() {
  202. fmt.Println("获取销售失败,Err:"+err.Error(), v.SellsId)
  203. return
  204. }
  205. var adminId, groupId, departmentId int
  206. var sellerRealName string
  207. if seller == nil {
  208. fmt.Println("销售不存在:", v.SellsId)
  209. //return
  210. } else {
  211. adminId = seller.AdminId
  212. sellerRealName = seller.RealName
  213. groupId = seller.GroupId
  214. departmentId = seller.DepartmentId
  215. }
  216. productItem.SellerId = adminId
  217. productItem.SellerName = sellerRealName
  218. productItem.GroupId = groupId
  219. productItem.DepartmentId = departmentId
  220. productItem.CreateTime = time.Now()
  221. productItem.ModifyTime = time.Now()
  222. productItem.StartDate = v.StartDate
  223. productItem.EndDate = v.EndDate
  224. productItem.LoseReason = v.LoseReason
  225. productItem.LossTime = v.LossTime
  226. _, err = models.AddCompanyProduct(productItem)
  227. if err != nil {
  228. fmt.Println("新增客户产品失败,Err:" + err.Error())
  229. return
  230. }
  231. //权限处理
  232. err = models.ModifyCompanyOldPermission(v.StartDate, v.EndDate, productName, v.CompanyId, productId)
  233. if err != nil {
  234. fmt.Println("客户权限处理失败,Err:" + err.Error())
  235. return
  236. }
  237. if k > 500 {
  238. return
  239. }
  240. }
  241. }
  242. //正式/试用客户--到期提醒
  243. func CompanyRemind(cont context.Context) (err error) {
  244. defer func() {
  245. if err != nil {
  246. go utils.SendEmail(utils.APPNAME+"失败提醒"+utils.RunMode, "到期提醒失败:CompanyRemind;Err"+err.Error(), utils.EmailSendToUsers)
  247. }
  248. }()
  249. //获取销售
  250. sellers, err := models.GetSellers()
  251. for k, v := range sellers {
  252. fmt.Println(k, v.AdminId, v.Mobile)
  253. CompanyRemind30Day(v)
  254. time.Sleep(5 * time.Second)
  255. CompanyRemind15Day(v)
  256. time.Sleep(5 * time.Second)
  257. CompanyRemind7Day(v)
  258. time.Sleep(5 * time.Second)
  259. CompanyRemind1Day(v)
  260. time.Sleep(5 * time.Second)
  261. }
  262. return
  263. }
  264. //30天后到期客户
  265. func CompanyRemind30Day(seller *models.Sellers) {
  266. var err error
  267. defer func() {
  268. if err != nil {
  269. go utils.SendEmail(utils.APPNAME+"失败提醒"+utils.RunMode, "到期提醒失败:CompanyRemind;Err"+err.Error(), utils.EmailSendToUsers)
  270. }
  271. }()
  272. remindEndDate := time.Now().AddDate(0, 0, 30).Format(utils.FormatDate)
  273. //remindEndDate := "2020-12-31" //time.Now().AddDate(0, 0, 30).Format(utils.FormatDate)
  274. companyItems, err := models.GetRemindCompany(seller.AdminId, remindEndDate)
  275. if err != nil {
  276. return
  277. }
  278. emailContents := "<div><p>您有【" + strconv.Itoa(len(companyItems)) + "】 客户将于30天后到期,请注意查看</p>"
  279. emailContents += "<table border='1'><tr><td width='200'>30天后到期客户名称</td><td width='200'>到期日期</td><td width='200'>销售人员</td><td>客户类型</td></tr>"
  280. var isSend bool
  281. msgContent := ``
  282. for _, v := range companyItems {
  283. endTime := v.EndDate
  284. if v.Status == "正式" {
  285. endTime = v.ContractEndDate
  286. }
  287. emailContents += `<tr><td>` + v.CompanyName + `</td><td>` + endTime + `</td><td>` + seller.RealName + `</td><td>` + v.Status + `</td></tr>`
  288. msgContent += `客户:` + v.CompanyName + ";状态:" + v.Status + "\n"
  289. isSend = true
  290. }
  291. emailContents += "</table></br>"
  292. if isSend {
  293. if seller.Email != "" {
  294. utils.SendEmailByHongze("到期前30天提醒", emailContents, seller.Email, "", "")
  295. }
  296. if seller.OpenId != "" {
  297. first := "您有【" + strconv.Itoa(len(companyItems)) + "】 客户将于30天后到期,请注意查看"
  298. keyword1 := "到期前30天提醒"
  299. keyword2 := remindEndDate
  300. remark := msgContent
  301. openIdList := make([]*models.OpenIdList, 0)
  302. openIdItem := new(models.OpenIdList)
  303. openIdItem.OpenId = seller.OpenId
  304. openIdList = append(openIdList, openIdItem)
  305. SendWxMsgWithCompanyRemind(first, keyword1, keyword2, remark, openIdList)
  306. }
  307. }
  308. }
  309. //15天后到期客户
  310. func CompanyRemind15Day(seller *models.Sellers) {
  311. var err error
  312. defer func() {
  313. if err != nil {
  314. go utils.SendEmail(utils.APPNAME+"失败提醒"+utils.RunMode, "到期提醒失败:CompanyRemind;Err"+err.Error(), utils.EmailSendToUsers)
  315. }
  316. }()
  317. remindEndDate := time.Now().AddDate(0, 0, 15).Format(utils.FormatDate)
  318. companyItems, err := models.GetRemindCompany(seller.AdminId, remindEndDate)
  319. if err != nil {
  320. return
  321. }
  322. var isSend bool
  323. msgContent := ``
  324. emailContents := "<div><p>您有【" + strconv.Itoa(len(companyItems)) + "】 客户将于15天后到期,请注意查看</p>"
  325. emailContents += "<table border='1'><tr><td width='200'>15天后到期客户名称</td><td width='200'>到期日期</td><td width='200'>销售人员</td><td>客户类型</td></tr>"
  326. for _, v := range companyItems {
  327. endTime := v.EndDate
  328. if v.Status == "正式" {
  329. endTime = v.ContractEndDate
  330. }
  331. emailContents += `<tr><td>` + v.CompanyName + `</td><td>` + endTime + `</td><td>` + seller.RealName + `</td><td>` + v.Status + `</td></tr>`
  332. msgContent += `客户:` + v.CompanyName + ";状态:" + v.Status + "\n"
  333. isSend = true
  334. }
  335. emailContents += "</table></br>"
  336. if isSend {
  337. if seller.Email != "" {
  338. utils.SendEmailByHongze("到期前15天提醒", emailContents, seller.Email, "", "")
  339. }
  340. if seller.OpenId != "" {
  341. first := "您有【" + strconv.Itoa(len(companyItems)) + "】 客户将于15天后到期,请注意查看"
  342. keyword1 := "到期前15天提醒"
  343. keyword2 := remindEndDate
  344. remark := msgContent
  345. openIdList := make([]*models.OpenIdList, 0)
  346. openIdItem := new(models.OpenIdList)
  347. openIdItem.OpenId = seller.OpenId
  348. openIdList = append(openIdList, openIdItem)
  349. SendWxMsgWithCompanyRemind(first, keyword1, keyword2, remark, openIdList)
  350. }
  351. }
  352. }
  353. //7天后到期客户名称
  354. func CompanyRemind7Day(seller *models.Sellers) {
  355. var err error
  356. defer func() {
  357. if err != nil {
  358. go utils.SendEmail(utils.APPNAME+"失败提醒"+utils.RunMode, "到期提醒失败:CompanyRemind;Err"+err.Error(), utils.EmailSendToUsers)
  359. }
  360. }()
  361. remindEndDate := time.Now().AddDate(0, 0, 7).Format(utils.FormatDate)
  362. companyItems, err := models.GetRemindCompany(seller.AdminId, remindEndDate)
  363. if err != nil {
  364. return
  365. }
  366. var isSend bool
  367. msgContent := ``
  368. emailContents := "<div><p>您有【" + strconv.Itoa(len(companyItems)) + "】 客户将于7天后到期,请注意查看</p>"
  369. emailContents += "<table border='1'><tr><td width='200'>7天后到期客户名称</td><td width='200'>到期日期</td><td width='200'>销售人员</td><td>客户类型</td></tr>"
  370. for _, v := range companyItems {
  371. endTime := v.EndDate
  372. if v.Status == "正式" {
  373. endTime = v.ContractEndDate
  374. }
  375. emailContents += `<tr><td>` + v.CompanyName + `</td><td>` + endTime + `</td><td>` + seller.RealName + `</td><td>` + v.Status + `</td></tr>`
  376. msgContent += `客户:` + v.CompanyName + ";状态:" + v.Status + "\n"
  377. isSend = true
  378. }
  379. emailContents += "</table></br>"
  380. if isSend {
  381. if seller.Email != "" {
  382. utils.SendEmailByHongze("到期前7天提醒", emailContents, seller.Email, "", "")
  383. }
  384. if seller.OpenId != "" {
  385. first := "您有【" + strconv.Itoa(len(companyItems)) + "】 客户将于7天后到期,请注意查看"
  386. keyword1 := "到期前7天提醒"
  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, openIdList)
  394. }
  395. }
  396. }
  397. //到期当天提醒
  398. func CompanyRemind1Day(seller *models.Sellers) {
  399. var err error
  400. defer func() {
  401. if err != nil {
  402. go utils.SendEmail(utils.APPNAME+"失败提醒"+utils.RunMode, "到期提醒失败:CompanyRemind;Err"+err.Error(), utils.EmailSendToUsers)
  403. }
  404. }()
  405. remindEndDate := time.Now().AddDate(0, 0, 0).Format(utils.FormatDate)
  406. companyItems, err := models.GetRemindCompany(seller.AdminId, remindEndDate)
  407. if err != nil {
  408. return
  409. }
  410. var isSend bool
  411. msgContent := ``
  412. emailContents := "<div><p>您有【" + strconv.Itoa(len(companyItems)) + "】 客户将于今天后到期,请注意查看</p>"
  413. emailContents += "<table border='1'><tr><td width='200'>1天后到期客户名称</td><td width='200'>到期日期</td><td width='200'>销售人员</td><td>客户类型</td></tr>"
  414. for _, v := range companyItems {
  415. endTime := v.EndDate
  416. if v.Status == "正式" {
  417. endTime = v.ContractEndDate
  418. }
  419. emailContents += `<tr><td>` + v.CompanyName + `</td><td>` + endTime + `</td><td>` + seller.RealName + `</td><td>` + v.Status + `</td></tr>`
  420. msgContent += `客户:` + v.CompanyName + ";状态:" + v.Status + "\n"
  421. isSend = true
  422. }
  423. emailContents += "</table></br>"
  424. if isSend {
  425. if seller.Email != "" {
  426. utils.SendEmailByHongze("到期前1天提醒", emailContents, seller.Email, "", "")
  427. }
  428. if seller.OpenId != "" {
  429. first := "您有【" + strconv.Itoa(len(companyItems)) + "】 客户将于1天后到期,请注意查看"
  430. keyword1 := "到期前1天提醒"
  431. keyword2 := remindEndDate
  432. remark := msgContent
  433. openIdList := make([]*models.OpenIdList, 0)
  434. openIdItem := new(models.OpenIdList)
  435. openIdItem.OpenId = seller.OpenId
  436. openIdList = append(openIdList, openIdItem)
  437. SendWxMsgWithCompanyRemind(first, keyword1, keyword2, remark, openIdList)
  438. }
  439. }
  440. }