company_product.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448
  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 := "2020-12-31" //time.Now().AddDate(0, 0, 30).Format(utils.FormatDate)
  272. companyItems, err := models.GetRemindCompany(seller.AdminId, remindEndDate)
  273. if err != nil {
  274. return
  275. }
  276. emailContents := "<div><p>您有【" + strconv.Itoa(len(companyItems)) + "】 客户将于30天后到期,请注意查看</p>"
  277. emailContents += "<table border='1'><tr><td width='200'>30天后到期客户名称</td><td width='200'>到期日期</td><td width='200'>销售人员</td><td>客户类型</td></tr>"
  278. var isSend bool
  279. msgContent := ``
  280. for _, v := range companyItems {
  281. emailContents += `<tr><td>` + v.CompanyName + `</td><td>` + v.EndDate + `</td><td>` + seller.RealName + `</td><td>` + v.Status + `</td></tr>`
  282. msgContent += `客户:` + v.CompanyName + ";状态:" + v.Status + "\n"
  283. isSend = true
  284. }
  285. emailContents += "</table></br>"
  286. if isSend {
  287. if seller.Email != "" {
  288. utils.SendEmailByHongze("到期前30天提醒", emailContents, seller.Email, "", "")
  289. }
  290. if seller.OpenId != "" {
  291. first := "您有【" + strconv.Itoa(len(companyItems)) + "】 客户将于30天后到期,请注意查看"
  292. keyword1 := "到期前30天提醒"
  293. keyword2 := remindEndDate
  294. remark := msgContent
  295. openIdList := make([]*models.OpenIdList, 0)
  296. openIdItem := new(models.OpenIdList)
  297. openIdItem.OpenId = seller.OpenId
  298. openIdList = append(openIdList, openIdItem)
  299. SendWxMsgWithCompanyRemind(first, keyword1, keyword2, remark, openIdList)
  300. }
  301. }
  302. }
  303. //15天后到期客户
  304. func CompanyRemind15Day(seller *models.Sellers) {
  305. var err error
  306. defer func() {
  307. if err != nil {
  308. go utils.SendEmail(utils.APPNAME+"失败提醒"+utils.RunMode, "到期提醒失败:CompanyRemind;Err"+err.Error(), utils.EmailSendToUsers)
  309. }
  310. }()
  311. remindEndDate := time.Now().AddDate(0, 0, 15).Format(utils.FormatDate)
  312. companyItems, err := models.GetRemindCompany(seller.AdminId, remindEndDate)
  313. if err != nil {
  314. return
  315. }
  316. var isSend bool
  317. msgContent := ``
  318. emailContents := "<div><p>您有【" + strconv.Itoa(len(companyItems)) + "】 客户将于15天后到期,请注意查看</p>"
  319. emailContents += "<table border='1'><tr><td width='200'>15天后到期客户名称</td><td width='200'>到期日期</td><td width='200'>销售人员</td><td>客户类型</td></tr>"
  320. for _, v := range companyItems {
  321. emailContents += `<tr><td>` + v.CompanyName + `</td><td>` + v.EndDate + `</td><td>` + seller.RealName + `</td><td>` + v.Status + `</td></tr>`
  322. msgContent += `客户:` + v.CompanyName + ";状态:" + v.Status + "\n"
  323. isSend = true
  324. }
  325. emailContents += "</table></br>"
  326. if isSend {
  327. if seller.Email != "" {
  328. utils.SendEmailByHongze("到期前15天提醒", emailContents, seller.Email, "", "")
  329. }
  330. if seller.OpenId != "" {
  331. first := "您有【" + strconv.Itoa(len(companyItems)) + "】 客户将于15天后到期,请注意查看"
  332. keyword1 := "到期前15天提醒"
  333. keyword2 := remindEndDate
  334. remark := msgContent
  335. openIdList := make([]*models.OpenIdList, 0)
  336. openIdItem := new(models.OpenIdList)
  337. openIdItem.OpenId = seller.OpenId
  338. openIdList = append(openIdList, openIdItem)
  339. SendWxMsgWithCompanyRemind(first, keyword1, keyword2, remark, openIdList)
  340. }
  341. }
  342. }
  343. //7天后到期客户名称
  344. func CompanyRemind7Day(seller *models.Sellers) {
  345. var err error
  346. defer func() {
  347. if err != nil {
  348. go utils.SendEmail(utils.APPNAME+"失败提醒"+utils.RunMode, "到期提醒失败:CompanyRemind;Err"+err.Error(), utils.EmailSendToUsers)
  349. }
  350. }()
  351. remindEndDate := time.Now().AddDate(0, 0, 7).Format(utils.FormatDate)
  352. companyItems, err := models.GetRemindCompany(seller.AdminId, remindEndDate)
  353. if err != nil {
  354. return
  355. }
  356. var isSend bool
  357. msgContent := ``
  358. emailContents := "<div><p>您有【" + strconv.Itoa(len(companyItems)) + "】 客户将于7天后到期,请注意查看</p>"
  359. emailContents += "<table border='1'><tr><td width='200'>7天后到期客户名称</td><td width='200'>到期日期</td><td width='200'>销售人员</td><td>客户类型</td></tr>"
  360. for _, v := range companyItems {
  361. emailContents += `<tr><td>` + v.CompanyName + `</td><td>` + v.EndDate + `</td><td>` + seller.RealName + `</td><td>` + v.Status + `</td></tr>`
  362. msgContent += `客户:` + v.CompanyName + ";状态:" + v.Status + "\n"
  363. isSend = true
  364. }
  365. emailContents += "</table></br>"
  366. if isSend {
  367. if seller.Email != "" {
  368. utils.SendEmailByHongze("到期前7天提醒", emailContents, seller.Email, "", "")
  369. }
  370. if seller.OpenId != "" {
  371. first := "您有【" + strconv.Itoa(len(companyItems)) + "】 客户将于7天后到期,请注意查看"
  372. keyword1 := "到期前7天提醒"
  373. keyword2 := remindEndDate
  374. remark := msgContent
  375. openIdList := make([]*models.OpenIdList, 0)
  376. openIdItem := new(models.OpenIdList)
  377. openIdItem.OpenId = seller.OpenId
  378. openIdList = append(openIdList, openIdItem)
  379. SendWxMsgWithCompanyRemind(first, keyword1, keyword2, remark, openIdList)
  380. }
  381. }
  382. }
  383. //到期当天提醒
  384. func CompanyRemind1Day(seller *models.Sellers) {
  385. var err error
  386. defer func() {
  387. if err != nil {
  388. go utils.SendEmail(utils.APPNAME+"失败提醒"+utils.RunMode, "到期提醒失败:CompanyRemind;Err"+err.Error(), utils.EmailSendToUsers)
  389. }
  390. }()
  391. remindEndDate := time.Now().AddDate(0, 0, 0).Format(utils.FormatDate)
  392. companyItems, err := models.GetRemindCompany(seller.AdminId, remindEndDate)
  393. if err != nil {
  394. return
  395. }
  396. var isSend bool
  397. msgContent := ``
  398. emailContents := "<div><p>您有【" + strconv.Itoa(len(companyItems)) + "】 客户将于今天后到期,请注意查看</p>"
  399. emailContents += "<table border='1'><tr><td width='200'>1天后到期客户名称</td><td width='200'>到期日期</td><td width='200'>销售人员</td><td>客户类型</td></tr>"
  400. for _, v := range companyItems {
  401. emailContents += `<tr><td>` + v.CompanyName + `</td><td>` + v.EndDate + `</td><td>` + seller.RealName + `</td><td>` + v.Status + `</td></tr>`
  402. msgContent += `客户:` + v.CompanyName + ";状态:" + v.Status + "\n"
  403. isSend = true
  404. }
  405. emailContents += "</table></br>"
  406. if isSend {
  407. if seller.Email != "" {
  408. utils.SendEmailByHongze("到期前1天提醒", emailContents, seller.Email, "", "")
  409. }
  410. if seller.OpenId != "" {
  411. first := "您有【" + strconv.Itoa(len(companyItems)) + "】 客户将于1天后到期,请注意查看"
  412. keyword1 := "到期前1天提醒"
  413. keyword2 := remindEndDate
  414. remark := msgContent
  415. openIdList := make([]*models.OpenIdList, 0)
  416. openIdItem := new(models.OpenIdList)
  417. openIdItem.OpenId = seller.OpenId
  418. openIdList = append(openIdList, openIdItem)
  419. SendWxMsgWithCompanyRemind(first, keyword1, keyword2, remark, openIdList)
  420. }
  421. }
  422. }