Ohio-HYF vor 1 Jahr
Ursprung
Commit
cb446a2d6d

+ 15 - 0
db/sectask.go

@@ -12,6 +12,21 @@ import (
 	"youngee_b_api/pack"
 )
 
+func GetSecTaskById(ctx context.Context, secTaskId string) (*gorm_model.YounggeeSecTaskInfo, error) {
+	db := GetWriteDB(ctx)
+	secTaskInfo := gorm_model.YounggeeSecTaskInfo{}
+	whereCondition := gorm_model.YounggeeSecTaskInfo{TaskID: secTaskId}
+	result := db.Where(&whereCondition).First(&secTaskInfo)
+	if result.Error != nil {
+		if errors.Is(result.Error, gorm.ErrRecordNotFound) {
+			return nil, nil
+		} else {
+			return nil, result.Error
+		}
+	}
+	return &secTaskInfo, nil
+}
+
 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{

+ 15 - 0
db/talent_income.go

@@ -0,0 +1,15 @@
+package db
+
+import (
+	"context"
+	"youngee_b_api/model/gorm_model"
+)
+
+func CreateIncome(ctx context.Context, income gorm_model.YounggeeTalentIncome) error {
+	db := GetWriteDB(ctx)
+	err := db.Create(&income).Error
+	if err != nil {
+		return err
+	}
+	return nil
+}

+ 62 - 0
handler/SettleSecTask.go

@@ -0,0 +1,62 @@
+package handler
+
+import (
+	"youngee_b_api/consts"
+	"youngee_b_api/middleware"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/service/sectask_service"
+	"youngee_b_api/util"
+
+	"github.com/gin-gonic/gin"
+	"github.com/sirupsen/logrus"
+)
+
+func WrapSettleSecTaskHandler(ctx *gin.Context) {
+	handler := newSettleSecTaskHandler(ctx)
+	baseRun(handler)
+}
+
+type SettleSecTask struct {
+	ctx  *gin.Context
+	req  *http_model.SettleSecTaskRequest
+	resp *http_model.CommonResponse
+}
+
+func (c SettleSecTask) getContext() *gin.Context {
+	return c.ctx
+}
+
+func (c SettleSecTask) getResponse() interface{} {
+	return c.resp
+}
+
+func (c SettleSecTask) getRequest() interface{} {
+	return c.req
+}
+
+func (c SettleSecTask) run() {
+	enterpriseID := middleware.GetSessionAuth(c.ctx).EnterpriseID
+	data := http_model.SettleSecTaskRequest{}
+	data = *c.req
+	res, err := sectask_service.SelectionTask.Settle(c.ctx, enterpriseID, data)
+	if err != nil {
+		logrus.Errorf("[SettleSecTask] call SettleSecTask err:%+v\n", err)
+		util.HandlerPackErrorResp(c.resp, consts.ErrorInternal, "")
+		logrus.Info("SettleSecTask fail,req:%+v", c.req)
+		return
+	}
+	c.resp.Message = "成功添加发货信息"
+	c.resp.Data = res
+}
+
+func (c SettleSecTask) checkParam() error {
+	return nil
+}
+
+func newSettleSecTaskHandler(ctx *gin.Context) *SettleSecTask {
+	return &SettleSecTask{
+		ctx:  ctx,
+		req:  http_model.NewSettleSecTaskRequest(),
+		resp: http_model.NewSettleSecTaskResponse(),
+	}
+}

+ 29 - 0
model/gorm_model/talent_income.go

@@ -0,0 +1,29 @@
+// Code generated by sql2gorm. DO NOT EDIT.
+package gorm_model
+
+import (
+"time"
+)
+
+type YounggeeTalentIncome struct {
+	ID             int       `gorm:"column:id;primary_key"`  // 递增id
+	TalentID       string    `gorm:"column:talent_id"`       // 达人id,对应youngee_talent_info中id字段
+	ProjectID      string    `gorm:"column:project_id"`      // 项目id
+	SelectionID    string    `gorm:"column:selection_id"`    // 选品id
+	TaskID         string    `gorm:"column:task_id"`         // 任务id
+	SectaskID      string    `gorm:"column:sectask_id"`      // 选品任务id
+	BrandName      string    `gorm:"column:brand_name"`      // 品牌名称
+	TaskName       string    `gorm:"column:task_name"`       // 任务名称
+	TeamID         string    `gorm:"column:team_id"`         // young之团id
+	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"`     // 提现时间
+}
+
+func (m *YounggeeTalentIncome) TableName() string {
+	return "younggee_talent_income"
+}
+
+

+ 22 - 0
model/http_model/SettleSecTask.go

@@ -0,0 +1,22 @@
+package http_model
+
+type SettleSecTaskRequest struct {
+	SelectionID   string `json:"selection_id"`    // 选品项目id
+	TaskID        string `json:"task_id"`         // 任务id
+	IsReturnMoney int    `json:"is_return_money"` //是否返回样品钱
+	IsPayReward   int    `json:"is_pay_reward"`   //是否给悬赏金
+	TotalPayMoney string `json:"total_pay_money"` //合计结算金额
+}
+
+type SettleSecTaskData struct {
+}
+
+func NewSettleSecTaskRequest() *SettleSecTaskRequest {
+	return new(SettleSecTaskRequest)
+}
+
+func NewSettleSecTaskResponse() *CommonResponse {
+	resp := new(CommonResponse)
+	resp.Data = new(SettleSecTaskData)
+	return resp
+}

+ 1 - 1
route/init.go

@@ -150,6 +150,6 @@ func InitRoute(r *gin.Engine) {
 		s.POST("/selection/task/coop/refuse", handler.WrapRefuseSecTaskCoopHandler)           // 拒绝任务合作
 		s.POST("/selection/task/logistics/create", handler.WrapCreateSecTaskLogisticsHandler) // 上传物流信息
 		s.POST("/selection/task/logistics/update", handler.WrapUpdateSecTaskLogisticsHandler) // 修改物流信息
-		//s.POST("/selection/task/settle", handler.WrapUpdateSecTaskLogisticsHandler)           // 修改物流信息
+		s.POST("/selection/task/settle", handler.WrapSettleSecTaskHandler)                    // 结算
 	}
 }

