Browse Source

822确定达人-结算

Ohio-HYF 1 year ago
parent
commit
9fdfcedc74

+ 90 - 2
db/auto_task.go

@@ -2,6 +2,7 @@ package db
 
 import (
 	"context"
+	"github.com/issue9/conv"
 	"time"
 	"youngee_b_api/model/gorm_model"
 
@@ -15,9 +16,9 @@ func AutoUpdateStatus() error {
 	db = db.Debug().Model(gorm_model.ProjectInfo{}).Select("project_id").Where("project_status = 6").Find(&projectIds)
 	//fmt.Println("projectIds",projectIds)
 	if len(projectIds) != 0 {
-		for _,projectId := range projectIds{
+		for _, projectId := range projectIds {
 			db1 := GetReadDB(context.Background())
-			db1 = db1.Debug().Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? and task_status = 1",projectId).Update("task_status",3)
+			db1 = db1.Debug().Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? and task_status = 1", projectId).Update("task_status", 3)
 		}
 	}
 	db1 := GetReadDB(context.Background())
@@ -56,3 +57,90 @@ func AutoUpdateApplyTimes() error {
 	}
 	return nil
 }
+
+func AutoCompleteSelection() error {
+	db := GetReadDB(context.Background())
+	// 查询selection表,查询所有到截至时间的选品项目
+	var completedSelectionList []gorm_model.YounggeeSelectionInfo
+	err := db.Model(gorm_model.YounggeeSelectionInfo{}).Where("task_ddl < ?", time.Now()).Scan(&completedSelectionList).Error
+	if err != nil {
+		log.Println("DB AutoCompleteSelection error :", err)
+		return err
+	}
+	// 遍历结束选品列表
+	for _, v := range completedSelectionList {
+		if v.SelectionStatus == 6 { // 若处于执行中阶段
+			// 查询该选品下所有待结算任务
+			var settleSecTaskList []gorm_model.YounggeeSecTaskInfo
+			err = db.Model(gorm_model.YounggeeSecTaskInfo{}).Where("selection_id = ? and task_stage = 9", v.SelectionID).Scan(&settleSecTaskList).Error
+			if err != nil {
+				log.Println("DB AutoCompleteSelection error :", err)
+				return err
+			}
+			// 结算选品
+			for _, w := range settleSecTaskList {
+				// 更新任务信息
+				updateSecTaskData := gorm_model.YounggeeSecTaskInfo{
+					TaskID:           w.TaskID,
+					TaskStage:        10,
+					AssignmentStatus: 5,
+					IsPayReward:      0,
+					IsPayPayment:     0,
+					CompleteDate:     time.Now(),
+				}
+				_, err = UpdateSecTask(context.Background(), updateSecTaskData)
+				if err != nil {
+					log.Println("DB AutoCompleteSelection error :", err)
+					return err
+				}
+
+				// 添加任务日志和达人消息
+				err = CreateTaskLog(context.Background(), w.TaskID, "结算时间")
+				if err != nil {
+					log.Println("DB AutoCompleteSelection error :", err)
+				}
+
+				err = CreateMessageBySecTaskId(context.Background(), 5, 1, w.TaskID)
+				if err != nil {
+					log.Println("DB AutoCompleteSelection error :", err)
+					return err
+				}
+			}
+
+			// 计算结算金额,并返还剩余冻结资金
+			var leftMoney float64 = conv.MustFloat64(v.EstimatedCost, 0) - conv.MustFloat64(v.SettlementAmount, 0)
+			_, err = UpdateEnterpriseBalance(context.Background(), v.EnterpriseID, 0, leftMoney, -leftMoney)
+			if err != nil {
+				log.Println("DB AutoCompleteSelection error :", err)
+				return err
+			}
+
+			// 更新选品阶段为已结案
+			updateSelectionInfo := gorm_model.YounggeeSelectionInfo{
+				SelectionID:     v.SelectionID,
+				SelectionStatus: 8,
+				FinishAt:        time.Now(),
+			}
+			err = UpdateSelection(context.Background(), updateSelectionInfo)
+			if err != nil {
+				log.Println("DB AutoCompleteSelection error :", err)
+				return err
+			}
+		} else { // 否则
+			// 更新选品阶段为失效,失效原因为逾期未支付
+			updateSelectionInfo := gorm_model.YounggeeSelectionInfo{
+				SelectionID:     v.SelectionID,
+				SelectionStatus: 7,
+				FailReason:      1,
+				FinishAt:        time.Now(),
+			}
+			err = UpdateSelection(context.Background(), updateSelectionInfo)
+			if err != nil {
+				log.Println("DB AutoCompleteSelection error :", err)
+				return err
+			}
+		}
+	}
+
+	return nil
+}

+ 35 - 0
db/logistics.go

@@ -274,3 +274,38 @@ func GetSpecialTaskLogisticsList(ctx context.Context, projectID string, pageSize
 	}
 	return newTaskLogisticss, totalTask, nil
 }
+
+func GetSecTaskLogisticsList(ctx context.Context, secTaskList []*http_model.SecTaskInfo, taskStage int, productType int) ([]*http_model.SecTaskInfo, error) {
+	db := GetReadDB(ctx)
+	if taskStage != 6 { // 已发货
+		// 查询youngee_task_logistics中物流信息
+		var taskIds []string
+		taskMap := make(map[string]*http_model.SecTaskInfo)
+		for _, secTask := range secTaskList {
+			taskIds = append(taskIds, secTask.SecTaskId)
+			taskMap[secTask.SecTaskId] = secTask
+		}
+
+		var logisticsInfos []gorm_model.YoungeeTaskLogistics
+		err := db.Model(gorm_model.YoungeeTaskLogistics{}).Where("task_id IN ?", taskIds).Find(&logisticsInfos).Error
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+			return nil, err
+		}
+		logisticsMap := make(map[string]gorm_model.YoungeeTaskLogistics)
+		for _, logisticsInfo := range logisticsInfos {
+			logisticsMap[logisticsInfo.TaskID] = logisticsInfo
+		}
+		// 融合信息
+		for i, secTask := range secTaskList {
+			taskID := secTask.SecTaskId
+			secTaskList[i].CompanyName = logisticsMap[taskID].CompanyName
+			secTaskList[i].LogisticsNumber = logisticsMap[taskID].LogisticsNumber
+			secTaskList[i].ExplorestorePeriod = logisticsMap[taskID].ExplorestorePeriod
+			secTaskList[i].ExplorestoreStarttime = logisticsMap[taskID].ExplorestoreStarttime
+			secTaskList[i].ExplorestoreEndtime = logisticsMap[taskID].ExplorestoreEndtime
+		}
+	}
+
+	return secTaskList, nil
+}

