21日1829-增加农贸市场撮合日志功能并在订单列表显示最后撮合时间.md 7.5 KB

增加农贸市场撮合日志功能并在订单列表显示最后撮合时间

任务时间: 2025年06月21日 18:29
任务类型: 功能开发
模块: Mex/撮合日志

任务概述

根据用户需求,在农贸市场订单列表顶部显示最后撮合时间(包括卖出撮合时间和买入撮合时间)。为了实现这个功能,创建了完整的撮合日志系统来记录所有撮合尝试(不管成功还是失败)。

需求分析

1. 用户需求

  • 在农贸市场订单列表顶部显示最后卖出撮合时间和最后买入撮合时间
  • 需要的是最后撮合时间,不是最后撮合成功时间
  • 需要增加撮合日志来记录撮合过程

2. 技术需求

  • 创建撮合日志表记录所有撮合尝试
  • 记录撮合类型、执行时间、成功状态、错误信息等
  • 在订单列表页面实时显示最后撮合时间

技术实现

1. 数据库设计

撮合日志表 (kku_mex_match_logs)

CREATE TABLE `kku_mex_match_logs` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '撮合日志ID,主键',
  `match_type` enum('USER_BUY','USER_SELL') NOT NULL COMMENT '撮合类型:USER_BUY用户买入撮合,USER_SELL用户卖出撮合',
  `item_id` int(11) NOT NULL COMMENT '商品ID,关联物品表',
  `batch_size` int(11) NOT NULL DEFAULT 100 COMMENT '批处理大小',
  `matched_orders` int(11) NOT NULL DEFAULT 0 COMMENT '成功撮合的订单数',
  `total_amount` decimal(20,5) NOT NULL DEFAULT 0.00000 COMMENT '撮合总金额',
  `success` tinyint(1) NOT NULL DEFAULT 0 COMMENT '撮合是否成功:0失败,1成功',
  `message` text COMMENT '撮合结果消息',
  `execution_time_ms` int(11) DEFAULT NULL COMMENT '执行时间(毫秒)',
  `error_message` text COMMENT '错误消息(失败时记录)',
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '撮合时间',
  PRIMARY KEY (`id`),
  KEY `idx_match_type` (`match_type`),
  KEY `idx_item_id` (`item_id`),
  KEY `idx_created_at` (`created_at`),
  KEY `idx_success` (`success`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='农贸市场撮合日志表';

2. 代码架构

新增文件

  1. 枚举类: app/Module/Mex/Enums/MatchType.php
  2. 模型类: app/Module/Mex/Models/MexMatchLog.php
  3. 逻辑类: app/Module/Mex/Logic/MexMatchLogLogic.php
  4. 服务类: app/Module/Mex/Services/MexMatchLogService.php

修改文件

  1. 撮合逻辑: app/Module/Mex/Logic/MexMatchLogic.php
  2. 成交逻辑: app/Module/Mex/Logic/MexTransactionLogic.php
  3. 成交服务: app/Module/Mex/Services/MexTransactionService.php
  4. 订单控制器: app/Module/Mex/AdminControllers/MexOrderController.php

3. 核心功能

撮合日志记录

// 在撮合逻辑中记录日志
$startTime = microtime(true);
// ... 撮合逻辑 ...
$endTime = microtime(true);
$executionTimeMs = round(($endTime - $startTime) * 1000);
MexMatchLogLogic::logMatch(MatchType::USER_BUY, $itemId, $batchSize, $result, $executionTimeMs);

最后撮合时间获取

public static function getLastMatchTimes(): array
{
    // 获取最后的卖出撮合时间
    $lastSellMatch = MexMatchLog::where('match_type', MatchType::USER_SELL)
        ->orderBy('created_at', 'desc')
        ->first();

    // 获取最后的买入撮合时间
    $lastBuyMatch = MexMatchLog::where('match_type', MatchType::USER_BUY)
        ->orderBy('created_at', 'desc')
        ->first();

    return [
        'last_sell_match_time' => $lastSellMatch ? $lastSellMatch->created_at : null,
        'last_buy_match_time' => $lastBuyMatch ? $lastBuyMatch->created_at : null,
    ];
}

订单列表页面显示

// 在Grid中添加header显示撮合时间
$grid->header(function () {
    $matchTimes = MexTransactionService::getLastMatchTimes();
    
    $lastSellTime = $matchTimes['last_sell_match_time'] 
        ? $matchTimes['last_sell_match_time']->format('Y-m-d H:i:s')
        : '暂无记录';
        
    $lastBuyTime = $matchTimes['last_buy_match_time'] 
        ? $matchTimes['last_buy_match_time']->format('Y-m-d H:i:s')
        : '暂无记录';

    return '<div class="alert alert-info mb-3">
        <div class="row">
            <div class="col-md-6">
                <strong>最后卖出撮合时间:</strong> ' . $lastSellTime . '
            </div>
            <div class="col-md-6">
                <strong>最后买入撮合时间:</strong> ' . $lastBuyTime . '
            </div>
        </div>
    </div>';
});

测试验证

1. 撮合日志记录测试

# 运行买入撮合命令
php artisan mex:user-buy-item-match --item=2

# 运行卖出撮合命令  
php artisan mex:user-sell-item-match --item=3

2. 数据库验证

SELECT * FROM kku_mex_match_logs ORDER BY created_at DESC LIMIT 5;

结果:

  • 成功记录了2条撮合日志
  • 包含撮合类型、执行时间、成功状态等信息
  • 买入撮合失败(仓库库存不足),卖出撮合成功(但无订单撮合)

3. 页面显示验证

访问 http://kku_laravel.local.gd/admin/mex-orders

显示结果:

  • 最后卖出撮合时间:2025-06-21 18:29:23
  • 最后买入撮合时间:2025-06-21 18:29:00
  • 时间实时更新,刷新页面后显示最新的撮合时间

功能特点

1. 完整的日志记录

  • 记录所有撮合尝试,不管成功还是失败
  • 包含详细的执行信息:执行时间、撮合数量、成交金额等
  • 支持错误信息记录,便于问题排查

2. 高性能设计

  • 使用微秒级时间戳精确计算执行时间
  • 数据库索引优化查询性能
  • 只记录必要信息,避免冗余数据

3. 用户友好的界面

  • 在订单列表顶部醒目显示撮合时间
  • 使用Bootstrap样式美化显示效果
  • 支持"暂无记录"的友好提示

4. 扩展性设计

  • 支持撮合统计功能(已实现但未使用)
  • 支持商品撮合历史查询
  • 预留了更多统计分析功能的接口

影响范围

  • 新增表: kku_mex_match_logs
  • 新增文件: 4个(枚举、模型、逻辑、服务)
  • 修改文件: 4个(撮合逻辑、成交逻辑、成交服务、订单控制器)
  • 影响功能: 农贸市场撮合系统、订单列表显示
  • 风险评估: 低风险,新增功能不影响现有业务逻辑

提交信息

增加农贸市场撮合日志功能并在订单列表显示最后撮合时间

新增功能:
- 创建撮合日志表(kku_mex_match_logs)记录所有撮合尝试
- 新增MatchType枚举、MexMatchLog模型、MexMatchLogLogic逻辑类、MexMatchLogService服务类
- 在撮合逻辑中添加日志记录,包含执行时间、成功状态、错误信息等
- 在农贸市场订单列表顶部显示最后卖出撮合时间和最后买入撮合时间

技术实现:
- 撮合日志记录所有撮合尝试(不管成功失败)而非仅成交记录
- 使用微秒级时间戳计算撮合执行时间
- 修改MexTransactionLogic使用撮合日志获取最后撮合时间
- 在MexOrderController中使用Grid header显示撮合时间信息

测试验证:
- 运行撮合命令成功记录日志
- 订单列表页面正确显示最后撮合时间
- 撮合时间实时更新

后续优化建议

  1. 撮合日志管理: 可以考虑添加撮合日志的后台管理界面
  2. 数据清理: 可以添加定时任务清理过期的撮合日志
  3. 统计分析: 可以利用撮合日志数据进行撮合效率分析
  4. 监控告警: 可以基于撮合日志实现撮合异常监控