auto_task_settle.go 6.6 KB

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