Jelajahi Sumber

Merge branch 'feature_yf' of HolaBIP/youngee_m_api into develop

houyunfeng 2 tahun lalu
induk
melakukan
29e319efe8

+ 3 - 1
config/init.go

@@ -2,13 +2,14 @@ package config
 
 import (
 	"fmt"
-	"gopkg.in/yaml.v2"
 	"io/ioutil"
 	"os"
 	"youngee_m_api/db"
 	"youngee_m_api/model/system_model"
 	"youngee_m_api/redis"
 	"youngee_m_api/service"
+
+	"gopkg.in/yaml.v2"
 )
 
 func Init() *system_model.Server {
@@ -34,6 +35,7 @@ func loadExternelConfig(config *system_model.Config) {
 	redis.Init(config.Redis)
 	service.LoginAuthInit(config.Server.Session)
 	//service.SendCodeInit(config.Server.Session)
+	service.QrCodeInit(config.Server.Session)
 }
 
 func getEnv() string {

+ 59 - 32
db/default.go

@@ -15,6 +15,7 @@ import (
 
 	"github.com/caixw/lib.go/conv"
 	"github.com/sirupsen/logrus"
+	"gorm.io/gorm"
 )
 
 func CountDefaultNum(ctx context.Context) (error, *http_model.CountNumOfDefaultsResponse) {
@@ -161,7 +162,7 @@ func BreachPending(ctx context.Context, pageSize, pageNum int32, req *http_model
 		BreachPendingPreview.TalentPhone = talentIdToTalentPhoneMap[taskIdToTalentIdMap[contractInfo.TaskID]]
 		BreachPendingPreview.LinkInfo = taskIdToDefaultInfo[contractInfo.TaskID]
 		BreachPendingPreview.Price = taskIdToTaskInfoMap[contractInfo.TaskID].AllPayment
-		BreachPendingPreview.SettlementAmount = taskIdToTaskInfoMap[contractInfo.TaskID].SettleAmount
+		BreachPendingPreview.SettlementAmount = taskIdToTaskInfoMap[contractInfo.TaskID].RealPayment
 		BreachPendingPreview.DefaultAt = conv.MustString(contractInfo.BreakAt, "")[0:19]
 		BreachPendingPreview.TerminateAt = conv.MustString(contractInfo.TerminateAt, "")[0:19]
 		BreachPendingPreviews = append(BreachPendingPreviews, BreachPendingPreview)
@@ -182,47 +183,73 @@ func ContractBreach(ctx context.Context, req *http_model.ContractBreachRequest)
 		logrus.WithContext(ctx).Errorf("[BreachPending] error query mysql total, err:%+v", err)
 		return err
 	}
-	var taskId string
-	db.Model(gorm_model.YoungeeContractInfo{}).Select("task_id").Where("contract_id IN ?", req.ContractIds).Find(&taskId)
-	if req.DefaultStatus == 5 {
-		db1 := GetReadDB(ctx)
-		var projectId string
-		var autoDefaultId, feeForm int
-		db1.Model(gorm_model.YoungeeTaskInfo{}).Select("project_id").Where("task_id = ?", taskId).Find(&projectId)
-		db2 := GetReadDB(ctx)
-		db2.Model(gorm_model.ProjectInfo{}).Select("auto_default_id").Where("project_id = ?", projectId).Find(&autoDefaultId)
-		var rateInfo gorm_model.InfoAutoDefaultHandle
-		db3 := GetReadDB(ctx)
-		db3.Model(gorm_model.InfoAutoDefaultHandle{}).Where("auto_default_id = ?", autoDefaultId).Find(&rateInfo)
-		db4 := GetReadDB(ctx)
-		db4.Model(gorm_model.YoungeeTaskInfo{}).Select("fee_form").Where("task_id = ?", taskId).Find(&feeForm)
-		if feeForm == 1 {
+	var taskIds []string
+	db.Model(gorm_model.YoungeeContractInfo{}).Select("task_id").Where("contract_id IN ?", req.ContractIds).Find(&taskIds)
+	for _, taskId := range taskIds {
+		if req.DefaultStatus == 5 {
+			var taskInfo gorm_model.YoungeeTaskInfo
+			var enterpriseId string
+
+			db1 := GetReadDB(ctx)
+			db1.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", taskId).Find(&taskInfo)
+
+			db2 := GetReadDB(ctx)
+			db2.Model(gorm_model.ProjectInfo{}).Select("enterprise_id").Where("project_id = ?", taskInfo.ProjectId).Find(&enterpriseId)
+
+			db3 := GetReadDB(ctx)
+			err := db3.Model(gorm_model.Enterprise{}).Where("enterprise_id = ?", enterpriseId).Updates(
+				map[string]interface{}{
+					"frozen_balance":    gorm.Expr("frozen_balance - ?", taskInfo.RealPayment),
+					"available_balance": gorm.Expr("available_balance + ?", taskInfo.RealPayment)}).Error
+			if err != nil {
+				logrus.WithContext(ctx).Errorf("[BreachPending] error update Enterprise, err:%+v", err)
+				return err
+			}
+
+			db4 := GetReadDB(ctx)
 			if breakType == 1 {
-				db4.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", taskId).Updates(gorm_model.YoungeeTaskInfo{
-					ErrBreakRate: rateInfo.ScriptReplaceNotUpload, CurDefaultType: 2})
+				err = db4.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", taskId).Updates(gorm_model.YoungeeTaskInfo{CurDefaultType: 2, TaskStage: 16}).Error
 			} else if breakType == 2 {
-				db4.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", taskId).Updates(gorm_model.YoungeeTaskInfo{
-					ErrBreakRate: rateInfo.SketchReplaceNotUpload, CurDefaultType: 4})
+				err = db4.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", taskId).Updates(gorm_model.YoungeeTaskInfo{CurDefaultType: 4, TaskStage: 16}).Error
 			} else if breakType == 3 {
-				db4.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", taskId).Updates(gorm_model.YoungeeTaskInfo{
-					ErrBreakRate: rateInfo.LinkReplaceNotUpload, CurDefaultType: 6})
+				err = db4.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", taskId).Updates(gorm_model.YoungeeTaskInfo{CurDefaultType: 6, TaskStage: 16}).Error
 			} else if breakType == 4 {
-				db4.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", taskId).Updates(gorm_model.YoungeeTaskInfo{
-					ErrBreakRate: rateInfo.DataReplaceNotUpload, CurDefaultType: 8})
+				err = db4.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", taskId).Updates(gorm_model.YoungeeTaskInfo{CurDefaultType: 8, TaskStage: 16}).Error
+			}
+			if err != nil {
+				logrus.WithContext(ctx).Errorf("[BreachPending] error update YoungeeTaskInfo, err:%+v", err)
+				return err
+			}
+			settleAmount := taskInfo.TaskReward * (1.0 - float64(taskInfo.LinkBreakRate+taskInfo.DataBreakRate+taskInfo.SketchBreakRate+taskInfo.ScriptBreakRate+taskInfo.ErrBreakRate)/100)
+			if settleAmount <= 0 {
+				settleAmount = float64(0.01)
+			}
+			db5 := GetReadDB(ctx)
+			err = db5.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", taskId).Updates(gorm_model.YoungeeTaskInfo{SettleAmount: settleAmount}).Error
+			if err != nil {
+				logrus.WithContext(ctx).Errorf("[BreachPending] error update YoungeeTaskInfo, err:%+v", err)
+				return err
+			}
+
+			err = SetProjectFinish(context.Background(), taskInfo.ProjectId)
+			if err != nil {
+				logrus.WithContext(ctx).Errorf("[BreachPending] call SetProjectFinish error, err:%+v", err)
+				return err
 			}
 		} else {
+			db4 := GetReadDB(ctx)
 			if breakType == 1 {
-				db4.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", taskId).Updates(gorm_model.YoungeeTaskInfo{
-					ErrBreakRate: rateInfo.ScriptOtherNotUpload, CurDefaultType: 2})
+				err = db4.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", taskId).Updates(gorm_model.YoungeeTaskInfo{CurDefaultType: 1}).Error
 			} else if breakType == 2 {
-				db4.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", taskId).Updates(gorm_model.YoungeeTaskInfo{
-					ErrBreakRate: rateInfo.SketchOtherNotUpload, CurDefaultType: 4})
+				err = db4.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", taskId).Updates(gorm_model.YoungeeTaskInfo{CurDefaultType: 3}).Error
 			} else if breakType == 3 {
-				db4.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", taskId).Updates(gorm_model.YoungeeTaskInfo{
-					ErrBreakRate: rateInfo.LinkOtherNotUpload, CurDefaultType: 6})
+				err = db4.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", taskId).Updates(gorm_model.YoungeeTaskInfo{CurDefaultType: 5}).Error
 			} else if breakType == 4 {
-				db4.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", taskId).Updates(gorm_model.YoungeeTaskInfo{
-					ErrBreakRate: rateInfo.DataOtherNotUpload, CurDefaultType: 8})
+				err = db4.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", taskId).Updates(gorm_model.YoungeeTaskInfo{CurDefaultType: 7}).Error
+			}
+			if err != nil {
+				logrus.WithContext(ctx).Errorf("[BreachPending] error update YoungeeTaskInfo, err:%+v", err)
+				return err
 			}
 		}
 	}

+ 10 - 3
db/finance.go

@@ -3,9 +3,6 @@ package db
 import (
 	"context"
 	"fmt"
-	"github.com/caixw/lib.go/conv"
-	"github.com/sirupsen/logrus"
-	"gorm.io/gorm"
 	"reflect"
 	"strconv"
 	"strings"
@@ -15,6 +12,10 @@ import (
 	"youngee_m_api/model/gorm_model"
 	"youngee_m_api/model/http_model"
 	"youngee_m_api/util"
+
+	"github.com/caixw/lib.go/conv"
+	"github.com/sirupsen/logrus"
+	"gorm.io/gorm"
 )
 
 func GetWithdrawRecords(ctx context.Context, pageSize, pageNum int32, req *http_model.WithdrawalRecordsRequest, condition *common_model.WithdrawRecordsCondition) (*http_model.WithdrawalRecordsPreview, error) {
@@ -153,6 +154,12 @@ func ConfirmWithdrawal(ctx context.Context, withdrawId string) error {
 	for _, taskIdList := range taskIdLists {
 		db1 := GetReadDB(ctx)
 		db1.Debug().Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", taskIdList).Updates(gorm_model.YoungeeTaskInfo{WithdrawStatus: 4})
+
+		err := CreateMessageByTaskId(ctx, 6, 1, taskIdList)
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[ConfirmWithdrawal] call CreateMessageByTaskId error,err:%+v", err)
+			return err
+		}
 	}
 	db3 := GetReadDB(ctx)
 	db3.Debug().Model(gorm_model.YoungeeTalentInfo{}).Where("id = ?", withdrawInfo.TalentID).Updates(

+ 6 - 1
db/logistics.go

@@ -4,6 +4,7 @@ import (
 	"context"
 	"fmt"
 	"reflect"
+	"strconv"
 	"strings"
 	"time"
 	"youngee_m_api/model/common_model"
@@ -12,7 +13,9 @@ import (
 	"youngee_m_api/pack"
 	"youngee_m_api/util"
 
+	"github.com/caixw/lib.go/conv"
 	"github.com/sirupsen/logrus"
+	"github.com/tidwall/gjson"
 )
 
 //新增
@@ -127,9 +130,11 @@ func GetTaskLogisticsList(ctx context.Context, projectID string, pageSize, pageN
 		TaskLogistics := new(http_model.TaskLogistics)
 		TaskLogistics.Talent = taskMap[taskId]
 		TaskLogistics.Logistics = logisticsMap[taskId]
+		TalentPostAddrSnap := TaskLogistics.Talent.TalentPostAddrSnap
+		regionCode, _ := strconv.Atoi(conv.MustString(gjson.Get(TalentPostAddrSnap, "region_code"), ""))
+		TaskLogistics.Region = GetRegion(ctx, regionCode)
 		TaskLogisticss = append(TaskLogisticss, TaskLogistics)
 	}
-
 	taskLogisticss = pack.TaskLogisticsToTaskInfo(TaskLogisticss)
 
 	for _, v := range taskLogisticss {

+ 74 - 0
db/message.go

@@ -0,0 +1,74 @@
+package db
+
+import (
+	"context"
+	"fmt"
+	"time"
+	"youngee_m_api/model/gorm_model"
+
+	"github.com/sirupsen/logrus"
+)
+
+// 通过taskId查询talentId,插入新消息
+func CreateMessageByTaskId(ctx context.Context, messageId int, messageType int, taskId string) error {
+	db := GetReadDB(ctx)
+	taskInfo := gorm_model.YoungeeTaskInfo{}
+	err := db.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", taskId).Find(&taskInfo).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[CreateMessageByTask] error read mysql, err:%+v", err)
+		return err
+	}
+
+	db1 := GetReadDB(ctx)
+	var projectName string
+	err = db1.Model(gorm_model.ProjectInfo{}).Select("project_name").Where("project_id = ?", taskInfo.ProjectId).Find(&projectName).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[CreateMessageByTask] error read mysql, err:%+v", err)
+		return err
+	}
+	fmt.Printf("project_name: %+v, project_id: %+v\n", projectName, taskInfo.ProjectId)
+	messageInfo := gorm_model.YounggeeMessageInfo{
+		MessageID:   messageId,
+		MessageType: messageType,
+		CreatedAt:   time.Now(),
+		TalentID:    taskInfo.TalentId,
+		ProjectName: projectName,
+		IsReaded:    0,
+		IsDeleted:   0,
+	}
+	db2 := GetReadDB(ctx)
+	err = db2.Model(gorm_model.YounggeeMessageInfo{}).Create(&messageInfo).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[CreateMessageByTask] error create mysql, err:%+v", err)
+		return err
+	}
+	return nil
+}
+
+// 插入新消息
+func CreateMessage(ctx context.Context, messageId int, messageType int, talentId string, projectId string) error {
+	db := GetReadDB(ctx)
+	var projectName string
+	err := db.Model(gorm_model.ProjectInfo{}).Select("project_name").Where("project_id = ?", projectId).Find(&projectName).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[CreateMessageByTask] error read mysql, err:%+v", err)
+		return err
+	}
+
+	messageInfo := gorm_model.YounggeeMessageInfo{
+		MessageID:   messageId,
+		MessageType: messageType,
+		CreatedAt:   time.Now(),
+		TalentID:    talentId,
+		ProjectName: projectName,
+		IsReaded:    0,
+		IsDeleted:   0,
+	}
+	db1 := GetReadDB(ctx)
+	err = db1.Model(gorm_model.YounggeeMessageInfo{}).Create(&messageInfo).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[CreateMessageByTask] error create mysql, err:%+v", err)
+		return err
+	}
+	return nil
+}

+ 435 - 120
db/operate.go

@@ -298,10 +298,6 @@ func GetSignInOfflineTask(projectForm int32) error {
 						db5 := GetReadDB(context.Background())
 						db5.Model(gorm_model.YoungeeTaskLogistics{}).Where("logistics_id = ?", logisticInfo.LogisticsID).
 							Updates(&gorm_model.YoungeeTaskLogistics{AutoSignAt: &t})
-						err = CreateTaskLog(context.Background(), taskInfo.TaskId, "签收时间")
-						if err != nil {
-							logrus.WithContext(context.Background()).Errorf("[Script service] call CreateTaskLog error,err:%+v", err)
-						}
 						fmt.Println("已添加自动签收时间")
 					}
 				}
