Browse Source

Merge branch 'develop' of 139.9.53.143:HolaBIP/youngee_b_api into develop

shenzekai 2 years ago
parent
commit
be78392573

+ 41 - 0
db/info_pricing_strategy.go

@@ -0,0 +1,41 @@
+package db
+
+import (
+	"context"
+	"fmt"
+	"youngee_b_api/model/gorm_model"
+
+	log "github.com/sirupsen/logrus"
+)
+
+func GetPricingStrategy(ctx context.Context, fansLow int64, fansUp int64, feeForm int64, platForm int64) (*gorm_model.InfoPricingStrategy, error) {
+	db := GetReadDB(context.Background())
+	PricingStrategys := []gorm_model.InfoPricingStrategy{}
+	whereStr := fmt.Sprintf("fee_form = %d and platform = %d and fans_low <= %d and fans_up >= %d", feeForm, platForm, fansLow, fansLow)
+	orStr := fmt.Sprintf("fee_form = %d and platform = %d and fans_low <= %d and fans_up >= %d", feeForm, platForm, fansUp, fansUp)
+	err := db.Model(gorm_model.InfoPricingStrategy{}).Where(whereStr).Or(orStr).Scan(&PricingStrategys).Error
+	if err != nil {
+		log.Println("DB GetLastAutoDefaultID:", err)
+		return nil, err
+	}
+	PricingStrategy := gorm_model.InfoPricingStrategy{}
+	if feeForm == 1 {
+		var maxCharge float64 = 0
+		for _, v := range PricingStrategys {
+			if v.ServiceCharge >= maxCharge {
+				maxCharge = v.ServiceCharge
+				PricingStrategy = v
+			}
+		}
+	} else {
+		var maxRate int64 = 0
+		for _, v := range PricingStrategys {
+			if v.ServiceRate >= maxRate {
+				maxRate = v.ServiceRate
+				PricingStrategy = v
+			}
+		}
+	}
+	//fmt.Printf("auto task %+v %+v", result, LastTask)
+	return &PricingStrategy, nil
+}

+ 25 - 0
db/task.go

@@ -96,6 +96,31 @@ func ChangeTaskStatus(ctx context.Context, taskIds []string, taskStatus string)
 	return recruitStrategysIDs, nil
 }
 
+func ChangeSpecialTaskStatus(ctx context.Context, taskIds []string, taskStatus string, taskStage string) error {
+	db := GetReadDB(ctx)
+	status, err := strconv.Atoi(taskStatus)
+	stage, err := strconv.Atoi(taskStage)
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[ChangeTaskStatus]1 error query mysql total, err:%+v", err)
+		return err
+	}
+	if err := db.Debug().Model(&gorm_model.YoungeeTaskInfo{}).Where("task_id IN ?", taskIds).
+		Updates(gorm_model.YoungeeTaskInfo{TaskStatus: status, TaskStage: stage}).Error; err != nil {
+		logrus.WithContext(ctx).Errorf("[ChangeTaskStatus]2 error query mysql total, err:%+v", err)
+		return err
+	}
+	return nil
+}
+
+func UpdateTaskSelectAtByProjectId(ctx context.Context, projectID int64, taskStatus int64) error {
+	db := GetReadDB(ctx)
+	err := db.Model(gorm_model.YoungeeTaskInfo{}).Where("project_id=? and task_status = ?", projectID, taskStatus).Update("select_date", time.Now()).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[UpdateTaskStage]2 error query mysql total, err:%+v", err)
+		return err
+	}
+	return nil
+}
 func UpdateTaskStageByProjectId(ctx context.Context, projectID int64, taskStatus int64, taskStage int64) error {
 	db := GetReadDB(ctx)
 	err := db.Model(gorm_model.YoungeeTaskInfo{}).Where("project_id=? and task_status = ?", projectID, taskStatus).Update("task_stage", taskStage).Error

+ 24 - 0
db/task_log.go

@@ -0,0 +1,24 @@
+package db
+
+import (
+	"context"
+	"time"
+	"youngee_b_api/model/gorm_model"
+
+	"github.com/sirupsen/logrus"
+)
+
+func CreateTaskLog(ctx context.Context, taskId int64, log string) error {
+	db := GetReadDB(ctx)
+	taskLog := gorm_model.YounggeeTaskLog{
+		TaskID:  taskId,
+		Content: log,
+		LogAt:   time.Now(),
+	}
+	err := db.Model(gorm_model.YounggeeTaskLog{}).Create(&taskLog).Error
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[Sketch db] Insert YounggeeTaskLog error,err:%+v", err)
+		return err
+	}
+	return nil
+}

+ 59 - 0
handler/GetServiceFee.go

@@ -0,0 +1,59 @@
+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 WrapGetServiceChargeHandler(ctx *gin.Context) {
+	handler := newGetServiceChargeHandler(ctx)
+	baseRun(handler)
+}
+
+func newGetServiceChargeHandler(ctx *gin.Context) *GetServiceChargeHandler {
+	return &GetServiceChargeHandler{
+		req:  http_model.NewGetServiceChargeRequest(),
+		resp: http_model.NewGetServiceChargeResponse(),
+		ctx:  ctx,
+	}
+}
+
+type GetServiceChargeHandler struct {
+	req  *http_model.GetServiceChargeRequest
+	resp *http_model.CommonResponse
+	ctx  *gin.Context
+}
+
+func (h *GetServiceChargeHandler) getRequest() interface{} {
+	return h.req
+}
+func (h *GetServiceChargeHandler) getContext() *gin.Context {
+	return h.ctx
+}
+func (h *GetServiceChargeHandler) getResponse() interface{} {
+	return h.resp
+}
+
+func (h *GetServiceChargeHandler) run() {
+	data := http_model.GetServiceChargeRequest{}
+	data = *h.req
+	res, err := service.Project.GetServiceCharge(h.ctx, data)
+	if err != nil {
+		logrus.Errorf("[GetServiceChargeHandler] call GetServiceCharge err:%+v\n", err)
+		util.HandlerPackErrorResp(h.resp, consts.ErrorInternal, "")
+		log.Info("GetServiceCharge fail,req:%+v", h.req)
+		return
+	}
+	h.resp.Message = ""
+	h.resp.Data = res
+}
+
+func (h *GetServiceChargeHandler) checkParam() error {
+	return nil
+}

