company_product.go 14 KB

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