From e77da7875e82750789e91acb11027452cc04f417 Mon Sep 17 00:00:00 2001 From: fuzhongyun <15339891972@163.com> Date: Wed, 31 Dec 2025 12:02:12 +0800 Subject: [PATCH 1/3] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E7=94=B5?= =?UTF-8?q?=E5=95=86=E5=85=85=E5=80=BC=E7=B3=BB=E7=BB=9F=E6=88=91=E4=BB=AC?= =?UTF-8?q?=E7=9A=84=E5=95=86=E5=93=81=E7=BB=9F=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/biz/ding_talk_bot.go | 87 +++++++++++++------ internal/biz/do/handle.go | 2 +- internal/domain/workflow/hyt/goods_add.go | 3 +- .../domain/workflow/hyt/product_upload.go | 3 +- .../recharge/statistics_ours_product.go | 49 ++++++++--- internal/domain/workflow/runtime/registry.go | 9 +- .../zltx/bug_optimization_submit.bak.go | 4 +- .../workflow/zltx/bug_optimization_submit.go | 4 +- .../zltx/order_after_reseller_batch.go | 2 +- internal/server/http.go | 4 +- internal/server/router/router.go | 8 +- internal/services/capability.go | 2 +- internal/services/dtalk_bot_test.go | 5 +- 13 files changed, 127 insertions(+), 55 deletions(-) diff --git a/internal/biz/ding_talk_bot.go b/internal/biz/ding_talk_bot.go index e065ff2..405d027 100644 --- a/internal/biz/ding_talk_bot.go +++ b/internal/biz/ding_talk_bot.go @@ -7,6 +7,8 @@ import ( "ai_scheduler/internal/data/constants" "ai_scheduler/internal/data/impl" "ai_scheduler/internal/data/model" + "ai_scheduler/internal/domain/workflow/recharge" + "ai_scheduler/internal/domain/workflow/runtime" "ai_scheduler/internal/entitys" "ai_scheduler/internal/pkg/l_request" "ai_scheduler/internal/pkg/utils_oss" @@ -35,19 +37,20 @@ import ( // AiRouterBiz 智能路由服务 type DingTalkBotBiz struct { - do *do.Do - handle *do.Handle - botConfigImpl *impl.BotConfigImpl - replier *chatbot.ChatbotReplier - log log.Logger - dingTalkUser *dingtalk.User - botTools []model.AiBotTool - botGroupImpl *impl.BotGroupImpl - toolManager *tools.Manager - chatHis *impl.BotChatHisImpl - conf *config.Config - cardSend *dingtalk.SendCardClient - ossClient *utils_oss.Client + do *do.Do + handle *do.Handle + botConfigImpl *impl.BotConfigImpl + replier *chatbot.ChatbotReplier + log log.Logger + dingTalkUser *dingtalk.User + botTools []model.AiBotTool + botGroupImpl *impl.BotGroupImpl + toolManager *tools.Manager + chatHis *impl.BotChatHisImpl + conf *config.Config + cardSend *dingtalk.SendCardClient + ossClient *utils_oss.Client + workflowManager *runtime.Registry } // NewDingTalkBotBiz @@ -63,20 +66,22 @@ func NewDingTalkBotBiz( conf *config.Config, cardSend *dingtalk.SendCardClient, ossClient *utils_oss.Client, + workflowManager *runtime.Registry, ) *DingTalkBotBiz { return &DingTalkBotBiz{ - do: do, - handle: handle, - botConfigImpl: botConfigImpl, - replier: chatbot.NewChatbotReplier(), - dingTalkUser: dingTalkUser, - botTools: tools.BootTools, - botGroupImpl: botGroupImpl, - toolManager: toolManager, - chatHis: chatHis, - conf: conf, - cardSend: cardSend, - ossClient: ossClient, + do: do, + handle: handle, + botConfigImpl: botConfigImpl, + replier: chatbot.NewChatbotReplier(), + dingTalkUser: dingTalkUser, + botTools: tools.BootTools, + botGroupImpl: botGroupImpl, + toolManager: toolManager, + chatHis: chatHis, + conf: conf, + cardSend: cardSend, + ossClient: ossClient, + workflowManager: workflowManager, } } @@ -552,6 +557,38 @@ func (d *DingTalkBotBiz) GetReportLists(ctx context.Context, group *model.AiBotG return } + // 追加电商充值系统统计 - 返回统一使用 []*bbxt.ReportRes + rechargeReports, err := d.rechargeDailyReport(ctx, time.Now(), []string{"官方-爱奇艺-星钻季卡", "官方-爱奇艺-星钻半年卡", "官方--腾讯-年卡", "官方--爱奇艺-月卡"}, d.ossClient) + reports = append(reports, rechargeReports...) + + return +} + +// rechargeDailyReport 获取电商充值系统统计报告 +func (d *DingTalkBotBiz) rechargeDailyReport(ctx context.Context, now time.Time, productNames []string, ossClient *utils_oss.Client) (reports []*bbxt.ReportRes, err error) { + workflowId := recharge.WorkflowIDStatisticsOursProduct + args := &runtime.WorkflowArgs{ + Args: map[string]any{ + "product_names": productNames, + "now": now, + }, + } + res, err := d.workflowManager.Invoke(ctx, workflowId, args) + if err != nil { + return + } + + reports = []*bbxt.ReportRes{ + { + ReportName: "我们的商品统计(电商充值系统)", + Title: fmt.Sprintf("%s 电商充值系统我们的商品统计", now.Format("2006-01-02")), + Path: res["path"].(string), + Url: res["url"].(string), + Data: res["data"].([][]string), + Desc: res["desc"].(string), + }, + } + return } diff --git a/internal/biz/do/handle.go b/internal/biz/do/handle.go index a1a9dcf..afc4b2b 100644 --- a/internal/biz/do/handle.go +++ b/internal/biz/do/handle.go @@ -396,7 +396,7 @@ func (r *Handle) handleEinoWorkflow(ctx context.Context, rec *entitys.Recognize, // 工作流内部输出 workflowId := task.Index - _, err = r.workflowManager.Invoke(ctx, workflowId, rec) + _, err = r.workflowManager.Invoke(ctx, workflowId, &runtime.WorkflowArgs{Recognize: rec}) if err != nil { return err } diff --git a/internal/domain/workflow/hyt/goods_add.go b/internal/domain/workflow/hyt/goods_add.go index 91db063..c41b66b 100644 --- a/internal/domain/workflow/hyt/goods_add.go +++ b/internal/domain/workflow/hyt/goods_add.go @@ -8,7 +8,6 @@ import ( "ai_scheduler/internal/domain/tools/hyt/goods_category_add" "ai_scheduler/internal/domain/tools/hyt/goods_media_add" "ai_scheduler/internal/domain/workflow/runtime" - "ai_scheduler/internal/entitys" "context" "encoding/json" "errors" @@ -42,7 +41,7 @@ type GoodsAddWorkflowInput struct { func (o *goodsAdd) ID() string { return WorkflowIDGoodsAdd } -func (o *goodsAdd) Invoke(ctx context.Context, rec *entitys.Recognize) (map[string]any, error) { +func (o *goodsAdd) Invoke(ctx context.Context, rec *runtime.WorkflowArgs) (map[string]any, error) { // 构建工作流 runnable, err := o.buildWorkflow(ctx) if err != nil { diff --git a/internal/domain/workflow/hyt/product_upload.go b/internal/domain/workflow/hyt/product_upload.go index 35114ed..b2af877 100644 --- a/internal/domain/workflow/hyt/product_upload.go +++ b/internal/domain/workflow/hyt/product_upload.go @@ -6,7 +6,6 @@ import ( toolManager "ai_scheduler/internal/domain/tools" toolPu "ai_scheduler/internal/domain/tools/hyt/product_upload" "ai_scheduler/internal/domain/workflow/runtime" - "ai_scheduler/internal/entitys" "context" "encoding/json" "errors" @@ -39,7 +38,7 @@ type ProductUploadWorkflowInput struct { func (o *productUpload) ID() string { return WorkflowIDProductUpload } -func (o *productUpload) Invoke(ctx context.Context, rec *entitys.Recognize) (map[string]any, error) { +func (o *productUpload) Invoke(ctx context.Context, rec *runtime.WorkflowArgs) (map[string]any, error) { // 构建工作流 runnable, err := o.buildWorkflow(ctx) if err != nil { diff --git a/internal/domain/workflow/recharge/statistics_ours_product.go b/internal/domain/workflow/recharge/statistics_ours_product.go index d8bd64a..cb89347 100644 --- a/internal/domain/workflow/recharge/statistics_ours_product.go +++ b/internal/domain/workflow/recharge/statistics_ours_product.go @@ -6,7 +6,6 @@ import ( toolManager "ai_scheduler/internal/domain/tools" "ai_scheduler/internal/domain/tools/recharge/statistics_ours_product" "ai_scheduler/internal/domain/workflow/runtime" - "ai_scheduler/internal/entitys" "ai_scheduler/internal/pkg/utils_oss" "context" "errors" @@ -37,28 +36,31 @@ type StatisticsOursProductWorkflowInput struct { } type StatisticsOursProductWorkflowOutput struct { - ImgUrl string `json:"img_url"` + Path string `json:"path"` + Url string `json:"url"` + Data [][]string `json:"data"` + Desc string `json:"desc"` } func (w *statisticsOursProduct) ID() string { return WorkflowIDStatisticsOursProduct } -func (w *statisticsOursProduct) Invoke(ctx context.Context, rec *entitys.Recognize) (map[string]any, error) { +func (w *statisticsOursProduct) Invoke(ctx context.Context, args *runtime.WorkflowArgs) (map[string]any, error) { // 构建工作流 runnable, err := w.buildWorkflow(ctx) if err != nil { return nil, err } - // 解析参数 (假设参数在 rec.Match.Parameters 中,或者根据实际情况解析) - // 这里简化处理,假设需要解析参数 - // 实际上这里应该根据 LLM 解析的结果来填充 Input - // 暂时假设 ParameterResult 是 JSON 字符串 + // 获取参数时间 + now := args.Args["now"].(time.Time) input := &StatisticsOursProductWorkflowInput{ // 默认值,具体应从 rec 解析 - StartTime: time.Now().Format("2006010200"), - EndTime: time.Now().Format("2006010223"), + StartTime: now.Format("2006010200"), + EndTime: now.Format("2006010215"), } + input.StartTime = "2025122300" + // 工作流过程调用 output, err := runnable.Invoke(ctx, input) if err != nil { @@ -70,11 +72,11 @@ func (w *statisticsOursProduct) Invoke(ctx context.Context, rec *entitys.Recogni return nil, errorcode.WorkflowErr(errStr) } - return map[string]any{"img_url": output.ImgUrl}, nil + return output, nil } -func (w *statisticsOursProduct) buildWorkflow(ctx context.Context) (compose.Runnable[*StatisticsOursProductWorkflowInput, *StatisticsOursProductWorkflowOutput], error) { - c := compose.NewChain[*StatisticsOursProductWorkflowInput, *StatisticsOursProductWorkflowOutput]() +func (w *statisticsOursProduct) buildWorkflow(ctx context.Context) (compose.Runnable[*StatisticsOursProductWorkflowInput, map[string]any], error) { + c := compose.NewChain[*StatisticsOursProductWorkflowInput, map[string]any]() // 1. 调用工具统计我们的商品 c.AppendLambda(compose.InvokableLambda(w.callStatisticsTool)) @@ -82,6 +84,9 @@ func (w *statisticsOursProduct) buildWorkflow(ctx context.Context) (compose.Runn // 2. 生成 Excel 并转图片上传 c.AppendLambda(compose.InvokableLambda(w.generateExcelAndUpload)) + // 3. 转map输出 + c.AppendLambda(compose.InvokableLambda(w.convertToMap)) + return c.Compile(ctx) } @@ -98,7 +103,7 @@ func (w *statisticsOursProduct) callStatisticsTool(ctx context.Context, input *S func (w *statisticsOursProduct) generateExcelAndUpload(ctx context.Context, data []statistics_ours_product.StatisticsOursProductItem) (*StatisticsOursProductWorkflowOutput, error) { // 2. 获取模板路径 (假设在项目根目录的 assets/templates 下) cwd, _ := filepath.Abs(".") - templatePath := filepath.Join(cwd, "assets", "templates", "statistics_ours_product.xlsx") + templatePath := filepath.Join(cwd, "tmpl", "excel_temp", "recharge_statistics_ours_product.xlsx") fileName := fmt.Sprintf("statistics_ours_product_%d", time.Now().Unix()) // 3. 转换数据为 [][]string @@ -122,7 +127,14 @@ func (w *statisticsOursProduct) generateExcelAndUpload(ctx context.Context, data return nil, fmt.Errorf("上传 OSS 失败: %v", err) } - return &StatisticsOursProductWorkflowOutput{ImgUrl: url}, nil + res := &StatisticsOursProductWorkflowOutput{ + Path: "", + Url: url, + Data: excelData, + Desc: "", + } + + return res, nil } // convertDataToExcelFormat 将业务数据转换为 Excel 生成器需要的二维字符串数组 @@ -144,3 +156,12 @@ func (w *statisticsOursProduct) convertDataToExcelFormat(data []statistics_ours_ } return result } + +func (w *statisticsOursProduct) convertToMap(ctx context.Context, output *StatisticsOursProductWorkflowOutput) (map[string]any, error) { + return map[string]any{ + "path": output.Path, + "url": output.Url, + "data": output.Data, + "desc": output.Desc, + }, nil +} diff --git a/internal/domain/workflow/runtime/registry.go b/internal/domain/workflow/runtime/registry.go index f804e1d..1d391f2 100644 --- a/internal/domain/workflow/runtime/registry.go +++ b/internal/domain/workflow/runtime/registry.go @@ -15,7 +15,7 @@ import ( type Workflow interface { ID() string // Schema() map[string]any - Invoke(ctx context.Context, requireData *entitys.Recognize) (map[string]any, error) + Invoke(ctx context.Context, requireData *WorkflowArgs) (map[string]any, error) } type Deps struct { @@ -28,6 +28,11 @@ type Deps struct { type Factory func(deps *Deps) (Workflow, error) +type WorkflowArgs struct { + *entitys.Recognize + Args map[string]any +} + var ( regMu sync.RWMutex factories = map[string]Factory{} @@ -69,7 +74,7 @@ func Default() *Registry { return r } -func (r *Registry) Invoke(ctx context.Context, id string, rec *entitys.Recognize) (map[string]any, error) { +func (r *Registry) Invoke(ctx context.Context, id string, rec *WorkflowArgs) (map[string]any, error) { regMu.RLock() f, ok := factories[id] regMu.RUnlock() diff --git a/internal/domain/workflow/zltx/bug_optimization_submit.bak.go b/internal/domain/workflow/zltx/bug_optimization_submit.bak.go index 6ed6bb4..0ab94ee 100644 --- a/internal/domain/workflow/zltx/bug_optimization_submit.bak.go +++ b/internal/domain/workflow/zltx/bug_optimization_submit.bak.go @@ -42,7 +42,7 @@ func (w *bugOptimizationSubmitBak) ID() string { type BugOptimizationSubmitBakInput struct { Ch chan entitys.Response - RequireData *entitys.Recognize + RequireData *runtime.WorkflowArgs } type BugOptimizationSubmitBakOutput struct { @@ -54,7 +54,7 @@ type contextWithTaskBak struct { TaskID string } -func (w *bugOptimizationSubmitBak) Invoke(ctx context.Context, recognize *entitys.Recognize) (map[string]any, error) { +func (w *bugOptimizationSubmitBak) Invoke(ctx context.Context, recognize *runtime.WorkflowArgs) (map[string]any, error) { chain, err := w.buildWorkflow(ctx) if err != nil { return nil, err diff --git a/internal/domain/workflow/zltx/bug_optimization_submit.go b/internal/domain/workflow/zltx/bug_optimization_submit.go index 30ad0bc..ccf6812 100644 --- a/internal/domain/workflow/zltx/bug_optimization_submit.go +++ b/internal/domain/workflow/zltx/bug_optimization_submit.go @@ -42,7 +42,7 @@ func (w *bugOptimizationSubmit) ID() string { type BugOptimizationSubmitInput struct { Ch chan entitys.Response - RequireData *entitys.Recognize + RequireData *runtime.WorkflowArgs } type BugOptimizationSubmitOutput struct { @@ -54,7 +54,7 @@ type contextWithTask struct { TaskID string } -func (w *bugOptimizationSubmit) Invoke(ctx context.Context, recognize *entitys.Recognize) (map[string]any, error) { +func (w *bugOptimizationSubmit) Invoke(ctx context.Context, recognize *runtime.WorkflowArgs) (map[string]any, error) { chain, err := w.buildWorkflow(ctx) if err != nil { return nil, err diff --git a/internal/domain/workflow/zltx/order_after_reseller_batch.go b/internal/domain/workflow/zltx/order_after_reseller_batch.go index eee022a..620d636 100644 --- a/internal/domain/workflow/zltx/order_after_reseller_batch.go +++ b/internal/domain/workflow/zltx/order_after_reseller_batch.go @@ -78,7 +78,7 @@ type OrderAfterSaleResellerBatchData struct { func (o *orderAfterSaleResellerBatch) ID() string { return "zltx.orderAfterSaleResellerBatch" } // Invoke 调用原有编排工作流并规范化输出 -func (o *orderAfterSaleResellerBatch) Invoke(ctx context.Context, rec *entitys.Recognize) (map[string]any, error) { +func (o *orderAfterSaleResellerBatch) Invoke(ctx context.Context, rec *runtime.WorkflowArgs) (map[string]any, error) { // 构建工作流 chain, err := o.buildWorkflow(ctx) if err != nil { diff --git a/internal/server/http.go b/internal/server/http.go index 53446c8..3d0b180 100644 --- a/internal/server/http.go +++ b/internal/server/http.go @@ -18,6 +18,7 @@ type HTTPServer struct { callback *services.CallbackService chatHis *services.HistoryService capabilityService *services.CapabilityService + cronService *services.CronService } func NewHTTPServer( @@ -28,10 +29,11 @@ func NewHTTPServer( callback *services.CallbackService, chatHis *services.HistoryService, capabilityService *services.CapabilityService, + cronService *services.CronService, ) *fiber.App { //构建 server app := initRoute() - router.SetupRoutes(app, service, session, task, gateway, callback, chatHis, capabilityService) + router.SetupRoutes(app, service, session, task, gateway, callback, chatHis, capabilityService, cronService) return app } diff --git a/internal/server/router/router.go b/internal/server/router/router.go index 091c85f..3c33b42 100644 --- a/internal/server/router/router.go +++ b/internal/server/router/router.go @@ -21,12 +21,13 @@ type RouterServer struct { gateway *gateway.Gateway chatHist *services.HistoryService capabilityService *services.CapabilityService + cronService *services.CronService } // SetupRoutes 设置路由 func SetupRoutes(app *fiber.App, ChatService *services.ChatService, sessionService *services.SessionService, task *services.TaskService, gateway *gateway.Gateway, callbackService *services.CallbackService, chatHist *services.HistoryService, - capabilityService *services.CapabilityService, + capabilityService *services.CapabilityService, cronService *services.CronService, ) { app.Use(func(c *fiber.Ctx) error { // 设置 CORS 头 @@ -94,6 +95,11 @@ func SetupRoutes(app *fiber.App, ChatService *services.ChatService, sessionServi // 能力 r.Post("/capability/product/ingest", capabilityService.ProductIngest) // 商品数据提取 r.Post("/capability/product/ingest/:thread_id/confirm", capabilityService.ProductIngestConfirm) // 商品数据提取确认 + + // 测试任务 + r.Post("/test/cron", func(c *fiber.Ctx) error { + return cronService.CronReportSend(c.Context()) + }) } func routerSocket(app *fiber.App, chatService *services.ChatService) { diff --git a/internal/services/capability.go b/internal/services/capability.go index 759433c..d2c1e9b 100644 --- a/internal/services/capability.go +++ b/internal/services/capability.go @@ -198,7 +198,7 @@ func (s *CapabilityService) ProductIngestConfirm(c *fiber.Ctx) error { // 调用eino工作流,实现商品上传到目标系统 rec := &entitys.Recognize{UserContent: &entitys.RecognizeUserContent{Text: req.Confirmed}} - res, err := s.workflowManager.Invoke(ctx, workflowId, rec) + res, err := s.workflowManager.Invoke(ctx, workflowId, &runtime.WorkflowArgs{Recognize: rec}) if err != nil { return err } diff --git a/internal/services/dtalk_bot_test.go b/internal/services/dtalk_bot_test.go index a9a75e0..bd0ceef 100644 --- a/internal/services/dtalk_bot_test.go +++ b/internal/services/dtalk_bot_test.go @@ -12,6 +12,7 @@ import ( "ai_scheduler/internal/domain/component/callback" "ai_scheduler/internal/domain/repo" "ai_scheduler/internal/domain/workflow" + "ai_scheduler/internal/domain/workflow/runtime" "ai_scheduler/internal/pkg" "ai_scheduler/internal/pkg/dingtalk" "ai_scheduler/internal/pkg/utils_ollama" @@ -102,7 +103,9 @@ func run() { handle := do.NewHandle(ollamaService, manager, configConfig, sessionImpl, registry, oldClient, contactClient, notableClient) // 初始化钉钉机器人业务逻辑 utils_ossClient, _ := utils_oss.NewClient(configConfig) - dingTalkBotBiz := biz.NewDingTalkBotBiz(doDo, handle, botConfigImpl, botGroupImpl, user, toolRegis, botChatHisImpl, manager, configConfig, sendCardClient, utils_ossClient) + // 初始化工作流管理器 + workflowManager := runtime.NewRegistry() + dingTalkBotBiz := biz.NewDingTalkBotBiz(doDo, handle, botConfigImpl, botGroupImpl, user, toolRegis, botChatHisImpl, manager, configConfig, sendCardClient, utils_ossClient, workflowManager) // 初始化钉钉机器人服务 cronService = NewCronService(configConfig, dingTalkBotBiz) dingBotService = NewDingBotService(configConfig, dingTalkBotBiz) From 36d9d3f363c4c490a511ed1af124364973d255f3 Mon Sep 17 00:00:00 2001 From: fuzhongyun <15339891972@163.com> Date: Wed, 31 Dec 2025 14:15:43 +0800 Subject: [PATCH 2/3] =?UTF-8?q?fix:=201.=E9=99=8D=E4=BD=8E=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E7=94=9F=E6=88=90=E5=80=8D=E7=8E=87=202.=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E6=A8=A1=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tools/common/image_converter/client.go | 10 +++++++++- .../recharge/statistics_ours_product.go | 15 ++++++++------- internal/server/http.go | 4 +--- internal/server/router/router.go | 8 +------- internal/tools/bbxt/upload.go | 12 ++++++++++-- tmpl/excel_temp/kshj_gt.xlsx | Bin 9942 -> 9953 bytes tmpl/excel_temp/kshj_total.xlsx | Bin 9414 -> 9421 bytes .../recharge_statistics_ours_product.xlsx | Bin 9787 -> 9901 bytes 8 files changed, 29 insertions(+), 20 deletions(-) diff --git a/internal/domain/tools/common/image_converter/client.go b/internal/domain/tools/common/image_converter/client.go index 5eba199..2de57d2 100644 --- a/internal/domain/tools/common/image_converter/client.go +++ b/internal/domain/tools/common/image_converter/client.go @@ -21,7 +21,7 @@ func New(cfg config.ToolConfig) *Client { } // Call 将 Excel 文件转换为图片 -func (c *Client) Call(filename string, fileBytes []byte) ([]byte, error) { +func (c *Client) Call(filename string, fileBytes []byte, scale int) ([]byte, error) { body := &bytes.Buffer{} writer := multipart.NewWriter(body) @@ -33,6 +33,14 @@ func (c *Client) Call(filename string, fileBytes []byte) ([]byte, error) { return nil, err } + // 添加 scale 参数 + if scale <= 0 { + scale = 2 + } + if err = writer.WriteField("scale", fmt.Sprintf("%d", scale)); err != nil { + return nil, err + } + if err = writer.Close(); err != nil { return nil, err } diff --git a/internal/domain/workflow/recharge/statistics_ours_product.go b/internal/domain/workflow/recharge/statistics_ours_product.go index cb89347..ebc33a9 100644 --- a/internal/domain/workflow/recharge/statistics_ours_product.go +++ b/internal/domain/workflow/recharge/statistics_ours_product.go @@ -110,13 +110,13 @@ func (w *statisticsOursProduct) generateExcelAndUpload(ctx context.Context, data excelData := w.convertDataToExcelFormat(data) // 4. 生成 Excel - excelBytes, err := w.toolManager.Common.ExcelGenerator.Call(templatePath, excelData, 2, 2) + excelBytes, err := w.toolManager.Common.ExcelGenerator.Call(templatePath, excelData, 4, 3) if err != nil { return nil, fmt.Errorf("生成 Excel 失败: %v", err) } // 5. Excel 转图片 - picBytes, err := w.toolManager.Common.ImageConverter.Call(fileName+".xlsx", excelBytes) + picBytes, err := w.toolManager.Common.ImageConverter.Call(fileName+".xlsx", excelBytes, 2) if err != nil { return nil, fmt.Errorf("Excel 转图片失败: %v", err) } @@ -143,15 +143,16 @@ func (w *statisticsOursProduct) convertDataToExcelFormat(data []statistics_ours_ for _, item := range data { row := []string{ item.OursProductName, - fmt.Sprintf("%d", item.OursProductId), + // fmt.Sprintf("%d", item.OursProductId), item.Count, - item.TotalPrice, - item.SuccessCount, + // item.TotalPrice, + // item.SuccessCount, item.SuccessPrice, - item.FailCount, - item.FailPrice, + // item.FailCount, + // item.FailPrice, item.Profit, } + result = append(result, row) } return result diff --git a/internal/server/http.go b/internal/server/http.go index 3d0b180..53446c8 100644 --- a/internal/server/http.go +++ b/internal/server/http.go @@ -18,7 +18,6 @@ type HTTPServer struct { callback *services.CallbackService chatHis *services.HistoryService capabilityService *services.CapabilityService - cronService *services.CronService } func NewHTTPServer( @@ -29,11 +28,10 @@ func NewHTTPServer( callback *services.CallbackService, chatHis *services.HistoryService, capabilityService *services.CapabilityService, - cronService *services.CronService, ) *fiber.App { //构建 server app := initRoute() - router.SetupRoutes(app, service, session, task, gateway, callback, chatHis, capabilityService, cronService) + router.SetupRoutes(app, service, session, task, gateway, callback, chatHis, capabilityService) return app } diff --git a/internal/server/router/router.go b/internal/server/router/router.go index 3c33b42..091c85f 100644 --- a/internal/server/router/router.go +++ b/internal/server/router/router.go @@ -21,13 +21,12 @@ type RouterServer struct { gateway *gateway.Gateway chatHist *services.HistoryService capabilityService *services.CapabilityService - cronService *services.CronService } // SetupRoutes 设置路由 func SetupRoutes(app *fiber.App, ChatService *services.ChatService, sessionService *services.SessionService, task *services.TaskService, gateway *gateway.Gateway, callbackService *services.CallbackService, chatHist *services.HistoryService, - capabilityService *services.CapabilityService, cronService *services.CronService, + capabilityService *services.CapabilityService, ) { app.Use(func(c *fiber.Ctx) error { // 设置 CORS 头 @@ -95,11 +94,6 @@ func SetupRoutes(app *fiber.App, ChatService *services.ChatService, sessionServi // 能力 r.Post("/capability/product/ingest", capabilityService.ProductIngest) // 商品数据提取 r.Post("/capability/product/ingest/:thread_id/confirm", capabilityService.ProductIngestConfirm) // 商品数据提取确认 - - // 测试任务 - r.Post("/test/cron", func(c *fiber.Ctx) error { - return cronService.CronReportSend(c.Context()) - }) } func routerSocket(app *fiber.App, chatService *services.ChatService) { diff --git a/internal/tools/bbxt/upload.go b/internal/tools/bbxt/upload.go index a5d0886..c5b6c80 100644 --- a/internal/tools/bbxt/upload.go +++ b/internal/tools/bbxt/upload.go @@ -42,7 +42,7 @@ func (u *Uploader) Run(report *ReportRes) (err error) { return fmt.Errorf("write to bytes failed: %v", err) } - picBytes, err := u.excel2picPy(report.Path, excelBytes.Bytes()) + picBytes, err := u.excel2picPy(report.Path, excelBytes.Bytes(), 2) if err != nil { return fmt.Errorf("excel2picPy failed: %v", err) } @@ -62,7 +62,7 @@ func (u *Uploader) Run(report *ReportRes) (err error) { // --header 'Content-Type: multipart/form-data; boundary=--------------------------952147881043913664015069' \ // --form 'file=@"C:\\Users\\Administrator\\Downloads\\销售同比分析2025-12-29 0-12点.xlsx"' \ // --form 'sheet_name="销售同比分析"' -func (u *Uploader) excel2picPy(templatePath string, excelBytes []byte) ([]byte, error) { +func (u *Uploader) excel2picPy(templatePath string, excelBytes []byte, scale int) ([]byte, error) { // 1. 获取 Sheet Name // 尝试从 excelBytes 解析,如果失败则使用默认值 "Sheet1" sheetName := "Sheet1" @@ -99,6 +99,14 @@ func (u *Uploader) excel2picPy(templatePath string, excelBytes []byte) ([]byte, return nil, fmt.Errorf("write field sheet_name failed: %v", err) } + // 添加 scale 字段 + if scale <= 0 { + scale = 2 + } + if err = writer.WriteField("scale", fmt.Sprintf("%d", scale)); err != nil { + return nil, fmt.Errorf("write field scale failed: %v", err) + } + if err = writer.Close(); err != nil { return nil, fmt.Errorf("close writer failed: %v", err) } diff --git a/tmpl/excel_temp/kshj_gt.xlsx b/tmpl/excel_temp/kshj_gt.xlsx index 2b27bfa07c042ba158bc3229982c9138797ccee1..957d183be77472f2dee09f9b090d878285dbc25d 100755 GIT binary patch delta 4551 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 F0046xBuoGR delta 3696 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 PvSGk{v?M9q|G@tPMQ29H delta 4844 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 XiGM3s<6}qgnXvD;sR*H*f9d}L{4^I$ From d32df33478db0175b1b7d8abcf23a66b925a647c Mon Sep 17 00:00:00 2001 From: fuzhongyun <15339891972@163.com> Date: Wed, 31 Dec 2025 14:31:58 +0800 Subject: [PATCH 3/3] =?UTF-8?q?fix=EF=BC=9A=E8=B0=83=E6=95=B4=E6=A8=A1?= =?UTF-8?q?=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tmpl/excel_temp/kshj_gt.xlsx | Bin 9953 -> 9955 bytes tmpl/excel_temp/kshj_total.xlsx | Bin 9421 -> 9420 bytes .../recharge_statistics_ours_product.xlsx | Bin 9901 -> 9899 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/tmpl/excel_temp/kshj_gt.xlsx b/tmpl/excel_temp/kshj_gt.xlsx index 957d183be77472f2dee09f9b090d878285dbc25d..5aeeab5426eec2cc207e4cbeaa18909223284550 100755 GIT binary patch delta 4566 zcmZ9QWmFVwyMb`x;v#qx{+{5#{of*W~8ONq+4Q$Aw)u2Iury+ z0TBc~eZRBTIqUq{&%O42t^NDi_lEYCb{!gsr)Ksg6`c-bLF)FiPz|nW|0V?=@l9eK zSv_g*9CZ1G>Q%NFP@VCnF1RkO-U6P^HRFWL8*i_--ZGrd%Fj;`nwHTUvSg7{p(x^w zoF3SXoP#cJ2v+C2yk9!r zt9zR*^;y?G$R?>}-xDn2g`onCX~a%SNJ5D1vW}9!f`$<562gKEz#}-5j|qI`s&LXe zA2EA4fs)UB)Olq^y}qPs29<;V!?1UAtchp1AbZ}?c9o(rBCHi zuYHn*g;c1G?xs+je(t%m?@pAo-ZgxENA9Xj122jz71^ZCA3It636%xvY2xCc;T-gh zl(=<3(h|e+{XQH3poahepaY=mx#*Fp#!EU|g5+T~u6LMIsrDB9%2J}yLMzwD3L#<7 za@6gU2h5f{*N-4e>T0OjK282DksZcF=akvOFso!-D4zp*N+KGHiuzzF+8K9y73Alu z67#Tn#Eg?+co)|txc>IiZdN^@OcS7(R4@hMi+4@8D-XISHjVNqz@#cvW+5S=#+`bt z#HNQSd%RkOE);WGqBA1!SqljVeInBNlp}YSIBtDCp@`c69&?$xl^yTR57hfUwGnwS zgYG@Tr-O~Ow{Do!nFc{%dcbZ?*YcO3z~@a9Sv@SlC8lDAi0ccy7>ng)6Qe%qwgb|r zUg;BmD_Z{=(!lA?3@Ye9U?j%l;`8uT7DQzphQMj%wXF3;88@lwQc*#=;?lDNRi0wx zpOfsKZD-Q8+yJS4a35U|bG8t+7_6GD(}I-KmVt22Efq#vT;tR!T|bYa9vwVpeHKRQ z(us)A@%vd8%D&KrZea$q8;W)wkzk!y3y8%qf_fO(Tpf2iJ;X2uNzmN~c@o)H zokU$*Ow-cOQ?b~EID(*|rW_gLRx!buZMx^`>Ul4Jj&px3T9Q*!kwkg z>JmGnBbsHT$Kpt}Q2O|}!A)#(jr(+s=%w+gX9AL-H!AKs2dzQY27aVw>$9!!OZtSK z+;evH1~Y5pIAPU2WSbvU3I_}Te76Sx{ycy{4*@^_AP+}B{y?cg38ARZDiU{qx^>ND<^+(D+qqe>ZHU;U;+t{E&Cg zv4m|gB4Iv&;F=-zXic!H=Cvqswfwwq7phDDQG;qKEZgSp^A%LW_h6r}g-NaViQwmQ zMm&sKM9}i;jG(_BV@9 zCEhk2#mjH36(?lhHRN^w!Y+_lSEbmr4IsQUs2?FI2Ty06eo+?Qh5d?_u6sghQ*UtJ zCWSWgP5DP&3XQJnu?1BdpXFN1k%tC(U-I;5LIgH*FCR9EoL_?+w*@=0_hr20BB~3Z zMdI1}MXkjaX(Y2s$`pHn?{+kS`AmgzYoO|GZ4IpiBOmH} zniot+06duIK4kk&#)vm1%2mRZm@WU4jx16@k$y}tKI8!N$%3OBq?z_ z2u#K~-+gr?(!1zM7V&Qp?NtoV#(?BDp@^z230{lS*rV)TiDC8q=&&7ECfYKZ%`srU ziCUU@(-VnBjCkeZF$Y^dXYte&c=ab5T zhcU~?rn(e%RP*4*%M(ZFhoJ>z zr@|nNX`c(%vWvgkc4KqS5x8^N-8!Iwo|LS z>RlM4YKY${lDrIos}M7a*5q4y(Ica#3>a!mK1{mroqm~@@78yRfWb3*G~n6d8!_^= z>UoQR*-8I^DQ!6@Qr&3|Rs|MeM{?RZZP#*)#p=9a&7y~q{;%^9f9Jj6*hlJDnaMpV zf+DAnDV?M@nl6_?RV=WNALD+fzWjF~P(cD9QGxx9`Zp_2Xe>~UL~&PU;;3)0km_AV z1u@8Gr1N9I{2{(z(pk<8?wQnal#A&%d|>sE=Q{+G`x=8Ozw{`D@)?7EUjs+AoR?8J zuBm(+S5D2-^~hKuVO}cV3BK5XUfyjQd@*)DzYmo5Uz<1?SG?VK2^||PV^gReJ>$H0 zTCIsRplYT7kt<7{+N~W*Zarrl4%CwCOB75#!ahNknnI;2k3aeie!=Xj7n5tMm$Jfo&oauadZ8CydAB4+>l@jNKyVr ziYB^ABwfkYm0w%m!f!9uG{LnmoYQ*!g%dI;H<+iI$1-f9H4~OwqLLxWazDUhzAM21 zOBV7}^3zmlLjQxt4>%V+`P6|;$+$9oqF$G324uhL+P&JxZ}Yv$Y^~NVaLXc|;rp)_ z9c)Ei)rt3;3|(`bUTVzw>^{h3VbvGR)ZezL{S|?RlaW4^2|poLM8=t;#Elv}si^~Zom;oL2ibul^ffRS{8!J- z6}~(Xjk=dYQYtjfqTr{(pacMURT_kji8+(F)Y0Yjc?{tH-~m+&WMIpusLKYmsH*Eq zG5Lno!ub*;ZEr_o@%g_);a#tx0?{}~vYW_;Kp|~qfSet5dN#h%j1Z`cIH5S6m!k=k zN*kv#gAYo@ktsJwYBVXMLT^4QG1=qcitT4Vr*bHq4dUekD>RJgjaoW|q^JF4>3pNC z%r%8lbaiQDKpzYyPG*oMVv8U8xT>c*q%cS{7i$Q&;|9=aRC1#E_3}1wT<#&C^HrpI z473BaE8HZiIOi3iscCTj_V1SFeC_^LynKt%>Eb`?%+tir>)PPnhjvX$kgnecB_^xO z{p$vQKA2Z2@e;i8_I*}VSb-Vyt)!@Jk;g?@KwKjqS?Lfxee zf4#HJ%r@ip!C$x&h}G~CVJB{ROc#FKsFp)}<=diD-&6F@C1!i8{+_YRKIemnx2@XWvG)5OkR#_Ct|1oyDK~ zyG!vfH&Oz*D|x^7(#wwS_}L=NF-ghO7gJmXdgCL=2fDep(rj`s3Ver~8Ab2}?#>ur zYTZ$g$b;b}80WYK|Lf#av>N@(oPvQN6DOXSU=Vok*1+`=q!j+O2cgR>op*bo&p{ZV zg5&|WW9+b%BV~DS8IeI($CqEOkKT@bD)M408Io#tcGS7MX`K!^Qo+$rjHm2%sA93^ z*1eSsI$HV0e5fsZ8KU&+N)N>J$U(N~+gX1|8S{-$VekERP|V~FccLu8m(o_|AD@oT zcuQ(XPUHvFpI%pjhD}-IZNk}m*x|SrO*HKE+(nfa63T#k%%9BeL?tQ0- zfYaZYZLc^|L6k9RDYw!TPD)7Lph2KguO%va`%*w4kr~S&&1JjJ&yx8(G~{YW6@A^4 zx7;Oia~zwIHWbMPqC$m+(@eBXvh-WYvbEoJhgdTe+0H zDj!1`9<+Cmx8qa~@VUni!7XvPdp-Vj8|!Edd%0#|Z@`I`3t@0u^j>NPxD5qv=J#O2 zw?<_og+?6q+4q(rNrbZZs7IrQ;O+Z`KHx%+!0kPS?b6`L2H;(t%DrURF|i!{jJWOz zgy?@j53A@!qiVf}(!Tru1vio{hK5TbLUunR$i87isKMVilnVD6*U(EEsehbGuWjlmI9!mrzK)b5f z1+{}WcA?;$_|boA?$0Y=p6X``+a>rk+-8ed)=x$n-9SACsGS96PaTEy@+kUjAbH4Q z6K)!bwgU~m_Cli4J@n*zJqso?;JG-%%cuKhc=hEzT!NZr+-78H)|ky0>W{_a=-M>H zML!g66|38ClCm5v{!G1_N{J4&uACvw@;SL4DY^NAEp+Y4TgkYxj%O3}otXH`5Anod z-Cvh{oC6NNnh-L%Mao;6US;`xAQ41X{aJC9G`ESugx{)8*vcqLpRm3^P9UO7>$hU5%>86Z4&qBx&EU^?Kp$ z5c;Fn&lAoR$I>q#y_IZo3*awry*Uc<#txojh}8tHW5Ss%=*g0&HGVQ8sgO-Fh~-yO zM~a@ulhX0M&6HnG+IVZEX#jhcWTDP3L&C>N{OBmCn4(I@+?#}RU%GjJap3*!RDQr^rQi`0sdLSR z)2~4u_fg3@tctGG)$MO}A&V0-ryeXac~4S*`l8BM;PC#{dm`i>iVc5AT3eS*Pb-F7 z=o8Vaxo%I%mZdJYgT+HA&8spU-?A_x0m3(+`D96e5P&s1-G%UE~OQu5amV zmwfSIgrD8Vpw|_ryA_#rBq@ zCOMj05zn*~r`}vFz3@D97MvqB4(pZ`E1+wTzhxv?X3F1lXQ#boiDYhBvbzq+>0T-q zWPVo&^Y)V%1+n+LjLJP^o_L-WbuIf=p!~cU^-fmT?E*Pc3?;U_qKA) zJ_OuC_j5c15~Hs;RDr+I3Y^^B|Gzx_=}!P4faQ<6QT(4Og$A;-pzAnEfz{|9&WAYD ggy>^JYBY$87ifwW=d#BC_s)RM;*ux8vi*(t4}Vdgod5s; delta 4533 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 TFMtcO!;_pQK?cMk00000l4qm&p5 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 delta 3615 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 diff --git a/tmpl/excel_temp/recharge_statistics_ours_product.xlsx b/tmpl/excel_temp/recharge_statistics_ours_product.xlsx index 347e88684725c83f1e414ce5681787d3a4636766..8294b55c1ec333246ac2e62f22330931b0516048 100755 GIT binary patch delta 4584 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 delta 4607 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 c0RZ-YOn>9QzD82a1SuybLy&