+ 35 - 0
db/message.go

@@ -9,6 +9,41 @@ import (
 	"github.com/sirupsen/logrus"
 )
 
+// 通过secTaskId查询talentId,插入新消息
+func CreateMessageBySecTaskId(ctx context.Context, messageId int, messageType int, taskId string) error {
+	db := GetReadDB(ctx)
+	taskInfo := gorm_model.YounggeeSecTaskInfo{}
+	err := db.Model(gorm_model.YounggeeSecTaskInfo{}).Where("task_id = ?", taskId).Find(&taskInfo).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[CreateMessageByTask] error read mysql, err:%+v", err)
+		return err
+	}
+
+	db1 := GetReadDB(ctx)
+	var projectName string
+	err = db1.Model(gorm_model.YounggeeSelectionInfo{}).Select("selection_name").Where("selection_id = ?", taskInfo.SelectionID).Find(&projectName).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[CreateMessageByTask] error read mysql, err:%+v", err)
+		return err
+	}
+	messageInfo := gorm_model.YounggeeMessageInfo{
+		MessageID:   messageId,
+		MessageType: messageType,
+		CreatedAt:   time.Now(),
+		TalentID:    taskInfo.TalentID,
+		ProjectName: projectName,
+		IsReaded:    0,
+		IsDeleted:   0,
+	}
+	db2 := GetReadDB(ctx)
+	err = db2.Model(gorm_model.YounggeeMessageInfo{}).Create(&messageInfo).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[CreateMessageByTask] error create mysql, err:%+v", err)
+		return err
+	}
+	return nil
+}
+
 // 通过taskId查询talentId,插入新消息
 func CreateMessageByTaskId(ctx context.Context, messageId int, messageType int, taskId string) error {
 	db := GetReadDB(ctx)

+ 17 - 0
db/product.go

@@ -174,3 +174,20 @@ func GetAllProduct(ctx context.Context, req *http_model.GetAllProductRequest, en
 	}
 	return ProjectBriefInfos, total, nil
 }
+
+func GetProductType(ctx context.Context, selectionId string) (*int, error) {
+	db := GetReadDB(ctx)
+	var productId int
+	err := db.Model(gorm_model.YounggeeSelectionInfo{}).Select("product_id").Where("selection_id = ?", selectionId).Find(&productId).Error
+	if err != nil || productId == 0 {
+		logrus.WithContext(ctx).Errorf("[GetProductType] error query mysql, err:%+v", err)
+		return nil, err
+	}
+	var productType int
+	err = db.Model(gorm_model.YounggeeProduct{}).Select("product_type").Where("product_id = ?", productId).Find(&productType).Error
+	if err != nil || productType == 0 {
+		logrus.WithContext(ctx).Errorf("[GetProductType] error query mysql, err:%+v", err)
+		return nil, err
+	}
+	return &productType, nil
+}

+ 96 - 18
db/sectask.go