@@ -321,9 +317,15 @@ func GetSignInOfflineTask(projectForm int32) error {
 		if logisticInfo.SignedTime.IsZero() {
 			db6 := GetReadDB(context.Background())
 			db6.Model(gorm_model.YoungeeTaskLogistics{}).Where("logistics_id = ?", logisticInfo.LogisticsID).Updates(&gorm_model.YoungeeTaskLogistics{SignedTime: time.Now(), Status: 1})
+
 			err = CreateTaskLog(context.Background(), logisticInfo.TaskID, "签收时间")
 			if err != nil {
-				logrus.WithContext(context.Background()).Errorf("[Script service] call CreateTaskLog error,err:%+v", err)
+				logrus.WithContext(context.Background()).Errorf("[operate db] call CreateTaskLog error,err:%+v", err)
+			}
+
+			err = CreateMessageByTaskId(context.Background(), 9, 2, logisticInfo.TaskID)
+			if err != nil {
+				logrus.WithContext(context.Background()).Errorf("[operate db] call CreateMessageByTaskId error,err:%+v", err)
 			}
 			fmt.Println("已更新签收时间")
 		}
@@ -432,7 +434,12 @@ func GetAutoReviewTask(contentType int32) error {
 		for _, taskId := range taskIds {
 			err = CreateTaskLog(context.Background(), taskId, "脚本通过")
 			if err != nil {
-				logrus.WithContext(context.Background()).Errorf("[Script service] call CreateTaskLog error,err:%+v", err)
+				logrus.WithContext(context.Background()).Errorf("[operate db] call CreateTaskLog error,err:%+v", err)
+			}
+
+			err = CreateMessageByTaskId(context.Background(), 2, 1, taskId)
+			if err != nil {
+				logrus.WithContext(context.Background()).Errorf("[operate db] call CreateMessageByTaskId error,err:%+v", err)
 			}
 		}
 		if len(taskIds) != 0 {
@@ -516,7 +523,11 @@ func GetAutoReviewTask(contentType int32) error {
 		for _, taskId := range taskIds {
 			err = CreateTaskLog(context.Background(), taskId, "初稿通过")
 			if err != nil {
-				logrus.WithContext(context.Background()).Errorf("[Script service] call CreateTaskLog error,err:%+v", err)
+				logrus.WithContext(context.Background()).Errorf("[operate db] call CreateTaskLog error,err:%+v", err)
+			}
+			err = CreateMessageByTaskId(context.Background(), 3, 1, taskId)
+			if err != nil {
+				logrus.WithContext(context.Background()).Errorf("[operate db] call CreateMessageByTaskId error,err:%+v", err)
 			}
 		}
 		if len(taskIds) != 0 {
@@ -603,7 +614,11 @@ func GetAutoPostReviewTask() error {
 	for _, taskId := range taskIds {
 		err = CreateTaskLog(context.Background(), taskId, "链接通过")
 		if err != nil {
-			logrus.WithContext(context.Background()).Errorf("[Script service] call CreateTaskLog error,err:%+v", err)
+			logrus.WithContext(context.Background()).Errorf("[operate db] call CreateTaskLog error,err:%+v", err)
+		}
+		err = CreateMessageByTaskId(context.Background(), 4, 1, taskId)
+		if err != nil {
+			logrus.WithContext(context.Background()).Errorf("[operate db] call CreateMessageByTaskId error,err:%+v", err)
 		}
 	}
 	if len(taskIds) != 0 {
@@ -702,6 +717,10 @@ func GetAutoCaseCloseTask() error {
 		if err != nil {
 			logrus.WithContext(context.Background()).Errorf("[auto] call CreateTaskLog error,err:%+v", err)
 		}
+		err = CreateMessageByTaskId(context.Background(), 5, 1, taskId)
+		if err != nil {
+			logrus.WithContext(context.Background()).Errorf("[operate db] call CreateMessageByTaskId error,err:%+v", err)
+		}
 	}
 	err = SetTalentIncome(context.Background(), taskIds)
 	if err != nil {
@@ -874,6 +893,7 @@ func GetAutoDraftDefaultInPicTask() error {
 	}
 	for _, projectId := range projectIds {
 		db1 := GetReadDB(context.Background())
+
 		var taskInfos []gorm_model.YoungeeTaskInfo
 		db1.Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? AND task_status = ? AND task_stage = ? AND cur_default_type = ?", projectId, 2, 9, 0).Find(&taskInfos)
 		for _, taskInfo := range taskInfos {
@@ -904,13 +924,22 @@ func GetAutoDraftDefaultInPicTask() error {
 		db3.Model(gorm_model.YoungeeTaskLogistics{}).Where("task_id = ?", taskNeedModId).First(&taskLogisticNeedMod)
 
 		// 查询违约扣款比例
+		autoDefaultHandle := gorm_model.InfoAutoDefaultHandle{}
+		db6 := GetReadDB(context.Background())
+		db6.Model(gorm_model.InfoAutoDefaultHandle{}).Where("auto_default_id = ?", projectIdToAutoDefaultIdMap[TaskIdToProjectId[taskNeedModId]]).Find(&autoDefaultHandle)
+
 		var sketchDefaultRate int
+		var sketchErrRate int
 		if taskIdToFeeFormMap[taskNeedModId] == 1 { // 稿费形式为产品置换
-			db6 := GetReadDB(context.Background())
-			db6.Model(gorm_model.InfoAutoDefaultHandle{}).Select("script_replace_time_out").Where("auto_default_id = ?", projectIdToAutoDefaultIdMap[TaskIdToProjectId[taskNeedModId]]).Find(&sketchDefaultRate)
+			sketchDefaultRate = autoDefaultHandle.SketchReplaceTimeOut
+			sketchErrRate = autoDefaultHandle.SketchReplaceNotUpload
+			// db6 := GetReadDB(context.Background())
+			// db6.Model(gorm_model.InfoAutoDefaultHandle{}).Select("sketch_replace_time_out", "sketch_replace_not_upload").Where("auto_default_id = ?", projectIdToAutoDefaultIdMap[TaskIdToProjectId[taskNeedModId]]).Find(&autoDefaultHandle)
 		} else { // 稿费形式为其他
-			db6 := GetReadDB(context.Background())
-			db6.Model(gorm_model.InfoAutoDefaultHandle{}).Select("script_other_time_out").Where("auto_default_id = ?", projectIdToAutoDefaultIdMap[TaskIdToProjectId[taskNeedModId]]).Find(&sketchDefaultRate)
+			sketchDefaultRate = autoDefaultHandle.SketchOtherTimeOut
+			sketchErrRate = autoDefaultHandle.SketchOtherNotUpload
+			// db6 := GetReadDB(context.Background())
+			// db6.Model(gorm_model.InfoAutoDefaultHandle{}).Select("sketch_other_time_out", "sketch_other_not_upload").Where("auto_default_id = ?", projectIdToAutoDefaultIdMap[TaskIdToProjectId[taskNeedModId]]).Find(&sketchDefaultRate, &sketchErrRate)
 		}
 
 		//	添加初稿违约自动处理时间
@@ -941,12 +970,25 @@ func GetAutoDraftDefaultInPicTask() error {
 				return err2
 			}
 			settleAmount := taskInfo.TaskReward * (1.0 - float64(taskInfo.LinkBreakRate+taskInfo.DataBreakRate+sketchDefaultRate+taskInfo.ScriptBreakRate)/100)
-			if settleAmount < 0 {
+			if settleAmount <= 0 {
 				settleAmount = float64(0.01)
 			}
+			realPayment := taskInfo.AllPayment * (1.0 - float64(sketchErrRate)/100)
+			if realPayment <= 0 {
+				realPayment = float64(0.01)
+			}
 			db8 := GetReadDB(context.Background())
 			db8.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", taskLogisticNeedMod.TaskID).Updates(
-				&gorm_model.YoungeeTaskInfo{CurDefaultType: 3, SketchBreakRate: sketchDefaultRate, SettleAmount: settleAmount})
+				&gorm_model.YoungeeTaskInfo{CurDefaultType: 3, SketchBreakRate: sketchDefaultRate, SettleAmount: settleAmount, ErrBreakRate: sketchErrRate, RealPayment: realPayment})
+
+			err = CreateTaskLog(context.Background(), taskLogisticNeedMod.TaskID, "初稿逾期")
+			if err != nil {
+				logrus.WithContext(context.Background()).Errorf("[operate db] call CreateTaskLog error,err:%+v", err)
+			}
+			err = CreateMessageByTaskId(context.Background(), 22, 4, taskLogisticNeedMod.TaskID)
+			if err != nil {
+				logrus.WithContext(context.Background()).Errorf("[operate db] call CreateMessageByTaskId error,err:%+v", err)
+			}
 			fmt.Println("已创建图文类型的初稿违约记录")
 		}
 	}
@@ -959,13 +1001,22 @@ func GetAutoDraftDefaultInPicTask() error {
 		dd, _ := time.ParseDuration(conv.MustString(DraftDefaultInMv, "") + "h")
 
 		// 查询违约扣款比例
+		autoDefaultHandle := gorm_model.InfoAutoDefaultHandle{}
+		db6 := GetReadDB(context.Background())
+		db6.Model(gorm_model.InfoAutoDefaultHandle{}).Where("auto_default_id = ?", projectIdToAutoDefaultIdMap[TaskIdToProjectId[submitTaskNeedModId]]).Find(&autoDefaultHandle)
+
 		var sketchDefaultRate int
+		var sketchErrRate int
 		if taskIdToFeeFormMap[submitTaskNeedModId] == 1 {
-			db6 := GetReadDB(context.Background())
-			db6.Model(gorm_model.InfoAutoDefaultHandle{}).Select("script_replace_time_out").Where("auto_default_id = ?", projectIdToAutoDefaultIdMap[TaskIdToProjectId[submitTaskNeedModId]]).Find(&sketchDefaultRate)
+			sketchDefaultRate = autoDefaultHandle.SketchReplaceTimeOut
+			sketchErrRate = autoDefaultHandle.SketchReplaceNotUpload
+			// db6 := GetReadDB(context.Background())
+			// db6.Model(gorm_model.InfoAutoDefaultHandle{}).Select("sketch_replace_time_out", "sketch_replace_not_upload").Where("auto_default_id = ?", projectIdToAutoDefaultIdMap[TaskIdToProjectId[submitTaskNeedModId]]).Find(&sketchDefaultRate, &sketchErrRate)
 		} else {
-			db6 := GetReadDB(context.Background())
-			db6.Model(gorm_model.InfoAutoDefaultHandle{}).Select("script_other_time_out").Where("auto_default_id = ?", projectIdToAutoDefaultIdMap[TaskIdToProjectId[submitTaskNeedModId]]).Find(&sketchDefaultRate)
+			sketchDefaultRate = autoDefaultHandle.SketchOtherTimeOut
+			sketchErrRate = autoDefaultHandle.SketchOtherNotUpload
+			// db6 := GetReadDB(context.Background())
+			// db6.Model(gorm_model.InfoAutoDefaultHandle{}).Select("sketch_other_time_out", "sketch_other_not_upload").Where("auto_default_id = ?", projectIdToAutoDefaultIdMap[TaskIdToProjectId[submitTaskNeedModId]]).Find(&sketchDefaultRate, &sketchErrRate)
 		}
 		//	添加初稿违约自动处理时间
 		db1 := GetReadDB(context.Background())
@@ -995,15 +1046,27 @@ func GetAutoDraftDefaultInPicTask() error {
 				return err2
 			}
 			settleAmount := taskInfo.TaskReward * (1.0 - float64(sketchDefaultRate+taskInfo.DataBreakRate+taskInfo.LinkBreakRate+taskInfo.ScriptBreakRate)/100)
-			if settleAmount < 0 {
+			if settleAmount <= 0 {
 				settleAmount = float64(0.01)
 			}
+			realPayment := taskInfo.AllPayment * (1.0 - float64(sketchErrRate)/100)
+			if realPayment <= 0 {
+				realPayment = float64(0.01)
+			}
 			db3 := GetReadDB(context.Background())
 			err2 = db3.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", submitTaskNeedModId).Updates(
-				&gorm_model.YoungeeTaskInfo{CurDefaultType: 3, SketchBreakRate: sketchDefaultRate, SettleAmount: settleAmount}).Error
+				&gorm_model.YoungeeTaskInfo{CurDefaultType: 3, SketchBreakRate: sketchDefaultRate, SettleAmount: settleAmount, ErrBreakRate: sketchErrRate, RealPayment: realPayment}).Error
 			if err2 != nil {
 				return err2
 			}
+			err = CreateTaskLog(context.Background(), submitTaskNeedModId, "初稿逾期")
+			if err != nil {
+				logrus.WithContext(context.Background()).Errorf("[operate db] call CreateTaskLog error,err:%+v", err)
+			}
+			err = CreateMessageByTaskId(context.Background(), 22, 4, submitTaskNeedModId)
+			if err != nil {
+				logrus.WithContext(context.Background()).Errorf("[operate db] call CreateMessageByTaskId error,err:%+v", err)
+			}
 			fmt.Println("创建已提交初稿的图文类型的初稿违约记录")
 		}
 	}
@@ -1013,11 +1076,12 @@ func GetAutoDraftDefaultInPicTask() error {
 // 视频-初稿超时违约判断
 func GetAutoDraftDefaultInMvTask() error {
 	db := GetReadDB(context.Background())
-	var VideoProjectIds []string
-	err := db.Select("project_id").Model(gorm_model.ProjectInfo{}).Where("project_type = ? AND content_type = ? ", 1, 2).Find(&VideoProjectIds).Error
+	var projectInfos []*gorm_model.ProjectInfo
+	err := db.Model(gorm_model.ProjectInfo{}).Where("project_type = ? AND content_type = ? ", 1, 2).Find(&projectInfos).Error
 	if err != nil {
 		return err
 	}
+	var projectIds []string
 	// 任务id 对 项目id 的map
 	taskIdToProjectIdMap := map[string]string{}
 	// 项目id 对 定时任务id 的map
@@ -1027,24 +1091,22 @@ func GetAutoDraftDefaultInMvTask() error {
 	// taskId 对 稿费形式的 map
 	taskIdToFeeFormMap := make(map[string]int)
 	var videoTaskIds []string
-
 	// 构造map及list
-	for _, VideoProjectId := range VideoProjectIds {
-		db2 := GetReadDB(context.Background())
-		autoIds := gorm_model.ProjectInfo{}
-		db2.Model(&gorm_model.ProjectInfo{}).Select([]string{"auto_task_id", "auto_default_id"}).Where("project_id = ?", VideoProjectId).First(&autoIds)
-		projectIdToAutoTaskIdMap[VideoProjectId] = int(autoIds.AutoTaskID)
-		projectIdToAutoDefaultIdMap[VideoProjectId] = int(autoIds.AutoDefaultID)
+	for _, projectInfo := range projectInfos {
+		projectIds = append(projectIds, projectInfo.ProjectID)
+		projectIdToAutoTaskIdMap[projectInfo.ProjectID] = int(projectInfo.AutoTaskID)
+		projectIdToAutoDefaultIdMap[projectInfo.ProjectID] = int(projectInfo.AutoDefaultID)
 
 		var videoTaskInfos []*gorm_model.YoungeeTaskInfo
 		db1 := GetReadDB(context.Background())
-		db1.Model(&gorm_model.YoungeeTaskInfo{}).Where("project_id = ? AND task_status = ? AND task_stage = ? AND cur_default_type = ? ", VideoProjectId, 2, 9, 0).Find(&videoTaskInfos)
+		db1.Model(&gorm_model.YoungeeTaskInfo{}).Where("project_id = ? AND task_status = ? AND task_stage = ? AND cur_default_type = ? ", projectInfo.ProjectID, 2, 9, 0).Find(&videoTaskInfos)
 		for _, videoTaskInfo := range videoTaskInfos {
-			taskIdToProjectIdMap[videoTaskInfo.TaskId] = VideoProjectId
+			taskIdToProjectIdMap[videoTaskInfo.TaskId] = projectInfo.ProjectID
 			taskIdToFeeFormMap[videoTaskInfo.TaskId] = videoTaskInfo.FeeForm
 			videoTaskIds = append(videoTaskIds, videoTaskInfo.TaskId)
 		}
 	}
+
 	// 首次提交初稿的任务记录id
 	var videoTaskNeedModIds []string
 	// 已提交初稿的任务记录id
@@ -1068,13 +1130,23 @@ func GetAutoDraftDefaultInMvTask() error {
 		var DraftDefaultInMv int32
 		db2.Model(&gorm_model.InfoAutoTask{}).Select("draft_default_in_mv").Where("auto_task_id = ?", projectIdToAutoTaskIdMap[taskIdToProjectIdMap[videoTaskNeedModId]]).First(&DraftDefaultInMv)
 		dd, _ := time.ParseDuration(conv.MustString(DraftDefaultInMv, "") + "h")
+
+		autoDefaultHandle := gorm_model.InfoAutoDefaultHandle{}
+		db6 := GetReadDB(context.Background())
+		db6.Model(gorm_model.InfoAutoDefaultHandle{}).Where("auto_default_id = ?", projectIdToAutoDefaultIdMap[taskIdToProjectIdMap[videoTaskNeedModId]]).Find(&autoDefaultHandle)
+
 		var sketchDefaultRate int
+		var sketchErrRate int
 		if taskIdToFeeFormMap[videoTaskNeedModId] == 1 {
-			db6 := GetReadDB(context.Background())
-			db6.Model(gorm_model.InfoAutoDefaultHandle{}).Select("script_replace_time_out").Where("auto_default_id = ?", projectIdToAutoDefaultIdMap[taskIdToProjectIdMap[videoTaskNeedModId]]).Find(&sketchDefaultRate)
+			sketchDefaultRate = autoDefaultHandle.SketchReplaceTimeOut
+			sketchErrRate = autoDefaultHandle.SketchReplaceNotUpload
+			// db6 := GetReadDB(context.Background())
+			// db6.Model(gorm_model.InfoAutoDefaultHandle{}).Select("sketch_replace_time_out", "sketch_replace_not_upload").Where("auto_default_id = ?", projectIdToAutoDefaultIdMap[taskIdToProjectIdMap[videoTaskNeedModId]]).Find(&sketchDefaultRate, &sketchErrRate)
 		} else {
-			db6 := GetReadDB(context.Background())
-			db6.Model(gorm_model.InfoAutoDefaultHandle{}).Select("script_other_time_out").Where("auto_default_id = ?", projectIdToAutoDefaultIdMap[taskIdToProjectIdMap[videoTaskNeedModId]]).Find(&sketchDefaultRate)
+			sketchDefaultRate = autoDefaultHandle.SketchOtherTimeOut
+			sketchErrRate = autoDefaultHandle.SketchOtherNotUpload
+			// db6 := GetReadDB(context.Background())
+			// db6.Model(gorm_model.InfoAutoDefaultHandle{}).Select("sketch_other_time_out", "sketch_other_not_upload").Where("auto_default_id = ?", projectIdToAutoDefaultIdMap[taskIdToProjectIdMap[videoTaskNeedModId]]).Find(&sketchDefaultRate, &sketchErrRate)
 		}
 		db1 := GetReadDB(context.Background())
 		var taskScriptInfo gorm_model.YounggeeScriptInfo
@@ -1099,15 +1171,27 @@ func GetAutoDraftDefaultInMvTask() error {
 				return err2
 			}
 			settleAmount := taskInfo.TaskReward * (1.0 - float64(taskInfo.LinkBreakRate+taskInfo.DataBreakRate+sketchDefaultRate+taskInfo.ScriptBreakRate)/100)
-			if settleAmount < 0 {
+			if settleAmount <= 0 {
 				settleAmount = 0.01
 			}
+			realPayment := taskInfo.AllPayment * (1.0 - float64(sketchErrRate)/100)
+			if realPayment <= 0 {
+				realPayment = float64(0.01)
+			}
 			db3 := GetReadDB(context.Background())
 			err2 = db3.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", videoTaskNeedModId).Updates(
-				&gorm_model.YoungeeTaskInfo{CurDefaultType: 3, SketchBreakRate: sketchDefaultRate, SettleAmount: settleAmount}).Error
+				&gorm_model.YoungeeTaskInfo{CurDefaultType: 3, SketchBreakRate: sketchDefaultRate, SettleAmount: settleAmount, ErrBreakRate: sketchErrRate, RealPayment: realPayment}).Error
 			if err2 != nil {
 				return err2
 			}
+			err = CreateTaskLog(context.Background(), videoTaskNeedModId, "初稿逾期")
+			if err != nil {
+				logrus.WithContext(context.Background()).Errorf("[operate db] call CreateTaskLog error,err:%+v", err)
+			}
+			err = CreateMessageByTaskId(context.Background(), 22, 4, videoTaskNeedModId)
+			if err != nil {
+				logrus.WithContext(context.Background()).Errorf("[operate db] call CreateMessageByTaskId error,err:%+v", err)
+			}
 			fmt.Println("已创建视频类型的初稿违约记录")
 		}
 	}
@@ -1118,13 +1202,23 @@ func GetAutoDraftDefaultInMvTask() error {
 		var DraftDefaultInMv int32
 		db2.Model(&gorm_model.InfoAutoTask{}).Select("draft_default_in_mv").Where("auto_task_id = ?", projectIdToAutoTaskIdMap[taskIdToProjectIdMap[submitVideoTaskNeedModId]]).First(&DraftDefaultInMv)
 		dd, _ := time.ParseDuration(conv.MustString(DraftDefaultInMv, "") + "h")
+
+		autoDefaultHandle := gorm_model.InfoAutoDefaultHandle{}
+		db6 := GetReadDB(context.Background())
+		db6.Model(gorm_model.InfoAutoDefaultHandle{}).Where("auto_default_id = ?", projectIdToAutoDefaultIdMap[taskIdToProjectIdMap[submitVideoTaskNeedModId]]).Find(&autoDefaultHandle)
+
 		var sketchDefaultRate int
+		var sketchErrRate int
 		if taskIdToFeeFormMap[submitVideoTaskNeedModId] == 1 {
-			db6 := GetReadDB(context.Background())
-			db6.Model(gorm_model.InfoAutoDefaultHandle{}).Select("script_replace_time_out").Where("auto_default_id = ?", projectIdToAutoDefaultIdMap[taskIdToProjectIdMap[submitVideoTaskNeedModId]]).Find(&sketchDefaultRate)
+			sketchDefaultRate = autoDefaultHandle.SketchReplaceTimeOut
+			sketchErrRate = autoDefaultHandle.SketchReplaceNotUpload
+			// db6 := GetReadDB(context.Background())
+			// db6.Model(gorm_model.InfoAutoDefaultHandle{}).Select("sketch_replace_time_out", "sketch_replace_not_upload").Where("auto_default_id = ?", projectIdToAutoDefaultIdMap[taskIdToProjectIdMap[submitVideoTaskNeedModId]]).Find(&sketchDefaultRate, &sketchErrRate)
 		} else {
-			db6 := GetReadDB(context.Background())
-			db6.Model(gorm_model.InfoAutoDefaultHandle{}).Select("script_other_time_out").Where("auto_default_id = ?", projectIdToAutoDefaultIdMap[taskIdToProjectIdMap[submitVideoTaskNeedModId]]).Find(&sketchDefaultRate)
+			sketchDefaultRate = autoDefaultHandle.SketchOtherTimeOut
+			sketchErrRate = autoDefaultHandle.SketchOtherNotUpload
+			// db6 := GetReadDB(context.Background())
+			// db6.Model(gorm_model.InfoAutoDefaultHandle{}).Select("sketch_other_time_out", "sketch_other_not_upload").Where("auto_default_id = ?", projectIdToAutoDefaultIdMap[taskIdToProjectIdMap[submitVideoTaskNeedModId]]).Find(&sketchDefaultRate, &sketchErrRate)
 		}
 		db1 := GetReadDB(context.Background())
 		var taskSketchInfo gorm_model.YounggeeSketchInfo
@@ -1151,28 +1245,42 @@ func GetAutoDraftDefaultInMvTask() error {
 				return err2
 			}
 			settleAmount := taskInfo.TaskReward * (1.0 - float64(taskInfo.LinkBreakRate+taskInfo.DataBreakRate+sketchDefaultRate+taskInfo.ScriptBreakRate)/100)
-			if settleAmount < 0 {
+			if settleAmount <= 0 {
 				settleAmount = 0.01
 			}
+			realPayment := taskInfo.AllPayment * (1.0 - float64(sketchErrRate)/100)
+			if realPayment <= 0 {
+				realPayment = float64(0.01)
+			}
 			db3 := GetReadDB(context.Background())
 			err2 = db3.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", submitVideoTaskNeedModId).Updates(
-				&gorm_model.YoungeeTaskInfo{CurDefaultType: 3, SketchBreakRate: sketchDefaultRate, SettleAmount: settleAmount}).Error
+				&gorm_model.YoungeeTaskInfo{CurDefaultType: 3, SketchBreakRate: sketchDefaultRate, SettleAmount: settleAmount, ErrBreakRate: sketchErrRate, RealPayment: realPayment}).Error
 			if err2 != nil {
 				return err2
 			}
+			err = CreateTaskLog(context.Background(), submitVideoTaskNeedModId, "初稿逾期")
+			if err != nil {
+				logrus.WithContext(context.Background()).Errorf("[operate db] call CreateTaskLog error,err:%+v", err)
+			}
+			err = CreateMessageByTaskId(context.Background(), 22, 4, submitVideoTaskNeedModId)
+			if err != nil {
+				logrus.WithContext(context.Background()).Errorf("[operate db] call CreateMessageByTaskId error,err:%+v", err)
+			}
 			fmt.Println("创建已提交初稿的视频类型的初稿违约记录")
 		}
 	}
 	return nil
 }
 
+// 脚本超时违约判断
 func GetAutoScriptDefaultTask() error {
 	db := GetReadDB(context.Background())
-	var VideoProjectIds []string
-	err := db.Select("project_id").Model(gorm_model.ProjectInfo{}).Where("project_type = ? AND content_type = ?", 1, 2).Find(&VideoProjectIds).Error
+	var projectInfos []*gorm_model.ProjectInfo
+	err := db.Model(gorm_model.ProjectInfo{}).Where("project_type = ? AND content_type = ?", 1, 2).Find(&projectInfos).Error
 	if err != nil {
 		return err
 	}
+	var projectIds []string
 	// 任务id 对 项目id 的map
 	taskIdToProjectIdMap := map[string]string{}
 	// 项目id 对 定时任务id 的map
@@ -1187,16 +1295,16 @@ func GetAutoScriptDefaultTask() error {
 	var submitVideoTaskNeedModIds []string
 	var videoTaskIds []string
 	// 构造map及list
-	for _, VideoProjectId := range VideoProjectIds {
-		db2 := GetReadDB(context.Background())
-		var autoTaskId int
-		db2.Model(&gorm_model.ProjectInfo{}).Select("auto_task_id").Where("project_id = ?", VideoProjectId).First(&autoTaskId)
-		projectIdToAutoTaskIdMap[VideoProjectId] = autoTaskId
+	for _, projectInfo := range projectInfos {
+		projectIds = append(projectIds, projectInfo.ProjectID)
+		projectIdToAutoTaskIdMap[projectInfo.ProjectID] = int(projectInfo.AutoTaskID)
+		projectIdToAutoDefaultIdMap[projectInfo.ProjectID] = int(projectInfo.AutoDefaultID)
+
 		var videoTaskInfos []*gorm_model.YoungeeTaskInfo
 		db1 := GetReadDB(context.Background())
-		db1.Model(&gorm_model.YoungeeTaskInfo{}).Where("project_id = ?  AND task_status = ? AND task_stage = ? AND cur_default_type = ? ", VideoProjectId, 2, 7, 0).Find(&videoTaskInfos)
+		db1.Model(&gorm_model.YoungeeTaskInfo{}).Where("project_id = ?  AND task_status = ? AND task_stage = ? AND cur_default_type = ? ", projectInfo.ProjectID, 2, 7, 0).Find(&videoTaskInfos)
 		for _, videoTaskInfo := range videoTaskInfos {
-			taskIdToProjectIdMap[videoTaskInfo.TaskId] = VideoProjectId
+			taskIdToProjectIdMap[videoTaskInfo.TaskId] = projectInfo.ProjectID
 			taskIdToFeeFormMap[videoTaskInfo.TaskId] = videoTaskInfo.FeeForm
 			videoTaskIds = append(videoTaskIds, videoTaskInfo.TaskId)
 		}
@@ -1223,13 +1331,23 @@ func GetAutoScriptDefaultTask() error {
 		db1 := GetReadDB(context.Background())
 		var taskLogisticInfo gorm_model.YoungeeTaskLogistics
 		db1.Model(gorm_model.YoungeeTaskLogistics{}).Where("task_id = ?", videoTaskNeedModId).Find(&taskLogisticInfo)
+
+		autoDefaultHandle := gorm_model.InfoAutoDefaultHandle{}
+		db6 := GetReadDB(context.Background())
+		db6.Model(gorm_model.InfoAutoDefaultHandle{}).Where("auto_default_id = ?", projectIdToAutoDefaultIdMap[taskIdToProjectIdMap[videoTaskNeedModId]]).Find(&autoDefaultHandle)
+		fmt.Printf("autoDefaultHandle%+v\n", autoDefaultHandle)
 		var scriptDefaultRate int
+		var scriptErrRate int
 		if taskIdToFeeFormMap[videoTaskNeedModId] == 1 {
-			db6 := GetReadDB(context.Background())
-			db6.Model(gorm_model.InfoAutoDefaultHandle{}).Select("script_replace_time_out").Where("auto_default_id = ?", projectIdToAutoDefaultIdMap[taskIdToProjectIdMap[videoTaskNeedModId]]).Find(&scriptDefaultRate)
+			scriptDefaultRate = autoDefaultHandle.ScriptReplaceTimeOut
+			scriptErrRate = autoDefaultHandle.ScriptReplaceNotUpload
+			// db6 := GetReadDB(context.Background())
+			// db6.Model(gorm_model.InfoAutoDefaultHandle{}).Select("script_replace_time_out", "script_replace_not_upload").Where("auto_default_id = ?", projectIdToAutoDefaultIdMap[taskIdToProjectIdMap[videoTaskNeedModId]]).Find(&scriptDefaultRate, &scriptErrRate)
 		} else {
-			db6 := GetReadDB(context.Background())
-			db6.Model(gorm_model.InfoAutoDefaultHandle{}).Select("script_other_time_out").Where("auto_default_id = ?", projectIdToAutoDefaultIdMap[taskIdToProjectIdMap[videoTaskNeedModId]]).Find(&scriptDefaultRate)
+			scriptDefaultRate = autoDefaultHandle.ScriptOtherTimeOut
+			scriptErrRate = autoDefaultHandle.ScriptOtherNotUpload
+			// db6 := GetReadDB(context.Background())
+			// db6.Model(gorm_model.InfoAutoDefaultHandle{}).Select("script_other_time_out", "script_other_not_upload").Where("auto_default_id = ?", projectIdToAutoDefaultIdMap[taskIdToProjectIdMap[videoTaskNeedModId]]).Find(&scriptDefaultRate, &scriptErrRate)
 		}
 		if taskLogisticInfo.AutoScriptBreakAt == nil || taskLogisticInfo.AutoScriptBreakAt.IsZero() {
 			t := taskLogisticInfo.SignedTime.Add(dd)
@@ -1249,15 +1367,27 @@ func GetAutoScriptDefaultTask() error {
 					return err2
 				}
 				settleAmount := taskInfo.TaskReward * (1.0 - float64(taskInfo.SketchBreakRate+taskInfo.DataBreakRate+taskInfo.LinkBreakRate+scriptDefaultRate)/100)
-				if settleAmount < 0 {
+				if settleAmount <= 0 {
 					settleAmount = float64(0.01)
 				}
+				realPayment := taskInfo.AllPayment * (1.0 - float64(scriptErrRate)/100)
+				if realPayment <= 0 {
+					realPayment = float64(0.01)
+				}
 				db3 := GetReadDB(context.Background())
 				err2 = db3.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", videoTaskNeedModId).Updates(
-					&gorm_model.YoungeeTaskInfo{CurDefaultType: 1, ScriptBreakRate: scriptDefaultRate, SettleAmount: settleAmount}).Error
+					&gorm_model.YoungeeTaskInfo{CurDefaultType: 1, ScriptBreakRate: scriptDefaultRate, SettleAmount: settleAmount, ErrBreakRate: scriptErrRate, RealPayment: realPayment}).Error
 				if err2 != nil {
 					return err2
 				}
+				err = CreateTaskLog(context.Background(), videoTaskNeedModId, "脚本逾期")
+				if err != nil {
+					logrus.WithContext(context.Background()).Errorf("[operate db] call CreateTaskLog error,err:%+v", err)
+				}
+				err = CreateMessageByTaskId(context.Background(), 21, 4, videoTaskNeedModId)
+				if err != nil {
+					logrus.WithContext(context.Background()).Errorf("[operate db] call CreateMessageByTaskId error,err:%+v", err)
+				}
 				fmt.Println("创建时已违约则创建视频类型的脚本违约记录")
 			}
 		} else {
@@ -1275,15 +1405,28 @@ func GetAutoScriptDefaultTask() error {
 					return err2
 				}
 				settleAmount := taskInfo.TaskReward * (1.0 - float64(taskInfo.SketchBreakRate+taskInfo.DataBreakRate+taskInfo.LinkBreakRate+scriptDefaultRate)/100)
-				if settleAmount < 0 {
+				if settleAmount <= 0 {
 					settleAmount = 0.01
 				}
+				realPayment := taskInfo.AllPayment * (1.0 - float64(scriptErrRate)/100)
+				if realPayment <= 0 {
+					realPayment = float64(0.01)
+				}
+				fmt.Printf("脚本未上传扣款率: %+v\nrealPayment:%+v\n", scriptErrRate, realPayment)
 				db3 := GetReadDB(context.Background())
 				err2 = db3.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", videoTaskNeedModId).Updates(
-					&gorm_model.YoungeeTaskInfo{CurDefaultType: 1, ScriptBreakRate: scriptDefaultRate, SettleAmount: settleAmount}).Error
+					&gorm_model.YoungeeTaskInfo{CurDefaultType: 1, ScriptBreakRate: scriptDefaultRate, SettleAmount: settleAmount, ErrBreakRate: scriptErrRate, RealPayment: realPayment}).Error
 				if err2 != nil {
 					return err2
 				}
+				err = CreateTaskLog(context.Background(), videoTaskNeedModId, "脚本逾期")
+				if err != nil {
+					logrus.WithContext(context.Background()).Errorf("[operate db] call CreateTaskLog error,err:%+v", err)
+				}
+				err = CreateMessageByTaskId(context.Background(), 21, 4, videoTaskNeedModId)
+				if err != nil {
+					logrus.WithContext(context.Background()).Errorf("[operate db] call CreateMessageByTaskId error,err:%+v", err)
+				}
 				fmt.Println("已创建视频类型的脚本违约记录")
 			}
 		}
@@ -1297,13 +1440,23 @@ func GetAutoScriptDefaultTask() error {
 		db1 := GetReadDB(context.Background())
 		var taskScriptInfo gorm_model.YounggeeScriptInfo
 		db1.Model(gorm_model.YounggeeScriptInfo{}).Where("task_id = ? and is_review = 1", submitVideoTaskNeedModId).Order("reject_at desc").First(&taskScriptInfo)
+
+		autoDefaultHandle := gorm_model.InfoAutoDefaultHandle{}
+		db6 := GetReadDB(context.Background())
+		db6.Model(gorm_model.InfoAutoDefaultHandle{}).Where("auto_default_id = ?", projectIdToAutoDefaultIdMap[taskIdToProjectIdMap[submitVideoTaskNeedModId]]).Find(&autoDefaultHandle)
+
 		var scriptDefaultRate int
+		var scriptErrRate int
 		if taskIdToFeeFormMap[submitVideoTaskNeedModId] == 1 {
-			db6 := GetReadDB(context.Background())
-			db6.Model(gorm_model.InfoAutoDefaultHandle{}).Select("script_replace_time_out").Where("auto_default_id = ?", projectIdToAutoDefaultIdMap[taskIdToProjectIdMap[submitVideoTaskNeedModId]]).Find(&scriptDefaultRate)
+			scriptDefaultRate = autoDefaultHandle.ScriptReplaceTimeOut
+			scriptErrRate = autoDefaultHandle.ScriptReplaceNotUpload
+			// db6 := GetReadDB(context.Background())
+			// db6.Model(gorm_model.InfoAutoDefaultHandle{}).Select("script_replace_time_out", "script_replace_not_upload").Where("auto_default_id = ?", projectIdToAutoDefaultIdMap[taskIdToProjectIdMap[submitVideoTaskNeedModId]]).Find(&scriptDefaultRate, &scriptErrRate)
 		} else {
-			db6 := GetReadDB(context.Background())
-			db6.Model(gorm_model.InfoAutoDefaultHandle{}).Select("script_other_time_out").Where("auto_default_id = ?", projectIdToAutoDefaultIdMap[taskIdToProjectIdMap[submitVideoTaskNeedModId]]).Find(&scriptDefaultRate)
+			scriptDefaultRate = autoDefaultHandle.ScriptOtherTimeOut
+			scriptErrRate = autoDefaultHandle.ScriptOtherNotUpload
+			// db6 := GetReadDB(context.Background())
+			// db6.Model(gorm_model.InfoAutoDefaultHandle{}).Select("script_other_time_out", "script_other_not_upload").Where("auto_default_id = ?", projectIdToAutoDefaultIdMap[taskIdToProjectIdMap[submitVideoTaskNeedModId]]).Find(&scriptDefaultRate, &scriptErrRate)
 		}
 		if taskScriptInfo.AutoScriptBreakAt.IsZero() {
 			err4 := db1.Where("task_id = ?", submitVideoTaskNeedModId).Updates(&gorm_model.YounggeeScriptInfo{AutoScriptBreakAt: taskScriptInfo.RejectAt.Add(dd)}).Error
@@ -1325,15 +1478,27 @@ func GetAutoScriptDefaultTask() error {
 					return err2
 				}
 				settleAmount := taskInfo.TaskReward * (1.0 - float64(taskInfo.SketchBreakRate+taskInfo.DataBreakRate+taskInfo.LinkBreakRate+scriptDefaultRate)/100)
-				if settleAmount < 0 {
+				if settleAmount <= 0 {
 					settleAmount = 0.01
 				}
+				realPayment := taskInfo.AllPayment * (1.0 - float64(scriptErrRate)/100)
+				if realPayment <= 0 {
+					realPayment = float64(0.01)
+				}
 				db3 := GetReadDB(context.Background())
 				err3 := db3.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", submitVideoTaskNeedModId).Updates(&gorm_model.YoungeeTaskInfo{
-					CurDefaultType: 1, ScriptBreakRate: scriptDefaultRate, SettleAmount: settleAmount}).Error
+					CurDefaultType: 1, ScriptBreakRate: scriptDefaultRate, SettleAmount: settleAmount, ErrBreakRate: scriptErrRate, RealPayment: realPayment}).Error
 				if err3 != nil {
 					return err3
 				}
+				err = CreateTaskLog(context.Background(), submitVideoTaskNeedModId, "脚本逾期")
+				if err != nil {
+					logrus.WithContext(context.Background()).Errorf("[operate db] call CreateTaskLog error,err:%+v", err)
+				}
+				err = CreateMessageByTaskId(context.Background(), 21, 4, submitVideoTaskNeedModId)
+				if err != nil {
+					logrus.WithContext(context.Background()).Errorf("[operate db] call CreateMessageByTaskId error,err:%+v", err)
+				}
 				fmt.Println("创建时已违约则创建已提交脚本的视频类型的脚本违约记录")
 			}
 		} else {
@@ -1351,15 +1516,27 @@ func GetAutoScriptDefaultTask() error {
 					return err2
 				}
 				settleAmount := taskInfo.TaskReward * (1.0 - float64(taskInfo.SketchBreakRate+taskInfo.DataBreakRate+taskInfo.LinkBreakRate+scriptDefaultRate)/100)
-				if settleAmount < 0 {
+				if settleAmount <= 0 {
 					settleAmount = float64(0.01)
 				}
+				realPayment := taskInfo.AllPayment * (1.0 - float64(scriptErrRate)/100)
+				if realPayment <= 0 {
+					realPayment = float64(0.01)
+				}
 				db3 := GetReadDB(context.Background())
 				err3 := db3.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", submitVideoTaskNeedModId).Updates(&gorm_model.YoungeeTaskInfo{
-					CurDefaultType: 1, ScriptBreakRate: scriptDefaultRate, SettleAmount: settleAmount}).Error
+					CurDefaultType: 1, ScriptBreakRate: scriptDefaultRate, SettleAmount: settleAmount, ErrBreakRate: scriptErrRate, RealPayment: realPayment}).Error
 				if err3 != nil {
 					return err3
 				}
+				err = CreateTaskLog(context.Background(), submitVideoTaskNeedModId, "脚本逾期")
+				if err != nil {
+					logrus.WithContext(context.Background()).Errorf("[operate db] call CreateTaskLog error,err:%+v", err)
+				}
+				err = CreateMessageByTaskId(context.Background(), 21, 4, submitVideoTaskNeedModId)
+				if err != nil {
+					logrus.WithContext(context.Background()).Errorf("[operate db] call CreateMessageByTaskId error,err:%+v", err)
+				}
 				fmt.Println("创建已提交脚本的视频类型的脚本违约记录")
 			}
 		}
