Procházet zdrojové kódy

Merge branch 'refs/heads/develop' into develop-zhou

Ethan před 6 měsíci
rodič
revize
e6056d1f92
63 změnil soubory, kde provedl 3733 přidání a 187 odebrání
  1. 24 5
      config/pro.yaml
  2. 12 0
      db/auto_default.go
  3. 729 0
      db/auto_task.go
  4. 21 0
      db/data.go
  5. 21 0
      db/link.go
  6. 344 1
      db/project.go
  7. 607 0
      db/project_task.go
  8. 22 0
      db/sketch.go
  9. 15 1
      db/task.go
  10. 6 0
      go.mod
  11. 61 0
      handler/PassproTaskCoop.go
  12. 56 0
      handler/Prelinklist.go
  13. 61 0
      handler/RefuseproTaskCoop.go
  14. 58 0
      handler/endtask.go
  15. 61 0
      handler/executedata.go
  16. 59 0
      handler/gettasklist.go
  17. 56 0
      handler/predatalist.go
  18. 59 0
      handler/presketchlist.go
  19. 61 0
      handler/project_data.go
  20. 1 1
      handler/project_taskList.go
  21. 61 0
      handler/projectdata.go
  22. 60 0
      handler/reject_data.go
  23. 60 0
      handler/reject_link.go
  24. 58 0
      handler/reject_sketch.go
  25. 59 0
      handler/taskdatalist.go
  26. 59 0
      handler/tasklinklist.go
  27. 59 0
      handler/tasksketchlist.go
  28. 4 6
      main.go
  29. 14 15
      model/gorm_model/info_auto_task.go
  30. 33 34
      model/gorm_model/project.go
  31. 25 0
      model/gorm_model/project_task.go
  32. 21 24
      model/gorm_model/recruit_strategy.go
  33. 27 0
      model/gorm_model/s_project.go
  34. 2 5
      model/gorm_model/sketch.go
  35. 20 0
      model/gorm_model/supplier.go
  36. 27 24
      model/gorm_model/talent.go
  37. 14 0
      model/http_model/EndTaskRequest.go
  38. 21 0
      model/http_model/PassproTaskCoopRequest.go
  39. 30 0
      model/http_model/PreLinkList.go
  40. 20 0
      model/http_model/RefuseproTaskCoopRequest.go
  41. 4 4
      model/http_model/data_accept.go
  42. 39 0
      model/http_model/executedata.go
  43. 45 0
      model/http_model/gettasklist.go
  44. 0 1
      model/http_model/link_opinion.go
  45. 30 0
      model/http_model/predatalist.go
  46. 30 0
      model/http_model/presketchlist.go
  47. 18 0
      model/http_model/project_data_request.go
  48. 31 0
      model/http_model/projectdatarequest.go
  49. 18 0
      model/http_model/reject_data.go
  50. 18 0
      model/http_model/reject_link.go
  51. 0 1
      model/http_model/sketch_opinion.go
  52. 18 0
      model/http_model/sketch_reject.go
  53. 8 3
      model/http_model/sktech_info.go
  54. 37 0
      model/http_model/taskdatalist.go
  55. 34 0
      model/http_model/tasklinklist.go
  56. 32 0
      model/http_model/tasksketchlist.go
  57. 66 43
      route/init.go
  58. 101 0
      service/Task.go
  59. 62 14
      service/autoTask.go
  60. 33 0
      service/data.go
  61. 33 0
      service/link.go
  62. 29 2
      service/project.go
  63. 39 3
      service/sketch.go

+ 24 - 5
config/pro.yaml

@@ -1,8 +1,27 @@
+# mysql:
+#   host: 192.168.0.165
+#   port: 3306
+#   user: test
+#   password: testDB_123
+#   database: youngmini
+#
+# redis:
+#   host: 139.9.53.143
+#   port: 6379
+#   auth: younggeeRedis_123
+#   database: 1
+#
+# server:
+#   host: 0.0.0.0
+#   port: 8388
+#   session:
+#     ttl: -1 #minute
+
 mysql:
-  host: 192.168.0.165
+  host: 139.9.53.143
   port: 3306
-  user: test
-  password: testDB_123
+  user: talent
+  password: talentDB_123
   database: youngmini
 
 redis:
@@ -10,9 +29,9 @@ redis:
   port: 6379
   auth: younggeeRedis_123
   database: 1
-  
+
 server:
   host: 0.0.0.0
   port: 8388
   session:
-    ttl: -1 #minute
+    ttl: -1 # minute

+ 12 - 0
db/auto_default.go

@@ -19,3 +19,15 @@ func GetLastAutoDefaultID() (int, error) {
 	//fmt.Printf("auto task %+v %+v", result, LastTask)
 	return LastDefault.AutoDefaultID, nil
 }
+
+// GetLastAutoDefaultIDByEnterpriseId 根据enterpriseId查找违约扣款Id
+func GetLastAutoDefaultIDByEnterpriseId(enterpriseId string) (int, error) {
+	db := GetReadDB(context.Background())
+	LastDefault := gorm_model.InfoAutoDefaultHandle{}
+	autoDefaultIErr := db.Model(gorm_model.InfoAutoDefaultHandle{}).Where("enterprise_id = ?", enterpriseId).Find(&LastDefault).Error
+	if autoDefaultIErr != nil {
+		log.Println("DB GetLastAutoDefaultID:", autoDefaultIErr)
+		return 0, autoDefaultIErr
+	}
+	return LastDefault.AutoDefaultID, nil
+}

+ 729 - 0
db/auto_task.go

