Pārlūkot izejas kodu

更新定时任务12.24

yuliang1112 2 gadi atpakaļ
vecāks
revīzija
57712b85d0

+ 41 - 0
db/info_pricing_strategy.go

@@ -0,0 +1,41 @@
+package db
+
+import (
+	"context"
+	"fmt"
+	"youngee_m_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
+}

+ 11 - 11
db/operate.go

@@ -70,7 +70,7 @@ func CreatePricingStrategy(ctx context.Context, req *http_model.AddPricingReques
 	newStrategy.FansLow = fans_low
 	newStrategy.FansUp = fans_up
 	newStrategy.ProjectType = conv.MustInt64(project_type, 0)
-	newStrategy.ServiceCharge = conv.MustFloat32(service_charge, 0)
+	newStrategy.ServiceCharge = conv.MustFloat64(service_charge, 0)
 	newStrategy.Platform = conv.MustInt64(platform, 0)
 	newStrategy.FeeForm = conv.MustInt64(fee_form, 0)
 	newStrategy.ServiceRate = conv.MustInt64(service_rate, 0)
@@ -255,7 +255,7 @@ func UpdateAutoDefaultRate(ctx context.Context, rate int, num int32) error {
 func GetSignInOfflineTask(projectForm int32) error {
 	db := GetReadDB(context.Background())
 	var projectInfos []*gorm_model.ProjectInfo
-	err := db.Model(gorm_model.ProjectInfo{}).Where("project_type = ? AND project_form = ?", 1, projectForm).Find(&projectInfos).Error
+	err := db.Model(gorm_model.ProjectInfo{}).Where("project_type = ? AND project_form = ? AND project_status = 9", 1, projectForm).Find(&projectInfos).Error
 	if err != nil {
 		return err
 	}
@@ -280,7 +280,7 @@ func GetSignInOfflineTask(projectForm int32) error {
 			projectIdMap[projectInfo.ProjectID] = projectInfo.ContentType
 			db1 := GetReadDB(context.Background())
 			var taskInfos []gorm_model.YoungeeTaskInfo
-			db1.Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? AND logistics_status = ?", projectInfo.ProjectID, 2).Find(&taskInfos)
+			db1.Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? AND logistics_status = ? AND task_stage = 5", projectInfo.ProjectID, 2).Find(&taskInfos)
 			//fmt.Println("taskInfos", taskInfos)
 			for _, taskInfo := range taskInfos {
 				//fmt.Println("TaskId", taskInfo.TaskId)
@@ -348,7 +348,7 @@ func GetAutoReviewTask(contentType int32) error {
 	if contentType == 2 {
 		// 项目内容形式为视频
 		// 1. 补全scriptInfo表中的自动审核脚本时间
-		err := db.Model(gorm_model.ProjectInfo{}).Where("project_type = ? AND content_type = ?", 1, contentType).Find(&projectInfos).Error
+		err := db.Model(gorm_model.ProjectInfo{}).Where("project_type = ? AND content_type = ? AND project_status = 9", 1, contentType).Find(&projectInfos).Error
 		if err != nil {
 			return err
 		}
@@ -369,7 +369,7 @@ func GetAutoReviewTask(contentType int32) error {
 			//fmt.Println("t:", autoTaskInfo.ReviewInMv)
 			// 获取 projectId 对应的 taskId 及添加脚本自动审核时间
 			var taskInfos []gorm_model.YoungeeTaskInfo
-			db1.Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? AND task_status = 2", projectId).Find(&taskInfos)
+			db1.Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? AND task_status = 2 AND task_stage = 8", projectId).Find(&taskInfos)
 			for _, taskInfo := range taskInfos {
 				//fmt.Println("TaskID:", taskInfo.TaskId)
 				db2 := GetReadDB(context.Background())
@@ -428,7 +428,7 @@ func GetAutoReviewTask(contentType int32) error {
 	} else {
 		// 项目内容形式为图文
 		// 1. 补全sketchInfo表中的自动审核初稿时间
-		err := db.Model(gorm_model.ProjectInfo{}).Where("project_type = ? ", 1).Find(&projectInfos).Error
+		err := db.Model(gorm_model.ProjectInfo{}).Where("project_type = ? AND project_status = 9", 1).Find(&projectInfos).Error
 		if err != nil {
 			return err
 		}
@@ -448,7 +448,7 @@ func GetAutoReviewTask(contentType int32) error {
 			dbStart.Model(gorm_model.InfoAutoTask{}).Select("review_unlimited").Where("auto_task_id = ?", autoTaskId).First(&ReviewUnlimited)
 			//fmt.Println("t:", autoTaskInfo.ReviewUnlimited)
 			var taskInfos []gorm_model.YoungeeTaskInfo
-			db1.Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? AND task_status = 2", projectId).Find(&taskInfos)
+			db1.Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? AND task_status = 2 AND task_stage = 10", projectId).Find(&taskInfos)
 			for _, taskInfo := range taskInfos {
 				db2 := GetReadDB(context.Background())
 				var sketchInfo gorm_model.YounggeeSketchInfo
@@ -510,7 +510,7 @@ func GetAutoPostReviewTask() error {
 	// 1. 补全linkInfo表中的自动审核链接时间
 	db := GetReadDB(context.Background())
 	var projectInfos []*gorm_model.ProjectInfo
-	err := db.Model(gorm_model.ProjectInfo{}).Where("project_type = ? ", 1).Find(&projectInfos).Error
+	err := db.Model(gorm_model.ProjectInfo{}).Where("project_type = ? AND project_status = 9", 1).Find(&projectInfos).Error
 	if err != nil {
 		return err
 	}
@@ -530,7 +530,7 @@ func GetAutoPostReviewTask() error {
 		dbStart.Model(gorm_model.InfoAutoTask{}).Select("postreview").Where("auto_task_id = ?", autoTaskId).First(&Postreview)
 		//fmt.Println("t:", autoTaskInfo.Postreview)
 		var taskInfos []gorm_model.YoungeeTaskInfo
-		db1.Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? AND task_status = 2", projectId).Find(&taskInfos)
+		db1.Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? AND task_status = 2 AND task_stage = 12", projectId).Find(&taskInfos)
 		for _, taskInfo := range taskInfos {
 			db2 := GetReadDB(context.Background())
 			var linkInfos gorm_model.YounggeeLinkInfo
@@ -590,7 +590,7 @@ func GetAutoCaseCloseTask() error {
 	// 1. 补全dataInfo表中的自动审核数据时间
 	db := GetReadDB(context.Background())
 	var projectInfos []*gorm_model.ProjectInfo
-	err := db.Model(gorm_model.ProjectInfo{}).Where("project_type = ? ", 1).Find(&projectInfos).Error
+	err := db.Model(gorm_model.ProjectInfo{}).Where("project_type = ? AND project_status = 9", 1).Find(&projectInfos).Error
 	if err != nil {
 		return err
 	}
@@ -610,7 +610,7 @@ func GetAutoCaseCloseTask() error {
 		dbStart.Model(gorm_model.InfoAutoTask{}).Select("case_close").Where("auto_task_id = ?", autoTaskId).First(&CaseClose)
 		//fmt.Println("t:", autoTaskInfo.CaseClose)
 		var taskInfos []gorm_model.YoungeeTaskInfo
-		db1.Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? AND task_status = 2", projectId).Find(&taskInfos)
+		db1.Model(gorm_model.YoungeeTaskInfo{}).Where("project_id = ? AND task_status = 2 AND task_stage = 14", projectId).Find(&taskInfos)
 		for _, taskInfo := range taskInfos {
 			db2 := GetReadDB(context.Background())
 			var dataInfos gorm_model.YounggeeDataInfo

+ 6 - 2
db/project.go

@@ -19,7 +19,7 @@ import (
 
 func GetFullProjectList(ctx context.Context, pageSize, pageNum int32, condition *common_model.ProjectCondition) ([]*gorm_model.ProjectInfo, int64, error) {
 	db := GetReadDB(ctx)
-	db = db.Debug().Model(gorm_model.ProjectInfo{})
+	db = db.Debug().Model(gorm_model.ProjectInfo{}).Where("project_type = 1")
 	// 根据Project条件过滤
 	conditionType := reflect.TypeOf(condition).Elem()
 	conditionValue := reflect.ValueOf(condition).Elem()
@@ -121,7 +121,11 @@ func ApproveProject(ctx context.Context, projectId string, isApprove int64) (err
 			return err, ""
 		}
 	} else if isApprove == 2 && projectInfo.ProjectStatus == 2 {
-		err := db.Update("project_status", 8).Error
+		err := db.Updates(gorm_model.ProjectInfo{
+			ProjectStatus: 8,
+			FinishAt:      &t,
+			FailReason:    2,
+		}).Error
 		message = "项目存在风险已禁止发布"
 		if err != nil {
 			logrus.Println("DB AutoUpdateStatus error :", err)

+ 58 - 0
handler/GetServiceFee.go

@@ -0,0 +1,58 @@
+package handler
+
+import (
+	"github.com/gin-gonic/gin"
+	"github.com/sirupsen/logrus"
+	log "github.com/sirupsen/logrus"
+	"youngee_m_api/consts"
+	"youngee_m_api/model/http_model"
+	"youngee_m_api/service"
+	"youngee_m_api/util"
+)
+
+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
+}

+ 3 - 3
handler/project_create.go

@@ -5,7 +5,6 @@ import (
 	"github.com/sirupsen/logrus"
 	log "github.com/sirupsen/logrus"
 	"youngee_m_api/consts"
-	"youngee_m_api/db"
 	"youngee_m_api/model/http_model"
 	"youngee_m_api/service"
 	"youngee_m_api/util"
@@ -42,8 +41,9 @@ func (h *CreateProjectHandler) getResponse() interface{} {
 func (h *CreateProjectHandler) run() {
 	data := http_model.CreateProjectRequest{}
 	data = *h.req
-	enterpriseID := db.GetEnterpriseIDByProductID(h.ctx, h.req.ProductID)
-	res, err := service.Project.Create(h.ctx, data, enterpriseID)
+	//enterpriseID := db.GetEnterpriseIDByProductID(h.ctx, h.req.ProductID)
+	//fmt.Println("enterpriseID:", enterpriseID)
+	res, err := service.Project.Create(h.ctx, data, h.req.EnterpriseID)
 	if err != nil {
 		logrus.Errorf("[CreateProjectHandler] call Create err:%+v\n", err)
 		util.HandlerPackErrorResp(h.resp, consts.ErrorInternal, "")

+ 2 - 2
model/gorm_model/info_pricing_strategy.go

@@ -13,8 +13,8 @@ type InfoPricingStrategy struct {
 	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 float32   `gorm:"column:service_charge"`                // 服务费,稿费形式为产品置换时填写,可以为空
-	BaseOffer     float32   `gorm:"column:base_offer"`                    // 基础报价
+	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表中主键

+ 2 - 0
model/gorm_model/project.go

@@ -33,6 +33,8 @@ type ProjectInfo struct {
 	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 {

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

+ 3 - 3
model/http_model/project_create.go

@@ -1,7 +1,5 @@
 package http_model
 
-import "time"
-
 type CreateProjectPhoto struct {
 	PhotoUrl string `json:"photo_url"` // 图片url
 	PhotoUid string `json:"photo_uid"`
@@ -13,6 +11,7 @@ type CreateRecruitStrategy struct {
 	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"`        // 达人端报价
 }
@@ -24,12 +23,13 @@ type CreateProjectRequest struct {
 	ProjectPlatform  int64                   `json:"project_platform"`  // 项目平台,1-7分别代表红book、抖音、微博、快手、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"` // 定价策略
 	ProjectPhotos    []CreateProjectPhoto    `json:"project_photos"`    // 项目图片
 	ProductID        int64                   `json:"product_id"`        // 关联商品id
+	EnterpriseID     int64                   `json:"enterprise_id"`     // 关联商品id
 }
 
 type CreateProjectData struct {

+ 3 - 3
model/http_model/project_update.go

@@ -1,7 +1,5 @@
 package http_model
 
-import "time"
-
 type UpdateProjectPhoto struct {
 	PhotoUrl string `json:"photo_url"` // 图片url
 	PhotoUid string `json:"photo_uid"`
@@ -13,15 +11,17 @@ type UpdateRecruitStrategy struct {
 	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"`       // 达人类型
 	ProjectStatus    int                     `json:"project_status"`    // 要保存的项目状态
-	RecruitDdl       time.Time               `json:"recruit_ddl"`       // 招募截止时间
+	RecruitDdl       string                  `json:"recruit_ddl"`       // 招募截止时间
 	ContentType      string                  `json:"content_type"`      // 内容形式,1代表图文,2代表视频
 	ProjectDetail    string                  `json:"project_detail"`    // 项目详情
 	RecruitStrategys []UpdateRecruitStrategy `json:"recruit_strategys"` // 定价策略

+ 1 - 0
route/init.go

@@ -76,6 +76,7 @@ func InitRoute(r *gin.Engine) {
 		m.POST("/project/taskfinishlist", handler.WrapTaskFinishListHandler)               // 查询违约列表-数据违约
 		m.POST("/project/getfinishnumberinfo", handler.WrapGetFinishNumberInfoHandler)     // 获取结案数量
 		m.POST("/project/getProduceRecords", handler.WrapGetProjectRecordsHandler)         // 获取项目记录
+		m.POST("/project/recruit/getservicecharge", handler.WrapGetServiceChargeHandler)   // 获取产品置换服务费
 	}
 	u := r.Group("/youngee/m/user")
 	{

+ 4 - 4
service/auto_task.go

@@ -17,12 +17,11 @@ func AutoTask() error {
 	// 根据cron表达式进行时间调度,cron可以精确到秒,大部分表达式格式也是从秒开始。
 	// crontab := cron.New()  默认从分开始进行时间调度
 	crontab := cron.New(cron.WithSeconds()) //精确到秒
-	//定义定时器调用的任务函数
+	// 定义定时器调用的任务函数
 	taskKDStatus := func() {
 		logisticNums := db.GetLogisticsNum()
 		for i := 0; i < len(logisticNums); i++ {
 			logisticNum := logisticNums[i]
-			log.Println("logisticNum:", logisticNum)
 			status := GetKDStatus(consts.GetKD(logisticNum[0]), logisticNum[1])
 			if status == "1" {
 				db.SignLogistic(conv.MustInt64(logisticNum[2], 0))
@@ -198,11 +197,12 @@ func AutoTask() error {
 		log.Println("GetAutoCaseCloseDefaultTask is running ,Time :", time.Now())
 	}
 	//定时任务
-	//spec := "*/30 * * * * ?" //cron表达式,每10秒一次
+	spec := "*/30 * * * * ?" //cron表达式,每10秒一次
 	//spec := "0 */30 * * * ?" //cron表达式,每一分钟执行一次
-	spec := "0 0 * * * *" //每小时执行
+	//spec := "0 0 * * * *" //每小时执行
 	// 添加定时任务,
 	_, err := crontab.AddFunc("@midnight", taskKDStatus)
+	//_, err := crontab.AddFunc("*/30 * * * * ?", taskKDStatus)
 	if err != nil {
 		return err
 	}

+ 75 - 7
service/project.go

@@ -5,6 +5,7 @@ import (
 	"fmt"
 	"strconv"
 	"strings"
+	"time"
 	"youngee_m_api/db"
 	"youngee_m_api/model/common_model"
 	"youngee_m_api/model/gorm_model"
@@ -148,7 +149,7 @@ func (*project) GetProjectTaskList(ctx context.Context, projectID string, pageSi
 }
 
 func (*project) Create(ctx context.Context, newProject http_model.CreateProjectRequest, enterpriseID int64) (*http_model.CreateProjectData, error) {
-	// build gorm_model.ProjectInfo
+	RecruitDdl, _ := time.ParseInLocation("2006-01-02 15:04:05", newProject.RecruitDdl, time.Local)
 	// 查询关联商品信息
 	product, err := db.GetProductByID(ctx, newProject.ProductID)
 	if err != nil {
@@ -159,12 +160,22 @@ 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, ",")
-
 	projectInfo := gorm_model.ProjectInfo{
 		ProjectName:     projectName,
 		ProjectStatus:   1,
@@ -172,12 +183,14 @@ 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,
 		ProductID:       newProject.ProductID,
 		FeeForm:         feeFroms,
+		EstimatedCost:   ECost,
+		IsRead:          0,
 	}
 	// db create ProjectInfo
 	projectID, err := db.CreateProject(ctx, projectInfo)
@@ -203,7 +216,15 @@ func (*project) Create(ctx context.Context, newProject http_model.CreateProjectR
 	}
 	// build
 	recruitStrategys := []gorm_model.RecruitStrategy{}
-	for _, strategy := range newProject.RecruitStrategys {
+	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, 0)/1000)
+		}
 		recruitStrategy := gorm_model.RecruitStrategy{
 			FeeForm:       strategy.FeeForm,
 			StrategyID:    strategy.StrategyID,
@@ -229,15 +250,42 @@ func (*project) Create(ctx context.Context, newProject http_model.CreateProjectR
 
 func (*project) Update(ctx context.Context, newProject http_model.UpdateProjectRequest, enterpriseID int64) (*http_model.UpdateProjectData, error) {
 	//fmt.Println("newproject:", newProject)
+	RecruitDdl, _ := time.ParseInLocation("2006-01-02 15:04:05", newProject.RecruitDdl, time.Local)
+	oldProject, err3 := db.GetProjectDetail(ctx, conv.MustInt64(newProject.ProjectID, 0))
+	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, 0),
-		RecruitDdl:    &newProject.RecruitDdl,
+		RecruitDdl:    &RecruitDdl,
 		TalentType:    newProject.TalentType,
 		ContentType:   conv.MustInt64(newProject.ContentType, 0),
 		ProjectDetail: newProject.ProjectDetail,
 		ProjectForm:   conv.MustInt64(newProject.ProjectForm, 0),
 		EnterpriseID:  enterpriseID,
 		ProjectStatus: int64(newProject.ProjectStatus),
+		FeeForm:       feeFroms,
+		EstimatedCost: ECost,
 	}
 	projectID, err := db.UpdateProject(ctx, project)
 	if err != nil {
@@ -275,6 +323,15 @@ 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, 0)/1000)
+			}
 			RecruitStrategy := gorm_model.RecruitStrategy{
 				FeeForm:       conv.MustInt64(Strategy.FeeForm, 0),
 				StrategyID:    conv.MustInt64(Strategy.StrategyID, 0),
@@ -471,3 +528,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
+}