diff --git a/constants/invoice_html.go b/constants/invoice_html.go index 6e4417a8..6fddf30c 100644 --- a/constants/invoice_html.go +++ b/constants/invoice_html.go @@ -196,7 +196,7 @@ const INVOICE_TEMPLATE_01 = ` const INVOICE_TEMPLATE_02 = ` - +
@@ -221,7 +221,7 @@ const INVOICE_TEMPLATE_02 = ` ` const INVOICE_TEMPLATE_03 = ` -
Bill To: Invoice No. #%v
+
@@ -242,7 +242,7 @@ const INVOICE_TEMPLATE_0301 = ` ` const INVOICE_TEMPLATE_04 = ` -
Product Name Price
+
@@ -271,7 +271,7 @@ const INVOICE_TEMPLATE_04 = ` ` const INVOICE_TEMPLATE_05 = ` -
Subtotal %v
+
@@ -287,7 +287,14 @@ const INVOICE_TEMPLATE_05 = ` ` const INVOICE_TEMPLATE_06 = ` - + diff --git a/server/resource/internal/logic/logocombinelogic.go b/server/resource/internal/logic/logocombinelogic.go index 609a4316..2a601548 100644 --- a/server/resource/internal/logic/logocombinelogic.go +++ b/server/resource/internal/logic/logocombinelogic.go @@ -116,6 +116,7 @@ func (l *LogoCombineLogic) LogoCombine(req *types.LogoCombineReq, userinfo *auth }, ProductTemplateTagGroups: req.TemplateTagGroups, ProductTemplateV2Info: productTemplateV2Info, + Debug: userinfo.Debug, }) if err != nil { @@ -124,10 +125,8 @@ func (l *LogoCombineLogic) LogoCombine(req *types.LogoCombineReq, userinfo *auth // 返回成功的响应和上传URL return resp.SetStatus(basic.CodeOK, map[string]interface{}{ - "resource_id": res.ResourceId, - "resource_url": res.ResourceUrl, - "resource_metadata": "", - "diff_time_logo_combine": res.DiffTimeLogoCombine, - "diff_time_upload_file": res.DiffTimeUploadFile, - }) + "resource_id": res.ResourceId, + "resource_url": res.ResourceUrl, + "resource_metadata": "", + }).WithDebug(res.DebugData) } diff --git a/server/upload/internal/logic/uploadlogologic.go b/server/upload/internal/logic/uploadlogologic.go index 05d5b0be..7a2759ad 100644 --- a/server/upload/internal/logic/uploadlogologic.go +++ b/server/upload/internal/logic/uploadlogologic.go @@ -174,6 +174,7 @@ func (l *UploadLogoLogic) UploadLogo(req *types.UploadLogoReq, userinfo *auth.Us resLogoStandard, err := l.svcCtx.Repositories.ImageHandle.LogoInfoSet(l.ctx, &repositories.LogoInfoSetReq{ LogoUrl: logoUrl, Version: l.svcCtx.Config.BLMService.Version, + Debug: userinfo.Debug, }) if err != nil { diff --git a/server/websocket/internal/logic/datatransferlogic.go b/server/websocket/internal/logic/datatransferlogic.go index 0f65ccbb..92e264c1 100644 --- a/server/websocket/internal/logic/datatransferlogic.go +++ b/server/websocket/internal/logic/datatransferlogic.go @@ -104,14 +104,28 @@ type wsConnectItem struct { // 请求建立连接,升级websocket协议 func (l *DataTransferLogic) DataTransfer(req *types.DataTransferReq, w http.ResponseWriter, r *http.Request) { //把子协议携带的token设置到标准token头信息中 - token := r.Header.Get("Sec-Websocket-Protocol") + tokens := r.Header.Get("Sec-Websocket-Protocol") oldWid := req.Wid oldWid = strings.Trim(oldWid, " ") //有token是正常用户,无则是白板用户,也可以连接 - if token != "" { + if tokens != "" { + token := "" + debugToken := "" + tokenSlice := strings.Split(tokens, ",") + switch len(tokenSlice) { + case 1: + token = strings.Trim(tokenSlice[0], " ") + case 2: + token = strings.Trim(tokenSlice[0], " ") + debugToken = strings.Trim(tokenSlice[1], " ") + r.Header.Set("Debug-Token", debugToken) + default: + logx.Error("invalid ws token:", tokens) + return + } r.Header.Set("Authorization", "Bearer "+token) //设置Sec-Websocket-Protocol - upgrader.Subprotocols = []string{token} + upgrader.Subprotocols = []string{tokens} } //判断下是否火狐浏览器(获取浏览器第一条消息返回有收不到的bug需要延迟1秒) userAgent := r.Header.Get("User-Agent") @@ -167,6 +181,7 @@ func (l *DataTransferLogic) setConnPool(conn *websocket.Conn, userInfo *auth.Use l.sendGetUniqueIdErrResponse(conn) return wsConnectItem{}, err } + //传入绑定的wid判断是否可重用 if oldWid != "" { for i := 0; i < 1; i++ { //解析传入的wid是不是属于自己的用户的 @@ -224,12 +239,6 @@ func (l *DataTransferLogic) setConnPool(conn *websocket.Conn, userInfo *auth.Use }, debug: userInfo.Debug, } - //先设置下debug(后面要删掉) - ws.debug = &auth.Debug{ - Exp: &userInfo.Exp, - IsCache: 1, - IsAllTemplateTag: 0, - } //保存连接 mapConnPool.Store(uniqueId, ws) //非白板用户,需要为这个用户建立map索引便于通过用户查询 @@ -237,8 +246,8 @@ func (l *DataTransferLogic) setConnPool(conn *websocket.Conn, userInfo *auth.Use if isFirefoxBrowser { time.Sleep(time.Second * 1) //兼容下火狐(直接发回去收不到第一条消息:有待研究) } - ws.sendToOutChan(ws.respondDataFormat(constants.WEBSOCKET_CONNECT_SUCCESS, websocket_data.ConnectSuccessMsg{Wid: uniqueId})) - //发送累加统计连接书 + ws.sendToOutChan(ws.respondDataFormat(constants.WEBSOCKET_CONNECT_SUCCESS, websocket_data.ConnectSuccessMsg{Wid: uniqueId, Debug: ws.debug != nil})) + //发送累加统计连接数 increaseWebsocketConnectCount() return ws, nil } @@ -275,6 +284,7 @@ func (l *DataTransferLogic) checkAuth(r *http.Request) (isAuth bool, userInfo *a // 解析JWT token,并对空用户进行判断 userInfo, err := basic.ParseJwtToken(r, l.svcCtx) if err != nil { + logx.Error("未授权:", err.Error()) return false, nil } if userInfo.UserId > 0 { @@ -328,6 +338,10 @@ func (w *wsConnectItem) heartbeat() { w.close() return } + //查看debug的时间是否过期 + if w.debug != nil && w.debug.Exp != nil && *w.debug.Exp < time.Now().UTC().Unix() { + w.debug = nil + } //发送心跳信息 if err := w.conn.WriteMessage(websocket.PongMessage, nil); err != nil { logx.Error("发送心跳信息异常,关闭连接:", w.uniqueId, err) diff --git a/server/websocket/internal/logic/ws_render_image.go b/server/websocket/internal/logic/ws_render_image.go index 9cd04c9a..2d072cad 100644 --- a/server/websocket/internal/logic/ws_render_image.go +++ b/server/websocket/internal/logic/ws_render_image.go @@ -10,6 +10,7 @@ import ( "fusenapi/constants" "fusenapi/model/gmodel" "fusenapi/service/repositories" + "fusenapi/utils/auth" "fusenapi/utils/curl" "fusenapi/utils/hash" "fusenapi/utils/websocket_data" @@ -132,7 +133,7 @@ func (w *wsConnectItem) consumeRenderImageData() { }() select { case <-w.extendRenderProperty.renderCtx.Done(): - panic("=========检测到模板标签/颜色变化,渲染取消旧的任务=======") + panic("检测到模板标签/颜色/logo变化,渲染取消旧的任务") case <-tmpChan: return } @@ -245,7 +246,7 @@ func (w *wsConnectItem) renderImage(renderImageData websocket_data.RenderImageRe return } //发送合图完毕阶段消息 - w.sendCombineImageStepResponseMessage(renderImageData.RenderId, renderImageData.RequestId, combineImage, productSize.Id, model3dInfo.Id, productTemplate.Id, res.DiffTimeLogoCombine, res.DiffTimeUploadFile) + w.sendCombineImageStepResponseMessage(renderImageData.RenderId, renderImageData.RequestId, combineImage, productSize.Id, model3dInfo.Id, productTemplate.Id, res.DebugData) //获取唯一id taskId := w.genRenderTaskId(combineImage, renderImageData, model3dInfo, productTemplate, element) //查询有没有缓存的资源,有就返回 @@ -467,17 +468,17 @@ func (w *wsConnectItem) genRenderTaskId(combineImage string, renderImageData web // ****************************下面的发送消息的********************************* // 发送合图完毕阶段通知消息 -func (w *wsConnectItem) sendCombineImageStepResponseMessage(renderId, requestId, combineImage string, sizeId, modelId, templateId, combineTime, uploadTime int64) { +func (w *wsConnectItem) sendCombineImageStepResponseMessage(renderId, requestId, combineImage string, sizeId, modelId, templateId int64, debugData *auth.DebugData) { if w.debug == nil { return } combineTakesTime := "cache" uploadCombineImageTakesTime := "cache" - if combineTime > 0 { - combineTakesTime = fmt.Sprintf("%dms", combineTime) + if debugData.DiffTimeLogoCombine > 0 { + combineTakesTime = fmt.Sprintf("%dms", debugData.DiffTimeLogoCombine) } - if uploadTime > 0 { - uploadCombineImageTakesTime = fmt.Sprintf("%dms", uploadTime) + if debugData.DiffTimeUploadFile > 0 { + uploadCombineImageTakesTime = fmt.Sprintf("%dms", debugData.DiffTimeUploadFile) } w.sendToOutChan(w.respondDataFormat(constants.WEBSOCKET_COMBINE_IMAGE, websocket_data.CombineImageRspMsg{ RenderId: renderId, diff --git a/service/repositories/image_handle.go b/service/repositories/image_handle.go index f5036756..0090dd50 100644 --- a/service/repositories/image_handle.go +++ b/service/repositories/image_handle.go @@ -68,8 +68,9 @@ type ( /* logo信息 */ type ( LogoInfoSetReq struct { - LogoUrl string `json:"logo_url"` - Version string `json:"version"` + LogoUrl string `json:"logo_url"` + Version string `json:"version"` + Debug *auth.Debug `json:"debug"` } LogoInfoSetRes struct { Res string `json:"res"` @@ -90,6 +91,10 @@ func (l *defaultImageHandle) LogoInfoSet(ctx context.Context, in *LogoInfoSetReq postMap["logo_url"] = in.LogoUrl postMap["version"] = in.Version + if in.Debug != nil && in.Debug.IsAllTemplateTag == 1 { + postMap["is_all_template"] = "1" + } + logc.Infof(ctx, "算法请求--LOGO基础信息--开始时间:%v", time.Now().UTC()) err := curl.NewClient(ctx, &curl.Config{ BaseUrl: bLMServicePort, @@ -131,11 +136,10 @@ type ( Debug *auth.Debug `json:"debug"` } LogoCombineRes struct { - ResourceId string - ResourceUrl *string - Metadata *string - DiffTimeLogoCombine int64 - DiffTimeUploadFile int64 + ResourceId string + ResourceUrl *string + Metadata *string + DebugData *auth.DebugData `json:"debug_data"` } ) type TemplateTagColor struct { @@ -144,6 +148,7 @@ type TemplateTagColor struct { } func (l *defaultImageHandle) LogoCombine(ctx context.Context, in *LogoCombineReq) (*LogoCombineRes, error) { + var resp = &LogoCombineRes{} logoResourceId := s3url_to_s3id.GetS3ResourceIdFormUrl(in.LogoUrl) if logoResourceId == "" { return nil, errors.New("invalid logo url") @@ -167,10 +172,12 @@ func (l *defaultImageHandle) LogoCombine(ctx context.Context, in *LogoCombineReq resourceModel := gmodel.NewFsResourceModel(l.MysqlConn) resourceInfo, err := resourceModel.FindOneById(ctx, resourceId) if err == nil && resourceInfo.ResourceId != "" { - return &LogoCombineRes{ - ResourceId: resourceId, - ResourceUrl: resourceInfo.ResourceUrl, - }, nil + if in.Debug == nil || (in.Debug != nil && in.Debug.IsCache == 1) { + return &LogoCombineRes{ + ResourceId: resourceId, + ResourceUrl: resourceInfo.ResourceUrl, + }, nil + } } else { if err != nil { if !errors.Is(err, gorm.ErrRecordNotFound) { @@ -308,12 +315,16 @@ func (l *defaultImageHandle) LogoCombine(ctx context.Context, in *LogoCombineReq return nil, err } - return &LogoCombineRes{ - ResourceId: uploadRes.ResourceId, - ResourceUrl: &uploadRes.ResourceUrl, - DiffTimeLogoCombine: diffTimeLogoCombine, - DiffTimeUploadFile: diffTimeUploadFile, - }, nil + resp.ResourceId = uploadRes.ResourceId + resp.ResourceUrl = &uploadRes.ResourceUrl + if in.Debug != nil { + resp.DebugData = &auth.DebugData{ + DiffTimeLogoCombine: diffTimeLogoCombine, + DiffTimeUploadFile: diffTimeUploadFile, + } + } + + return resp, nil } /* logo合图 */ diff --git a/service/repositories/order.go b/service/repositories/order.go index bdf5f037..bd0ca6c7 100644 --- a/service/repositories/order.go +++ b/service/repositories/order.go @@ -365,11 +365,15 @@ func (d *defaultOrder) Invoice(ctx context.Context, in *InvoiceReq) (res *Invoic var city string var street string var state string + var suite string + var zipCode string if ress.OrderDetail.DeliveryAddress != nil { name = fmt.Sprintf("%s %s", ress.OrderDetail.DeliveryAddress.FirstName, ress.OrderDetail.DeliveryAddress.LastName) street = ress.OrderDetail.DeliveryAddress.Street city = ress.OrderDetail.DeliveryAddress.City state = ress.OrderDetail.DeliveryAddress.State + suite = ress.OrderDetail.DeliveryAddress.Suite + zipCode = ress.OrderDetail.DeliveryAddress.ZipCode } var products string @@ -380,7 +384,7 @@ func (d *defaultOrder) Invoice(ctx context.Context, in *InvoiceReq) (res *Invoic var productsInfo = fmt.Sprintf(model00301, orderProduct.ProductName, price, orderProduct.PurchaseQuantity.Current, priceTotal) products = products + productsInfo } - model003 = fmt.Sprintf(constants.INVOICE_TEMPLATE_03, "", products) + model003 = fmt.Sprintf(constants.INVOICE_TEMPLATE_03, products) var subtotal = fmt.Sprintf("%s%s", constants.OrderCurrencyMessage[constants.Currency(ress.OrderDetail.OrderAmount.Subtotal.Current.CurrentCurrency)], ress.OrderDetail.OrderAmount.Subtotal.Current.CurrentAmount.(string)) var taxStr = "0.00" @@ -396,22 +400,16 @@ func (d *defaultOrder) Invoice(ctx context.Context, in *InvoiceReq) (res *Invoic // 生成收据发票--首款 if receiptSnsDeposit != "" { - v1 := receiptSnsDeposit - v2 := name - v3 := ctimeDate - v4 := street - v5 := city - v6 := state - model002 = fmt.Sprintf(constants.INVOICE_TEMPLATE_02, "", v1, v2, v3, v4, v5, v6) + model002 = fmt.Sprintf(constants.INVOICE_TEMPLATE_02, receiptSnsDeposit, name, ctimeDate, street+" "+suite, city, state+zipCode) v7 := "Deposit Requested" v8 := fmt.Sprintf("%s%s", constants.OrderCurrencyMessage[constants.Currency(ress.OrderDetail.OrderAmount.Deposit.PayAmount.Current.CurrentCurrency)], ress.OrderDetail.OrderAmount.Deposit.PayAmount.Current.CurrentAmount.(string)) v9 := "Deposit Due" v10 := v8 - model004 = fmt.Sprintf(constants.INVOICE_TEMPLATE_04, "", subtotal, tax, total, v7, v8, v9, v10) + model004 = fmt.Sprintf(constants.INVOICE_TEMPLATE_04, subtotal, tax, total, v7, v8, v9, v10) cardSn := "****" + *orderTradeDeposit.CardSn - model005 = fmt.Sprintf(constants.INVOICE_TEMPLATE_05, "", *orderTradeDeposit.CardBrand, cardSn) + model005 = fmt.Sprintf(constants.INVOICE_TEMPLATE_05, *orderTradeDeposit.CardBrand, cardSn) var content = model001 + model002 + model003 + model004 + model005 + model006 @@ -456,22 +454,16 @@ func (d *defaultOrder) Invoice(ctx context.Context, in *InvoiceReq) (res *Invoic // 生成收据发票--尾款 if receiptSnsFinal != "" { - v1 := receiptSnsFinal - v2 := name - v3 := ctimeDate - v4 := street - v5 := city - v6 := state - model002 = fmt.Sprintf(constants.INVOICE_TEMPLATE_02, "", v1, v2, v3, v4, v5, v6) + model002 = fmt.Sprintf(constants.INVOICE_TEMPLATE_02, receiptSnsDeposit, name, ctimeDate, street+" "+suite, city, state+zipCode) v7 := "Balance Requested" v8 := fmt.Sprintf("%s%s", constants.OrderCurrencyMessage[constants.Currency(ress.OrderDetail.OrderAmount.RemainingBalance.PayAmount.Current.CurrentCurrency)], ress.OrderDetail.OrderAmount.RemainingBalance.PayAmount.Current.CurrentAmount.(string)) v9 := "Balance Due" v10 := v8 - model004 = fmt.Sprintf(constants.INVOICE_TEMPLATE_04, "", subtotal, tax, total, v7, v8, v9, v10) + model004 = fmt.Sprintf(constants.INVOICE_TEMPLATE_04, subtotal, tax, total, v7, v8, v9, v10) cardSn := "****" + *orderTradeFinal.CardSn - model005 = fmt.Sprintf(constants.INVOICE_TEMPLATE_05, "", *orderTradeDeposit.CardBrand, cardSn) + model005 = fmt.Sprintf(constants.INVOICE_TEMPLATE_05, *orderTradeDeposit.CardBrand, cardSn) var content = model001 + model002 + model003 + model004 + model005 + model006 base64, err := pdf.HtmlToPdfBase64(content, "html") if err != nil { diff --git a/utils/auth/user.go b/utils/auth/user.go index b8b2dee6..1f88351d 100644 --- a/utils/auth/user.go +++ b/utils/auth/user.go @@ -24,6 +24,12 @@ const ( IDTYPE_Guest IDTYPE = 2 ) +// DebugData +type DebugData struct { + DiffTimeLogoCombine int64 `json:"diff_time_logo_combine"` // 合图算法时间 + DiffTimeUploadFile int64 `json:"diff_time_upload_file"` // 合图上传时间 +} + // Debug 相关的结构 type Debug struct { Exp *int64 `json:"exp"` diff --git a/utils/websocket_data/base_data.go b/utils/websocket_data/base_data.go index c3799fa4..2951c394 100644 --- a/utils/websocket_data/base_data.go +++ b/utils/websocket_data/base_data.go @@ -2,7 +2,8 @@ package websocket_data // 基础连接成功返回 type ConnectSuccessMsg struct { - Wid string `json:"wid"` + Wid string `json:"wid"` //websocket连接唯一标识 + Debug bool `json:"debug"` //是否开启debug } // 连接失败
Payment Method: Notes: