123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188 |
- 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())
- }
|