package logic import ( "errors" "fusenapi/constants" "fusenapi/model/gmodel" "fusenapi/utils/auth" "fusenapi/utils/basic" "fusenapi/utils/color_list" "gorm.io/gorm" "strings" "context" "fusenapi/server/product/internal/svc" "fusenapi/server/product/internal/types" "github.com/zeromicro/go-zero/core/logx" ) type GetRenderSettingByPidLogic struct { logx.Logger ctx context.Context svcCtx *svc.ServiceContext } func NewGetRenderSettingByPidLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetRenderSettingByPidLogic { return &GetRenderSettingByPidLogic{ Logger: logx.WithContext(ctx), ctx: ctx, svcCtx: svcCtx, } } func (l *GetRenderSettingByPidLogic) GetRenderSettingByPid(req *types.GetRenderSettingByPidReq, userinfo *auth.UserInfo) (resp *basic.Response) { req.Pid = strings.Trim(req.Pid, " ") if req.Pid == "" { return resp.SetStatusWithMessage(basic.CodeRequestParamsErr, "err param:pid is empty") } //获取产品信息 productInfo, err := l.svcCtx.AllModels.FsProduct.FindOneBySn(l.ctx, req.Pid) if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return resp.SetStatusWithMessage(basic.CodeDbRecordNotFoundErr, "the product is not exists") } logx.Error(err) return resp.SetStatusWithMessage(basic.CodeDbSqlErr, "failed to get product info") } //获取产品分类 tagInfo, err := l.svcCtx.AllModels.FsTags.FindOne(l.ctx, *productInfo.Type) if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return resp.SetStatusWithMessage(basic.CodeDbRecordNotFoundErr, "product tag is not exists") } logx.Error(err) return resp.SetStatusWithMessage(basic.CodeDbSqlErr, "failed to get tag info") } //是否低效果渲染 isLowRendering := false //是否移除背景 isRemoveBg := false //是否存在最新设计 lastDesign := false //是否拥有云渲染设计方案 renderDesign := false renderDesign, err = l.checkRenderDesign(req.ClientNo) if err != nil { logx.Error(err) return resp.SetStatusWithMessage(basic.CodeDbSqlErr, "failed to checkRenderDesign") } if userinfo.UserId != 0 { user, err := l.svcCtx.AllModels.FsUser.FindUserById(l.ctx, userinfo.UserId) if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return resp.SetStatusAddMessage(basic.CodeDbRecordNotFoundErr, "user info is not exists") } logx.Error(err) return resp.SetStatusWithMessage(basic.CodeDbSqlErr, "failed to get user info") } isLowRendering = *user.IsLowRendering > 0 isRemoveBg = *user.IsRemoveBg > 0 lastDesign, err = l.checkLastDesignExists(user.Id) if err != nil { logx.Error(err) return resp.SetStatusWithMessage(basic.CodeDbSqlErr, "failed to check if exists last design ") } } return resp.SetStatusWithMessage(basic.CodeOK, "success", types.GetRenderSettingByPidRsp{ Id: productInfo.Id, Type: *productInfo.Type, Title: *productInfo.Title, IsEnv: *productInfo.IsProtection, IsMicro: *productInfo.IsMicrowave, TypeName: *tagInfo.Title, IsLowRendering: isLowRendering, IsCustomization: *productInfo.IsCustomization, IsRemoveBg: isRemoveBg, RenderDesign: renderDesign, LastDesign: lastDesign, Colors: color_list.GetColor(), }) } // 查询是否存在渲染设计 func (l *GetRenderSettingByPidLogic) checkRenderDesign(clientNo string) (bool, error) { if clientNo == "" { return false, nil } renderDesign, err := l.svcCtx.AllModels.FsProductRenderDesign.FindOneRenderDesignByParams(l.ctx, gmodel.FindOneRenderDesignByParamsReq{ ClientNo: &clientNo, Fields: "id,info,material_id,optional_id,size_id,template_id", OrderBy: "`id` DESC", }) if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return false, nil } return false, err } if renderDesign.Info != nil && *renderDesign.Info != "" { return true, nil } return false, nil } // 查询是否存在最新设计 func (l *GetRenderSettingByPidLogic) checkLastDesignExists(userId int64) (bool, error) { //查询用户最近下单成功的数据 orderInfo, err := l.svcCtx.AllModels.FsOrder.FindLastSuccessOneOrder(l.ctx, userId, int64(constants.STATUS_NEW_NOT_PAY)) if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return false, nil } return false, err } //获取该订单相关设计信息 orderDetail, err := l.svcCtx.AllModels.FsOrderDetail.GetOneOrderDetailByOrderId(l.ctx, orderInfo.Id) if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return false, nil } return false, err } //获取设计模板详情,便于获得design_id orderDetailTemplate, err := l.svcCtx.AllModels.FsOrderDetailTemplate.FindOne(l.ctx, *orderDetail.OrderDetailTemplateId) if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return false, nil } return false, err } return *orderDetailTemplate.DesignId > 0, nil }