完成了基本调整调整

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
@@ -0,0 +1,162 @@
-- ============================================================
-- 企油通对接 · 退款 / 发票 / 司机管理
-- 生成:2026-09-14
-- ------------------------------------------------------------
-- 执行顺序:qyt_migration.sql -> _channel -> _enterprise -> _waybill_status -> 本文件
-- 本地库执行前请先确认上面四个已执行。
-- ============================================================
-- ------------------------------------------------------------
-- 1. 订单退款状态
-- refund_status:0 未退款 / 1 退款中 / 2 已退款 / 3 退款失败(可重新发起) / 4 待人工确认
-- 4 的含义:7.16 请求已发出但结果未知(超时/响应异常)。7.16 没有幂等键,
-- 这种情况绝不能自动重试,必须先确认上游到底扣没扣,否则可能重复调低额度。
-- ------------------------------------------------------------
ALTER TABLE `yoshop_partners_order`
ADD COLUMN `refund_status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '退款状态 0未退款 1退款中 2已退款 3退款失败 4待人工确认' AFTER `qyt_retry_num`,
ADD COLUMN `refund_amount` decimal(10,2) NOT NULL DEFAULT 0.00 COMMENT '已退款金额(元)' AFTER `refund_status`,
ADD COLUMN `refund_time` int(11) NOT NULL DEFAULT 0 COMMENT '退款成功时间' AFTER `refund_amount`,
ADD COLUMN `refund_text` varchar(255) NOT NULL DEFAULT '' COMMENT '退款结果说明' AFTER `refund_time`,
ADD INDEX `idx_refund_status` (`refund_status`),
ADD INDEX `idx_id_card` (`id_card`);
-- ------------------------------------------------------------
-- 2. 退款流水(每次发起一行,失败后重新发起会新增一行)
-- ------------------------------------------------------------
CREATE TABLE `yoshop_qyt_refund` (
`refund_id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`refund_no` varchar(64) NOT NULL DEFAULT '' COMMENT '退款单号(同时写入7.16 operation_reason,确认时据此在7.13流水里找)',
`order_id` int(11) NOT NULL DEFAULT 0 COMMENT 'yoshop_partners_order.order_id',
`partners_id` int(11) NOT NULL DEFAULT 0 COMMENT '合作商ID',
`qyt_enterprise_id` int(11) NOT NULL DEFAULT 0 COMMENT '企油通企业ID',
`source` varchar(10) NOT NULL DEFAULT '' COMMENT '发起来源 admin后台 / api下单平台',
`operator` varchar(64) NOT NULL DEFAULT '' COMMENT '操作人(后台账号 / 合作商appKey)',
`reason` varchar(200) NOT NULL DEFAULT '' COMMENT '退款原因',
`amount` decimal(10,2) NOT NULL DEFAULT 0.00 COMMENT '退款金额(元)',
`quota_id` varchar(32) NOT NULL DEFAULT '' COMMENT '被调低的凭证ID(7.17 quota_id)',
`total_before` decimal(10,2) NOT NULL DEFAULT 0.00 COMMENT '调额前凭证总额度(元)',
`available_before` decimal(10,2) NOT NULL DEFAULT 0.00 COMMENT '调额前凭证可用余额(元)',
`total_after` decimal(10,2) NOT NULL DEFAULT 0.00 COMMENT '确认时凭证总额度(元)',
`available_after` decimal(10,2) NOT NULL DEFAULT 0.00 COMMENT '确认时凭证可用余额(元)',
`status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '1处理中 2成功 3失败 4待人工确认',
`message` varchar(255) NOT NULL DEFAULT '' COMMENT '结果说明',
`response` text COMMENT '上游响应(已脱敏)',
`store_id` int(11) NOT NULL DEFAULT 0 COMMENT '商城ID',
`create_time` int(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
`update_time` int(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
PRIMARY KEY (`refund_id`),
UNIQUE KEY `uk_refund_no` (`refund_no`),
KEY `idx_order` (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='企油通退款流水(7.17查凭证+7.16调低额度)';
-- ------------------------------------------------------------
-- 3. 企业发票(7.14)
-- 7.14 的粒度是「企业 + 通道 + 月份(+ 司机手机号)」,返回的发票地址与订单
-- 之间没有对应关系,因此按这个维度存;订单按「企业 + 消费月份 + 司机」关联展示。
-- mobile 为空串表示该企业该月全量。
-- ------------------------------------------------------------
CREATE TABLE `yoshop_qyt_invoice` (
`invoice_id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`qyt_enterprise_id` int(11) NOT NULL DEFAULT 0 COMMENT '企油通企业ID',
`business_license` varchar(64) NOT NULL DEFAULT '' COMMENT '统一社会信用代码',
`passageway` varchar(20) NOT NULL DEFAULT '' COMMENT '通道 alipay/pingan',
`month` char(7) NOT NULL DEFAULT '' COMMENT '月份 YYYY-MM',
`mobile` varchar(20) NOT NULL DEFAULT '' COMMENT '司机手机号,空=企业全量',
`invoice_urls` text COMMENT '发票地址(JSON数组)',
`invoice_count` int(11) NOT NULL DEFAULT 0 COMMENT '发票数量',
`order_count` int(11) NOT NULL DEFAULT 0 COMMENT '该维度加油明细条数',
`raw` mediumtext COMMENT '7.14 原始返回(已脱敏)',
`sync_status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '同步状态 0未同步 1成功 2失败',
`sync_time` int(11) NOT NULL DEFAULT 0 COMMENT '最近同步时间',
`sync_text` varchar(255) NOT NULL DEFAULT '' COMMENT '最近同步说明',
`store_id` int(11) NOT NULL DEFAULT 0 COMMENT '商城ID',
`create_time` int(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
`update_time` int(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
PRIMARY KEY (`invoice_id`),
UNIQUE KEY `uk_invoice` (`qyt_enterprise_id`, `passageway`, `month`, `mobile`),
KEY `idx_month` (`month`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='企油通企业发票(7.14)';
-- ------------------------------------------------------------
-- 4. 司机档案
-- 按身份证号唯一。累计发放/退款/订单数不存冗余字段,查询时从订单实时汇总,避免对不上账。
-- conflict 用来提前发现会导致上游二要素核验失败的数据:
-- 同一身份证号出现不同姓名 / 同一手机号对应多个身份证号 / 手机号变更
-- ------------------------------------------------------------
CREATE TABLE `yoshop_qyt_driver` (
`driver_id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`id_card` varchar(32) NOT NULL DEFAULT '' COMMENT '身份证号',
`name` varchar(50) NOT NULL DEFAULT '' COMMENT '姓名(最近一次下单)',
`mobile` varchar(20) NOT NULL DEFAULT '' COMMENT '手机号(最近一次下单)',
`conflict` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否存在信息冲突',
`conflict_text` varchar(255) NOT NULL DEFAULT '' COMMENT '冲突说明',
`last_order_time` int(11) NOT NULL DEFAULT 0 COMMENT '最近下单时间',
`remark` varchar(255) NOT NULL DEFAULT '' COMMENT '备注',
`store_id` int(11) NOT NULL DEFAULT 0 COMMENT '商城ID',
`create_time` int(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
`update_time` int(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
PRIMARY KEY (`driver_id`),
UNIQUE KEY `uk_id_card` (`store_id`, `id_card`),
KEY `idx_mobile` (`mobile`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='企油通司机档案';
-- 4.1 用存量订单回填司机档案(姓名/手机号取最近一单)
INSERT IGNORE INTO `yoshop_qyt_driver` (`id_card`, `name`, `mobile`, `conflict`, `conflict_text`, `last_order_time`, `store_id`, `create_time`, `update_time`)
SELECT
UPPER(o.`id_card`),
SUBSTRING_INDEX(GROUP_CONCAT(o.`driver_name` ORDER BY o.`create_time` DESC SEPARATOR '\n'), '\n', 1),
SUBSTRING_INDEX(GROUP_CONCAT(o.`mobile` ORDER BY o.`create_time` DESC SEPARATOR '\n'), '\n', 1),
IF(COUNT(DISTINCT o.`driver_name`) > 1, 1, 0),
IF(COUNT(DISTINCT o.`driver_name`) > 1, '同一身份证号出现不同姓名(存量订单回填)', ''),
MAX(o.`create_time`),
o.`store_id`,
UNIX_TIMESTAMP(),
UNIX_TIMESTAMP()
FROM `yoshop_partners_order` o
WHERE o.`id_card` <> ''
GROUP BY o.`store_id`, UPPER(o.`id_card`);
-- 4.2 标记「同一手机号对应多个身份证号」
UPDATE `yoshop_qyt_driver` d
JOIN (
SELECT `store_id`, `mobile` FROM `yoshop_qyt_driver`
WHERE `mobile` <> '' GROUP BY `store_id`, `mobile` HAVING COUNT(*) > 1
) m ON m.`store_id` = d.`store_id` AND m.`mobile` = d.`mobile`
SET d.`conflict` = 1,
d.`conflict_text` = IF(d.`conflict_text` = '', '同一手机号对应多个身份证号', CONCAT(d.`conflict_text`, ';同一手机号对应多个身份证号'));
-- ------------------------------------------------------------
-- 5. 后台菜单(挂在「合作商管理」下;幂等,可重复执行)
-- 注意:部分环境的菜单表里根本没有「合作商管理」(/partners) 这条父级
-- (超管拥有全部路由,不依赖菜单表,所以之前一直没暴露),先补父级再挂子菜单,
-- 否则子查询取不到 menu_id,会报 #1048 Column 'parent_id' cannot be null。
-- ------------------------------------------------------------
INSERT INTO `yoshop_store_menu` (`module`, `name`, `path`, `action_mark`, `parent_id`, `sort`, `create_time`, `update_time`)
SELECT 10, '合作商管理', '/partners', '', 0, 100, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
FROM DUAL
WHERE NOT EXISTS (SELECT 1 FROM (SELECT 1 FROM `yoshop_store_menu` WHERE `path` = '/partners' LIMIT 1) x);
INSERT INTO `yoshop_store_menu` (`module`, `name`, `path`, `action_mark`, `parent_id`, `sort`, `create_time`, `update_time`)
SELECT 10, '司机管理', '/qyt/driver/index', '',
(SELECT `menu_id` FROM (SELECT `menu_id` FROM `yoshop_store_menu` WHERE `path` = '/partners' LIMIT 1) t),
100, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
FROM DUAL
WHERE NOT EXISTS (SELECT 1 FROM (SELECT 1 FROM `yoshop_store_menu` WHERE `path` = '/qyt/driver/index' LIMIT 1) x);
INSERT INTO `yoshop_store_menu` (`module`, `name`, `path`, `action_mark`, `parent_id`, `sort`, `create_time`, `update_time`)
SELECT 10, '发票管理', '/qyt/invoice/index', '',
(SELECT `menu_id` FROM (SELECT `menu_id` FROM `yoshop_store_menu` WHERE `path` = '/partners' LIMIT 1) t),
100, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
FROM DUAL
WHERE NOT EXISTS (SELECT 1 FROM (SELECT 1 FROM `yoshop_store_menu` WHERE `path` = '/qyt/invoice/index' LIMIT 1) x);
-- ============================================================
-- 回滚:
-- ALTER TABLE `yoshop_partners_order`
-- DROP COLUMN `refund_status`, DROP COLUMN `refund_amount`, DROP COLUMN `refund_time`, DROP COLUMN `refund_text`,
-- DROP INDEX `idx_refund_status`, DROP INDEX `idx_id_card`;
-- DROP TABLE `yoshop_qyt_refund`;
-- DROP TABLE `yoshop_qyt_invoice`;
-- DROP TABLE `yoshop_qyt_driver`;
-- DELETE FROM `yoshop_store_menu` WHERE `path` IN ('/qyt/driver/index', '/qyt/invoice/index');
-- ============================================================