From e245ab8d476362aa9360522736553799a8c24f47 Mon Sep 17 00:00:00 2001 From: danial Date: Mon, 9 Jun 2025 23:42:06 +0800 Subject: [PATCH] =?UTF-8?q?feat(order):=20=E4=BC=98=E5=8C=96=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91=E5=B9=B6=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E6=96=B0=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 更新 .gitignore 文件,添加日志和IDE相关目录 - 修改 config.yaml,更新提交URL和商户配置- 在 interfaces.go 中添加新方法并修改现有方法 - 优化 logger_adapter.go 中的日志记录功能 - 调整 main.go 中的定时任务间隔 - 在 order.go 中实现新的 FindRandomFailedOrders 方法 - 更新 order_service.go,添加 CSV 文件处理逻辑 - 新增 road.go 文件,实现 FindRoadByRoadUid 方法 - 修改 submit_order.go,更新订单提交逻辑 --- .idea/.gitignore | 8 ++++++ order/.gitignore | 3 +++ order/config.yaml | 17 +++++-------- order/internal/client/submit_order.go | 9 ++++--- order/internal/interfaces/interfaces.go | 10 +++++--- order/internal/repositories/order.go | 6 +++-- order/internal/repositories/road.go | 12 +++++++++ order/internal/services/order_service.go | 31 +++++++++++++++++------- order/internal/utils/logger_adapter.go | 2 +- order/main.go | 2 +- 10 files changed, 68 insertions(+), 32 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 order/internal/repositories/road.go diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/order/.gitignore b/order/.gitignore index e69de29..78ba35d 100644 --- a/order/.gitignore +++ b/order/.gitignore @@ -0,0 +1,3 @@ +/logs/* +/.vscode/ +/.idea/ \ No newline at end of file diff --git a/order/config.yaml b/order/config.yaml index c0833db..1ec3463 100644 --- a/order/config.yaml +++ b/order/config.yaml @@ -5,21 +5,16 @@ database: password: Woaizixkie!123 dbname: kami -submit_url: "http://127.0.0.1:8080/api/v1/submit" +submit_url: "https://gateway.kkknametrans.buzz" merchants: - - name: "商户1" - merchant_uid: "key1" - road_uid: "road1" - rate: 0.1 # 发送比例,10% - - id: "M002" - name: "商户2" - merchant_uid: "key2" - road_uid: "road2" - rate: 0.1 # 发送比例,10% + - name: "测试商户" + merchant_uid: "8888c9kit6bimggos5kk0c8g" + road_uid: "4444d10lepeqgjec73d5kcfg" + rate: 0.01 # 发送比例,10% schedule: - interval: 60 # 运行间隔(秒) + interval: 5 # 运行间隔(秒) logging: level: "info" diff --git a/order/internal/client/submit_order.go b/order/internal/client/submit_order.go index fdad840..411893d 100644 --- a/order/internal/client/submit_order.go +++ b/order/internal/client/submit_order.go @@ -22,7 +22,7 @@ func NewMockOrderSender(logger interfaces.Logger) interfaces.OrderSender { return &MockOrderSender{logger: logger} } -func (s *MockOrderSender) Send(ctx context.Context, order *model.OrderInfo, merchant *model.MerchantInfo, submitURL string) error { +func (s *MockOrderSender) Send(ctx context.Context, order *model.OrderInfo, merchant *model.MerchantInfo, roadInfo *model.RoadInfo, submitURL string) error { // 这里实现实际的订单发送逻辑 s.logger.Info("发送订单", "order_no", order.BankOrderID, @@ -33,10 +33,10 @@ func (s *MockOrderSender) Send(ctx context.Context, order *model.OrderInfo, merc NotifyUrl: "https://www.baidu.com", OrderPrice: strconv.FormatFloat(order.OrderAmount, 'f', -1, 64), OrderNo: order.BankOrderID, - ProductCode: order.PayProductCode, + ProductCode: roadInfo.ProductCode, ExValue: order.ExValue, Ip: "127.0.0.1", - PayKey: merchant.MerchantUID, + PayKey: merchant.MerchantKey, PaySecret: merchant.MerchantSecret, }, submitURL); err != nil { s.logger.Error("提交订单失败", "error", err) @@ -46,7 +46,8 @@ func (s *MockOrderSender) Send(ctx context.Context, order *model.OrderInfo, merc } func submitOrder(ctx context.Context, input *SubmitOrder, submitURL string) (*SubmitOrderResponse, error) { - req := httplib.NewBeegoRequestWithCtx(ctx, fmt.Sprintf("%s/gateway/scan", submitURL), "POST").SetTimeout(30*time.Second, 30*time.Second).Retries(3).RetryDelay(time.Second * 3) + req := httplib.NewBeegoRequestWithCtx(ctx, fmt.Sprintf("%s/gateway/scan", submitURL), "POST"). + SetTimeout(30*time.Second, 30*time.Second).Retries(3).RetryDelay(time.Second * 3) params := input.ToStrMap() params["sign"] = utils.GetMD5SignMF(params, input.PaySecret) diff --git a/order/internal/interfaces/interfaces.go b/order/internal/interfaces/interfaces.go index fd32cd8..9c08783 100644 --- a/order/internal/interfaces/interfaces.go +++ b/order/internal/interfaces/interfaces.go @@ -18,15 +18,17 @@ type OrderRepository interface { // FindOrderByBankOrderID 根据银行订单ID查询订单 FindOrderByBankOrderID(ctx context.Context, bankOrderID string) (model.OrderInfo, error) - // 寻找失败的订单 - FindRandomFailedOrders(ctx context.Context) (*model.OrderInfo, error) - // 寻找 merchant + // FindRandomFailedOrders 寻找失败的订单 + FindRandomFailedOrders(ctx context.Context, roadUid string) (*model.OrderInfo, error) + // FindMerchantByRoadID 寻找 merchant FindMerchantByRoadID(ctx context.Context, merchantUid string) (*model.MerchantInfo, error) + // FindRoadByRoadUid 根据 roadUid 查找对应的通道信息 + FindRoadByRoadUid(ctx context.Context, roadUid string) (*model.RoadInfo, error) } // OrderSender 订单发送接口 type OrderSender interface { - Send(ctx context.Context, order *model.OrderInfo, merchant *model.MerchantInfo, submitURL string) error + Send(ctx context.Context, order *model.OrderInfo, merchant *model.MerchantInfo, roadInfo *model.RoadInfo, submitURL string) error } // Logger 日志接口 diff --git a/order/internal/repositories/order.go b/order/internal/repositories/order.go index ead4576..5f14d45 100644 --- a/order/internal/repositories/order.go +++ b/order/internal/repositories/order.go @@ -48,8 +48,10 @@ func (r *OrderRepositoryImpl) FindOrdersByRoadIdAndAboveBankOrderId(ctx context. return orderInfo, nil } -func (r *OrderRepositoryImpl) FindRandomFailedOrders(ctx context.Context) (*model.OrderInfo, error) { - orderInfo, err := query.Use(r.db).OrderInfo.WithContext(ctx).Where(query.Use(r.db).OrderInfo.Status.Eq("failed")).Order(field.Func.Rand()).First() +func (r *OrderRepositoryImpl) FindRandomFailedOrders(ctx context.Context, roadUid string) (*model.OrderInfo, error) { + orderInfo, err := query.Use(r.db).OrderInfo.WithContext(ctx).Where(query.Use(r.db).OrderInfo.Status.Eq("fail"), + query.Use(r.db).OrderInfo.RoadUID.Eq(roadUid), + ).Order(field.Func.Rand()).First() if err != nil { return nil, err } diff --git a/order/internal/repositories/road.go b/order/internal/repositories/road.go new file mode 100644 index 0000000..84dff2e --- /dev/null +++ b/order/internal/repositories/road.go @@ -0,0 +1,12 @@ +package repositories + +import ( + "context" + "order/internal/model" + "order/internal/query" +) + +func (r *OrderRepositoryImpl) FindRoadByRoadUid(ctx context.Context, roadUid string) (*model.RoadInfo, error) { + roadInfo, err := query.Use(r.db).RoadInfo.WithContext(ctx).Where(query.Use(r.db).RoadInfo.RoadUID.Eq(roadUid)).Take() + return roadInfo, err +} diff --git a/order/internal/services/order_service.go b/order/internal/services/order_service.go index 6df3198..093a106 100644 --- a/order/internal/services/order_service.go +++ b/order/internal/services/order_service.go @@ -3,6 +3,7 @@ package services import ( "context" "encoding/csv" + "fmt" "os" "order/internal/config" @@ -37,6 +38,19 @@ func NewOrderService( // ProcessOrders 处理订单 func (s *OrderServiceImpl) ProcessOrders(ctx context.Context) error { + // 判断这个文件有没有,如果有,打开,没有就创建一个 + filePath := fmt.Sprintf("order.csv") + if _, err := os.Stat(filePath); os.IsNotExist(err) { + _, _ = os.Create(filePath) + } + // 从 csv 中读取最后一个匹配的 road_uid 和 bank_order_id + csvFile, err := os.OpenFile("order.csv", os.O_APPEND|os.O_CREATE|os.O_RDWR, 0644) + if err != nil { + s.logger.Error("打开文件失败", "error", err) + return err + } + defer csvFile.Close() + for _, merchant := range s.config.Merchants { s.logger.Info("开始处理商户", "merchant", merchant) merchantInfo, err := s.repo.FindMerchantByRoadID(ctx, merchant.MerchantUid) @@ -44,13 +58,12 @@ func (s *OrderServiceImpl) ProcessOrders(ctx context.Context) error { s.logger.Error("获取商户失败", "error", err) continue } - // 从 csv 中读取最后一个匹配的 road_uid 和 bank_order_id - csvFile, err := os.Open("order.csv") - if err != nil { - s.logger.Error("打开文件失败", "error", err) + roadInfo, err := s.repo.FindRoadByRoadUid(ctx, merchant.RoadUid) + if err != nil || pointer.IsNil(roadInfo) { + s.logger.Error("获取路经失败", "error", err) continue } - defer csvFile.Close() + csvReader := csv.NewReader(csvFile) // 读取所有数据 records, err := csvReader.ReadAll() @@ -74,22 +87,22 @@ func (s *OrderServiceImpl) ProcessOrders(ctx context.Context) error { // 判断有多少个订单 totalOrders := len(orders) needProcessCount := int(100 * merchant.Rate) - if totalOrders <= 100 || needProcessCount <= 0 { + if totalOrders <= 10 || needProcessCount <= 0 { continue } for range needProcessCount { - order, err := s.repo.FindRandomFailedOrders(ctx) + order, err := s.repo.FindRandomFailedOrders(ctx, merchant.RoadUid) if err != nil || pointer.IsNil(order) { s.logger.Error("获取订单失败", "error", err) continue } - if err := s.sender.Send(ctx, order, merchantInfo, s.config.SubmitURL); err != nil { + if err := s.sender.Send(ctx, order, merchantInfo, roadInfo, s.config.SubmitURL); err != nil { s.logger.Error("发送订单失败", "error", err) continue } } csvWriter := csv.NewWriter(csvFile) - if err := csvWriter.Write([]string{merchant.RoadUid, orders[len(orders)-1].BankOrderID}); err != nil { + if err = csvWriter.Write([]string{merchant.RoadUid, orders[len(orders)-1].BankOrderID}); err != nil { s.logger.Error("写入文件失败", "error", err) continue } diff --git a/order/internal/utils/logger_adapter.go b/order/internal/utils/logger_adapter.go index 194c87d..3520a22 100644 --- a/order/internal/utils/logger_adapter.go +++ b/order/internal/utils/logger_adapter.go @@ -22,7 +22,7 @@ func (l *ZapLoggerAdapter) Info(msg string, fields ...any) { } // Error 实现 Logger 接口 -func (l *ZapLoggerAdapter) Error(msg string, fields ...interface{}) { +func (l *ZapLoggerAdapter) Error(msg string, fields ...any) { l.logger.Error(msg, convertFields(fields)...) } diff --git a/order/main.go b/order/main.go index 134a44b..d0126a0 100644 --- a/order/main.go +++ b/order/main.go @@ -80,7 +80,7 @@ func main() { signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM) // 启动定时任务 - ticker := time.NewTicker(time.Duration(cfg.Schedule.Interval) / 12 * time.Second) + ticker := time.NewTicker(time.Duration(cfg.Schedule.Interval) * time.Second) defer ticker.Stop() go func() {