Browse Source

本地生活失效自动执行

Ethan 6 months ago
parent
commit
8bf864eb7a

+ 11 - 0
app/dao/local_life_dao.go

@@ -2,6 +2,7 @@ package dao
 
 import (
 	"errors"
+	"fmt"
 	"gorm.io/gorm"
 	"time"
 	"youngee_b_api/app/entity"
@@ -151,3 +152,13 @@ func (d LocalLifeDao) DeleteLocalLife(localId string) (*string, error) {
 	}
 	return &localId, nil
 }
+
+// 获取公开种草中全部指定状态值的项目
+func (d LocalLifeDao) GetLocalLifeList(value int64, fieldName string) ([]*entity.LocalLifeInfo, error) {
+	var localLifeInfos []*entity.LocalLifeInfo
+	err := Db.Model(entity.LocalLifeInfo{}).Where(fmt.Sprintf("local_type = ? AND %s = ? ", fieldName), 1, value).Find(&localLifeInfos).Error
+	if err != nil {
+		return nil, err
+	}
+	return localLifeInfos, nil
+}

+ 1 - 0
app/entity/local_life_info.go

@@ -34,6 +34,7 @@ type LocalLifeInfo struct {
 	AutoFailAt          time.Time `gorm:"column:auto_fail_at"`                              // 失效自动处理时间
 	AutoTaskID          int64     `gorm:"column:auto_task_id;default:0;NOT NULL"`           // 定时任务id
 	AutoDefaultID       int64     `gorm:"column:auto_default_id;default:0;NOT NULL"`        // 违约状态id
+	FailReason          int64     `gorm:"column:fail_reason"`                               // 失效原因,1、2分别表示逾期未支付、项目存在风险
 	PaymentAmount       float64   `gorm:"column:payment_amount"`                            // 支付金额
 	PayAt               time.Time `gorm:"column:pay_at"`                                    // 支付时间
 	SubmitAt            time.Time `gorm:"column:submit_at"`                                 // 提交审核时间

+ 83 - 0
app/entity/local_life_task_info.go

@@ -0,0 +1,83 @@
+package entity
+
+// Code generated by sql2gorm. DO NOT EDIT.
+import "time"
+
+type LocalLifeTaskInfo struct {
+	TaskID                 string    `gorm:"column:task_id;primary_key"`                            // 任务id
+	LocalID                string    `gorm:"column:local_id;NOT NULL"`                              // 项目id
+	TalentID               string    `gorm:"column:talent_id;NOT NULL"`                             // 达人id
+	AccountID              int64     `gorm:"column:account_id;NOT NULL"`                            // 账号id
+	StrategyID             int64     `gorm:"column:strategy_id"`                                    // 报名选择的招募策略id
+	TalentPlatformInfoSnap string    `gorm:"column:talent_platform_info_snap;NOT NULL"`             // 达人平台信息快照
+	TalentPersonalInfoSnap string    `gorm:"column:talent_personal_info_snap;NOT NULL"`             // 达人个人信息快照
+	TalentPostAddrSnap     string    `gorm:"column:talent_post_addr_snap;NOT NULL"`                 // 收货地址快照
+	TaskReward             string    `gorm:"column:task_reward;NOT NULL"`                           // 达人报酬(3.0未用)
+	SettleAmount           string    `gorm:"column:settle_amount;NOT NULL"`                         // 达人实际所得(自动填充)(扣除违约扣款)
+	AllPayment             string    `gorm:"column:all_payment;NOT NULL"`                           // 企业支付(3.0未用)
+	RealPayment            string    `gorm:"column:real_payment;NOT NULL"`                          // 企业实际支付(加上服务商的服务费)(扣除违约扣款)
+	ServiceRate            int64     `gorm:"column:service_rate"`                                   // 服务费率,千分之
+	ServiceCharge          string    `gorm:"column:service_charge"`                                 // 服务费
+	RealServiceCharge      string    `gorm:"column:real_service_charge"`                            // 服务商实际所得服务费(扣除违约)
+	FeeForm                int64     `gorm:"column:fee_form"`                                       // 稿费形式,1,2,3分别代表产品置换、一口价、自报价
+	ErrBreakRate           int64     `gorm:"column:err_break_rate;default:0;NOT NULL"`              // 未上传类型违约扣款比例,百分之
+	ScriptBreakRate        int64     `gorm:"column:script_break_rate;default:0;NOT NULL"`           // 脚本上传超时违约扣款比例,百分之
+	SketchBreakRate        int64     `gorm:"column:sketch_break_rate;default:0;NOT NULL"`           // 初稿上传超时违约扣款比例,百分之
+	LinkBreakRate          int64     `gorm:"column:link_break_rate;default:0;NOT NULL"`             // 链接上传超时违约扣款比例,百分之
+	DataBreakRate          int64     `gorm:"column:data_break_rate;default:0;NOT NULL"`             // 数据上传超时违约扣款比例,百分之
+	TaskStage              int64     `gorm:"column:task_stage;NOT NULL"`                            // 任务阶段,1:已报名, 2:申请成功, 3:申请失败, 4:待预约探店, 5:预约确认中 6:  , 7:待传脚本, 8:脚本待审, 9:待传初稿, 10:初稿待审, 11:待传链接, 12:链接待审, 13:待传数据, 14:数据待审, 15:已结案, 16:解约, 17:终止合作(过渡态)
+	TaskStatus             int64     `gorm:"column:task_status;default:1;NOT NULL"`                 // 商家任务状态 1待选 2已选 3落选
+	LogisticsStatus        int64     `gorm:"column:logistics_status;default:1"`                     // 发货状态 1 待发货 2已发货 3 已签收
+	BookStatus             uint      `gorm:"column:book_status;default:1"`                          // 预约探店状态 1-5分别代表待预约、已预约、待修改、已修改、已通过
+	SketchStatus           uint      `gorm:"column:sketch_status;default:1"`                        // 初稿上传状态 1-5分别代表待添加、已添加、待修改、已修改、已通过
+	LinkStatus             uint      `gorm:"column:link_status;default:1"`                          // 链接上传状态 1-5分别代表待添加、已添加、待修改、已修改、已通过
+	DataStatus             uint      `gorm:"column:data_status;default:1"`                          // 数据上传状态 1-5分别代表待添加、已添加、待修改、已修改、已通过
+	CompleteStatus         int64     `gorm:"column:complete_status;default:1"`                      // 结束方式 1未结束 2正常结束 3反选失败 4被解约
+	UpdateAt               time.Time `gorm:"column:update_at"`                                      // 更新时间
+	CreateDate             time.Time `gorm:"column:create_date;default:CURRENT_TIMESTAMP;NOT NULL"` // 创建时间,即报名时间
+	SelectDate             time.Time `gorm:"column:select_date"`                                    // 反选时间,即任务开始执行时间
+	DeliveryDate           time.Time `gorm:"column:delivery_date"`                                  // 发货时间
+	CompleteDate           time.Time `gorm:"column:complete_date"`                                  // 结束时间
+	WithdrawDate           time.Time `gorm:"column:withdraw_date"`                                  // 提现时间
+	CurDefaultType         int64     `gorm:"column:cur_default_type"`                               // 当前违约类型 0未违约 1脚本超时违约 2脚本未上传违约 3初稿超时违约 4初稿未上传违约 5链接超时违约 6链接未上传违约 7数据超时违约 8数据未上传违约 9解约待处理 10解约
+	WithdrawStatus         int64     `gorm:"column:withdraw_status;default:1"`                      // 提现状态,1-4分别代表不可提现、可提现、提现中、已提现
+	LeadTeamID             string    `gorm:"column:lead_team_id"`                                   // 作为团长的young之团id,对应younggee_talent_team中的team_id字段
+	TeamID                 string    `gorm:"column:team_id"`                                        // 作为团员的young之团id,对应younggee_talent_team中的team_id字段
+	SettleStatus           int64     `gorm:"column:settle_status;default:1"`                        // 结算状态,1、2分别表示待结算、已结算
+	TeamIncome             string    `gorm:"column:team_income"`                                    // young之团团长现金收益
+	TeamPoint              int64     `gorm:"column:team_point"`                                     // young之团团长积分收益
+	CurBreakAt             time.Time `gorm:"column:cur_break_at"`                                   // 当前阶段截止时间
+	SupplierID             int64     `gorm:"column:supplier_id;default:0"`                          // 服务商ID
+	SupplierStatus         int64     `gorm:"column:supplier_status;default:0"`                      // 服务商任务状态 0表示达人来源非服务商 1待选 2已选 3落选
+	DraftFee               string    `gorm:"column:draft_fee;default:0.00"`                         // 达人稿费,达人所见的稿费金额
+	SignedTime             time.Time `gorm:"column:signed_time"`                                    // 签收时间
+	FansNum                int64     `gorm:"column:fans_num"`                                       // 粉丝数
+	VoteAvg                int64     `gorm:"column:vote_avg"`                                       // 平均点赞数
+	CommitAvg              int64     `gorm:"column:commit_avg"`                                     // 平均评论数
+	BOperator              string    `gorm:"column:b_operator"`                                     // 商家确定达人操作人ID
+	BOperatorType          int64     `gorm:"column:b_operator_type;default:0"`                      // 商家操作人类型,1商家用户,2商家子账号,3管理后台
+	SOperator              int64     `gorm:"column:s_operator;default:0"`                           // 服务商提报达人操作人ID
+	SOperatorType          int64     `gorm:"column:s_operator_type;default:0"`                      // 服务商操作人类型,1服务商主账号,2服务商子账号,3管理后台
+	OpenID                 string    `gorm:"column:open_id"`                                        // 达人报名的快手唯一标识
+	SProjectID             int64     `gorm:"column:s_project_id"`                                   // 服务商种草任务ID
+	SupportFee             string    `gorm:"column:support_fee"`                                    // 提报价格(达人自报价经过计算后,)
+	SketchMissingTime      time.Time `gorm:"column:sketch_missing_time"`                            // 未传初稿违约时间
+	SketchMissingStatus    int64     `gorm:"column:sketch_missing_status;default:0"`                // 未传初稿违约状态,0无违约,1有违约
+	LinkMissingTime        time.Time `gorm:"column:link_missing_time"`                              // 未发作品违约时间
+	LinkMissingStatus      int64     `gorm:"column:link_missing_status;default:0"`                  // 未发作品违约状态,0无违约,1有违约
+	DataMissingTime        time.Time `gorm:"column:data_missing_time"`                              // 未传数据违约时间
+	DataMissingStatus      int64     `gorm:"column:data_missing_status;default:0"`                  // 未传数据违约状态,0无违约,1有违约
+	TerminateOperatorType  int64     `gorm:"column:terminate_operator_type"`                        // 终止合作操作人类型,1商家用户,2商家子账号,3管理后台
+	TerminateOperator      string    `gorm:"column:terminate_operator"`                             // 终止合作操作人ID
+	TerminateReason        string    `gorm:"column:terminate_reason"`                               // 终止理由
+	TerminateTime          time.Time `gorm:"column:terminate_time"`                                 // 终止合作时间
+	CancelOperatorType     int64     `gorm:"column:cancel_operator_type"`                           // 解约操作人类型,1商家用户,2商家子账号,3管理后台
+	CancelOperator         string    `gorm:"column:cancel_operator"`                                // 解约操作人ID
+	CancelReason           string    `gorm:"column:cancel_reason"`                                  // 解约原因
+	CancelTime             time.Time `gorm:"column:cancel_time"`                                    // 解约时间
+	PlatformID             int64     `gorm:"column:platform_id;NOT NULL"`                           // 平台id
+}
+
+func (m *LocalLifeTaskInfo) TableName() string {
+	return "youngee_local_task_info"
+}

+ 46 - 8
app/schedule/auto_task1.go

@@ -18,7 +18,7 @@ func AutoTask1() error {
 
 	// 添加定时任务
 	// 定时任务1  品牌种草失效自动处理
-	_, err1 := crontab.AddFunc(spec, AutoInvalidTask)
+	_, err1 := crontab.AddFunc(spec, AutoSelectionInvalidTask)
 	if err1 != nil {
 		return err1
 	}
@@ -27,6 +27,11 @@ func AutoTask1() error {
 	if err2 != nil {
 		return err2
 	}
+	// 定时任务3  本地生活失效自动处理
+	_, err3 := crontab.AddFunc(spec, AutoLocalLifeInvalidTask)
+	if err3 != nil {
+		return err3
+	}
 
 	// 启动定时器
 	crontab.Start()
@@ -36,8 +41,8 @@ func AutoTask1() error {
 }
 
 // 定时任务1  品牌种草失效自动处理
-func AutoInvalidTask() {
-	log.Println("AutoInvalidTask running Start, Time :", time.Now())
+func AutoProjectInvalidTask() {
+	log.Println("AutoProjectInvalidTask running Start, Time :", time.Now())
 	var projectInfos []*entity.Project
 	projectInfos, _ = dao.ProjectDAO{}.GetProjectList(6, "project_status")
 	// 对于所有未支付的品牌种草项目进行处理
@@ -53,19 +58,19 @@ func AutoInvalidTask() {
 		}
 		projectNeedMod := entity.Project{}
 		dao.Db.Where("project_id = ?", projectId).First(&projectNeedMod)
-		fmt.Println(fmt.Sprintf("品牌种草项目 %s 失效自动处理时间为:%s", projectId, projectNeedMod.AutoFailAt))
+		//fmt.Println(fmt.Sprintf("品牌种草项目 %s 失效自动处理时间为:%s", projectId, projectNeedMod.AutoFailAt))
 		// 如果失效自动处理的时间不为空
 		if !projectNeedMod.AutoFailAt.IsZero() {
 			timeNow := time.Now()
 			// 如果 未失效 && 已经过了失效自动处理的时间
-			if projectNeedMod.ProjectStatus < 8 && projectNeedMod.AutoFailAt.Sub(time.Now()) <= 0 {
-				dao.Db.Model(entity.Project{}).Where("project_id = ?", projectId).Updates(&entity.Project{ProjectStatus: 8, FinishAt: timeInvalid, FailReason: 1})
+			if projectNeedMod.ProjectStatus < 9 && projectNeedMod.AutoFailAt.Sub(time.Now()) <= 0 {
+				dao.Db.Model(entity.Project{}).Where("project_id = ?", projectId).Updates(&entity.Project{ProjectStatus: 9, FinishAt: timeInvalid, FailReason: 1})
 				fmt.Println(fmt.Sprintf("已更新品牌种草项目 %s 状态为超时未支付的失效状态", projectId))
 				dao.Db.Model(entity.ProjectTaskInfo{}).Where("project_id = ?", projectId).Updates(entity.ProjectTaskInfo{TaskStage: 3, CompleteStatus: 3, CompleteDate: timeNow})
 			}
 		}
 	}
-	log.Println("AutoInvalidTask running End, Time :", time.Now())
+	log.Println("AutoProjectInvalidTask running End, Time :", time.Now())
 }
 
 // 定时任务2  电商带货失效自动处理
@@ -86,7 +91,7 @@ func AutoSelectionInvalidTask() {
 		}
 		selectionInfoNeedMod := entity.SelectionInfo{}
 		dao.Db.Where("selection_id = ?", selectionId).First(&selectionInfoNeedMod)
-		fmt.Println(fmt.Sprintf("电商带货项目 %s 失效自动处理时间为:%s", selectionId, selectionInfoNeedMod.AutoFailAt))
+		//fmt.Println(fmt.Sprintf("电商带货项目 %s 失效自动处理时间为:%s", selectionId, selectionInfoNeedMod.AutoFailAt))
 		// 如果失效自动处理的时间不为空
 		if !selectionInfoNeedMod.AutoFailAt.IsZero() {
 			timeNow := time.Now()
@@ -100,3 +105,36 @@ func AutoSelectionInvalidTask() {
 	}
 	log.Println("AutoSelectionInvalidTask running End, Time :", time.Now())
 }
+
+// 定时任务3  本地生活失效自动处理
+func AutoLocalLifeInvalidTask() {
+	log.Println("AutoLocalLifeInvalidTask running Start, Time :", time.Now())
+	var localLifeInfos []*entity.LocalLifeInfo
+	localLifeInfos, _ = dao.LocalLifeDao{}.GetLocalLifeList(6, "task_status")
+	// 对于所有未支付的本地生活项目进行处理
+	for _, localLifeInfo := range localLifeInfos {
+		localId := localLifeInfo.LocalID
+		autoTaskId := localLifeInfo.AutoTaskID
+		autoTaskInfo := dao.InfoAutoTaskDao{}.GetValueByIdFieldName(autoTaskId, "invalid")
+		dd, _ := time.ParseDuration(conv.MustString(autoTaskInfo.Invalid, "") + "h")
+		// 失效时间计算:任务截止时间 + 设置的失效自动执行时间
+		timeInvalid := localLifeInfo.RecruitDdl.Add(dd)
+		if localLifeInfo.AutoFailAt.IsZero() {
+			dao.Db.Model(&entity.LocalLifeInfo{}).Where("local_id = ?", localId).Updates(&entity.LocalLifeInfo{AutoFailAt: timeInvalid})
+		}
+		localLifeNeedMod := entity.LocalLifeInfo{}
+		dao.Db.Where("local_id = ?", localId).First(&localLifeNeedMod)
+		//fmt.Println(fmt.Sprintf("本地生活项目 %s 失效自动处理时间为:%s", localId, localLifeNeedMod.AutoFailAt))
+		// 如果失效自动处理的时间不为空
+		if !localLifeNeedMod.AutoFailAt.IsZero() {
+			timeNow := time.Now()
+			// 如果 未失效 && 已经过了失效自动处理的时间
+			if localLifeNeedMod.TaskStatus < 9 && localLifeNeedMod.AutoFailAt.Sub(time.Now()) <= 0 {
+				dao.Db.Model(entity.LocalLifeInfo{}).Where("local_id = ?", localId).Updates(&entity.LocalLifeInfo{TaskStatus: 9, FinishAt: timeInvalid, FailReason: 1})
+				fmt.Println(fmt.Sprintf("已更新本地生活项目 %s 状态为超时未支付的失效状态", localId))
+				dao.Db.Model(entity.LocalLifeTaskInfo{}).Where("local_id = ?", localId).Updates(entity.LocalLifeTaskInfo{TaskStage: 3, CompleteStatus: 3, CompleteDate: timeNow})
+			}
+		}
+	}
+	log.Println("AutoLocalLifeInvalidTask running End, Time :", time.Now())
+}

+ 1 - 1
app/vo/re_local_detail.go

@@ -7,7 +7,7 @@ import (
 type ReLocalDetail struct {
 	// 系统信息
 	LocalId           string  `json:"localId"`           // 项目id
-	LocalStatus       int64   `json:"localStatus"`       // 项目状态,1-10分别代表创建中、待审核、审核通过、招募中、招募完毕、待支付、已支付、失效、执行中、已结案
+	LocalStatus       int64   `json:"localStatus"`       // 项目状态,1-10分别代表创建中、待审核、审核通过、招募中、招募完毕、待支付、已支付、执行中、失效、已结案
 	LocalPlatform     int64   `json:"localPlatform"`     //  项目平台,1-7分别代表红book、抖音、微博、快手、b站、大众点评、知乎
 	CreatedAt         string  `json:"createdAt"`         // 创建时间
 	CreatorName       string  `json:"creatorName"`       // 创建者

+ 1 - 1
app/vo/re_project_detail.go

@@ -7,7 +7,7 @@ import (
 type ReProjectDetail struct {
 	// 系统信息
 	ProjectId         string  `json:"projectId"`         // 项目id 生成规则:年(2位)+一年中的第几天(3位)+5位数随机数,雪花算法也可,生成10位订单号
-	ProjectStatus     int64   `json:"projectStatus"`     // 项目状态,1-10分别代表创建中、待审核、审核通过、招募中、招募完毕、待支付、已支付、失效、执行中、已结案
+	ProjectStatus     int64   `json:"projectStatus"`     // 项目状态,1-10分别代表创建中、待审核、审核通过、招募中、招募完毕、待支付、已支付、执行中、失效、已结案
 	ProjectPlatform   int64   `json:"projectPlatform"`   //  项目平台,1-7分别代表红book、抖音、微博、快手、b站、大众点评、知乎
 	CreatedAt         string  `json:"createdAt"`         // 创建时间
 	CreatorName       string  `json:"creatorName"`       // 创建者