fix: 优化负利润分析和缓存处理逻辑

This commit is contained in:
renzhiyuan 2026-01-19 16:45:21 +08:00
parent c4e2d30fc5
commit 6a58919e8e
5 changed files with 177 additions and 19 deletions

View File

@ -301,8 +301,8 @@ func (r *Handle) HandleBot(ctx context.Context, rec *entitys.Recognize, task *en
}
var detailPage string
entitys.ResLog(rec.Ch, task.Index, "需求记录完成")
switch task.OutPutFormat {
case entitys.OutPutFormatMarkdown:
switch rec.OutPutScene {
case entitys.OutPutSceneDingTalk:
// 构建跳转链接
detailPage = "[去查看](" + r.conf.Dingtalk.TableDemand.Url + ")"
default:

View File

@ -253,16 +253,17 @@ func (g *GroupConfigBiz) handleMatch(ctx context.Context, rec *entitys.Recognize
break
}
}
rec.OutPutScene = entitys.OutPutSceneDingTalk
if pointTask == nil || pointTask.Index == "other" {
return g.otherTask(ctx, rec)
}
switch constants.TaskType(pointTask.Type) {
case constants.TaskTypeFunc:
return g.handleTask(ctx, rec, pointTask)
case constants.TaskTypeBot:
return g.handle.HandleBot(ctx, rec, &entitys.Task{
Index: pointTask.Index,
OutPutFormat: entitys.OutPutFormatMarkdown,
})
case constants.TaskTypeReport:
return g.handleReport(ctx, rec, pointTask, groupConfig)

View File

@ -24,10 +24,4 @@ type DingTalkBot struct {
type Task struct {
Index string `json:"bot_index"`
OutPutFormat OutPutFormat `json:"out_put_format"`
}
type OutPutFormat string
const OutPutFormatMarkdown OutPutFormat = "markdown"
const OutPutFormatHtml OutPutFormat = "html"

View File

@ -14,8 +14,14 @@ type Recognize struct {
Ch chan Response
Match *Match
Ext []byte
OutPutScene OutPutScene
}
type OutPutScene string
const OutPutSceneDingTalk OutPutScene = "markdown"
const OutPutFormatHtml OutPutScene = "html"
type TaskExt struct {
Auth string `json:"auth"`
Session string `json:"session"`

View File

@ -11,6 +11,8 @@ import (
"context"
"encoding/json"
"fmt"
"strings"
"time"
"gitea.cdlsxd.cn/self-tools/l_request"
"github.com/ollama/ollama/api"
@ -77,14 +79,74 @@ type ZltxOrderDetailRequest struct {
OrderNumber interface{} `json:"order_number"`
}
//type ZltxOrderDetailResponse struct {
// Code int `json:"code"`
// Error string `json:"error"`
// Data ZltxOrderDetailData `json:"data"`
// Mes string `json:"mes"`
//}
// ZltxOrderDetailResponse 直连天下订单详情响应
type ZltxOrderDetailResponse struct {
Code int `json:"code"`
Data Data `json:"data"`
Error string `json:"error"`
Data ZltxOrderDetailData `json:"data"`
Mes string `json:"mes"`
}
type Data struct {
Direct *Direct `json:"direct"`
Order *Order `json:"order"`
}
type Direct struct {
SerialNumber string `json:"serialNumber"`
OrderOrderNumber string `json:"orderOrderNumber"`
TerminalAccount string `json:"terminalAccount"`
OursProductId int `json:"oursProductId"`
OursProductName string `json:"oursProductName"`
Status int `json:"status"`
TradePrice float64 `json:"tradePrice"`
PlatformProductId int `json:"platformProductId"`
PlatformProductName string `json:"platformProductName"`
PlatformId int `json:"platformId"`
PlatformName string `json:"platformName"`
PlatformPrice float64 `json:"platformPrice"`
CreateTime int `json:"createTime"`
ExecuteTime int `json:"executeTime"`
Type int `json:"type"`
Reason string `json:"reason"`
ResellerId int `json:"resellerId"`
ResellerName string `json:"resellerName"`
Aftermarket int `json:"aftermarket"`
PurchasePrice float64 `json:"purchasePrice"`
NeedAi bool `json:"needAi"`
AiReason string `json:"aiReason"`
}
type Order struct {
Id string `json:"id"`
ResellerId int `json:"resellerId"`
ResellerName string `json:"resellerName"`
Status int `json:"status"`
PayStatus int `json:"payStatus"`
CreateTime int `json:"createTime"`
PayTime int `json:"payTime"`
Type int `json:"type"`
Account string `json:"account"`
Quantity int `json:"quantity"`
Amount float64 `json:"amount"`
PayAmount float64 `json:"payAmount"`
ResellerOrderNumber string `json:"resellerOrderNumber"`
Price int `json:"price"`
NotifyTime int `json:"notifyTime"`
FinishTime int `json:"finishTime"`
Aftermarket int `json:"aftermarket"`
Remark string `json:"remark"`
OursProductId int `json:"oursProductId"`
OursProductName string `json:"oursProductName"`
OursProductPrice int `json:"oursProductPrice"`
TradePrice float64 `json:"tradePrice"`
}
type ZltxOrderLogResponse struct {
Code int `json:"code"`
Error string `json:"error"`
@ -171,12 +233,15 @@ func (w *ZltxOrderDetailTool) getZltxOrderDetail(ctx context.Context, rec *entit
if err = json.Unmarshal(res.Content, &resData); err != nil {
return
}
if rec.OutPutScene == entitys.OutPutSceneDingTalk {
entitys.ResJson(rec.Ch, w.Name(), resData.ToForm())
} else {
entitys.ResJson(rec.Ch, w.Name(), res.Text)
if resData.Data.Direct != nil {
entitys.ResLoading(rec.Ch, w.Name(), "正在分析订单日志")
}
if resData.Data.Direct != nil {
req = l_request.Request{
Url: fmt.Sprintf(w.config.Tools.ZltxOrderDetail.AddURL, resData.Data.Direct["orderOrderNumber"].(string), resData.Data.Direct["serialNumber"].(string)),
Url: fmt.Sprintf(w.config.Tools.ZltxOrderDetail.AddURL, resData.Data.Direct.OrderOrderNumber, resData.Data.Direct.SerialNumber),
Headers: map[string]string{
"Authorization": fmt.Sprintf("Bearer %s", token),
},
@ -230,3 +295,95 @@ func (w *ZltxOrderDetailTool) getZltxOrderDetail(ctx context.Context, rec *entit
}
return
}
func (z *ZltxOrderDetailResponse) ToForm() string {
var res strings.Builder
res.WriteString("**普通订单** \n")
res.WriteString("\n## 订单号:" + z.Data.Order.Id)
res.WriteString("\n## 分销商订单号:" + z.Data.Order.ResellerOrderNumber)
res.WriteString("\n## 分销商:" + z.Data.Order.ResellerName)
res.WriteString("\n## 订单商品:" + z.Data.Order.OursProductName)
res.WriteString("\n## 充值账号:" + z.Data.Order.Account)
res.WriteString("\n## 折扣价/原价:" + fmt.Sprintf("%.2f", z.Data.Order.TradePrice))
res.WriteString("\n## 数量:" + fmt.Sprintf("%d", z.Data.Order.Quantity))
res.WriteString("\n## 订单总额:" + fmt.Sprintf("%.2f", z.Data.Order.Amount))
res.WriteString("\n## 订单状态:" + orderStatusMap(z.Data.Order.Status))
res.WriteString("\n## 支付状态:" + orderPayStatusMap(z.Data.Order.Status))
res.WriteString("\n## 创建时间:" + unixToDateFormat(z.Data.Order.CreateTime))
res.WriteString("\n## 完成时间:" + unixToDateFormat(z.Data.Order.FinishTime))
res.WriteString("\n---\n")
res.WriteString("\n**充值流水** \n")
res.WriteString("\n## 订单号:" + z.Data.Direct.OrderOrderNumber)
res.WriteString("\n## 流水号:" + z.Data.Direct.SerialNumber)
res.WriteString("\n## 商品:" + z.Data.Direct.OursProductName)
res.WriteString("\n## 使用接口:" + z.Data.Direct.PlatformName)
res.WriteString("\n## 接口商品名称:" + z.Data.Direct.PlatformProductName)
res.WriteString("\n## 上游价:" + fmt.Sprintf("%.2f", z.Data.Direct.PlatformPrice))
res.WriteString("\n## 下游价:" + fmt.Sprintf("%.2f", z.Data.Direct.TradePrice))
res.WriteString("\n## 上游采购价:" + fmt.Sprintf("%.2f", z.Data.Direct.PurchasePrice))
res.WriteString("\n## 充值账号:" + z.Data.Direct.TerminalAccount)
res.WriteString("\n## 创建时间:" + unixToDateFormat(z.Data.Direct.CreateTime))
res.WriteString("\n## 处理时间:" + unixToDateFormat(z.Data.Direct.ExecuteTime))
res.WriteString("\n## 状态:" + directStatusMap(z.Data.Direct.Status))
res.WriteString("\n")
res.WriteString("\n")
res.WriteString("\n")
return res.String()
}
func orderStatusMap(status int) string {
var OrderStatus = map[int]string{
0: "下单中",
1: "订单完成",
2: "部分成功",
3: "充值处理中",
4: "已暂停",
-1: "关闭订单",
-2: "全部失败",
}
if _, ok := OrderStatus[status]; !ok {
return "未知"
}
return OrderStatus[status]
}
func unixToDateFormat(unix int) string {
return time.Unix(int64(unix), 0).Format("2006-01-02 15:04:05")
}
func orderPayStatusMap(status int) string {
var OrderPayStatus = map[int]string{
0: "未支付",
1: "支付中",
2: "支付成功",
3: "退款中",
4: "全部退款",
5: "部分退款",
-1: "支付失败",
-2: "退款失败",
}
if _, ok := OrderPayStatus[status]; !ok {
return "未知"
}
return OrderPayStatus[status]
}
func directStatusMap(status int) string {
var DirectStatus = map[int]string{
0: "待充值",
1: "充值成功",
2: "充值中",
-1: "充值失败",
-2: "失败重试",
-98: "下单异常",
-99: "查询异常",
-6: "手动失败",
-5: "手动重试",
-4: "叠加卡单",
-3: "卡单",
}
if _, ok := DirectStatus[status]; !ok {
return "未知"
}
return DirectStatus[status]
}