@@ -1367,13 +1544,15 @@ func GetAutoScriptDefaultTask() error {
 	return nil
 }
 
+// 链接超时违约判断
 func GetAutoLinkBreachTask() error {
 	db := GetReadDB(context.Background())
-	var projectIds []string
-	err := db.Select("project_id").Model(gorm_model.ProjectInfo{}).Where("project_type = ?", 1).Find(&projectIds).Error
+	var projectInfos []*gorm_model.ProjectInfo
+	err := db.Model(gorm_model.ProjectInfo{}).Where("project_type = ?", 1).Find(&projectInfos).Error
 	if err != nil {
 		return err
 	}
+	var projectIds []string
 	// 任务id 对 项目id 的map
 	taskIdToProjectIdMap := map[string]string{}
 	// 项目id 对 定时任务id 的map
@@ -1383,17 +1562,16 @@ func GetAutoLinkBreachTask() error {
 	var taskIds []string
 	// taskId 对 稿费形式的 map
 	taskIdToFeeFormMap := make(map[string]int)
-	for _, projectId := range projectIds {
-		db2 := GetReadDB(context.Background())
-		autoIds := gorm_model.ProjectInfo{}
-		db2.Select([]string{"auto_task_id", "auto_default_id"}).Model(&gorm_model.ProjectInfo{}).Where("project_id = ?", projectId).First(&autoIds)
-		projectIdToAutoTaskIdMap[projectId] = int(autoIds.AutoTaskID)
-		projectIdToAutoDefaultIdMap[projectId] = int(autoIds.AutoDefaultID)
+	for _, projectInfo := range projectInfos {
+		projectIds = append(projectIds, projectInfo.ProjectID)
+		projectIdToAutoTaskIdMap[projectInfo.ProjectID] = int(projectInfo.AutoTaskID)
+		projectIdToAutoDefaultIdMap[projectInfo.ProjectID] = int(projectInfo.AutoDefaultID)
+
 		var taskInfos []*gorm_model.YoungeeTaskInfo
 		db1 := GetReadDB(context.Background())
-		db1.Model(&gorm_model.YoungeeTaskInfo{}).Where("project_id = ? AND task_status = ? AND task_stage = ? AND cur_default_type = ? ", projectId, 2, 11, 0).Find(&taskInfos)
+		db1.Model(&gorm_model.YoungeeTaskInfo{}).Where("project_id = ? AND task_status = ? AND task_stage = ? AND cur_default_type = ? ", projectInfo.ProjectID, 2, 11, 0).Find(&taskInfos)
 		for _, taskInfo := range taskInfos {
-			taskIdToProjectIdMap[taskInfo.TaskId] = projectId
+			taskIdToProjectIdMap[taskInfo.TaskId] = projectInfo.ProjectID
 			taskIds = append(taskIds, taskInfo.TaskId)
 			taskIdToFeeFormMap[taskInfo.TaskId] = taskInfo.FeeForm
 		}
@@ -1420,13 +1598,23 @@ func GetAutoLinkBreachTask() error {
 		var linkBreach int32
 		db2.Model(&gorm_model.InfoAutoTask{}).Select("link_breach").Where("auto_task_id = ?", projectIdToAutoTaskIdMap[taskIdToProjectIdMap[taskNeedModId]]).First(&linkBreach)
 		dd, _ := time.ParseDuration(conv.MustString(linkBreach, "") + "h")
+
+		autoDefaultHandle := gorm_model.InfoAutoDefaultHandle{}
+		db6 := GetReadDB(context.Background())
+		db6.Model(gorm_model.InfoAutoDefaultHandle{}).Where("auto_default_id = ?", projectIdToAutoDefaultIdMap[taskIdToProjectIdMap[taskNeedModId]]).Find(&autoDefaultHandle)
+
 		var linkDefaultRate int
+		var linkErrRate int
 		if taskIdToFeeFormMap[taskNeedModId] == 1 {
-			db6 := GetReadDB(context.Background())
-			db6.Model(gorm_model.InfoAutoDefaultHandle{}).Select("link_replace_time_out").Where("auto_default_id = ?", projectIdToAutoDefaultIdMap[taskIdToProjectIdMap[taskNeedModId]]).Find(&linkDefaultRate)
+			linkDefaultRate = autoDefaultHandle.LinkReplaceTimeOut
+			linkErrRate = autoDefaultHandle.LinkReplaceNotUpload
+			// db6 := GetReadDB(context.Background())
+			// db6.Model(gorm_model.InfoAutoDefaultHandle{}).Select("link_replace_time_out", "link_replace_not_upload").Where("auto_default_id = ?", projectIdToAutoDefaultIdMap[taskIdToProjectIdMap[taskNeedModId]]).Find(&linkDefaultRate, &linkErrRate)
 		} else {
-			db6 := GetReadDB(context.Background())
-			db6.Model(gorm_model.InfoAutoDefaultHandle{}).Select("link_other_time_out").Where("auto_default_id = ?", projectIdToAutoDefaultIdMap[taskIdToProjectIdMap[taskNeedModId]]).Find(&linkDefaultRate)
+			linkDefaultRate = autoDefaultHandle.LinkOtherTimeOut
+			linkErrRate = autoDefaultHandle.LinkOtherNotUpload
+			// db6 := GetReadDB(context.Background())
+			// db6.Model(gorm_model.InfoAutoDefaultHandle{}).Select("link_other_time_out", "link_other_not_uploadsg").Where("auto_default_id = ?", projectIdToAutoDefaultIdMap[taskIdToProjectIdMap[taskNeedModId]]).Find(&linkDefaultRate, &linkErrRate)
 		}
 		db1 := GetReadDB(context.Background())
 		var taskSketchInfo gorm_model.YounggeeSketchInfo
@@ -1448,15 +1636,27 @@ func GetAutoLinkBreachTask() error {
 					return err2
 				}
 				settleAmount := taskInfo.TaskReward * (1.0 - float64(linkDefaultRate+taskInfo.DataBreakRate+taskInfo.SketchBreakRate+taskInfo.ScriptBreakRate)/100)
-				if settleAmount < 0 {
+				if settleAmount <= 0 {
 					settleAmount = 0.01
 				}
+				realPayment := taskInfo.AllPayment * (1.0 - float64(linkErrRate)/100)
+				if realPayment <= 0 {
+					realPayment = float64(0.01)
+				}
 				db3 := GetReadDB(context.Background())
 				err2 = db3.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", taskNeedModId).Updates(
-					&gorm_model.YoungeeTaskInfo{CurDefaultType: 5, LinkBreakRate: linkDefaultRate, SettleAmount: settleAmount}).Error
+					&gorm_model.YoungeeTaskInfo{CurDefaultType: 5, LinkBreakRate: linkDefaultRate, SettleAmount: settleAmount, ErrBreakRate: linkErrRate, RealPayment: realPayment}).Error
 				if err2 != nil {
 					return err2
 				}
+				err = CreateTaskLog(context.Background(), taskNeedModId, "链接逾期")
+				if err != nil {
+					logrus.WithContext(context.Background()).Errorf("[operate db] call CreateTaskLog error,err:%+v", err)
+				}
+				err = CreateMessageByTaskId(context.Background(), 23, 4, taskNeedModId)
+				if err != nil {
+					logrus.WithContext(context.Background()).Errorf("[operate db] call CreateMessageByTaskId error,err:%+v", err)
+				}
 				fmt.Println("创建时已违约则创建链接违约记录")
 			}
 		} else {
@@ -1474,15 +1674,27 @@ func GetAutoLinkBreachTask() error {
 					return err2
 				}
 				settleAmount := taskInfo.TaskReward * (1.0 - float64(linkDefaultRate+taskInfo.DataBreakRate+taskInfo.SketchBreakRate+taskInfo.ScriptBreakRate)/100)
-				if settleAmount < 0 {
+				if settleAmount <= 0 {
 					settleAmount = 0.01
 				}
+				realPayment := taskInfo.AllPayment * (1.0 - float64(linkErrRate)/100)
+				if realPayment <= 0 {
+					realPayment = float64(0.01)
+				}
 				db3 := GetReadDB(context.Background())
 				err2 = db3.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", taskNeedModId).Updates(
-					&gorm_model.YoungeeTaskInfo{CurDefaultType: 5, LinkBreakRate: linkDefaultRate, SettleAmount: settleAmount}).Error
+					&gorm_model.YoungeeTaskInfo{CurDefaultType: 5, LinkBreakRate: linkDefaultRate, SettleAmount: settleAmount, ErrBreakRate: linkErrRate, RealPayment: realPayment}).Error
 				if err2 != nil {
 					return err2
 				}
+				err = CreateTaskLog(context.Background(), taskNeedModId, "链接逾期")
+				if err != nil {
+					logrus.WithContext(context.Background()).Errorf("[operate db] call CreateTaskLog error,err:%+v", err)
+				}
+				err = CreateMessageByTaskId(context.Background(), 23, 4, taskNeedModId)
+				if err != nil {
+					logrus.WithContext(context.Background()).Errorf("[operate db] call CreateMessageByTaskId error,err:%+v", err)
+				}
 				fmt.Println("已创建链接违约记录")
 			}
 		}
