|
@@ -0,0 +1,188 @@
|
|
|
+package schedule
|
|
|
+
|
|
|
+import (
|
|
|
+ "github.com/robfig/cron/v3"
|
|
|
+ "log"
|
|
|
+ "time"
|
|
|
+ "youngee_b_api/app/dao"
|
|
|
+ "youngee_b_api/app/entity"
|
|
|
+)
|
|
|
+
|
|
|
+func AutoTaskSettle() error {
|
|
|
+ // 新建一个定时任务对象
|
|
|
+ crontab := cron.New(cron.WithSeconds()) // 精确到秒
|
|
|
+ spec := "0 */1 * * * ?" //cron表达式,每5分钟一次
|
|
|
+
|
|
|
+ // 添加定时任务
|
|
|
+ // 定时任务1 电商带货结案与解冻处理
|
|
|
+ _, err2 := crontab.AddFunc(spec, AutoSelectionSettleTask)
|
|
|
+ if err2 != nil {
|
|
|
+ return err2
|
|
|
+ }
|
|
|
+ // 定时任务2 品牌种草结案与解冻处理
|
|
|
+ _, err1 := crontab.AddFunc(spec, AutoProjectSettleTask)
|
|
|
+ if err1 != nil {
|
|
|
+ return err1
|
|
|
+ }
|
|
|
+ // 定时任务3 本地生活结案与解冻处理
|
|
|
+ _, err3 := crontab.AddFunc(spec, AutoLocalLifeSettleTask)
|
|
|
+ if err3 != nil {
|
|
|
+ return err3
|
|
|
+ }
|
|
|
+
|
|
|
+ // 启动定时器
|
|
|
+ crontab.Start()
|
|
|
+ // 定时任务是另起协程执行的,这里使用 select 简单阻塞.需要根据实际情况进行控制
|
|
|
+ //select {} //阻塞主线程停止
|
|
|
+ return nil
|
|
|
+}
|
|
|
+
|
|
|
+// 定时任务1 电商带货结案与解冻处理
|
|
|
+func AutoSelectionSettleTask() {
|
|
|
+ log.Println("AutoSelectionSettleTask running Start, Time :", time.Now())
|
|
|
+ var selectionInfos []*entity.SelectionInfo
|
|
|
+ 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
|
|
|
+ if err1 != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ for _, selectionInfo := range selectionInfos {
|
|
|
+ selectionID := selectionInfo.SelectionID
|
|
|
+ // 解冻资金
|
|
|
+ _, err3 := dao.EnterpriseDao{}.UpdateEnterpriseBalanceAndFrozen2(selectionInfo.EnterpriseID, selectionInfo.EstimatedCost, selectionInfo.SettlementAmount)
|
|
|
+ if err3 != nil {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ // 更新任务状态
|
|
|
+ err4 := dao.SelectionInfoDAO{}.UpdateSelectionInfo(entity.SelectionInfo{SelectionID: selectionID, SettleFlag: 1})
|
|
|
+ if err4 != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ log.Println("AutoSelectionSettleTask running End, Time :", time.Now())
|
|
|
+}
|
|
|
+
|
|
|
+// 定时任务2 品牌种草结案与解冻处理
|
|
|
+func AutoProjectSettleTask() {
|
|
|
+ log.Println("AutoProjectSettleTask running Start, Time :", time.Now())
|
|
|
+ var projectInfos []*entity.Project
|
|
|
+ err1 := dao.Db.Model(&entity.Project{}).Where("project_status = ? and settle_flag = ? ", 8, 1).Select("project_id, enterprise_id, need_pay").Find(&projectInfos).Error
|
|
|
+ if err1 != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ // 对于所有子任务结案但未解冻的品牌种草项目进行处理
|
|
|
+ for _, projectInfo := range projectInfos {
|
|
|
+ projectId := projectInfo.ProjectId
|
|
|
+ // 1. 处理商家账户金额
|
|
|
+ var realPayments float64
|
|
|
+ var projectTaskInfos []*entity.ProjectTaskInfo
|
|
|
+ err2 := dao.Db.Model(&entity.ProjectTaskInfo{}).Where("project_id = ? and task_stage = ? ", projectId, 15).Select("real_payment").Find(&projectTaskInfos).Error
|
|
|
+ if err2 != nil {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ for _, projectTaskInfo := range projectTaskInfos {
|
|
|
+ realPayments += projectTaskInfo.RealPayment
|
|
|
+ }
|
|
|
+ // 解冻资金
|
|
|
+ _, err3 := dao.EnterpriseDao{}.UpdateEnterpriseBalanceAndFrozen2(projectInfo.EnterpriseID, projectInfo.NeedPay, realPayments)
|
|
|
+ if err3 != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ // 更新任务状态为结案
|
|
|
+ err4 := dao.ProjectDAO{}.UpdateProject(entity.Project{ProjectId: projectId, ProjectStatus: 10})
|
|
|
+ if err4 != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ // 2、处理涉及到的服务商账户金额
|
|
|
+ sProjectInfos, err5 := dao.SProjectDao{}.GetSProjectByProjectId(projectId)
|
|
|
+ if err5 != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ for _, sProjectInfo := range sProjectInfos {
|
|
|
+ var incomeStatus int64
|
|
|
+ if sProjectInfo.SupplierType == 1 {
|
|
|
+ incomeStatus = 5
|
|
|
+ } else {
|
|
|
+ incomeStatus = 1
|
|
|
+ }
|
|
|
+ _, err6 := dao.SupplierIncomeDao{}.CreateSupplierIncome(entity.SupplierIncome{
|
|
|
+ SupplierID: sProjectInfo.SupplierID,
|
|
|
+ SupplierType: sProjectInfo.SupplierType,
|
|
|
+ SProjectID: sProjectInfo.SProjectID,
|
|
|
+ IncomeType: 1,
|
|
|
+ IncomeStatus: incomeStatus,
|
|
|
+ ServiceChargeSettle: sProjectInfo.ServiceChargeSettle,
|
|
|
+ })
|
|
|
+ if err6 != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ err7 := dao.SProjectDao{}.UpdateSProject(entity.SProjectInfo{SProjectID: sProjectInfo.SProjectID, ProjectStatus: 10})
|
|
|
+ if err7 != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ log.Println("AutoProjectSettleTask running End, Time :", time.Now())
|
|
|
+}
|
|
|
+
|
|
|
+// 定时任务3 本地生活结案与解冻处理
|
|
|
+func AutoLocalLifeSettleTask() {
|
|
|
+ log.Println("AutoLocalLifeSettleTask running Start, Time :", time.Now())
|
|
|
+ var localLifeInfos []*entity.LocalLifeInfo
|
|
|
+ err1 := dao.Db.Model(&entity.LocalLifeInfo{}).Where("task_status = ? and settle_flag = ? ", 8, 1).Select("local_id, enterprise_id, need_pay").Find(&localLifeInfos).Error
|
|
|
+ if err1 != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ // 对于所有子任务结案但未解冻的品牌种草项目进行处理
|
|
|
+ for _, localLifeInfo := range localLifeInfos {
|
|
|
+ localId := localLifeInfo.LocalID
|
|
|
+ // 1. 处理商家账户金额
|
|
|
+ var realPayments float64
|
|
|
+ var localTaskInfos []*entity.LocalLifeTaskInfo
|
|
|
+ err2 := dao.Db.Model(&entity.LocalLifeTaskInfo{}).Where("local_id = ? and task_stage = ? ", localId, 15).Select("real_payment").Find(&localTaskInfos).Error
|
|
|
+ if err2 != nil {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ for _, localTaskInfo := range localTaskInfos {
|
|
|
+ realPayments += localTaskInfo.RealPayment
|
|
|
+ }
|
|
|
+ // 解冻资金
|
|
|
+ _, err3 := dao.EnterpriseDao{}.UpdateEnterpriseBalanceAndFrozen2(localLifeInfo.EnterpriseID, localLifeInfo.NeedPay, realPayments)
|
|
|
+ if err3 != nil {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ // 更新任务状态为结案
|
|
|
+ err4 := dao.LocalLifeDao{}.UpdateLocal(entity.LocalLifeInfo{LocalID: localId, TaskStatus: 10})
|
|
|
+ if err4 != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ // 2、处理涉及到的服务商账户金额
|
|
|
+ sLocalLifeInfos, err5 := dao.SLocalLifeDao{}.GetSLocalLifeByLocalId(localId)
|
|
|
+ if err5 != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ for _, sLocalLifeInfo := range sLocalLifeInfos {
|
|
|
+ var incomeStatus int64
|
|
|
+ if sLocalLifeInfo.SupplierType == 1 {
|
|
|
+ incomeStatus = 5
|
|
|
+ } else {
|
|
|
+ incomeStatus = 1
|
|
|
+ }
|
|
|
+ _, err6 := dao.SupplierIncomeDao{}.CreateSupplierIncome(entity.SupplierIncome{
|
|
|
+ SupplierID: sLocalLifeInfo.SupplierID,
|
|
|
+ SupplierType: sLocalLifeInfo.SupplierType,
|
|
|
+ SLocalLifeID: sLocalLifeInfo.SLocalID,
|
|
|
+ IncomeType: 3,
|
|
|
+ IncomeStatus: incomeStatus,
|
|
|
+ ServiceChargeSettle: sLocalLifeInfo.ServiceChargeSettle,
|
|
|
+ })
|
|
|
+ if err6 != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ err7 := dao.SLocalLifeDao{}.UpdateSLocalLife(entity.SLocalLifeInfo{SLocalID: sLocalLifeInfo.SLocalID, TaskStatus: 10})
|
|
|
+ if err7 != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ log.Println("AutoLocalLifeSettleTask running End, Time :", time.Now())
|
|
|
+}
|