mirror of
https://git.oceanpay.cc/danial/kami_scripts.git
synced 2025-12-18 22:49:25 +00:00
- 更新 .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,更新订单提交逻辑
113 lines
3.1 KiB
Go
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
|
|
}
|