@@ -1493,13 +1705,23 @@ func GetAutoLinkBreachTask() error {
 		var LinkBreach int32
 		db2.Model(&gorm_model.InfoAutoTask{}).Select("link_breach").Where("auto_task_id = ?", projectIdToAutoTaskIdMap[taskIdToProjectIdMap[submitTaskNeedModId]]).First(&LinkBreach)
 		dd, _ := time.ParseDuration(conv.MustString(LinkBreach, "") + "h")
+
+		autoDefaultHandle := gorm_model.InfoAutoDefaultHandle{}
+		db6 := GetReadDB(context.Background())
+		db6.Model(gorm_model.InfoAutoDefaultHandle{}).Where("auto_default_id = ?", projectIdToAutoDefaultIdMap[taskIdToProjectIdMap[submitTaskNeedModId]]).Find(&autoDefaultHandle)
+
 		var linkDefaultRate int
+		var linkErrRate int
 		if taskIdToFeeFormMap[submitTaskNeedModId] == 1 {
-			db6 := GetReadDB(context.Background())
-			db6.Model(gorm_model.InfoAutoDefaultHandle{}).Select("link_replace_time_out").Where("auto_default_id = ?", projectIdToAutoDefaultIdMap[taskIdToProjectIdMap[submitTaskNeedModId]]).Find(&linkDefaultRate)
+			linkDefaultRate = autoDefaultHandle.LinkReplaceTimeOut
+			linkErrRate = autoDefaultHandle.LinkReplaceNotUpload
+			// db6 := GetReadDB(context.Background())
+			// db6.Model(gorm_model.InfoAutoDefaultHandle{}).Select("link_replace_time_out", "link_replace_not_upload").Where("auto_default_id = ?", projectIdToAutoDefaultIdMap[taskIdToProjectIdMap[submitTaskNeedModId]]).Find(&linkDefaultRate, &linkErrRate)
 		} else {
-			db6 := GetReadDB(context.Background())
-			db6.Model(gorm_model.InfoAutoDefaultHandle{}).Select("link_other_time_out").Where("auto_default_id = ?", projectIdToAutoDefaultIdMap[taskIdToProjectIdMap[submitTaskNeedModId]]).Find(&linkDefaultRate)
+			linkDefaultRate = autoDefaultHandle.LinkOtherTimeOut
+			linkErrRate = autoDefaultHandle.LinkOtherNotUpload
+			// db6 := GetReadDB(context.Background())
+			// db6.Model(gorm_model.InfoAutoDefaultHandle{}).Select("link_other_time_out", "link_other_not_upload").Where("auto_default_id = ?", projectIdToAutoDefaultIdMap[taskIdToProjectIdMap[submitTaskNeedModId]]).Find(&linkDefaultRate, &linkErrRate)
 		}
 		db1 := GetReadDB(context.Background())
 		var taskLinkInfo gorm_model.YounggeeLinkInfo
@@ -1524,15 +1746,27 @@ func GetAutoLinkBreachTask() error {
 					return err2
 				}
 				settleAmount := taskInfo.TaskReward * (1.0 - float64(linkDefaultRate+taskInfo.DataBreakRate+taskInfo.SketchBreakRate+taskInfo.ScriptBreakRate)/100)
-				if settleAmount < 0 {
+				if settleAmount <= 0 {
 					settleAmount = 0.01
 				}
+				realPayment := taskInfo.AllPayment * (1.0 - float64(linkErrRate)/100)
+				if realPayment <= 0 {
+					realPayment = float64(0.01)
+				}
 				db3 := GetReadDB(context.Background())
 				err2 = db3.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", submitTaskNeedModId).Updates(
-					&gorm_model.YoungeeTaskInfo{CurDefaultType: 5, LinkBreakRate: linkDefaultRate, SettleAmount: settleAmount}).Error
+					&gorm_model.YoungeeTaskInfo{CurDefaultType: 5, LinkBreakRate: linkDefaultRate, SettleAmount: settleAmount, ErrBreakRate: linkErrRate, RealPayment: realPayment}).Error
 				if err2 != nil {
 					return err2
 				}