@@ -3,7 +3,10 @@ package db
 import (
 	"context"
 	"errors"
+	"fmt"
+	"github.com/issue9/conv"
 	"github.com/sirupsen/logrus"
+	"github.com/tidwall/gjson"
 	"gorm.io/gorm"
 	"strings"
 	"time"
@@ -29,11 +32,28 @@ func GetSecTaskById(ctx context.Context, secTaskId string) (*gorm_model.Younggee
 
 func GetSecTaskList(ctx context.Context, selectionId string, taskStatus int, searchValue string, pageSize, pageNum int64) ([]*http_model.SecTaskInfo, int64, error) {
 	db := GetReadDB(ctx)
-	whereCondition := gorm_model.YounggeeSecTaskInfo{
-		SelectionID: selectionId,
-		TaskStatus:  taskStatus,
+	var taskStages []int
+	switch taskStatus {
+	case 3:
+		taskStages = []int{3}
+		break
+	case 4:
+		taskStages = []int{4, 6, 7, 8, 9, 10}
+		break
+	case 6:
+		taskStages = []int{6}
+		break
+	case 7:
+		taskStages = []int{7, 8, 9, 10}
+		break
+	case 9:
+		taskStages = []int{9}
+		break
+	case 10:
+		taskStages = []int{10}
+		break
 	}
-	db = db.Model(gorm_model.YounggeeSecTaskInfo{}).Where(whereCondition)
+	db = db.Model(gorm_model.YounggeeSecTaskInfo{}).Where("selection_id = ? and task_stage in ?", selectionId, taskStages)
 
 	// 查询总数
 	var total int64
@@ -44,18 +64,24 @@ func GetSecTaskList(ctx context.Context, selectionId string, taskStatus int, sea
 	}
 	// 查询该页数据
 	limit := pageSize
-	offset := pageSize * pageNum // assert pageNum start with 0
+	offset := pageSize * (pageNum - 1) // assert pageNum start with 0
 	err := db.Order("create_date desc").Limit(int(limit)).Offset(int(offset)).Find(&secTaskInfoList).Error
 	if err != nil {
 		logrus.WithContext(ctx).Errorf("[GetSelectionList] error query mysql total, err:%+v", err)
 		return nil, 0, err
 	}
 
+	fmt.Println("secTaskInfoList:", secTaskInfoList)
 	newSecTaskInfoList := pack.GormSecTaskListToHttpSecTaskList(secTaskInfoList)
+	fmt.Println("newSecTaskInfoList:", newSecTaskInfoList)
+
+	for i, secTask := range newSecTaskInfoList {
+		newSecTaskInfoList[i].DetailAddr = GetRegion(ctx, secTask.RegionCode) + secTask.DetailAddr
+	}
 	var resSecTaskInfoList []*http_model.SecTaskInfo
 	if searchValue != "" {
 		for _, v := range newSecTaskInfoList {
-			if strings.Contains(v.SelectionId, searchValue) {
+			if strings.Contains(v.SecTaskId, searchValue) {
 				resSecTaskInfoList = append(resSecTaskInfoList, v)
 			} else if strings.Contains(v.PlatformNickname, searchValue) {
 				resSecTaskInfoList = append(resSecTaskInfoList, v)
@@ -66,6 +92,7 @@ func GetSecTaskList(ctx context.Context, selectionId string, taskStatus int, sea
 	} else {
 		resSecTaskInfoList = newSecTaskInfoList
 	}
+	fmt.Println("resSecTaskInfoList: ", resSecTaskInfoList)
 	return resSecTaskInfoList, total, nil
 }
 
@@ -73,7 +100,10 @@ func PassSecTaskCoop(ctx context.Context, selectionId string, taskIds []string)
 	db := GetWriteDB(ctx)
 	// 1. 校验
 	var count int64
+	fmt.Println("task_ids: ", taskIds)
 	err := db.Model(gorm_model.YounggeeSecTaskInfo{}).Where("task_id IN ? AND task_stage = 3", taskIds).Count(&count).Error
+
+	fmt.Println("count: ", count)
 	if err != nil {
 		return false, err
 	}
@@ -83,13 +113,13 @@ func PassSecTaskCoop(ctx context.Context, selectionId string, taskIds []string)
 
 	// 2. 查询任务对应达人id(用于生成达人消息)
 	var talentIds []string
-	err = db.Model(gorm_model.YounggeeSecTaskInfo{}).Where("task_id IN ?", taskIds).Select("talent_id").Find(talentIds).Error
+	err = db.Model(gorm_model.YounggeeSecTaskInfo{}).Where("task_id IN ?", taskIds).Select("talent_id").Find(&talentIds).Error
 	if err != nil {
 		return false, err
 	}
 	// 3. 查询任务对应选品名称(用于生成达人消息)
 	var selection gorm_model.YounggeeSelectionInfo
-	err = db.Model(gorm_model.YounggeeSelectionInfo{}).Where("selection_id = ?", selectionId).Find(selection).Error
+	err = db.Model(gorm_model.YounggeeSelectionInfo{}).Where("selection_id = ?", selectionId).Find(&selection).Error
 	if err != nil {
 		return false, err
 	}
@@ -99,10 +129,11 @@ func PassSecTaskCoop(ctx context.Context, selectionId string, taskIds []string)
 		// 若选品不提供样品,则直接跳转执行阶段,否则进入发货阶段
 		if selection.SampleMode == 3 {
 			updateData := gorm_model.YounggeeSecTaskInfo{
-				TaskStatus:      2,
-				TaskStage:       6,
-				SelectDate:      time.Now(),
-				LogisticsStatus: 1,
+				TaskStatus:       2,
+				TaskStage:        8,
+				SelectDate:       time.Now(),
+				LogisticsStatus:  3,
+				AssignmentStatus: 1,
 			}
 			err = tx.Model(gorm_model.YounggeeSecTaskInfo{}).Where("task_id IN ? AND task_stage = 3", taskIds).Updates(updateData).Error
 			if err != nil {
@@ -110,11 +141,10 @@ func PassSecTaskCoop(ctx context.Context, selectionId string, taskIds []string)
 			}
 		} else {
 			updateData := gorm_model.YounggeeSecTaskInfo{
-				TaskStatus:       2,
-				TaskStage:        8,
-				SelectDate:       time.Now(),
-				LogisticsStatus:  3,
-				AssignmentStatus: 1,
+				TaskStatus:      2,
+				TaskStage:       6,
+				SelectDate:      time.Now(),
+				LogisticsStatus: 1,
 			}
 			err = tx.Model(gorm_model.YounggeeSecTaskInfo{}).Where("task_id IN ? AND task_stage = 3", taskIds).Updates(updateData).Error
 			if err != nil {
@@ -151,7 +181,7 @@ func RefuseSecTaskCoop(ctx context.Context, taskIds []string) (bool, error) {
 
 	// 查询任务对应达人id
 	var talentIds []string
-	err = db.Model(gorm_model.YounggeeSecTaskInfo{}).Where("task_id IN ?", taskIds).Select("talent_id").Find(talentIds).Error
+	err = db.Model(gorm_model.YounggeeSecTaskInfo{}).Where("task_id IN ?", taskIds).Select("talent_id").Find(&talentIds).Error
 	if err != nil {
 		return false, err
 	}
@@ -189,3 +219,51 @@ func UpdateSecTask(ctx context.Context, updateData gorm_model.YounggeeSecTaskInf
 	}
 	return true, nil
 }
+
+func GetSecTaskSettleList(ctx context.Context, secTaskList []*http_model.SecTaskInfo, selectionId string, taskStatus int) ([]*http_model.SecTaskInfo, error) {
+	db := GetWriteDB(ctx)
+	whereCondition := gorm_model.YounggeeSelectionInfo{
+		SelectionID: selectionId,
+	}
+	selectionInfo := gorm_model.YounggeeSelectionInfo{}
+	err := db.Model(gorm_model.YounggeeSelectionInfo{}).Where(whereCondition).Scan(&selectionInfo).Error
+	if err != nil {
+		return nil, err
+	}
+
+	// 获取返现金额、悬赏金额
+	fmt.Println("selectionInfo.ProductSnap: ", selectionInfo.ProductSnap)
+	price := conv.MustString(gjson.Get(selectionInfo.ProductSnap, "ProductPrice"), "")
+	for i, _ := range secTaskList {
+		secTaskList[i].TaskReward = selectionInfo.TaskReward
+		secTaskList[i].ReturnMoney = price
+	}
+
+	// 获取作业信息
+	var taskIds []string
+	taskMap := make(map[string]*http_model.SecTaskInfo)
+	for _, secTask := range secTaskList {
+		taskIds = append(taskIds, secTask.SecTaskId)
+		taskMap[secTask.SecTaskId] = secTask
+	}
+
+	var assignmentInfos []gorm_model.YounggeeAssignmentInfo
+	err = db.Model(gorm_model.YounggeeAssignmentInfo{}).Where("task_id IN ?", taskIds).Find(&assignmentInfos).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[GetProjectTaskList] error query mysql total, err:%+v", err)
+		return nil, err
+	}
+	assignmentMap := make(map[string]gorm_model.YounggeeAssignmentInfo)
+	for _, assignmentInfo := range assignmentInfos {
+		assignmentMap[assignmentInfo.TaskID] = assignmentInfo
+	}
+	// 融合信息
+	for i, secTask := range secTaskList {
+		taskID := secTask.SecTaskId
+		secTaskList[i].AssignmentLink = assignmentMap[taskID].LinkUrl
+		secTaskList[i].DataScreenshot = assignmentMap[taskID].PhotoUrl
+		secTaskList[i].CreateDate = conv.MustString(assignmentMap[taskID].CreateAt, "")
+	}
+
+	return secTaskList, nil
+}

+ 14 - 4
db/sectask_logistics.go

@@ -2,6 +2,7 @@ package db
 
 import (
 	"context"
+	"fmt"
 	"youngee_b_api/model/gorm_model"
 )
 
@@ -17,13 +18,22 @@ func CreateSecTaskLogistics(ctx context.Context, logistics gorm_model.YoungeeTas
 
 func UpdateSecTaskLogistics(ctx context.Context, updateData gorm_model.YoungeeTaskLogistics) (*int64, error) {
 	db := GetWriteDB(ctx)
-	whereCondition := gorm_model.YoungeeTaskLogistics{
-		LogisticsID: updateData.LogisticsID,
-	}
-	err := db.Where(whereCondition).Updates(&updateData).Error
+	fmt.Println("logistics_id: ", updateData.LogisticsID)
+	fmt.Println("updateData: ", updateData)
+	err := db.Model(gorm_model.YoungeeTaskLogistics{}).Where("logistics_id", updateData.LogisticsID).Updates(&updateData).Error
 	if err != nil {
 		return nil, err
 	}
 
 	return &updateData.LogisticsID, nil
 }
+
+func GetLogistics(ctx context.Context, secTaskId string) (*gorm_model.YoungeeTaskLogistics, error) {
+	db := GetWriteDB(ctx)
+	logistics := gorm_model.YoungeeTaskLogistics{}
+	err := db.Model(gorm_model.YoungeeTaskLogistics{}).Where("task_id", secTaskId).First(&logistics).Error
+	if err != nil {
+		return nil, err
+	}
+	return &logistics, nil
+}

+ 12 - 0
db/selection.go

@@ -232,3 +232,15 @@ func DeleteSecExampleBySelectionId(ctx context.Context, selectionId string) erro
 	}
 	return nil
 }
+
+// 更新选品结算金额
+func UpdateSelectionSettleMoney(ctx context.Context, selectionID string, payMoney float64) (bool, error) {
+	db := GetReadDB(ctx)
+	err := db.Model(gorm_model.YounggeeSelectionInfo{}).Where("selection_id", selectionID).
+		Updates(map[string]interface{}{"settlement_amount": gorm.Expr("settlement_amount + ?", payMoney)}).Error
+	if err != nil {
+		return false, err
+	}
+
+	return true, nil
+}

+ 3 - 1
db/task.go

@@ -193,6 +193,7 @@ func SetTaskFinish(ctx context.Context, TaskIDs []string) error {
 			fmt.Println("Error:", err)
 			return err
 		}
+		t := time.Now()
 		income := gorm_model.YounggeeTalentIncome{
 			TalentID:       taskInfo.TalentID,
 			ProjectID:      taskInfo.ProjectID,
@@ -202,7 +203,8 @@ func SetTaskFinish(ctx context.Context, TaskIDs []string) error {
 			Income:         strconv.FormatFloat(taskInfo.SettleAmount, 'f', 10, 32),
 			IncomeType:     1,
 			WithdrawStatus: 1,
-			IncomeAt:       time.Now(),
+			IncomeAt:       &t,
+			WithdrawAt:     nil,
 		}
 		err = CreateIncome(ctx, income, nil)
 		if err != nil {

+ 1 - 1
handler/UpdateSecTaskLogistics.go

@@ -43,7 +43,7 @@ func (c UpdateSecTaskLogistics) run() {
 		logrus.Info("UpdateSecTaskLogistics fail,req:%+v", c.req)
 		return
 	}
-	c.resp.Message = "成功添加发货信息"
+	c.resp.Message = "成功修改发货信息"
 	c.resp.Data = res
 }
 

+ 27 - 0
model/gorm_model/assignment.go

@@ -0,0 +1,27 @@
+// Code generated by sql2gorm. DO NOT EDIT.
+package gorm_model
+
+import (
+"time"
+)
+
+type YounggeeAssignmentInfo struct {
+	AssignmentID  int       `gorm:"column:assignment_id;primary_key;AUTO_INCREMENT"` // 作业id,递增
+	TaskID        string    `gorm:"column:task_id"`                                  // 任务id
+	LinkUrl       string    `gorm:"column:link_url"`                                 // 作业连接
+	PhotoUrl      string    `gorm:"column:photo_url"`                                // 作业截图
+	ReviseOpinion string    `gorm:"column:revise_opinion"`                           // 审核意见
+	IsSubmit      int       `gorm:"column:is_submit"`                                // 是否提交
+	IsReview      int       `gorm:"column:is_review;default:0"`                      // 是否审核
+	IsOk          int       `gorm:"column:is_ok"`                                    // 是否合格
+	CreateAt      time.Time `gorm:"column:create_at"`                                // 创建时间
+	SubmitAt      time.Time `gorm:"column:submit_at"`                                // 提交时间
+	AgreeAt       time.Time `gorm:"column:agree_at"`                                 // 同意时间
+	RejectAt      time.Time `gorm:"column:reject_at"`                                // 驳回时间
+}
+
+func (m *YounggeeAssignmentInfo) TableName() string {
+	return "younggee_assignment_info"
+}
+
+

+ 1 - 1
model/gorm_model/selection_task_info.go

@@ -23,7 +23,7 @@ type YounggeeSecTaskInfo struct {
 	SampleMode             int       `gorm:"column:sample_mode"`                           // 领样形式,1-3分别表示免费领样、垫付买样、不提供样品
 	TaskStatus             int       `gorm:"column:task_status;default:1"`                 // 任务状态 1待选 2已选 3落选
 	TaskStage              int       `gorm:"column:task_stage"`                            // 任务阶段,详情见info_sec_task_stage表
-	CreateDate             time.Time `gorm:"column:create_date;default:CURRENT_TIMESTAMP"` // 创建时间
+	CreateDate             time.Time `gorm:"column:create_date"` // 创建时间
 	SelectDate             time.Time `gorm:"column:select_date"`                           // 反选时间
 	DeliveryDate           time.Time `gorm:"column:delivery_date"`                         // 发货时间
 	CompleteDate           time.Time `gorm:"column:complete_date"`                         // 结束时间

+ 2 - 2
model/gorm_model/talent_income.go

@@ -18,8 +18,8 @@ type YounggeeTalentIncome struct {
 	Income         string    `gorm:"column:income"`          // 收益金额
 	IncomeType     int       `gorm:"column:income_type"`     // 收益类型,1-4分别表示任务收益、开团收益、样品返现、悬赏收益
 	WithdrawStatus int       `gorm:"column:withdraw_status"` // 提现状态,1-3分别表示可提现、提现中、已提现
-	IncomeAt       time.Time `gorm:"column:income_at"`       // 收益产生时间
-	WithdrawAt     time.Time `gorm:"column:withdraw_at"`     // 提现时间
+	IncomeAt       *time.Time `gorm:"column:income_at"`       // 收益产生时间
+	WithdrawAt     *time.Time `gorm:"column:withdraw_at"`     // 提现时间
 }
 
 func (m *YounggeeTalentIncome) TableName() string {

+ 24 - 10
model/http_model/GetSecTaskList.go

@@ -1,8 +1,6 @@
 package http_model
 
-import (
-	"time"
-)
+import "time"
 
 type GetSecTaskListRequest struct {
 	PageSize      int64  `json:"page_size"`
@@ -10,6 +8,7 @@ type GetSecTaskListRequest struct {
 	SelectionId   string `json:"selection_id"`
 	SecTaskStatus int    `json:"sec_task_status"`
 	SearchValue   string `json:"search_value"`
+	Type          int    `json:"type"` // 查询类型,1、2、3分别表示确定达人查询、发货管理查询、结算管理查询
 }
 
 type GetSecTaskListData struct {
@@ -18,13 +17,28 @@ type GetSecTaskListData struct {
 }
 
 type SecTaskInfo struct {
-	SelectionId        string    `json:"selection_id"`
-	PlatformNickname   string    `json:"platform_nickname"`                            // 帐号昵称
-	FansCount          string    `json:"fans_count"`                                   // 粉丝数
-	HomePageCaptureUrl string    `json:"home_page_capture_url"`                        // 主页截图链接
-	HomePageUrl        string    `json:"home_page_url"`                                // 主页链接
-	CreateDate         time.Time `json:"column:create_date;default:CURRENT_TIMESTAMP"` // 创建时间
-	SelectDate         time.Time `json:"column:select_date"`                           // 反选时间
+	SecTaskId             string    `json:"sec_task_id"`
+	PlatformNickname      string    `json:"platform_nickname"`     // 帐号昵称
+	FansCount             string    `json:"fans_count"`            // 粉丝数
+	HomePageCaptureUrl    string    `json:"home_page_capture_url"` // 主页截图链接
+	HomePageUrl           string    `json:"home_page_url"`         // 主页链接
+	RegionCode            int       `json:"region_code"`
+	DetailAddr            string    `json:"detail_addr"`            // 物流信息
+	CompanyName           string    `json:"company_name"`           // 物流公司
+	LogisticsNumber       string    `json:"logistics_number"`       // 物流单号
+	ExplorestoreStarttime time.Time `json:"explorestore_starttime"` // 线下探店-探店开始时间
+	ExplorestoreEndtime   time.Time `json:"explorestore_endtime"`   // 线下探店-探店结束时间
+	ExplorestorePeriod    string    `json:"explorestore_period"`    // 线下探店-探店持续时间
+	DataScreenshot        string    `json:"data_screenshot"`        // 数据截图
+	AssignmentLink        string    `json:"assignment_link"`        // 作业链接
+	ReturnMoney           string    `json:"return_money"`           // 返现
+	TaskReward            string    `json:"task_reward"`            // 悬赏金
+	IsPayReward           int       `json:"is_pay_reward"`          // 是否给悬赏金
+	IsPayPayment          int       `json:"is_pay_payment"`         // 是否返现
+	CreateDate            string    `json:"create_date"`            // 创建时间
+	SelectDate            string    `json:"select_date"`            // 反选时间
+	DeliveryDate          string    `json:"delivery_date"`          // 发货时间
+	CompleteDate          string    `json:"complete_date"`          // 结算时间
 }
 
 func NewGetSecTaskListRequest() *GetSecTaskListRequest {

+ 1 - 0
model/http_model/SettleSecTask.go

@@ -1,6 +1,7 @@
 package http_model
 
 type SettleSecTaskRequest struct {
+	EnterpriseId  string `json:"enterprise_id"`
 	SelectionID   string `json:"selection_id"`    // 选品项目id
 	TaskID        string `json:"task_id"`         // 任务id
 	IsReturnMoney int    `json:"is_return_money"` //是否返回样品钱

+ 11 - 2
pack/sec_task_list.go

@@ -2,6 +2,7 @@ package pack
 
 import (
 	"github.com/tidwall/gjson"
+	"strconv"
 	"youngee_b_api/model/gorm_model"
 	"youngee_b_api/model/http_model"
 
@@ -19,12 +20,20 @@ func GormSecTaskListToHttpSecTaskList(secTaskList []*gorm_model.YounggeeSecTaskI
 
 func GormSecTaskToHttpSecTask(secTask *gorm_model.YounggeeSecTaskInfo) *http_model.SecTaskInfo {
 	TalentPlatformInfoSnap := secTask.TalentPlatformInfoSnap
+	regionCode, _ := strconv.Atoi(conv.MustString(gjson.Get(secTask.TalentPostAddrSnap, "region_code"), ""))
 	return &http_model.SecTaskInfo{
+		SecTaskId:          secTask.TaskID,
 		PlatformNickname:   conv.MustString(gjson.Get(TalentPlatformInfoSnap, "platform_nickname"), ""),
 		FansCount:          conv.MustString(gjson.Get(TalentPlatformInfoSnap, "fans_count"), ""),
 		HomePageCaptureUrl: conv.MustString(gjson.Get(TalentPlatformInfoSnap, "home_page_capture_url"), ""),
 		HomePageUrl:        conv.MustString(gjson.Get(TalentPlatformInfoSnap, "home_page_url"), ""),
-		CreateDate:         secTask.CreateDate,
-		SelectDate:         secTask.SelectDate,
+		RegionCode:         regionCode,
+		DetailAddr:         conv.MustString(gjson.Get(secTask.TalentPostAddrSnap, "detail_addr"), "") + " " + conv.MustString(gjson.Get(secTask.TalentPostAddrSnap, "receiver_name"), "") + " " + conv.MustString(gjson.Get(secTask.TalentPostAddrSnap, "phone_number"), ""),
+		CreateDate:         conv.MustString(secTask.CreateDate, ""),
+		SelectDate:         conv.MustString(secTask.SelectDate, ""),
+		DeliveryDate:       conv.MustString(secTask.DeliveryDate, ""),
+		CompleteDate:       conv.MustString(secTask.CompleteDate, ""),
+		IsPayReward:        secTask.IsPayReward,
+		IsPayPayment:       secTask.IsPayPayment,
 	}
 }

+ 1 - 1
route/init.go

@@ -146,7 +146,7 @@ func InitRoute(r *gin.Engine) {
 		s.POST("/selection/create", handler.WrapCreateSelectionHandler)                       // 创建选品
 		s.POST("/selection/update", handler.WrapUpdateSelectionHandler)                       // 更新选品
 		s.POST("/selection/pay", handler.WrapPaySelectionHandler)                             // 支付选品项目
-		s.POST("/selection/task/list", handler.WrapGetSecTaskListHandler)                     // 查询选品的任务列表
+		s.POST("/selection/task/list", handler.WrapGetSecTaskListHandler)                     // 查询选品的任务列表(确定、发货、结算)
 		s.POST("/selection/task/coop/pass", handler.WrapPassSecTaskCoopHandler)               // 同意任务合作
 		s.POST("/selection/task/coop/refuse", handler.WrapRefuseSecTaskCoopHandler)           // 拒绝任务合作
 		s.POST("/selection/task/logistics/create", handler.WrapCreateSecTaskLogisticsHandler) // 上传物流信息

+ 15 - 2
service/autoTask.go

@@ -9,9 +9,9 @@ import (
 
 func AutoTask() error {
 	c := cron.New(cron.WithSeconds())
-	//spec := "0 */30 * * * ?" //cron表达式,每半小时执行一次
+	spec := "0 */30 * * * ?" //cron表达式,每半小时执行一次
 	//spec := "0 */1 * * * ?" //cron表达式,每1分钟一次
-	spec := "*/10 * * * * ?" //cron表达式,每10秒一次
+	//spec := "*/10 * * * * ?" //cron表达式,每10秒一次
 	_, err1 := c.AddFunc(spec, AutoTaskUpdateStatus)
 	if err1 != nil {
 		log.Println("service [AutoTaskUpdateStatus] error:", err1)
@@ -22,6 +22,11 @@ func AutoTask() error {
 		log.Println("service [AutoTaskUpdateApplyTimes] error:", err2)
 		return err2
 	}
+	_, err3 := c.AddFunc(spec, AutoTaskCompleteSelection)
+	if err3 != nil {
+		log.Println("service [AutoTaskCompleteSecTask] error:", err2)
+		return err3
+	}
 	c.Start()
 	return nil
 }
@@ -41,3 +46,11 @@ func AutoTaskUpdateApplyTimes() {
 		log.Println("AutoUpdateApplyTimes error : ", err)
 	}
 }
+
+func AutoTaskCompleteSelection() {
+	err := db.AutoCompleteSelection()
+	log.Println("AutoUpdateApplyTimes is running ,Time :", time.Now())
+	if err != nil {
+		log.Println("AutoUpdateApplyTimes error : ", err)
+	}
+}

+ 3 - 1
service/project_pay.go

@@ -166,6 +166,7 @@ func (p *projectPay) SpecialSettlePay(ctx *gin.Context, req *http_model.SpecialS
 			fmt.Println("Error:", err)
 			return err
 		}
+		t := time.Now()
 		income := gorm_model.YounggeeTalentIncome{
 			TalentID:       task.TalentID,
 			ProjectID:      task.ProjectID,
@@ -175,7 +176,8 @@ func (p *projectPay) SpecialSettlePay(ctx *gin.Context, req *http_model.SpecialS
 			Income:         strconv.FormatFloat(req.Amount, 'f', 10, 32),
 			IncomeType:     1,
 			WithdrawStatus: 1,
-			IncomeAt:       time.Now(),
+			IncomeAt:       &t,
+			WithdrawAt:     nil,
 		}
 		err = db.CreateIncome(ctx, income, tx)
 		if err != nil {

+ 11 - 5
service/sectask_service/logistics.go

@@ -45,7 +45,7 @@ func (*logistics) Create(ctx context.Context, request http_model.CreateSecTaskLo
 	updatdSecTask := gorm_model.YounggeeSecTaskInfo{
 		TaskID:          request.TaskID,
 		LogisticsStatus: 2,
-		TaskStage:       7,
+		TaskStage:       8,
 		DeliveryDate:    time.Now(),
 	}
 	_, err = db.UpdateSecTask(ctx, updatdSecTask)
@@ -54,14 +54,14 @@ func (*logistics) Create(ctx context.Context, request http_model.CreateSecTaskLo
 		return nil, err
 	}
 
-	// 记录任务日志-发货
+	// 插入任务日志、达人消息
 	err = db.CreateTaskLog(ctx, newLogistics.TaskID, "发货时间")
 	if err != nil {
 		logrus.WithContext(ctx).Errorf("[newLogistics service] call CreateTaskLog error,err:%+v", err)
 		return nil, err
 	}
 
-	err = db.CreateMessageByTaskId(ctx, 8, 2, newLogistics.TaskID)
+	err = db.CreateMessageBySecTaskId(ctx, 8, 2, newLogistics.TaskID)
 	if err != nil {
 		logrus.WithContext(ctx).Errorf("[newLogistics service] call CreateMessageByTaskId error,err:%+v", err)
 		return nil, err
@@ -74,8 +74,14 @@ func (*logistics) Create(ctx context.Context, request http_model.CreateSecTaskLo
 
 func (*logistics) Update(ctx context.Context, request http_model.UpdateSecTaskLogisticsRequest) (*http_model.UpdateSecTaskLogisticsData, error) {
 	ThingsType := request.ThingsType
+	// 根据任务查询物流id
+	logisticsInfo, err := db.GetLogistics(ctx, request.TaskID)
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[newLogistics service] call UpdatenewLogistics error,err:%+v", err)
+		return nil, err
+	}
 	newLogistics := gorm_model.YoungeeTaskLogistics{
-		LogisticsID:           request.LogisticsId,
+		LogisticsID:           logisticsInfo.LogisticsID,
 		TaskID:                request.TaskID,
 		ThingsType:            int64(ThingsType),
 		ExplorestoreStarttime: time.Now(),
@@ -94,7 +100,7 @@ func (*logistics) Update(ctx context.Context, request http_model.UpdateSecTaskLo
 		newLogistics.ExplorestoreEndtime = ExplorestoreEndtime
 	}
 
-	_, err := db.UpdateSecTaskLogistics(ctx, newLogistics)
+	_, err = db.UpdateSecTaskLogistics(ctx, newLogistics)
 	if err != nil {
 		logrus.WithContext(ctx).Errorf("[newLogistics service] call UpdatenewLogistics error,err:%+v", err)
 		return nil, err

+ 60 - 6
service/sectask_service/sectask.go

@@ -20,12 +20,47 @@ type selectionTask struct {
 }
 
 func (*selectionTask) GetList(ctx context.Context, request http_model.GetSecTaskListRequest) (*http_model.GetSecTaskListData, error) {
+	// sec_task:任务id、帐号昵称、粉丝数、收货地址、主页截图、主页链接、确认时间、申请时间、结算时间
+	// youngee_task_logistics: 物流公司、物流单号、发货时间、探店时间
+	// younggee_assignment_info:数据截图、作业链接
+	// selection_info: 返现金额、悬赏金额
+	// 1. 根据选品任务阶段、账号昵称or任务id查询任务基本信息(包括任务id、账号昵称、粉丝数、主页截图、主页链接、申请时间)
 	secTaskList, total, err := db.GetSecTaskList(ctx, request.SelectionId, request.SecTaskStatus, request.SearchValue, request.PageSize, request.PageNum)
 	if err != nil {
-		logrus.WithContext(ctx).Errorf("[sectask_service service] call GetAllSelection error,err:%+v", err)
+		logrus.WithContext(ctx).Errorf("[sectask_service service] call GetSecTaskList error,err:%+v", err)
 		return nil, err
 	}
 
+	// 2. 根据不同查询类型查询补充信息
+	switch request.Type {
+	case 1: // 确定达人查询
+		// 确定达人不需要额外信息
+		break
+	case 2: // 发货管理查询 youngee_task_logistics
+		//发货管理根据任务阶段和商品类型查询物流信息
+		// 查询商品类型
+		product, err := db.GetProductType(ctx, request.SelectionId)
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[sectask_service service] call GetAllSelection error,err:%+v", err)
+			return nil, err
+		}
+		secTaskList, err = db.GetSecTaskLogisticsList(ctx, secTaskList, request.SecTaskStatus, *product)
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[sectask_service service] call GetSecTaskLogisticsList error,err:%+v", err)
+			return nil, err
+		}
+		break
+	case 3: // 结算管理查询 younggee_assignment_info
+		secTaskList, err = db.GetSecTaskSettleList(ctx, secTaskList, request.SelectionId, request.SecTaskStatus)
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[sectask_service service] call GetSecTaskSettleList error,err:%+v", err)
+			return nil, err
+		}
+		break
+	default: // 参数有误
+		break
+	}
+
 	selectionListData := http_model.GetSecTaskListData{
 		Total:       conv.MustString(total, ""),
 		SecTaskList: secTaskList,
@@ -120,10 +155,11 @@ func (*selectionTask) Settle(ctx context.Context, entersizeId string, request ht
 	if rewardMoney+returnMoney != payMoney {
 		return nil, errors.New("结算金额有误")
 	}
-	// 3. 扣除企业账户余额
-	_, err = db.UpdateEnterpriseBalance(ctx, entersizeId, 0, -payMoney, payMoney)
+
+	// 3. 更新选品结算金额
+	_, err = db.UpdateSelectionSettleMoney(ctx, selection.SelectionID, payMoney)
 	if err != nil {
-		logrus.WithContext(ctx).Errorf("[sectask_service service] call UpdateEnterpriseBalance error,err:%+v", err)
+		logrus.WithContext(ctx).Errorf("[sectask_service service] call UpdateSelectionSettleMoney error,err:%+v", err)
 		return nil, err
 	}
 
@@ -132,6 +168,8 @@ func (*selectionTask) Settle(ctx context.Context, entersizeId string, request ht
 		TaskID:           request.TaskID,
 		TaskStage:        10,
 		AssignmentStatus: 5,
+		IsPayReward:      request.IsPayReward,
+		IsPayPayment:     request.IsReturnMoney,
 		CompleteDate:     time.Now(),
 	}
 	_, err = db.UpdateSecTask(ctx, updateSecTaskData)
@@ -139,9 +177,23 @@ func (*selectionTask) Settle(ctx context.Context, entersizeId string, request ht
 		logrus.WithContext(ctx).Errorf("[sectask_service service] call UpdateSecTask error,err:%+v", err)
 		return nil, err
 	}
+
 	// 5. 添加任务日志和达人消息
+	err = db.CreateTaskLog(ctx, request.TaskID, "结算时间")
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[sectask_service service] call CreateTaskLog error,err:%+v", err)
+		return nil, err
+	}
+
+	err = db.CreateMessageBySecTaskId(ctx, 5, 1, request.TaskID)
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[sectask_service service] call CreateMessageBySecTaskId error,err:%+v", err)
+		return nil, err
+	}
+
 	// 6. 创建选品收益记录
 	// 返现收益
+	t := time.Now()
 	if request.IsReturnMoney == 1 {
 		income := gorm_model.YounggeeTalentIncome{
 			TalentID:       secTask.TalentID,
@@ -152,7 +204,8 @@ func (*selectionTask) Settle(ctx context.Context, entersizeId string, request ht
 			Income:         strconv.FormatFloat(returnMoney, 'f', 10, 32),
 			IncomeType:     1,
 			WithdrawStatus: 1,
-			IncomeAt:       time.Now(),
+			IncomeAt:       &t,
+			WithdrawAt:     nil,
 		}
 		err = db.CreateIncome(ctx, income, nil)
 		if err != nil {
@@ -171,7 +224,8 @@ func (*selectionTask) Settle(ctx context.Context, entersizeId string, request ht
 			Income:         strconv.FormatFloat(rewardMoney, 'f', 10, 32),
 			IncomeType:     1,
 			WithdrawStatus: 1,
-			IncomeAt:       time.Now(),
+			IncomeAt:       &t,
+			WithdrawAt:     nil,
 		}
 		err = db.CreateIncome(ctx, income, nil)
 		if err != nil {