@@ -2,6 +2,7 @@ package db
 
 import (
 	"context"
+	"fmt"
 	"github.com/issue9/conv"
 	"time"
 	"youngee_b_api/model/gorm_model"
@@ -144,3 +145,731 @@ func AutoCompleteSelection() error {
 
 	return nil
 }
+
+// GetAutoDraftDefaultTask 品牌种草-商品寄拍 初稿超时违约
+func GetAutoDraftDefaultTask() error {
+	fmt.Println("GetAutoDraftDefaultInPicTask Running")
+	db := GetReadDB(context.Background())
+
+	// 1. 根据种草任务形式取出对应的Project
+	var projectInfos []*gorm_model.ProjectInfo
+	projectInfoErr := db.Model(gorm_model.ProjectInfo{}).Where("project_type = ? AND project_form = ? ", 1, 1).Find(&projectInfos).Error
+	if projectInfoErr != nil {
+		return projectInfoErr
+	}
+
+	// 2. 构建查询map
+	var projectIds []string
+	projectIdToAutoTaskIdMap := map[string]int{}    // 项目id 对 定时任务id 的map
+	projectIdToAutoDefaultIdMap := map[string]int{} // 项目id 对 违约扣款设置id 的map
+	taskIdToFeeFormMap := make(map[string]int)      // taskId 对 稿费形式的 map
+	TaskIdToProjectId := make(map[string]string)    // taskId 对 项目id的 map
+	var taskNeedModIds []string                     // 首次提交初稿的任务记录id
+	var submitTaskNeedModIds []string               // 修改后提交初稿的任务记录id
+	for _, projectInfo := range projectInfos {
+		projectIds = append(projectIds, projectInfo.ProjectID)
+		projectIdToAutoTaskIdMap[projectInfo.ProjectID] = int(projectInfo.AutoTaskID)
+		projectIdToAutoDefaultIdMap[projectInfo.ProjectID] = int(projectInfo.AutoDefaultID)
+	}
+	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 = ? AND logistics_status = 3", projectId, 2, 9, 0).Find(&taskInfos)
+		for _, taskInfo := range taskInfos {
+			TaskIdToProjectId[taskInfo.TaskID] = projectId
+			taskNeedMod := gorm_model.YoungeeTaskInfo{}
+			db2 := GetReadDB(context.Background())
+
+			// 保存所有满足物流状态为 3 且 初稿上传状态为 1或 3 的任务记录的id
+			db2.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", taskInfo.TaskID).First(&taskNeedMod)
+			taskIdToFeeFormMap[taskInfo.TaskID] = taskInfo.FeeForm
+			if taskNeedMod.TaskStage == 9 && taskNeedMod.SketchStatus == 1 {
+				taskNeedModIds = append(taskNeedModIds, taskInfo.TaskID)
+			}
+			if taskNeedMod.TaskStage == 9 && taskNeedMod.SketchStatus == 3 {
+				submitTaskNeedModIds = append(submitTaskNeedModIds, taskInfo.TaskID)
+			}
+		}
+	}
+
+	// 3. 对初次初稿未上传的操作
+	for _, taskNeedModId := range taskNeedModIds {
+		if taskNeedModId != "3601319242" {
+			break
+		}
+		fmt.Println("Task right")
+
+		// 获取taskId对应的autoTaskId
+		autoTaskId := projectIdToAutoTaskIdMap[TaskIdToProjectId[taskNeedModId]]
+
+		// 根据autoTaskId去查找对应的初稿违约小时数
+		dbStart := GetReadDB(context.Background())
+		var DraftDefaultInPic int32
+		dbStart.Model(gorm_model.InfoAutoTask{}).Select("draft_default").Where("auto_task_id = ?", autoTaskId).First(&DraftDefaultInPic)
+
+		// 根据taskId查询taskInfo
+		db3 := GetReadDB(context.Background())
+		taskLogisticNeedMod := gorm_model.YoungeeTaskInfo{}
+		db3.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", taskNeedModId).First(&taskLogisticNeedMod)
+
+		// 获取task对应的autoDefaultId 并取出违约扣款比例
+		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 {
+			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 {
+			// 稿费形式为其他
+			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)
+		}
+
+		//	若无违约自动处理时间 则添加初稿违约自动处理时间
+		if taskLogisticNeedMod.TaskID != "" && taskLogisticNeedMod.SketchMissingTime.IsZero() {
+			dd, _ := time.ParseDuration(conv.MustString(DraftDefaultInPic, "") + "h")
+			db4 := GetReadDB(context.Background())
+			t := taskLogisticNeedMod.SignedTime.Add(dd)
+			db4.Where("task_id = ?", taskNeedModId).Updates(&gorm_model.YoungeeTaskInfo{
+				SketchMissingTime: t,
+			})
+			taskLogisticNeedMod.SketchMissingTime = t
+			fmt.Println("已添加 品牌种草-商品寄拍-初次初稿未上传 初稿违约自动处理时间")
+			fmt.Println(sketchDefaultRate, sketchErrRate)
+		}
+
+		// 判断是否超时违约
+		if taskLogisticNeedMod.TaskID != "" && taskLogisticNeedMod.SketchMissingTime.Sub(time.Now()) <= 0 {
+			fmt.Println("taskId: ", taskLogisticNeedMod.TaskID, "超时违约触发")
+			taskInfo := gorm_model.YoungeeTaskInfo{}
+			dbt := GetReadDB(context.Background())
+			err2 := dbt.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", taskLogisticNeedMod.TaskID).Find(&taskInfo).Error
+			if err2 != nil {
+				return err2
+			}
+
+			// 计算违约扣款后的达人所得
+			settleAmount := taskInfo.DraftFee * (1.0 - float64(taskInfo.LinkBreakRate+taskInfo.DataBreakRate+sketchDefaultRate+taskInfo.ScriptBreakRate)/100)
+			if settleAmount <= 0 {
+				settleAmount = 0.0
+			}
+
+			// 计算违约扣款后的服务商所得
+			realServiceCharge := taskInfo.ServiceCharge * (1.0 - float64(taskInfo.LinkBreakRate+taskInfo.DataBreakRate+sketchDefaultRate+taskInfo.ScriptBreakRate)/100)
+			if realServiceCharge <= 0 {
+				realServiceCharge = 0.0
+			}
+
+			// 计算企业需要实际支付金额
+			realPayment := settleAmount + realServiceCharge
+			if realPayment <= 0 {
+				realPayment = 0.0
+			}
+
+			db8 := GetReadDB(context.Background())
+			fmt.Println("待更新的taskId: ", taskLogisticNeedMod.TaskID)
+			db8.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", taskLogisticNeedMod.TaskID).Updates(
+				map[string]interface{}{
+					"sketch_missing_status": 1,
+					"cur_default_type":      3,
+					"sketch_break_rate":     sketchDefaultRate,
+					"settle_amount":         settleAmount,
+					"err_break_rate":        sketchErrRate,
+					"real_service_charge":   realServiceCharge,
+					"real_payment":          realPayment,
+				})
+			createTaskLogErr := CreateTaskLog(context.Background(), taskLogisticNeedMod.TaskID, "初稿逾期")
+			if createTaskLogErr != nil {
+				log.WithContext(context.Background()).Errorf("[operate db] call CreateTaskLog error,err:%+v", createTaskLogErr)
+			}
+			createMessageByTaskIdErr := CreateMessageByTaskId(context.Background(), 22, 4, taskLogisticNeedMod.TaskID)
+			if createMessageByTaskIdErr != nil {
+				log.WithContext(context.Background()).Errorf("[operate db] call CreateMessageByTaskId error,err:%+v", createMessageByTaskIdErr)
+			}
+			fmt.Println("已创建 品牌种草-商品寄拍-初次初稿未上传 初稿违约记录")
+		}
+	}
+
+	// 4. 判断应该修改后上传的任务
+	for _, submitTaskNeedModId := range submitTaskNeedModIds {
+
+		// 获取 autoTaskId 及其对应的限制时间
+		db2 := GetReadDB(context.Background())
+		var DraftDefaultInMv int32
+		db2.Model(&gorm_model.InfoAutoTask{}).Select("draft_default").Where("auto_task_id = ?", projectIdToAutoTaskIdMap[TaskIdToProjectId[submitTaskNeedModId]]).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[TaskIdToProjectId[submitTaskNeedModId]]).Find(&autoDefaultHandle)
+
+		var sketchDefaultRate int
+		var sketchErrRate int
+		if taskIdToFeeFormMap[submitTaskNeedModId] == 1 {
+			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 {
+			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())
+		var taskSketchInfo gorm_model.YounggeeSketchInfo
+		db1.Model(gorm_model.YounggeeSketchInfo{}).Where("task_id = ? and is_review = 1", submitTaskNeedModId).Order("reject_at desc").First(&taskSketchInfo)
+		if taskSketchInfo.AutoSketchBreakAt.IsZero() {
+			err4 := db1.Where("task_id = ?", submitTaskNeedModId).Updates(&gorm_model.YounggeeSketchInfo{AutoSketchBreakAt: taskSketchInfo.RejectAt.Add(dd)}).Error
+			if err4 != nil {
+				return err4
+			}
+			taskSketchInfo.AutoSketchBreakAt = taskSketchInfo.RejectAt.Add(dd)
+			fmt.Println("已添加 品牌种草-商品寄拍-修改后上传初稿未上传自动处理时间")
+		}
+
+		// 判断是否违约
+		if taskSketchInfo.TaskID != "" && taskSketchInfo.AutoSketchBreakAt.Sub(time.Now()) <= 0 {
+			db4 := GetReadDB(context.Background())
+			err1 := db4.Model(gorm_model.YoungeeContractInfo{}).Create(&gorm_model.YoungeeContractInfo{
+				TaskID: submitTaskNeedModId, ProjectID: TaskIdToProjectId[submitTaskNeedModId], BreakType: 2, BreakAt: time.Now(), DefaultStatus: 1}).Error
+			if err1 != nil {
+				return err1
+			}
+			taskInfo := gorm_model.YoungeeTaskInfo{}
+			dbt := GetReadDB(context.Background())
+			err2 := dbt.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", submitTaskNeedModId).Find(&taskInfo).Error
+			if err2 != nil {
+				return err2
+			}
+
+			// 计算违约扣款后的达人所得
+			settleAmount := taskInfo.DraftFee * (1.0 - float64(sketchDefaultRate+taskInfo.DataBreakRate+taskInfo.LinkBreakRate+taskInfo.ScriptBreakRate)/100)
+			if settleAmount <= 0 {
+				settleAmount = 0.
+			}
+
+			// 计算违约扣款后的服务商所得
+			realServiceCharge := taskInfo.ServiceCharge * (1.0 - float64(taskInfo.LinkBreakRate+taskInfo.DataBreakRate+sketchDefaultRate+taskInfo.ScriptBreakRate)/100)
+			if realServiceCharge <= 0 {
+				realServiceCharge = 0.0
+			}
+
+			// 计算企业需要实际支付金额
+			realPayment := settleAmount + realServiceCharge
+			if realPayment <= 0 {
+				realPayment = 0.0
+			}
+
+			db3 := GetReadDB(context.Background())
+			err2 = db3.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", submitTaskNeedModId).Updates(
+				map[string]interface{}{
+					"sketch_missing_status": 1,
+					"cur_default_type":      3,
+					"sketch_break_rate":     sketchDefaultRate,
+					"settle_amount":         settleAmount,
+					"err_break_rate":        sketchErrRate,
+					"real_service_charge":   realServiceCharge,
+					"real_payment":          realPayment,
+				}).Error
+			if err2 != nil {
+				return err2
+			}
+			createTaskLogErr := CreateTaskLog(context.Background(), submitTaskNeedModId, "初稿逾期")
+			if createTaskLogErr != nil {
+				log.WithContext(context.Background()).Errorf("[operate db] call CreateTaskLog error,err:%+v", createTaskLogErr)
+			}
+			createMessageByTaskIdErr := CreateMessageByTaskId(context.Background(), 22, 4, submitTaskNeedModId)
+			if createMessageByTaskIdErr != nil {
+				log.WithContext(context.Background()).Errorf("[operate db] call CreateMessageByTaskId error,err:%+v", createMessageByTaskIdErr)
+			}
+			fmt.Println("创建已提交初稿的初稿违约记录")
+		}
+	}
+	return nil
+}
+
+// GetAutoLinkDefaultTask 品牌种草 链接超时违约
+func GetAutoLinkDefaultTask() error {
+
+	// 1. 筛选出可能链接超时违约的子任务,首次/修改
+	db := GetReadDB(context.Background())
+	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
+	projectIdToAutoTaskIdMap := map[string]int{}
+	// 项目id 对 违约定时任务id 的map
+	projectIdToAutoDefaultIdMap := map[string]int{}
+	var taskIds []string
+	// taskId 对 稿费形式的 map
+	taskIdToFeeFormMap := make(map[string]int)
+	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 = ? ", projectInfo.ProjectID, 2, 11, 0).Find(&taskInfos)
+		for _, taskInfo := range taskInfos {
+			taskIdToProjectIdMap[taskInfo.TaskID] = projectInfo.ProjectID
+			taskIds = append(taskIds, taskInfo.TaskID)
+			taskIdToFeeFormMap[taskInfo.TaskID] = taskInfo.FeeForm
+		}
+	}
+	// 首次提交链接的任务记录id
+	var taskNeedModIds []string
+	// 已提交链接的任务记录id
+	var submitTaskNeedModIds []string
+	for _, taskId := range taskIds {
+		var taskInfo gorm_model.YoungeeTaskInfo
+		db3 := GetReadDB(context.Background())
+		// 保存所有链接上传状态为 1  且任务状态为12 的任务记录的id
+		db3.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", taskId).First(&taskInfo)
+		if taskInfo.LinkStatus == 1 && taskInfo.TaskStage == 11 {
+			taskNeedModIds = append(taskNeedModIds, taskId)
+		}
+		// 保存所有链接上传状态为 3  且任务状态为12 的任务记录的id
+		if taskInfo.LinkStatus == 3 && taskInfo.TaskStage == 11 {
+			submitTaskNeedModIds = append(submitTaskNeedModIds, taskId)
+		}
+	}
+
+	// 2. 对于需要初次上传链接但是未上传的子任务
+	for _, taskNeedModId := range taskNeedModIds {
+		db2 := GetReadDB(context.Background())
+		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 {
+			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 {
+			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
+		db1.Model(gorm_model.YounggeeSketchInfo{}).Where("task_id = ? AND is_ok = ?", taskNeedModId, 1).Find(&taskSketchInfo)
+		dbTask := GetReadDB(context.Background())
+		var taskInfoCurr gorm_model.YoungeeTaskInfo
+		dbTask.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", taskNeedModId).Find(&taskInfoCurr)
+		if taskInfoCurr.LinkMissingTime.IsZero() {
+			// db1.Where("task_id = ?", taskNeedModId).Updates(&gorm_model.YounggeeSketchInfo{AutoLinkBreakAt: taskSketchInfo.AgreeAt.Add(dd)})
+			dbTask.Where("task_id = ?", taskNeedModId).Updates(&gorm_model.YoungeeTaskInfo{LinkMissingTime: taskSketchInfo.AgreeAt.Add(dd)})
+			fmt.Println("已添加链接违约自动处理时间")
+		} else {
+			if taskInfoCurr.TaskID != "" && taskInfoCurr.LinkMissingTime.Sub(time.Now()) <= 0 {
+				//db4 := GetReadDB(context.Background())
+				//err1 := db4.Model(gorm_model.YoungeeContractInfo{}).Create(&gorm_model.YoungeeContractInfo{
+				//	TaskID: taskNeedModId, ProjectID: taskIdToProjectIdMap[taskNeedModId], BreakType: 3, BreakAt: time.Now(), DefaultStatus: 1}).Error
+				//if err1 != nil {
+				//	return err1
+				//}
+				taskInfo := gorm_model.YoungeeTaskInfo{}
+				dbt := GetReadDB(context.Background())
+				err2 := dbt.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", taskNeedModId).Find(&taskInfo).Error
+				if err2 != nil {
+					return err2
+				}
+				// 达人实际所得
+				settleAmount := taskInfo.DraftFee * (1.0 - float64(linkDefaultRate+taskInfo.DataBreakRate+taskInfo.SketchBreakRate+taskInfo.ScriptBreakRate)/100)
+				if settleAmount <= 0 {
+					settleAmount = 0.0
+				}
+				// 服务商实际所得
+				realServiceCharge := taskInfo.ServiceCharge * (1.0 - float64(taskInfo.LinkBreakRate+taskInfo.DataBreakRate+linkDefaultRate+taskInfo.ScriptBreakRate)/100)
+				if realServiceCharge <= 0 {
+					realServiceCharge = 0.0
+				}
+				// 企业实际支付
+				realPayment := settleAmount + realServiceCharge
+				if realPayment <= 0 {
+					realPayment = 0.0
+				}
+				db3 := GetReadDB(context.Background())
+				err2 = db3.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", taskNeedModId).Updates(
+					map[string]interface{}{
+						"link_missing_status": 1,
+						"cur_default_type":    5,
+						"link_break_rate":     linkDefaultRate,
+						"settle_amount":       settleAmount,
+						"real_service_charge": realServiceCharge,
+						"err_break_rate":      linkErrRate,
+						"real_payment":        realPayment,
+					}).Error
+				if err2 != nil {
+					return err2
+				}
+				err = CreateTaskLog(context.Background(), taskNeedModId, "链接逾期")
+				if err != nil {
+					log.WithContext(context.Background()).Errorf("[operate db] call CreateTaskLog error,err:%+v", err)
+				}
+				err = CreateMessageByTaskId(context.Background(), 23, 4, taskNeedModId)
+				if err != nil {
+					log.WithContext(context.Background()).Errorf("[operate db] call CreateMessageByTaskId error,err:%+v", err)
+				}
+				fmt.Println("已创建链接违约记录")
+			}
+		}
+	}
+
+	// 3. 对于需要修改后上传的链接
+	for _, submitTaskNeedModId := range submitTaskNeedModIds {
+		db2 := GetReadDB(context.Background())
+		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 {
+			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 {
+			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
+		db1.Model(gorm_model.YounggeeLinkInfo{}).Where("task_id = ?", submitTaskNeedModId).Order("reject_at desc").First(&taskLinkInfo)
+		dbTask := GetReadDB(context.Background())
+		var taskInfoCurr gorm_model.YoungeeTaskInfo
+		dbTask.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", submitTaskNeedModId).Find(&taskInfoCurr)
+		if taskLinkInfo.AutoLinkBreakAt.IsZero() {
+			err4 := db1.Where("task_id = ?", submitTaskNeedModId).Updates(&gorm_model.YounggeeLinkInfo{AutoLinkBreakAt: taskLinkInfo.RejectAt.Add(dd)}).Error
+			if err4 != nil {
+				return err4
+			}
+			taskInfoCurrErr := dbTask.Where("task_id = ?", submitTaskNeedModId).Updates(&gorm_model.YoungeeTaskInfo{LinkMissingTime: taskLinkInfo.RejectAt.Add(dd)}).Error
+			if taskInfoCurrErr != nil {
+				return taskInfoCurrErr
+			}
+			fmt.Println("已添加链接违约自动处理时间")
+		} else {
+			if taskLinkInfo.TaskID != "" && taskLinkInfo.AutoLinkBreakAt.Sub(time.Now()) <= 0 {
+				//db4 := GetReadDB(context.Background())
+				//err1 := db4.Model(gorm_model.YoungeeContractInfo{}).Create(&gorm_model.YoungeeContractInfo{
+				//	TaskID: submitTaskNeedModId, ProjectID: taskIdToProjectIdMap[submitTaskNeedModId], BreakType: 3, BreakAt: time.Now(), DefaultStatus: 1}).Error
+				//if err1 != nil {
+				//	return err1
+				//}
+				taskInfo := gorm_model.YoungeeTaskInfo{}
+				dbt := GetReadDB(context.Background())
+				err2 := dbt.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", submitTaskNeedModId).Find(&taskInfo).Error
+				if err2 != nil {
+					return err2
+				}
+				// 达人实际所得
+				settleAmount := taskInfo.DraftFee * (1.0 - float64(linkDefaultRate+taskInfo.DataBreakRate+taskInfo.SketchBreakRate+taskInfo.ScriptBreakRate)/100)
+				if settleAmount <= 0 {
+					settleAmount = 0.0
+				}
+				// 服务商实际所得
+				realServiceCharge := taskInfo.ServiceCharge * (1.0 - float64(taskInfo.LinkBreakRate+taskInfo.DataBreakRate+linkDefaultRate+taskInfo.ScriptBreakRate)/100)
+				if realServiceCharge <= 0 {
+					realServiceCharge = 0.0
+				}
+				// 企业实际支付
+				realPayment := settleAmount + realServiceCharge
+				if realPayment <= 0 {
+					realPayment = 0.0
+				}
+				db3 := GetReadDB(context.Background())
+				err2 = db3.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", submitTaskNeedModId).Updates(
+					map[string]interface{}{
+						"link_missing_status": 1,
+						"cur_default_type":    5,
+						"link_break_rate":     linkDefaultRate,
+						"settle_amount":       settleAmount,
+						"real_service_charge": realServiceCharge,
+						"err_break_rate":      linkErrRate,
+						"real_payment":        realPayment,
+					}).Error
+				if err2 != nil {
+					return err2
+				}
+				err = CreateTaskLog(context.Background(), submitTaskNeedModId, "链接逾期")
+				if err != nil {
+					log.WithContext(context.Background()).Errorf("[operate db] call CreateTaskLog error,err:%+v", err)
+				}
+				err = CreateMessageByTaskId(context.Background(), 23, 4, submitTaskNeedModId)
+				if err != nil {
+					log.WithContext(context.Background()).Errorf("[operate db] call CreateMessageByTaskId error,err:%+v", err)
+				}
+				fmt.Println("创建已提交链接的链接违约记录")
+			}
+		}
+	}
+	return nil
+}
+
+// GetAutoCaseCloseDefaultTask 品牌种草 数据超时违约
+func GetAutoCaseCloseDefaultTask() error {
+
+	// 1. 筛选出可能数据违约的种草子任务 待上传/待修改
+	db := GetReadDB(context.Background())
+	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
+	projectIdToAutoTaskIdMap := map[string]int{}
+	// 项目id 对 违约定时任务id 的map
+	projectIdToAutoDefaultIdMap := map[string]int{}
+	var taskIds []string
+	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 = ? ", projectInfo.ProjectID, 2, 13, 0).Find(&taskInfos)
+		for _, taskInfo := range taskInfos {
+			taskIdToProjectIdMap[taskInfo] = projectInfo.ProjectID
+			taskIds = append(taskIds, taskInfo)
+		}
+	}
+	// 首次提交链接的任务记录id
+	var taskNeedModIds []string
+	// 已提交链接的任务记录id
+	var submitTaskNeedModIds []string
+	// taskId 对 稿费形式的 map
+	taskIdToFeeFormMap := make(map[string]int)
+	for _, taskId := range taskIds {
+		var taskInfo gorm_model.YoungeeTaskInfo
+		db3 := GetReadDB(context.Background())
+		// 保存所有数据上传状态为 1  且任务状态为14 的任务记录的id
+		db3.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", taskId).First(&taskInfo)
+		if taskInfo.DataStatus == 1 && taskInfo.TaskStage == 13 {
+			taskNeedModIds = append(taskNeedModIds, taskId)
+		}
+		// 保存所有数据上传状态为 3  且任务状态为14 的任务记录的id
+		if taskInfo.DataStatus == 3 && taskInfo.TaskStage == 13 {
+			submitTaskNeedModIds = append(submitTaskNeedModIds, taskId)
+		}
+		taskIdToFeeFormMap[taskId] = taskInfo.FeeForm
+	}
+
+	// 2. 对待上传数据的子任务判断
+	for _, taskNeedModId := range taskNeedModIds {
+		db2 := GetReadDB(context.Background())
+		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 {
+			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 {
+			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())
+		var taskLinkInfo gorm_model.YounggeeLinkInfo
+		db1.Model(gorm_model.YounggeeLinkInfo{}).Where("task_id = ? AND is_ok = ?", taskNeedModId, 1).Find(&taskLinkInfo)
+		dbTask := GetReadDB(context.Background())
+		var taskInfoCurr gorm_model.YoungeeTaskInfo
+		dbTask.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", taskNeedModId).Find(&taskInfoCurr)
+		if taskInfoCurr.DataMissingTime.IsZero() {
+			db1.Where("task_id = ?", taskNeedModId).Updates(&gorm_model.YounggeeLinkInfo{AutoDataBreakAt: taskLinkInfo.AgreeAt.Add(dd)})
+			dbTask.Where("task_id = ?", taskNeedModId).Updates(&gorm_model.YoungeeTaskInfo{DataMissingTime: taskLinkInfo.AgreeAt.Add(dd)})
+			fmt.Println("已添加数据违约自动处理时间")
+		} else {
+			if taskInfoCurr.TaskID != "" && taskInfoCurr.DataMissingTime.Sub(time.Now()) <= 0 {
+				//db4 := GetReadDB(context.Background())
+				//err1 := db4.Model(gorm_model.YoungeeContractInfo{}).Create(&gorm_model.YoungeeContractInfo{
+				//	TaskID: taskNeedModId, ProjectID: taskIdToProjectIdMap[taskNeedModId], BreakType: 4, BreakAt: time.Now(), DefaultStatus: 1}).Error
+				//if err1 != nil {
+				//	return err1
+				//}
+				taskInfo := gorm_model.YoungeeTaskInfo{}
+				dbt := GetReadDB(context.Background())
+				err2 := dbt.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", taskNeedModId).Find(&taskInfo).Error
+				if err2 != nil {
+					return err2
+				}
+				// 达人实际所得
+				settleAmount := taskInfo.DraftFee * (1.0 - float64(dataDefaultRate+taskInfo.DataBreakRate+taskInfo.SketchBreakRate+taskInfo.ScriptBreakRate)/100)
+				if settleAmount <= 0 {
+					settleAmount = 0.0
+				}
+				// 服务商实际所得
+				realServiceCharge := taskInfo.ServiceCharge * (1.0 - float64(taskInfo.LinkBreakRate+taskInfo.DataBreakRate+dataDefaultRate+taskInfo.ScriptBreakRate)/100)
+				if realServiceCharge <= 0 {
+					realServiceCharge = 0.0
+				}
+				// 企业实际支付
+				realPayment := settleAmount + realServiceCharge
+				if realPayment <= 0 {
+					realPayment = 0.0
+				}
+				fmt.Println("settleAmount: ", settleAmount)
+				db3 := GetReadDB(context.Background())
+				err2 = db3.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", taskNeedModId).Updates(
+					map[string]interface{}{
+						"data_missing_status": 1,
+						"cur_default_type":    7,
+						"sketch_break_rate":   dataDefaultRate,
+						"settle_amount":       settleAmount,
+						"err_break_rate":      dataErrRate,
+						"real_payment":        realPayment,
+						"real_service_charge": realServiceCharge,
+					}).Error
+				if err2 != nil {
+					return err2
+				}
+				err = CreateTaskLog(context.Background(), taskNeedModId, "数据逾期")
+				if err != nil {
+					log.WithContext(context.Background()).Errorf("[operate db] call CreateTaskLog error,err:%+v", err)
+				}
+				err = CreateMessageByTaskId(context.Background(), 24, 4, taskNeedModId)
+				if err != nil {
+					log.WithContext(context.Background()).Errorf("[operate db] call CreateMessageByTaskId error,err:%+v", err)
+				}
+				fmt.Println("已创建数据违约记录")
+			}
+		}
+	}
+
+	// 3. 针对待修改的子任务
+	for _, submitTaskNeedModId := range submitTaskNeedModIds {
+		db2 := GetReadDB(context.Background())
+		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 {
+			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 {
+			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
+		db1.Model(gorm_model.YounggeeDataInfo{}).Where("task_id = ? and is_review = 1", submitTaskNeedModId).Order("reject_at desc").First(&taskDataInfo)
+		if taskDataInfo.AutoDataBreakAt.IsZero() {
+			err4 := db1.Where("task_id = ?", submitTaskNeedModId).Updates(&gorm_model.YounggeeDataInfo{AutoDataBreakAt: taskDataInfo.RejectAt.Add(dd)}).Error
+			if err4 != nil {
+				return err4
+			}
+			fmt.Println("已添加数据违约自动处理时间")
+		} else {
+			if taskDataInfo.TaskID != "" && taskDataInfo.AutoDataBreakAt.Sub(time.Now()) <= 0 {
+				db4 := GetReadDB(context.Background())
+				err1 := db4.Model(gorm_model.YoungeeContractInfo{}).Create(&gorm_model.YoungeeContractInfo{
+					TaskID: submitTaskNeedModId, ProjectID: taskIdToProjectIdMap[submitTaskNeedModId], BreakType: 4, BreakAt: time.Now(), DefaultStatus: 1}).Error
+				if err1 != nil {
+					return err1
+				}
+				taskInfo := gorm_model.YoungeeTaskInfo{}
+				dbt := GetReadDB(context.Background())
+				err2 := dbt.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", submitTaskNeedModId).Find(&taskInfo).Error
+				if err2 != nil {
+					return err2
+				}
+				// 达人实际所得
+				settleAmount := taskInfo.DraftFee * (1.0 - float64(dataDefaultRate+taskInfo.DataBreakRate+taskInfo.SketchBreakRate+taskInfo.ScriptBreakRate)/100)
+				if settleAmount <= 0 {
+					settleAmount = 0.0
+				}
+				// 服务商实际所得
+				realServiceCharge := taskInfo.ServiceCharge * (1.0 - float64(taskInfo.LinkBreakRate+taskInfo.DataBreakRate+dataDefaultRate+taskInfo.ScriptBreakRate)/100)
+				if realServiceCharge <= 0 {
+					realServiceCharge = 0.0
+				}
+				// 企业实际支付
+				realPayment := settleAmount + realServiceCharge
+				if realPayment <= 0 {
+					realPayment = 0.0
+				}
+				db3 := GetReadDB(context.Background())
+				err2 = db3.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", submitTaskNeedModId).Updates(
+					map[string]interface{}{
+						"data_missing_status": 1,
+						"cur_default_type":    7,
+						"sketch_break_rate":   dataDefaultRate,
+						"settle_amount":       settleAmount,
+						"err_break_rate":      dataErrRate,
+						"real_payment":        realPayment,
+						"real_service_charge": realServiceCharge,
+					}).Error
+				if err2 != nil {
+					return err2
+				}
+				err = CreateTaskLog(context.Background(), submitTaskNeedModId, "数据逾期")
+				if err != nil {
+					log.WithContext(context.Background()).Errorf("[operate db] call CreateTaskLog error,err:%+v", err)
+				}
+				err = CreateMessageByTaskId(context.Background(), 24, 4, submitTaskNeedModId)
+				if err != nil {
+					log.WithContext(context.Background()).Errorf("[operate db] call CreateMessageByTaskId error,err:%+v", err)
+				}
+				fmt.Println("创建已提交数据的数据违约记录")
+			}
+		}
+	}
+	return nil
+}

+ 21 - 0
db/data.go

@@ -183,6 +183,27 @@ func AcceptData(ctx context.Context, TaskIDs []string) error {
 	return nil
 }
 
+// RejectData 拒绝数据-结案
+func RejectData(ctx context.Context, TaskIDs []string) error {
+	db := GetReadDB(ctx)
+	err := db.Model(gorm_model.YounggeeDataInfo{}).Where("task_id in ?  and is_review = 0", TaskIDs).Updates(map[string]interface{}{"reject_at": time.Now(), "is_review": 1}).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[Data db] Update YounggeeDataInfo error,err:%+v", err)
+		return err
+	}
+	err = db.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id IN ?", TaskIDs).Updates(gorm_model.YoungeeTaskInfo{DataStatus: 3}).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[Data db] Update YoungeeTaskInfo error,err:%+v", err)
+		return err
+	}
+	err = db.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id IN ?", TaskIDs).Updates(gorm_model.YoungeeTaskInfo{TaskStage: 13}).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[Data db] Update YoungeeTaskInfo error,err:%+v", err)
+		return err
+	}
+	return nil
+}
+
 // GetSpecialTaskDataList 专项任务-查询上传数据的task list
 func GetSpecialTaskDataList(ctx context.Context, projectID string, pageSize, pageNum int64, conditions *common_model.TalentConditions) ([]*http_model.SpecialTaskDataInfo, int64, error) {
 	db := GetReadDB(ctx)

+ 21 - 0
db/link.go

@@ -168,6 +168,27 @@ func AcceptLink(ctx context.Context, TaskIDs []string) error {
 	return nil
 }
 
+// RejectLink 同意链接
+func RejectLink(ctx context.Context, TaskIDs []string) error {
+	db := GetReadDB(ctx)
+	err := db.Model(gorm_model.YounggeeLinkInfo{}).Where("task_id in ?  and is_review = 0", TaskIDs).Updates(map[string]interface{}{"is_ok": 0, "is_review": 1, "reject_at": time.Now()}).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[Link db] Update YounggeeLinkInfo error,err:%+v", err)
+		return err
+	}
+	err = db.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id in ?", TaskIDs).Updates(gorm_model.YoungeeTaskInfo{LinkStatus: 3}).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[Link db] Update YoungeeTaskInfo error,err:%+v", err)
+		return err
+	}
+	err = db.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id in ?", TaskIDs).Updates(gorm_model.YoungeeTaskInfo{TaskStage: 11}).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[Link db] Update YoungeeTaskInfo error,err:%+v", err)
+		return err
+	}
+	return nil
+}
+
 // GetSpecialTaskLinkList 专项任务-查询上传链接的task list
 func GetSpecialTaskLinkList(ctx context.Context, projectID string, pageSize, pageNum int64, conditions *common_model.TalentConditions) ([]*http_model.SpecialTaskLinkInfo, int64, error) {
 	db := GetReadDB(ctx)

+ 344 - 1
db/project.go

@@ -122,7 +122,7 @@ func GetProjectDraftList(ctx context.Context, enterpriseID string, pageSize, pag
 	return projectDrafts, total, nil
 }
 
-func GetProjectTaskList(ctx context.Context, projectID string, pageSize, pageNum int64, conditions *common_model.TaskConditions) ([]*http_model.ProjectTaskInfo, int64, error) {
+func GetProjectTaskList(ctx context.Context, pageSize, pageNum int64, conditions *common_model.TaskConditions) ([]*http_model.ProjectTaskInfo, int64, error) {
 	db := GetReadDB(ctx)
 	// 查询task表信息
 	db = db.Debug().Model(gorm_model.YoungeeTaskInfo{})
@@ -327,3 +327,346 @@ func GetCreatingNumber(ctx context.Context, enterpriseID string) (*int64, error)
 	}
 	return &creatingNumber, nil
 }
+
+func GetProjectData(ctx context.Context, projectid string) (http_model.ProjectDataResponse, error) {
+	db := GetReadDB(ctx)
+	var projectInfo gorm_model.ProjectInfo
+	// 查询项目基本信息
+	if err := db.Where("project_id = ?", projectid).First(&projectInfo).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[Project db] GetProjectData error, err: %+v", err)
+		return http_model.ProjectDataResponse{}, err
+	}
+	fmt.Println("projectInfo---", projectInfo.ProjectID)
+	var projectTasks []gorm_model.YoungeeTaskInfo
+	if err := db.Where("project_id = ? AND task_status = ?", projectid, 2).Find(&projectTasks).Error; err != nil {
+		return http_model.ProjectDataResponse{}, err
+	}
+
+	var totalTasks int64
+	if err := db.Model(&gorm_model.YoungeeTaskInfo{}).Where("project_id = ? AND task_status = ?", projectid, 2).Count(&totalTasks).Error; err != nil {
+		return http_model.ProjectDataResponse{}, err
+	}
+
+	// 初始化统计数据
+	dateStats := make(map[string]int)
+	fansCounts := map[int64]int{0: 0, 1: 0, 2: 0, 3: 0}
+	feeCounts := map[int]int{1: 0, 2: 0, 3: 0}
+	startDate := *projectInfo.CreatedAt
+	endDate := time.Now()
+
+	// 填充日期统计
+	for d := startDate; d.Before(endDate) || d.Equal(endDate); d = d.Add(24 * time.Hour) {
+		dateStats[d.Format("2006-01-02")] = 0
+	}
+
+	var totalCost float64
+	var totalFans int
+	var serverTaskCount float64
+	var maleCount int64
+
+	// 处理每个任务
+	for _, task := range projectTasks {
+		totalCost += task.DraftFee
+		var talentInfo gorm_model.YoungeeTalentInfo
+
+		// 查询达人信息
+		if err := db.Where("id = ?", task.TalentID).First(&talentInfo).Error; err != nil {
+			logrus.WithContext(ctx).Errorf("[Project db] GetProjectData error, err: %+v", err)
+			return http_model.ProjectDataResponse{}, err
+		}
+
+		// 统计性别
+		if talentInfo.Sex == 1 {
+			maleCount++
+		}
+		totalFans += task.FansNum
+
+		// 统计来自服务商的任务
+		if task.SupplierId != 0 && task.SupplierStatus == 2 {
+			serverTaskCount++
+		}
+
+		// 稿费形式统计
+		feeCounts[task.FeeForm]++
+
+		// 统计粉丝数
+		switch {
+		case task.FansNum < 10000:
+			fansCounts[0]++
+		case task.FansNum < 100000:
+			fansCounts[1]++
+		case task.FansNum < 1000000:
+			fansCounts[2]++
+		default:
+			fansCounts[3]++
+		}
+
+		SelectDate := task.SelectDate.Format("2006-01-02")
+		if _, exists := dateStats[SelectDate]; exists {
+			dateStats[SelectDate]++
+		}
+	}
+
+	// 计算平均值
+	var avgFansNum int
+	if totalTasks > 0 {
+		avgFansNum = totalFans / int(totalTasks)
+	} else {
+		avgFansNum = 0
+	}
+
+	var fromType float64
+	if totalTasks > 0 {
+		fromType = serverTaskCount / float64(totalTasks)
+	} else {
+		fromType = 0
+	}
+
+	var manRatio float64
+	if totalTasks > 0 {
+		manRatio = float64(maleCount) / float64(totalTasks)
+	} else {
+		manRatio = 0
+	}
+	// 构建响应
+	res := http_model.ProjectDataResponse{
+		Recruittime: *projectInfo.PassAt,
+		RecruitDDl:  *projectInfo.RecruitDdl,
+		AgreeNum:    projectInfo.RecruitNum,
+		ApplyNum:    projectInfo.ApplyNum,
+		DraftFee:    totalCost,
+		AvgFansNum:  avgFansNum,
+		FromType:    fromType,
+		ManRatio:    manRatio,
+		DateStats:   dateStats,
+		FeeMap:      feeCounts,
+		FansMap:     fansCounts,
+	}
+	return res, nil
+}
+
+func GetProjectExecuteData(ctx context.Context, projectid string) (http_model.ExecuteDataResponse, error) {
+	db := GetReadDB(ctx)
+	var projectData gorm_model.ProjectInfo
+
+	// 查询项目基本信息
+	err := db.Model(gorm_model.ProjectInfo{}).Where("project_id = ?", projectid).First(&projectData).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[Project db] GetProjectData error, err: %+v", err)
+		return http_model.ExecuteDataResponse{}, err
+	}
+	// 查询项目任务信息
+	var projectTaskInfo []gorm_model.YoungeeTaskInfo
+	query := db.Model(&gorm_model.YoungeeTaskInfo{}).Where("project_id = ? AND task_status = ?", projectid, 2).Find(&projectTaskInfo)
+	var total int64
+	if err = query.Count(&total).Error; err != nil {
+		return http_model.ExecuteDataResponse{}, err
+	}
+
+	// 初始化统计数据
+	skedateStats := make(map[string]int)
+	linkdateStatics := make(map[string]int)
+	startDate := *projectData.CreatedAt
+	endDate := time.Now()
+	// 填充日期统计
+	for d := startDate; d.Before(endDate) || d.Equal(endDate); d = d.Add(24 * time.Hour) {
+		skedateStats[d.Format("2006-01-02")] = 0
+		linkdateStatics[d.Format("2006-01-02")] = 0
+	}
+
+	var presketchnum int64                                         //代传初稿数
+	var sketchnum int64                                            //待审
+	var sketchaccnum int64                                         //通过
+	var prelinknum, linknum, linkaccnum, predatanum, datanum int64 //待传连接数,待审,通过
+	var duration time.Duration
+	var accskecnt int
+	var avgduration time.Duration
+	var avgccreateduraion time.Duration
+	var createduraion time.Duration
+	var crecnt, submint, firacccnt int
+	var firaccratio, firacclinkratio float64
+	var linkaccduartion, avglinkduration, backduration, avgbackdurtion time.Duration
+	var acclinkcnt, backcnt, submintcnt, firlinkacccnt int
+	var defaultnum int64
+	var defaultratio float64
+	var sktchinfo gorm_model.YounggeeSketchInfo
+	var draftee, settle_amount float64
+	for _, task := range projectTaskInfo {
+		draftee += task.DraftFee
+		switch task.TaskStage {
+		case 9:
+			presketchnum += 1
+		case 10:
+			sketchnum += 1
+		case 11:
+			prelinknum += 1
+		case 12:
+			linknum += 1
+		case 13:
+			predatanum += 1
+		}
+		if task.SketchStatus == 5 {
+			sketchaccnum += 1
+		}
+		if task.LinkStatus == 5 {
+			linkaccnum += 1
+		}
+		if task.CurDefaultType != 0 {
+			defaultnum += 1
+		}
+		if task.TaskStage == 15 {
+			settle_amount += task.SettleAmount
+		}
+		if task.TaskStage > 9 {
+			//初稿
+			//err = db.Model(gorm_model.YounggeeSketchInfo{}).Where("task_id = ? ", task.TaskID).First(&sktchinfo).Error
+			err = db.Model(gorm_model.YounggeeSketchInfo{}).Where("task_id = ?", task.TaskID).Order("create_at ASC").First(&sktchinfo).Error
+
+			if err != nil {
+				return http_model.ExecuteDataResponse{}, err
+			} else {
+
+				if projectData.ProjectForm == 1 {
+					if !task.SignedTime.IsZero() {
+						createduraion += sktchinfo.CreateAt.Sub(task.SignedTime)
+						crecnt += 1
+
+					}
+				} else {
+					if sktchinfo.IsSubmit == 1 {
+						createduraion += sktchinfo.CreateAt.Sub(task.SelectDate)
+						crecnt += 1
+					}
+				} //平均创作耗时
+				var sktchaccinfo gorm_model.YounggeeSketchInfo
+				err = db.Model(gorm_model.YounggeeSketchInfo{}).Where("task_id = ?", task.TaskID).Order("create_at ASC").Last(&sktchaccinfo).Error
+				if err != nil {
+					return http_model.ExecuteDataResponse{}, err
+				}
+
+				if sktchaccinfo.IsOk == 1 {
+					duration += sktchaccinfo.AgreeAt.Sub(sktchinfo.CreateAt)
+					accskecnt += 1 //审稿耗时
+					submint += 1
+					if sktchaccinfo.SketchID == sktchinfo.SketchID {
+						firacccnt += 1
+					} //首次通过
+					AgreeDate := sktchaccinfo.AgreeAt.Format("2006-01-02")
+					if _, exists := skedateStats[AgreeDate]; exists {
+						skedateStats[AgreeDate]++
+					}
+				}
+			}
+		}
+		if task.TaskStage > 11 {
+			var linkinfo gorm_model.YounggeeLinkInfo //最后一次上传link
+			err = db.Model(gorm_model.YounggeeLinkInfo{}).Where("task_id = ? ", task.TaskID).Order("create_at ASC").Last(&linkinfo).Error
+			if err != nil {
+				continue
+			} else {
+
+				if linkinfo.IsOk == 1 {
+					linkaccduartion += linkinfo.AgreeAt.Sub(linkinfo.CreateAt)
+					acclinkcnt += 1
+				} //平均质检时间
+				var linkfirinfo gorm_model.YounggeeLinkInfo //最后一次上传link
+				err = db.Model(gorm_model.YounggeeLinkInfo{}).Where("task_id = ? ", task.TaskID).Order("create_at ASC").First(&linkfirinfo).Error
+				if err != nil {
+					return http_model.ExecuteDataResponse{}, err
+				} else {
+					backduration += linkinfo.CreateAt.Sub(sktchinfo.AgreeAt)
+					backcnt += 1
+					var linklasinfo gorm_model.YounggeeLinkInfo //最后一次上传link
+					err = db.Model(gorm_model.YounggeeLinkInfo{}).Where("task_id = ? ", task.TaskID).Order("create_at ASC").Last(&linklasinfo).Error
+					if err != nil {
+						return http_model.ExecuteDataResponse{}, err
+					}
+					if linklasinfo.IsOk == 1 {
+						submintcnt += 1
+						if linklasinfo.LinkID == linkfirinfo.LinkID {
+							firlinkacccnt += 1
+						} //首次通过
+						AgreeDate := linklasinfo.AgreeAt.Format("2006-01-02")
+						if _, exists := linkdateStatics[AgreeDate]; exists {
+							linkdateStatics[AgreeDate]++
+						}
+
+					}
+				}
+
+			}
+
+		}
+	}
+	if submint > 0 && firacccnt > 0 {
+		firaccratio = float64(firacccnt) / float64(submint)
+	} else {
+		firaccratio = 0
+	}
+	if submintcnt > 0 && firlinkacccnt > 0 {
+		firacclinkratio = float64(firlinkacccnt) / float64(submintcnt)
+	} else {
+		firacclinkratio = 0
+	}
+	if accskecnt > 0 {
+		avgduration = duration / time.Duration(accskecnt)
+	} else {
+		avgduration = 0
+	}
+	if crecnt > 0 {
+		avgccreateduraion = createduraion / time.Duration(crecnt)
+	} else {
+		avgccreateduraion = 0
+	}
+	if acclinkcnt > 0 {
+		avglinkduration = linkaccduartion / time.Duration(acclinkcnt)
+	} else {
+		avglinkduration = 0
+	}
+	if backcnt > 0 {
+		avgbackdurtion = backduration / time.Duration(backcnt)
+	} else {
+		avgbackdurtion = 0
+	}
+	if defaultnum > 0 {
+		defaultratio = float64(defaultnum) / float64(total)
+	} else {
+		defaultratio = 0
+	}
+	res := http_model.ExecuteDataResponse{
+		Excutetime:      *projectData.PayAt,
+		PreSketchNum:    presketchnum,
+		SketchNum:       sketchnum,
+		SketchAccNum:    sketchaccnum,
+		AvgAccTime:      avgduration,
+		AvgCreTime:      avgccreateduraion,
+		FirAccRatio:     firaccratio,
+		PreLinkNum:      prelinknum,
+		LinkNum:         linknum,
+		LinkAccNum:      linkaccnum,
+		AvgLinkAccTime:  avglinkduration,
+		AvgBackTime:     avgbackdurtion,
+		FirAccLinkRatio: firacclinkratio,
+		PreDataNum:      predatanum,
+		DataNum:         datanum,
+		DefaultNum:      defaultnum,
+		DefaultRatio:    defaultratio,
+		DraftFee:        draftee,
+		Settle_Amount:   settle_amount,
+	}
+	return res, nil
+}
+
+func GetProjecdata(ctx context.Context, projectid string) (http_model.ProjectdataResponse, error) {
+	db := GetReadDB(ctx)
+	var projectInfo gorm_model.ProjectInfo
+
+	// 查询项目基本信息
+	if err := db.Where("project_id = ?", projectid).First(&projectInfo).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[Project db] GetProjectData error, err: %+v", err)
+		return http_model.ProjectdataResponse{}, err
+	}
+
+	res := http_model.ProjectdataResponse{}
+	return res, nil
+}