+				err = CreateTaskLog(context.Background(), submitTaskNeedModId, "链接逾期")
+				if err != nil {
+					logrus.WithContext(context.Background()).Errorf("[operate db] call CreateTaskLog error,err:%+v", err)
+				}
+				err = CreateMessageByTaskId(context.Background(), 23, 4, submitTaskNeedModId)
+				if err != nil {
+					logrus.WithContext(context.Background()).Errorf("[operate db] call CreateMessageByTaskId error,err:%+v", err)
+				}
 				fmt.Println("创建时已违约则创建已提交链接的链接违约记录")
 			}
 		} else {
@@ -1550,15 +1784,27 @@ func GetAutoLinkBreachTask() error {
 					return err2
 				}
 				settleAmount := taskInfo.TaskReward * (1.0 - float64(linkDefaultRate+taskInfo.DataBreakRate+taskInfo.SketchBreakRate+taskInfo.ScriptBreakRate)/100)
-				if settleAmount < 0 {
+				if settleAmount <= 0 {
 					settleAmount = float64(0.01)
 				}
+				realPayment := taskInfo.AllPayment * (1.0 - float64(linkErrRate)/100)
+				if realPayment <= 0 {
+					realPayment = float64(0.01)
+				}
 				db3 := GetReadDB(context.Background())
 				err2 = db3.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", submitTaskNeedModId).Updates(
-					&gorm_model.YoungeeTaskInfo{CurDefaultType: 5, LinkBreakRate: linkDefaultRate, SettleAmount: settleAmount}).Error
+					&gorm_model.YoungeeTaskInfo{CurDefaultType: 5, LinkBreakRate: linkDefaultRate, SettleAmount: settleAmount, ErrBreakRate: linkErrRate, RealPayment: realPayment}).Error
 				if err2 != nil {
 					return err2
 				}
+				err = CreateTaskLog(context.Background(), submitTaskNeedModId, "链接逾期")
+				if err != nil {
+					logrus.WithContext(context.Background()).Errorf("[operate db] call CreateTaskLog error,err:%+v", err)
+				}
+				err = CreateMessageByTaskId(context.Background(), 23, 4, submitTaskNeedModId)
+				if err != nil {
+					logrus.WithContext(context.Background()).Errorf("[operate db] call CreateMessageByTaskId error,err:%+v", err)
+				}
 				fmt.Println("创建已提交链接的链接违约记录")
 			}
 		}
@@ -1566,13 +1812,15 @@ func GetAutoLinkBreachTask() error {
 	return nil
 }
 
