ソースを参照

服务商合作

Ethan 5 ヶ月 前
コミット
f377b77fc8

+ 37 - 1
app/controller/task_controller.go

@@ -332,7 +332,7 @@ func (t TaskController) ProjectToReview(c *gin.Context) {
 	returnSuccess(c, 20000, resultMap)
 }
 
-// 公开种草任务列表
+// 种草任务列表
 func (t TaskController) ProjectTaskList(c *gin.Context) {
 	param := &vo.ProjectSearchParam{}
 	err := c.BindJSON(param)
@@ -524,3 +524,39 @@ func (t TaskController) CancelTalentList(c *gin.Context) {
 	resultMap["taskIds"] = param.TaskIds
 	returnSuccess(c, 20000, resultMap)
 }
+
+// 服务商合作-服务商列表
+func (o TaskController) GetSupplierInTargetTaskList(c *gin.Context) {
+	param := &vo.SupplierSearchInTargetTaskParam{}
+	err := c.BindJSON(param)
+	if err != nil || "" == param.EnterpriseId {
+		logrus.Errorf("Request bind err:%+v\n", err)
+		returnError(c, 40000, "参数错误")
+		return
+	}
+	result, err1 := service.CooperationService{}.GetSupplierInTargetTaskList(param)
+	if err1 != nil {
+		logrus.Errorf("[GetSuplierList] call Show err:%+v\n", err)
+		returnError(c, 40000, err.Error())
+		return
+	}
+	returnSuccess(c, 20000, result)
+}
+
+// 服务商合作-邀约合作
+func (o TaskController) InviteSupplier(c *gin.Context) {
+	param := &vo.SupplierInviteInTargetTaskParam{}
+	err := c.BindJSON(param)
+	if err != nil {
+		logrus.Errorf("Request bind err:%+v\n", err)
+		returnError(c, 40000, "参数错误")
+		return
+	}
+	err1 := service.CooperationService{}.InviteSupplierInTargetTask(param)
+	if err1 != nil {
+		logrus.Errorf("[InviteSupplier] call Show err:%+v\n", err)
+		returnError(c, 40000, err.Error())
+		return
+	}
+	returnSuccess(c, 20000, nil)
+}

+ 14 - 1
app/dao/enterprise_supplier_cooperate_dao.go

@@ -1,6 +1,7 @@
 package dao
 
 import (
+	"gorm.io/gorm"
 	"youngee_b_api/app/entity"
 )
 
@@ -23,7 +24,7 @@ func (d EnterpriseSupplierCooperateDao) InsertBatch(records []*entity.Enterprise
 }
 
 // 获取指定商家的服务商库
-func (d EnterpriseSupplierCooperateDao) GetSuppliersByEnterprise(enterpriseId string, page int, pageSize int) ([]*entity.EnterpriseSupplierCooperate, int64, error) {
+func (d EnterpriseSupplierCooperateDao) GetSupplierByEnterprise(enterpriseId string, page int, pageSize int) ([]*entity.EnterpriseSupplierCooperate, int64, error) {
 	var enterpriseSupplierCooperates []*entity.EnterpriseSupplierCooperate
 	var total int64
 	offset := (page - 1) * pageSize
@@ -38,6 +39,18 @@ func (d EnterpriseSupplierCooperateDao) GetSuppliersByEnterprise(enterpriseId st
 	return enterpriseSupplierCooperates, total, nil
 }
 
+// 获取指定商家的某个服务商数据
+func (d EnterpriseSupplierCooperateDao) GetDataByEnterpriseAndSupplier(enterpriseId string, supplierId int64) (*entity.EnterpriseSupplierCooperate, error) {
+	var enterpriseSupplierCooperate *entity.EnterpriseSupplierCooperate
+	query := Db.Debug().Model(&entity.EnterpriseSupplierCooperate{}).Where("enterprise_id = ? AND supplier_id = ?", enterpriseId, supplierId)
+	query = query.Select("supplier_id, cooperate_num, upload_talent_num, cooperate_talent_num, b_operator, b_operator_type")
+	err := query.Find(&enterpriseSupplierCooperate).Error
+	if err != nil && err != gorm.ErrRecordNotFound {
+		return nil, err
+	}
+	return enterpriseSupplierCooperate, nil
+}
+
 // 获取邀请待确认的服务商
 func (d EnterpriseSupplierCooperateDao) GetSupplierConfirmingList(enterpriseId string, page int, pageSize int) ([]*entity.EnterpriseSupplierCooperate, int64, error) {
 	var enterpriseSupplierCooperates []*entity.EnterpriseSupplierCooperate

+ 2 - 1
app/dao/project_dao.go

@@ -107,7 +107,7 @@ func (d ProjectDAO) GetProjectPreviews(param *vo.ProjectSearchParam) ([]vo.RePro
 		query = query.Where("content_type = ?", param.ContentType)
 	}
 	query.Count(&total)
-	query = query.Select("enterprise_id, sub_account_id, project_id, project_platform, project_status, estimated_cost, project_form, content_type, need_review, need_quality, need_calculate, product_id")
+	query = query.Select("enterprise_id, sub_account_id, project_id, project_platform, project_status, estimated_cost, project_form, content_type, need_review, need_quality, need_calculate, product_id, tools")
 	offset := (param.Page - 1) * param.PageSize
 	if err := query.Order("created_at asc").Offset(offset).Limit(param.PageSize).Find(&projects).Error; err != nil {
 		return nil, 0, err
@@ -126,6 +126,7 @@ func (d ProjectDAO) GetProjectPreviews(param *vo.ProjectSearchParam) ([]vo.RePro
 			NeedQuality:     project.NeedQuality,
 			NeedCalculate:   project.NeedCalculate,
 			ProductId:       project.ProductID,
+			Tools:           project.Tools,
 		}
 		reProjectTaskPreviews = append(reProjectTaskPreviews, reProjectTaskPreview)
 	}

+ 71 - 0
app/dao/s_project_dao.go

@@ -0,0 +1,71 @@
+package dao
+
+import (
+	"youngee_b_api/app/entity"
+)
+
+type SProjectDao struct{}
+
+// 插入数据
+func (d SProjectDao) Insert(record *entity.SProjectInfo) error {
+	result := Db.Debug().Model(&entity.SProjectInfo{}).Create(&record)
+	return result.Error
+}
+
+// 根据种草id、邀约状态返回数据列表
+func (d SProjectDao) GetSProjectByStatus(projectId string, status int64, page int, pageSize int) ([]*entity.SProjectInfo, int64, error) {
+	var sProjectInfos []*entity.SProjectInfo
+	var total int64
+	offset := (page - 1) * pageSize
+	query := Db.Debug().Model(&entity.SProjectInfo{}).Where("project_id = ? AND s_project_status = ?", projectId, status)
+	query.Count(&total)
+	query = query.Select("supplier_id,  b_operator, b_operator_type")
+	err := query.Order("create_time desc").Offset(offset).Limit(pageSize).Find(&sProjectInfos).Error
+	if err != nil {
+		return nil, 0, err
+	}
+
+	return sProjectInfos, total, nil
+}
+
+// 检查给定的服务商是否在该商家库中
+func (d SupplierDao) EnterpriseDatabaseCheck(enterpriseId string, supplierId int64) (bool, error) {
+	var count int64
+	err := Db.Debug().Model(&entity.EnterpriseSupplierCooperate{}).Where("enterprise_id = ? AND supplier_id = ? AND cooperate_status != 2", enterpriseId, supplierId).Count(&count).Error
+	if err != nil {
+		return false, err
+	}
+	return count > 0, nil
+}
+
+// 获取指定商家的服务商库
+func (d SupplierDao) GetSupplierByEnterprise(enterpriseId string, page int, pageSize int) ([]*entity.EnterpriseSupplierCooperate, int64, error) {
+	var enterpriseSupplierCooperates []*entity.EnterpriseSupplierCooperate
+	var total int64
+	offset := (page - 1) * pageSize
+	query := Db.Debug().Model(&entity.EnterpriseSupplierCooperate{}).Where("enterprise_id = ? AND cooperate_status = 2", enterpriseId)
+	query.Count(&total)
+	query = query.Select("supplier_id, cooperate_num, upload_talent_num, cooperate_talent_num, b_operator, b_operator_type, agree_time")
+	err := query.Order("agree_time desc").Offset(offset).Limit(pageSize).Find(&enterpriseSupplierCooperates).Error
+	if err != nil {
+		return nil, 0, err
+	}
+
+	return enterpriseSupplierCooperates, total, nil
+}
+
+// 获取邀请待确认的服务商
+func (d SupplierDao) GetSupplierConfirmingList(enterpriseId string, page int, pageSize int) ([]*entity.EnterpriseSupplierCooperate, int64, error) {
+	var enterpriseSupplierCooperates []*entity.EnterpriseSupplierCooperate
+	var total int64
+	offset := (page - 1) * pageSize
+	query := Db.Debug().Model(&entity.EnterpriseSupplierCooperate{}).Where("enterprise_id = ? AND cooperate_status = 1", enterpriseId)
+	query.Count(&total)
+	query = query.Select("supplier_id,  b_operator, b_operator_type, cooperate_status, create_time")
+	err := query.Order("create_time desc").Offset(offset).Limit(pageSize).Find(&enterpriseSupplierCooperates).Error
+	if err != nil {
+		return nil, 0, err
+	}
+
+	return enterpriseSupplierCooperates, total, nil
+}

+ 2 - 2
app/dao/supplier_dao.go

@@ -11,7 +11,7 @@ type SupplierDao struct{}
 func (d SupplierDao) GetSupplierInfoById(supplierId int64) (*entity.Supplier, error) {
 	var supplier entity.Supplier
 	err := Db.Debug().Model(&entity.Supplier{}).Where("supplier_id = ?", supplierId).First(&supplier).Error
-	if err != nil {
+	if err != nil && err != gorm.ErrRecordNotFound {
 		return nil, err
 	}
 	return &supplier, nil
@@ -39,7 +39,7 @@ func (d SupplierDao) GetSuppliersByMsg(fieldName string) ([]*entity.Supplier, er
 func (d SupplierDao) GetSupplierPhone(supplierId int64) (string, error) {
 	var phone string
 	err := Db.Debug().Model(&entity.Supplier{}).Where("supplier_id = ?", supplierId).Select("phone_number").First(&phone).Error
-	if err != nil {
+	if err != nil && err != gorm.ErrRecordNotFound {
 		return "", err
 	}
 	return phone, nil

+ 2 - 0
app/entity/recruit_strategy.go

@@ -12,6 +12,7 @@ type RecruitStrategy struct {
 	TOffer            float64 `gorm:"column:t_offer"`                                        // 达人所见报价
 	ProjectID         string  `gorm:"column:project_id"`                                     // 所属项目id
 	ServiceCharge     float64 `gorm:"column:service_charge"`                                 // 平台服务费,稿费形式为产品置换时必填
+	ServiceRate       float64 `gorm:"column:service_rate"`                                   // 服务费率
 	SelectedNumber    int64   `gorm:"column:selected_number;default:0"`                      // 已选数量,被企业选择的达人数量
 	WaitingNumber     int64   `gorm:"column:waiting_number;default:0"`                       // 待发货
 	DeliveredNumber   int64   `gorm:"column:delivered_number;default:0"`                     // 已发货
@@ -25,6 +26,7 @@ type RecruitStrategy struct {
 	CommentNumber     int64   `gorm:"column:comment_number;default:0"`                       // 总评论数
 	FinishNumber      int64   `gorm:"column:finish_number;default:0"`                        // 结案数量
 	TotalOffer        float64 `gorm:"column:total_offer;default:0"`                          // 支付合计
+	StrategyType      int64   `gorm:"column:strategy_type;default:0"`                        // 策略类型,1为商家设置,2为服务商设置
 }
 
 func (m *RecruitStrategy) TableName() string {

+ 27 - 0
app/entity/s_project.go

@@ -0,0 +1,27 @@
+package entity
+
+import "time"
+
+// 服务商加入商单的种草任务
+type SProjectInfo struct {
+	SProjectId          int64     `gorm:"column:s_project_id;primary_key;AUTO_INCREMENT"` // 服务商加入商单后的种草任务ID
+	ProjectId           string    `gorm:"column:project_id;"`                             // 被服务商加入商单的原种草任务ID
+	ShareCode           string    `gorm:"column:share_code"`                              // 分享码URL
+	SupplierId          int64     `gorm:"column:supplier_id"`                             // 所属服务商ID
+	ApplyNum            int64     `gorm:"column:apply_num;default:0;NOT NULL"`            // 报名人数
+	RecruitNum          int64     `gorm:"column:recruit_num;default:0;NOT NULL"`          // 已招募人数
+	SettleNum           int64     `gorm:"column:settle_num;default:0;NOT NULL"`           // 已结算人数
+	SubAccountId        int64     `gorm:"column:sub_account_id"`                          // 所属子账号ID
+	ServiceCharge       float64   `gorm:"column:service_charge"`                          // 服务商预估可赚服务费
+	ServiceChargeActual float64   `gorm:"column:service_charge_actual"`                   // 服务商实际可赚服务费
+	OperatorType        int64     `gorm:"column:operator_type"`                           // 添加商单操作人类型,1为服务商主账号,2为服务商子账号
+	SProjectStatus      int64     `gorm:"column:s_project_status"`                        // 服务商种草任务状态,1待确认,2已确认,3已拒绝
+	StrategyStatus      int64     `gorm:"column:strategy_status"`                         // 定向种草任务是否替换招募策略
+	BOperator           string    `gorm:"column:b_operator"`                              // 商家发起入库邀约人
+	BOperatorType       int64     `gorm:"column:b_operator_type"`                         // 商家发起入库邀约人类型:1主账号,2子账号
+	CreateTime          time.Time `gorm:"column:create_time;default:0;NOT NULL"`
+}
+
+func (m *SProjectInfo) TableName() string {
+	return "younggee_s_project_info"
+}

+ 145 - 12
app/service/cooperation_service.go

@@ -72,7 +72,7 @@ func (s CooperationService) GetEnterprisePoolList(param *vo.SupplierSearchInPool
 	var result vo.ResultVO
 	var reSupplierPoolInfos []*vo.ReSupplierPoolInfo
 	var enterpriseOperator string
-	enterpriseSupplierCooperates, total, _ := dao.EnterpriseSupplierCooperateDao{}.GetSuppliersByEnterprise(param.EnterpriseId, param.Page, param.PageSize)
+	enterpriseSupplierCooperates, total, _ := dao.EnterpriseSupplierCooperateDao{}.GetSupplierByEnterprise(param.EnterpriseId, param.Page, param.PageSize)
 	for _, enterpriseSupplierCooperate := range enterpriseSupplierCooperates {
 		// 获取商家操作人姓名
 		bOperator := enterpriseSupplierCooperate.BOperator
@@ -159,20 +159,22 @@ func (s CooperationService) GetSupplierConfirmingList(param *vo.SupplierConfirmi
 			}
 		}
 		supplier, err := dao.SupplierDao{}.GetSupplierInfoById(enterpriseSupplierCooperate.SupplierId)
-		if err != nil {
-			continue
-		}
-		supplierPreview := &vo.ReSupplierPreview{
-			SupplierId:   supplier.SupplierID,
-			HeadUrl:      "",
-			SupplierName: supplier.SupplierName,
-			SupplierType: supplier.SupplierType,
-			CompanyName:  supplier.CompanyName,
-			Name:         supplier.Name,
+		var supplierPreview *vo.ReSupplierPreview
+		var phoneNumber string
+		if err == nil {
+			supplierPreview = &vo.ReSupplierPreview{
+				SupplierId:   supplier.SupplierID,
+				HeadUrl:      "",
+				SupplierName: supplier.SupplierName,
+				SupplierType: supplier.SupplierType,
+				CompanyName:  supplier.CompanyName,
+				Name:         supplier.Name,
+			}
+			phoneNumber = supplier.PhoneNumber
 		}
 		reSupplierConfirmingInfo := &vo.ReSupplierConfirmingInfo{
 			SupplierPreview:    supplierPreview,
-			PhoneNumber:        supplier.PhoneNumber,
+			PhoneNumber:        phoneNumber,
 			WechatId:           "",
 			WechatUrl:          "",
 			CreateTime:         enterpriseSupplierCooperate.CreateTime.Format("2006-01-02 15:04:05"),
@@ -189,3 +191,134 @@ func (s CooperationService) GetSupplierConfirmingList(param *vo.SupplierConfirmi
 	}
 	return result, nil
 }
+
+// 服务商合作-服务商列表
+func (s CooperationService) GetSupplierInTargetTaskList(param *vo.SupplierSearchInTargetTaskParam) (vo.ResultVO, error) {
+	if param.Page <= 0 {
+		param.Page = 1
+	}
+	if param.PageSize <= 0 {
+		param.PageSize = 10
+	}
+	var reSupplierTargetTasks []*vo.ReSupplierTargetTask
+	var total int64
+	result := vo.ResultVO{
+		Page:     param.Page,
+		PageSize: param.PageSize,
+		Total:    total,
+		Data:     reSupplierTargetTasks,
+	}
+	var enterpriseSupplierCooperates []*entity.EnterpriseSupplierCooperate
+	var sProjectInfos []*entity.SProjectInfo
+	var enterpriseOperator string
+	if param.Status == 1 { // 可邀约
+		enterpriseSupplierCooperates, total, _ = dao.EnterpriseSupplierCooperateDao{}.GetSupplierByEnterprise(param.EnterpriseId, param.Page, param.PageSize)
+	} else if param.Status == 2 { // 邀约中
+		if param.TaskType == 2 {
+			// 品牌种草
+			sProjectInfos, total, _ = dao.SProjectDao{}.GetSProjectByStatus(param.TaskId, 1, param.Page, param.PageSize)
+		} else if param.TaskType == 3 {
+			// 本地生活
+
+		}
+	} else if param.Status == 3 { // 合作中
+		if param.TaskType == 2 {
+			// 品牌种草
+			sProjectInfos, total, _ = dao.SProjectDao{}.GetSProjectByStatus(param.TaskId, 2, param.Page, param.PageSize)
+		} else if param.TaskType == 3 {
+			// 本地生活
+
+		}
+	}
+	if enterpriseSupplierCooperates == nil {
+		if param.TaskType == 2 { // 种草
+			for _, sProjectInfo := range sProjectInfos {
+				supplierId := sProjectInfo.SupplierId
+				enterpriseSupplierCooperate, err1 := dao.EnterpriseSupplierCooperateDao{}.GetDataByEnterpriseAndSupplier(param.EnterpriseId, supplierId)
+				if err1 != nil {
+					return result, err1
+				}
+				enterpriseSupplierCooperates = append(enterpriseSupplierCooperates, enterpriseSupplierCooperate)
+			}
+		} else if param.TaskType == 3 {
+			// 本地生活
+
+		}
+	}
+	for _, enterpriseSupplierCooperate := range enterpriseSupplierCooperates {
+		// 获取商家操作人姓名
+		bOperator := enterpriseSupplierCooperate.BOperator
+		if enterpriseSupplierCooperate.BOperatorType == 1 {
+			enterprise, err := dao.EnterpriseDao{}.GetEnterprise(bOperator)
+			if err == nil && enterprise != nil {
+				enterpriseOperator = enterprise.BusinessName
+			}
+		} else if enterpriseSupplierCooperate.BOperatorType == 2 {
+			subAccountId, err := strconv.ParseInt(bOperator, 10, 64)
+			if err != nil {
+				fmt.Println("GetEnterprisePoolList==subAccountId 转换出错:", err)
+			} else {
+				subAccount, err := dao.SubAccountDao{}.GetSubAccount(subAccountId)
+				if err == nil && subAccount != nil {
+					enterpriseOperator = subAccount.SubAccountName
+				}
+			}
+		}
+		supplier, err := dao.SupplierDao{}.GetSupplierInfoById(enterpriseSupplierCooperate.SupplierId)
+		var supplierPreview *vo.ReSupplierPreview
+		var phoneNumber string
+		if err == nil {
+			supplierPreview = &vo.ReSupplierPreview{
+				SupplierId:   supplier.SupplierID,
+				HeadUrl:      "",
+				SupplierName: supplier.SupplierName,
+				SupplierType: supplier.SupplierType,
+				CompanyName:  supplier.CompanyName,
+				Name:         supplier.Name,
+				Existence:    true,
+			}
+			phoneNumber = supplier.PhoneNumber
+		}
+		reSupplierTargetTask := &vo.ReSupplierTargetTask{
+			SupplierPreview:    supplierPreview,
+			PhoneNumber:        phoneNumber,
+			WechatId:           "",
+			WechatUrl:          "",
+			CooperateNum:       enterpriseSupplierCooperate.CooperateNum,
+			UploadTalentNum:    enterpriseSupplierCooperate.UploadTalentNum,
+			CooperateTalentNum: enterpriseSupplierCooperate.CooperateTalentNum,
+			EnterpriseOperator: enterpriseOperator,
+			Status:             param.Status,
+		}
+		reSupplierTargetTasks = append(reSupplierTargetTasks, reSupplierTargetTask)
+	}
+	result = vo.ResultVO{
+		Page:     param.Page,
+		PageSize: param.PageSize,
+		Total:    total,
+		Data:     reSupplierTargetTasks,
+	}
+	return result, nil
+}
+
+// 服务商合作-邀约合作
+func (s CooperationService) InviteSupplierInTargetTask(param *vo.SupplierInviteInTargetTaskParam) error {
+	var sProjectInfo entity.SProjectInfo
+	if param.TaskType == 2 {
+		sProjectInfo.ProjectId = param.TaskId
+		sProjectInfo.SupplierId = param.SupplierId
+		sProjectInfo.SProjectStatus = 1
+		sProjectInfo.CreateTime = time.Now()
+		if param.SubAccountId == 0 {
+			sProjectInfo.BOperator = param.EnterpriseId
+			sProjectInfo.BOperatorType = 1
+		} else {
+			sProjectInfo.BOperator = strconv.Itoa(int(param.SubAccountId))
+			sProjectInfo.BOperatorType = 2
+		}
+	} else if param.TaskType == 3 {
+		// 本地生活
+	}
+	err := dao.SProjectDao{}.Insert(&sProjectInfo)
+	return err
+}

+ 20 - 15
app/service/project_service.go

@@ -44,20 +44,21 @@ func (s ProjectService) CreateProject(param *vo.ProjectCreateParam) (*string, er
 	infoAutoDefault = dao.InfoAutoDefaultDao{}.GetAutoDefaultLast(param.EnterpriseId)
 	t := time.Now()
 	newProject := entity.Project{
-		ProjectStatus:    1,
-		ProjectType:      param.ProjectType,
-		ProjectId:        projectId,
-		ProductID:        param.ProductId,
-		ProductCategory:  product.ProductCategory,
-		EnterpriseID:     param.EnterpriseId,
-		SubAccountId:     param.SubAccountId,
-		ProjectPlatform:  param.Platform,
-		OperatorType:     operatorType,
-		ProductSnap:      string(productInfoToJson),
-		ProductPhotoSnap: string(productPhotosToJson),
-		CreatedAt:        t,
-		AutoTaskID:       infoAutoTask.AutoTaskID,
-		AutoDefaultID:    infoAutoDefault.AutoDefaultID,
+		ProjectStatus:     1,
+		ProjectType:       param.ProjectType,
+		ProjectId:         projectId,
+		ProductID:         param.ProductId,
+		ProductCategory:   product.ProductCategory,
+		EnterpriseID:      param.EnterpriseId,
+		SubAccountId:      param.SubAccountId,
+		ProjectPlatform:   param.Platform,
+		OperatorType:      operatorType,
+		ProductSnap:       string(productInfoToJson),
+		ProductPhotoSnap:  string(productPhotosToJson),
+		CreatedAt:         t,
+		AutoTaskID:        infoAutoTask.AutoTaskID,
+		AutoDefaultID:     infoAutoDefault.AutoDefaultID,
+		ServiceChargeRate: param.ServiceChargeRate,
 	}
 	if param.ProjectType == 1 {
 		newProject.ServiceChargeRate = param.ServiceChargeRate
@@ -101,6 +102,8 @@ func (s ProjectService) UpdateProject(projectUpdateParam *vo.ProjectUpdateParam)
 					FollowersUp:   strategy.FollowersUp,
 					RecruitNumber: strategy.RecruitNumber,
 					ProjectID:     project.ProjectId,
+					StrategyType:  1,
+					ServiceRate:   project.ServiceChargeRate,
 				}
 				totalRecruitNum += strategy.RecruitNumber
 				if strategy.FeeForm == 2 {
@@ -254,6 +257,8 @@ func (s ProjectService) UpdateProjectTarget(projectUpdateParam *vo.ProjectUpdate
 					FollowersUp:   strategy.FollowersUp,
 					RecruitNumber: strategy.RecruitNumber,
 					ProjectID:     project.ProjectId,
+					StrategyType:  1,
+					ServiceRate:   project.ServiceChargeRate,
 				}
 				totalRecruitNum += strategy.RecruitNumber
 				if strategy.FeeForm == 2 {
@@ -488,7 +493,7 @@ func (s ProjectService) ProjectToReview(projectUpdateParam *vo.ProjectUpdatePara
 	return &projectId, nil
 }
 
-// 公开种草任务列表
+// 种草任务列表
 func (s ProjectService) GetProjectTaskList(param *vo.ProjectSearchParam) (vo.ResultVO, error) {
 	if param.Page == 0 {
 		param.Page = 1

+ 1 - 1
app/vo/project_update_param.go

@@ -13,7 +13,7 @@ type ProjectUpdateParam struct {
 	RecruitDdl        string                  `json:"recruit_ddl"`       // 招募截止时间
 	RecruitStrategys  []CreateRecruitStrategy `json:"recruit_strategys"` // 招募策略
 
-	ProjectForm     int64                  `json:"project_form"`   // 项目形式,1-4分别代表实体商品寄拍、虚拟产品测评、线下探店打卡、素材微原创
+	ProjectForm     int64                  `json:"project_form"`   // 项目形式,1-3分别代表商品寄拍、素材分发、虚拟产品测评
 	ContentType     int64                  `json:"content_type"`   // 内容形式,1代表图文,2代表视频
 	ProjectDetail   string                 `json:"project_detail"` // 项目详情
 	Tools           string                 `json:"tools"`          // 工具选择 1邀约招募 2结算账单 3样品物流 4审稿工具 5作品审查 6数据巡检(,分隔)

+ 1 - 0
app/vo/re_project_task_preview.go

@@ -20,4 +20,5 @@ type ReProjectTaskPreview struct {
 	CreatorName     string  `json:"creatorName"`
 	ProjectType     int64   `json:"projectType"`
 	CreatedAt       string  `json:"createdAt"`
+	Tools           string  `json:"tools"`
 }

+ 13 - 0
app/vo/re_supplier_target_task.go

@@ -0,0 +1,13 @@
+package vo
+
+type ReSupplierTargetTask struct {
+	SupplierPreview    *ReSupplierPreview `json:"supplierPreview"`
+	PhoneNumber        string             `json:"phoneNumber"`        // 手机号
+	WechatId           string             `json:"wechatId"`           // 微信号
+	WechatUrl          string             `json:"wechatUrl"`          // 微信二维码
+	CooperateNum       int64              `json:"cooperateNum"`       // 受邀合作次数
+	UploadTalentNum    int64              `json:"uploadTalentNum"`    // 提报达人数
+	CooperateTalentNum int64              `json:"cooperateTalentNum"` // 合作达人数
+	EnterpriseOperator string             `json:"enterpriseOperator"` // 邀请操作人
+	Status             int64              `json:"status"`             // 状态:1可邀约 2邀约中 3合作中
+}

+ 18 - 0
app/vo/supplier_search_param.go

@@ -23,3 +23,21 @@ type SupplierConfirmingParam struct {
 	Page         int    `json:"page"`
 	PageSize     int    `json:"page_size"`
 }
+
+type SupplierSearchInTargetTaskParam struct {
+	EnterpriseId string `json:"enterprise_id"`
+	SubAccountId int64  `json:"sub_account_id"`
+	TaskType     int64  `json:"task_type"` // 任务类型:2品牌种草 3本地生活
+	TaskId       string `json:"task_id"`
+	Status       int64  `json:"status"` // 1可邀约 2邀约中 3合作中
+	Page         int    `json:"page"`
+	PageSize     int    `json:"page_size"`
+}
+
+type SupplierInviteInTargetTaskParam struct {
+	EnterpriseId string `json:"enterprise_id"`
+	SubAccountId int64  `json:"sub_account_id"`
+	TaskType     int64  `json:"task_type"` // 任务类型:2品牌种草 3本地生活
+	TaskId       string `json:"task_id"`
+	SupplierId   int64  `json:"supplier_id"`
+}

+ 9 - 7
route/init.go

@@ -177,7 +177,7 @@ func InitRoute(r *gin.Engine) {
 		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) // 上传物流信息
+		s.POST("/selection/task/logistics/create", handler.WrapCreateSecTaskLogisticsHandler) // 上传物流信息 **
 		s.POST("/selection/task/logistics/update", handler.WrapUpdateSecTaskLogisticsHandler) // 修改物流信息
 		s.POST("/selection/task/settle", handler.WrapSettleSecTaskHandler)                    // 结算
 		s.POST("/selection/getAllSelection", handler.WrapGetAllSelectionHandler)              // 查询选品广场选品列表
@@ -210,7 +210,7 @@ func InitRoute(r *gin.Engine) {
 		task.POST("/project/target/update", controller.TaskController{}.UpdateProjectTarget) // 更新定向种草任务
 		task.POST("/project/detail", controller.TaskController{}.GetProjectDetail)           // 品牌种草任务预览
 		task.POST("/project/toReview", controller.TaskController{}.ProjectToReview)          // 种草提交审核
-		task.POST("/project/task/list", controller.TaskController{}.ProjectTaskList)         // 公开种草任务列表
+		task.POST("/project/task/list", controller.TaskController{}.ProjectTaskList)         // 种草任务列表
 		task.POST("/project/del", controller.TaskController{}.ProjectDel)                    // 删除种草任务
 
 		task.POST("/draft/selection/list", controller.TaskController{}.GetSelectionDraftList) // 草稿箱——电商带货列表
@@ -223,6 +223,9 @@ func InitRoute(r *gin.Engine) {
 		task.POST("/default/talent/cancel", controller.TaskController{}.CancelTalent)                    // 违约管理——达人解约
 		task.POST("/default/talent/cancel/list", controller.TaskController{}.CancelTalentList)           // 违约管理——达人批量解约
 
+		// 服务商合作
+		task.POST("/supplier/list", controller.TaskController{}.GetSupplierInTargetTaskList) // 服务商合作-服务商列表
+		task.POST("/supplier/invite", controller.TaskController{}.InviteSupplier)            // 服务商合作-邀约合作
 	}
 	// 财务结算相关接口
 	finance := r.Group("/youngee/b/finance")
@@ -231,11 +234,10 @@ func InitRoute(r *gin.Engine) {
 		finance.POST("/recharge/transferToPublic", controller.FinanceController{}.TransferToPublic)  // 充值管理——对公转账
 		finance.POST("/pay/getCodeUrl", controller.FinanceController{}.GetCodeUrl)                   // 获取微信支付codeURL
 		finance.POST("/pay/queryOrderByTradeId", controller.FinanceController{}.QueryOrderByTradeId) // 根据交易id查询微信是否扫码付款
-		// 微信支付充值成功上报(待开会确定超时未支付算不算充值失败)
-		finance.POST("/balance/show", controller.FinanceController{}.ShowBalance)           // 余额管理——总金额、可用余额、冻结金额
-		finance.POST("/balance/frozen/info", controller.FinanceController{}.FrozenInfoList) // 余额管理——冻结记录
-		finance.POST("/recharge/show", controller.FinanceController{}.ShowRecharge)         // 充值管理——累计充值金额、确认中金额
-		finance.POST("/recharge/info", controller.FinanceController{}.RechargeInfoList)     // 充值管理——充值记录
+		finance.POST("/balance/show", controller.FinanceController{}.ShowBalance)                    // 余额管理——总金额、可用余额、冻结金额
+		finance.POST("/balance/frozen/info", controller.FinanceController{}.FrozenInfoList)          // 余额管理——冻结记录
+		finance.POST("/recharge/show", controller.FinanceController{}.ShowRecharge)                  // 充值管理——累计充值金额、确认中金额
+		finance.POST("/recharge/info", controller.FinanceController{}.RechargeInfoList)              // 充值管理——充值记录
 		// YG官方汇款账号
 		finance.POST("/invoice/default/update", controller.FinanceController{}.UpdateInvoiceDefault) // 设置默认开票抬头
 		finance.POST("/invoice/default/get", controller.FinanceController{}.GetInvoiceDefault)       // 获取默认开票抬头

+ 1 - 0
service/logistics.go

@@ -222,6 +222,7 @@ func (*logistics) SignForReceipt(ctx *gin.Context, data http_model.SignForReceip
 	return nil
 }
 
+// **
 func (l *logistics) CreateSpecialLogistics(ctx context.Context, newLogistics http_model.CreateSpecialLogisticsRequest) (*http_model.SpecialLogisticsData, error) {
 	ThingsType := newLogistics.ThingsType
 	Logistics := gorm_model.YoungeeTaskLogistics{