+ 607 - 0
db/project_task.go

@@ -0,0 +1,607 @@
+package db
+
+import (
+	"context"
+	"errors"
+	"fmt"
+	"github.com/issue9/conv"
+	"gorm.io/gorm"
+	"time"
+	"youngee_b_api/model/gorm_model"
+	"youngee_b_api/model/http_model"
+)
+
+func GetProjecttaskList(ctx context.Context, request http_model.GetTaskListRequest) (*http_model.GetTaskListData, error) {
+	db := GetReadDB(ctx)
+	var projecrtaskinfo []gorm_model.YoungeeTaskInfo
+	query := db.Model(&gorm_model.YoungeeTaskInfo{}).Where("project_id = ? AND task_status = ?", request.ProjectId, request.CoopType)
+
+	// 构建查询条件
+	if request.FeeFrom != nil {
+		query = query.Where("fee_form = ?", request.FeeFrom)
+	}
+	if request.Type != nil {
+		switch *request.Type {
+		case 1:
+			query = query.Where("supplier_id = 0 AND supplier_status = 0")
+		case 2:
+			query = query.Where("supplier_id != 0 AND supplier_status = 2")
+		}
+	}
+
+	// 计算总数
+	var total int64
+	if err := query.Count(&total).Error; err != nil {
+		return nil, err
+	}
+
+	// 添加分页逻辑
+	pageSize := request.PageSize
+	if pageSize == 0 {
+		pageSize = 10
+	}
+	pageNum := request.PageNum
+	if pageNum == 0 {
+		pageNum = 1
+	}
+	offset := (pageNum - 1) * pageSize
+
+	// 执行分页查询
+	if err := query.Offset(offset).Limit(pageSize).Find(&projecrtaskinfo).Error; err != nil {
+		return nil, err
+	}
+
+	taskInfoPointers := make([]*http_model.TaskInfo, 0, len(projecrtaskinfo))
+	for _, task := range projecrtaskinfo {
+		boperator := getBOperator(db, task.BOperator)
+		response := &http_model.TaskInfo{
+			TaskId:             task.TaskID,
+			ProjectId:          task.ProjectID,
+			TalentId:           task.TalentID,
+			FansNum:            task.FansNum,
+			DraftFee:           task.DraftFee,
+			Voteavg:            task.VoteAvg,
+			FeeFrom:            task.FeeForm,
+			TaskStage:          task.TaskStage,
+			Commentavg:         task.CommitAvg,
+			CurrentDefaultType: task.CurDefaultType,
+			From:               determineFrom(task.SupplierId, task.SupplierStatus),
+			Boperator:          boperator,
+			CreateAt:           task.CreateDate,
+		}
+		taskInfoPointers = append(taskInfoPointers, response)
+	}
+
+	return &http_model.GetTaskListData{
+		TaskList: taskInfoPointers,
+		Total:    conv.MustString(total, ""),
+	}, nil
+}
+
+func getBOperator(db *gorm.DB, bOperatorID string) string {
+	if bOperatorID == "" {
+		return ""
+	}
+	var boperatorinfo gorm_model.Enterprise
+	if err := db.Where(gorm_model.Enterprise{EnterpriseID: bOperatorID}).First(&boperatorinfo).Error; err != nil {
+		return ""
+	}
+	return boperatorinfo.BusinessName
+}
+
+func determineFrom(supplierID, supplierStatus int) int {
+	if supplierID != 0 && supplierStatus == 2 {
+		return 2
+	}
+	return 1
+}
+
+func PassProTaskCoop(ctx context.Context, projectId string, taskIds []string, operatorid string, operatetype int) (bool, error) {
+	db := GetReadDB(ctx)
+	var count int64
+	fmt.Println("task_ids: ", taskIds)
+	err := db.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id IN ? AND task_stage = 1", taskIds).Count(&count).Error
+
+	fmt.Println("count: ", count)
+	if err != nil {
+		return false, err
+	}
+	if int64(len(taskIds)) == 0 || count != int64(len(taskIds)) {
+		return false, errors.New("任务id有误")
+	}
+
+	// 2. 查询任务对应达人id(用于生成达人消息)
+	var talentIds []string
+	err = db.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id IN ?", taskIds).Select("talent_id").Find(&talentIds).Error
+	if err != nil {
+		return false, err
+	}
+
+	// 3. 查询任务对应project名称(用于生成达人消息)
+	var project gorm_model.ProjectInfo
+	err = db.Model(gorm_model.ProjectInfo{}).Where("project_id = ?", projectId).Find(&project).Error
+	if err != nil {
+		return false, err
+	}
+	var taskstages int
+	if project.ProjectForm == 1 {
+		taskstages = 4
+	} else {
+		taskstages = 9
+	}
+
+	//4.根据达人来源改变状态、阶段、数目
+	var tasks []gorm_model.YoungeeTaskInfo
+	err = db.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id IN ? AND task_stage = 1", taskIds).Find(&tasks).Error
+	if err != nil {
+		return false, err
+	}
+	err = db.Transaction(func(tx *gorm.DB) error {
+		// 2. 修改任务状态和任务阶段
+		for _, taskInfo := range tasks {
+			if taskInfo.SupplierId != 0 && taskInfo.SupplierStatus == 2 { //服务商招募数量+1
+				updateData := gorm_model.YoungeeTaskInfo{
+					TaskStage:     taskstages,
+					TaskStatus:    2,
+					UpdateAt:      time.Now(),
+					BOperator:     operatorid,
+					BOperatorType: operatetype,
+				}
+				err = tx.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ? AND task_stage = 1", taskInfo.TaskID).Updates(updateData).Error
+				if err != nil {
+					return err
+				}
+
+				//project招募数+1,预估成本+服务商价格
+				var projectinfo gorm_model.ProjectInfo
+				err = db.Model(gorm_model.ProjectInfo{}).Where("project_id = ?", projectId).Find(&projectinfo).Error
+				if err != nil {
+					return err
+				}
+				projectinfo.RecruitNum += 1
+				projectinfo.EstimatedCost += taskInfo.SupportFee
+				err = tx.Model(gorm_model.ProjectInfo{}).Where("project_id = ? ", projectId).Updates(projectinfo).Error
+				if err != nil {
+					return err
+				}
+				//服务商s_project已招募人数+1
+				var sprojectinfo gorm_model.YounggeeSProjectInfo
+				err = db.Model(gorm_model.YounggeeSProjectInfo{}).Where("project_id = ?", projectId).Find(&sprojectinfo).Error
+				if err != nil {
+					return err
+				}
+				sprojectinfo.RecruitNum += 1
+				err = tx.Model(gorm_model.YounggeeSProjectInfo{}).Where("project_id = ? ", projectId).Updates(projectinfo).Error
+				if err != nil {
+					return err
+				}
+
+			}
+
+			if taskInfo.SupplierId == 0 && taskInfo.SupplierStatus == 0 { //来源于公海
+				updateData := gorm_model.YoungeeTaskInfo{
+					TaskStage:     taskstages,
+					TaskStatus:    2,
+					UpdateAt:      time.Now(),
+					BOperator:     operatorid,
+					BOperatorType: operatetype,
+				}
+				err = tx.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ? AND task_stage = 1", taskInfo.TaskID).Updates(updateData).Error
+				if err != nil {
+					return err
+				}
+
+				//project招募数+1
+				var projectinfo gorm_model.ProjectInfo
+				err = db.Model(gorm_model.ProjectInfo{}).Where("project_id = ?", projectId).Find(&projectinfo).Error
+				if err != nil {
+					return err
+				}
+				projectinfo.RecruitNum += 1
+				err = tx.Model(gorm_model.ProjectInfo{}).Where("project_id = ? ", projectId).Updates(projectinfo).Error
+				if err != nil {
+					return err
+				}
+			}
+
+		}
+		// 4. 生成达人消息
+		for _, talendId := range talentIds {
+			err = CreateMessage(ctx, 1, 1, talendId, project.ProjectName)
+			if err != nil {
+				return err
+			}
+		}
+		// 返回 nil 提交事务
+		return nil
+	})
+	if err != nil {
+		return false, err
+	}
+	return true, nil
+}
+
+func RefuseproTaskCoop(ctx context.Context, taskIds []string, operatorid string, operatetype int) (bool, error) {
+	db := GetWriteDB(ctx)
+	// 1. 校验
+	var count int64
+	err := db.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id IN ? AND task_stage = 3", taskIds).Count(&count).Error
+	if err != nil {
+		return false, err
+	}
+	if count != int64(len(taskIds)) {
+		return false, errors.New("任务id有误")
+	}
+
+	// 2. 查询任务对应达人id(用于生成达人消息)
+	var talentIds []string
+	err = db.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id IN ?", taskIds).Select("talent_id").Find(&talentIds).Error
+	if err != nil {
+		return false, err
+	}
+
+	var tasks []gorm_model.YoungeeTaskInfo
+	err = db.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id IN ? AND task_stage = 1", taskIds).Find(&tasks).Error
+
+	err = db.Transaction(func(tx *gorm.DB) error {
+		// 2. 修改任务状态和任务阶段
+		for _, taskInfo := range tasks {
+			updateData := gorm_model.YoungeeTaskInfo{
+				TaskStage:     3,
+				TaskStatus:    3,
+				UpdateAt:      time.Now(),
+				BOperator:     operatorid,
+				BOperatorType: operatetype,
+			}
+			err = tx.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id = ? AND task_stage = 1", taskInfo.TaskID).Updates(updateData).Error
+		}
+		if err != nil {
+			return err
+		}
+
+		// 返回 nil 提交事务
+		return nil
+	})
+	if err != nil {
+		return false, err
+	}
+	return true, nil
+}
+
+func GetPreSketchList(ctx context.Context, request http_model.PreSketchListRequest) (*http_model.GetSketchTaskListData, error) {
+	db := GetReadDB(ctx)
+	var projecrtaskinfo []gorm_model.YoungeeTaskInfo
+	query := db.Model(&gorm_model.YoungeeTaskInfo{}).Where("project_id = ? AND task_stage = ?", request.ProjectId, request.ScriptStatus)
+	// 计算总数
+	var total int64
+	if err := query.Count(&total).Error; err != nil {
+		return nil, err
+	}
+
+	// 添加分页逻辑
+	pageSize := request.PageSize
+	if pageSize == 0 {
+		pageSize = 10
+	}
+	pageNum := request.PageNum
+	if pageNum == 0 {
+		pageNum = 1
+	}
+	offset := (pageNum - 1) * pageSize
+	// 执行分页查询
+	if err := query.Offset(offset).Limit(pageSize).Find(&projecrtaskinfo).Error; err != nil {
+		return nil, err
+	}
+	taskInfoPointers := make([]*http_model.TasksketchInfo, 0, len(projecrtaskinfo))
+	for _, task := range projecrtaskinfo {
+		taskinfo := &http_model.TaskInfo{
+			TaskId:             task.TaskID,
+			ProjectId:          task.ProjectID,
+			TalentId:           task.TalentID,
+			FansNum:            task.FansNum,
+			DraftFee:           task.DraftFee,
+			Voteavg:            task.VoteAvg,
+			FeeFrom:            task.FeeForm,
+			TaskStage:          task.TaskStage,
+			Commentavg:         task.CommitAvg,
+			CurrentDefaultType: task.CurDefaultType,
+			From:               determineFrom(task.SupplierId, task.SupplierStatus),
+		}
+		response := &http_model.TasksketchInfo{
+			Task: taskinfo,
+			DDl:  time.Now(), //截止时间再改
+		}
+		taskInfoPointers = append(taskInfoPointers, response)
+
+	}
+	return &http_model.GetSketchTaskListData{
+		TasksketchList: taskInfoPointers,
+		Total:          conv.MustString(total, ""),
+	}, nil
+}
+
+func GetSketchList(ctx context.Context, request http_model.TasksketchlistRequest) (*http_model.GetsketchtaskListData, error) {
+	db := GetReadDB(ctx)
+	var projecrtaskinfo []gorm_model.YoungeeTaskInfo
+	query := db.Model(&gorm_model.YoungeeTaskInfo{}).Where("project_id = ? AND task_stage = ?", request.ProjectId, request.ScriptStatus)
+	// 计算总数
+	var total int64
+	if err := query.Count(&total).Error; err != nil {
+		return nil, err
+	}
+
+	// 添加分页逻辑
+	pageSize := request.PageSize
+	if pageSize == 0 {
+		pageSize = 10
+	}
+	pageNum := request.PageNum
+	if pageNum == 0 {
+		pageNum = 1
+	}
+	offset := (pageNum - 1) * pageSize
+	// 执行分页查询
+	if err := query.Offset(offset).Limit(pageSize).Find(&projecrtaskinfo).Error; err != nil {
+		return nil, err
+	}
+	taskInfoPointers := make([]*http_model.Tasksketchinfo, 0, len(projecrtaskinfo))
+	for _, task := range projecrtaskinfo {
+		taskinfo := &http_model.TaskInfo{
+			TaskId:             task.TaskID,
+			ProjectId:          task.ProjectID,
+			TalentId:           task.TalentID,
+			FansNum:            task.FansNum,
+			DraftFee:           task.DraftFee,
+			Voteavg:            task.VoteAvg,
+			FeeFrom:            task.FeeForm,
+			TaskStage:          task.TaskStage,
+			Commentavg:         task.CommitAvg,
+			CurrentDefaultType: task.CurDefaultType,
+			From:               determineFrom(task.SupplierId, task.SupplierStatus),
+		}
+		var sketchinfo gorm_model.YounggeeSketchInfo
+		err := db.Model(&gorm_model.YounggeeSketchInfo{}).Where("task_id = ? and is_review = 0", task.TaskID).First(&sketchinfo).Error
+		if err != nil {
+			return nil, err
+		}
+		response := &http_model.Tasksketchinfo{
+			Task:     taskinfo,
+			SketchId: sketchinfo.SketchID,
+			SubmitAt: sketchinfo.SubmitAt,
+			AgreeAt:  sketchinfo.AgreeAt,
+		}
+		taskInfoPointers = append(taskInfoPointers, response)
+
+	}
+	return &http_model.GetsketchtaskListData{
+		TasksketchList: taskInfoPointers,
+		Total:          conv.MustString(total, ""),
+	}, nil
+}
+
+func GetPreLinkList(ctx context.Context, request http_model.PreLinkListRequest) (*http_model.GetprelinkListData, error) {
+	db := GetReadDB(ctx)
+	var projecrtaskinfo []gorm_model.YoungeeTaskInfo
+	query := db.Model(&gorm_model.YoungeeTaskInfo{}).Where("project_id = ? AND task_stage = ?", request.ProjectId, request.LinkStatus)
+	// 计算总数
+	var total int64
+	if err := query.Count(&total).Error; err != nil {
+		return nil, err
+	}
+
+	// 添加分页逻辑
+	pageSize := request.PageSize
+	if pageSize == 0 {
+		pageSize = 10
+	}
+	pageNum := request.PageNum
+	if pageNum == 0 {
+		pageNum = 1
+	}
+	offset := (pageNum - 1) * pageSize
+	// 执行分页查询
+	if err := query.Offset(offset).Limit(pageSize).Find(&projecrtaskinfo).Error; err != nil {
+		return nil, err
+	}
+	taskInfoPointers := make([]*http_model.Tasklinkinfo, 0, len(projecrtaskinfo))
+	for _, task := range projecrtaskinfo {
+		taskinfo := &http_model.TaskInfo{
+			TaskId:             task.TaskID,
+			ProjectId:          task.ProjectID,
+			TalentId:           task.TalentID,
+			FansNum:            task.FansNum,
+			DraftFee:           task.DraftFee,
+			Voteavg:            task.VoteAvg,
+			FeeFrom:            task.FeeForm,
+			TaskStage:          task.TaskStage,
+			Commentavg:         task.CommitAvg,
+			CurrentDefaultType: task.CurDefaultType,
+			From:               determineFrom(task.SupplierId, task.SupplierStatus),
+		}
+		response := &http_model.Tasklinkinfo{
+			Task: taskinfo,
+			DDl:  time.Now(), //截止时间再改
+		}
+		taskInfoPointers = append(taskInfoPointers, response)
+
+	}
+	return &http_model.GetprelinkListData{
+		TasklinkList: taskInfoPointers,
+		Total:        conv.MustString(total, ""),
+	}, nil
+}
+
+func GetLinkList(ctx context.Context, request http_model.TaskLinklistRequest) (*http_model.GettasklinkListData, error) {
+	db := GetReadDB(ctx)
+	var projecrtaskinfo []gorm_model.YoungeeTaskInfo
+	query := db.Model(&gorm_model.YoungeeTaskInfo{}).Where("project_id = ? AND task_stage = ?", request.ProjectId, request.LinkStatus)
+	// 计算总数
+	var total int64
+	if err := query.Count(&total).Error; err != nil {
+		return nil, err
+	}
+
+	// 添加分页逻辑
+	pageSize := request.PageSize
+	if pageSize == 0 {
+		pageSize = 10
+	}
+	pageNum := request.PageNum
+	if pageNum == 0 {
+		pageNum = 1
+	}
+	offset := (pageNum - 1) * pageSize
+	// 执行分页查询
+	if err := query.Offset(offset).Limit(pageSize).Find(&projecrtaskinfo).Error; err != nil {
+		return nil, err
+	}
+	taskInfoPointers := make([]*http_model.TaskLinkinfo, 0, len(projecrtaskinfo))
+	for _, task := range projecrtaskinfo {
+		taskinfo := &http_model.TaskInfo{
+			TaskId:             task.TaskID,
+			ProjectId:          task.ProjectID,
+			TalentId:           task.TalentID,
+			FansNum:            task.FansNum,
+			DraftFee:           task.DraftFee,
+			Voteavg:            task.VoteAvg,
+			FeeFrom:            task.FeeForm,
+			TaskStage:          task.TaskStage,
+			Commentavg:         task.CommitAvg,
+			CurrentDefaultType: task.CurDefaultType,
+			From:               determineFrom(task.SupplierId, task.SupplierStatus),
+		}
+		var linkinfo gorm_model.YounggeeLinkInfo
+		err := db.Model(&gorm_model.YounggeeLinkInfo{}).Where("task_id = ? and is_review = 0", task.TaskID).First(&linkinfo).Error
+		if err != nil {
+			return nil, err
+		}
+		response := &http_model.TaskLinkinfo{
+			Task:     taskinfo,
+			LinkId:   linkinfo.LinkID,
+			SubmitAt: linkinfo.SubmitAt,
+			AgreeAt:  linkinfo.AgreeAt,
+			LinkUrl:  linkinfo.LinkUrl,
+			PhotoUrl: linkinfo.PhotoUrl,
+		}
+		taskInfoPointers = append(taskInfoPointers, response)
+
+	}
+	return &http_model.GettasklinkListData{
+		TaskLinklist: taskInfoPointers,
+		Total:        conv.MustString(total, ""),
+	}, nil
+}
+
+func GetPreDataList(ctx context.Context, request http_model.PreDataListRequest) (*http_model.GetPreDataListData, error) {
+	db := GetReadDB(ctx)
+	var projecrtaskinfo []gorm_model.YoungeeTaskInfo
+	query := db.Model(&gorm_model.YoungeeTaskInfo{}).Where("project_id = ? AND task_stage = ?", request.ProjectId, request.DataStatus)
+	// 计算总数
+	var total int64
+	if err := query.Count(&total).Error; err != nil {
+		return nil, err
+	}
+
+	// 添加分页逻辑
+	pageSize := request.PageSize
+	if pageSize == 0 {
+		pageSize = 10
+	}
+	pageNum := request.PageNum
+	if pageNum == 0 {
+		pageNum = 1
+	}
+	offset := (pageNum - 1) * pageSize
+	// 执行分页查询
+	if err := query.Offset(offset).Limit(pageSize).Find(&projecrtaskinfo).Error; err != nil {
+		return nil, err
+	}
+	taskInfoPointers := make([]*http_model.Taskdatainfo, 0, len(projecrtaskinfo))
+	for _, task := range projecrtaskinfo {
+		taskinfo := &http_model.TaskInfo{
+			TaskId:             task.TaskID,
+			ProjectId:          task.ProjectID,
+			TalentId:           task.TalentID,
+			FansNum:            task.FansNum,
+			DraftFee:           task.DraftFee,
+			Voteavg:            task.VoteAvg,
+			FeeFrom:            task.FeeForm,
+			TaskStage:          task.TaskStage,
+			Commentavg:         task.CommitAvg,
+			CurrentDefaultType: task.CurDefaultType,
+			From:               determineFrom(task.SupplierId, task.SupplierStatus),
+		}
+		response := &http_model.Taskdatainfo{
+			Task: taskinfo,
+			DDl:  time.Now(), //截止时间再改
+		}
+		taskInfoPointers = append(taskInfoPointers, response)
+
+	}
+	return &http_model.GetPreDataListData{
+		TaskdataList: taskInfoPointers,
+		Total:        conv.MustString(total, ""),
+	}, nil
+}
+
+func GetDataList(ctx context.Context, request http_model.TaskDatalistRequest) (*http_model.GetTaskDatalistData, error) {
+	db := GetReadDB(ctx)
+	var projecrtaskinfo []gorm_model.YoungeeTaskInfo
+	query := db.Model(&gorm_model.YoungeeTaskInfo{}).Where("project_id = ? AND task_stage = ?", request.ProjectId, request.DataStatus)
+	// 计算总数
+	var total int64
+	if err := query.Count(&total).Error; err != nil {
+		return nil, err
+	}
+
+	// 添加分页逻辑
+	pageSize := request.PageSize
+	if pageSize == 0 {
+		pageSize = 10
+	}
+	pageNum := request.PageNum
+	if pageNum == 0 {
+		pageNum = 1
+	}
+	offset := (pageNum - 1) * pageSize
+	// 执行分页查询
+	if err := query.Offset(offset).Limit(pageSize).Find(&projecrtaskinfo).Error; err != nil {
+		return nil, err
+	}
+	taskInfoPointers := make([]*http_model.TaskDatainfo, 0, len(projecrtaskinfo))
+	for _, task := range projecrtaskinfo {
+		taskinfo := &http_model.TaskInfo{
+			TaskId:       task.TaskID,
+			ProjectId:    task.ProjectID,
+			TalentId:     task.TalentID,
+			FansNum:      task.FansNum,
+			DraftFee:     task.DraftFee,
+			FeeFrom:      task.FeeForm,
+			TaskStage:    task.TaskStage,
+			SettleAmount: task.SettleAmount,
+			From:         determineFrom(task.SupplierId, task.SupplierStatus),
+		}
+		var datainfo gorm_model.YounggeeDataInfo
+		err := db.Model(&gorm_model.YounggeeDataInfo{}).Where("task_id = ? and is_review = 0", task.TaskID).First(&datainfo).Error
+		if err != nil {
+			return nil, err
+		}
+		response := &http_model.TaskDatainfo{
+			Task:          taskinfo,
+			DataId:        datainfo.DataID,
+			SubmitAt:      datainfo.SubmitAt,
+			AgreeAt:       datainfo.AgreeAt,
+			PhotoUrl:      datainfo.PhotoUrl,
+			PlayNumber:    datainfo.PlayNumber,
+			LikeNumber:    datainfo.LikeNumber,
+			CollectNumber: datainfo.CollectNumber,
+			CommentNumber: datainfo.CommentNumber,
+		}
+		taskInfoPointers = append(taskInfoPointers, response)
+
+	}
+	return &http_model.GetTaskDatalistData{
+		TaskDatalist: taskInfoPointers,
+		Total:        conv.MustString(total, ""),
+	}, nil
+}