+ 16 - 6
handler/project_change_taskStatus.go

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

+ 28 - 0
model/gorm_model/info_pricing_strategy.go

@@ -0,0 +1,28 @@
+// Code generated by sql2gorm. DO NOT EDIT.
+package gorm_model
+
+import (
+	"time"
+)
+
+type InfoPricingStrategy struct {
+	ID            int64       `gorm:"column:id;primary_key;AUTO_INCREMENT"` //  id
+	ProjectType   int64       `gorm:"column:project_type;NOT NULL"`         // 项目类型,0表示不限,1为全流程项目
+	StrategyId    string    `gorm:"column:strategyId;NOT NULL"`           // 定价策略编号
+	FeeForm       int64       `gorm:"column:fee_form;NOT NULL"`             // 稿费形式,1,2,3分别代表产品置换、固定稿费、自报价
+	Platform      int64       `gorm:"column:platform;NOT NULL"`             // 项目平台,1-7分别代表小红书、抖音、微博、快手、b站、大众点评、知乎
+	FansLow       int64       `gorm:"column:fans_low;NOT NULL"`             // 对应粉丝量下限
+	FansUp        int64       `gorm:"column:fans_up;NOT NULL"`              // 对应粉丝量上限
+	ServiceCharge float64       `gorm:"column:service_charge"`                // 服务费,稿费形式为产品置换时填写,可以为空
+	BaseOffer     float64   `gorm:"column:base_offer"`                    // 基础报价
+	Status        int64       `gorm:"column:status;NOT NULL"`               // 定价策略当前状态,0表示正常,1表示禁用
+	ServiceRate   int64       `gorm:"column:service_rate"`                  // 服务费率*1000,稿费形式为固定稿费和自报价时填写,可以为空
+	UpdateID      int64       `gorm:"column:update_id"`                     // 修改管理人员id,对应user表中主键
+	UpdateAt      time.Time `gorm:"column:update_at"`                     // 修改时间
+	CreateAt      time.Time `gorm:"column:create_at;NOT NULL"`            // 创建时间
+}
+
+func (m *InfoPricingStrategy) TableName() string {
+	return "info_pricing_strategy"
+}
+

+ 20 - 19
model/gorm_model/project.go

@@ -6,36 +6,37 @@ import (
 )
 
 type ProjectInfo struct {
-	ProjectID         int64       `gorm:"column:project_id;primary_key;AUTO_INCREMENT"` // 项目id
-	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分别代表小红书、抖音、微博、快手、b站、大众点评、知乎
-	ProjectForm       int64       `gorm:"column:project_form"`                          // 项目形式,1-4分别代表实体商品寄拍、虚拟产品测评、线下探店打卡、素材微原创
-	TalentType        string    `gorm:"column:talent_type"`                           // 达人类型
+	ProjectID         int64      `gorm:"column:project_id;primary_key;AUTO_INCREMENT"` // 项目id
+	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分别代表小红书、抖音、微博、快手、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      int64       `gorm:"column:enterprise_id"`                         // 所属企业id
-	ProductID         int64       `gorm:"column:product_id"`                            // 关联商品id
+	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      int64      `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"`                              // 稿费形式列表
+	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"`                        // 支付金额
+	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分别表示逾期未支付、项目存在风险
+	FailReason        int64      `gorm:"column:fail_reason"`                           // 失效原因,1、2分别表示逾期未支付、项目存在风险
 	PassAt            *time.Time `gorm:"column:pass_at"`                               // 审核通过时间
 	FinishAt          *time.Time `gorm:"column:finish_at"`                             // 结案时间
+	EstimatedCost     float64     `gorm:"column:estimated_cost"`                        // 预估成本
+	IsRead            int64      `gorm:"column:is_read"`                               // 是否已读
 }
 
 func (m *ProjectInfo) TableName() string {
 	return "project_info"
 }
-

+ 23 - 22
model/gorm_model/recruit_strategy.go