+// 数据超时违约判断
 func GetAutoCaseCloseDefaultTask() error {
 	db := GetReadDB(context.Background())
-	var projectIds []string
-	err := db.Select("project_id").Model(gorm_model.ProjectInfo{}).Where("project_type = ?", 1).Find(&projectIds).Error
+	var projectInfos []*gorm_model.ProjectInfo
+	err := db.Model(gorm_model.ProjectInfo{}).Where("project_type = ?", 1).Find(&projectInfos).Error
 	if err != nil {
 		return err
 	}
+	var projectIds []string
 	// 任务id 对 项目id 的map
 	taskIdToProjectIdMap := map[string]string{}
 	// 项目id 对 定时任务id 的map
@@ -1580,17 +1828,16 @@ func GetAutoCaseCloseDefaultTask() error {
 	// 项目id 对 违约定时任务id 的map
 	projectIdToAutoDefaultIdMap := map[string]int{}
 	var taskIds []string
-	for _, projectId := range projectIds {
-		db2 := GetReadDB(context.Background())
-		autoIds := gorm_model.ProjectInfo{}
-		db2.Select([]string{"auto_task_id", "auto_default_id"}).Model(&gorm_model.ProjectInfo{}).Where("project_id = ?", projectId).First(&autoIds)
-		projectIdToAutoTaskIdMap[projectId] = int(autoIds.AutoTaskID)
-		projectIdToAutoDefaultIdMap[projectId] = int(autoIds.AutoDefaultID)
+	for _, projectInfo := range projectInfos {
+		projectIds = append(projectIds, projectInfo.ProjectID)
+		projectIdToAutoTaskIdMap[projectInfo.ProjectID] = int(projectInfo.AutoTaskID)
+		projectIdToAutoDefaultIdMap[projectInfo.ProjectID] = int(projectInfo.AutoDefaultID)
+
 		var taskInfos []string
 		db1 := GetReadDB(context.Background())
-		db1.Select("task_id").Model(&gorm_model.YoungeeTaskInfo{}).Where("project_id = ? AND task_status = ? AND task_stage = ? AND cur_default_type = ? ", projectId, 2, 13, 0).Find(&taskInfos)
+		db1.Select("task_id").Model(&gorm_model.YoungeeTaskInfo{}).Where("project_id = ? AND task_status = ? AND task_stage = ? AND cur_default_type = ? ", projectInfo.ProjectID, 2, 13, 0).Find(&taskInfos)
 		for _, taskInfo := range taskInfos {
-			taskIdToProjectIdMap[taskInfo] = projectId
+			taskIdToProjectIdMap[taskInfo] = projectInfo.ProjectID
 			taskIds = append(taskIds, taskInfo)
 		}
 	}
@@ -1619,13 +1866,23 @@ func GetAutoCaseCloseDefaultTask() error {
 		var CaseCloseDefault int32
 		db2.Model(&gorm_model.InfoAutoTask{}).Select("case_close_default").Where("auto_task_id = ?", projectIdToAutoTaskIdMap[taskIdToProjectIdMap[taskNeedModId]]).First(&CaseCloseDefault)
 		dd, _ := time.ParseDuration(conv.MustString(CaseCloseDefault, "") + "h")
+
+		autoDefaultHandle := gorm_model.InfoAutoDefaultHandle{}
+		db6 := GetReadDB(context.Background())
+		db6.Model(gorm_model.InfoAutoDefaultHandle{}).Where("auto_default_id = ?", projectIdToAutoDefaultIdMap[taskIdToProjectIdMap[taskNeedModId]]).Find(&autoDefaultHandle)
+
 		var dataDefaultRate int
+		var dataErrRate int
 		if taskIdToFeeFormMap[taskNeedModId] == 1 {
-			db6 := GetReadDB(context.Background())
-			db6.Model(gorm_model.InfoAutoDefaultHandle{}).Select("data_replace_time_out").Where("auto_default_id = ?", projectIdToAutoDefaultIdMap[taskIdToProjectIdMap[taskNeedModId]]).Find(&dataDefaultRate)
+			dataDefaultRate = autoDefaultHandle.DataReplaceTimeOut
+			dataErrRate = autoDefaultHandle.DataReplaceNotUpload
+			// db6 := GetReadDB(context.Background())
+			// db6.Model(gorm_model.InfoAutoDefaultHandle{}).Select("data_replace_time_out", "data_replace_not_upload").Where("auto_default_id = ?", projectIdToAutoDefaultIdMap[taskIdToProjectIdMap[taskNeedModId]]).Find(&dataDefaultRate, &dataErrRate)
 		} else {
-			db6 := GetReadDB(context.Background())
-			db6.Model(gorm_model.InfoAutoDefaultHandle{}).Select("data_other_time_out").Where("auto_default_id = ?", projectIdToAutoDefaultIdMap[taskIdToProjectIdMap[taskNeedModId]]).Find(&dataDefaultRate)
+			dataDefaultRate = autoDefaultHandle.DataOtherTimeOut
+			dataErrRate = autoDefaultHandle.DataOtherNotUpload
+			// db6 := GetReadDB(context.Background())
+			// db6.Model(gorm_model.InfoAutoDefaultHandle{}).Select("data_other_time_out", "data_other_not_upload").Where("auto_default_id = ?", projectIdToAutoDefaultIdMap[taskIdToProjectIdMap[taskNeedModId]]).Find(&dataDefaultRate, &dataErrRate)
 		}
 		//fmt.Println("dataDefaultRate:", dataDefaultRate)
 		db1 := GetReadDB(context.Background())
@@ -1648,15 +1905,27 @@ func GetAutoCaseCloseDefaultTask() error {
 					return err2
 				}
 				settleAmount := taskInfo.TaskReward * (1.0 - float64(taskInfo.SketchBreakRate+dataDefaultRate+taskInfo.LinkBreakRate+taskInfo.ScriptBreakRate)/100)
-				if settleAmount < 0 {
+				if settleAmount <= 0 {
 					settleAmount = 0.01
 				}
+				realPayment := taskInfo.AllPayment * (1.0 - float64(dataErrRate)/100)
+				if realPayment <= 0 {
+					realPayment = float64(0.01)
+				}
 				db3 := GetReadDB(context.Background())
 				err2 = db3.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", taskNeedModId).Updates(
-					&gorm_model.YoungeeTaskInfo{CurDefaultType: 7, DataBreakRate: dataDefaultRate, SettleAmount: settleAmount}).Error
+					&gorm_model.YoungeeTaskInfo{CurDefaultType: 7, DataBreakRate: dataDefaultRate, SettleAmount: settleAmount, ErrBreakRate: dataErrRate, RealPayment: realPayment}).Error
 				if err2 != nil {
 					return err2
 				}
+				err = CreateTaskLog(context.Background(), taskNeedModId, "数据逾期")
+				if err != nil {
+					logrus.WithContext(context.Background()).Errorf("[operate db] call CreateTaskLog error,err:%+v", err)
+				}
+				err = CreateMessageByTaskId(context.Background(), 24, 4, taskNeedModId)
+				if err != nil {
+					logrus.WithContext(context.Background()).Errorf("[operate db] call CreateMessageByTaskId error,err:%+v", err)
+				}
 				fmt.Println("创建时已违约则创建数据违约记录")
 			}
 		} else {
@@ -1674,16 +1943,28 @@ func GetAutoCaseCloseDefaultTask() error {
 					return err2
 				}
 				settleAmount := taskInfo.TaskReward * (1.0 - float64(taskInfo.SketchBreakRate+dataDefaultRate+taskInfo.LinkBreakRate+taskInfo.ScriptBreakRate)/100)
-				if settleAmount < 0 {
+				if settleAmount <= 0 {
 					settleAmount = float64(0.01)
 				}
+				realPayment := taskInfo.AllPayment * (1.0 - float64(dataErrRate)/100)
+				if realPayment <= 0 {
+					realPayment = float64(0.01)
+				}
 				fmt.Println("settleAmount: ", settleAmount)
 				db3 := GetReadDB(context.Background())
 				err2 = db3.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", taskNeedModId).Updates(
-					&gorm_model.YoungeeTaskInfo{CurDefaultType: 7, DataBreakRate: dataDefaultRate, SettleAmount: settleAmount}).Error
+					&gorm_model.YoungeeTaskInfo{CurDefaultType: 7, DataBreakRate: dataDefaultRate, SettleAmount: settleAmount, ErrBreakRate: dataErrRate, RealPayment: realPayment}).Error
 				if err2 != nil {
 					return err2
 				}
+				err = CreateTaskLog(context.Background(), taskNeedModId, "数据逾期")
+				if err != nil {
+					logrus.WithContext(context.Background()).Errorf("[operate db] call CreateTaskLog error,err:%+v", err)
+				}
+				err = CreateMessageByTaskId(context.Background(), 24, 4, taskNeedModId)
+				if err != nil {
+					logrus.WithContext(context.Background()).Errorf("[operate db] call CreateMessageByTaskId error,err:%+v", err)
+				}
 				fmt.Println("已创建数据违约记录")
 			}
 		}
@@ -1694,13 +1975,23 @@ func GetAutoCaseCloseDefaultTask() error {
 		var LinkBreach int32
 		db2.Model(&gorm_model.InfoAutoTask{}).Select("case_close_default").Where("auto_task_id = ?", projectIdToAutoTaskIdMap[taskIdToProjectIdMap[submitTaskNeedModId]]).First(&LinkBreach)
 		dd, _ := time.ParseDuration(conv.MustString(LinkBreach, "") + "h")
+
+		autoDefaultHandle := gorm_model.InfoAutoDefaultHandle{}
+		db6 := GetReadDB(context.Background())
+		db6.Model(gorm_model.InfoAutoDefaultHandle{}).Where("auto_default_id = ?", projectIdToAutoDefaultIdMap[taskIdToProjectIdMap[submitTaskNeedModId]]).Find(&autoDefaultHandle)
+
 		var dataDefaultRate int
+		var dataErrRate int
 		if taskIdToFeeFormMap[submitTaskNeedModId] == 1 {
-			db6 := GetReadDB(context.Background())
-			db6.Model(gorm_model.InfoAutoDefaultHandle{}).Select("data_replace_time_out").Where("auto_default_id = ?", projectIdToAutoDefaultIdMap[taskIdToProjectIdMap[submitTaskNeedModId]]).Find(&dataDefaultRate)
+			dataDefaultRate = autoDefaultHandle.DataReplaceTimeOut
+			dataErrRate = autoDefaultHandle.DataReplaceNotUpload
+			// db6 := GetReadDB(context.Background())
+			// db6.Model(gorm_model.InfoAutoDefaultHandle{}).Select("data_replace_time_out", "data_replace_not_upload").Where("auto_default_id = ?", projectIdToAutoDefaultIdMap[taskIdToProjectIdMap[submitTaskNeedModId]]).Find(&dataDefaultRate, &dataErrRate)
 		} else {
-			db6 := GetReadDB(context.Background())
-			db6.Model(gorm_model.InfoAutoDefaultHandle{}).Select("data_other_time_out").Where("auto_default_id = ?", projectIdToAutoDefaultIdMap[taskIdToProjectIdMap[submitTaskNeedModId]]).Find(&dataDefaultRate)
+			dataDefaultRate = autoDefaultHandle.DataOtherTimeOut
+			dataErrRate = autoDefaultHandle.DataOtherNotUpload
+			// db6 := GetReadDB(context.Background())
+			// db6.Model(gorm_model.InfoAutoDefaultHandle{}).Select("data_other_time_out", "data_other_not_upload").Where("auto_default_id = ?", projectIdToAutoDefaultIdMap[taskIdToProjectIdMap[submitTaskNeedModId]]).Find(&dataDefaultRate, &dataErrRate)
 		}
 		db1 := GetReadDB(context.Background())
 		var taskDataInfo gorm_model.YounggeeDataInfo
@@ -1725,15 +2016,27 @@ func GetAutoCaseCloseDefaultTask() error {
 					return err2
 				}
 				settleAmount := taskInfo.TaskReward * (1.0 - float64(taskInfo.SketchBreakRate+dataDefaultRate+taskInfo.LinkBreakRate+taskInfo.ScriptBreakRate)/100)
-				if settleAmount < 0 {
+				if settleAmount <= 0 {
 					settleAmount = 0.01
 				}
+				realPayment := taskInfo.AllPayment * (1.0 - float64(dataErrRate)/100)
+				if realPayment <= 0 {
+					realPayment = float64(0.01)
+				}
 				db3 := GetReadDB(context.Background())
 				err2 = db3.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", submitTaskNeedModId).Updates(
-					&gorm_model.YoungeeTaskInfo{CurDefaultType: 7, DataBreakRate: dataDefaultRate, SettleAmount: settleAmount}).Error
+					&gorm_model.YoungeeTaskInfo{CurDefaultType: 7, DataBreakRate: dataDefaultRate, SettleAmount: settleAmount, ErrBreakRate: dataErrRate, RealPayment: realPayment}).Error
 				if err2 != nil {
 					return err2
 				}
+				err = CreateTaskLog(context.Background(), submitTaskNeedModId, "数据逾期")
+				if err != nil {
+					logrus.WithContext(context.Background()).Errorf("[operate db] call CreateTaskLog error,err:%+v", err)
+				}
+				err = CreateMessageByTaskId(context.Background(), 24, 4, submitTaskNeedModId)
+				if err != nil {
+					logrus.WithContext(context.Background()).Errorf("[operate db] call CreateMessageByTaskId error,err:%+v", err)
+				}
 				fmt.Println("创建时已违约则创建已提交数据的数据违约记录")
 			}
 		} else {
@@ -1751,15 +2054,27 @@ func GetAutoCaseCloseDefaultTask() error {
 					return err2
 				}
 				settleAmount := taskInfo.TaskReward * (1.0 - float64(taskInfo.SketchBreakRate+dataDefaultRate+taskInfo.LinkBreakRate+taskInfo.ScriptBreakRate)/100)
-				if settleAmount < 0 {
+				if settleAmount <= 0 {
 					settleAmount = 0.01
 				}
+				realPayment := taskInfo.AllPayment * (1.0 - float64(dataErrRate)/100)
+				if realPayment <= 0 {
+					realPayment = float64(0.01)
+				}
 				db3 := GetReadDB(context.Background())
 				err2 = db3.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", submitTaskNeedModId).Updates(
-					&gorm_model.YoungeeTaskInfo{CurDefaultType: 7, DataBreakRate: dataDefaultRate, SettleAmount: settleAmount}).Error
+					&gorm_model.YoungeeTaskInfo{CurDefaultType: 7, DataBreakRate: dataDefaultRate, SettleAmount: settleAmount, ErrBreakRate: dataErrRate, RealPayment: realPayment}).Error
 				if err2 != nil {
 					return err2
 				}
+				err = CreateTaskLog(context.Background(), submitTaskNeedModId, "数据逾期")
+				if err != nil {
+					logrus.WithContext(context.Background()).Errorf("[operate db] call CreateTaskLog error,err:%+v", err)
+				}
+				err = CreateMessageByTaskId(context.Background(), 24, 4, submitTaskNeedModId)
+				if err != nil {
+					logrus.WithContext(context.Background()).Errorf("[operate db] call CreateMessageByTaskId error,err:%+v", err)
+				}
 				fmt.Println("创建已提交数据的数据违约记录")
 			}
 		}

+ 34 - 3
db/task.go

@@ -3,9 +3,6 @@ package db
 import (
 	"context"
 	"fmt"
-	"github.com/caixw/lib.go/conv"
-	"github.com/tidwall/gjson"
-	"gorm.io/gorm"
 	"reflect"
 	"strconv"
 	"strings"
@@ -16,6 +13,10 @@ import (
 	"youngee_m_api/pack"
 	"youngee_m_api/util"
 
+	"github.com/caixw/lib.go/conv"
+	"github.com/tidwall/gjson"
+	"gorm.io/gorm"
+
 	"github.com/sirupsen/logrus"
 )
 
@@ -89,6 +90,23 @@ func ChangeTaskStatus(ctx context.Context, taskIds []string, taskStatus string)
 	return recruitStrategysIDs, nil
 }
 
+
+func ChangeSpecialTaskStatus(ctx context.Context, taskIds []string, taskStatus string, taskStage string) error {
+	db := GetReadDB(ctx)
+	status, err := strconv.Atoi(taskStatus)
+	stage, err := strconv.Atoi(taskStage)
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[ChangeTaskStatus]1 error query mysql total, err:%+v", err)
+		return err
+	}
+	if err := db.Debug().Model(&gorm_model.YoungeeTaskInfo{}).Where("task_id IN ?", taskIds).
+		Updates(gorm_model.YoungeeTaskInfo{TaskStatus: status, TaskStage: stage}).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[ChangeTaskStatus]2 error query mysql total, err:%+v", err)
+		return err
+	}
+	return nil
+}
+
 func UpdateTaskStage(ctx context.Context, projectID string, taskStatus int64, taskStage int64) error {
 	db := GetReadDB(ctx)
 	err := db.Model(gorm_model.YoungeeTaskInfo{}).Where("project_id=? and task_status = ?", projectID, taskStatus).Update("task_stage", taskStage).Error
@@ -276,3 +294,16 @@ func UpdateTaskStageByTaskId(ctx context.Context, taskID string, taskStatus int6
 	}
 	return nil
 }
+
+// 获取任务ids
+func GetTaskIds(ctx context.Context, projectId string) ([]string, error) {
+	db := GetReadDB(ctx)
+	var taskIds []string
+	err := db.Model(gorm_model.YoungeeTaskInfo{}).Select("task_id").Where("project_id = ? and task_status = 2", projectId).Find(&taskIds).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[CreateMessageByTask] error read mysql, err:%+v", err)
+		return nil, err
+	}
+
+	return taskIds, nil
+}

+ 54 - 59
db/terminate.go

@@ -2,21 +2,16 @@ package db
 
 import (
 	"context"
-	"fmt"
-	"gorm.io/gorm"
-	"log"
 	"time"
 	"youngee_m_api/model/gorm_model"
-	"youngee_m_api/util"
 
 	"github.com/sirupsen/logrus"
 )
 
 // Terminate 批量提交解约申请