+ 22 - 0
db/sketch.go

@@ -173,6 +173,28 @@ func AcceptSketch(ctx context.Context, TaskIDs []string) error {
 	return nil
 }
 
+// RejectSketch 不同意初稿
+func RejectSketch(ctx context.Context, TaskIDs []string) error {
+	db := GetReadDB(ctx)
+	err := db.Model(gorm_model.YounggeeSketchInfo{}).Where("task_id in ? and is_review = 0", TaskIDs).Updates(map[string]interface{}{"is_ok": 0, "is_review": 1, "reject_at": time.Now()}).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[Sketch db] Update YounggeeSketchInfo error,err:%+v", err)
+		return err
+	}
+	err = db.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id in ?", TaskIDs).Updates(gorm_model.YoungeeTaskInfo{SketchStatus: 3}).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[Sketch db] Update YoungeeTaskInfo error,err:%+v", err)
+		return err
+	}
+
+	err = db.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id in ?", TaskIDs).Updates(gorm_model.YoungeeTaskInfo{TaskStage: 9}).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[Sketch db] Update YoungeeTaskInfo error,err:%+v", err)
+		return err
+	}
+	return nil
+}
+
 // FindPhoto
 func FindSketchInfo(ctx context.Context, TaskID string) (*gorm_model.YounggeeSketchInfo, error) {
 	db := GetReadDB(ctx)

+ 15 - 1
db/task.go

@@ -156,7 +156,7 @@ func GetUnfinishedTaskNumber(ctx context.Context, projectID string) (*int64, err
 func SetTaskFinish(ctx context.Context, TaskIDs []string) error {
 	db := GetReadDB(ctx)
 	// 1. 修改任务表,更新任务阶段为已结案,结案方式为正常结束,数据状态为已通过,
-	err := db.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id in ?", TaskIDs).Updates(gorm_model.YoungeeTaskInfo{DataStatus: 5, TaskStage: 15, CompleteStatus: 2, WithdrawStatus: 2, CompleteDate: time.Now()}).Error
+	err := db.Model(gorm_model.YoungeeTaskInfo{}).Where("task_id in ?", TaskIDs).Updates(gorm_model.YoungeeTaskInfo{DataStatus: 5, TaskStage: 15, CompleteStatus: 2, WithdrawStatus: 2, CompleteDate: time.Now(), SettleStatus: 2}).Error
 	if err != nil {
 		logrus.WithContext(ctx).Errorf("[Task db] Update YoungeeTaskInfo error,err:%+v", err)
 		return err
@@ -394,3 +394,17 @@ func UpdateTask(ctx context.Context, updateData gorm_model.YoungeeTaskInfo, tx *
 
 	return true, nil
 }
+
+func EndTask(ctx context.Context, req http_model.EndTaskRequest) error {
+	db := GetWriteDB(ctx)
+	updates := gorm_model.YoungeeTaskInfo{TaskStage: 17}
+
+	// 更新指定任务的 Stage
+	err := db.Model(&gorm_model.YoungeeTaskInfo{}).Where("task_id IN ?", req.TaskId).Updates(updates).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[EndTask] error updating task stage, task_id: %s, err: %+v", req.TaskId, err)
+		return err
+	}
+
+	return nil
+}

+ 6 - 0
go.mod

@@ -56,12 +56,18 @@ require (
 	github.com/tjfoc/gmsm v1.4.1 // indirect
 	github.com/ugorji/go/codec v1.2.7 // indirect
 	go.mongodb.org/mongo-driver v1.12.0 // indirect
+	github.com/urfave/cli/v2 v2.3.0 // indirect
+	github.com/yuin/goldmark v1.4.13 // indirect
+	go.mongodb.org/mongo-driver v1.12.0 // indirect
 	golang.org/x/mod v0.8.0 // indirect
 	golang.org/x/sync v0.1.0 // indirect
 	golang.org/x/text v0.15.0 // indirect
 	golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect
 	gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
 	gopkg.in/ini.v1 v1.67.0 // indirect
+	gopkg.in/errgo.v2 v2.1.0 // indirect
+	gopkg.in/fsnotify.v1 v1.4.7 // indirect
+	gopkg.in/ini.v1 v1.67.0 // indirect
 	gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect
 	gopkg.in/yaml.v3 v3.0.1 // indirect
 )

+ 61 - 0
handler/PassproTaskCoop.go

@@ -0,0 +1,61 @@
+package handler
+
+import (
+	"github.com/gin-gonic/gin"
+	"github.com/sirupsen/logrus"
+	"youngee_b_api/consts"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/service"
+	"youngee_b_api/util"
+)
+
+func WrapPassproTaskCoopHandler(ctx *gin.Context) {
+	handler := newPassproTaskCoopHandler(ctx)
+	baseRun(handler)
+}
+
+type PassproTaskCoop struct {
+	ctx  *gin.Context
+	req  *http_model.PassproTaskCoopRequest
+	resp *http_model.CommonResponse
+}
+
+func (c PassproTaskCoop) getContext() *gin.Context {
+	return c.ctx
+}
+
+func (c PassproTaskCoop) getResponse() interface{} {
+	return c.resp
+}
+
+func (c PassproTaskCoop) getRequest() interface{} {
+	return c.req
+}
+
+func (c PassproTaskCoop) run() {
+	data := http_model.PassproTaskCoopRequest{}
+	data = *c.req
+	//auth := middleware.GetSessionAuth(c.ctx)
+	//enterpriseID := auth.EnterpriseID
+	res, err := service.Task.PassCoop(c.ctx, data)
+	if err != nil {
+		logrus.Errorf("[PassproTaskCoop] call PassproTaskCoop err:%+v\n", err)
+		util.HandlerPackErrorResp(c.resp, consts.ErrorInternal, "")
+		logrus.Info("PassproTaskCoop fail,req:%+v", c.req)
+		return
+	}
+	c.resp.Message = "成功合作公开种草任务"
+	c.resp.Data = res
+}
+
+func (c PassproTaskCoop) checkParam() error {
+	return nil
+}
+
+func newPassproTaskCoopHandler(ctx *gin.Context) *PassproTaskCoop {
+	return &PassproTaskCoop{
+		ctx:  ctx,
+		req:  http_model.NewPassproTaskCoopRequest(),
+		resp: http_model.NewPassproTaskCoopResponse(),
+	}
+}

+ 56 - 0
handler/Prelinklist.go

@@ -0,0 +1,56 @@
+package handler
+
+import (
+	"github.com/gin-gonic/gin"
+	"github.com/sirupsen/logrus"
+	"youngee_b_api/consts"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/service"
+	"youngee_b_api/util"
+)
+
+func WrapPreLinkListHandler(ctx *gin.Context) {
+	handler := newPreLinkListHandler(ctx)
+	baseRun(handler)
+}
+
+func newPreLinkListHandler(ctx *gin.Context) *PreLinkListHandler {
+	return &PreLinkListHandler{
+		req:  http_model.NewPreLinkListRequest(),
+		resp: http_model.NewPreLinkListResponse(),
+		ctx:  ctx,
+	}
+}
+
+type PreLinkListHandler struct {
+	req  *http_model.PreLinkListRequest
+	resp *http_model.CommonResponse
+	ctx  *gin.Context
+}
+
+func (h PreLinkListHandler) getRequest() interface{} {
+	return h.req
+}
+func (h PreLinkListHandler) getContext() *gin.Context {
+	return h.ctx
+}
+func (h PreLinkListHandler) getResponse() interface{} {
+	return h.resp
+}
+func (h PreLinkListHandler) run() {
+	data := http_model.PreLinkListRequest{}
+	data = *h.req
+	res, err := service.Task.GetPreLinkList(h.ctx, data)
+	if err != nil {
+		logrus.Errorf("[GetPreLinkList] call GetPreLinkList err:%+v\n", err)
+		util.HandlerPackErrorResp(h.resp, consts.ErrorInternal, "")
+		logrus.Info("GetPreLinkList fail,req:%+v", h.req)
+		return
+	}
+	h.resp.Message = "成功查询链接待传列表"
+	h.resp.Data = res
+}
+
+func (h PreLinkListHandler) checkParam() error {
+	return nil
+}

+ 61 - 0
handler/RefuseproTaskCoop.go

@@ -0,0 +1,61 @@
+package handler
+
+import (
+	"github.com/gin-gonic/gin"
+	"github.com/sirupsen/logrus"
+	"youngee_b_api/consts"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/service"
+	"youngee_b_api/util"
+)
+
+func WrapRefuseproTaskCoopHandler(ctx *gin.Context) {
+	handler := newRefuseproTaskCoopHandler(ctx)
+	baseRun(handler)
+}
+
+type RefuseproTaskCoop struct {
+	ctx  *gin.Context
+	req  *http_model.RefuseproTaskCoopRequest
+	resp *http_model.CommonResponse
+}
+
+func (c RefuseproTaskCoop) getContext() *gin.Context {
+	return c.ctx
+}
+
+func (c RefuseproTaskCoop) getResponse() interface{} {
+	return c.resp
+}
+
+func (c RefuseproTaskCoop) getRequest() interface{} {
+	return c.req
+}
+
+func (c RefuseproTaskCoop) run() {
+	data := http_model.RefuseproTaskCoopRequest{}
+	data = *c.req
+	//auth := middleware.GetSessionAuth(c.ctx)
+	//enterpriseID := auth.EnterpriseID
+	res, err := service.Task.RefuseCoop(c.ctx, data)
+	if err != nil {
+		logrus.Errorf("[RefuseproTaskCoop] call RefuseproTaskCoop err:%+v\n", err)
+		util.HandlerPackErrorResp(c.resp, consts.ErrorInternal, "")
+		logrus.Info("RefuseproTaskCoop fail,req:%+v", c.req)
+		return
+	}
+	c.resp.Message = "成功拒绝种草任务"
+	c.resp.Data = res
+}
+
+func (c RefuseproTaskCoop) checkParam() error {
+	return nil
+}
+
+func newRefuseproTaskCoopHandler(ctx *gin.Context) *RefuseproTaskCoop {
+	return &RefuseproTaskCoop{
+		ctx:  ctx,
+		req:  http_model.NewRefuseproTaskCoopRequest(),
+		resp: http_model.NewRefuseproTaskCoopResponse(),
+	}
+}

+ 58 - 0
handler/endtask.go

@@ -0,0 +1,58 @@
+package handler
+
+import (
+	"github.com/gin-gonic/gin"
+	"github.com/sirupsen/logrus"
+	"youngee_b_api/consts"
+	"youngee_b_api/db"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/util"
+)
+
+func WrapEndTaskHandler(ctx *gin.Context) {
+	handler := newEndTaskHandler(ctx)
+	baseRun(handler)
+}
+
+type EndTask struct {
+	ctx  *gin.Context
+	req  *http_model.EndTaskRequest
+	resp *http_model.CommonResponse
+}
+
+func (c EndTask) getContext() *gin.Context {
+	return c.ctx
+}
+
+func (c EndTask) getResponse() interface{} {
+	return c.resp
+}
+
+func (c EndTask) getRequest() interface{} {
+	return c.req
+}
+
+func (c EndTask) run() {
+	data := http_model.EndTaskRequest{}
+	data = *c.req
+	err := db.EndTask(c.ctx, data)
+	if err != nil {
+		logrus.Errorf("[GetSecTaskList] call EndTask err:%+v\n", err)
+		util.HandlerPackErrorResp(c.resp, consts.ErrorInternal, "")
+		logrus.Info("GetSecTaskList fail,req:%+v", c.req)
+		return
+	}
+	c.resp.Message = "成功终止任务状态"
+}
+
+func (c EndTask) checkParam() error {
+	return nil
+}
+
+func newEndTaskHandler(ctx *gin.Context) *EndTask {
+	return &EndTask{
+		ctx:  ctx,
+		req:  http_model.NewEndTaskRequest(),
+		resp: http_model.NewEndTaskResponse(),
+	}
+}

+ 61 - 0
handler/executedata.go

@@ -0,0 +1,61 @@
+package handler
+
+import (
+	"github.com/gin-gonic/gin"
+	"github.com/sirupsen/logrus"
+	"youngee_b_api/consts"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/service"
+	"youngee_b_api/util"
+)
+
+func WrapExecuteDataHandler(ctx *gin.Context) {
+	handler := newExecuteDataHandler(ctx)
+	baseRun(handler)
+}
+
+type ExecuteData struct {
+	ctx  *gin.Context
+	req  *http_model.ExecuteDataRequest
+	resp *http_model.CommonResponse
+}
+
+func (c ExecuteData) getContext() *gin.Context {
+	return c.ctx
+}
+
+func (c ExecuteData) getResponse() interface{} {
+	return c.resp
+}
+
+func (c ExecuteData) getRequest() interface{} {
+	return c.req
+}
+
+func (c ExecuteData) run() {
+	data := http_model.ExecuteDataRequest{}
+	data = *c.req
+	//auth := middleware.GetSessionAuth(c.ctx)
+	//enterpriseID := auth.EnterpriseID
+	res, err := service.Project.ExecuteData(c.ctx, data)
+	if err != nil {
+		logrus.Errorf("[ExecuteData] call ExecuteData err:%+v\n", err)
+		util.HandlerPackErrorResp(c.resp, consts.ErrorInternal, "")
+		logrus.Info("ExecuteData fail,req:%+v", c.req)
+		return
+	}
+	c.resp.Message = "成功看数据"
+	c.resp.Data = res
+}
+
+func (c ExecuteData) checkParam() error {
+	return nil
+}
+
+func newExecuteDataHandler(ctx *gin.Context) *ExecuteData {
+	return &ExecuteData{
+		ctx:  ctx,
+		req:  http_model.NewExecuteDataRequest(),
+		resp: http_model.NewExecuteDataResponse(),
+	}
+}

+ 59 - 0
handler/gettasklist.go

@@ -0,0 +1,59 @@
+package handler
+
+import (
+	"github.com/gin-gonic/gin"
+	"github.com/sirupsen/logrus"
+	"youngee_b_api/consts"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/service"
+	"youngee_b_api/util"
+)
+
+func WrapGetTaskListHandler(ctx *gin.Context) {
+	handler := newGetTaskListHandler(ctx)
+	baseRun(handler)
+}
+
+type GetTaskList struct {
+	ctx  *gin.Context
+	req  *http_model.GetTaskListRequest
+	resp *http_model.CommonResponse
+}
+
+func (c GetTaskList) getContext() *gin.Context {
+	return c.ctx
+}
+
+func (c GetTaskList) getResponse() interface{} {
+	return c.resp
+}
+
+func (c GetTaskList) getRequest() interface{} {
+	return c.req
+}
+
+func (c GetTaskList) run() {
+	data := http_model.GetTaskListRequest{}
+	data = *c.req
+	res, err := service.Task.GetList(c.ctx, data)
+	if err != nil {
+		logrus.Errorf("[GetSecTaskList] call GetSecTaskList err:%+v\n", err)
+		util.HandlerPackErrorResp(c.resp, consts.ErrorInternal, "")
+		logrus.Info("GetSecTaskList fail,req:%+v", c.req)
+		return
+	}
+	c.resp.Message = "成功查询种草达人"
+	c.resp.Data = res
+}
+
+func (c GetTaskList) checkParam() error {
+	return nil
+}
+
+func newGetTaskListHandler(ctx *gin.Context) *GetTaskList {
+	return &GetTaskList{
+		ctx:  ctx,
+		req:  http_model.NewGetTaskListRequest(),
+		resp: http_model.NewGetTaskListResponse(),
+	}
+}

+ 56 - 0
handler/predatalist.go

@@ -0,0 +1,56 @@
+package handler
+
+import (
+	"github.com/gin-gonic/gin"
+	"github.com/sirupsen/logrus"
+	"youngee_b_api/consts"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/service"
+	"youngee_b_api/util"
+)
+
+func WrapPreDataListHandler(ctx *gin.Context) {
+	handler := newPreDataListHandler(ctx)
+	baseRun(handler)
+}
+
+func newPreDataListHandler(ctx *gin.Context) *PreDataListHandler {
+	return &PreDataListHandler{
+		req:  http_model.NewPreDataListRequest(),
+		resp: http_model.NewPreDataListResponse(),
+		ctx:  ctx,
+	}
+}
+
+type PreDataListHandler struct {
+	req  *http_model.PreDataListRequest
+	resp *http_model.CommonResponse
+	ctx  *gin.Context
+}
+
+func (h PreDataListHandler) getRequest() interface{} {
+	return h.req
+}
+func (h PreDataListHandler) getContext() *gin.Context {
+	return h.ctx
+}
+func (h PreDataListHandler) getResponse() interface{} {
+	return h.resp
+}
+func (h PreDataListHandler) run() {
+	data := http_model.PreDataListRequest{}
+	data = *h.req
+	res, err := service.Task.GetPreDataList(h.ctx, data)
+	if err != nil {
+		logrus.Errorf("[GetPreDataList] call GetPreDataList err:%+v\n", err)
+		util.HandlerPackErrorResp(h.resp, consts.ErrorInternal, "")
+		logrus.Info("GetPreDataList fail,req:%+v", h.req)
+		return
+	}
+	h.resp.Message = "成功查询数据待传列表"
+	h.resp.Data = res
+}
+
+func (h PreDataListHandler) checkParam() error {
+	return nil
+}

+ 59 - 0
handler/presketchlist.go

@@ -0,0 +1,59 @@
+package handler
+
+import (
+	"github.com/gin-gonic/gin"
+	"github.com/sirupsen/logrus"
+	"youngee_b_api/consts"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/service"
+	"youngee_b_api/util"
+)
+
+func WrapPreSketchListHandler(ctx *gin.Context) {
+	handler := newPreSketchListHandler(ctx)
+	baseRun(handler)
+}
+
+type PreSketchList struct {
+	ctx  *gin.Context
+	req  *http_model.PreSketchListRequest
+	resp *http_model.CommonResponse
+}
+
+func (c PreSketchList) getContext() *gin.Context {
+	return c.ctx
+}
+
+func (c PreSketchList) getResponse() interface{} {
+	return c.resp
+}
+
+func (c PreSketchList) getRequest() interface{} {
+	return c.req
+}
+
+func (c PreSketchList) run() {
+	data := http_model.PreSketchListRequest{}
+	data = *c.req
+	res, err := service.Task.GetPreSketchList(c.ctx, data)
+	if err != nil {
+		logrus.Errorf("[GetPreSketchList] call GetPreSketchList err:%+v\n", err)
+		util.HandlerPackErrorResp(c.resp, consts.ErrorInternal, "")
+		logrus.Info("GetPreSketchList fail,req:%+v", c.req)
+		return
+	}
+	c.resp.Message = "成功查询待传初稿"
+	c.resp.Data = res
+}
+
+func (c PreSketchList) checkParam() error {
+	return nil
+}
+
+func newPreSketchListHandler(ctx *gin.Context) *PreSketchList {
+	return &PreSketchList{
+		ctx:  ctx,
+		req:  http_model.NewPreSketchListRequest(),
+		resp: http_model.NewPreSketchListResponse(),
+	}
+}

+ 61 - 0
handler/project_data.go

@@ -0,0 +1,61 @@
+package handler
+
+import (
+	"github.com/gin-gonic/gin"
+	"github.com/sirupsen/logrus"
+	"youngee_b_api/consts"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/service"
+	"youngee_b_api/util"
+)
+
+func WrapDataHandler(ctx *gin.Context) {
+	handler := newDataHandler(ctx)
+	baseRun(handler)
+}
+
+type Data struct {
+	ctx  *gin.Context
+	req  *http_model.DataRequest
+	resp *http_model.CommonResponse
+}
+
+func (c Data) getContext() *gin.Context {
+	return c.ctx
+}
+
+func (c Data) getResponse() interface{} {
+	return c.resp
+}
+
+func (c Data) getRequest() interface{} {
+	return c.req
+}
+
+func (c Data) run() {
+	data := http_model.DataRequest{}
+	data = *c.req
+	//auth := middleware.GetSessionAuth(c.ctx)
+	//enterpriseID := auth.EnterpriseID
+	res, err := service.Project.ProjectData(c.ctx, data)
+	if err != nil {
+		logrus.Errorf("[Data] call Data err:%+v\n", err)
+		util.HandlerPackErrorResp(c.resp, consts.ErrorInternal, "")
+		logrus.Info("Data fail,req:%+v", c.req)
+		return
+	}
+	c.resp.Message = "成功看数据"
+	c.resp.Data = res
+}
+
+func (c Data) checkParam() error {
+	return nil
+}
+
+func newDataHandler(ctx *gin.Context) *Data {
+	return &Data{
+		ctx:  ctx,
+		req:  http_model.NewDataRequest(),
+		resp: http_model.NewDataResponse(),
+	}
+}

+ 1 - 1
handler/project_taskList.go

@@ -55,7 +55,7 @@ func (h *ProjectTaskListHandler) getResponse() interface{} {
 }
 func (h *ProjectTaskListHandler) run() {
 	conditions := pack.HttpProjectTaskRequestToCondition(h.req)
-	data, err := service.Project.GetProjectTaskList(h.ctx, h.req.ProjectId, h.req.PageSize, h.req.PageNum, conditions)
+	data, err := service.Project.GetProjectTaskList(h.ctx, h.req.PageSize, h.req.PageNum, conditions)
 	if err != nil {
 		logrus.WithContext(h.ctx).Errorf("[ProjectTaskListHandler] error GetProjectTaskList, err:%+v", err)
 		util.HandlerPackErrorResp(h.resp, consts.ErrorInternal, consts.DefaultToast)

+ 61 - 0
handler/projectdata.go

@@ -0,0 +1,61 @@
+package handler
+
+import (
+	"github.com/gin-gonic/gin"
+	"github.com/sirupsen/logrus"
+	"youngee_b_api/consts"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/service"
+	"youngee_b_api/util"
+)
+
+func WrapProjectDataHandler(ctx *gin.Context) {
+	handler := newProjectDataHandler(ctx)
+	baseRun(handler)
+}
+
+type ProjectData struct {
+	ctx  *gin.Context
+	req  *http_model.ProjectDataRequest
+	resp *http_model.CommonResponse
+}
+
+func (c ProjectData) getContext() *gin.Context {
+	return c.ctx
+}
+
+func (c ProjectData) getResponse() interface{} {
+	return c.resp
+}
+
+func (c ProjectData) getRequest() interface{} {
+	return c.req
+}
+
+func (c ProjectData) run() {
+	data := http_model.ProjectDataRequest{}
+	data = *c.req
+	//auth := middleware.GetSessionAuth(c.ctx)
+	//enterpriseID := auth.EnterpriseID
+	res, err := service.Project.Data(c.ctx, data)
+	if err != nil {
+		logrus.Errorf("[ProjectData] call ProjectData err:%+v\n", err)
+		util.HandlerPackErrorResp(c.resp, consts.ErrorInternal, "")
+		logrus.Info("ProjectData fail,req:%+v", c.req)
+		return
+	}
+	c.resp.Message = "成功看数据"
+	c.resp.Data = res
+}
+
+func (c ProjectData) checkParam() error {
+	return nil
+}
+
+func newProjectDataHandler(ctx *gin.Context) *ProjectData {
+	return &ProjectData{
+		ctx:  ctx,
+		req:  http_model.NewProjectDataRequest(),
+		resp: http_model.NewProjectDataResponse(),
+	}
+}

+ 60 - 0
handler/reject_data.go

@@ -0,0 +1,60 @@
+package handler
+
+import (
+	"youngee_b_api/consts"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/service"
+	"youngee_b_api/util"
+
+	"github.com/gin-gonic/gin"
+	"github.com/sirupsen/logrus"
+	log "github.com/sirupsen/logrus"
+)
+
+func WrapRejectDataHandler(ctx *gin.Context) {
+	handler := newRejectDataHandler(ctx)
+	baseRun(handler)
+}
+
+func newRejectDataHandler(ctx *gin.Context) *RejectDataHandler {
+	return &RejectDataHandler{
+		req:  http_model.NewRejectDataRequest(),
+		resp: http_model.NewRejectDataResponse(),
+		ctx:  ctx,
+	}
+}
+
+type RejectDataHandler struct {
+	req  *http_model.RejectDataRequest
+	resp *http_model.CommonResponse
+	ctx  *gin.Context
+}
+
+func (h *RejectDataHandler) getRequest() interface{} {
+	return h.req
+}
+func (h *RejectDataHandler) getContext() *gin.Context {
+	return h.ctx
+}
+func (h *RejectDataHandler) getResponse() interface{} {
+	return h.resp
+}
+
+func (h *RejectDataHandler) run() {
+	data := http_model.RejectDataRequest{}
+	data = *h.req
+	res, err := service.Data.RejectData(h.ctx, data)
+	if err != nil {
+		logrus.Errorf("[ReviseOpinionHandler] call Create err:%+v\n", err)
+		util.HandlerPackErrorResp(h.resp, consts.ErrorInternal, "")
+		log.Info("CreateProject fail,req:%+v", h.req)
+		return
+	}
+	h.resp.Message = "成功拒绝数据"
+	h.resp.Data = res
+	h.resp.Data = data
+}
+
+func (h *RejectDataHandler) checkParam() error {
+	return nil
+}

+ 60 - 0
handler/reject_link.go

@@ -0,0 +1,60 @@
+package handler
+
+import (
+	"youngee_b_api/consts"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/service"
+	"youngee_b_api/util"
+
+	"github.com/gin-gonic/gin"
+	"github.com/sirupsen/logrus"
+	log "github.com/sirupsen/logrus"
+)
+
+func WrapRejectLinkHandler(ctx *gin.Context) {
+	handler := newRejectLinkHandler(ctx)
+	baseRun(handler)
+}
+
+func newRejectLinkHandler(ctx *gin.Context) *RejectLinkHandler {
+	return &RejectLinkHandler{
+		req:  http_model.NewRejectLinkRequest(),
+		resp: http_model.NewRejectLinkResponse(),
+		ctx:  ctx,
+	}
+}
+
+type RejectLinkHandler struct {
+	req  *http_model.RejectLinkRequest
+	resp *http_model.CommonResponse
+	ctx  *gin.Context
+}
+
+func (h *RejectLinkHandler) getRequest() interface{} {
+	return h.req
+}
+func (h *RejectLinkHandler) getContext() *gin.Context {
+	return h.ctx
+}
+func (h *RejectLinkHandler) getResponse() interface{} {
+	return h.resp
+}
+
+func (h *RejectLinkHandler) run() {
+	data := http_model.RejectLinkRequest{}
+	data = *h.req
+	res, err := service.Link.RejectLink(h.ctx, data)
+	if err != nil {
+		logrus.Errorf("[ReviseOpinionHandler] call Create err:%+v\n", err)
+		util.HandlerPackErrorResp(h.resp, consts.ErrorInternal, "")
+		log.Info("CreateProject fail,req:%+v", h.req)
+		return
+	}
+	h.resp.Message = "成功拒绝链接"
+	h.resp.Data = res
+	h.resp.Data = data
+}
+
+func (h *RejectLinkHandler) checkParam() error {
+	return nil
+}

+ 58 - 0
handler/reject_sketch.go

@@ -0,0 +1,58 @@
+package handler
+
+import (
+	"github.com/gin-gonic/gin"
+	"github.com/sirupsen/logrus"
+	log "github.com/sirupsen/logrus"
+	"youngee_b_api/consts"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/service"
+	"youngee_b_api/util"
+)
+
+func WrapRejectSketchHandler(ctx *gin.Context) {
+	handler := newRejectSketchHandler(ctx)
+	baseRun(handler)
+}
+
+func newRejectSketchHandler(ctx *gin.Context) *RejectSketchHandler {
+	return &RejectSketchHandler{
+		req:  http_model.NewRejectSketchRequest(),
+		resp: http_model.NewRejectSketchResponse(),
+		ctx:  ctx,
+	}
+}
+
+type RejectSketchHandler struct {
+	req  *http_model.RejectSketchRequest
+	resp *http_model.CommonResponse
+	ctx  *gin.Context
+}
+
+func (h *RejectSketchHandler) getRequest() interface{} {
+	return h.req
+}
+func (h *RejectSketchHandler) getContext() *gin.Context {
+	return h.ctx
+}
+func (h *RejectSketchHandler) getResponse() interface{} {
+	return h.resp
+}
+
+func (h *RejectSketchHandler) run() {
+	data := http_model.RejectSketchRequest{}
+	data = *h.req
+	res, err := service.Sketch.RejectSketch(h.ctx, data)
+	if err != nil {
+		logrus.Errorf("[ReviseOpinionHandler] call Create err:%+v\n", err)
+		util.HandlerPackErrorResp(h.resp, consts.ErrorInternal, "")
+		log.Info("CreateProject fail,req:%+v", h.req)
+		return
+	}
+	h.resp.Message = "成功拒绝初稿"
+	h.resp.Data = res
+	h.resp.Data = data
+}
+func (h *RejectSketchHandler) checkParam() error {
+	return nil
+}

+ 59 - 0
handler/taskdatalist.go

@@ -0,0 +1,59 @@
+package handler
+
+import (
+	"github.com/gin-gonic/gin"
+	"github.com/sirupsen/logrus"
+	"youngee_b_api/consts"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/service"
+	"youngee_b_api/util"
+)
+
+func WrapTaskDatalistHandler(ctx *gin.Context) {
+	handler := newTaskDatalistHandler(ctx)
+	baseRun(handler)
+}
+
+type TaskDatalist struct {
+	ctx  *gin.Context
+	req  *http_model.TaskDatalistRequest
+	resp *http_model.CommonResponse
+}
+
+func (c TaskDatalist) getContext() *gin.Context {
+	return c.ctx
+}
+
+func (c TaskDatalist) getResponse() interface{} {
+	return c.resp
+}
+
+func (c TaskDatalist) getRequest() interface{} {
+	return c.req
+}
+
+func (c TaskDatalist) run() {
+	data := http_model.TaskDatalistRequest{}
+	data = *c.req
+	res, err := service.Task.GetTaskDatalist(c.ctx, data)
+	if err != nil {
+		logrus.Errorf("[GetTaskDatalist] call GetTaskDatalist err:%+v\n", err)
+		util.HandlerPackErrorResp(c.resp, consts.ErrorInternal, "")
+		logrus.Info("GetTaskDatalist fail,req:%+v", c.req)
+		return
+	}
+	c.resp.Message = "成功查询数据待审列表"
+	c.resp.Data = res
+}
+
+func (c TaskDatalist) checkParam() error {
+	return nil
+}
+
+func newTaskDatalistHandler(ctx *gin.Context) *TaskDatalist {
+	return &TaskDatalist{
+		ctx:  ctx,
+		req:  http_model.NewTaskDatalistRequest(),
+		resp: http_model.NewTaskDatalistResponse(),
+	}
+}

+ 59 - 0
handler/tasklinklist.go

@@ -0,0 +1,59 @@
+package handler
+
+import (
+	"github.com/gin-gonic/gin"
+	"github.com/sirupsen/logrus"
+	"youngee_b_api/consts"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/service"
+	"youngee_b_api/util"
+)
+
+func WrapTaskLinklistHandler(ctx *gin.Context) {
+	handler := newTaskLinklistHandler(ctx)
+	baseRun(handler)
+}
+
+type TaskLinklist struct {
+	ctx  *gin.Context
+	req  *http_model.TaskLinklistRequest
+	resp *http_model.CommonResponse
+}
+
+func (c TaskLinklist) getContext() *gin.Context {
+	return c.ctx
+}
+
+func (c TaskLinklist) getResponse() interface{} {
+	return c.resp
+}
+
+func (c TaskLinklist) getRequest() interface{} {
+	return c.req
+}
+
+func (c TaskLinklist) run() {
+	data := http_model.TaskLinklistRequest{}
+	data = *c.req
+	res, err := service.Task.GetTaskLinklist(c.ctx, data)
+	if err != nil {
+		logrus.Errorf("[GetTaskLinklist] call GetTaskLinklist err:%+v\n", err)
+		util.HandlerPackErrorResp(c.resp, consts.ErrorInternal, "")
+		logrus.Info("GetTaskLinklist fail,req:%+v", c.req)
+		return
+	}
+	c.resp.Message = "成功查询链接待审列表"
+	c.resp.Data = res
+}
+
+func (c TaskLinklist) checkParam() error {
+	return nil
+}
+
+func newTaskLinklistHandler(ctx *gin.Context) *TaskLinklist {
+	return &TaskLinklist{
+		ctx:  ctx,
+		req:  http_model.NewTaskLinklistRequest(),
+		resp: http_model.NewTaskLinklistResponse(),
+	}
+}

+ 59 - 0
handler/tasksketchlist.go

@@ -0,0 +1,59 @@
+package handler
+
+import (
+	"github.com/gin-gonic/gin"
+	"github.com/sirupsen/logrus"
+	"youngee_b_api/consts"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/service"
+	"youngee_b_api/util"
+)
+
+func WrapTasksketchlistHandler(ctx *gin.Context) {
+	handler := newTasksketchlistHandler(ctx)
+	baseRun(handler)
+}
+
+type Tasksketchlist struct {
+	ctx  *gin.Context
+	req  *http_model.TasksketchlistRequest
+	resp *http_model.CommonResponse
+}
+
+func (c Tasksketchlist) getContext() *gin.Context {
+	return c.ctx
+}
+
+func (c Tasksketchlist) getResponse() interface{} {
+	return c.resp
+}
+
+func (c Tasksketchlist) getRequest() interface{} {
+	return c.req
+}
+
+func (c Tasksketchlist) run() {
+	data := http_model.TasksketchlistRequest{}
+	data = *c.req
+	res, err := service.Task.GetTasksketchlist(c.ctx, data)
+	if err != nil {
+		logrus.Errorf("[GetTasksketchList] call GetTasksketchList err:%+v\n", err)
+		util.HandlerPackErrorResp(c.resp, consts.ErrorInternal, "")
+		logrus.Info("GetTasksketchList fail,req:%+v", c.req)
+		return
+	}
+	c.resp.Message = "成功查询初稿待审列表"
+	c.resp.Data = res
+}
+
+func (c Tasksketchlist) checkParam() error {
+	return nil
+}
+
+func newTasksketchlistHandler(ctx *gin.Context) *Tasksketchlist {
+	return &Tasksketchlist{
+		ctx:  ctx,
+		req:  http_model.NewTasksketchlistRequest(),
+		resp: http_model.NewTasksketchlistResponse(),
+	}
+}

+ 4 - 6
main.go

@@ -3,8 +3,6 @@ package main
 import (
 	"fmt"
 	"github.com/gin-gonic/gin"
-	"log"
-	"youngee_b_api/app/schedule"
 	"youngee_b_api/config"
 	_ "youngee_b_api/docs"
 	"youngee_b_api/route"
@@ -21,9 +19,9 @@ func main() {
 
 	addr := fmt.Sprintf("%v:%v", config.Host, config.Port)
 	//err := service.AutoTask()
-	err := schedule.AutoTask()
-	if err != nil {
-		log.Println("service AutoTask error:", err)
-	}
+	//err := schedule.AutoTask()
+	//if err != nil {
+	//	log.Println("service AutoTask error:", err)
+	//}
 	r.Run(addr) // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
 }

+ 14 - 15
model/gorm_model/info_auto_task.go

@@ -1,21 +1,20 @@
 package gorm_model
 
-// Code generated by sql2gorm. DO NOT EDIT.
-
 type InfoAutoTask struct {
-	AutoTaskID        int `gorm:"column:auto_task_id;primary_key;AUTO_INCREMENT"` // 自动处理规则id
-	SignInOffline     int `gorm:"column:sign_in_offline"`                         // 线下探店自动签收时间
-	SignInVirtual     int `gorm:"column:sign_in_virtual"`                         // 虚拟产品测评自动签收时间
-	ReviewInMv        int `gorm:"column:review_in_mv"`                            // 视频形式的审稿处理
-	ReviewUnlimited   int `gorm:"column:review_unlimited"`                        // 不限形式的审稿处理
-	Postreview        int `gorm:"column:postreview"`                              // 发布审核自动处理
-	CaseClose         int `gorm:"column:case_close"`                              // 结案自动处理
-	Invalid           int `gorm:"column:invalid"`                                 // 失效自动处理
-	DraftDefaultInPic int `gorm:"column:draft_default_in_pic"`                    // 图片初稿违约自动处理
-	DraftDefaultInMv  int `gorm:"column:draft_default_in_mv"`                     // 视频初稿违约自动处理
-	ScriptDefault     int `gorm:"column:script_default"`                          // 脚本违约自动处理
-	LinkBreach        int `gorm:"column:link_breach"`                             // 链接违约自动处理
-	CaseCloseDefault  int `gorm:"column:case_close_default"`                      // 结案违约自动处理
+	AutoTaskID       int    `gorm:"column:auto_task_id;primary_key;AUTO_INCREMENT"` // 自动处理规则id
+	EnterpriseId     string `gorm:"column:enterprise_id"`                           // 企业ID
+	SignInOffline    int    `gorm:"column:sign_in_offline"`                         // 线下探店自动签收时间
+	SignInVirtual    int    `gorm:"column:sign_in_virtual"`                         // 虚拟产品测评自动签收时间
+	ReviewInMv       int    `gorm:"column:review_in_mv"`                            // 视频形式的审稿处理
+	ReviewUnlimited  int    `gorm:"column:review_unlimited"`                        // 不限形式的审稿处理
+	Postreview       int    `gorm:"column:postreview"`                              // 发布审核自动处理
+	CaseClose        int    `gorm:"column:case_close"`                              // 结案自动处理
+	Invalid          int    `gorm:"column:invalid"`                                 // 失效自动处理
+	DraftDefault     int    `gorm:"column:draft_default"`                           // 初稿违约自动处理
+	DraftDefaultInMv int    `gorm:"column:draft_default_in_mv"`                     // 视频初稿违约自动处理
+	ScriptDefault    int    `gorm:"column:script_default"`                          // 脚本违约自动处理
+	LinkBreach       int    `gorm:"column:link_breach"`                             // 链接违约自动处理
+	CaseCloseDefault int    `gorm:"column:case_close_default"`                      // 结案违约自动处理
 }
 
 func (m *InfoAutoTask) TableName() string {

+ 33 - 34
model/gorm_model/project.go

@@ -1,4 +1,3 @@
-// Code generated by sql2gorm. DO NOT EDIT.
 package gorm_model
 
 import (
@@ -6,39 +5,39 @@ import (
 )
 
 type ProjectInfo struct {
-	ProjectID         string      `gorm:"column:project_id;primary_key;"` // 项目id 项目ID生成规则:年(2位)+一年中的第几天(3位)+5位数随机数,雪花算法也可,生成10位订单号
-	ProjectName       string     `gorm:"column:project_name"`                          // 项目名称
-	ProjectStatus     int64      `gorm:"column:project_status"`                        // 项目状态,1-10分别代表创建中、待审核、审核通过、招募中、招募完毕、待支付、已支付、失效、执行中、已结案
-	ProjectType       int64      `gorm:"column:project_type"`                          // 项目类型,1代表全流程项目,2代表专项项目
-	ProjectPlatform   int64      `gorm:"column:project_platform"`                      // 项目平台,1-7分别代表红book、抖音、微博、快手、b站、大众点评、知乎
-	ProjectForm       int64      `gorm:"column:project_form"`                          // 项目形式,1-4分别代表实体商品寄拍、虚拟产品测评、线下探店打卡、素材微原创
-	TalentType        string     `gorm:"column:talent_type"`                           // 达人类型
-	RecruitDdl        *time.Time `gorm:"column:recruit_ddl"`                           // 招募截止时间
-	ContentType       int64      `gorm:"column:content_type"`                          // 内容形式,1代表图文,2代表视频
-	ProjectDetail     string     `gorm:"column:project_detail"`                        // 项目详情
-	ApplyNum          int64      `gorm:"column:apply_num;default:0;NOT NULL"`          // 报名人数
-	RecruitNum        int64      `gorm:"column:recruit_num;default:0;NOT NULL"`        // 已招募人数
-	EnterpriseID      string      `gorm:"column:enterprise_id"`                         // 所属企业id
-	ProductID         int64      `gorm:"column:product_id"`                            // 关联商品id
-	CreatedAt         *time.Time `gorm:"column:created_at"`                            // 创建时间
-	UpdatedAt         *time.Time `gorm:"column:updated_at"`                            // 修改时间
-	FeeForm           string     `gorm:"column:fee_form"`                              // 稿费形式列表
-	AutoFailAt        *time.Time `gorm:"column:auto_fail_at"`                          // 失效自动处理时间
-	AutoTaskID        int64      `gorm:"column:auto_task_id;NOT NULL"`                 // 定时任务id
-	AutoDefaultID     int64      `gorm:"column:auto_default_id;NOT NULL"`              // 违约状态id
-	PaymentAmount     float64    `gorm:"column:payment_amount"`                        // 支付金额
-	PayAt             *time.Time `gorm:"column:pay_at"`                                // 支付时间
-	AutoScriptBreakAt *time.Time `gorm:"column:auto_script_break_at"`                  // 脚本违约自动处理时间
-	AutoSketchBreakAt *time.Time `gorm:"column:auto_sketch_break_at"`                  // 初稿违约自动处理时间
-	FailReason        int64      `gorm:"column:fail_reason"`                           // 失效原因,1、2分别表示逾期未支付、项目存在风险
-	PassAt            *time.Time `gorm:"column:pass_at"`                               // 审核通过时间
-	FinishAt          *time.Time `gorm:"column:finish_at"`                             // 结案时间
-	SubmitAt          *time.Time `gorm:"column:submit_at"`                             // 结案时间
-	EstimatedCost     float64    `gorm:"column:estimated_cost"`                        // 预估成本
-	IsRead            int64      `gorm:"column:is_read"`                               // 是否已读
-	SettlementAmount  float64    `gorm:"column:settlement_amount"`                     // 结算金额
-	ProductSnap       string     `gorm:"column:product_snap"`                          // 商品信息快照
-	ProductPhotoSnap  string     `gorm:"column:product_photo_snap"`                    // 商品图片快照
+	ProjectID         string     `gorm:"column:project_id;primary_key;"`        // 项目id 项目ID生成规则:年(2位)+一年中的第几天(3位)+5位数随机数,雪花算法也可,生成10位订单号
+	ProjectName       string     `gorm:"column:project_name"`                   // 项目名称
+	ProjectStatus     int64      `gorm:"column:project_status"`                 // 项目状态,1-10分别代表创建中、待审核、审核通过、招募中、招募完毕、待支付、已支付、失效、执行中、已结案
+	ProjectType       int64      `gorm:"column:project_type"`                   // 项目类型,1代表全流程项目,2代表专项项目
+	ProjectPlatform   int64      `gorm:"column:project_platform"`               // 项目平台,1-7分别代表红book、抖音、微博、快手、b站、大众点评、知乎
+	ProjectForm       int64      `gorm:"column:project_form"`                   // 项目形式,1-4分别代表实体商品寄拍、虚拟产品测评、线下探店打卡、素材微原创
+	TalentType        string     `gorm:"column:talent_type"`                    // 达人类型
+	RecruitDdl        *time.Time `gorm:"column:recruit_ddl"`                    // 招募截止时间
+	ContentType       int64      `gorm:"column:content_type"`                   // 内容形式,1代表图文,2代表视频
+	ProjectDetail     string     `gorm:"column:project_detail"`                 // 项目详情
+	ApplyNum          int64      `gorm:"column:apply_num;default:0;NOT NULL"`   // 报名人数
+	RecruitNum        int64      `gorm:"column:recruit_num;default:0;NOT NULL"` // 已招募人数
+	EnterpriseID      string     `gorm:"column:enterprise_id"`                  // 所属企业id
+	ProductID         int64      `gorm:"column:product_id"`                     // 关联商品id
+	CreatedAt         *time.Time `gorm:"column:created_at"`                     // 创建时间
+	UpdatedAt         *time.Time `gorm:"column:updated_at"`                     // 修改时间
+	FeeForm           string     `gorm:"column:fee_form"`                       // 稿费形式列表
+	AutoFailAt        *time.Time `gorm:"column:auto_fail_at"`                   // 失效自动处理时间
+	AutoTaskID        int64      `gorm:"column:auto_task_id;NOT NULL"`          // 定时任务id
+	AutoDefaultID     int64      `gorm:"column:auto_default_id;NOT NULL"`       // 违约状态id
+	PaymentAmount     float64    `gorm:"column:payment_amount"`                 // 支付金额
+	PayAt             *time.Time `gorm:"column:pay_at"`                         // 支付时间
+	AutoScriptBreakAt *time.Time `gorm:"column:auto_script_break_at"`           // 脚本违约自动处理时间
+	AutoSketchBreakAt *time.Time `gorm:"column:auto_sketch_break_at"`           // 初稿违约自动处理时间
+	FailReason        int64      `gorm:"column:fail_reason"`                    // 失效原因,1、2分别表示逾期未支付、项目存在风险
+	PassAt            *time.Time `gorm:"column:pass_at"`                        // 审核通过时间
+	FinishAt          *time.Time `gorm:"column:finish_at"`                      // 结案时间
+	SubmitAt          *time.Time `gorm:"column:submit_at"`                      // 结案时间
+	EstimatedCost     float64    `gorm:"column:estimated_cost"`                 // 预估成本
+	IsRead            int64      `gorm:"column:is_read"`                        // 是否已读
+	SettlementAmount  float64    `gorm:"column:settlement_amount"`              // 结算金额
+	ProductSnap       string     `gorm:"column:product_snap"`                   // 商品信息快照
+	ProductPhotoSnap  string     `gorm:"column:product_photo_snap"`             // 商品图片快照
 }
 
 func (m *ProjectInfo) TableName() string {

+ 25 - 0
model/gorm_model/project_task.go

@@ -24,6 +24,7 @@ type YoungeeTaskInfo struct {
 	DataBreakRate          int       `gorm:"column:data_break_rate;default:0;NOT NULL"`   // 数据上传超时违约扣款比例,百分之
 	FeeForm                int       `gorm:"column:fee_form;NOT NULL"`                    // 稿费形式,1,2,3分别代表产品置换、固定稿费、自报价
 	ServiceCharge          float64   `gorm:"column:service_charge"`                       // 服务费
+	RealServiceCharge      float64   `gorm:"column:real_service_charge"`                  // 服务商实际所得服务费(扣除违约)
 	ServiceRate            int       `gorm:"column:service_rate"`                         // 服务费率,千分之
 	TaskStatus             int       `gorm:"column:task_status;default:1;NOT NULL"`       // 任务状态 1待选 2已选 3落选
 	TaskStage              int       `gorm:"column:task_stage;NOT NULL"`                  // 任务阶段,详情见info_task_stage表
@@ -41,6 +42,30 @@ type YoungeeTaskInfo struct {
 	CurDefaultType         int       `gorm:"column:cur_default_type"`                     // 任务当前处于的违约类型 0-8分别表示未违约、脚本超时违约、脚本未上传违约、初稿超时违约、初稿未上传违约、链接超时违约、链接未上传违约、数据超时违约、数据未上传违约
 	WithdrawStatus         int       `gorm:"column:withdraw_status;default:1"`            // 提现状态,1-4分别代表不可提现、可提现、提现中、已提现
 	SettleStatus           int       `gorm:"column:settle_status;default:1"`              // 结算状态,1、2分别表示待结算、已结算
+	SupplierId             int       `gorm:"column:supplier_id;default:0"`                // 服务商ID
+	SupplierStatus         int       `gorm:"column:supplier_status;default:0"`            // 服务商任务状态 0表示达人来源非服务商 1待选 2已选 3落选
+	DraftFee               float64   `gorm:"column:draft_fee"`                            // 达人稿费
+	SignedTime             time.Time `gorm:"column:signed_time"`                          // 签收时间
+	FansNum                int       `gorm:"column:fans_num"`                             // 粉丝数
+	VoteAvg                int       `gorm:"column:vote_avg"`                             // 平均点赞数
+	CommitAvg              int       `gorm:"column:commit_avg"`                           // 平均评论数
+	BOperator              string    `gorm:"column:b_operator"`                           // 商家确定达人操作人ID
+	BOperatorType          int       `gorm:"column:b_operator_type"`                      // 商家操作人类型,1商家用户,2商家子账号,3管理后台
+	SOperator              int       `gorm:"column:s_operator"`                           // 服务商提报达人操作人ID
+	SOperatorType          int       `gorm:"column:s_operator_type"`                      // 服务商操作人类型,1服务商主账号,2服务商子账号,3管理后台
+	SProjectId             int       `gorm:"column:s_project_id"`                         // 服务商种草任务ID
+	SupportFee             float64   `gorm:"column:support_fee"`                          // 提报价格
+	TerminateTime          time.Time `gorm:"column:terminate_time"`                       // 终止合作时间
+	TerminateReason        string    `gorm:"column:terminate_reason"`                     // 终止合作理由
+	CancelTime             time.Time `gorm:"column:cancel_time"`                          // 解约时间
+	CancelReason           string    `gorm:"column:cancel_reason"`                        // 解约理由
+	SketchMissingTime      time.Time `gorm:"column:sketch_missing_time"`                  // 未传初稿违约时间
+	SketchMissingStatus    int       `gorm:"column:sketch_missing_status"`                // 未传初稿违约状态,0无违约,1有违约
+	LinkMissingTime        time.Time `gorm:"column:link_missing_time"`                    // 未发作品违约时间
+	LinkMissingStatus      int       `gorm:"column:link_missing_status"`                  // 未发作品违约状态,0无违约,1有违约
+	DataMissingTime        time.Time `gorm:"column:data_missing_time"`                    // 未传数据违约时间
+	DataMissingStatus      int       `gorm:"column:data_missing_status"`                  // 未传数据违约状态,0无违约,1有违约
+	OpenId                 string    `gorm:"column:open_id"`                              // 达人报名的快手唯一标识
 }
 
 func (m *YoungeeTaskInfo) TableName() string {

+ 21 - 24
model/gorm_model/recruit_strategy.go

@@ -1,34 +1,31 @@
-// Code generated by sql2gorm. DO NOT EDIT.
 package gorm_model
 
-
 type RecruitStrategy struct {
-	RecruitStrategyID int64    `gorm:"column:recruit_strategy_id;primary_key;AUTO_INCREMENT"` // 招募策略id
-	FeeForm           int64    `gorm:"column:fee_form"`                                       // 稿费形式,1-3分别代表产品置换、固定稿费、自报价
-	StrategyID        int64    `gorm:"column:strategy_id"`                                    // 策略id
-	FollowersLow      int64    `gorm:"column:followers_low"`                                  // 达人粉丝数下限
-	FollowersUp       int64    `gorm:"column:followers_up"`                                   // 达人粉丝数上限
-	RecruitNumber     int64    `gorm:"column:recruit_number"`                                 // 招募数量
+	RecruitStrategyID int64   `gorm:"column:recruit_strategy_id;primary_key;AUTO_INCREMENT"` // 招募策略id
+	FeeForm           int64   `gorm:"column:fee_form"`                                       // 稿费形式,1-3分别代表产品置换、固定稿费、自报价
+	StrategyID        int64   `gorm:"column:strategy_id"`                                    // 策略id
+	FollowersLow      int64   `gorm:"column:followers_low"`                                  // 达人粉丝数下限
+	FollowersUp       int64   `gorm:"column:followers_up"`                                   // 达人粉丝数上限
+	RecruitNumber     int64   `gorm:"column:recruit_number"`                                 // 招募数量
 	Offer             float64 `gorm:"column:offer"`                                          // 报价
 	TOffer            float64 `gorm:"column:t_offer"`                                        // 达人所见报价
-	ProjectID         string   `gorm:"column:project_id"`                                     // 所属项目id
-	ServiceCharge     float64    `gorm:"column:service_charge"`                                 // 平台服务费,稿费形式为产品置换时必填
-	SelectedNumber    int64    `gorm:"column:selected_number;default:0"`                      // 已选数量,被企业选择的达人数量
-	WaitingNumber     int64    `gorm:"column:waiting_number;default:0"`                       // 待发货
-	DeliveredNumber   int64    `gorm:"column:delivered_number;default:0"`                     // 已发货
-	SignedNumber      int64    `gorm:"column:signed_number;default:0"`                        // 已签收
-	MaxOffer          int64    `gorm:"column:max_offer;default:0"`                            // 报价上限
-	MinOffer          int64    `gorm:"column:min_offer;default:0"`                            // 报价下限
-	FanNumber         int64    `gorm:"column:fan_number;default:0"`                           // 总粉丝量
-	PlayNumber        int64    `gorm:"column:play_number;default:0"`                          // 总播放量
-	LikeNumber        int64    `gorm:"column:like_number;default:0"`                          // 总点赞数
-	CollectNumber     int64    `gorm:"column:collect_number;default:0"`                       // 总收藏量
-	CommentNumber     int64    `gorm:"column:comment_number;default:0"`                       // 总评论数
-	FinishNumber      int64    `gorm:"column:finish_number;default:0"`                        // 结案数量
-	TotalOffer        float64    `gorm:"column:total_offer;default:0"`                          // 支付合计
+	ProjectID         string  `gorm:"column:project_id"`                                     // 所属项目id
+	ServiceCharge     float64 `gorm:"column:service_charge"`                                 // 平台服务费,稿费形式为产品置换时必填
+	SelectedNumber    int64   `gorm:"column:selected_number;default:0"`                      // 已选数量,被企业选择的达人数量
+	WaitingNumber     int64   `gorm:"column:waiting_number;default:0"`                       // 待发货
+	DeliveredNumber   int64   `gorm:"column:delivered_number;default:0"`                     // 已发货
+	SignedNumber      int64   `gorm:"column:signed_number;default:0"`                        // 已签收
+	MaxOffer          int64   `gorm:"column:max_offer;default:0"`                            // 报价上限
+	MinOffer          int64   `gorm:"column:min_offer;default:0"`                            // 报价下限
+	FanNumber         int64   `gorm:"column:fan_number;default:0"`                           // 总粉丝量
+	PlayNumber        int64   `gorm:"column:play_number;default:0"`                          // 总播放量
+	LikeNumber        int64   `gorm:"column:like_number;default:0"`                          // 总点赞数
+	CollectNumber     int64   `gorm:"column:collect_number;default:0"`                       // 总收藏量
+	CommentNumber     int64   `gorm:"column:comment_number;default:0"`                       // 总评论数
+	FinishNumber      int64   `gorm:"column:finish_number;default:0"`                        // 结案数量
+	TotalOffer        float64 `gorm:"column:total_offer;default:0"`                          // 支付合计
 }
 
 func (m *RecruitStrategy) TableName() string {
 	return "recruit_strategy"
 }
-

+ 27 - 0
model/gorm_model/s_project.go

@@ -0,0 +1,27 @@
+package gorm_model
+
+// 服务商加入商单的种草任务
+type YounggeeSProjectInfo struct {
+	SProjectId          int     `gorm:"column:s_project_id;type:int(11);primary_key;AUTO_INCREMENT;comment:服务商种草任务ID" json:"s_project_id"`
+	ProjectId           string  `gorm:"column:project_id;type:varchar(255);comment:被服务商加入商单的原种草任务ID" json:"project_id"`
+	ProjectStatus       int     `gorm:"column:project_status;type:tinyint(4);comment:项目状态,1-10分别代表创建中、待审核、审核通过、招募中、招募完毕、待支付、已支付、失效、执行中、已结案" json:"project_status"`
+	ProjectType         int     `gorm:"column:project_type;type:tinyint(4);comment:种草任务类型,1为公开,2为定向" json:"project_type"`
+	ProjectName         string  `gorm:"column:project_name;type:varchar(50);comment:种草任务名称" json:"project_name"`
+	ProjectPlatform     int     `gorm:"column:project_platform;type:tinyint(4);comment:种草任务平台,1-7分别代表小红书、抖音、微博、快手、b站、大众点评、知乎" json:"project_platform"`
+	ProjectForm         int     `gorm:"column:project_form;type:tinyint(4);comment:任务形式,1-3分别代表商品寄拍、素材分发、虚拟产品测评" json:"project_form"`
+	ContentType         int     `gorm:"column:content_type;type:tinyint(4);comment:内容形式,1代表图文,2代表视频" json:"content_type"`
+	ShareCode           string  `gorm:"column:share_code;type:varchar(255);comment:分享码URL" json:"share_code"`
+	SupplierId          int     `gorm:"column:supplier_id;type:int(11);comment:服务商ID" json:"supplier_id"`
+	EnterpriseId        string  `gorm:"column:enterprise_id;type:varchar(255);comment:所属企业id" json:"enterprise_id"`
+	ApplyNum            int     `gorm:"column:apply_num;type:int(11);default:0;comment:报名人数;NOT NULL" json:"apply_num"`
+	RecruitNum          int     `gorm:"column:recruit_num;type:int(11);default:0;comment:已招募人数;NOT NULL" json:"recruit_num"`
+	SettleNum           int     `gorm:"column:settle_num;type:int(11);default:0;comment:已结算人数" json:"settle_num"`
+	SubAccountId        int     `gorm:"column:sub_account_id;type:int(11);default:0;comment:服务商子账号ID" json:"sub_account_id"`
+	ServiceCharge       float64 `gorm:"column:service_charge;type:decimal(10,2);default:0.00;comment:服务商预估可赚服务费" json:"service_charge"`
+	ServiceChargeActual float64 `gorm:"column:service_charge_actual;type:decimal(10,2);default:0.00;comment:服务商实际可赚服务费" json:"service_charge_actual"`
+	OperatorType        int     `gorm:"column:operator_type;type:int(11);default:0;comment:添加商单操作人类型,1为服务商主账号,2为服务商子账号" json:"operator_type"`
+}
+
+func (m *YounggeeSProjectInfo) TableName() string {
+	return "younggee_s_project_info"
+}

+ 2 - 5
model/gorm_model/sketch.go

@@ -1,14 +1,12 @@
 package gorm_model
 
-// Code generated by sql2gorm. DO NOT EDIT.
-
 import (
-"time"
+	"time"
 )
 
 type YounggeeSketchInfo struct {
 	SketchID          int       `gorm:"column:sketch_id;primary_key;AUTO_INCREMENT"` // 初稿id
-	TaskID            string       `gorm:"column:task_id;NOT NULL"`                     // 任务id
+	TaskID            string    `gorm:"column:task_id;NOT NULL"`                     // 任务id
 	Title             string    `gorm:"column:title"`                                // 标题
 	Type              int       `gorm:"column:type"`                                 // 初稿形式,1为图片,2为视频
 	Content           string    `gorm:"column:content"`                              // 正文
@@ -28,4 +26,3 @@ type YounggeeSketchInfo struct {
 func (m *YounggeeSketchInfo) TableName() string {
 	return "younggee_sketch_info"
 }
-

+ 20 - 0
model/gorm_model/supplier.go

@@ -0,0 +1,20 @@
+package gorm_model
+
+type Supplier struct {
+	SupplierID      int    `gorm:"column:supplier_id"`      // 服务商ID
+	SupplierName    string `gorm:"column:supplier_name"`    // 服务商名称
+	PhoneNumber     string `gorm:"column:phone_number"`     // 手机号
+	BusinessLicense string `gorm:"column:business_license"` // 营业执照url
+	USCI            string `gorm:"column:usci"`             // 统一社会信用代码
+	CompanyName     string `gorm:"column:company_name"`     // 公司名称
+	IDFront         string `gorm:"column:id_front"`         // 身份证人像面url
+	IDBack          string `gorm:"column:id_back"`          // 身份证国徽面url
+	IDNumber        string `gorm:"column:id_number"`        // 身份证号
+	Name            string `gorm:"column:name"`             // 姓名
+	UserID          int    `gorm:"column:user_id"`          // 用户表中的用户ID
+	SupplierType    int    `gorm:"column:supplier_type"`    // 服务商用户类型,1为个人PR,2为机构
+}
+
+func (Supplier) TableName() string {
+	return "younggee_supplier"
+}

+ 27 - 24
model/gorm_model/talent.go

@@ -6,30 +6,33 @@ import (
 )
 
 type YoungeeTalentInfo struct {
-	ID                string    `gorm:"column:id;primary_key"`               // 达人id
-	TalentWxOpenid    string    `gorm:"column:talent_wx_openid;NOT NULL"`    // 达人的微信openid
-	TalentWxNickname  string    `gorm:"column:talent_wx_nickname"`           // 达人的微信昵称
-	TalentWxNumber    string    `gorm:"column:talent_wx_number"`             // 达人微信号
-	Income            int64     `gorm:"column:income;default:0"`             // 收益总数
-	Withdrawing       int64     `gorm:"column:withdrawing;default:0"`        // 提现中金额
-	Canwithdraw       int64     `gorm:"column:canwithdraw;default:0"`        // 可提现金额
-	Withdrawed        int64     `gorm:"column:withdrawed;default:0"`         // 已提现金额
-	TalentGender      int       `gorm:"column:talent_gender"`                // 性别,0未知 1男 2女
-	TalentPhoneNumber string    `gorm:"column:talent_phone_number"`          // 电话号码
-	TalentAgeBracket  int       `gorm:"column:talent_age_bracket"`           // 年龄段,取tallent_age_bracket表id
-	TalentNationality int       `gorm:"column:talent_nationality"`           // 国籍,取tallent_nationality表id
-	VisitStoreRegion  int       `gorm:"column:visit_store_region"`           // 探店区域,取region_info表中的self_code
-	IsBindInfo        uint      `gorm:"column:is_bind_info;default:0"`       // 是否填写个人资料
-	IsBindLocation    uint      `gorm:"column:is_bind_location;default:0"`   // 是否绑定收货地址
-	IsBindBank        uint      `gorm:"column:is_bind_bank;default:0"`       // 是否绑定银行账户信息
-	InBlacklist       uint      `gorm:"column:in_blacklist;default:0"`       // 是否加入黑名单 0否 1是
-	TaskAll           int       `gorm:"column:task_all;default:0"`           // 任务总数
-	TaskApply         int       `gorm:"column:task_apply;default:0"`         // 报名任务数量
-	TaskExecute       int       `gorm:"column:task_execute;default:0"`       // 执行中任务数量
-	TaskEnd           int       `gorm:"column:task_end;default:0"`           // 结束任务数量
-	CreateDate        time.Time `gorm:"column:create_date;NOT NULL"`         // 创建时间
-	LastLoginDate     time.Time `gorm:"column:last_login_date;NOT NULL"`     // 最后登录时间
-	ApplyNum          int       `gorm:"column:apply_num;default:5;NOT NULL"` // 剩余申请次数(每天更新)
+	ID                string    `gorm:"column:id;primary_key;type:char(25)"`                                 // 达人id
+	TalentWxOpenid    string    `gorm:"column:talent_wx_openid;NOT NULL;type:char(128)"`                     // 达人的微信openid
+	Avatar            string    `gorm:"column:avatar;type:varchar(1000);NOT NULL"`                           // 头像
+	TalentWxNickname  string    `gorm:"column:talent_wx_nickname;type:varchar(30);DEFAULT NULL"`             // 达人的微信昵称
+	Income            float64   `gorm:"column:income;type:decimal(10,2);DEFAULT NULL"`                       // 收益总数
+	Withdrawing       float64   `gorm:"column:withdrawing;type:decimal(10,2);DEFAULT NULL"`                  // 提现中金额
+	Canwithdraw       float64   `gorm:"column:canwithdraw;type:decimal(10,2);DEFAULT NULL"`                  // 可提现金额
+	Withdrawed        float64   `gorm:"column:withdrawed;type:decimal(10,2);DEFAULT NULL"`                   // 已提现金额
+	Point             int       `gorm:"column:point;type:int;DEFAULT NULL"`                                  // 可用积分
+	TalentPhoneNumber string    `gorm:"column:talent_phone_number;type:char(20);DEFAULT NULL"`               // 电话号码
+	TalentAgeBracket  int8      `gorm:"column:talent_age_bracket;type:tinyint(1);DEFAULT NULL"`              // 年龄段
+	TalentNationality int8      `gorm:"column:talent_nationality;type:tinyint(1);DEFAULT NULL"`              // 国籍
+	VisitStoreRegion  int       `gorm:"column:visit_store_region;type:int;DEFAULT NULL"`                     // 探店区域
+	IsBindInfo        uint8     `gorm:"column:is_bind_info;type:tinyint(1);DEFAULT 0"`                       // 是否填写个人资料
+	IsBindAccount     uint8     `gorm:"column:is_bind_account;type:tinyint(1);DEFAULT 0"`                    // 是否绑定账号
+	IsBindLocation    uint8     `gorm:"column:is_bind_location;type:tinyint(1);DEFAULT 0"`                   // 是否绑定收货地址
+	IsBindBank        uint8     `gorm:"column:is_bind_bank;type:tinyint(1);DEFAULT 0"`                       // 是否绑定银行账户信息
+	InBlacklist       uint8     `gorm:"column:in_blacklist;type:tinyint(1);DEFAULT 0"`                       // 是否加入黑名单
+	TaskAll           int       `gorm:"column:task_all;type:int;DEFAULT 0"`                                  // 任务总数
+	TaskApply         int       `gorm:"column:task_apply;type:int;DEFAULT 0"`                                // 报名任务数量
+	TaskExecute       int       `gorm:"column:task_execute;type:int;DEFAULT 0"`                              // 执行中任务数量
+	TaskEnd           int       `gorm:"column:task_end;type:int;DEFAULT 0"`                                  // 结束任务数量
+	CreateDate        time.Time `gorm:"column:create_date;type:datetime;NOT NULL;DEFAULT CURRENT_TIMESTAMP"` // 创建时间
+	LastLoginDate     time.Time `gorm:"column:last_login_date;type:datetime;NOT NULL"`                       // 最后登录时间
+	ApplyNum          int       `gorm:"column:apply_num;type:int;NOT NULL;DEFAULT 5"`                        // 剩余申请次数
+	UserType          uint8     `gorm:"column:user_type;type:tinyint;DEFAULT 1"`                             // 用户类型
+	Sex               int8      `gorm:"column:sex;type:tinyint(1);DEFAULT NULL"`                             // 性别
 }
 
 func (m *YoungeeTalentInfo) TableName() string {

+ 14 - 0
model/http_model/EndTaskRequest.go

@@ -0,0 +1,14 @@
+package http_model
+
+type EndTaskRequest struct {
+	TaskId []int `json:"task_ids"`
+}
+
+func NewEndTaskRequest() *EndTaskRequest {
+	return new(EndTaskRequest)
+}
+
+func NewEndTaskResponse() *CommonResponse {
+	resp := new(CommonResponse)
+	return resp
+}

+ 21 - 0
model/http_model/PassproTaskCoopRequest.go

@@ -0,0 +1,21 @@
+package http_model
+
+type PassproTaskCoopRequest struct {
+	ProjectId   string   `json:"project_id"`
+	TaskIds     []string `json:"task_ids"`
+	OperatorId  string   `json:"operator_id"`
+	OperateType int      `json:"operate_type"`
+}
+
+type PassproTaskCoopData struct {
+}
+
+func NewPassproTaskCoopRequest() *PassproTaskCoopRequest {
+	return new(PassproTaskCoopRequest)
+}
+
+func NewPassproTaskCoopResponse() *CommonResponse {
+	resp := new(CommonResponse)
+	resp.Data = new(PassproTaskCoopData)
+	return resp
+}

+ 30 - 0
model/http_model/PreLinkList.go

@@ -0,0 +1,30 @@
+package http_model
+
+import "time"
+
+type PreLinkListRequest struct {
+	PageSize   int    `json:"page_size"`
+	PageNum    int    `json:"page_num"`
+	ProjectId  string `json:"project_id"`  // 项目ID
+	LinkStatus string `json:"link_status"` // 链接状态,11待传链接
+}
+
+type GetprelinkListData struct {
+	TasklinkList []*Tasklinkinfo `json:"task_list"`
+	Total        string          `json:"total"`
+}
+
+type Tasklinkinfo struct {
+	Task *TaskInfo `json:"task_info"`
+	DDl  time.Time `json:"ddl"` // 提交时间
+}
+
+func NewPreLinkListRequest() *PreLinkListRequest {
+	return new(PreLinkListRequest)
+}
+
+func NewPreLinkListResponse() *CommonResponse {
+	resp := new(CommonResponse)
+	resp.Data = new(GetSketchTaskListData)
+	return resp
+}

+ 20 - 0
model/http_model/RefuseproTaskCoopRequest.go

@@ -0,0 +1,20 @@
+package http_model
+
+type RefuseproTaskCoopRequest struct {
+	TaskIds     []string `json:"task_ids"`
+	OperatorId  string   `json:"operator_id"`
+	OperateType int      `json:"operate_type"`
+}
+
+type RefuseproTaskCoopData struct {
+}
+
+func NewRefuseproTaskCoopRequest() *RefuseproTaskCoopRequest {
+	return new(RefuseproTaskCoopRequest)
+}
+
+func NewRefuseproTaskCoopResponse() *CommonResponse {
+	resp := new(CommonResponse)
+	resp.Data = new(RefuseproTaskCoopData)
+	return resp
+}

+ 4 - 4
model/http_model/data_accept.go

@@ -1,10 +1,10 @@
 package http_model
 
 type AcceptDataRequest struct {
-	Payment   float64 `json:"payment"`      //招募策略id
-	TaskIds   string  `json:"task_id_list"` //任务id列表
-	ProjectId string  `json:"project_id"`   //项目id
-	IsSpecial int     `json:"is_special"`   // 是否为专项项目
+	//Payment   float64 `json:"payment"`      //招募策略id
+	TaskIds   string `json:"task_id_list"` //任务id列表
+	ProjectId string `json:"project_id"`   //项目id
+	IsSpecial int    `json:"is_special"`   // 是否为专项项目
 }
 
 type AcceptDataData struct {

+ 39 - 0
model/http_model/executedata.go

@@ -0,0 +1,39 @@
+package http_model
+
+import "time"
+
+type ExecuteDataRequest struct {
+	ProjectId string `json:"project_id"`
+}
+
+type ExecuteDataResponse struct {
+	Excutetime      time.Time     `json:"recruit_time"`
+	PreSketchNum    int64         `json:"presketch_num"`
+	SketchNum       int64         `json:"sketch_num"`
+	SketchAccNum    int64         `json:"sketch_accept_num"`
+	AvgAccTime      time.Duration `json:"avg_acc_time"`
+	AvgCreTime      time.Duration `json:"avg_cre_time"`
+	FirAccRatio     float64       `json:"fir_acc_ratio"`
+	PreLinkNum      int64         `json:"pre_link_num"`
+	LinkNum         int64         `json:"link_num"`
+	LinkAccNum      int64         `json:"link_accept_num"`
+	AvgLinkAccTime  time.Duration `json:"avg_link_acc_time"`
+	AvgBackTime     time.Duration `json:"avg_back_time"`
+	FirAccLinkRatio float64       `json:"fir_acc_link_ratio"`
+	PreDataNum      int64         `json:"pre_data_num"`
+	DataNum         int64         `json:"data_num"`
+	DefaultNum      int64         `json:"default_num"`
+	DefaultRatio    float64       `json:"default_ratio"`
+	DraftFee        float64       `json:"draft_fee"`
+	Settle_Amount   float64       `json:"settle_amount"`
+}
+
+func NewExecuteDataRequest() *ExecuteDataRequest {
+	return new(ExecuteDataRequest)
+}
+
+func NewExecuteDataResponse() *CommonResponse {
+	resp := new(CommonResponse)
+	resp.Data = new(ExecuteDataResponse)
+	return resp
+}

+ 45 - 0
model/http_model/gettasklist.go

@@ -0,0 +1,45 @@
+package http_model
+
+import "time"
+
+type GetTaskListRequest struct {
+	PageSize  int    `json:"page_size"`
+	PageNum   int    `json:"page_num"`
+	FeeFrom   *int   `json:"fee_from,omitempty"`
+	Type      *int   `json:"type,omitempty"` // 查询类型,1、2分别表示达人来源于公海(商家端),服务商
+	ProjectId string `json:"project_id"`
+	CoopType  int    `json:"coop_type"` //1未处理,2同意,3拒绝
+}
+
+type GetTaskListData struct {
+	TaskList []*TaskInfo `json:"task_list"`
+	Total    string      `json:"total"`
+}
+
+type TaskInfo struct {
+	TaskId             string    `json:"task_id"`
+	ProjectId          string    `json:"project_id"`
+	TalentId           string    `json:"talent_id"`
+	FansNum            int       `json:"fans_num"`
+	DraftFee           float64   `json:"draft_fee"`
+	FeeFrom            int       `json:"fee_from"`
+	TaskStage          int       `json:"task_stage"`
+	Voteavg            int       `json:"vote_avg"`
+	Commentavg         int       `json:"commit_avg"`
+	CurrentDefaultType int       `json:"current_default_type"`
+	From               int       `json:"from"`   //1公海,2服务商
+	SType              int       `json:"s_type"` //1个人,2机构
+	Boperator          string    `json:"b_operator"`
+	SettleAmount       float64   `json:"settle_amount"`
+	CreateAt           time.Time `json:"create_time"`
+}
+
+func NewGetTaskListRequest() *GetTaskListRequest {
+	return new(GetTaskListRequest)
+}
+
+func NewGetTaskListResponse() *CommonResponse {
+	resp := new(CommonResponse)
+	resp.Data = new(GetTaskListData)
+	return resp
+}

+ 0 - 1
model/http_model/link_opinion.go

@@ -1,7 +1,6 @@
 package http_model
 
 type LinkOpinionRequest struct {
-	StrategyID  int64  `json:"strategy_id"`  //招募策略id
 	TaskID      string `json:"task_id"`      //任务-id
 	LinkOpinion string `json:"Link_opinion"` //链接审核意见
 }

+ 30 - 0
model/http_model/predatalist.go

@@ -0,0 +1,30 @@
+package http_model
+
+import "time"
+
+type PreDataListRequest struct {
+	PageSize   int    `json:"page_size"`
+	PageNum    int    `json:"page_num"`
+	ProjectId  string `json:"project_id"`  // 项目ID
+	DataStatus string `json:"data_status"` // 数据状态,13待传数据
+}
+
+type GetPreDataListData struct {
+	TaskdataList []*Taskdatainfo `json:"task_list"`
+	Total        string          `json:"total"`
+}
+
+type Taskdatainfo struct {
+	Task *TaskInfo `json:"task_info"`
+	DDl  time.Time `json:"ddl"` // 截止时间
+}
+
+func NewPreDataListRequest() *PreDataListRequest {
+	return new(PreDataListRequest)
+}
+
+func NewPreDataListResponse() *CommonResponse {
+	resp := new(CommonResponse)
+	resp.Data = new(GetSketchTaskListData)
+	return resp
+}

+ 30 - 0
model/http_model/presketchlist.go

@@ -0,0 +1,30 @@
+package http_model
+
+import "time"
+
+type PreSketchListRequest struct {
+	PageSize     int    `json:"page_size"`
+	PageNum      int    `json:"page_num"`
+	ProjectId    string `json:"project_id"`    // 项目ID
+	ScriptStatus int    `json:"script_status"` // 稿件状态,10初稿待审
+}
+
+type GetSketchTaskListData struct {
+	TasksketchList []*TasksketchInfo `json:"task_list"`
+	Total          string            `json:"total"`
+}
+
+type TasksketchInfo struct {
+	Task *TaskInfo `json:"task_info"`
+	DDl  time.Time `json:"ddl"`
+}
+
+func NewPreSketchListRequest() *PreSketchListRequest {
+	return new(PreSketchListRequest)
+}
+
+func NewPreSketchListResponse() *CommonResponse {
+	resp := new(CommonResponse)
+	resp.Data = new(GetSketchTaskListData)
+	return resp
+}

+ 18 - 0
model/http_model/project_data_request.go

@@ -0,0 +1,18 @@
+package http_model
+
+type DataRequest struct {
+	ProjectId string `json:"project_id"`
+}
+
+type ProjectdataResponse struct {
+}
+
+func NewDataRequest() *DataRequest {
+	return new(DataRequest)
+}
+
+func NewDataResponse() *CommonResponse {
+	resp := new(CommonResponse)
+	resp.Data = new(ProjectdataResponse)
+	return resp
+}

+ 31 - 0
model/http_model/projectdatarequest.go

@@ -0,0 +1,31 @@
+package http_model
+
+import "time"
+
+type ProjectDataRequest struct {
+	ProjectId string `json:"project_id"`
+}
+
+type ProjectDataResponse struct {
+	RecruitDDl  time.Time      `json:"recruit_ddl"`
+	Recruittime time.Time      `json:"recruit_time"`
+	ApplyNum    int64          `json:"apply_num"`
+	AgreeNum    int64          `json:"agree_num"`
+	DraftFee    float64        `json:"draft_fee"`
+	AvgFansNum  int            `json:"avg_fans_num"`
+	FromType    float64        `json:"from_type"`
+	ManRatio    float64        `json:"man_ratio"`
+	FeeMap      map[int]int    `json:"fee_map"`
+	FansMap     map[int64]int  `json:"fans_map"`
+	DateStats   map[string]int `json:"date_stats"`
+}
+
+func NewProjectDataRequest() *ProjectDataRequest {
+	return new(ProjectDataRequest)
+}
+
+func NewProjectDataResponse() *CommonResponse {
+	resp := new(CommonResponse)
+	resp.Data = new(ProjectDataResponse)
+	return resp
+}

+ 18 - 0
model/http_model/reject_data.go

@@ -0,0 +1,18 @@
+package http_model
+
+type RejectDataRequest struct {
+	TaskIds string `json:"task_id_list"` //任务id列表
+}
+
+type RejectDataData struct {
+	TaskIds []string `json:"task_id_list"` //任务id列表
+}
+
+func NewRejectDataRequest() *RejectDataRequest {
+	return new(RejectDataRequest)
+}
+func NewRejectDataResponse() *CommonResponse {
+	resp := new(CommonResponse)
+	resp.Data = new(RejectDataData)
+	return resp
+}

+ 18 - 0
model/http_model/reject_link.go

@@ -0,0 +1,18 @@
+package http_model
+
+type RejectLinkRequest struct {
+	TaskIds string `json:"task_id_list"` //任务id列表
+}
+
+type RejectLinkData struct {
+	TaskIds []string `json:"task_id_list"` //任务id列表
+}
+
+func NewRejectLinkRequest() *RejectLinkRequest {
+	return new(RejectLinkRequest)
+}
+func NewRejectLinkResponse() *CommonResponse {
+	resp := new(CommonResponse)
+	resp.Data = new(RejectLinkData)
+	return resp
+}

+ 0 - 1
model/http_model/sketch_opinion.go

@@ -1,7 +1,6 @@
 package http_model
 
 type SketchOpinionRequest struct {
-	StrategyID    int64  `json:"strategy_id"`    //招募策略id
 	TaskID        string `json:"task_id"`        //任务-id
 	SketchOpinion string `json:"sketch_opinion"` //初稿意见
 }

+ 18 - 0
model/http_model/sketch_reject.go

@@ -0,0 +1,18 @@
+package http_model
+
+type RejectSketchRequest struct {
+	TaskIds string `json:"task_id_list"` //任务id列表
+}
+
+type RejectSketchData struct {
+	TaskIds []string `json:"task_id_list"` //任务id列表
+}
+
+func NewRejectSketchRequest() *RejectSketchRequest {
+	return new(RejectSketchRequest)
+}
+func NewRejectSketchResponse() *CommonResponse {
+	resp := new(CommonResponse)
+	resp.Data = new(RejectSketchData)
+	return resp
+}

+ 8 - 3
model/http_model/sktech_info.go

@@ -1,5 +1,7 @@
 package http_model
 
+import "time"
+
 type GetSketchInfoRequest struct {
 	TaskID string `json:"task_id"`
 }
@@ -11,9 +13,12 @@ type SketchPhotoInfo struct {
 }
 
 type GetSketchInfoData struct {
-	SketchPhotos []SketchPhotoInfo `json:"sketch_photos"` //初稿图片以及视频
-	Title        string            `json:"title"`
-	Content      string            `json:"content"`
+	SketchPhotos   []SketchPhotoInfo `json:"sketch_photos"` //初稿图片以及视频
+	Title          string            `json:"title"`
+	Content        string            `json:"content"`
+	Agreeat        time.Time         `json:"agree_at"`
+	Submitat       time.Time         `json:"submit_at"`
+	ReverseOpinion string            `json:"reverse_opinion"`
 }
 
 func NewGetSketchInfoRequest() *GetSketchInfoRequest {

+ 37 - 0
model/http_model/taskdatalist.go

@@ -0,0 +1,37 @@
+package http_model
+
+import "time"
+
+type TaskDatalistRequest struct {
+	PageSize   int    `json:"page_size"`
+	PageNum    int    `json:"page_num"`
+	ProjectId  string `json:"project_id"`  // 项目ID
+	DataStatus string `json:"data_status"` // 链接状态,14
+}
+
+type GetTaskDatalistData struct {
+	TaskDatalist []*TaskDatainfo `json:"task_list"`
+	Total        string          `json:"total"`
+}
+
+type TaskDatainfo struct {
+	Task          *TaskInfo `json:"task_info"`
+	SubmitAt      time.Time `json:"submit_at"` // 提交时间
+	AgreeAt       time.Time `json:"agree_at"`
+	DataId        int       `json:"data_id"` //初稿ID
+	PhotoUrl      string    `json:"photo_url"`
+	PlayNumber    int       `json:"play_number"`
+	LikeNumber    int       `json:"like_number"`
+	CommentNumber int       `json:"comment_number"`
+	CollectNumber int       `json:"collect_number"`
+}
+
+func NewTaskDatalistRequest() *TaskDatalistRequest {
+	return new(TaskDatalistRequest)
+}
+
+func NewTaskDatalistResponse() *CommonResponse {
+	resp := new(CommonResponse)
+	resp.Data = new(GetSketchTaskListData)
+	return resp
+}

+ 34 - 0
model/http_model/tasklinklist.go

@@ -0,0 +1,34 @@
+package http_model
+
+import "time"
+
+type TaskLinklistRequest struct {
+	PageSize   int    `json:"page_size"`
+	PageNum    int    `json:"page_num"`
+	ProjectId  string `json:"project_id"`  // 项目ID
+	LinkStatus string `json:"link_status"` // 链接状态,12待审
+}
+
+type GettasklinkListData struct {
+	TaskLinklist []*TaskLinkinfo `json:"task_list"`
+	Total        string          `json:"total"`
+}
+
+type TaskLinkinfo struct {
+	Task     *TaskInfo `json:"task_info"`
+	SubmitAt time.Time `json:"submit_at"` // 提交时间
+	AgreeAt  time.Time `json:"agree_at"`
+	LinkId   int       `json:"link_id"` //初稿ID
+	LinkUrl  string    `json:"link_url"`
+	PhotoUrl string    `json:"photo_url"`
+}
+
+func NewTaskLinklistRequest() *TaskLinklistRequest {
+	return new(TaskLinklistRequest)
+}
+
+func NewTaskLinklistResponse() *CommonResponse {
+	resp := new(CommonResponse)
+	resp.Data = new(GetSketchTaskListData)
+	return resp
+}

+ 32 - 0
model/http_model/tasksketchlist.go

@@ -0,0 +1,32 @@
+package http_model
+
+import "time"
+
+type TasksketchlistRequest struct {
+	PageSize     int    `json:"page_size"`
+	PageNum      int    `json:"page_num"`
+	ProjectId    string `json:"project_id"`    // 项目ID
+	ScriptStatus int    `json:"script_status"` // 稿件状态
+}
+
+type GetsketchtaskListData struct {
+	TasksketchList []*Tasksketchinfo `json:"task_list"`
+	Total          string            `json:"total"`
+}
+
+type Tasksketchinfo struct {
+	Task     *TaskInfo `json:"task_info"`
+	SubmitAt time.Time `json:"submit_at"` // 提交时间
+	AgreeAt  time.Time `json:"agree_at"`
+	SketchId int       `json:"sketch_id"` //初稿ID
+}
+
+func NewTasksketchlistRequest() *TasksketchlistRequest {
+	return new(TasksketchlistRequest)
+}
+
+func NewTasksketchlistResponse() *CommonResponse {
+	resp := new(CommonResponse)
+	resp.Data = new(GetSketchTaskListData)
+	return resp
+}

+ 66 - 43
route/init.go

@@ -38,7 +38,7 @@ func InitRoute(r *gin.Engine) {
 	//	c.JSON(200, resp)
 	//	// 注意这里只是debug用的 接口要写成handler形式
 	//})
-	m := r.Group("/youngee/m")
+	m := r.Group("/youngee/b")
 	{
 		m.Use(middleware.LoginAuthMiddleware)
 		m.POST("/test", func(c *gin.Context) {
@@ -47,38 +47,32 @@ func InitRoute(r *gin.Engine) {
 			auth := middleware.GetSessionAuth(c)
 			logrus.Infof("auth:%+v", auth)
 		})
-		m.POST("/product/findKuaishou", handler.WrapFindKuaishouProductHandler)              // 查询快手产品信息
-		m.POST("/product/findall", handler.WrapFindAllProductHandler)                        // 查询全部产品
-		m.POST("/product/find", handler.WrapFindProductHandler)                              // 查找单个产品
-		m.POST("/project/create", handler.WrapCreateProjectHandler)                          // 创建项目
-		m.POST("/project/show", handler.WrapShowProjectHandler)                              // 展示项目内容
-		m.POST("/project/update", handler.WrapUpdateProjectHandler)                          // 更新项目
-		m.POST("/project/delete", handler.WrapDeleteProjectHandler)                          // 删除项目
-		m.POST("/product/create", handler.WrapCreateProductHandler)                          // 创建项目
-		m.POST("/project/list", handler.WrapFullProjectListHandler)                          // 项目列表
-		m.POST("/project/taskList", handler.WrapProjectTaskListHandler)                      // 任务列表
-		m.POST("/project/draftlist", handler.WrapProjectDraftBoxListHandler)                 // 草稿箱查询
-		m.GET("/project/getCreatingNumber", handler.WrapGetCreatingNumberHandler)            // 查询创建中项目数量
-		m.POST("/project/changeTaskStatus", handler.WrapProjectChangeTaskStatusHandler)      // 改变任务的状态
-		m.POST("/pay/paysum", handler.WrapPaySumHandler)                                     // 支付总额
-		m.POST("/pay/projectpay", handler.WrapProjectPayHandler)                             // 支付
-		m.POST("/enterprise/balance", handler.WrapEnterpriseBalanceHandler)                  // 样叽页面各种余额
-		m.POST("/project/tasklogisticslist", handler.WrapTaskLogisticsListHandler)           // 物流信息查询
-		m.POST("/project/createlogistics", handler.WrapCreateLogisticsHandler)               // 创建物流信息
-		m.POST("/project/signforreceipt", handler.WrapSignForReceiptHandler)                 // 签收
-		m.POST("/project/taskscriptlist", handler.WrapTaskScriptListHandler)                 // 查询脚本列表
-		m.POST("/project/scriptopinion", handler.WrapScriptOpinionHandler)                   // 脚本审核意见提交
-		m.POST("/project/acceptscript", handler.WrapAcceptScriptHandler)                     // 同意脚本
-		m.POST("/project/tasksketchlist", handler.WrapTaskSketchListHandler)                 // 查询初稿列表
-		m.POST("/project/findsketchphoto", handler.WrapFindSketchPhotoHandler)               // 查询脚本配图和视频demo
-		m.POST("/project/sketchopinion", handler.WrapSketchOpinionHandler)                   // 初稿审核意见提交
-		m.POST("/project/acceptsketch", handler.WrapAcceptSketchHandler)                     // 同意脚本
-		m.POST("/project/tasklinklist", handler.WrapTaskLinkListHandler)                     // 查询链接列表
-		m.POST("/project/linkopinion", handler.WrapLinkOpinionHandler)                       // 链接审核意见提交
-		m.POST("/project/acceptlink", handler.WrapAcceptLinkHandler)                         // 同意链接
-		m.POST("/project/taskdatalist", handler.WrapTaskDataListHandler)                     // 查询数据列表
-		m.POST("/project/dataopinion", handler.WrapDataOpinionHandler)                       // 数据审核意见提交
-		m.POST("/project/acceptdata", handler.WrapAcceptDataHandler)                         // 同意数据
+		m.POST("/product/findall", handler.WrapFindAllProductHandler)                   //查询全部产品
+		m.POST("/product/find", handler.WrapFindProductHandler)                         // 查找单个产品
+		m.POST("/project/create", handler.WrapCreateProjectHandler)                     // 创建项目
+		m.POST("/project/show", handler.WrapShowProjectHandler)                         // 展示项目内容
+		m.POST("/project/update", handler.WrapUpdateProjectHandler)                     // 更新项目
+		m.POST("/project/delete", handler.WrapDeleteProjectHandler)                     // 删除项目
+		m.POST("/product/create", handler.WrapCreateProductHandler)                     // 创建项目
+		m.POST("/project/list", handler.WrapFullProjectListHandler)                     // 项目列表
+		m.POST("/project/taskList", handler.WrapProjectTaskListHandler)                 // 任务列表
+		m.POST("/project/draftlist", handler.WrapProjectDraftBoxListHandler)            // 草稿箱查询
+		m.GET("/project/getCreatingNumber", handler.WrapGetCreatingNumberHandler)       // 查询创建中项目数量
+		m.POST("/project/changeTaskStatus", handler.WrapProjectChangeTaskStatusHandler) // 改变任务的状态
+		m.POST("/pay/paysum", handler.WrapPaySumHandler)                                // 支付总额
+		m.POST("/pay/projectpay", handler.WrapProjectPayHandler)                        // 支付
+		m.POST("/enterprise/balance", handler.WrapEnterpriseBalanceHandler)             // 样叽页面各种余额
+		m.POST("/project/tasklogisticslist", handler.WrapTaskLogisticsListHandler)      // 物流信息查询
+		m.POST("/project/createlogistics", handler.WrapCreateLogisticsHandler)          // 创建物流信息
+		m.POST("/project/signforreceipt", handler.WrapSignForReceiptHandler)            // 签收
+		m.POST("/project/taskscriptlist", handler.WrapTaskScriptListHandler)            // 查询脚本列表
+		m.POST("/project/scriptopinion", handler.WrapScriptOpinionHandler)              // 脚本审核意见提交
+		m.POST("/project/acceptscript", handler.WrapAcceptScriptHandler)                // 同意脚本
+		//m.POST("/project/tasksketchlist", handler.WrapTaskSketchListHandler)                 // 查询初稿列表
+
+		//m.POST("/project/tasklinklist", handler.WrapTaskLinkListHandler)                     // 查询链接列表
+		//m.POST("/project/taskdatalist", handler.WrapTaskDataListHandler)                     // 查询数据列表
+
 		m.POST("/pay/getCodeUrl", handler.WrapGetCodeUrlHandler)                             // 获取微信支付codeURL
 		m.POST("/pay/queryOrderByTradeId", handler.WrapQueryOrderByTradeIdHandler)           // 根据交易id查询微信是否扫码付款
 		m.POST("/pay/rechargeBalance", handler.WrapRechargeBalanceHandler)                   // 支付成功后修改企业余额
@@ -102,15 +96,15 @@ func InitRoute(r *gin.Engine) {
 		m.POST("/project/taskteminatinglist", handler.WrapTaskTerminatingListHandler)        // 查询违约列表-解约待处理
 		m.POST("/project/taskteminatedlist", handler.WrapTaskTerminatedListHandler)          // 查询违约列表-解约
 		m.POST("/project/taskteminate", handler.WrapTaskTerminateHandler)                    // 解约
-		m.POST("/project/getsketchinfo", handler.WrapGetSketchInfoHandler)                   // 获取初稿
-		m.POST("/project/taskfinishlist", handler.WrapTaskFinishListHandler)                 // 查询违约列表-数据违约
-		m.POST("/project/getfinishdata", handler.WrapGetFinishDataHandler)                   // 获取结案信息
-		m.GET("/project/finduserinfo", handler.WrapFindUserInfoHandler)                      // 获取账户信息
-		m.POST("/project/updatauserinfo", handler.WrapUpdateUserInfoHandler)                 // 更新账户信息
-		m.POST("/project/getfinishnumberinfo", handler.WrapGetFinishNumberInfoHandler)       // 获取结案数量
-		m.POST("/project/transferToPublic", handler.WrapTransferToPublicHandler)             // 对公转账
-		m.GET("/workspace/headNums", handler.WrapWorkspaceHeadNumsHandler)                   // 工作台上面数字显示
-		m.POST("/workspace/BarNums", handler.WrapWorkspaceBarNumsHandler)                    // 工作台柱状图数字显示
+
+		m.POST("/project/taskfinishlist", handler.WrapTaskFinishListHandler)           // 查询违约列表-数据违约
+		m.POST("/project/getfinishdata", handler.WrapGetFinishDataHandler)             // 获取结案信息
+		m.GET("/project/finduserinfo", handler.WrapFindUserInfoHandler)                // 获取账户信息
+		m.POST("/project/updatauserinfo", handler.WrapUpdateUserInfoHandler)           // 更新账户信息
+		m.POST("/project/getfinishnumberinfo", handler.WrapGetFinishNumberInfoHandler) // 获取结案数量
+		m.POST("/project/transferToPublic", handler.WrapTransferToPublicHandler)       // 对公转账
+		m.GET("/workspace/headNums", handler.WrapWorkspaceHeadNumsHandler)             // 工作台上面数字显示
+		m.POST("/workspace/BarNums", handler.WrapWorkspaceBarNumsHandler)              // 工作台柱状图数字显示
 
 		m.POST("/project/getSpecialInviteNumber", handler.WrapGetSpecialInviteNumberHandler) // 查询专项任务邀请管理任务数量
 		m.POST("/project/getSpecialReviewNumber", handler.WrapGetSpecialReviewNumberHandler) // 查询专项任务审稿管理任务数量
@@ -138,7 +132,36 @@ func InitRoute(r *gin.Engine) {
 		m.POST("/product/deletePhotoUrl", handler.WrapDeletePhotoUrlHandler)                     // 在数据库中删除图片url
 		m.POST("/qrcode/getwxqrcode", handler.WrapGetWxQRCodeHandler)                            // 获取微信二维码
 
-		m.POST("/project/getAllProduct", handler.WrapGetAllProjectHandler) // 查询项目广场项目列表
+		m.POST("/project/getAllProduct", handler.WrapGetAllProjectHandler)        // 查询项目广场项目列表
+		m.POST("/project/getTasklist", handler.WrapGetTaskListHandler)            //招募中选达人列表/查名单
+		m.POST("/project/task/coop/pass", handler.WrapPassproTaskCoopHandler)     // 同意任务合作
+		m.POST("/project/task/coop/refuse", handler.WrapRefuseproTaskCoopHandler) // 拒绝任务合作
+
+		m.POST("/project/projectdata", handler.WrapProjectDataHandler) //看数据
+		m.POST("/project/endtask", handler.WrapEndTaskHandler)         //暂时终止
+
+		m.POST("/project/presketchlist", handler.WrapPreSketchListHandler)     //初稿待传列表?
+		m.POST("/project/tasksketchlist", handler.WrapTasksketchlistHandler)   //初稿待审列表.审核通过
+		m.POST("/project/sketchopinion", handler.WrapSketchOpinionHandler)     // 初稿审核意见提交
+		m.POST("/project/acceptsketch", handler.WrapAcceptSketchHandler)       // 同意初稿
+		m.POST("/project/rejectsketch", handler.WrapRejectSketchHandler)       // 拒绝初稿
+		m.POST("/project/findsketchphoto", handler.WrapFindSketchPhotoHandler) // 查询脚本配图和视频demo
+		m.POST("/project/getsketchinfo", handler.WrapGetSketchInfoHandler)     // 获取初稿
+
+		m.POST("/project/prelinklist", handler.WrapPreLinkListHandler)   //待传链接列表
+		m.POST("/project/tasklinklist", handler.WrapTaskLinklistHandler) //链接待审列表,通过
+		m.POST("/project/linkopinion", handler.WrapLinkOpinionHandler)   // 链接审核意见提交
+		m.POST("/project/acceptlink", handler.WrapAcceptLinkHandler)     // 同意链接
+		m.POST("/project/rejectlink", handler.WrapRejectLinkHandler)     // 拒绝链接
+
+		m.POST("/project/predatalist", handler.WrapPreDataListHandler)   //待传数据列表
+		m.POST("/project/taskdatalist", handler.WrapTaskDatalistHandler) //数据待审列表?结算金额
+		m.POST("/project/dataopinion", handler.WrapDataOpinionHandler)   // 数据审核意见提交
+		m.POST("/project/acceptdata", handler.WrapAcceptDataHandler)     // 同意数据
+		m.POST("/project/rejectdata", handler.WrapRejectDataHandler)     // 拒绝数据
+
+		m.POST("/project/executedata", handler.WrapExecuteDataHandler) //看数据
+		m.POST("/project/data", handler.WrapDataHandler)
 	}
 
 	// 选品广场相关接口

+ 101 - 0
service/Task.go

@@ -0,0 +1,101 @@
+package service
+
+import (
+	"context"
+	"github.com/sirupsen/logrus"
+	"youngee_b_api/db"
+	"youngee_b_api/model/http_model"
+)
+
+var Task *task
+
+type task struct {
+}
+
+func (*task) GetList(ctx context.Context, request http_model.GetTaskListRequest) (*http_model.GetTaskListData, error) {
+	secTaskList, err := db.GetProjecttaskList(ctx, request)
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[sectask_service service] call GetTaskList error,err:%+v", err)
+		return nil, err
+	}
+	return secTaskList, nil
+}
+
+func (*task) PassCoop(ctx context.Context, request http_model.PassproTaskCoopRequest) (*http_model.PassSecTaskCoopData, error) {
+	_, err := db.PassProTaskCoop(ctx, request.ProjectId, request.TaskIds, request.OperatorId, request.OperateType)
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[sectask_service service] call PassCoop error,err:%+v", err)
+		return nil, err
+	}
+
+	selectionListData := http_model.PassSecTaskCoopData{}
+
+	return &selectionListData, nil
+}
+
+func (*task) RefuseCoop(ctx context.Context, request http_model.RefuseproTaskCoopRequest) (*http_model.RefuseproTaskCoopData, error) {
+
+	_, err := db.RefuseproTaskCoop(ctx, request.TaskIds, request.OperatorId, request.OperateType)
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[sectask_service service] call RefuseCoop error,err:%+v", err)
+		return nil, err
+	}
+
+	projectListData := http_model.RefuseproTaskCoopData{}
+
+	return &projectListData, nil
+}
+
+func (*task) GetPreSketchList(ctx context.Context, request http_model.PreSketchListRequest) (*http_model.GetSketchTaskListData, error) {
+	secTaskList, err := db.GetPreSketchList(ctx, request)
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[sectask_service service] call GetPreSketchList error,err:%+v", err)
+		return nil, err
+	}
+	return secTaskList, nil
+}
+
+func (*task) GetTasksketchlist(ctx context.Context, request http_model.TasksketchlistRequest) (*http_model.GetsketchtaskListData, error) {
+	secTaskList, err := db.GetSketchList(ctx, request)
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[sectask_service service] call GetTasksketchlist error,err:%+v", err)
+		return nil, err
+	}
+	return secTaskList, nil
+}
+
+func (*task) GetPreLinkList(ctx context.Context, request http_model.PreLinkListRequest) (*http_model.GetprelinkListData, error) {
+	secTaskList, err := db.GetPreLinkList(ctx, request)
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[sectask_service service] call PreLinkListRequest error,err:%+v", err)
+		return nil, err
+	}
+	return secTaskList, nil
+}
+
+func (*task) GetTaskLinklist(ctx context.Context, request http_model.TaskLinklistRequest) (*http_model.GettasklinkListData, error) {
+	secTaskList, err := db.GetLinkList(ctx, request)
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[sectask_service service] call GetTasksketchlist error,err:%+v", err)
+		return nil, err
+	}
+	return secTaskList, nil
+}
+
+func (*task) GetPreDataList(ctx context.Context, request http_model.PreDataListRequest) (*http_model.GetPreDataListData, error) {
+	secTaskList, err := db.GetPreDataList(ctx, request)
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[sectask_service service] call PreLinkListRequest error,err:%+v", err)
+		return nil, err
+	}
+	return secTaskList, nil
+}
+
+func (*task) GetTaskDatalist(ctx context.Context, request http_model.TaskDatalistRequest) (*http_model.GetTaskDatalistData, error) {
+	secTaskList, err := db.GetDataList(ctx, request)
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[sectask_service service] call GetTasksketchlist error,err:%+v", err)
+		return nil, err
+	}
+	return secTaskList, nil
+}

+ 62 - 14
service/autoTask.go

@@ -1,6 +1,7 @@
 package service
 
 import (
+	"fmt"
 	"github.com/robfig/cron/v3"
 	log "github.com/sirupsen/logrus"
 	"time"
@@ -9,24 +10,44 @@ import (
 
 func AutoTask() error {
 	c := cron.New(cron.WithSeconds())
-	spec := "0 */30 * * * ?" //cron表达式,每半小时执行一次
-	//spec := "0 */1 * * * ?" //cron表达式,每1分钟一次
+	//spec := "0 */30 * * * ?" //cron表达式,每半小时执行一次
+	spec := "0 */1 * * * ?" //cron表达式,每1分钟一次
 	//spec := "*/10 * * * * ?" //cron表达式,每10秒一次
-	_, err1 := c.AddFunc(spec, AutoTaskUpdateStatus)
-	if err1 != nil {
-		log.Println("service [AutoTaskUpdateStatus] error:", err1)
-		return err1
+
+	/*
+		_, err1 := c.AddFunc(spec, AutoTaskUpdateStatus)
+		if err1 != nil {
+			log.Println("service [AutoTaskUpdateStatus] error:", err1)
+			return err1
+		}
+		_, err2 := c.AddFunc("@midnight", AutoTaskUpdateApplyTimes)
+		if err2 != nil {
+			log.Println("service [AutoTaskUpdateApplyTimes] error:", err2)
+			return err2
+		}
+		_, err3 := c.AddFunc(spec, AutoTaskCompleteSelection)
+		if err3 != nil {
+			log.Println("service [AutoTaskCompleteSecTask] error:", err2)
+			return err3
+		}
+
+	*/
+	_, err4 := c.AddFunc(spec, GetAutoDraftDefaultTask)
+	if err4 != nil {
+		log.Println("service [GetAutoDraftDefaultTask] error:", err4)
+		return err4
 	}
-	_, err2 := c.AddFunc("@midnight", AutoTaskUpdateApplyTimes)
-	if err2 != nil {
-		log.Println("service [AutoTaskUpdateApplyTimes] error:", err2)
-		return err2
+	_, err5 := c.AddFunc(spec, GetAutoLinkDefaultTask)
+	if err5 != nil {
+		log.Println("service [GetAutoLinkDefaultTask] error:", err4)
+		return err5
 	}
-	_, err3 := c.AddFunc(spec, AutoTaskCompleteSelection)
-	if err3 != nil {
-		log.Println("service [AutoTaskCompleteSecTask] error:", err2)
-		return err3
+	_, err6 := c.AddFunc(spec, GetAutoCaseCloseDefaultTask)
+	if err6 != nil {
+		log.Println("service [GetAutoCaseCloseDefaultTask] error:", err4)
+		return err6
 	}
+	fmt.Println(spec)
 	c.Start()
 	return nil
 }
@@ -54,3 +75,30 @@ func AutoTaskCompleteSelection() {
 		log.Println("AutoUpdateApplyTimes error : ", err)
 	}
 }
+
+// GetAutoDraftDefaultTask 初稿超时违约
+func GetAutoDraftDefaultTask() {
+	err := db.GetAutoDraftDefaultTask()
+	log.Println("GetAutoDraftDefaultInPicTask is running ,Time :", time.Now())
+	if err != nil {
+		log.Println("GetAutoDraftDefaultInPicTask error : ", err)
+	}
+}
+
+// GetAutoLinkDefaultTask 链接超时违约
+func GetAutoLinkDefaultTask() {
+	err := db.GetAutoLinkDefaultTask()
+	log.Println("GetAutoLinkDefaultTask is running ,Time :", time.Now())
+	if err != nil {
+		log.Println("GetAutoDraftDefaultInPicTask error : ", err)
+	}
+}
+
+// GetAutoCaseCloseDefaultTask 数据超时违约
+func GetAutoCaseCloseDefaultTask() {
+	err := db.GetAutoCaseCloseDefaultTask()
+	log.Println("GetAutoCaseCloseDefaultTask is running ,Time :", time.Now())
+	if err != nil {
+		log.Println("GetAutoCaseCloseDefaultTask error : ", err)
+	}
+}

+ 33 - 0
service/data.go

@@ -134,3 +134,36 @@ func (*data) AcceptData(ctx context.Context, request http_model.AcceptDataReques
 	}
 	return res, nil
 }
+
+// RejectData
+func (*data) RejectData(ctx context.Context, request http_model.RejectDataRequest) (*http_model.RejectDataData, error) {
+	var TaskIDList []string
+	TaskIDs := strings.Split(request.TaskIds, ",")
+	for _, taskId := range TaskIDs {
+		TaskIDList = append(TaskIDList, taskId)
+	}
+	fmt.Printf("acc request %+v", TaskIDList)
+	err := db.RejectData(ctx, TaskIDList)
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[Link service] call CreateLink error,err:%+v", err)
+		return nil, err
+	}
+	// 记录任务日志
+	for _, taskId := range TaskIDList {
+		err = db.CreateTaskLog(ctx, taskId, "数据驳回")
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[Link service] call CreateTaskLog error,err:%+v", err)
+			return nil, err
+		}
+		err = db.CreateMessageByTaskId(ctx, 19, 3, taskId)
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[Script service] call CreateTaskLog error,err:%+v", err)
+			return nil, err
+		}
+	}
+
+	res := &http_model.RejectDataData{
+		TaskIds: TaskIDList,
+	}
+	return res, nil
+}

+ 33 - 0
service/link.go

@@ -78,3 +78,36 @@ func (*link) AcceptLink(ctx context.Context, request http_model.AcceptLinkReques
 	}
 	return res, nil
 }
+
+// RejectLink
+func (*link) RejectLink(ctx context.Context, request http_model.RejectLinkRequest) (*http_model.RejectLinkData, error) {
+	var TaskIDList []string
+	TaskIDs := strings.Split(request.TaskIds, ",")
+	for _, taskId := range TaskIDs {
+		TaskIDList = append(TaskIDList, taskId)
+	}
+	fmt.Printf("acc request %+v", TaskIDList)
+	err := db.RejectLink(ctx, TaskIDList)
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[Link service] call CreateLink error,err:%+v", err)
+		return nil, err
+	}
+	// 记录任务日志
+	for _, taskId := range TaskIDList {
+		err = db.CreateTaskLog(ctx, taskId, "链接不通过")
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[Link service] call CreateTaskLog error,err:%+v", err)
+			return nil, err
+		}
+		err = db.CreateMessageByTaskId(ctx, 18, 3, taskId)
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[Script service] call CreateTaskLog error,err:%+v", err)
+			return nil, err
+		}
+	}
+
+	res := &http_model.RejectLinkData{
+		TaskIds: TaskIDList,
+	}
+	return res, nil
+}

+ 29 - 2
service/project.go

@@ -389,8 +389,8 @@ func (*project) GetProjectDraftList(ctx context.Context, enterpriseID string, pa
 	return ProjectDraftListData, nil
 }
 
-func (*project) GetProjectTaskList(ctx context.Context, projectID string, pageSize, pageNum int64, conditions *common_model.TaskConditions) (*http_model.ProjectTaskListData, error) {
-	projectTasks, total, err := db.GetProjectTaskList(ctx, projectID, pageSize, pageNum, conditions)
+func (*project) GetProjectTaskList(ctx context.Context, pageSize int64, pageNum int64, conditions *common_model.TaskConditions) (*http_model.ProjectTaskListData, error) {
+	projectTasks, total, err := db.GetProjectTaskList(ctx, pageSize, pageNum, conditions)
 	if err != nil {
 		logrus.WithContext(ctx).Errorf("[project service] call GetProjectTaskList error,err:%+v", err)
 		return nil, err
@@ -624,3 +624,30 @@ func (*project) GetSpecialProjectTaskList(ctx context.Context, projectID string,
 	TaskLogisticsListData.Total = conv.MustString(total, "")
 	return TaskLogisticsListData, nil
 }
+
+func (*project) Data(ctx context.Context, Project http_model.ProjectDataRequest) (*http_model.ProjectDataResponse, error) {
+	projectdata, err := db.GetProjectData(ctx, Project.ProjectId)
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[project service] call Data error,err:%+v", err)
+		return nil, err
+	}
+	return &projectdata, nil
+}
+
+func (*project) ExecuteData(ctx context.Context, Project http_model.ExecuteDataRequest) (*http_model.ExecuteDataResponse, error) {
+	projectdata, err := db.GetProjectExecuteData(ctx, Project.ProjectId)
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[project service] call Data error,err:%+v", err)
+		return nil, err
+	}
+	return &projectdata, nil
+}
+
+func (*project) ProjectData(ctx context.Context, Project http_model.DataRequest) (*http_model.ProjectdataResponse, error) {
+	projectdata, err := db.GetProjecdata(ctx, Project.ProjectId)
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[project service] call Data error,err:%+v", err)
+		return nil, err
+	}
+	return &projectdata, nil
+}

+ 39 - 3
service/sketch.go

@@ -123,9 +123,45 @@ func (*sketch) GetSketchInfo(ctx context.Context, request http_model.GetSketchIn
 		SketchPhotos = append(SketchPhotos, sketchPhoto)
 	}
 	SketchInfoData := http_model.GetSketchInfoData{
-		Title:        SketchInfo.Title,
-		Content:      SketchInfo.Content,
-		SketchPhotos: SketchPhotos,
+		Title:          SketchInfo.Title,
+		Content:        SketchInfo.Content,
+		SketchPhotos:   SketchPhotos,
+		Agreeat:        SketchInfo.AgreeAt,
+		Submitat:       SketchInfo.SubmitAt,
+		ReverseOpinion: SketchInfo.ReviseOpinion,
 	}
 	return &SketchInfoData, nil
 }
+
+// AcceptSketch 不同意初稿
+func (*sketch) RejectSketch(ctx context.Context, request http_model.RejectSketchRequest) (*http_model.RejectSketchData, error) {
+	var TaskIDList []string
+	TaskIDs := strings.Split(request.TaskIds, ",")
+	for _, taskId := range TaskIDs {
+		TaskIDList = append(TaskIDList, taskId)
+	}
+	fmt.Printf("acc request %+v", TaskIDList)
+	err := db.RejectSketch(ctx, TaskIDList)
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[Sketch service] call CreateSketch error,err:%+v", err)
+		return nil, err
+	}
+	// 记录任务日志
+	for _, taskId := range TaskIDList {
+		err = db.CreateTaskLog(ctx, taskId, "初稿未通过")
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[Sketch service] call CreateTaskLog error,err:%+v", err)
+			return nil, err
+		}
+		err = db.CreateMessageByTaskId(ctx, 17, 3, taskId)
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[Script service] call CreateTaskLog error,err:%+v", err)
+			return nil, err
+		}
+	}
+
+	res := &http_model.RejectSketchData{
+		TaskIds: TaskIDList,
+	}
+	return res, nil
+}