From 83b724d3018cdabbf9fe2b3e6d0d800ed578c4da Mon Sep 17 00:00:00 2001 From: laodaming <11058467+laudamine@user.noreply.gitee.com> Date: Mon, 28 Aug 2023 18:16:19 +0800 Subject: [PATCH 1/3] fix --- .../internal/logic/ws_render_image.go | 91 ++++++++++--------- utils/websocket_data/render_data.go | 1 + 2 files changed, 48 insertions(+), 44 deletions(-) diff --git a/server/websocket/internal/logic/ws_render_image.go b/server/websocket/internal/logic/ws_render_image.go index 123545ff..21e99a43 100644 --- a/server/websocket/internal/logic/ws_render_image.go +++ b/server/websocket/internal/logic/ws_render_image.go @@ -27,8 +27,9 @@ type extendRenderProperty struct { // 渲染任务新增移除的控制通道的数据 type renderImageControlChanItem struct { - option int // 0删除 1添加 - taskId string //map的key + option int // 0删除 1添加 2修改耗时属性 + taskId string //map的key(必须传) + combineImage string //刀版图地址(增加任务时候传) renderId string // map的val(增加任务时候传) renderNotifyImageUrl string //渲染回调数据(删除任务时候传) taskProperty renderTask //渲染任务的属性 @@ -152,8 +153,43 @@ func (w *wsConnectItem) consumeRenderCache(data []byte) { logx.Error("failed to get element list,", err) return } + //获取刀版图 + combineReq := repositories.LogoCombineReq{ + UserId: renderImageData.RenderData.UserId, + GuestId: renderImageData.RenderData.GuestId, + TemplateId: productTemplate.Id, + TemplateTag: renderImageData.RenderData.TemplateTag, + Website: renderImageData.RenderData.Website, + Slogan: renderImageData.RenderData.Slogan, + Address: renderImageData.RenderData.Address, + Phone: renderImageData.RenderData.Phone, + } + res, err := w.logic.svcCtx.Repositories.ImageHandle.LogoCombine(w.logic.ctx, &combineReq) + if err != nil { + w.renderErrResponse(renderImageData.RenderId, renderImageData.RenderData.TemplateTag, "", "failed to combine image:"+err.Error(), w.userId, w.guestId, productTemplate.Id, model3dInfo.Id, productFirstSize.Id) + logx.Error("合成刀版图失败,合成请求数据:", combineReq, "错误信息:", err) + return + } + combineImage := "" //刀版图 + if res != nil && res.ResourceUrl != nil { + combineImage = *res.ResourceUrl + } else { + w.renderErrResponse(renderImageData.RenderId, renderImageData.RenderData.TemplateTag, "", "combine image is empty", w.userId, w.guestId, productTemplate.Id, model3dInfo.Id, productFirstSize.Id) + logx.Error("合成刀版图失败,合成的刀版图是空指针:", err) + return + } + logx.Info("合成刀版图成功,合成刀版图数据:", combineReq, ",logo图片:", renderImageData.RenderData.Logo, " 刀版图:", *res.ResourceUrl) //获取唯一id taskId := w.genRenderTaskId(renderImageData, model3dInfo, productTemplate, element) + //记录刀版图合成消耗时间跟上传刀版图时间 + w.modifyRenderTaskTimeConsuming(renderImageControlChanItem{ + option: 2, + taskId: taskId, + taskProperty: renderTask{ + combineTakesTime: res.DiffTimeLogoCombine, + uploadCombineImageTakesTime: res.DiffTimeUploadFile, + }, + }) //查询有没有缓存的资源,有就返回###################### resource, err := w.logic.svcCtx.AllModels.FsResource.FindOneById(w.logic.ctx, taskId) if err != nil { @@ -181,12 +217,13 @@ func (w *wsConnectItem) consumeRenderCache(data []byte) { //########################################### //把需要渲染的图片任务加进去 w.createRenderTask(renderImageControlChanItem{ - option: 1, //0删除 1添加 2修改耗时属性 - taskId: taskId, - renderId: renderImageData.RenderId, + option: 1, //0删除 1添加 2修改耗时属性 + taskId: taskId, + renderId: renderImageData.RenderId, + combineImage: combineImage, }) //组装数据 - if err = w.assembleRenderData(taskId, renderImageData, productTemplate, model3dInfo, element, productFirstSize); err != nil { + if err = w.assembleRenderData(taskId, combineImage, renderImageData, productTemplate, model3dInfo, element, productFirstSize); err != nil { logx.Error("组装数据失败:", err) return } @@ -219,42 +256,7 @@ func (w *wsConnectItem) genRenderTaskId(renderImageData websocket_data.RenderIma } // 组装数据发送给unity -func (w *wsConnectItem) assembleRenderData(taskId string, info websocket_data.RenderImageReqMsg, productTemplate *gmodel.FsProductTemplateV2, model3dInfo *gmodel.FsProductModel3d, element *gmodel.FsProductTemplateElement, productFirstSize *gmodel.FsProductSize) error { - //获取刀版图 - combineReq := repositories.LogoCombineReq{ - UserId: info.RenderData.UserId, - GuestId: info.RenderData.GuestId, - TemplateId: productTemplate.Id, - TemplateTag: info.RenderData.TemplateTag, - Website: info.RenderData.Website, - Slogan: info.RenderData.Slogan, - Address: info.RenderData.Address, - Phone: info.RenderData.Phone, - } - res, err := w.logic.svcCtx.Repositories.ImageHandle.LogoCombine(w.logic.ctx, &combineReq) - if err != nil { - w.renderErrResponse(info.RenderId, info.RenderData.TemplateTag, taskId, "failed to combine image:"+err.Error(), w.userId, w.guestId, productTemplate.Id, model3dInfo.Id, productFirstSize.Id) - logx.Error("合成刀版图失败,合成请求数据:", combineReq, "错误信息:", err) - return err - } - combineImage := "" //刀版图 - if res != nil && res.ResourceUrl != nil { - combineImage = *res.ResourceUrl - } else { - w.renderErrResponse(info.RenderId, info.RenderData.TemplateTag, taskId, "combine image is empty", w.userId, w.guestId, productTemplate.Id, model3dInfo.Id, productFirstSize.Id) - logx.Error("合成刀版图失败,合成的刀版图是空指针:", err) - return err - } - //记录刀版图合成消耗时间跟上传刀版图时间 - w.modifyRenderTaskTimeConsuming(renderImageControlChanItem{ - option: 2, - taskId: taskId, - taskProperty: renderTask{ - combineTakesTime: res.DiffTimeLogoCombine, - uploadCombineImageTakesTime: res.DiffTimeUploadFile, - }, - }) - logx.Info("合成刀版图成功,合成刀版图数据:", combineReq, ",logo图片:", info.RenderData.Logo, " 刀版图:", *res.ResourceUrl) +func (w *wsConnectItem) assembleRenderData(taskId string, combineImage string, info websocket_data.RenderImageReqMsg, productTemplate *gmodel.FsProductTemplateV2, model3dInfo *gmodel.FsProductModel3d, element *gmodel.FsProductTemplateElement, productFirstSize *gmodel.FsProductSize) (err error) { //组装数据 refletion := -1 if element.Refletion != nil && *element.Refletion != "" { @@ -443,8 +445,9 @@ func (w *wsConnectItem) operationRenderTask() { } //发送到出口 w.sendToOutChan(w.respondDataFormat(constants.WEBSOCKET_RENDER_IMAGE, websocket_data.RenderImageRspMsg{ - RenderId: taskData.renderId, - Image: data.renderNotifyImageUrl, + RenderId: taskData.renderId, + Image: data.renderNotifyImageUrl, + CombineImage: data.combineImage, RenderProcessTime: websocket_data.RenderProcessTime{ CombineTakesTime: CombineTakesTime, UnityRenderTakesTime: UnityRenderTakesTime, diff --git a/utils/websocket_data/render_data.go b/utils/websocket_data/render_data.go index e6ddfb93..427a4b8f 100644 --- a/utils/websocket_data/render_data.go +++ b/utils/websocket_data/render_data.go @@ -29,6 +29,7 @@ type RenderData struct { type RenderImageRspMsg struct { RenderId string `json:"render_id"` //渲染id Image string `json:"image"` //渲染结果图片 + CombineImage string `json:"combine_image"` //刀版图 RenderProcessTime RenderProcessTime `json:"render_process_time"` //流程耗时 } type RenderProcessTime struct { From 55fa50f087bd789c7d5243207d4a6c66ff1ca86c Mon Sep 17 00:00:00 2001 From: laodaming <11058467+laudamine@user.noreply.gitee.com> Date: Mon, 28 Aug 2023 18:21:04 +0800 Subject: [PATCH 2/3] fix --- server/websocket/internal/logic/ws_render_image.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/server/websocket/internal/logic/ws_render_image.go b/server/websocket/internal/logic/ws_render_image.go index 21e99a43..c6d09e5d 100644 --- a/server/websocket/internal/logic/ws_render_image.go +++ b/server/websocket/internal/logic/ws_render_image.go @@ -201,8 +201,9 @@ func (w *wsConnectItem) consumeRenderCache(data []byte) { } else { //返回给客户端 b := w.respondDataFormat(constants.WEBSOCKET_RENDER_IMAGE, websocket_data.RenderImageRspMsg{ - RenderId: renderImageData.RenderId, - Image: *resource.ResourceUrl, + RenderId: renderImageData.RenderId, + Image: *resource.ResourceUrl, + CombineImage: combineImage, RenderProcessTime: websocket_data.RenderProcessTime{ CombineTakesTime: "cache", UnityRenderTakesTime: "cache", From 3dc230495af72717449eda8335e807c4fe436ae9 Mon Sep 17 00:00:00 2001 From: laodaming <11058467+laudamine@user.noreply.gitee.com> Date: Mon, 28 Aug 2023 18:37:58 +0800 Subject: [PATCH 3/3] fix --- model/gmodel/fs_product_template_v2_logic.go | 4 +- .../internal/logic/ws_err_response.go | 5 ++- .../internal/logic/ws_render_image.go | 42 +++++++++---------- 3 files changed, 27 insertions(+), 24 deletions(-) diff --git a/model/gmodel/fs_product_template_v2_logic.go b/model/gmodel/fs_product_template_v2_logic.go index 40067f96..5a51fd2a 100755 --- a/model/gmodel/fs_product_template_v2_logic.go +++ b/model/gmodel/fs_product_template_v2_logic.go @@ -114,10 +114,10 @@ func (t *FsProductTemplateV2Model) GetProductTemplateListByParams(ctx context.Co } // 获取第一个尺寸下的模板 -func (t *FsProductTemplateV2Model) FindFirstOneByProductIdModelIdTemplateTag(ctx context.Context, productId, modelId int64, templateTag string) (resp *FsProductTemplateV2, err error) { +func (t *FsProductTemplateV2Model) FindFirstOneCloudRenderByProductIdModelIdTemplateTag(ctx context.Context, productId, modelId int64, templateTag string) (resp *FsProductTemplateV2, err error) { err = t.db.WithContext(ctx).Model(&FsProductTemplateV2{}). Where("product_id = ? and model_id = ? and template_tag = ? ", productId, modelId, templateTag). - Where("status = ? and is_del = ?", 1, 0). + Where("status = ? and is_del = ? and element_model_id != ?", 1, 0, 0). Order("sort ASC"). Take(&resp).Error return resp, err diff --git a/server/websocket/internal/logic/ws_err_response.go b/server/websocket/internal/logic/ws_err_response.go index 53fa4d50..2523aada 100644 --- a/server/websocket/internal/logic/ws_err_response.go +++ b/server/websocket/internal/logic/ws_err_response.go @@ -8,7 +8,7 @@ func (w *wsConnectItem) incomeDataFormatErrResponse(data interface{}) { } // 渲染错误通知 -func (w *wsConnectItem) renderErrResponse(renderId, templateTag, taskId, description string, userId, guestId, templateId, modelId, sizeId int64) { +func (w *wsConnectItem) renderErrResponse(renderId, templateTag, taskId, description string, userId, guestId, templateId, modelId, sizeId, elementModelId int64) { data := make(map[string]interface{}) data["render_id"] = renderId data["description"] = description @@ -31,6 +31,9 @@ func (w *wsConnectItem) renderErrResponse(renderId, templateTag, taskId, descrip if sizeId > 0 { data["size_id"] = sizeId } + if elementModelId > 0 { + data["element_model_id"] = elementModelId + } w.sendToOutChan(w.respondDataFormat(constants.WEBSOCKET_RENDER_IMAGE_ERR, data)) } diff --git a/server/websocket/internal/logic/ws_render_image.go b/server/websocket/internal/logic/ws_render_image.go index c6d09e5d..fdab6ff7 100644 --- a/server/websocket/internal/logic/ws_render_image.go +++ b/server/websocket/internal/logic/ws_render_image.go @@ -83,7 +83,7 @@ func (w *wsConnectItem) consumeRenderCache(data []byte) { userMaterial, err := w.logic.svcCtx.AllModels.FsUserMaterial.FindLatestOne(w.logic.ctx, w.userId, w.guestId) if err != nil { if !errors.Is(err, gorm.ErrRecordNotFound) { - w.renderErrResponse(renderImageData.RenderId, renderImageData.RenderData.TemplateTag, "", "failed to get user logo", w.userId, w.guestId, 0, 0, 0) + w.renderErrResponse(renderImageData.RenderId, renderImageData.RenderData.TemplateTag, "", "failed to get user logo", w.userId, w.guestId, 0, 0, 0, 0) logx.Error("failed to get user logo") return } @@ -91,10 +91,10 @@ func (w *wsConnectItem) consumeRenderCache(data []byte) { userMaterialDefault, err := w.logic.svcCtx.AllModels.FsUserMaterial.FindOneById(w.logic.ctx, 0) if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { - w.renderErrResponse(renderImageData.RenderId, renderImageData.RenderData.TemplateTag, "", "default logo is not exists", w.userId, w.guestId, 0, 0, 0) + w.renderErrResponse(renderImageData.RenderId, renderImageData.RenderData.TemplateTag, "", "default logo is not exists", w.userId, w.guestId, 0, 0, 0, 0) return } - w.renderErrResponse(renderImageData.RenderId, renderImageData.RenderData.TemplateTag, "", "failed to get default logo", w.userId, w.guestId, 0, 0, 0) + w.renderErrResponse(renderImageData.RenderId, renderImageData.RenderData.TemplateTag, "", "failed to get default logo", w.userId, w.guestId, 0, 0, 0, 0) logx.Error("default logo is not exists") return } @@ -109,11 +109,11 @@ func (w *wsConnectItem) consumeRenderCache(data []byte) { productFirstSize, err := w.logic.svcCtx.AllModels.FsProductSize.GetProductFirstSize(w.logic.ctx, renderImageData.RenderData.ProductId) if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { - w.renderErrResponse(renderImageData.RenderId, renderImageData.RenderData.TemplateTag, "", "product first size is not exists", w.userId, w.guestId, 0, 0, 0) + w.renderErrResponse(renderImageData.RenderId, renderImageData.RenderData.TemplateTag, "", "product first size is not exists", w.userId, w.guestId, 0, 0, 0, 0) logx.Error("product first size is not found") return } - w.renderErrResponse(renderImageData.RenderId, renderImageData.RenderData.TemplateTag, "", "failed to get product first size", w.userId, w.guestId, 0, 0, 0) + w.renderErrResponse(renderImageData.RenderId, renderImageData.RenderData.TemplateTag, "", "failed to get product first size", w.userId, w.guestId, 0, 0, 0, 0) logx.Error("failed to get product first size:", err) return } @@ -121,36 +121,36 @@ func (w *wsConnectItem) consumeRenderCache(data []byte) { model3dInfo, err := w.logic.svcCtx.AllModels.FsProductModel3d.GetOneBySizeIdTag(w.logic.ctx, productFirstSize.Id, constants.TAG_MODEL, "id") if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { - w.renderErrResponse(renderImageData.RenderId, renderImageData.RenderData.TemplateTag, "", "product model is not exists", w.userId, w.guestId, 0, 0, productFirstSize.Id) + w.renderErrResponse(renderImageData.RenderId, renderImageData.RenderData.TemplateTag, "", "product model is not exists", w.userId, w.guestId, 0, 0, productFirstSize.Id, 0) logx.Error("product model is not found") return } - w.renderErrResponse(renderImageData.RenderId, renderImageData.RenderData.TemplateTag, "", "failed to get product model", w.userId, w.guestId, 0, 0, productFirstSize.Id) + w.renderErrResponse(renderImageData.RenderId, renderImageData.RenderData.TemplateTag, "", "failed to get product model", w.userId, w.guestId, 0, 0, productFirstSize.Id, 0) logx.Error("failed to get product model:", err) return } //获取模板 - productTemplate, err := w.logic.svcCtx.AllModels.FsProductTemplateV2.FindFirstOneByProductIdModelIdTemplateTag(w.logic.ctx, renderImageData.RenderData.ProductId, model3dInfo.Id, renderImageData.RenderData.TemplateTag) + productTemplate, err := w.logic.svcCtx.AllModels.FsProductTemplateV2.FindFirstOneCloudRenderByProductIdModelIdTemplateTag(w.logic.ctx, renderImageData.RenderData.ProductId, model3dInfo.Id, renderImageData.RenderData.TemplateTag) if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { - w.renderErrResponse(renderImageData.RenderId, renderImageData.RenderData.TemplateTag, "", "product template is not exists", w.userId, w.guestId, 0, model3dInfo.Id, productFirstSize.Id) + w.renderErrResponse(renderImageData.RenderId, renderImageData.RenderData.TemplateTag, "", "product template is not exists", w.userId, w.guestId, 0, model3dInfo.Id, productFirstSize.Id, *productTemplate.ElementModelId) logx.Error("template info is not found") return } - w.renderErrResponse(renderImageData.RenderId, renderImageData.RenderData.TemplateTag, "", "failed to get product template", w.userId, w.guestId, 0, model3dInfo.Id, productFirstSize.Id) + w.renderErrResponse(renderImageData.RenderId, renderImageData.RenderData.TemplateTag, "", "failed to get product template", w.userId, w.guestId, 0, model3dInfo.Id, productFirstSize.Id, *productTemplate.ElementModelId) logx.Error("failed to get template info:", err) return } //获取渲染设置信息 - element, err := w.logic.svcCtx.AllModels.FsProductTemplateElement.FindOneByModelId(w.logic.ctx, *productTemplate.ModelId) + element, err := w.logic.svcCtx.AllModels.FsProductTemplateElement.FindOneByModelId(w.logic.ctx, *productTemplate.ElementModelId) if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { - w.renderErrResponse(renderImageData.RenderId, renderImageData.RenderData.TemplateTag, "", "render element is not exists", w.userId, w.guestId, productTemplate.Id, model3dInfo.Id, productFirstSize.Id) - logx.Error("element info is not found,model_id = ", *productTemplate.ModelId) + w.renderErrResponse(renderImageData.RenderId, renderImageData.RenderData.TemplateTag, "", "render element is not exists", w.userId, w.guestId, productTemplate.Id, model3dInfo.Id, productFirstSize.Id, *productTemplate.ElementModelId) + logx.Error("element info is not found,element_model_id = ", *productTemplate.ElementModelId) return } - w.renderErrResponse(renderImageData.RenderId, renderImageData.RenderData.TemplateTag, "", "failed to get render element", w.userId, w.guestId, productTemplate.Id, model3dInfo.Id, productFirstSize.Id) - logx.Error("failed to get element list,", err) + w.renderErrResponse(renderImageData.RenderId, renderImageData.RenderData.TemplateTag, "", "failed to get render element", w.userId, w.guestId, productTemplate.Id, model3dInfo.Id, productFirstSize.Id, *productTemplate.ElementModelId) + logx.Error("failed to get element ,", err) return } //获取刀版图 @@ -166,7 +166,7 @@ func (w *wsConnectItem) consumeRenderCache(data []byte) { } res, err := w.logic.svcCtx.Repositories.ImageHandle.LogoCombine(w.logic.ctx, &combineReq) if err != nil { - w.renderErrResponse(renderImageData.RenderId, renderImageData.RenderData.TemplateTag, "", "failed to combine image:"+err.Error(), w.userId, w.guestId, productTemplate.Id, model3dInfo.Id, productFirstSize.Id) + w.renderErrResponse(renderImageData.RenderId, renderImageData.RenderData.TemplateTag, "", "failed to combine image:"+err.Error(), w.userId, w.guestId, productTemplate.Id, model3dInfo.Id, productFirstSize.Id, *productTemplate.ElementModelId) logx.Error("合成刀版图失败,合成请求数据:", combineReq, "错误信息:", err) return } @@ -174,7 +174,7 @@ func (w *wsConnectItem) consumeRenderCache(data []byte) { if res != nil && res.ResourceUrl != nil { combineImage = *res.ResourceUrl } else { - w.renderErrResponse(renderImageData.RenderId, renderImageData.RenderData.TemplateTag, "", "combine image is empty", w.userId, w.guestId, productTemplate.Id, model3dInfo.Id, productFirstSize.Id) + w.renderErrResponse(renderImageData.RenderId, renderImageData.RenderData.TemplateTag, "", "combine image is empty", w.userId, w.guestId, productTemplate.Id, model3dInfo.Id, productFirstSize.Id, *productTemplate.ElementModelId) logx.Error("合成刀版图失败,合成的刀版图是空指针:", err) return } @@ -194,7 +194,7 @@ func (w *wsConnectItem) consumeRenderCache(data []byte) { resource, err := w.logic.svcCtx.AllModels.FsResource.FindOneById(w.logic.ctx, taskId) if err != nil { if !errors.Is(err, gorm.ErrRecordNotFound) { - w.renderErrResponse(renderImageData.RenderId, renderImageData.RenderData.TemplateTag, taskId, "failed to get render cache", w.userId, w.guestId, 0, 0, 0) + w.renderErrResponse(renderImageData.RenderId, renderImageData.RenderData.TemplateTag, taskId, "failed to get render cache", w.userId, w.guestId, productTemplate.Id, model3dInfo.Id, productFirstSize.Id, *productTemplate.ElementModelId) logx.Error("failed to find render resource:", err) return } @@ -264,7 +264,7 @@ func (w *wsConnectItem) assembleRenderData(taskId string, combineImage string, i refletion, err = strconv.Atoi(*element.Refletion) if err != nil { logx.Error("err refletion:set default -1") - w.renderErrResponse(info.RenderId, info.RenderData.TemplateTag, taskId, "parse element.Refletion from string to number err", w.userId, w.guestId, productTemplate.Id, model3dInfo.Id, productFirstSize.Id) + w.renderErrResponse(info.RenderId, info.RenderData.TemplateTag, taskId, "parse element.Refletion from string to number err", w.userId, w.guestId, productTemplate.Id, model3dInfo.Id, productFirstSize.Id, *productTemplate.ElementModelId) return err } } @@ -273,7 +273,7 @@ func (w *wsConnectItem) assembleRenderData(taskId string, combineImage string, i if element.Mode != nil && *element.Mode != "" { if err = json.Unmarshal([]byte(*element.Mode), &mode); err != nil { logx.Error("faile to parse element mode json:", err) - w.renderErrResponse(info.RenderId, info.RenderData.TemplateTag, taskId, "parse element.Mode err", w.userId, w.guestId, productTemplate.Id, model3dInfo.Id, productFirstSize.Id) + w.renderErrResponse(info.RenderId, info.RenderData.TemplateTag, taskId, "parse element.Mode err", w.userId, w.guestId, productTemplate.Id, model3dInfo.Id, productFirstSize.Id, *productTemplate.ElementModelId) return err } } @@ -346,7 +346,7 @@ func (w *wsConnectItem) assembleRenderData(taskId string, combineImage string, i unityRenderBeginTime := time.Now().UTC().UnixMilli() _, err = curl.ApiCall(url, "POST", header, bytes.NewReader(postDataBytes), time.Second*10) if err != nil { - w.renderErrResponse(info.RenderId, info.RenderData.TemplateTag, taskId, "request unity api err", w.userId, w.guestId, productTemplate.Id, model3dInfo.Id, productFirstSize.Id) + w.renderErrResponse(info.RenderId, info.RenderData.TemplateTag, taskId, "request unity api err", w.userId, w.guestId, productTemplate.Id, model3dInfo.Id, productFirstSize.Id, *productTemplate.ElementModelId) logx.Error("failed to send data to unity") return err }