Ver Fonte

解决违约管理、解约问题,修改定时任务

Ohio-HYF há 2 anos atrás
pai
commit
225e40ceea
7 ficheiros alterados com 468 adições e 208 exclusões
  1. 59 32
      db/default.go
  2. 6 1
      db/logistics.go
  3. 343 112
      db/operate.go
  4. 54 59
      db/terminate.go
  5. 1 0
      model/http_model/task_logistics.go
  6. 3 2
      pack/task_logistics_list.go
  7. 2 2
      service/terminate.go

+ 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
 			}
 		}
 	}

+ 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 {

+ 343 - 112
db/operate.go

@@ -874,6 +874,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 +905,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 +951,20 @@ 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)
+			}
 			fmt.Println("已创建图文类型的初稿违约记录")
 		}
 	}
@@ -959,13 +977,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 +1022,23 @@ 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)
+			}
 			fmt.Println("创建已提交初稿的图文类型的初稿违约记录")
 		}
 	}
@@ -1013,11 +1048,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 +1063,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 +1102,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 +1143,23 @@ 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)
+			}
 			fmt.Println("已创建视频类型的初稿违约记录")
 		}
 	}
@@ -1118,13 +1170,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 +1213,38 @@ 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)
+			}
 			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 +1259,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 +1295,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 +1331,23 @@ 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)
+				}
 				fmt.Println("创建时已违约则创建视频类型的脚本违约记录")
 			}
 		} else {
@@ -1275,15 +1365,24 @@ 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)
+				}
 				fmt.Println("已创建视频类型的脚本违约记录")
 			}
 		}
@@ -1297,13 +1396,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 +1434,23 @@ 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)
+				}
 				fmt.Println("创建时已违约则创建已提交脚本的视频类型的脚本违约记录")
 			}
 		} else {
@@ -1351,15 +1468,23 @@ 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)
+				}
 				fmt.Println("创建已提交脚本的视频类型的脚本违约记录")
 			}
 		}
@@ -1367,13 +1492,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 +1510,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 +1546,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 +1584,23 @@ 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)
+				}
 				fmt.Println("创建时已违约则创建链接违约记录")
 			}
 		} else {
@@ -1474,15 +1618,23 @@ 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)
+				}
 				fmt.Println("已创建链接违约记录")
 			}
 		}
@@ -1493,13 +1645,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 +1686,23 @@ 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)
+				}
 				fmt.Println("创建时已违约则创建已提交链接的链接违约记录")
 			}
 		} else {
@@ -1550,15 +1720,23 @@ 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)
+				}
 				fmt.Println("创建已提交链接的链接违约记录")
 			}
 		}
@@ -1566,13 +1744,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 +1760,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 +1798,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 +1837,23 @@ 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)
+				}
 				fmt.Println("创建时已违约则创建数据违约记录")
 			}
 		} else {
@@ -1674,16 +1871,24 @@ 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)
+				}
 				fmt.Println("已创建数据违约记录")
 			}
 		}
@@ -1694,13 +1899,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 +1940,23 @@ 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)
+				}
 				fmt.Println("创建时已违约则创建已提交数据的数据违约记录")
 			}
 		} else {
@@ -1751,15 +1974,23 @@ 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)
+				}
 				fmt.Println("创建已提交数据的数据违约记录")
 			}
 		}

+ 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
 }

+ 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 - 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