111 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			111 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
|  | package logic | |||
|  | 
 | |||
|  | import ( | |||
|  | 	"context" | |||
|  | 	"encoding/json" | |||
|  | 	"errors" | |||
|  | 	"fusenapi/constants" | |||
|  | 	"fusenapi/utils/auth" | |||
|  | 	"fusenapi/utils/basic" | |||
|  | 	"gorm.io/gorm" | |||
|  | 
 | |||
|  | 	"fusenapi/server/product/internal/svc" | |||
|  | 	"fusenapi/server/product/internal/types" | |||
|  | 
 | |||
|  | 	"github.com/zeromicro/go-zero/core/logx" | |||
|  | ) | |||
|  | 
 | |||
|  | type GetLastProductDesignLogic struct { | |||
|  | 	logx.Logger | |||
|  | 	ctx    context.Context | |||
|  | 	svcCtx *svc.ServiceContext | |||
|  | } | |||
|  | 
 | |||
|  | func NewGetLastProductDesignLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetLastProductDesignLogic { | |||
|  | 	return &GetLastProductDesignLogic{ | |||
|  | 		Logger: logx.WithContext(ctx), | |||
|  | 		ctx:    ctx, | |||
|  | 		svcCtx: svcCtx, | |||
|  | 	} | |||
|  | } | |||
|  | 
 | |||
|  | func (l *GetLastProductDesignLogic) GetLastProductDesign(req *types.Request, userinfo *auth.UserInfo) (resp *basic.Response) { | |||
|  | 	if !userinfo.IsUser() { | |||
|  | 		return resp.SetStatusAddMessage(basic.CodeUnAuth, "please login") | |||
|  | 	} | |||
|  | 	//获取用户信息 | |||
|  | 	user, err := l.svcCtx.AllModels.FsUser.FindUserById(l.ctx, userinfo.UserId) | |||
|  | 	if err != nil { | |||
|  | 		if errors.Is(err, gorm.ErrRecordNotFound) { | |||
|  | 			return resp.SetStatusWithMessage(basic.CodeUnAuth, "user not found") | |||
|  | 		} | |||
|  | 		logx.Error(err) | |||
|  | 		return resp.SetStatusWithMessage(basic.CodeDbSqlErr, "failed to get user info") | |||
|  | 	} | |||
|  | 	//若没打开了个性化渲染按钮 | |||
|  | 	if *user.IsOpenRender != 1 { | |||
|  | 		return resp.SetStatusWithMessage(basic.CodeOK, "success:IsOpenRender switch is closed") | |||
|  | 	} | |||
|  | 	//查询用户最近下单成功的数据 | |||
|  | 	orderInfo, err := l.svcCtx.AllModels.FsOrder.FindLastSuccessOneOrder(l.ctx, user.Id, int64(constants.STATUS_NEW_NOT_PAY)) | |||
|  | 	if err != nil { | |||
|  | 		if errors.Is(err, gorm.ErrRecordNotFound) { | |||
|  | 			return resp.SetStatusWithMessage(basic.CodeDbRecordNotFoundErr, "none of order is found") | |||
|  | 		} | |||
|  | 		logx.Error(err) | |||
|  | 		return resp.SetStatusAddMessage(basic.CodeDbSqlErr, "failed to get your last order") | |||
|  | 	} | |||
|  | 	//获取该订单相关设计信息 | |||
|  | 	orderDetail, err := l.svcCtx.AllModels.FsOrderDetail.GetOneOrderDetailByOrderId(l.ctx, orderInfo.Id) | |||
|  | 	if err != nil { | |||
|  | 		if errors.Is(err, gorm.ErrRecordNotFound) { | |||
|  | 			return resp.SetStatusWithMessage(basic.CodeDbRecordNotFoundErr, "order detail is not found") | |||
|  | 		} | |||
|  | 		logx.Error(err) | |||
|  | 		return resp.SetStatusAddMessage(basic.CodeDbSqlErr, "failed to get order detail") | |||
|  | 	} | |||
|  | 	//获取设计模板详情,便于获得design_id | |||
|  | 	orderDetailTemplate, err := l.svcCtx.AllModels.FsOrderDetailTemplate.FindOne(l.ctx, *orderDetail.OrderDetailTemplateId) | |||
|  | 	if err != nil { | |||
|  | 		if errors.Is(err, gorm.ErrRecordNotFound) { | |||
|  | 			return resp.SetStatusWithMessage(basic.CodeDbRecordNotFoundErr, "order detail template is not found") | |||
|  | 		} | |||
|  | 		logx.Error(err) | |||
|  | 		return resp.SetStatusWithMessage(basic.CodeDbSqlErr, "failed to get order detail template") | |||
|  | 	} | |||
|  | 	//最后一次设计不存在,则不返回该设计相关数据 | |||
|  | 	if *orderDetailTemplate.DesignId <= 0 { | |||
|  | 		return resp.SetStatusWithMessage(basic.CodeOK, "success:last design id is not set") | |||
|  | 	} | |||
|  | 	//获取设计数据 | |||
|  | 	productDesign, err := l.svcCtx.AllModels.FsProductDesign.FindOne(l.ctx, *orderDetailTemplate.DesignId, user.Id) | |||
|  | 	if err != nil { | |||
|  | 		if errors.Is(err, gorm.ErrRecordNotFound) { | |||
|  | 			return resp.SetStatusWithMessage(basic.CodeDbRecordNotFoundErr, "product design is not found") | |||
|  | 		} | |||
|  | 		logx.Error(err) | |||
|  | 		return resp.SetStatusWithMessage(basic.CodeDbSqlErr, "failed to get product design") | |||
|  | 	} | |||
|  | 	var info interface{} | |||
|  | 	if productDesign.Info != nil && *productDesign.Info != "" { | |||
|  | 		if err := json.Unmarshal([]byte(*productDesign.Info), &info); err != nil { | |||
|  | 			logx.Error(err) | |||
|  | 			return nil | |||
|  | 		} | |||
|  | 	} | |||
|  | 	var logoColor interface{} | |||
|  | 	if productDesign.LogoColor != nil && *productDesign.LogoColor != "" { | |||
|  | 		if err := json.Unmarshal([]byte(*productDesign.LogoColor), &logoColor); err != nil { | |||
|  | 			logx.Error(err) | |||
|  | 			return nil | |||
|  | 		} | |||
|  | 	} | |||
|  | 	return resp.SetStatusWithMessage(basic.CodeOK, "success", types.GetLastProductDesignRsp{ | |||
|  | 		Id:         productDesign.Id, | |||
|  | 		OptionalId: *productDesign.OptionalId, | |||
|  | 		SizeId:     *productDesign.SizeId, | |||
|  | 		LogoColor:  logoColor, | |||
|  | 		Info:       info, | |||
|  | 	}) | |||
|  | } |