package selection_service import ( "context" "encoding/json" "errors" "github.com/gin-gonic/gin" "github.com/sirupsen/logrus" "reflect" "time" "youngee_b_api/db" "youngee_b_api/model/common_model" "youngee_b_api/model/gorm_model" "youngee_b_api/model/http_model" "youngee_b_api/pack" "youngee_b_api/util" "github.com/caixw/lib.go/conv" ) var Selection *selection type selection struct { } func (*selection) Create(ctx context.Context, request http_model.CreateSelectionRequest, enterpriseId string) (*http_model.CreateSelectionData, error) { // 1. 检查该企业id和商品id有无选品 selectionInfo, err := db.GetSelectionByEnterpiseIdAndProductId(ctx, enterpriseId, conv.MustInt(request.ProductId, 0)) if err != nil { return nil, err } if selectionInfo != nil { return nil, errors.New("该商品下选品已存在") } // 2. 数据准备 // a) 生成选品id selectionId := util.GetSelectionID() // b) 查找关联商品信息 product, err := db.GetProductByID(ctx, conv.MustInt64(request.ProductId, 0)) if err != nil { return nil, err } productPhotos, err := db.GetProductPhotoByProductID(ctx, conv.MustInt64(request.ProductId, 0)) productInfoToJson, _ := json.Marshal(product) productPhotosToJson, _ := json.Marshal(productPhotos) // c) 选品名称 selectionName := product.BrandName + "-" + product.ProductName // 3. 创建选品 newSelection := gorm_model.YounggeeSelectionInfo{ SelectionID: selectionId, SelectionName: selectionName, ProductID: conv.MustInt(request.ProductId, 0), EnterpriseID: enterpriseId, Platform: conv.MustInt(request.Platform, 0), ProductSnap: string(productInfoToJson), ProductPhotoSnap: string(productPhotosToJson), CreatedAt: time.Now(), } err = db.CreateSelection(ctx, newSelection) if err != nil { return nil, err } res := &http_model.CreateSelectionData{ SelectionId: selectionId, } return res, nil } func (*selection) Update(ctx context.Context, request http_model.UpdateSelectionRequest, enterpriseId string) (*http_model.UpdateSelectionData, error) { // 1. 检查该企业id和商品id有无选品 selectionInfo, err := db.GetSelectionByEnterpiseIdAndProductId(ctx, enterpriseId, conv.MustInt(request.ProductId, 0)) if err != nil { return nil, err } if selectionInfo == nil { return nil, errors.New("选品不存在") } // 2. 数据准备 // a) 查找关联商品信息 product, err := db.GetProductByID(ctx, conv.MustInt64(request.ProductId, 0)) if err != nil { return nil, err } productPhotos, err := db.GetProductPhotoByProductID(ctx, conv.MustInt64(request.ProductId, 0)) productInfoToJson, _ := json.Marshal(product) productPhotosToJson, _ := json.Marshal(productPhotos) // b) 选品名称 selectionName := product.BrandName + "-" + product.ProductName // c) 计算预估成本(如果有) var estimatedCost float64 if conv.MustInt(request.TaskMode, 0) == 1 { estimatedCost = conv.MustFloat64(request.TaskReward, 0) * conv.MustFloat64(request.SampleNum, 0) } estimatedCostToString, _ := conv.String(estimatedCost) // d) 任务截止时间 taskDdl := time.Time{} //赋零值 if request.TaskDdl != "" { taskDdl, _ = time.ParseInLocation("2006-01-02 15:04:05", request.TaskDdl, time.Local) } updateSelection := gorm_model.YounggeeSelectionInfo{ SelectionID: request.SelectionID, SelectionName: selectionName, EnterpriseID: enterpriseId, ProductID: conv.MustInt(request.ProductId, 0), ContentType: conv.MustInt(request.ContentType, 0), SelectionStatus: 1, TaskMode: conv.MustInt(request.TaskMode, 0), Platform: conv.MustInt(request.Platform, 0), SampleMode: conv.MustInt(request.SampleMode, 0), ProductUrl: request.ProductUrl, SampleNum: conv.MustInt(request.SampleNum, 0), RemainNum: conv.MustInt(request.SampleNum, 0), CommissionRate: conv.MustInt(request.CommissionRate, 0), EstimatedCost: estimatedCostToString, SampleCondition: request.SampleCondition, RewardCondition: request.RewardCondition, TaskDdl: taskDdl, Detail: request.Detail, ProductSnap: string(productInfoToJson), ProductPhotoSnap: string(productPhotosToJson), CreatedAt: selectionInfo.CreatedAt, UpdatedAt: time.Now(), SubmitAt: time.Now(), } // 合并传入参数和数据表中原记录,若传入参数字段值为空,则将字段赋值为原记录中值 result := util.MergeStructValue(&updateSelection, &selectionInfo) // 利用反射机制将interface类型转换为结构体类型 v := reflect.ValueOf(result).Elem() if v.Kind() == reflect.Struct { updateSelection = v.Interface().(gorm_model.YounggeeSelectionInfo) //fmt.Println(p) } // 3. 更新选品 err = db.UpdateSelection(ctx, updateSelection) if err != nil { return nil, err } res := &http_model.UpdateSelectionData{ SelectionId: updateSelection.SelectionID, } return res, nil } func (*selection) Pay(ctx context.Context, request http_model.PaySelectionRequest, enterpriseId string) (*http_model.PaySelectionData, error) { // 校验 // 1. 账户余额是否足够 enterprise, err := db.GetEnterpriseByEnterpriseID(ctx, enterpriseId) if err != nil { return nil, err } if enterprise.AvailableBalance < request.PayMoney { return nil, errors.New("账户余额不足") } // 2. 选品项目状态是否正确 selectionInfo, err := db.GetSelectionById(ctx, request.SelectionId) if err != nil { return nil, err } if selectionInfo == nil { return nil, errors.New("选品不存在") } if selectionInfo.SelectionStatus != 4 { return nil, errors.New("选品状态有误") } // 支付 err = db.PaySelection(ctx, enterpriseId, request.PayMoney, request.SelectionId) if err != nil { return nil, err } res := &http_model.PaySelectionData{ SelectionId: request.SelectionId, } return res, nil } func (s *selection) GetAllSelection(ctx context.Context, enterpriseID string, pageSize, pageNum int64, conditions *common_model.SelectionConditions) (*http_model.SelectionData, error) { SelectionList, total, err := db.GetSelectionList(ctx, enterpriseID, pageSize, pageNum, conditions) if err != nil { logrus.WithContext(ctx).Errorf("[selectionDB service] call GetAllSelection error,err:%+v", err) return nil, err } SelectionListData := new(http_model.SelectionData) SelectionListData.SelectionInfo = pack.MGormSelectionToHttpSelectionPreview(SelectionList) SelectionListData.Total = conv.MustString(total, "") return SelectionListData, nil } func (s *selection) GetSelectionDetail(ctx *gin.Context, selectionId, enterpriseID string) (*http_model.SelectionDetail, error) { selectionDetail := http_model.SelectionDetail{} selectionInfo, err := db.GetSelectionById(ctx, selectionId) if err != nil { logrus.WithContext(ctx).Errorf("[selectionDB service] call GetSelectionInfo error,err:%+v", err) return nil, err } selectionBriefInfo, err := db.GetSelectionBriefInfo(ctx, selectionId) if err != nil { logrus.WithContext(ctx).Errorf("[selectionDB service] call GetSelectionBriefInfo error,err:%+v", err) return nil, err } selectionExampleInfo, err := db.GetSelectionExampleInfo(ctx, selectionId) if err != nil { logrus.WithContext(ctx).Errorf("[selectionDB service] call GetSelectionExampleInfo error,err:%+v", err) return nil, err } productInfo, err := db.GetProductInfoBySelectionId(ctx, selectionId) if err != nil { logrus.WithContext(ctx).Errorf("[selectionDB service] call GetProductInfo error,err:%+v", err) return nil, err } productPhotoInfo, err := db.GetProductPhotoInfoBySelectionId(ctx, selectionId) if err != nil { logrus.WithContext(ctx).Errorf("[selectionDB service] call GetProductPhotoInfo error,err:%+v", err) return nil, err } selectionDetail.SelectionBrief = selectionBriefInfo selectionDetail.SelectionInfo = selectionInfo selectionDetail.SelectionExample = selectionExampleInfo selectionDetail.ProductInfo = productInfo selectionDetail.ProductPhotoInfo = productPhotoInfo return &selectionDetail, nil }