任务时间: 2025年06月21日 18:29
任务类型: 功能开发
模块: Mex/撮合日志
根据用户需求,在农贸市场订单列表顶部显示最后撮合时间(包括卖出撮合时间和买入撮合时间)。为了实现这个功能,创建了完整的撮合日志系统来记录所有撮合尝试(不管成功还是失败)。
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='农贸市场撮合日志表';
app/Module/Mex/Enums/MatchType.phpapp/Module/Mex/Models/MexMatchLog.phpapp/Module/Mex/Logic/MexMatchLogLogic.phpapp/Module/Mex/Services/MexMatchLogService.phpapp/Module/Mex/Logic/MexMatchLogic.phpapp/Module/Mex/Logic/MexTransactionLogic.phpapp/Module/Mex/Services/MexTransactionService.phpapp/Module/Mex/AdminControllers/MexOrderController.php// 在撮合逻辑中记录日志
$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>';
});
# 运行买入撮合命令
php artisan mex:user-buy-item-match --item=2
# 运行卖出撮合命令
php artisan mex:user-sell-item-match --item=3
SELECT * FROM kku_mex_match_logs ORDER BY created_at DESC LIMIT 5;
结果:
访问 http://kku_laravel.local.gd/admin/mex-orders
显示结果:
kku_mex_match_logs增加农贸市场撮合日志功能并在订单列表显示最后撮合时间
新增功能:
- 创建撮合日志表(kku_mex_match_logs)记录所有撮合尝试
- 新增MatchType枚举、MexMatchLog模型、MexMatchLogLogic逻辑类、MexMatchLogService服务类
- 在撮合逻辑中添加日志记录,包含执行时间、成功状态、错误信息等
- 在农贸市场订单列表顶部显示最后卖出撮合时间和最后买入撮合时间
技术实现:
- 撮合日志记录所有撮合尝试(不管成功失败)而非仅成交记录
- 使用微秒级时间戳计算撮合执行时间
- 修改MexTransactionLogic使用撮合日志获取最后撮合时间
- 在MexOrderController中使用Grid header显示撮合时间信息
测试验证:
- 运行撮合命令成功记录日志
- 订单列表页面正确显示最后撮合时间
- 撮合时间实时更新