-func Terminate(ctx context.Context, TaskIDs, projectIds []string) error {
+func Terminate(ctx context.Context, TaskIDs []string) error {
 	db := GetReadDB(ctx)
-	err := db.Model(gorm_model.YoungeeContractInfo{}).Where("task_id in ?  and default_status = 1", TaskIDs).
-		Updates(map[string]interface{}{"default_status": 3, "terminate_at": time.Now()}).Error
+	err := db.Model(gorm_model.YoungeeContractInfo{}).Where("task_id in ?  and (default_status = 1 or default_status = 4)", TaskIDs).Updates(map[string]interface{}{"default_status": 3, "terminate_at": time.Now()}).Error
 	if err != nil {
 		logrus.WithContext(ctx).Errorf("[Data db] Update YoungeeContractInfo error,err:%+v", err)
 		return err
@@ -26,57 +21,57 @@ func Terminate(ctx context.Context, TaskIDs, projectIds []string) error {
 		logrus.WithContext(ctx).Errorf("[Data db] Update YoungeeTaskInfo error,err:%+v", err)
 		return err
 	}
-	projectIds = util.RemoveStrRepByMap(projectIds)
-	var unfinishedNum int64
-	for _, projectId := range projectIds {
-		err1 := db.Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? AND task_status = 2 AND task_stage < 15", projectId).Count(&unfinishedNum).Error
-		if err1 != nil {
-			logrus.WithContext(ctx).Errorf("[Data db] Count YoungeeTaskInfo error,err:%+v", err)
-			return err1
-		}
-		var finishedNum int64
-		db.Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? and task_status = 2 and task_stage >= 15", projectId).Count(&finishedNum)
-		if unfinishedNum == 0 && finishedNum != 0 {
-			// 2. 释放企业账户因项目冻结的资金
-			// 1) 计算剩余资金
-			db1 := GetReadDB(ctx)
-			var allPayment float64
-			var realPayment float64
-			err = db1.Model(gorm_model.YoungeeTaskInfo{}).
-				Where("project_id = ? and task_status = 2 and task_stage >= 15", projectId).Pluck("COALESCE(SUM(all_payment), 0) as allPayment", &allPayment).Error
-			if err != nil {
-				log.Println("DB GetAutoCaseCloseTask error in data:", err)
-				return err
-			}
-			err = db1.Model(gorm_model.YoungeeTaskInfo{}).Select("sum(real_payment) as realPayment").
-				Where("project_id = ? and task_status = 2 and task_stage >= 15", projectId).Pluck("COALESCE(SUM(real_payment), 0) as realPayment", &realPayment).Error
-			if err != nil {
-				log.Println("DB GetAutoCaseCloseTask error in data:", err)
-				return err
-			}
-			fmt.Println("企业应支付金额总计:", allPayment, "实际支付总计:", realPayment)
-			db2 := GetReadDB(ctx)
-			var enterpriseID int64
-			db2.Model(gorm_model.ProjectInfo{}).Select("enterprise_id").Where("project_id = ?", projectId).Find(&enterpriseID)
-			// 	2). 释放剩余资金
-			err = db1.Model(gorm_model.Enterprise{}).Where("enterprise_id = ?", enterpriseID).Updates(
-				map[string]interface{}{
-					"frozen_balance":    gorm.Expr("frozen_balance - ?", allPayment),
-					"balance":           gorm.Expr("balance - ?", realPayment),
-					"available_balance": gorm.Expr("available_balance + ?", allPayment-realPayment)}).Error
-			if err != nil {
-				log.Println("DB GetAutoCaseCloseTask error in data:", err)
-				return err
-			}
-			// 1. 更新项目状态为已结束
-			t := time.Now()
-			err = db.Model(gorm_model.ProjectInfo{}).Where("project_id = ?", projectId).
-				Updates(map[string]interface{}{"project_status": 10, "payment_amount": realPayment, "finish_at": &t}).Error
-			if err != nil {
-				logrus.WithContext(ctx).Errorf("[Project db] Update ProjectInfo error,err:%+v", err)
-				return err
-			}
-		}
-	}
+	// projectIds = util.RemoveStrRepByMap(projectIds)
+	// var unfinishedNum int64
+	// for _, projectId := range projectIds {
+	// 	err1 := db.Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? AND task_status = 2 AND task_stage < 15", projectId).Count(&unfinishedNum).Error
+	// 	if err1 != nil {
+	// 		logrus.WithContext(ctx).Errorf("[Data db] Count YoungeeTaskInfo error,err:%+v", err)
+	// 		return err1
+	// 	}
+	// 	var finishedNum int64
+	// 	db.Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? and task_status = 2 and task_stage >= 15", projectId).Count(&finishedNum)
+	// 	if unfinishedNum == 0 && finishedNum != 0 {
+	// 		// 2. 释放企业账户因项目冻结的资金
+	// 		// 1) 计算剩余资金
+	// 		db1 := GetReadDB(ctx)
+	// 		var allPayment float64
+	// 		var realPayment float64
+	// 		err = db1.Model(gorm_model.YoungeeTaskInfo{}).
+	// 			Where("project_id = ? and task_status = 2 and task_stage >= 15", projectId).Pluck("COALESCE(SUM(all_payment), 0) as allPayment", &allPayment).Error
+	// 		if err != nil {
+	// 			log.Println("DB GetAutoCaseCloseTask error in data:", err)
+	// 			return err
+	// 		}
+	// 		err = db1.Model(gorm_model.YoungeeTaskInfo{}).Select("sum(real_payment) as realPayment").
+	// 			Where("project_id = ? and task_status = 2 and task_stage >= 15", projectId).Pluck("COALESCE(SUM(real_payment), 0) as realPayment", &realPayment).Error
+	// 		if err != nil {
+	// 			log.Println("DB GetAutoCaseCloseTask error in data:", err)
+	// 			return err
+	// 		}
+	// 		fmt.Println("企业应支付金额总计:", allPayment, "实际支付总计:", realPayment)
+	// 		db2 := GetReadDB(ctx)
+	// 		var enterpriseID int64
+	// 		db2.Model(gorm_model.ProjectInfo{}).Select("enterprise_id").Where("project_id = ?", projectId).Find(&enterpriseID)
+	// 		// 	2). 释放剩余资金
+	// 		err = db1.Model(gorm_model.Enterprise{}).Where("enterprise_id = ?", enterpriseID).Updates(
+	// 			map[string]interface{}{
+	// 				"frozen_balance":    gorm.Expr("frozen_balance - ?", allPayment),
+	// 				"balance":           gorm.Expr("balance - ?", realPayment),
+	// 				"available_balance": gorm.Expr("available_balance + ?", allPayment-realPayment)}).Error
+	// 		if err != nil {
+	// 			log.Println("DB GetAutoCaseCloseTask error in data:", err)
+	// 			return err
+	// 		}
+	// 		// 1. 更新项目状态为已结束
+	// 		t := time.Now()
+	// 		err = db.Model(gorm_model.ProjectInfo{}).Where("project_id = ?", projectId).
+	// 			Updates(map[string]interface{}{"project_status": 10, "payment_amount": realPayment, "finish_at": &t}).Error
+	// 		if err != nil {
+	// 			logrus.WithContext(ctx).Errorf("[Project db] Update ProjectInfo error,err:%+v", err)
+	// 			return err
+	// 		}
+	// 	}
+	// }
 	return nil
 }

+ 23 - 6
handler/project_change_taskStatus.go

@@ -55,13 +55,30 @@ func (p *ProjectChangeTaskStatusHandler) getRequest() interface{} {
 func (p *ProjectChangeTaskStatusHandler) run() {
 	data := http_model.ProjectChangeTaskStatusRequest{}
 	data = *p.req
-	err := service.Project.ChangeTaskStatus(p.ctx, data)
-	if err != nil {
-		logrus.Errorf("[ChangeTaskStatusHandler] call Create err:%+v\n", err)
-		util.HandlerPackErrorResp(p.resp, consts.ErrorInternal, "")
-		logrus.Info("ChangeTaskStatus fail,req:%+v", p.req)
-		return
+	if data.IsSpecial == "1" {
+		err := service.Project.ChangeSpecialTaskStatus(p.ctx, data)
+		if err != nil {
+			logrus.Errorf("[ChangeTaskStatusHandler] call Create err:%+v\n", err)
+			util.HandlerPackErrorResp(p.resp, consts.ErrorInternal, "")
+			logrus.Info("ChangeTaskStatus fail,req:%+v", p.req)
+			return
+		}
+	} else {
+		err := service.Project.ChangeTaskStatus(p.ctx, data)
+		if err != nil {
+			logrus.Errorf("[ChangeTaskStatusHandler] call Create err:%+v\n", err)
+			util.HandlerPackErrorResp(p.resp, consts.ErrorInternal, "")
+			logrus.Info("ChangeTaskStatus fail,req:%+v", p.req)
+			return
+		}
 	}
+	// err := service.Project.ChangeTaskStatus(p.ctx, data)
+	// if err != nil {
+	// 	logrus.Errorf("[ChangeTaskStatusHandler] call Create err:%+v\n", err)
+	// 	util.HandlerPackErrorResp(p.resp, consts.ErrorInternal, "")
+	// 	logrus.Info("ChangeTaskStatus fail,req:%+v", p.req)
+	// 	return
+	// }
 	p.resp.Message = "任务状态更换成功"
 }
 

+ 58 - 0
handler/qrcode.go

@@ -0,0 +1,58 @@
+package handler
+
+import (
+	"youngee_m_api/consts"
+	"youngee_m_api/model/http_model"
+	"youngee_m_api/service"
+	"youngee_m_api/util"
+
+	"github.com/gin-gonic/gin"
+	"github.com/sirupsen/logrus"
+)
+
+func WrapGetWxQRCodeHandler(ctx *gin.Context) {
+	handler := newGetWxQRCodeHandler(ctx)
+	BaseRun(handler)
+}
+
+type GetWxQRCodeHandler struct {
+	ctx  *gin.Context
+	req  *http_model.GetWxQRCodeRequest
+	resp *http_model.CommonResponse
+}
+
+func (q GetWxQRCodeHandler) getContext() *gin.Context {
+	return q.ctx
+}
+
+func (q GetWxQRCodeHandler) getResponse() interface{} {
+	return q.resp
+}
+
+func (q GetWxQRCodeHandler) getRequest() interface{} {
+	return q.req
+}
+
+func (q GetWxQRCodeHandler) run() {
+	req := http_model.GetWxQRCodeRequest{}
+	req = *q.req
+	data, err := service.QrCode.GetWxQrCode(q.ctx, req.Scene, req.Page)
+	if err != nil {
+		logrus.WithContext(q.ctx).Errorf("[GetWxQRCodeHandler] error GetWxQrCode, err:%+v", err)
+		util.HandlerPackErrorResp(q.resp, consts.ErrorInternal, consts.DefaultToast)
+		return
+	}
+	q.resp.Data = data
+}
+
+func (q GetWxQRCodeHandler) checkParam() error {
+	return nil
+}
+
+func newGetWxQRCodeHandler(ctx *gin.Context) *GetWxQRCodeHandler {
+	return &GetWxQRCodeHandler{
+		ctx:  ctx,
+		req:  http_model.NewGetWxQRCodeRequest(),
+		resp: http_model.NewGetWxQRCodeResponse(),
+	}
+}

+ 21 - 0
model/gorm_model/mesage_info.go

@@ -0,0 +1,21 @@
+// Code generated by sql2gorm. DO NOT EDIT.
+package gorm_model
+
+import (
+	"time"
+)
+
+type YounggeeMessageInfo struct {
+	ID          int       `gorm:"column:id;primary_key;AUTO_INCREMENT"` // id,递增
+	MessageID   int       `gorm:"column:message_id;NOT NULL"`           // 消息内容id,对应info_message
+	MessageType int       `gorm:"column:message_type;NOT NULL"`         // 消息类型,1-4分别表示成功、通知、错误、警告
+	TalentID    string    `gorm:"column:talent_id;NOT NULL"`            // 达人id
+	ProjectName string    `gorm:"column:project_name;NOT NULL"`         // 项目名称
+	CreatedAt   time.Time `gorm:"column:created_at;NOT NULL"`           // 消息创建时间
+	IsReaded    int       `gorm:"column:is_readed;default:0;NOT NULL"`  // 是否已读,1表示未读,2表示已读
+	IsDeleted   int       `gorm:"column:is_deleted;default:0;NOT NULL"` // 是否删除,1表示未删,2表示已删
+}
+
+func (m *YounggeeMessageInfo) TableName() string {
+	return "younggee_message_info"
+}

+ 2 - 0
model/http_model/project_change_taskStatus.go

@@ -3,6 +3,8 @@ package http_model
 type ProjectChangeTaskStatusRequest struct {
 	TaskIds    []string `json:"taskIds"`
 	TaskStatus string   `json:"task_status"`
+	TaskStage  string   `json:"task_stage"`
+	IsSpecial  string   `json:"is_special"`
 }
 
 func NewProjectChangeTaskStatusRequst() *ProjectChangeTaskStatusRequest {

+ 41 - 0
model/http_model/qrcode.go

@@ -0,0 +1,41 @@
+package http_model
+
+type GetWxQRCodeRequest struct {
+	Scene string `json:"scene"` // 需要携带的参数,目前为任务id
+	Page  string `json:"page"`  // 页面path
+}
+
+type WxAccessTokenResponse struct {
+	AccessToken string `json:"access_token"` // 获取到的凭证
+	ExpiresIn   int    `json:"expires_in"`   // 凭证有效时间,单位:秒。目前是7200秒之内的值。
+	Errcode     int    `json:"errcode"`      // 错误码
+	Errmsg      string `json:"errmsg"`       // 错误信息
+}
+
+type WxQrCodeRequest struct {
+	Scene      string `json:"scene"`
+	Page       string `json:"page"`
+	Width      int    `json:"width,omitempty"`
+	CheckPath  bool   `json:"check_path,omitempty"`
+	EnvVersion string `json:"env_version,omitempty"`
+}
+
+type WxQrCodeResponse struct {
+	Errcode     int    `json:"errcode"`
+	Errmsg      string `json:"errmsg"`
+	ContentType string `json:"contentType"`
+	Buffer      []byte `json:"buffer"`
+}
+type GetWxQRCodeData struct {
+	QrCodeBytes []byte `json:"qr_code_bytes"`
+}
+
+func NewGetWxQRCodeRequest() *GetWxQRCodeRequest {
+	return new(GetWxQRCodeRequest)
+}
+
+func NewGetWxQRCodeResponse() *CommonResponse {
+	resp := new(CommonResponse)
+	resp.Data = new(GetWxQRCodeData)
+	return resp
+}

+ 1 - 0
model/http_model/task_logistics.go

@@ -52,6 +52,7 @@ type TaskLogisticsInfo struct {
 type TaskLogistics struct {
 	Talent    gorm_model.YoungeeTaskInfo
 	Logistics gorm_model.YoungeeTaskLogistics
+	Region    string
 	//Account   gorm_model.YoungeePlatformAccountInfo
 }
 

+ 3 - 2
pack/task_logistics_list.go

@@ -1,9 +1,10 @@
 package pack
 
 import (
+	"youngee_m_api/model/http_model"
+
 	"github.com/caixw/lib.go/conv"
 	"github.com/tidwall/gjson"
-	"youngee_m_api/model/http_model"
 )
 
 func MGormTaskLogisticsInfoListToHttpTaskLogisticsPreviewList(gormTaskLogisticsInfos []*http_model.TaskLogisticsInfo) []*http_model.TaskLogisticsPreview {
@@ -53,7 +54,7 @@ func GetTalentInfoStruct(TaskLogistics *http_model.TaskLogistics) *http_model.Ta
 		PlatformNickname:      conv.MustString(gjson.Get(TalentPlatformInfoSnap, "platform_nickname"), ""),
 		FansCount:             conv.MustString(gjson.Get(TalentPlatformInfoSnap, "fans_count"), ""),
 		StrategyID:            TaskLogistics.Talent.StrategyId,
-		DetailAddr:            conv.MustString(gjson.Get(TalentPostAddrSnap, "detail_addr"), ""),
+		DetailAddr:            conv.MustString(gjson.Get(TalentPostAddrSnap, "detail_addr"), "") + TaskLogistics.Region,
 		CompanyName:           TaskLogistics.Logistics.CompanyName,
 		LogisticsNumber:       TaskLogistics.Logistics.LogisticsNumber,
 		DeliveryTime:          conv.MustString(TaskLogistics.Logistics.DeliveryTime, ""),

+ 2 - 1
route/init.go

@@ -1,11 +1,12 @@
 package route
 
 import (
-	"github.com/gin-gonic/gin"
 	"youngee_m_api/handler"
 	"youngee_m_api/handler/operate"
 	"youngee_m_api/middleware"
 	"youngee_m_api/model/http_model"
+
+	"github.com/gin-gonic/gin"
 )
 
 func InitRoute(r *gin.Engine) {

+ 12 - 1
service/data.go

@@ -2,11 +2,12 @@ package service
 
 import (
 	"context"
-	"github.com/sirupsen/logrus"
 	"strings"
 	"youngee_m_api/db"
 	"youngee_m_api/model/gorm_model"
 	"youngee_m_api/model/http_model"
+
+	"github.com/sirupsen/logrus"
 )
 
 var Data *data
@@ -31,6 +32,11 @@ func (*data) DataOpinion(ctx context.Context, request http_model.DataOpinionRequ
 		logrus.WithContext(ctx).Errorf("[Link service] call CreateTaskLog error,err:%+v", err)
 		return nil, err
 	}
+	err = db.CreateMessageByTaskId(ctx, 19, 3, Data.TaskID)
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[Data service] call CreateMessageByTaskId error,err:%+v", err)
+		return nil, err
+	}
 
 	res := &http_model.DataOpinionData{
 		TaskID: Data.TaskID,
@@ -61,6 +67,11 @@ func (*data) AcceptData(ctx context.Context, request http_model.AcceptDataReques
 			logrus.WithContext(ctx).Errorf("[Data service] call CreateTaskLog error,err:%+v", err)
 			return nil, err
 		}
+		err = db.CreateMessageByTaskId(ctx, 5, 1, taskId)
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[Script service] call CreateTaskLog error,err:%+v", err)
+			return nil, err
+		}
 	}
 
 	// 2. 更新YoungeeTaskInfo表,将任务结案

+ 10 - 0
service/link.go

@@ -32,6 +32,11 @@ func (*link) LinkOpinion(ctx context.Context, request http_model.LinkOpinionRequ
 		logrus.WithContext(ctx).Errorf("[Link service] call CreateTaskLog error,err:%+v", err)
 		return nil, err
 	}
+	err = db.CreateMessageByTaskId(ctx, 18, 3, Link.TaskID)
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[Link service] call CreateMessageByTaskId error,err:%+v", err)
+		return nil, err
+	}
 
 	res := &http_model.LinkOpinionData{
 		TaskID: Link.TaskID,
@@ -59,6 +64,11 @@ func (*link) AcceptLink(ctx context.Context, request http_model.AcceptLinkReques
 			logrus.WithContext(ctx).Errorf("[Link service] call CreateTaskLog error,err:%+v", err)
 			return nil, err
 		}
+		err = db.CreateMessageByTaskId(ctx, 4, 1, taskId)
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[Script service] call CreateTaskLog error,err:%+v", err)
+			return nil, err
+		}
 	}
 
 	res := &http_model.AcceptLinkData{

+ 13 - 1
service/logistics.go

@@ -3,12 +3,13 @@ package service
 import (
 	"context"
 	"fmt"
-	"github.com/caixw/lib.go/conv"
 	"time"
 	"youngee_m_api/db"
 	"youngee_m_api/model/gorm_model"
 	"youngee_m_api/model/http_model"
 
+	"github.com/caixw/lib.go/conv"
+
 	"github.com/gin-gonic/gin"
 	"github.com/sirupsen/logrus"
 )
@@ -100,6 +101,12 @@ func (*logistics) Create(ctx context.Context, newLogistics http_model.CreateLogi
 		return nil, err
 	}
 
+	err = db.CreateMessageByTaskId(ctx, 8, 2, Logistics.TaskID)
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[logistics service] call CreateMessageByTaskId error,err:%+v", err)
+		return nil, err
+	}
+
 	res := &http_model.CreateLogisticsData{
 		LogisticsID: *logisticsID,
 	}
@@ -201,6 +208,11 @@ func (*logistics) SignForReceipt(ctx *gin.Context, data http_model.SignForReceip
 			logrus.WithContext(ctx).Errorf("[logistics service] call CreateTaskLog error,err:%+v", err)
 			return err
 		}
+		err = db.CreateMessageByTaskId(ctx, 9, 2, taskId)
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[logistics service] call CreateMessageByTaskId error,err:%+v", err)
+			return err
+		}
 	}
 
 	return nil

+ 16 - 0
service/project.go

@@ -570,6 +570,22 @@ func (*project) ChangeTaskStatus(ctx *gin.Context, data http_model.ProjectChange
 	return nil
 }
 
+func (*project) ChangeSpecialTaskStatus(ctx *gin.Context, data http_model.ProjectChangeTaskStatusRequest) interface{} {
+	err := db.ChangeSpecialTaskStatus(ctx, data.TaskIds, data.TaskStatus, data.TaskStage)
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[project service] call ChangeSpecialTaskStatus error,err:%+v", err)
+		return err
+	}
+	for _, taskId := range data.TaskIds {
+		err = db.CreateMessageByTaskId(ctx, 7, 2, taskId)
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[project service] call CreateMessageByTaskId error,err:%+v", err)
+			return err
+		}
+	}
+	return nil
+}
+
 func (p *project) GetTaskScriptList(ctx *gin.Context, projectID string, pageSize, pageNum int64, conditions *common_model.TalentConditions) (*http_model.TaskScriptListData, error) {
 	TaskScripts, total, err := db.GetTaskScriptList(ctx, projectID, pageSize, pageNum, conditions)
 	if err != nil {

+ 43 - 3
service/project_pay.go

@@ -2,9 +2,11 @@ package service
 
 import (
 	"context"
-	"github.com/sirupsen/logrus"
+	"fmt"
 	"youngee_m_api/db"
 	"youngee_m_api/model/http_model"
+
+	"github.com/sirupsen/logrus"
 )
 
 var ProjectPay *projectPay
@@ -35,15 +37,53 @@ func (*projectPay) Pay(ctx context.Context, projectPay http_model.ProjectPayRequ
 	}
 
 	// 支付更新任务状态
+	project, err2 := db.GetProjectDetail(ctx, projectPay.ProjectID)
+	if err2 != nil {
+		logrus.WithContext(ctx).Errorf("[project service] call GetPorjectDetail error,err:%+v", err)
+		return nil, err2
+	}
 	err = db.UpdateTaskSelectAtByProjectId(ctx, projectPay.ProjectID, 2)
 	if err != nil {
 		logrus.WithContext(ctx).Errorf("[projectPay service] call UpdateTaskStatusPaying error,err:%+v", err)
 		return nil, err
 	}
-	err = db.UpdateTaskStageByProjectId(ctx, projectPay.ProjectID, 2, 4)
+
+	if project.ProjectForm != 4 {
+		err = db.UpdateTaskStageByProjectId(ctx, projectPay.ProjectID, 2, 4)
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[projectPay service] call UpdateTaskStatusPaying error,err:%+v", err)
+			return nil, err
+		}
+	} else {
+		if project.ContentType == 1 {
+			err = db.UpdateTaskStageByProjectId(ctx, projectPay.ProjectID, 2, 9) //修改为待传初稿
+			if err != nil {
+				logrus.WithContext(ctx).Errorf("[projectPay service] call UpdateTaskStatusPaying error,err:%+v", err)
+				return nil, err
+			}
+		} else {
+			err = db.UpdateTaskStageByProjectId(ctx, projectPay.ProjectID, 2, 7) //修改为待传脚本
+			if err != nil {
+				logrus.WithContext(ctx).Errorf("[projectPay service] call UpdateTaskStatusPaying error,err:%+v", err)
+				return nil, err
+			}
+		}
+	}
+
+	// 插入消息-任务申请成功
+	taskIds, err := db.GetTaskIds(ctx, projectPay.ProjectID) // 获取任务id列表
 	if err != nil {
-		logrus.WithContext(ctx).Errorf("[projectPay service] call UpdateTaskStatusPaying error,err:%+v", err)
+		logrus.WithContext(ctx).Errorf("[projectPay service] call GetTaskIds error,err:%+v", err)
 		return nil, err
 	}
+	fmt.Printf("taskIds: %+v", taskIds)
+	for _, taskId := range taskIds {
+		err = db.CreateMessageByTaskId(ctx, 1, 1, taskId) // 插入消息
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[projectPay service] call CreateMessageByTaskId error,err:%+v", err)
+			return nil, err
+		}
+	}
+
 	return recordId, nil
 }

