company_product.go 16 KB

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