auto_task_settle.go 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  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, project_type, 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. // 只有公开任务需要冻结&解冻资金
  70. if projectInfo.ProjectType == 1 {
  71. // 1. 处理商家账户金额
  72. var realPayments float64
  73. var projectTaskInfos []*entity.ProjectTaskInfo
  74. err2 := dao.Db.Model(&entity.ProjectTaskInfo{}).Where("project_id = ? and task_stage = ? ", projectId, 15).Select("real_payment").Find(&projectTaskInfos).Error
  75. if err2 != nil {
  76. continue
  77. }
  78. for _, projectTaskInfo := range projectTaskInfos {
  79. realPayments += projectTaskInfo.RealPayment
  80. }
  81. // 解冻资金
  82. _, err3 := dao.EnterpriseDao{}.UpdateEnterpriseBalanceAndFrozen2(projectInfo.EnterpriseID, projectInfo.NeedPay, realPayments)
  83. if err3 != nil {
  84. return
  85. }
  86. }
  87. // 更新任务状态为结案
  88. err4 := dao.ProjectDAO{}.UpdateProject(entity.Project{ProjectId: projectId, ProjectStatus: 10})
  89. if err4 != nil {
  90. return
  91. }
  92. // 2、处理涉及到的服务商账户金额
  93. sProjectInfos, err5 := dao.SProjectDao{}.GetSProjectByProjectId(projectId)
  94. if err5 != nil {
  95. return
  96. }
  97. for _, sProjectInfo := range sProjectInfos {
  98. var incomeStatus int64
  99. if sProjectInfo.SupplierType == 1 {
  100. incomeStatus = 5
  101. } else {
  102. incomeStatus = 1
  103. }
  104. _, err6 := dao.SupplierIncomeDao{}.CreateSupplierIncome(entity.SupplierIncome{
  105. SupplierID: sProjectInfo.SupplierID,
  106. SupplierType: sProjectInfo.SupplierType,
  107. SProjectID: sProjectInfo.SProjectID,
  108. IncomeType: 1,
  109. IncomeStatus: incomeStatus,
  110. ServiceChargeSettle: sProjectInfo.ServiceChargeSettle,
  111. })
  112. if err6 != nil {
  113. return
  114. }
  115. err7 := dao.SProjectDao{}.UpdateSProject(entity.SProjectInfo{SProjectID: sProjectInfo.SProjectID, ProjectStatus: 10})
  116. if err7 != nil {
  117. return
  118. }
  119. }
  120. }
  121. log.Println("AutoProjectSettleTask running End, Time :", time.Now())
  122. }
  123. // 定时任务3 本地生活结案与解冻处理
  124. func AutoLocalLifeSettleTask() {
  125. log.Println("AutoLocalLifeSettleTask running Start, Time :", time.Now())
  126. var localLifeInfos []*entity.LocalLifeInfo
  127. err1 := dao.Db.Model(&entity.LocalLifeInfo{}).Where("task_status = ? and settle_flag = ? ", 8, 1).Select("local_id, local_type, enterprise_id, need_pay").Find(&localLifeInfos).Error
  128. if err1 != nil {
  129. return
  130. }
  131. // 对于所有子任务结案但未解冻的本地生活项目进行处理
  132. for _, localLifeInfo := range localLifeInfos {
  133. localId := localLifeInfo.LocalID
  134. // 只有公开任务需要冻结&解冻资金
  135. if localLifeInfo.LocalType == 1 {
  136. // 1. 处理商家账户金额
  137. var realPayments float64
  138. var localTaskInfos []*entity.LocalLifeTaskInfo
  139. err2 := dao.Db.Model(&entity.LocalLifeTaskInfo{}).Where("local_id = ? and task_stage = ? ", localId, 15).Select("real_payment").Find(&localTaskInfos).Error
  140. if err2 != nil {
  141. continue
  142. }
  143. for _, localTaskInfo := range localTaskInfos {
  144. realPayments += localTaskInfo.RealPayment
  145. }
  146. // 解冻资金
  147. _, err3 := dao.EnterpriseDao{}.UpdateEnterpriseBalanceAndFrozen2(localLifeInfo.EnterpriseID, localLifeInfo.NeedPay, realPayments)
  148. if err3 != nil {
  149. continue
  150. }
  151. }
  152. // 更新任务状态为结案
  153. err4 := dao.LocalLifeDao{}.UpdateLocal(entity.LocalLifeInfo{LocalID: localId, TaskStatus: 10})
  154. if err4 != nil {
  155. return
  156. }
  157. // 2、处理涉及到的服务商账户金额
  158. sLocalLifeInfos, err5 := dao.SLocalLifeDao{}.GetSLocalLifeByLocalId(localId)
  159. if err5 != nil {
  160. return
  161. }
  162. for _, sLocalLifeInfo := range sLocalLifeInfos {
  163. var incomeStatus int64
  164. if sLocalLifeInfo.SupplierType == 1 {
  165. incomeStatus = 5
  166. } else {
  167. incomeStatus = 1
  168. }
  169. _, err6 := dao.SupplierIncomeDao{}.CreateSupplierIncome(entity.SupplierIncome{
  170. SupplierID: sLocalLifeInfo.SupplierID,
  171. SupplierType: sLocalLifeInfo.SupplierType,
  172. SLocalLifeID: sLocalLifeInfo.SLocalID,
  173. IncomeType: 3,
  174. IncomeStatus: incomeStatus,
  175. ServiceChargeSettle: sLocalLifeInfo.ServiceChargeSettle,
  176. })
  177. if err6 != nil {
  178. return
  179. }
  180. err7 := dao.SLocalLifeDao{}.UpdateSLocalLife(entity.SLocalLifeInfo{SLocalID: sLocalLifeInfo.SLocalID, TaskStatus: 10})
  181. if err7 != nil {
  182. return
  183. }
  184. }
  185. }
  186. log.Println("AutoLocalLifeSettleTask running End, Time :", time.Now())
  187. }