Files
kami_scripts/order/internal/services/order_service.go
danial e245ab8d47 feat(order): 优化订单处理逻辑并添加新功能
- 更新 .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,更新订单提交逻辑
2025-06-09 23:42:06 +08:00

113 lines
3.1 KiB
Go

package services
import (
"context"
"encoding/csv"
"fmt"
"os"
"order/internal/config"
"order/internal/interfaces"
"github.com/duke-git/lancet/v2/pointer"
"github.com/duke-git/lancet/v2/slice"
)
// OrderServiceImpl 订单服务实现
type OrderServiceImpl struct {
repo interfaces.OrderRepository
sender interfaces.OrderSender
logger interfaces.Logger
config *config.Config
}
// NewOrderService 创建订单服务实例
func NewOrderService(
repo interfaces.OrderRepository,
sender interfaces.OrderSender,
logger interfaces.Logger,
config *config.Config,
) interfaces.OrderService {
return &OrderServiceImpl{
repo: repo,
sender: sender,
logger: logger,
config: config,
}
}
// 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)
if err != nil || pointer.IsNil(merchantInfo) {
s.logger.Error("获取商户失败", "error", err)
continue
}
roadInfo, err := s.repo.FindRoadByRoadUid(ctx, merchant.RoadUid)
if err != nil || pointer.IsNil(roadInfo) {
s.logger.Error("获取路经失败", "error", err)
continue
}
csvReader := csv.NewReader(csvFile)
// 读取所有数据
records, err := csvReader.ReadAll()
if err != nil {
s.logger.Error("读取文件失败", "error", err)
continue
}
// 筛选符合条件的数据
filteredRecords := slice.Filter(records, func(_ int, record []string) bool {
return record[0] == merchant.RoadUid
})
bankOrderId := ""
if len(filteredRecords) > 0 {
bankOrderId = filteredRecords[len(filteredRecords)-1][1]
}
orders, err := s.repo.FindOrdersByRoadIdAndAboveBankOrderId(ctx, merchant.RoadUid, bankOrderId)
if err != nil {
s.logger.Error("获取订单失败", "error", err)
continue
}
// 判断有多少个订单
totalOrders := len(orders)
needProcessCount := int(100 * merchant.Rate)
if totalOrders <= 10 || needProcessCount <= 0 {
continue
}
for range needProcessCount {
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, 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 {
s.logger.Error("写入文件失败", "error", err)
continue
}
csvWriter.Flush()
}
return nil
}