auto_task_settle.go 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. package schedule
  2. import (
  3. "github.com/robfig/cron/v3"
  4. "log"
  5. "time"
  6. "youngee_b_api/app/dao"
  7. "youngee_b_api/app/entity"
  8. )
  9. func AutoTaskSettle() error {
  10. // 新建一个定时任务对象
  11. crontab := cron.New(cron.WithSeconds()) // 精确到秒
  12. spec := "0 */1 * * * ?" //cron表达式,每5分钟一次
  13. // 添加定时任务
  14. // 定时任务1 电商带货结案与解冻处理
  15. _, err2 := crontab.AddFunc(spec, AutoSelectionSettleTask)
  16. if err2 != nil {
  17. return err2
  18. }
  19. // 定时任务2 品牌种草结案与解冻处理
  20. _, err1 := crontab.AddFunc(spec, AutoProjectSettleTask)
  21. if err1 != nil {
  22. return err1
  23. }
  24. // 定时任务3 本地生活结案与解冻处理
  25. _, err3 := crontab.AddFunc(spec, AutoLocalLifeSettleTask)
  26. if err3 != nil {
  27. return err3
  28. }
  29. // 启动定时器
  30. crontab.Start()
  31. // 定时任务是另起协程执行的,这里使用 select 简单阻塞.需要根据实际情况进行控制
  32. //select {} //阻塞主线程停止
  33. return nil
  34. }
  35. // 定时任务1 电商带货结案与解冻处理
  36. func AutoSelectionSettleTask() {
  37. log.Println("AutoSelectionSettleTask running Start, Time :", time.Now())
  38. var selectionInfos []*entity.SelectionInfo
  39. err1 := dao.Db.Model(&entity.SelectionInfo{}).Where("selection_status = ? and settle_flag = ? ", 8, 0).Select("selection_id, enterprise_id, estimated_cost, settlement_amount").Find(&selectionInfos).Error
  40. if err1 != nil {
  41. return
  42. }
  43. for _, selectionInfo := range selectionInfos {
  44. selectionID := selectionInfo.SelectionID
  45. // 解冻资金
  46. _, err3 := dao.EnterpriseDao{}.UpdateEnterpriseBalanceAndFrozen2(selectionInfo.EnterpriseID, selectionInfo.EstimatedCost, selectionInfo.SettlementAmount)
  47. if err3 != nil {
  48. continue
  49. }
  50. // 更新任务状态
  51. err4 := dao.SelectionInfoDAO{}.UpdateSelectionInfo(entity.SelectionInfo{SelectionID: selectionID, SettleFlag: 1})
  52. if err4 != nil {
  53. return
  54. }
  55. }
  56. log.Println("AutoSelectionSettleTask running End, Time :", time.Now())
  57. }
  58. // 定时任务2 品牌种草结案与解冻处理
  59. func AutoProjectSettleTask() {
  60. log.Println("AutoProjectSettleTask running Start, Time :", time.Now())
  61. var projectInfos []*entity.Project
  62. err1 := dao.Db.Model(&entity.Project{}).Where("project_status = ? and settle_flag = ? ", 8, 1).Select("project_id, enterprise_id, need_pay").Find(&projectInfos).Error
  63. if err1 != nil {
  64. return
  65. }
  66. // 对于所有子任务结案但未解冻的品牌种草项目进行处理
  67. for _, projectInfo := range projectInfos {
  68. projectId := projectInfo.ProjectId
  69. // 1. 处理商家账户金额
  70. var realPayments float64
  71. var projectTaskInfos []*entity.ProjectTaskInfo
  72. err2 := dao.Db.Model(&entity.ProjectTaskInfo{}).Where("project_id = ? and task_stage = ? ", projectId, 15).Select("real_payment").Find(&projectTaskInfos).Error
  73. if err2 != nil {
  74. continue
  75. }
  76. for _, projectTaskInfo := range projectTaskInfos {
  77. realPayments += projectTaskInfo.RealPayment
  78. }
  79. // 解冻资金
  80. _, err3 := dao.EnterpriseDao{}.UpdateEnterpriseBalanceAndFrozen2(projectInfo.EnterpriseID, projectInfo.NeedPay, realPayments)
  81. if err3 != nil {
  82. return
  83. }
  84. // 更新任务状态为结案
  85. err4 := dao.ProjectDAO{}.UpdateProject(entity.Project{ProjectId: projectId, ProjectStatus: 10})
  86. if err4 != nil {
  87. return
  88. }
  89. // 2、处理涉及到的服务商账户金额
  90. sProjectInfos, err5 := dao.SProjectDao{}.GetSProjectByProjectId(projectId)
  91. if err5 != nil {
  92. return
  93. }
  94. for _, sProjectInfo := range sProjectInfos {
  95. var incomeStatus int64
  96. if sProjectInfo.SupplierType == 1 {
  97. incomeStatus = 5
  98. } else {
  99. incomeStatus = 1
  100. }
  101. _, err6 := dao.SupplierIncomeDao{}.CreateSupplierIncome(entity.SupplierIncome{
  102. SupplierID: sProjectInfo.SupplierID,
  103. SupplierType: sProjectInfo.SupplierType,
  104. SProjectID: sProjectInfo.SProjectID,
  105. IncomeType: 1,
  106. IncomeStatus: incomeStatus,
  107. ServiceChargeSettle: sProjectInfo.ServiceChargeSettle,
  108. })
  109. if err6 != nil {
  110. return
  111. }
  112. err7 := dao.SProjectDao{}.UpdateSProject(entity.SProjectInfo{SProjectID: sProjectInfo.SProjectID, ProjectStatus: 10})
  113. if err7 != nil {
  114. return
  115. }
  116. }
  117. }
  118. log.Println("AutoProjectSettleTask running End, Time :", time.Now())
  119. }
  120. // 定时任务3 本地生活结案与解冻处理
  121. func AutoLocalLifeSettleTask() {
  122. log.Println("AutoLocalLifeSettleTask running Start, Time :", time.Now())
  123. var localLifeInfos []*entity.LocalLifeInfo
  124. err1 := dao.Db.Model(&entity.LocalLifeInfo{}).Where("task_status = ? and settle_flag = ? ", 8, 1).Select("local_id, enterprise_id, need_pay").Find(&localLifeInfos).Error
  125. if err1 != nil {
  126. return
  127. }
  128. // 对于所有子任务结案但未解冻的品牌种草项目进行处理
  129. for _, localLifeInfo := range localLifeInfos {
  130. localId := localLifeInfo.LocalID
  131. // 1. 处理商家账户金额
  132. var realPayments float64
  133. var localTaskInfos []*entity.LocalLifeTaskInfo
  134. err2 := dao.Db.Model(&entity.LocalLifeTaskInfo{}).Where("local_id = ? and task_stage = ? ", localId, 15).Select("real_payment").Find(&localTaskInfos).Error
  135. if err2 != nil {
  136. continue
  137. }
  138. for _, localTaskInfo := range localTaskInfos {
  139. realPayments += localTaskInfo.RealPayment
  140. }
  141. // 解冻资金
  142. _, err3 := dao.EnterpriseDao{}.UpdateEnterpriseBalanceAndFrozen2(localLifeInfo.EnterpriseID, localLifeInfo.NeedPay, realPayments)
  143. if err3 != nil {
  144. continue
  145. }
  146. // 更新任务状态为结案
  147. err4 := dao.LocalLifeDao{}.UpdateLocal(entity.LocalLifeInfo{LocalID: localId, TaskStatus: 10})
  148. if err4 != nil {
  149. return
  150. }
  151. // 2、处理涉及到的服务商账户金额
  152. sLocalLifeInfos, err5 := dao.SLocalLifeDao{}.GetSLocalLifeByLocalId(localId)
  153. if err5 != nil {
  154. return
  155. }
  156. for _, sLocalLifeInfo := range sLocalLifeInfos {
  157. var incomeStatus int64
  158. if sLocalLifeInfo.SupplierType == 1 {
  159. incomeStatus = 5
  160. } else {
  161. incomeStatus = 1
  162. }
  163. _, err6 := dao.SupplierIncomeDao{}.CreateSupplierIncome(entity.SupplierIncome{
  164. SupplierID: sLocalLifeInfo.SupplierID,
  165. SupplierType: sLocalLifeInfo.SupplierType,
  166. SLocalLifeID: sLocalLifeInfo.SLocalID,
  167. IncomeType: 3,
  168. IncomeStatus: incomeStatus,
  169. ServiceChargeSettle: sLocalLifeInfo.ServiceChargeSettle,
  170. })
  171. if err6 != nil {
  172. return
  173. }
  174. err7 := dao.SLocalLifeDao{}.UpdateSLocalLife(entity.SLocalLifeInfo{SLocalID: sLocalLifeInfo.SLocalID, TaskStatus: 10})
  175. if err7 != nil {
  176. return
  177. }
  178. }
  179. }
  180. log.Println("AutoLocalLifeSettleTask running End, Time :", time.Now())
  181. }