@@ -3,28 +3,29 @@ 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"`                                 // 招募数量
-	Offer             int64 `gorm:"column:offer"`                                          // 报价
-	ProjectID         int64 `gorm:"column:project_id"`                                     // 所属项目id
-	ServiceCharge     int64 `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"`                                      // 报价上限
-	MinOffer          int64 `gorm:"column:min_offer"`                                      // 报价下限
-	FanNumber         int64 `gorm:"column:fan_number"`                                     // 总粉丝量
-	PlayNumber        int64 `gorm:"column:play_number"`                                    // 总播放量
-	LikeNumber        int64 `gorm:"column:like_number"`                                    // 总点赞数
-	CollectNumber     int64 `gorm:"column:collect_number"`                                 // 总收藏量
-	CommentNumber     int64 `gorm:"column:comment_number"`                                 // 总评论数
-	FinishNumber      int64 `gorm:"column:finish_number"`                                  // 结案数量
-	TotalOffer        int64 `gorm:"column:total_offer"`                                    // 支付合计
+	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         int64    `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        int64    `gorm:"column:total_offer;default:0"`                          // 支付合计
 }
 
 func (m *RecruitStrategy) TableName() string {

+ 18 - 0
model/gorm_model/task_log.go

@@ -0,0 +1,18 @@
+// Code generated by sql2gorm. DO NOT EDIT.
+package gorm_model
+
+import (
+	"time"
+)
+
+type YounggeeTaskLog struct {
+	LogID   int64       `gorm:"column:log_id;primary_key;AUTO_INCREMENT"` // 任务日志id
+	TaskID  int64       `gorm:"column:task_id;NOT NULL"`                  // 任务id
+	Content string    `gorm:"column:content;NOT NULL"`                  // 内容
+	LogAt   time.Time `gorm:"column:log_at;NOT NULL"`                   // 时间
+}
+
+func (m *YounggeeTaskLog) TableName() string {
+	return "younggee_task_log"
+}
+

+ 22 - 0
model/http_model/GetServiceFee.go

@@ -0,0 +1,22 @@
+package http_model
+
+type GetServiceChargeRequest struct {
+	FollowersLow int64 `json:"followers_low"` // 达人粉丝数下限
+	FollowersUp  int64 `json:"followers_up"`  // 达人粉丝数上限
+	FeeForm      int64 `json:"fee_form"`      // 稿费形式
+	Platform     int64 `json:"platform"`      // 项目平台,1-7分别代表小红书、抖音、微博、快手、b站、大众点评、知乎
+}
+
+type ServiceChargeData struct {
+	ServiceCharge float64 `json:"service_charge"` // 服务费
+}
+
+func NewGetServiceChargeRequest() *GetServiceChargeRequest {
+	return new(GetServiceChargeRequest)
+}
+
+func NewGetServiceChargeResponse() *CommonResponse {
+	resp := new(CommonResponse)
+	resp.Data = new(ServiceChargeData)
+	return resp
+}

+ 1 - 0
model/http_model/data_accept.go

@@ -8,6 +8,7 @@ type AcceptDataRequest struct {
 
 type AcceptDataData struct {
 	TaskIds []int `json:"taskIds"` //任务id列表
+	IsEnd   int   `json:"is_end"`  // 项目是否结案
 }
 
 func NewAcceptDataRequest() *AcceptDataRequest {

+ 2 - 0
model/http_model/project_change_taskStatus.go

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

+ 9 - 9
model/http_model/project_create.go

@@ -1,19 +1,19 @@
 package http_model
 
-import "time"
-
 type CreateProjectPhoto struct {
 	PhotoUrl string `json:"photo_url"` // 图片url
 	PhotoUid string `json:"photo_uid"`
 }
 
 type CreateRecruitStrategy struct {
-	FeeForm       int64 `json:"fee_form"`       // 稿费形式,1-3分别代表自报价、固定稿费、产品置换
-	StrategyID    int64 `json:"strategy_id"`    // 策略id
-	FollowersLow  int64 `json:"followers_low"`  // 达人粉丝数下限
-	FollowersUp   int64 `json:"followers_up"`   // 达人粉丝数上限
-	RecruitNumber int64 `json:"recruit_number"` // 招募数量
-	Offer         int64 `json:"offer"`          // 报价
+	FeeForm       int64   `json:"fee_form"`       // 稿费形式,1-3分别代表自报价、固定稿费、产品置换
+	StrategyID    int64   `json:"strategy_id"`    // 策略id
+	FollowersLow  int64   `json:"followers_low"`  // 达人粉丝数下限
+	FollowersUp   int64   `json:"followers_up"`   // 达人粉丝数上限
+	RecruitNumber int64   `json:"recruit_number"` // 招募数量
+	ServiceCharge float64 `json:"service_charge"` // 服务费
+	Offer         float64 `json:"offer"`          // 报价
+	TOffer        float64 `json:"t_offer"`        // 达人所见报价
 }
 
 type CreateProjectRequest struct {
@@ -23,7 +23,7 @@ type CreateProjectRequest struct {
 	ProjectPlatform  int64                   `json:"project_platform"`  // 项目平台,1-7分别代表小红书、抖音、微博、快手、b站、大众点评、知乎
 	ProjectForm      int64                   `json:"project_form"`      // 项目形式,1-4分别代表实体商品寄拍、虚拟产品测评、线下探店打卡、素材微原创
 	TalentType       string                  `json:"talent_type"`       // 达人类型
-	RecruitDdl       time.Time               `json:"recruit_ddl"`       // 招募截止时间
+	RecruitDdl       string                  `json:"recruit_ddl"`       // 招募截止时间
 	ContentType      int64                   `json:"content_type"`      // 内容形式,1代表图文,2代表视频
 	ProjectDetail    string                  `json:"project_detail"`    // 项目详情
 	RecruitStrategys []CreateRecruitStrategy `json:"recruit_strategys"` // 定价策略

+ 12 - 11
model/http_model/project_show.go

@@ -15,7 +15,7 @@ type ShowRecruitStrategy struct {
 	FollowersUp       string `json:"followers_up"`   // 达人粉丝数上限
 	RecruitNumber     string `json:"recruit_number"` // 招募数量
 	Offer             string `json:"offer"`          // 报价
-	ServiceCharge     int64  `json:"service_charge"`
+	ServiceCharge     string `json:"service_charge"`
 	SelectedNumber    int64  `json:"selected_number"`
 	WaitingNumber     int64  `json:"waiting_number"`   // 待发货
 	DeliveredNumber   int64  `json:"delivered_number"` // 已发货
@@ -35,16 +35,17 @@ type ShowProjectData struct {
 	RecruitStrategys []ShowRecruitStrategy `json:"recruit_strategys"` // 定价策略
 	ProjectPhotos    []ShowProjectPhoto    `json:"project_photos"`    // 项目图片
 	ProductID        string                `json:"product_id"`        // 关联商品id
-	EnterpriseID     string                `json:"enterprise_id"`     // 企业id
-	Balance          string                `json:"balance"`           // 企业余额
-	ProjectID        string                `json:"project_id"`        // 项目id
-	FailReason       string                `json:"fail_reason"`       // 失效原因
-	Phone            string                `json:"phone"`             // 联系方式
-	CreateAt         time.Time             `json:"create_at"`         // 创建时间
-	UpdateAt         time.Time             `json:"update_at"`         // 更新时间
-	PassAt           time.Time             `json:"pass_at"`           // 审核通过时间
-	FinishAt         time.Time             `json:"finish_at"`         // 结案时间
-	PayAt            time.Time             `json:"pay_at"`            // 支付时间
+	EstimatedCost    string                `json:"estimated_cost"`
+	EnterpriseID     string                `json:"enterprise_id"` // 企业id
+	Balance          string                `json:"balance"`       // 企业余额
+	ProjectID        string                `json:"project_id"`    // 项目id
+	FailReason       string                `json:"fail_reason"`   // 失效原因
+	Phone            string                `json:"phone"`         // 联系方式
+	CreateAt         time.Time             `json:"create_at"`     // 创建时间
+	UpdateAt         time.Time             `json:"update_at"`     // 更新时间
+	PassAt           time.Time             `json:"pass_at"`       // 审核通过时间
+	FinishAt         time.Time             `json:"finish_at"`     // 结案时间
+	PayAt            time.Time             `json:"pay_at"`        // 支付时间
 }
 
 type ShowProjectRequest struct {

+ 10 - 9
model/http_model/project_update.go

@@ -1,25 +1,26 @@
 package http_model
 
-import "time"
-
 type UpdateProjectPhoto struct {
 	PhotoUrl string `json:"photo_url"` // 图片url
 	PhotoUid string `json:"photo_uid"`
 }
 
 type UpdateRecruitStrategy struct {
-	FeeForm       int64 `json:"fee_form"`       // 稿费形式,1-3分别代表自报价、固定稿费、产品置换
-	StrategyID    int64 `json:"strategy_id"`    // 策略id
-	FollowersLow  int64 `json:"followers_low"`  // 达人粉丝数下限
-	FollowersUp   int64 `json:"followers_up"`   // 达人粉丝数上限
-	RecruitNumber int64 `json:"recruit_number"` // 招募数量
-	Offer         int64 `json:"offer"`          // 报价
+	FeeForm       int64   `json:"fee_form"`       // 稿费形式,1-3分别代表自报价、固定稿费、产品置换
+	StrategyID    int64   `json:"strategy_id"`    // 策略id
+	FollowersLow  int64   `json:"followers_low"`  // 达人粉丝数下限
+	FollowersUp   int64   `json:"followers_up"`   // 达人粉丝数上限
+	RecruitNumber int64   `json:"recruit_number"` // 招募数量
+	ServiceCharge float64 `json:"service_charge"` // 服务费
+	Offer         float64 `json:"offer"`          // 报价
+	TOffer        float64 `json:"t_offer"`        // 达人所见报价
 }
 
 type UpdateProjectRequest struct {
 	ProjectForm      string                  `json:"project_form"`      // 项目形式,1-4分别代表实体商品寄拍、虚拟产品测评、线下探店打卡、素材微原创
+	ProjectType      int64                   `json:"project_type"`      // 项目类型,1代表全流程项目,2代表专项项目
 	TalentType       string                  `json:"talent_type"`       // 达人类型
-	RecruitDdl       time.Time               `json:"recruit_ddl"`       // 招募截止时间
+	RecruitDdl       string                  `json:"recruit_ddl"`       // 招募截止时间
 	ContentType      string                  `json:"content_type"`      // 内容形式,1代表图文,2代表视频
 	ProjectStatus    string                  `json:"project_status"`    // 项目阶段
 	ProjectDetail    string                  `json:"project_detail"`    // 项目详情

+ 2 - 0
model/http_model/task_logistics.go

@@ -25,6 +25,7 @@ type TaskLogisticsPreview struct {
 	CompanyName           string    `json:"company_name"`           // 物流公司
 	LogisticsNumber       string    `json:"logistics_number"`       // 物流单号
 	DeliveryTime          string    `json:"delivery_time"`          // 发货时间
+	SignedTime            string    `json:"signed_time"`            // 签收时间
 	ExplorestoreStarttime time.Time `json:"explorestore_starttime"` // 线下探店-探店开始时间
 	ExplorestoreEndtime   time.Time `json:"explorestore_endtime"`   // 线下探店-探店结束时间
 	ExplorestorePeriod    string    `json:"explorestore_period"`    // 线下探店-探店持续时间
@@ -41,6 +42,7 @@ type TaskLogisticsInfo struct {
 	CompanyName           string    `json:"company_name"`           // 物流公司
 	LogisticsNumber       string    `json:"logistics_number"`       // 物流单号
 	DeliveryTime          string    `json:"delivery_time"`          // 发货时间
+	SignedTime            string    `json:"signed_time"`            // 签收时间
 	ExplorestoreStarttime time.Time `json:"explorestore_starttime"` // 线下探店-探店开始时间
 	ExplorestoreEndtime   time.Time `json:"explorestore_endtime"`   // 线下探店-探店结束时间
 	ExplorestorePeriod    string    `json:"explorestore_period"`    // 线下探店-探店持续时间

+ 4 - 2
pack/task_logistics_list.go

@@ -18,8 +18,8 @@ func MGormTaskLogisticsInfoListToHttpTaskLogisticsPreviewList(gormTaskLogisticsI
 }
 
 func MGormTaskLogisticsInfoToHttpTaskLogisticsPreview(TaskLogisticsInfo *http_model.TaskLogisticsInfo) *http_model.TaskLogisticsPreview {
-	deliveryTime := conv.MustString(TaskLogisticsInfo.DeliveryTime)
-	deliveryTime = deliveryTime[0:19]
+	deliveryTime := conv.MustString(TaskLogisticsInfo.DeliveryTime)[0:19]
+	signedTime := conv.MustString(TaskLogisticsInfo.SignedTime)[0:19]
 	return &http_model.TaskLogisticsPreview{
 		TaskID:                conv.MustString(TaskLogisticsInfo.TaskID),
 		PlatformNickname:      conv.MustString(TaskLogisticsInfo.PlatformNickname),
@@ -30,6 +30,7 @@ func MGormTaskLogisticsInfoToHttpTaskLogisticsPreview(TaskLogisticsInfo *http_mo
 		CompanyName:           conv.MustString(TaskLogisticsInfo.CompanyName),
 		LogisticsNumber:       conv.MustString(TaskLogisticsInfo.LogisticsNumber),
 		DeliveryTime:          deliveryTime,
+		SignedTime:            signedTime,
 		ExplorestoreStarttime: TaskLogisticsInfo.ExplorestoreStarttime,
 		ExplorestoreEndtime:   TaskLogisticsInfo.ExplorestoreEndtime,
 		ExplorestorePeriod:    conv.MustString(TaskLogisticsInfo.ExplorestorePeriod),
@@ -58,6 +59,7 @@ func GetTalentInfoStruct(TaskLogistics *http_model.TaskLogistics) *http_model.Ta
 		CompanyName:           TaskLogistics.Logistics.CompanyName,
 		LogisticsNumber:       TaskLogistics.Logistics.LogisticsNumber,
 		DeliveryTime:          conv.MustString(TaskLogistics.Logistics.DeliveryTime),
+		SignedTime:            conv.MustString(TaskLogistics.Logistics.SignedTime),
 		ExplorestoreStarttime: TaskLogistics.Logistics.ExplorestoreStarttime,
 		ExplorestoreEndtime:   TaskLogistics.Logistics.ExplorestoreEndtime,
 		ExplorestorePeriod:    TaskLogistics.Logistics.ExplorestorePeriod,

+ 3 - 1
route/init.go

@@ -84,10 +84,10 @@ func InitRoute(r *gin.Engine) {
 		m.GET("/invoice/getReceiveAddress", handler.WrapGetReceiveAddressHandler)            // 获取收货地址
 		m.GET("/invoice/getReceiveInfo", handler.WrapGetReceiveInfoHandler)                  // 获取发票信息
 		m.POST("/invoice/operateReceiveInfo", handler.WrapOperateReceiveInfoHandler)         // 修改或删除发票信息
-		m.POST("/project/getlogisticsnumberinfo", handler.WrapGetLogisticsNumberInfoHandler) // 获取物流数量
 		m.POST("/invoice/operateReceiveAddress", handler.WrapOperateReceiveAddressHandler)   // 修改或删除发票地址
 		m.POST("/invoice/addInvoiceRecord", handler.WrapAddInvoiceRecordHandler)             // 开票
 		m.POST("/invoice/getInvoiceRecord", handler.WrapGetInvoiceRecordHandler)             // 获取开票记录
+		m.POST("/project/getlogisticsnumberinfo", handler.WrapGetLogisticsNumberInfoHandler) // 获取物流数量
 		m.POST("/project/getlinknumberinfo", handler.WrapGetLinkNumberInfoHandler)           // 获取链接信息
 		m.POST("/project/getdatanumberinfo", handler.WrapGetDataNumberInfoHandler)           // 获取数据信息
 		m.POST("/project/getreviewnumberinfo", handler.WrapGetReviewNumberInfoHandler)       // 获取审稿信息
@@ -121,5 +121,7 @@ func InitRoute(r *gin.Engine) {
 
 		m.POST("/project/getspecialfinishdata", handler.WrapGetSpecialFinishDataHandler) // 查询专项任务结案单结案数据
 		m.POST("/workspace/ddlproject", handler.WrapWorkspaceDDLprojectHandler)          // 工作台项目统计
+
+		m.POST("/project/recruit/getservicecharge", handler.WrapGetServiceChargeHandler) // 获取产品置换服务费
 	}
 }

+ 4 - 2
service/autoTask.go

@@ -9,8 +9,10 @@ import (
 )
 
 func AutoTask() error {
-	c := cron.New()
-	_, err1 := c.AddFunc("@midnight", AutoTaskUpdateStatus)
+	c := cron.New(cron.WithSeconds())
+	// spec := "0 */30 * * * ?" //cron表达式,每半小时执行一次
+	spec := "0 */10 * * * ?" //cron表达式,每1分钟一次
+	_, err1 := c.AddFunc(spec, AutoTaskUpdateStatus)
 	if err1 != nil {
 		log.Println("service [AutoTaskUpdateStatus] error:", err1)
 		return err1

+ 20 - 4
service/data.go

@@ -28,6 +28,12 @@ func (*data) DataOpinion(ctx context.Context, request http_model.DataOpinionRequ
 		logrus.WithContext(ctx).Errorf("[Data service] call CreateData error,err:%+v", err)
 		return nil, err
 	}
+	// 记录任务日志
+	err = db.CreateTaskLog(ctx, int64(Data.TaskID), "数据驳回")
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[Link service] call CreateTaskLog error,err:%+v", err)
+		return nil, err
+	}
 
 	res := &http_model.DataOpinionData{
 		TaskID: int64(Data.TaskID),
@@ -51,6 +57,15 @@ func (*data) AcceptData(ctx context.Context, request http_model.AcceptDataReques
 		return nil, err
 	}
 
+	// 记录任务日志
+	for _, taskId := range TaskIDList {
+		err = db.CreateTaskLog(ctx, int64(taskId), "数据通过")
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[Data service] call CreateTaskLog error,err:%+v", err)
+			return nil, err
+		}
+	}
+
 	// 2. 更新YoungeeTaskInfo表,将任务结案
 	fmt.Printf("acc request %+v", TaskIDList)
 	err = db.SetTaskFinish(ctx, TaskIDList)
@@ -58,6 +73,10 @@ func (*data) AcceptData(ctx context.Context, request http_model.AcceptDataReques
 		logrus.WithContext(ctx).Errorf("[Data service] call SetTaskFinish error,err:%+v", err)
 		return nil, err
 	}
+	res := &http_model.AcceptDataData{
+		TaskIds: TaskIDList,
+		IsEnd:   0,
+	}
 
 	// 3. 判断是否全部任务已结案,若已全部结案则触发项目结案
 	// 查询task_stage<15的任务数量
@@ -72,10 +91,7 @@ func (*data) AcceptData(ctx context.Context, request http_model.AcceptDataReques
 			logrus.WithContext(ctx).Errorf("[Data service] call SetProjectFinish error,err:%+v", err)
 			return nil, err
 		}
-	}
-
-	res := &http_model.AcceptDataData{
-		TaskIds: TaskIDList,
+		res.IsEnd = 1
 	}
 	return res, nil
 }

+ 14 - 0
service/link.go

@@ -29,6 +29,12 @@ func (*link) LinkOpinion(ctx context.Context, request http_model.LinkOpinionRequ
 		logrus.WithContext(ctx).Errorf("[Link service] call CreateLink error,err:%+v", err)
 		return nil, err
 	}
+	// 记录任务日志
+	err = db.CreateTaskLog(ctx, int64(Link.TaskID), "链接驳回")
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[Link service] call CreateTaskLog error,err:%+v", err)
+		return nil, err
+	}
 
 	res := &http_model.LinkOpinionData{
 		TaskID: int64(Link.TaskID),
@@ -49,6 +55,14 @@ func (*link) AcceptLink(ctx context.Context, request http_model.AcceptLinkReques
 		logrus.WithContext(ctx).Errorf("[Link service] call CreateLink error,err:%+v", err)
 		return nil, err
 	}
+	// 记录任务日志
+	for _, taskId := range TaskIDList {
+		err = db.CreateTaskLog(ctx, int64(taskId), "链接通过")
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[Link service] call CreateTaskLog error,err:%+v", err)
+			return nil, err
+		}
+	}
 
 	res := &http_model.AcceptLinkData{
 		TaskIds: TaskIDList,

+ 14 - 0
service/logistics.go

@@ -93,6 +93,13 @@ func (*logistics) Create(ctx context.Context, newLogistics http_model.CreateLogi
 
 	// 对应招募策略待发货--,已发货++
 
+	// 记录任务日志-发货
+	err = db.CreateTaskLog(ctx, Logistics.TaskID, "发货时间")
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[logistics service] call CreateTaskLog error,err:%+v", err)
+		return nil, err
+	}
+
 	res := &http_model.CreateLogisticsData{
 		LogisticsID: *logisticsID,
 	}
@@ -187,6 +194,13 @@ func (*logistics) SignForReceipt(ctx *gin.Context, data http_model.SignForReceip
 			logrus.WithContext(ctx).Errorf("[project service] call UpdateLogisticsNumber error,err:%+v", err)
 			return err
 		}
+
+		// 记录任务日志
+		err = db.CreateTaskLog(ctx, taskId, "签收时间")
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[logistics service] call CreateTaskLog error,err:%+v", err)
+			return err
+		}
 	}
 
 	return nil

+ 94 - 9
service/project.go

@@ -5,6 +5,7 @@ import (
 	"fmt"
 	"strconv"
 	"strings"
+	"time"
 	"youngee_b_api/db"
 	"youngee_b_api/model/common_model"
 	"youngee_b_api/model/gorm_model"
@@ -43,12 +44,24 @@ func (*project) Create(ctx context.Context, newProject http_model.CreateProjectR
 	//feeForm := fmt.Sprintf("[")
 	feeFrom := []string{}
 	for _, strategy := range newProject.RecruitStrategys {
-		//if strategy.StrategyID
 		feeFrom = append(feeFrom, strconv.FormatInt(strategy.FeeForm, 10))
-		//feeForm += string(strategy.StrategyID)
+	}
+	var ECost float64 = 0
+	if newProject.ProjectType == int64(1) {
+		for _, strategy := range newProject.RecruitStrategys {
+			// 计算预估成本
+			var tmpCost float64 = 0
+			if strategy.FeeForm == 1 {
+				tmpCost = strategy.ServiceCharge * float64(strategy.RecruitNumber)
+			} else if strategy.FeeForm == 2 {
+				tmpCost = strategy.Offer * float64(strategy.RecruitNumber)
+			}
+			ECost += tmpCost
+		}
 	}
 	feeFroms := strings.Join(feeFrom, ",")
 	fmt.Printf("创建项目new %+v", newProject)
+	RecruitDdl, _ := time.ParseInLocation("2006-01-02 15:04:05", newProject.RecruitDdl, time.Local)
 	projectInfo := gorm_model.ProjectInfo{}
 	if newProject.ProjectType == int64(1) {
 		projectInfo = gorm_model.ProjectInfo{
@@ -58,7 +71,7 @@ func (*project) Create(ctx context.Context, newProject http_model.CreateProjectR
 			TalentType:      newProject.TalentType,
 			ProjectPlatform: newProject.ProjectPlatform,
 			ProjectForm:     newProject.ProjectForm,
-			RecruitDdl:      &newProject.RecruitDdl,
+			RecruitDdl:      &RecruitDdl,
 			ProjectDetail:   newProject.ProjectDetail,
 			ContentType:     newProject.ContentType,
 			EnterpriseID:    enterpriseID,
@@ -66,6 +79,7 @@ func (*project) Create(ctx context.Context, newProject http_model.CreateProjectR
 			FeeForm:         feeFroms,
 			AutoTaskID:      conv.MustInt64(AutoTaskID),
 			AutoDefaultID:   conv.MustInt64(AutoDefaultID),
+			EstimatedCost:   ECost,
 		}
 	} else {
 		projectInfo = gorm_model.ProjectInfo{
@@ -82,6 +96,7 @@ func (*project) Create(ctx context.Context, newProject http_model.CreateProjectR
 			FeeForm:         feeFroms,
 			AutoTaskID:      conv.MustInt64(AutoTaskID),
 			AutoDefaultID:   conv.MustInt64(AutoDefaultID),
+			EstimatedCost:   ECost,
 		}
 	}
 	// db create ProjectInfo
@@ -110,13 +125,24 @@ func (*project) Create(ctx context.Context, newProject http_model.CreateProjectR
 	if newProject.ProjectType == int64(1) {
 		recruitStrategys := []gorm_model.RecruitStrategy{}
 		for _, strategy := range newProject.RecruitStrategys {
+			// 查询对应定价策略
+			pricingStrategy, err := db.GetPricingStrategy(ctx, strategy.FollowersLow, strategy.FollowersUp, strategy.FeeForm, newProject.ProjectPlatform)
+			if err != nil {
+				return nil, err
+			}
+			// 根据定价策略计算达人所见报价
+			if strategy.FeeForm == 2 {
+				strategy.TOffer = strategy.Offer * (1 - conv.MustFloat64(pricingStrategy.ServiceRate)/1000)
+			}
 			recruitStrategy := gorm_model.RecruitStrategy{
 				FeeForm:       strategy.FeeForm,
 				StrategyID:    strategy.StrategyID,
 				FollowersLow:  strategy.FollowersLow,
 				FollowersUp:   strategy.FollowersUp,
 				RecruitNumber: strategy.RecruitNumber,
+				ServiceCharge: strategy.ServiceCharge,
 				Offer:         strategy.Offer,
+				TOffer:        strategy.TOffer,
 				ProjectID:     *projectID,
 			}
 			recruitStrategys = append(recruitStrategys, recruitStrategy)
@@ -133,16 +159,43 @@ func (*project) Create(ctx context.Context, newProject http_model.CreateProjectR
 	return res, nil
 }
 func (*project) Update(ctx context.Context, newProject http_model.UpdateProjectRequest, enterpriseID int64) (*http_model.UpdateProjectData, error) {
-	fmt.Println("newproject:", newProject)
+	fmt.Println("RecruitDdl:", newProject.RecruitDdl)
+	RecruitDdl, _ := time.ParseInLocation("2006-01-02 15:04:05", newProject.RecruitDdl, time.Local)
+	oldProject, err3 := db.GetProjectDetail(ctx, conv.MustInt64(newProject.ProjectID))
+	if err3 != nil {
+		return nil, err3
+	}
+	feeFrom := []string{}
+	for _, strategy := range newProject.RecruitStrategys {
+		//if strategy.StrategyID
+		feeFrom = append(feeFrom, strconv.FormatInt(strategy.FeeForm, 10))
+		//feeForm += string(strategy.StrategyID)
+	}
+	var ECost float64 = 0
+	if newProject.ProjectType == int64(1) {
+		for _, strategy := range newProject.RecruitStrategys {
+			// 计算预估成本
+			var tmpCost float64 = 0
+			if strategy.FeeForm == 1 {
+				tmpCost = strategy.ServiceCharge * float64(strategy.RecruitNumber)
+			} else if strategy.FeeForm == 2 {
+				tmpCost = strategy.Offer * float64(strategy.RecruitNumber)
+			}
+			ECost += tmpCost
+		}
+	}
+	feeFroms := strings.Join(feeFrom, ",")
 	project := gorm_model.ProjectInfo{
 		ProjectID:     conv.MustInt64(newProject.ProjectID),
-		RecruitDdl:    &newProject.RecruitDdl,
+		RecruitDdl:    &RecruitDdl,
 		TalentType:    newProject.TalentType,
 		ContentType:   conv.MustInt64(newProject.ContentType),
 		ProjectDetail: newProject.ProjectDetail,
 		ProjectForm:   conv.MustInt64(newProject.ProjectForm),
 		EnterpriseID:  enterpriseID,
 		ProjectStatus: conv.MustInt64(newProject.ProjectStatus),
+		FeeForm:       feeFroms,
+		EstimatedCost: ECost,
 	}
 	projectID, err := db.UpdateProject(ctx, project)
 	if err != nil {
@@ -154,7 +207,7 @@ func (*project) Update(ctx context.Context, newProject http_model.UpdateProjectR
 		return nil, err
 	}
 	fmt.Printf("照片:\t %+v", newProject.ProjectPhotos)
-	if newProject.ProjectPhotos != nil {
+	if len(newProject.ProjectPhotos) != 0 {
 		// 新增图片
 		projectPhotos := []gorm_model.ProjectPhoto{}
 		for _, photo := range newProject.ProjectPhotos {
@@ -180,13 +233,25 @@ func (*project) Update(ctx context.Context, newProject http_model.UpdateProjectR
 		// 新增策略
 		RecruitStrategys := []gorm_model.RecruitStrategy{}
 		for _, Strategy := range newProject.RecruitStrategys {
+			// 查询对应定价策略
+			pricingStrategy, err := db.GetPricingStrategy(ctx, Strategy.FollowersLow, Strategy.FollowersUp, Strategy.FeeForm, oldProject.ProjectPlatform)
+			if err != nil {
+				return nil, err
+			}
+			// 根据定价策略计算达人所见报价
+			if Strategy.FeeForm == 2 {
+				Strategy.TOffer = Strategy.Offer * (1 - conv.MustFloat64(pricingStrategy.ServiceRate)/1000)
+			}
+
 			RecruitStrategy := gorm_model.RecruitStrategy{
 				FeeForm:       conv.MustInt64(Strategy.FeeForm),
 				StrategyID:    conv.MustInt64(Strategy.StrategyID),
 				FollowersLow:  conv.MustInt64(Strategy.FollowersLow),
 				FollowersUp:   conv.MustInt64(Strategy.FollowersUp),
 				RecruitNumber: conv.MustInt64(Strategy.RecruitNumber),
-				Offer:         conv.MustInt64(Strategy.Offer),
+				ServiceCharge: Strategy.ServiceCharge,
+				Offer:         Strategy.Offer,
+				TOffer:        Strategy.TOffer,
 				ProjectID:     project.ProjectID,
 			}
 			fmt.Printf("Offer:\t %+v", Strategy.Offer)
@@ -264,7 +329,6 @@ func (*project) GetProjectTaskList(ctx context.Context, projectID string, pageSi
 }
 
 func (*project) GetPorjectDetail(ctx context.Context, projectID int64) (*http_model.ShowProjectData, error) {
-
 	project, err := db.GetProjectDetail(ctx, projectID)
 	if err != nil {
 		logrus.WithContext(ctx).Errorf("[project service] call GetPorjectDetail error,err:%+v", err)
@@ -297,6 +361,7 @@ func (*project) GetPorjectDetail(ctx context.Context, projectID int64) (*http_mo
 		ProductID:       conv.MustString(project.ProductID),
 		EnterpriseID:    conv.MustString(project.EnterpriseID),
 		Balance:         conv.MustString(enterprise.Balance),
+		EstimatedCost:   conv.MustString(project.EstimatedCost),
 		FailReason:      conv.MustString(project.FailReason),
 		CreateAt:        util.GetTimePoionter(project.CreatedAt),
 		UpdateAt:        util.GetTimePoionter(project.UpdatedAt),
@@ -320,7 +385,7 @@ func (*project) GetPorjectDetail(ctx context.Context, projectID int64) (*http_mo
 			FollowersUp:       conv.MustString(strategy.FollowersUp),
 			RecruitNumber:     conv.MustString(strategy.RecruitNumber),
 			Offer:             conv.MustString(strategy.Offer),
-			ServiceCharge:     strategy.ServiceCharge,
+			ServiceCharge:     conv.MustString(strategy.ServiceCharge),
 			SelectedNumber:    strategy.SelectedNumber,
 			WaitingNumber:     strategy.WaitingNumber,
 			DeliveredNumber:   strategy.DeliveredNumber,
@@ -377,6 +442,15 @@ func (*project) ChangeTaskStatus(ctx *gin.Context, data http_model.ProjectChange
 	return nil
 }
 
+func (*project) ChangeSpecialTaskStatus(ctx *gin.Context, data http_model.ProjectChangeTaskStatusRequest) interface{} {
+	err := db.ChangeSpecialTaskStatus(ctx, data.TaskIds, data.TaskStatus, data.TaskStage)
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[project service] call ChangeSpecialTaskStatus error,err:%+v", err)
+		return err
+	}
+	return nil
+}
+
 func (p *project) GetTaskScriptList(ctx *gin.Context, projectID string, pageSize, pageNum int64, conditions *common_model.TalentConditions) (*http_model.TaskScriptListData, error) {
 	TaskScripts, total, err := db.GetTaskScriptList(ctx, projectID, pageSize, pageNum, conditions)
 	if err != nil {
@@ -436,3 +510,14 @@ func (p *project) GetTaskFinishList(ctx *gin.Context, projectID string, pageSize
 	TaskFinishListData.Total = conv.MustString(total)
 	return TaskFinishListData, nil
 }
+
+func (p *project) GetServiceCharge(ctx *gin.Context, data http_model.GetServiceChargeRequest) (*http_model.ServiceChargeData, error) {
+	pricingStrategy, err := db.GetPricingStrategy(ctx, data.FollowersLow, data.FollowersUp, data.FeeForm, data.Platform)
+	if err != nil {
+		return nil, err
+	}
+	serviceFee := http_model.ServiceChargeData{
+		ServiceCharge: pricingStrategy.ServiceCharge,
+	}
+	return &serviceFee, nil
+}

+ 6 - 0
service/project_pay.go

@@ -42,6 +42,12 @@ func (*projectPay) Pay(ctx context.Context, projectPay http_model.ProjectPayRequ
 		logrus.WithContext(ctx).Errorf("[project service] call GetPorjectDetail error,err:%+v", err)
 		return nil, err2
 	}
+	err = db.UpdateTaskSelectAtByProjectId(ctx, conv.MustInt64(projectPay.ProjectID), 2)
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[projectPay service] call UpdateTaskStatusPaying error,err:%+v", err)
+		return nil, err
+	}
+
 	if project.ProjectForm != 4 {
 		err = db.UpdateTaskStageByProjectId(ctx, conv.MustInt64(projectPay.ProjectID), 2, 4)
 		if err != nil {

+ 14 - 0
service/script.go

@@ -29,6 +29,12 @@ func (*script) ScriptOpinion(ctx context.Context, request http_model.ScriptOpini
 		logrus.WithContext(ctx).Errorf("[Script service] call CreateScript error,err:%+v", err)
 		return nil, err
 	}
+	// 记录任务日志
+	err = db.CreateTaskLog(ctx, int64(Script.TaskID), "脚本驳回")
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[Script service] call CreateTaskLog error,err:%+v", err)
+		return nil, err
+	}
 
 	res := &http_model.ScriptOpinionData{
 		TaskID: int64(Script.TaskID),
@@ -49,6 +55,14 @@ func (*script) AcceptScript(ctx context.Context, request http_model.AcceptScript
 		logrus.WithContext(ctx).Errorf("[Script service] call CreateScript error,err:%+v", err)
 		return nil, err
 	}
+	// 记录任务日志
+	for _, taskId := range TaskIDList {
+		err = db.CreateTaskLog(ctx, int64(taskId), "脚本通过")
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[Script service] call CreateTaskLog error,err:%+v", err)
+			return nil, err
+		}
+	}
 
 	res := &http_model.AcceptScriptData{
 		TaskIds: TaskIDList,

+ 14 - 0
service/sketch.go

@@ -30,6 +30,12 @@ func (*sketch) SketchOption(ctx context.Context, request http_model.SketchOpinio
 		return nil, err
 	}
 
+	// 记录任务日志
+	err = db.CreateTaskLog(ctx, int64(Sketch.TaskID), "初稿驳回")
+	if err != nil {
+		logrus.WithContext(ctx).Errorf("[Sketch service] call CreateTaskLog error,err:%+v", err)
+		return nil, err
+	}
 	res := &http_model.SketchOpinionData{
 		TaskID: int64(Sketch.TaskID),
 	}
@@ -49,6 +55,14 @@ func (*sketch) AcceptSketch(ctx context.Context, request http_model.AcceptSketch
 		logrus.WithContext(ctx).Errorf("[Sketch service] call CreateSketch error,err:%+v", err)
 		return nil, err
 	}
+	// 记录任务日志
+	for _, taskId := range TaskIDList {
+		err = db.CreateTaskLog(ctx, int64(taskId), "初稿通过")
+		if err != nil {
+			logrus.WithContext(ctx).Errorf("[Sketch service] call CreateTaskLog error,err:%+v", err)
+			return nil, err
+		}
+	}
 
 	res := &http_model.AcceptSketchData{
 		TaskIds: TaskIDList,