完成了基本调整调整

This commit is contained in:
2026-09-18 20:55:21 +08:00
parent 864187e105
commit 57e0854a0e
56 changed files with 3122 additions and 105 deletions
+84
View File
@@ -0,0 +1,84 @@
-- ============================================================
-- 企油通对接 · 一单多次加油(7.10 consume_amount 累计)
-- 生成:2026-09-15
-- ------------------------------------------------------------
-- 7.10 每条推送是一次加油,consume_amount = 本次占用运单金额(分)。
-- 一张订单可以分多次加油,因此:
-- · 订单累计已加油金额 used_amount / 次数 used_num
-- · 退款金额 = 订单金额 − 已加油金额(剩余未加油金额),不能超过它
-- · 每笔加油都通知下单平台(amount = 本次占用金额),逐笔记录是否已通知
--
-- 执行顺序:... -> qyt_migration_refund_invoice_driver.sql -> 本文件
-- ============================================================
-- ------------------------------------------------------------
-- 1. 订单:已加油金额 / 次数
-- use_status 语义不变:0 未加油 / 1 有加油记录(可能只加了一部分)
-- ------------------------------------------------------------
ALTER TABLE `yoshop_partners_order`
ADD COLUMN `used_amount` decimal(10,2) NOT NULL DEFAULT 0.00 COMMENT '已加油占用金额(元),7.10 consume_amount 累计' AFTER `use_status`,
ADD COLUMN `used_num` int(11) NOT NULL DEFAULT 0 COMMENT '加油次数' AFTER `used_amount`;
-- ------------------------------------------------------------
-- 2. 消费流水:去重键 + 逐笔通知状态
-- 原唯一键 (waybill_no_code, order_code) 有缺陷:文档里 order_code 是选填,
-- 不传时同一运单的第二笔加油会被当成重复推送丢掉,已加油金额就少记了。
-- 改为 (waybill_no_code, consume_key):有 order_code 用它,没有就用本笔消费特征字段的指纹。
-- ------------------------------------------------------------
ALTER TABLE `yoshop_qyt_consume`
ADD COLUMN `consume_key` varchar(64) NOT NULL DEFAULT '' COMMENT '去重键:order_code,缺失时为消费特征指纹(FP+md5)' AFTER `order_code`,
ADD COLUMN `notify_status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否已通知下单平台 0否 1是' AFTER `raw`,
ADD COLUMN `notify_time` int(11) NOT NULL DEFAULT 0 COMMENT '通知成功时间' AFTER `notify_status`,
ADD INDEX `idx_order_notify` (`order_id`, `notify_status`);
-- 2.1 回填去重键。指纹口径与 CallbackQueue 一致:
-- md5(quota_id|pay_time|consume_amount|pay_fee|station_code|litter),取值来自回调原文 raw
UPDATE `yoshop_qyt_consume`
SET `consume_key` = `order_code`
WHERE `consume_key` = '' AND `order_code` <> '';
UPDATE `yoshop_qyt_consume`
SET `consume_key` = CONCAT('FP', MD5(CONCAT_WS('|',
IFNULL(NULLIF(JSON_UNQUOTE(JSON_EXTRACT(`raw`, '$.quota_id')), 'null'), ''),
IFNULL(NULLIF(JSON_UNQUOTE(JSON_EXTRACT(`raw`, '$.pay_time')), 'null'), ''),
IFNULL(NULLIF(JSON_UNQUOTE(JSON_EXTRACT(`raw`, '$.consume_amount')), 'null'), ''),
IFNULL(NULLIF(JSON_UNQUOTE(JSON_EXTRACT(`raw`, '$.pay_fee')), 'null'), ''),
IFNULL(NULLIF(JSON_UNQUOTE(JSON_EXTRACT(`raw`, '$.station_code')), 'null'), ''),
IFNULL(NULLIF(JSON_UNQUOTE(JSON_EXTRACT(`raw`, '$.litter')), 'null'), '')
)))
WHERE `consume_key` = '' AND `raw` IS NOT NULL AND JSON_VALID(`raw`);
-- 2.2 兜底:原文不可解析的历史行用主键,保证唯一键能建起来
UPDATE `yoshop_qyt_consume` SET `consume_key` = CONCAT('ID', `id`) WHERE `consume_key` = '';
-- 2.3 更换唯一键
-- ⚠️ 执行前可先检查是否有冲突:
-- SELECT waybill_no_code, consume_key, COUNT(*) c FROM yoshop_qyt_consume GROUP BY waybill_no_code, consume_key HAVING c > 1;
ALTER TABLE `yoshop_qyt_consume`
DROP INDEX `uk_consume`,
ADD UNIQUE KEY `uk_consume` (`waybill_no_code`, `consume_key`);
-- ------------------------------------------------------------
-- 3. 回填订单已加油金额 / 次数
-- ------------------------------------------------------------
UPDATE `yoshop_partners_order` o
JOIN (
SELECT `order_id`, SUM(`consume_amount`) AS fen, COUNT(*) AS n
FROM `yoshop_qyt_consume` GROUP BY `order_id`
) c ON c.`order_id` = o.`order_id`
SET o.`used_amount` = ROUND(c.fen / 100, 2),
o.`used_num` = c.n;
-- 3.1 存量:订单已回调过加油结果的,其消费流水视为已通知,避免上线后被重推
UPDATE `yoshop_qyt_consume` c
JOIN `yoshop_partners_order` o ON o.`order_id` = c.`order_id`
SET c.`notify_status` = 1,
c.`notify_time` = o.`use_callback_time`
WHERE o.`use_callback` = 1;
-- ============================================================
-- 回滚:
-- ALTER TABLE `yoshop_qyt_consume` DROP INDEX `uk_consume`, ADD UNIQUE KEY `uk_consume` (`waybill_no_code`, `order_code`);
-- ALTER TABLE `yoshop_qyt_consume` DROP COLUMN `consume_key`, DROP COLUMN `notify_status`, DROP COLUMN `notify_time`, DROP INDEX `idx_order_notify`;
-- ALTER TABLE `yoshop_partners_order` DROP COLUMN `used_amount`, DROP COLUMN `used_num`;
-- ============================================================