+ 123 - 0
service/qrcode.go

@@ -0,0 +1,123 @@
+package service
+
+import (
+	"bytes"
+	"context"
+	"encoding/json"
+	"errors"
+	"fmt"
+	"io/ioutil"
+	"net/http"
+	"strings"
+	"time"
+	"youngee_m_api/consts"
+	"youngee_m_api/model/http_model"
+	"youngee_m_api/model/system_model"
+	"youngee_m_api/redis"
+)
+
+const (
+	accessTokenUrlFormat = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s"
+	qrCodeUrlFormat      = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=%s"
+	wxAccesssTokenKey    = "wx_access_token"
+)
+
+var QrCode *qrcode
+
+type qrcode struct {
+	sessionTTL time.Duration
+}
+
+func QrCodeInit(config *system_model.Session) {
+	qrCode := new(qrcode)
+	qrCode.sessionTTL = time.Duration(config.TTL) * time.Minute
+	QrCode = qrCode
+}
+
+// getAndCacheWxAccessToken 获取并缓存微信的access token
+func getAndCacheWxAccessToken(ctx context.Context) (string, error) {
+	appId := "wxac396a3be7a16844"
+	secret := "c82ae9e75b4ed7d8022db5bda5371892"
+	url := fmt.Sprintf(accessTokenUrlFormat, appId, secret)
+
+	resp, err := http.Get(url)
+	if err != nil {
+		return "", errors.New("request access token failed")
+	}
+	defer resp.Body.Close()
+
+	// 解析微信服务端返回的信息
+	var accessTokenRes http_model.WxAccessTokenResponse
+	decoder := json.NewDecoder(resp.Body)
+	if err = decoder.Decode(&accessTokenRes); err != nil {
+		return "", errors.New("decode wx response failed")
+	}
+
+	if accessTokenRes.Errcode != 0 {
+		return "", errors.New("request access token failed")
+	}
+
+	// 缓存获取的access token,比微信返回的有效时间短5分钟失效
+	err = redis.Set(ctx, wxAccesssTokenKey, accessTokenRes.AccessToken, QrCode.sessionTTL)
+	if err != nil {
+		return "", err
+	}
+	return accessTokenRes.AccessToken, nil
+}
+
+func (q *qrcode) GetWxQrCode(ctx context.Context, Scene string, Page string) (*http_model.GetWxQRCodeData, error) {
+	// 获取access_token
+	accessToken, err := redis.Get(ctx, wxAccesssTokenKey)
+	if err != nil && err != consts.RedisNil {
+		// fmt.Printf("err: %+v\n", err)
+		return nil, err
+	}
+	if accessToken == "" {
+		// 如果没有缓存的access token 则获取并缓存
+		accessToken, err = getAndCacheWxAccessToken(ctx)
+		if err != nil {
+			return nil, err
+		}
+	}
+
+	qrRequest := http_model.WxQrCodeRequest{
+		Scene:      Scene,
+		Page:       Page,
+		Width:      430,
+		CheckPath:  false,
+		EnvVersion: "release",
+	}
+	jsonBody, err := json.Marshal(qrRequest)
+	if err != nil {
+		return nil, err
+	}
+
+	qrCodeUrl := fmt.Sprintf(qrCodeUrlFormat, accessToken)
+	resp, err := http.Post(qrCodeUrl, "application/json; charset=utf8", bytes.NewReader(jsonBody))
+	if err != nil {
+		return nil, err
+	}
+	defer resp.Body.Close()
+
+	var qrcodeBytes []byte
+
+	switch header := resp.Header.Get("content-Type"); {
+	case strings.HasPrefix(header, "application/json"):
+		// 如果返回的是json结构,说明发生错误
+		var qrResponse *http_model.WxQrCodeResponse
+		decoder := json.NewDecoder(resp.Body)
+		if err = decoder.Decode(&qrResponse); err != nil {
+			return nil, err
+		}
+		return nil, nil
+	case strings.HasPrefix(header, "image"):
+		qrcodeBytes, err = ioutil.ReadAll(resp.Body)
+		if err != nil {
+			return nil, err
+		}
+	}
+	data := http_model.GetWxQRCodeData{
+		QrCodeBytes: qrcodeBytes,
+	}
+	return &data, nil
+}

+ 11 - 0
service/script.go

@@ -34,6 +34,12 @@ func (*script) ScriptOpinion(ctx context.Context, request http_model.ScriptOpini
 		return nil, err
 	}
 
+	err = db.CreateMessageByTaskId(ctx, 16, 3, Script.TaskID)
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[Script service] call CreateMessageByTaskId error,err:%+v", err)
+		return nil, err
+	}
+
 	res := &http_model.ScriptOpinionData{
 		TaskID: Script.TaskID,
 	}
@@ -60,6 +66,11 @@ func (*script) AcceptScript(ctx context.Context, request http_model.AcceptScript
 			logrus.WithContext(ctx).Errorf("[Script service] call CreateTaskLog error,err:%+v", err)
 			return nil, err
 		}
+		err = db.CreateMessageByTaskId(ctx, 2, 1, taskId)
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[Script service] call CreateTaskLog error,err:%+v", err)
+			return nil, err
+		}
 	}
 
 	res := &http_model.AcceptScriptData{

+ 12 - 1
service/sketch.go

@@ -2,12 +2,13 @@ package service
 
 import (
 	"context"
-	"github.com/caixw/lib.go/conv"
 	"strings"
 	"youngee_m_api/db"
 	"youngee_m_api/model/gorm_model"
 	"youngee_m_api/model/http_model"
 
+	"github.com/caixw/lib.go/conv"
+
 	"github.com/sirupsen/logrus"
 )
 
@@ -34,6 +35,11 @@ func (*sketch) SketchOption(ctx context.Context, request http_model.SketchOpinio
 		logrus.WithContext(ctx).Errorf("[Sketch service] call CreateTaskLog error,err:%+v", err)
 		return nil, err
 	}
+	err = db.CreateMessageByTaskId(ctx, 17, 3, Sketch.TaskID)
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[Sketch service] call CreateMessageByTaskId error,err:%+v", err)
+		return nil, err
+	}
 	res := &http_model.SketchOpinionData{
 		TaskID: Sketch.TaskID,
 	}
@@ -60,6 +66,11 @@ func (*sketch) AcceptSketch(ctx context.Context, request http_model.AcceptSketch
 			logrus.WithContext(ctx).Errorf("[Sketch service] call CreateTaskLog error,err:%+v", err)
 			return nil, err
 		}
+		err = db.CreateMessageByTaskId(ctx, 3, 1, taskId)
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[Script service] call CreateTaskLog error,err:%+v", err)
+			return nil, err
+		}
 	}
 
 	res := &http_model.AcceptSketchData{

+ 2 - 2
service/terminate.go

@@ -15,7 +15,7 @@ var Terminate *terminate
 type terminate struct {
 }
 
-// TaskTerminate 同意初稿
+// TaskTerminate 解约
 func (*terminate) TaskTerminate(ctx context.Context, request http_model.TaskTerminateRequest) (*http_model.TaskTerminateData, error) {
 	var TaskIDList []string
 	TaskIDs := strings.Split(request.TaskIds, ",")
@@ -23,7 +23,7 @@ func (*terminate) TaskTerminate(ctx context.Context, request http_model.TaskTerm
 		TaskIDList = append(TaskIDList, taskId)
 	}
 	fmt.Printf("acc request %+v", TaskIDList)
-	err := db.Terminate(ctx, TaskIDList, request.ProjectIds)
+	err := db.Terminate(ctx, TaskIDList)
 	if err != nil {
 		logrus.WithContext(ctx).Errorf("[Terminate service] call CreateTerminate error,err:%+v", err)
 		return nil, err