+ 94 - 0
service/sectask_service/sectask.go

@@ -2,9 +2,15 @@ package sectask_service
 
 import (
 	"context"
+	"encoding/json"
+	"errors"
+	"fmt"
 	"github.com/issue9/conv"
 	"github.com/sirupsen/logrus"
+	"strconv"
+	"time"
 	"youngee_b_api/db"
+	"youngee_b_api/model/gorm_model"
 	"youngee_b_api/model/http_model"
 )
 
@@ -53,3 +59,91 @@ func (*selectionTask) RefuseCoop(ctx context.Context, request http_model.RefuseS
 
 	return &selectionListData, nil
 }
+
+func (*selectionTask) Settle(ctx context.Context, entersizeId string, request http_model.SettleSecTaskRequest) (*http_model.SettleSecTaskData, error) {
+	// 1. 解析request data
+	payMoney, err := strconv.ParseFloat(request.TotalPayMoney, 64)
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[sectask_service service] call strconv.ParseFloat() error,err:%+v", err)
+		return nil, err
+	}
+	// 2. 校验:任务是否正常(处于待结算阶段);企业账户可用余额是否充足;若返现则校验达人是否垫付买样;若有悬赏金额则校验是否为悬赏任务
+	// 1) 校验企业账户余额是否充足
+	entersize, err := db.GetEnterpriseByEnterpriseID(ctx, entersizeId)
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[sectask_service service] call GetEnterpriseByEnterpriseID error,err:%+v", err)
+		return nil, err
+	}
+	if entersize.AvailableBalance < payMoney {
+		return nil, errors.New("账户余额不足")
+	}
+	// 2) 若返现则校验达人是否垫付买样;若有悬赏金额则校验是否为悬赏任务
+	selection, err := db.GetSelectionById(ctx, request.SelectionID)
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[sectask_service service] call GetSelectionById error,err:%+v", err)
+		return nil, err
+	}
+	if selection.SampleMode != 2 && request.IsReturnMoney == 1 {
+		return nil, errors.New("免费领养任务不能返样品钱")
+	}
+	if selection.TaskMode != 1 && request.IsPayReward == 1 {
+		return nil, errors.New("非悬赏任务不能支付悬赏")
+	}
+	// 3) 校验任务是否处于待结算阶段
+	secTask, err := db.GetSecTaskById(ctx, request.TaskID)
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[sectask_service service] call GetSecTaskById error,err:%+v", err)
+		return nil, err
+	}
+	if secTask.TaskStage != 9 && secTask.TaskStatus != 2 {
+		return nil, errors.New("该任务暂不可结算")
+	}
+
+	// 3. 扣除企业账户余额
+	_, err = db.UpdateEnterpriseBalance(ctx, entersizeId, 0, -payMoney, payMoney)
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[sectask_service service] call UpdateEnterpriseBalance error,err:%+v", err)
+		return nil, err
+	}
+
+	// 4. 更新选品任务阶段
+	updateSecTaskData := gorm_model.YounggeeSecTaskInfo{
+		TaskID:           request.TaskID,
+		TaskStage:        10,
+		AssignmentStatus: 5,
+		CompleteDate:     time.Now(),
+	}
+	_, err = db.UpdateSecTask(ctx, updateSecTaskData)
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[sectask_service service] call UpdateSecTask error,err:%+v", err)
+		return nil, err
+	}
+	// 5. 添加任务日志和达人消息
+	// 6. 创建选品收益记录
+	var product gorm_model.YounggeeProduct
+	if err = json.Unmarshal([]byte(selection.ProductSnap), &product); err != nil {
+		fmt.Println("Error:", err)
+		return nil, err
+	}
+	income := gorm_model.YounggeeTalentIncome{
+		TalentID:       secTask.TalentID,
+		SelectionID:    secTask.SelectionID,
+		SectaskID:      secTask.TaskID,
+		BrandName:      product.BrandName,
+		TaskName:       selection.SelectionName,
+		Income:         request.TotalPayMoney,
+		IncomeType:     1,
+		WithdrawStatus: 1,
+		IncomeAt:       time.Now(),
+	}
+	err = db.CreateIncome(ctx, income)
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[sectask_service service] call CreateIncome error,err:%+v", err)
+		return nil, err
+	}
+	// 7. 若有young之团存在,则为young之团创建收益
+
+	settleSecTaskData := http_model.SettleSecTaskData{}
+
+	return &settleSecTaskData, nil
+}

+ 0 - 1
service/sectask_service/settle.go

@@ -1 +0,0 @@
-package sectask_service

+ 1 - 1
util/structFunc.go

@@ -18,5 +18,5 @@ func MergeStructValue(s1 interface{}, s2 interface{}) interface{} {
 		}
 	}
 
-	return new
+	return v1
 }