package service import ( "context" "fmt" "github.com/issue9/conv" "github.com/sirupsen/logrus" "time" "youngee_b_api/db" "youngee_b_api/model/common_model" "youngee_b_api/model/gorm_model" "youngee_b_api/model/http_model" ) var SLocalLife *sLocalLife type sLocalLife struct { } // CreateSLocalLife 新建服务商加入商单后的公开本地生活 func (*sLocalLife) CreateSLocalLife(ctx context.Context, request *http_model.LocalLifeAddToListRequest) error { var sLocalLifeInfo *gorm_model.YounggeeSLocalLifeInfo sLocalLifeInfo = &gorm_model.YounggeeSLocalLifeInfo{} // 1. 建立SLocalLife信息 // 1.1. 根据传入的LocalLifeId去LocalLife表查找信息补全SLocalLife localLifeInfo, localErr := db.GetLocalLifeDetail(ctx, request.LocalId) if localErr != nil { return localErr } if localLifeInfo != nil { sLocalLifeInfo.LocalId = localLifeInfo.LocalId sLocalLifeInfo.SettleNum = 0 sLocalLifeInfo.RecruitNum = 0 sLocalLifeInfo.ApplyNum = 0 sLocalLifeInfo.LocalType = localLifeInfo.LocalType sLocalLifeInfo.LocalName = localLifeInfo.LocalName sLocalLifeInfo.LocalPlatform = localLifeInfo.LocalPlatform sLocalLifeInfo.TaskStatus = localLifeInfo.TaskStatus sLocalLifeInfo.StoreId = localLifeInfo.StoreId sLocalLifeInfo.TeamBuyingId = localLifeInfo.TeamBuyingId sLocalLifeInfo.TaskForm = localLifeInfo.TaskForm sLocalLifeInfo.ContentType = localLifeInfo.ContentType sLocalLifeInfo.SLocalStatus = 2 // 1.2. 填入加入商单操作人信息 var operatorType int if request.SubAccountId == 0 { operatorType = 1 } else { operatorType = 2 } sLocalLifeInfo.SubAccountId = request.SubAccountId sLocalLifeInfo.SupplierId = request.SupplierId sLocalLifeInfo.OperatorType = operatorType currTime := time.Now() sLocalLifeInfo.CreateTime = &currTime // 2. 入库 sLocalId, createErr := db.CreateSLocalLife(ctx, sLocalLifeInfo) if createErr != nil { return createErr } // 2. 建立新的recruitStrategy // 2.1. 根据localId去查找原来的recruitStrategy recruitStrategys, strategyErr := db.GetRecruitStrategyByProjectId(ctx, request.LocalId) if strategyErr != nil { return strategyErr } // 2.2. 设置新的结构体以写入 var currRecruitStrategys []gorm_model.RecruitStrategy for _, strategy := range recruitStrategys { var currStrategy gorm_model.RecruitStrategy currStrategy.StrategyID = strategy.StrategyID currStrategy.QuoteRecruitStrategyId = int(strategy.RecruitStrategyID) currStrategy.FeeForm = strategy.FeeForm currStrategy.FollowersLow = strategy.FollowersLow currStrategy.FollowersUp = strategy.FollowersUp currStrategy.RecruitNumber = strategy.RecruitNumber currStrategy.Offer = strategy.Offer currStrategy.TOffer = strategy.TOffer currStrategy.ProjectID = "0" currStrategy.ServiceCharge = strategy.ServiceCharge currStrategy.ServiceRate = strategy.ServiceRate currStrategy.SLocalId = sLocalId currStrategy.StrategyType = 2 currRecruitStrategys = append(currRecruitStrategys, currStrategy) } // 2.3. 写入 createStrategyErr := db.CreateSpecialStrategy(ctx, currRecruitStrategys) if createStrategyErr != nil { return createStrategyErr } } return nil } func (*sLocalLife) ShowSLocalLife(ctx context.Context, req *http_model.ShowSLocalRequest) (*http_model.ShowSLocalData, error) { var sLocalInfo *http_model.ShowSLocalData sLocalInfo = &http_model.ShowSLocalData{} // 1. 查询系统信息 localInfo, localErr := db.GetLocalLifeDetail(ctx, req.LocalId) if localErr != nil { return nil, localErr } if localInfo != nil { sLocalInfo.LocalId = localInfo.LocalId sLocalInfo.SLocalId = req.SLocalId sLocalInfo.LocalPlatform = localInfo.LocalPlatform sLocalInfo.TaskStatus = localInfo.TaskStatus sLocalInfo.EnterpriseId = localInfo.EnterpriseId sLocalInfo.ServiceChargeRate = localInfo.ServiceChargeRate sLocalInfo.EstimatedCost = localInfo.EstimatedCost sLocalInfo.CreateAt = conv.MustString(localInfo.CreatedAt) // 2. 关联主体 // 2.1. 门店信息 storeInfo, storeErr := db.FindStoreById(ctx, localInfo.StoreId) if storeErr != nil { return nil, storeErr } if storeInfo != nil { sLocalInfo.StoreId = storeInfo.StoreId sLocalInfo.StoreName = storeInfo.StoreName sLocalInfo.StoreCategory = storeInfo.StoreCategory sLocalInfo.StoreRelatedAt = conv.MustString(localInfo.StoreRelatedAt) // 2.2. 门店图片信息 storePhotoInfo, storePhotoErr := db.GetStorePhotoByStoreID(ctx, localInfo.StoreId) if storePhotoErr != nil { return nil, storePhotoErr } if storePhotoInfo != nil { for _, photo := range storePhotoInfo { if photo.Symbol == 1 { sLocalInfo.StoreMainPhotoSymbol = 1 sLocalInfo.StoreMainPhotoUrl = photo.PhotoUrl sLocalInfo.StoreMainPhotoUid = photo.PhotoUid } } } } // 2.3. 团购信息 teamInfo, teamErr := db.FindTeamById(ctx, localInfo.StoreId) if teamErr != nil { return nil, teamErr } if teamInfo != nil { sLocalInfo.TeamBuyingId = teamInfo.StoreId sLocalInfo.TeamBuyingName = teamInfo.TeamBuyingName sLocalInfo.TeamBuyingCategory = teamInfo.TeamBuyingCategory sLocalInfo.TeamBuyingRelatedAt = conv.MustString(localInfo.TeamBuyingRelatedAt) // 2.4. 团购图片信息 teamPhotoInfo, teamPhotoErr := db.GetTeamPhotoByStoreID(ctx, localInfo.StoreId) if teamPhotoErr != nil { return nil, teamPhotoErr } if teamPhotoInfo != nil { for _, photo := range teamPhotoInfo { if photo.Symbol == 1 { sLocalInfo.TeamMainPhotoSymbol = 1 sLocalInfo.TeamMainPhotoUrl = photo.PhotoUrl sLocalInfo.TeamMainPhotoUid = photo.PhotoUid } } } } // 3. 招募要求 sLocalInfo.TalentType = localInfo.TalentType sLocalInfo.RecruitDdl = conv.MustString(localInfo.RecruitDdl) recruitStrategy, recruitErr := db.GetRecruitStrategyBySLocalId(ctx, req.SLocalId) if recruitErr != nil { return nil, recruitErr } if recruitStrategy != nil { for _, strategy := range recruitStrategy { showStrategy := http_model.ShowSRecruitStrategy{ StrategyID: strategy.StrategyID, FeeForm: strategy.FeeForm, FollowersLow: strategy.FollowersLow, FollowersUp: strategy.FollowersUp, RecruitNumber: strategy.RecruitNumber, Offer: strategy.Offer, } sLocalInfo.RecruitStrategys = append(sLocalInfo.RecruitStrategys, showStrategy) } } // 4. 执行要求 sLocalInfo.TaskForm = localInfo.TaskForm sLocalInfo.ContentType = localInfo.ContentType briefInfo, briefErr := db.FindBriefByLocalId(ctx, req.LocalId) if briefErr != nil { return nil, briefErr } if briefInfo != nil { sLocalInfo.LocalBrief = briefInfo } materialInfo, materialErr := db.FindMaterialByLocalId(ctx, req.LocalId) if materialErr != nil { return nil, materialErr } if materialInfo != nil { sLocalInfo.LocalMaterial = materialInfo } } return sLocalInfo, nil } func (*sLocalLife) GetFullSLocalLifeList(ctx context.Context, pageSize, pageNum int32, supplierId int, condition *common_model.SLocalLifeCondition) (*http_model.FullSLocalListData, error) { // 1. 查询本地生活任务基本信息 fullLocals, total, err := db.GetFullSLocalLifeList(ctx, pageSize, pageNum, condition) if err != nil { logrus.WithContext(ctx).Errorf("[fullLocals service] call GetFullSLocalLifeList error,err:%+v", err) return nil, err } var fullLocalData *http_model.FullSLocalListData fullLocalData = &http_model.FullSLocalListData{} fullLocalData.Total = total for _, fullLocal := range fullLocals { var fullLocalPreview *http_model.FullSLocalPreview fullLocalPreview = &http_model.FullSLocalPreview{} fullLocalPreview.LocalId = fullLocal.LocalId fullLocalPreview.TaskStatus = fullLocal.TaskStatus fullLocalPreview.LocalPlatform = fullLocal.LocalPlatform fullLocalPreview.TaskForm = fullLocal.TaskForm fullLocalPreview.LocalType = fullLocal.LocalType fullLocalPreview.LocalContentType = fullLocal.ContentType fullLocalPreview.SupplierId = supplierId fullLocalPreview.SubAccountId = fullLocal.SubAccountId fullLocalPreview.OperatorType = fullLocal.OperatorType fullLocalPreview.CreateTime = conv.MustString(fullLocal.CreateTime) fullLocalPreview.ServiceCharge = fullLocal.ServiceCharge fullLocalPreview.ServiceChargeActual = fullLocal.ServiceChargeActual fullLocalPreview.ApplyNum = fullLocal.ApplyNum fullLocalPreview.RecruitNum = fullLocal.RecruitNum fullLocalPreview.SettleNum = fullLocal.SettleNum fullLocalData.FullSLocalPreview = append(fullLocalData.FullSLocalPreview, fullLocalPreview) } // 2. 查询本地生活补充信息:门店信息,招募策略 for _, local := range fullLocalData.FullSLocalPreview { // 2.1. 门店信息 storeInfo, productErr := db.FindStoreById(ctx, local.StoreId) if productErr != nil { return nil, productErr } if storeInfo != nil { local.StoreId = storeInfo.StoreId local.StoreName = storeInfo.StoreName } // 2.2. 门店图片信息 productPhotoInfo, productPhotoErr := db.GetStorePhotoByStoreID(ctx, local.StoreId) if productPhotoErr != nil { return nil, productPhotoErr } if productPhotoInfo != nil { for _, photo := range productPhotoInfo { fmt.Println(photo) if photo.Symbol == 1 { local.StoreMainPhotoSymbol = 1 local.StoreMainPhotoUrl = photo.PhotoUrl local.StoreMainPhotoUid = photo.PhotoUid } } } } return fullLocalData, nil } // GetLocalTaskList 查询本地生活子任务 func (*sLocalLife) GetLocalTaskList(ctx context.Context, pageSize, pageNum int32, orderBy []string, orderDesc []int, condition *common_model.LocalTaskConditions) (*http_model.LocalTaskListData, error) { var localTaskListData *http_model.LocalTaskListData localTaskListData = &http_model.LocalTaskListData{} // 1. 根据condition查询子任务信息 localTaskList, total, localTaskErr := db.GetLocalTaskList(ctx, pageSize, pageNum, orderBy, orderDesc, condition) if localTaskErr != nil { return nil, localTaskErr } if localTaskList != nil { localTaskListData.Total = total for _, localTask := range localTaskList { var localTaskInfo *http_model.LocalTaskPreview localTaskInfo = &http_model.LocalTaskPreview{} // 2. 补充查询达人身份信息 talentInfo, talentErr := db.FindUserInfoByTalentId(ctx, localTask.TalentID) if talentErr != nil { return nil, talentErr } if talentInfo != nil { localTaskInfo.TaskId = localTask.TaskID localTaskInfo.TaskStage = localTask.TaskStage localTaskInfo.ServiceCharge = localTask.ServiceCharge localTaskInfo.DraftFee = localTask.DraftFee localTaskInfo.SupportFee = localTask.SupportFee localTaskInfo.StrategyId = localTask.StrategyID localTaskInfo.TaskStatus = localTask.TaskStatus localTaskInfo.CreateDate = conv.MustString(localTask.CreateDate) localTaskInfo.SelectDate = conv.MustString(localTask.SelectDate) localTaskInfo.DeliveryDate = conv.MustString(localTask.DeliveryDate) localTaskInfo.SignedTime = conv.MustString(localTask.SignedTime) localTaskInfo.CurBreakAt = conv.MustString(localTask.CurBreakAt) localTaskInfo.FansNum = localTask.FansNum localTaskInfo.VoteAvg = localTask.VoteAvg localTaskInfo.CommitAvg = localTask.CommitAvg localTaskInfo.BOperator = localTask.BOperator localTaskInfo.BOperatorType = localTask.BOperatorType localTaskInfo.SOperator = localTask.SOperator localTaskInfo.SOperatorType = localTask.SOperatorType localTaskInfo.PlatformNickname = talentInfo.NickName localTaskInfo.FansCount = talentInfo.Fan localTaskInfo.AvatarUrl = talentInfo.HeadUri localTaskInfo.Location = talentInfo.City localTaskInfo.Gender = talentInfo.Gender localTaskListData.LocalTaskPreview = append(localTaskListData.LocalTaskPreview, localTaskInfo) } } // 3. 本地生活任务信息补充 sLocalInfo, sLocalErr := db.GetSLocalLifeDetail(ctx, condition.SLocalId) if sLocalErr != nil { return nil, sLocalErr } if sLocalInfo != nil { localTaskListData.SettleNum = sLocalInfo.SettleNum localTaskListData.RecruitNum = sLocalInfo.RecruitNum localTaskListData.ServiceChargeActual = sLocalInfo.ServiceChargeActual localTaskListData.ServiceChargeSettle = sLocalInfo.ServiceChargeSettle localTaskListData.EstimateServiceCharge = sLocalInfo.ServiceChargeActual localTaskListData.EstimateDraftFee = sLocalInfo.EstimateDraftFee localTaskListData.EstimateSupportFee = sLocalInfo.EstimateSupportFee } } return localTaskListData, nil } // ChangeTaskSupplierStatus 本地生活达人报名通过、拒绝报名 func (*sLocalLife) ChangeTaskSupplierStatus(ctx context.Context, req *http_model.LocalChangeSupplierStatusRequest) error { // 1. 同意/拒绝 RecruitStrategyIDs, err := db.ChangeLocalTaskStatus(ctx, req.TaskIds, req.SupplierStatus, req.SupplierId, req.SubAccountId) if err != nil { logrus.WithContext(ctx).Errorf("[project service] call ChangeTaskStatus error,err:%+v", err) return err } fmt.Println(RecruitStrategyIDs) return nil } // ChangeSupplierStatus 定向本地生活加入商单或拒绝 func (*sLocalLife) ChangeSupplierStatus(ctx context.Context, req *http_model.SpecialLocalAddToListRequest) error { var sLocalInfo *gorm_model.YounggeeSLocalLifeInfo sLocalInfo = &gorm_model.YounggeeSLocalLifeInfo{} var operatorType int if req.SubAccountId == 0 { operatorType = 1 } else { operatorType = 2 } sLocalInfo.SLocalId = req.SLocalId sLocalInfo.SupplierId = req.SupplierId sLocalInfo.SubAccountId = req.SubAccountId sLocalInfo.OperatorType = operatorType sLocalInfo.SLocalStatus = req.SLocalStatus err := db.UpdateSLocal(ctx, sLocalInfo) if err != nil { return err } return nil } // CreateSpecialStrategy 定向本地生活替换服务费率 func (*sLocalLife) CreateSpecialStrategy(ctx context.Context, request *http_model.LocalSpecialAddStrategyRequest) error { // 1. 添加服务商招募策略 // 1.1. 整理数据 for _, strategy := range request.RecruitStrategys { // 一口价需要计算服务费率和达人所见报价 strategy.ServiceRate = int(strategy.ServiceCharge / strategy.Offer) strategy.TOffer = strategy.Offer - strategy.ServiceCharge strategy.ProjectID = "0" strategy.SLocalId = request.SLocalId strategy.QuoteRecruitStrategyId = int(strategy.RecruitStrategyID) } createErr := db.CreateSpecialStrategy(ctx, request.RecruitStrategys) if createErr != nil { return createErr } // 2. 修改sProject中的字段 var sLocalInfo *gorm_model.YounggeeSLocalLifeInfo sLocalInfo = &gorm_model.YounggeeSLocalLifeInfo{} if request.SubAccountId == 0 { sLocalInfo.CreateStrategyType = 1 sLocalInfo.CreateStrategyId = request.SupplierId } else { sLocalInfo.CreateStrategyType = 2 sLocalInfo.CreateStrategyId = request.SubAccountId } sLocalInfo.SLocalId = request.SLocalId sLocalInfo.StrategyStatus = 1 updateErr := db.UpdateSLocal(ctx, sLocalInfo) if updateErr != nil { return updateErr } return nil } // GetFullSLocalBillList 服务商本地生活任务账单列表 func (*sLocalLife) GetFullSLocalBillList(ctx context.Context, req *http_model.FullSLocalBillListRequest) (*http_model.FullSLocalBillData, error) { // 1. 查询本地生活任务基本信息 fullLocals, total, err := db.GetFullSLocalBillList(ctx, req.PageSize, req.PageNum, req.SupplierId) if err != nil { logrus.WithContext(ctx).Errorf("[fullLocals service] call GetFullSLocalLifeList error,err:%+v", err) return nil, err } var fullLocalData *http_model.FullSLocalBillData fullLocalData = &http_model.FullSLocalBillData{} fullLocalData.Total = total for _, fullLocal := range fullLocals { var fullLocalPreview *http_model.FullSLocalBillListData fullLocalPreview = &http_model.FullSLocalBillListData{} fullLocalPreview.SLocalId = fullLocal.SLocalId fullLocalPreview.LocalId = fullLocal.LocalId fullLocalPreview.LocalPlatform = fullLocal.LocalPlatform fullLocalPreview.TaskForm = fullLocal.TaskForm fullLocalPreview.ContentType = fullLocal.ContentType fullLocalPreview.TaskStatus = fullLocal.TaskStatus fullLocalPreview.EnterpriseId = fullLocal.EnterpriseId fullLocalPreview.SupplierId = fullLocal.SupplierId fullLocalPreview.SubAccountId = fullLocal.SubAccountId fullLocalPreview.ServiceChargeActual = fullLocal.ServiceChargeActual fullLocalPreview.ServiceChargeSettle = fullLocal.ServiceChargeSettle fullLocalPreview.StoreId = fullLocal.StoreId fullLocalData.SLocalList = append(fullLocalData.SLocalList, fullLocalPreview) } // 2. 查询本地生活补充信息:门店信息,招募策略 for _, local := range fullLocalData.SLocalList { // 2.1. 门店信息 storeInfo, productErr := db.FindStoreById(ctx, local.StoreId) if productErr != nil { return nil, productErr } if storeInfo != nil { local.StoreId = storeInfo.StoreId local.StoreName = storeInfo.StoreName } // 2.2. 门店图片信息 productPhotoInfo, productPhotoErr := db.GetStorePhotoByStoreID(ctx, local.StoreId) if productPhotoErr != nil { return nil, productPhotoErr } if productPhotoInfo != nil { for _, photo := range productPhotoInfo { fmt.Println(photo) if photo.Symbol == 1 { local.StorePhotoSymbol = 1 local.StorePhotoUrl = photo.PhotoUrl local.StorePhotoUid = photo.PhotoUid } } } } return fullLocalData, nil } // FullSLocalTaskBillList 服务商本地生活子任务账单列表 func (*sLocalLife) FullSLocalTaskBillList(ctx context.Context, request *http_model.FullSLocalTaskBillListRequest) (*http_model.FullSLocalTaskBillData, error) { var currSLocalTaskBillData *http_model.FullSLocalTaskBillData currSLocalTaskBillData = &http_model.FullSLocalTaskBillData{} currSLocalTaskBillData.DraftFee = 0 currSLocalTaskBillData.DraftFeeSettle = 0 // 1. 查找子任务 taskList, total, taskListErr := db.GetSLocalTaskList(ctx, request.SLocalId, request.TalentId, request.PageSize, request.PageNum) if taskListErr != nil { return nil, taskListErr } if taskList != nil { currSLocalTaskBillData.Total = total for _, task := range taskList { var curr *http_model.FullSLocalTaskBillListData curr = &http_model.FullSLocalTaskBillListData{} curr.TaskId = task.TaskID curr.ServiceCharge = task.ServiceCharge curr.ViewNum = 0 curr.VoteNum = 0 curr.CommitNum = 0 curr.CollectNum = 0 curr.ServiceCharge = task.ServiceCharge curr.DraftFee = task.DraftFee curr.DelayRate = task.ScriptBreakRate + task.SketchBreakRate + task.LinkBreakRate + task.DataBreakRate curr.RealServiceCharge = task.RealPayment - task.SettleAmount curr.SettleAmount = task.SettleAmount curr.SettleTime = conv.MustString(task.CompleteDate) currSLocalTaskBillData.DraftFee += curr.DraftFee currSLocalTaskBillData.DraftFeeSettle += curr.SettleAmount currSLocalTaskBillData.SLocalTaskList = append(currSLocalTaskBillData.SLocalTaskList, curr) } // 2. 补充任务信息 sLocalInfo, sLocalErr := db.GetSLocalLifeDetail(ctx, request.SLocalId) if sLocalErr != nil { return nil, sLocalErr } if sLocalInfo != nil { currSLocalTaskBillData.SettleNum = sLocalInfo.SettleNum currSLocalTaskBillData.ChooseNum = sLocalInfo.ApplyNum currSLocalTaskBillData.ServiceCharge = sLocalInfo.ServiceCharge currSLocalTaskBillData.ServiceChargeSettle = sLocalInfo.ServiceChargeSettle } } return currSLocalTaskBillData, nil } // CountLocalTask 按照状态统计子任务数量 func (*sLocalLife) CountLocalTask(ctx context.Context, req *http_model.LocalTaskCountRequest) (*http_model.LocalTaskCountData, error) { var counter *http_model.LocalTaskCountData counter = &http_model.LocalTaskCountData{} // 1. Stage1 stage1, stage1Err := db.CountLocalTaskNumByTaskStage(ctx, 0, 1, req.SLocalId) if stage1Err != nil { return nil, stage1Err } counter.Stage1 = stage1 // 2. Stage2 stage2, stage2Err := db.CountLocalTaskNumByTaskStage(ctx, 0, 2, req.SLocalId) if stage2Err != nil { return nil, stage2Err } counter.Stage2 = stage2 // 3. Stage3 stage3, stage3Err := db.CountLocalTaskNumByTaskStage(ctx, 0, 3, req.SLocalId) if stage3Err != nil { return nil, stage3Err } counter.Stage3 = stage3 // 4. Stage4 stage4, stage4Err := db.CountLocalTaskNumByTaskStage(ctx, 1, 2, req.SLocalId) if stage4Err != nil { return nil, stage4Err } counter.Stage4 = stage4 // 5. Stage5 stage5, stage5Err := db.CountLocalTaskNumByTaskStage(ctx, 2, 2, req.SLocalId) if stage5Err != nil { return nil, stage5Err } counter.Stage5 = stage5 // 6. Stage6 stage6, stage6Err := db.CountLocalTaskNumByTaskStage(ctx, 3, 2, req.SLocalId) if stage6Err != nil { return nil, stage6Err } counter.Stage6 = stage6 // 7. Stage7 stage7, stage7Err := db.CountLocalTaskNumByTaskStage(ctx, 0, 0, req.SLocalId) if stage7Err != nil { return nil, stage7Err } counter.Stage7 = stage7 return counter, nil }