Merge branch 'feature/payment-apply-bfi-sync' into feature/hcs-api-p0

# Conflicts:
#	blade-service/blade-transport/src/main/java/org/springblade/transport/mk/MkProcessBizHandlers.java
#	blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ContractManageServiceImpl.java
#	blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/InvoiceApplicationServiceImpl.java
#	blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/InvoiceReceiptServiceImpl.java
#	blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/PaymentApplicationServiceImpl.java
#	blade-service/blade-transport/src/main/java/org/springblade/transport/task/CustomerKingdeeSyncTask.java
#	blade-service/blade-transport/src/main/java/org/springblade/transport/task/PaymentKingdeeResultTask.java
#	doc/nacos/blade.yaml
#	doc/nacos/third-party-api.yaml
This commit is contained in:
刘泉佳
2026-10-15 04:07:13 +08:00
556 changed files with 35208 additions and 6751 deletions
@@ -2442,7 +2442,7 @@ CREATE TABLE "blade_railway_station" (
"id" int8 NOT NULL,
"code" varchar(20) NOT NULL,
"tmis_code" varchar(5) NOT NULL,
"telegraph_code" varchar(3) NOT NULL,
"telegraph_code" varchar(3) NULL,
"name" varchar(100) NOT NULL,
"railway_line" varchar(100),
"province_code" varchar(12),
+5 -3
View File
@@ -303,6 +303,8 @@ CREATE TABLE `blade_dept` (
`dept_name` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '部门名',
`full_name` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '部门全称',
`dept_code` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '组织编码',
`kingdee_dept_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '金蝶部门代码',
`contract_code_prefix` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '合同编码前缀',
`short_name` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '组织简称',
`pinyin_mnemonic` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '拼音助记码',
`mnemonic_code` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '助记码',
@@ -1259,11 +1261,11 @@ CREATE TABLE `blade_user` (
`real_name` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '真名',
`avatar` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '头像',
`email` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '邮箱',
`phone` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '手机',
`phone` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '手机',
`birthday` datetime NULL DEFAULT NULL COMMENT '生日',
`sex` int NULL DEFAULT NULL COMMENT '性别',
`role_id` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '角色id',
`dept_id` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '部门id',
`dept_id` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '部门id',
`post_id` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '岗位id',
`leader_id` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '主管id',
`is_leader` int NULL DEFAULT 0 COMMENT '是否主管',
@@ -1549,7 +1551,7 @@ CREATE TABLE `blade_railway_station` (
`id` bigint NOT NULL COMMENT '主键',
`code` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '编码',
`tmis_code` varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'TMIS国标编码',
`telegraph_code` varchar(3) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '电报码',
`telegraph_code` varchar(3) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '电报码',
`name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '车站名称',
`railway_line` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '所属铁路线路',
`province_code` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '所属省份编码',
@@ -2442,7 +2442,7 @@ CREATE TABLE "blade_railway_station" (
"id" int8 NOT NULL,
"code" varchar(20) NOT NULL,
"tmis_code" varchar(5) NOT NULL,
"telegraph_code" varchar(3) NOT NULL,
"telegraph_code" varchar(3) NULL,
"name" varchar(100) NOT NULL,
"railway_line" varchar(100),
"province_code" varchar(12),
@@ -7592,7 +7592,7 @@ CREATE TABLE [dbo].[blade_railway_station] (
[id] bigint NOT NULL,
[code] nvarchar(20) NOT NULL,
[tmis_code] nvarchar(5) NOT NULL,
[telegraph_code] nvarchar(3) NOT NULL,
[telegraph_code] nvarchar(3) NULL,
[name] nvarchar(100) NOT NULL,
[railway_line] nvarchar(100) NULL,
[province_code] nvarchar(12) NULL,
@@ -0,0 +1,43 @@
-- MK 业务ID与表单实例ID绑定
CREATE TABLE IF NOT EXISTS `blade_mk_form_bind`
(
`id` bigint NOT NULL COMMENT '主键',
`tenant_id` varchar(12) DEFAULT '000000' COMMENT '租户ID',
`biz_type` varchar(64) NOT NULL DEFAULT '' COMMENT '业务类型',
`biz_id` bigint NOT NULL COMMENT '业务主键',
`form_instance_id` bigint NOT NULL COMMENT 'MK表单实例id',
`process_instance_id` varchar(64) DEFAULT NULL COMMENT 'MK流程实例id',
`is_current` tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否当前生效(1是0否)',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_blade_mk_form_bind_form_instance_id` (`form_instance_id`) USING BTREE,
KEY `idx_blade_mk_form_bind_biz_current` (`biz_type`, `biz_id`, `is_current`) USING BTREE
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4
COLLATE = utf8mb4_general_ci COMMENT ='MK表单实例绑定表';
-- 业务流程表增加表单实例id
ALTER TABLE `blade_business_process`
ADD COLUMN `form_instance_id` bigint DEFAULT NULL COMMENT 'MK表单实例id' AFTER `biz_id`;
-- 历史数据:原 biz_id 即 formInstanceId,回填并写入绑定表
UPDATE `blade_business_process`
SET `form_instance_id` = `biz_id`
WHERE `form_instance_id` IS NULL;
INSERT INTO `blade_mk_form_bind` (`id`, `tenant_id`, `biz_type`, `biz_id`, `form_instance_id`,
`process_instance_id`, `is_current`, `create_time`, `update_time`)
SELECT `id`,
IFNULL(`tenant_id`, '000000'),
'',
`biz_id`,
`biz_id`,
`process_instance_id`,
1,
IFNULL(`create_time`, NOW()),
IFNULL(`update_time`, NOW())
FROM `blade_business_process` bp
WHERE NOT EXISTS (SELECT 1
FROM `blade_mk_form_bind` b
WHERE b.`form_instance_id` = bp.`biz_id`);
@@ -0,0 +1,3 @@
-- 合同管理新增申请日期:正式合同提交时写入当天日期
ALTER TABLE `blade_contract_manage`
ADD COLUMN `apply_date` date DEFAULT NULL COMMENT '申请日期(提交正式合同时写入)' AFTER `sign_date`;
@@ -0,0 +1,3 @@
-- 合同管理新增合同主要内容(非必填,最多1000字)
ALTER TABLE `blade_contract_manage`
ADD COLUMN `main_content` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '合同主要内容' AFTER `terminate_reason`;
@@ -0,0 +1,3 @@
-- 组织机构新增合同编码前缀:合同编号 = 前缀(年份)三位流水号,流水按部门独立
ALTER TABLE `blade_dept`
ADD COLUMN `contract_code_prefix` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '合同编码前缀' AFTER `kingdee_dept_code`;
@@ -0,0 +1,4 @@
-- 机构表:新增「金蝶部门代码」字段,非必填
ALTER TABLE `blade_dept`
ADD COLUMN `kingdee_dept_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '金蝶部门代码' AFTER `dept_code`;
@@ -0,0 +1,4 @@
-- 机构表:记录 OA 的 modified(上次更新时间),用于增量同步比对
ALTER TABLE `blade_dept`
ADD COLUMN `oa_modified` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'OA上次更新时间(modified)' AFTER `oa_sup_sub_com_id`;
@@ -0,0 +1,9 @@
-- 合同附件类型字典:合同文件 → 用印材料
-- 业务字典 code = contract_attachment_type
UPDATE blade_dict_biz
SET dict_key = '用印材料',
dict_value = '用印材料'
WHERE code = 'contract_attachment_type'
AND is_deleted = 0
AND (dict_key = '合同文件' OR dict_value = '合同文件');
@@ -12,6 +12,8 @@ CREATE TABLE IF NOT EXISTS `blade_exception_disposal` (
`is_deleted` int(11) DEFAULT '0' COMMENT '是否已删除',
`waybill_id` bigint(20) DEFAULT NULL COMMENT '运单ID',
`waybill_no` varchar(100) DEFAULT NULL COMMENT '运单号',
`node_code` varchar(64) DEFAULT NULL COMMENT '过程节点 key(为空表示未指明节点)',
`node_name` varchar(64) DEFAULT NULL COMMENT '过程节点名称(上报时复制,此后不随过程配置变化)',
`loading_or_master_no` varchar(100) DEFAULT NULL COMMENT '配载单号/总单号',
`project_id` bigint(20) DEFAULT NULL COMMENT '项目ID',
`project_name` varchar(100) DEFAULT NULL COMMENT '项目',
@@ -34,7 +36,7 @@ CREATE TABLE IF NOT EXISTS `blade_exception_disposal` (
KEY `idx_exception_disposal_status` (`disposal_status`) USING BTREE,
KEY `idx_exception_disposal_report_time` (`report_time`) USING BTREE,
KEY `idx_exception_disposal_create_time` (`create_time`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='异常处置';
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='异常处置';
CREATE TABLE IF NOT EXISTS `blade_exception_disposal_follow_record` (
`id` bigint(20) NOT NULL COMMENT '主键',
@@ -48,13 +50,14 @@ CREATE TABLE IF NOT EXISTS `blade_exception_disposal_follow_record` (
`is_deleted` int(11) DEFAULT '0' COMMENT '是否已删除',
`disposal_id` bigint(20) NOT NULL COMMENT '异常处置ID',
`follow_content` varchar(500) NOT NULL COMMENT '跟进说明',
`attachments_json` text DEFAULT NULL COMMENT '附件JSON',
`follow_user` bigint(20) DEFAULT NULL COMMENT '跟进人',
`follow_user_name` varchar(100) DEFAULT NULL COMMENT '跟进人姓名',
`follow_time` datetime DEFAULT NULL COMMENT '跟进时间',
PRIMARY KEY (`id`) USING BTREE,
KEY `idx_exception_follow_disposal` (`disposal_id`) USING BTREE,
KEY `idx_exception_follow_time` (`follow_time`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='异常处置跟进记录';
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='异常处置跟进记录';
INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`)
VALUES
@@ -0,0 +1,33 @@
-- 异常处置新增编辑权限码
-- 日期:2026-10-10
INSERT INTO `blade_menu`
(`id`,`parent_id`,`code`,`name`,`alias`,`path`,`source`,`sort`,`category`,`action`,`is_open`,`component`,`remark`,`is_deleted`)
VALUES
(2090000000000002006,2090000000000002001,'exception_disposal_edit','编辑','exception_disposal_edit','','',5,2,0,1,NULL,'',0)
ON DUPLICATE KEY UPDATE
`parent_id`=VALUES(`parent_id`),
`name`=VALUES(`name`),
`path`=VALUES(`path`),
`sort`=VALUES(`sort`),
`is_deleted`=0;
-- 授权给超级管理员角色。
-- 不能按「持有 exception_disposal 菜单的角色」批量授权:司机角色同样持有该菜单,
-- 会被一并授予编辑权——而编辑是运管员才有的操作。
-- 注意:运管角色当前并未持有 exception_disposal 菜单,故此处不涉及它;
-- 若日后把异常处置开放给运管,需另行授予本编辑码。
INSERT INTO `blade_role_menu` (`id`, `menu_id`, `role_id`)
SELECT 2090000000000002006 + (r.`id` % 1000), 2090000000000002006, r.`id`
FROM `blade_role` r
WHERE r.`role_alias` = 'administrator'
AND NOT EXISTS (
SELECT 1 FROM `blade_role_menu` x
WHERE x.`menu_id` = 2090000000000002006 AND x.`role_id` = r.`id`
);
-- 幂等收口:本编辑码只应挂在超级管理员上,其余角色一律收回。
-- 上面的 SELECT 是按授权规则下发,这条是按同一规则回收,二者合起来可重复执行。
DELETE FROM `blade_role_menu`
WHERE `menu_id` = 2090000000000002006
AND `role_id` NOT IN (SELECT `id` FROM `blade_role` WHERE `role_alias` = 'administrator');
@@ -0,0 +1,27 @@
-- 异常处置跟进记录补充附件
-- 日期:2026-10-10
--
-- 附件以 JSON 数组存放([{"name":"...","url":"..."}]),与本仓库其它附件字段一致。
DELIMITER $$
DROP PROCEDURE IF EXISTS `upgrade_blade_exception_disposal_follow_attachments_20261010`$$
CREATE PROCEDURE `upgrade_blade_exception_disposal_follow_attachments_20261010`()
BEGIN
DECLARE db_name varchar(128);
SET db_name = DATABASE();
IF NOT EXISTS (SELECT 1 FROM information_schema.columns
WHERE table_schema = db_name
AND table_name = 'blade_exception_disposal_follow_record'
AND column_name = 'attachments_json') THEN
ALTER TABLE `blade_exception_disposal_follow_record`
ADD COLUMN `attachments_json` text DEFAULT NULL COMMENT '附件JSON'
AFTER `follow_content`;
END IF;
END$$
CALL `upgrade_blade_exception_disposal_follow_attachments_20261010`()$$
DROP PROCEDURE `upgrade_blade_exception_disposal_follow_attachments_20261010`$$
DELIMITER ;
@@ -0,0 +1,37 @@
-- 异常处置增加过程节点归属
-- 日期:2026-10-05
-- 节点归属用于打卡门禁:某节点有未了结异常时,该节点及其后的节点不可打卡。
-- node_code 为空表示未指明节点(全局入口上报),此类异常阻断该运单所有尚未打卡的节点。
-- node_name 在上报时复制,此后不随过程配置变化,与车牌、项目、承运商等展示字段同一口径。
DELIMITER $$
DROP PROCEDURE IF EXISTS `upgrade_blade_exception_disposal_node_code_20261005`$$
CREATE PROCEDURE `upgrade_blade_exception_disposal_node_code_20261005`()
BEGIN
DECLARE db_name varchar(128);
SET db_name = DATABASE();
IF NOT EXISTS (SELECT 1 FROM information_schema.columns
WHERE table_schema = db_name
AND table_name = 'blade_exception_disposal'
AND column_name = 'node_code') THEN
ALTER TABLE `blade_exception_disposal`
ADD COLUMN `node_code` varchar(64) DEFAULT NULL COMMENT '过程节点 key(为空表示未指明节点)'
AFTER `waybill_no`;
END IF;
IF NOT EXISTS (SELECT 1 FROM information_schema.columns
WHERE table_schema = db_name
AND table_name = 'blade_exception_disposal'
AND column_name = 'node_name') THEN
ALTER TABLE `blade_exception_disposal`
ADD COLUMN `node_name` varchar(64) DEFAULT NULL COMMENT '过程节点名称(上报时复制,此后不随过程配置变化)'
AFTER `node_code`;
END IF;
END$$
CALL `upgrade_blade_exception_disposal_node_code_20261005`()$$
DROP PROCEDURE `upgrade_blade_exception_disposal_node_code_20261005`$$
DELIMITER ;
@@ -0,0 +1,65 @@
-- ============================================================
-- blade_invoice_application_invoice_urls_20260930.sql
-- ============================================================
-- 开票申请金蝶发票结果表补充发票文件下载地址(A303-5 返回,正式结算单详情查看/下载发票):
-- invoice_file_url 板式文件下载地址(数电票为OFD,航信百望税盘普通电票为PDF,电子专票/UKey电票为OFD)
-- invoice_image_url PDF图片预览地址
-- invoice_pdf_file_url 数电PDF下载地址(发票云5.0.025版本返回)
-- invoice_xml_file_url 数电XML下载地址(发票云5.0.025版本返回)
-- 以下结构升级支持重复执行
-- ① blade_invoice_application_invoice.invoice_file_url
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_invoice_application_invoice` ADD COLUMN `invoice_file_url` varchar(1024) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''板式文件下载地址(数电票为OFD,普通电票为PDF,电子专票为OFD)'' AFTER `invoice_amount`',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'blade_invoice_application_invoice'
AND COLUMN_NAME = 'invoice_file_url'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
-- ② blade_invoice_application_invoice.invoice_image_url
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_invoice_application_invoice` ADD COLUMN `invoice_image_url` varchar(1024) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''PDF图片预览地址'' AFTER `invoice_file_url`',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'blade_invoice_application_invoice'
AND COLUMN_NAME = 'invoice_image_url'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
-- ③ blade_invoice_application_invoice.invoice_pdf_file_url
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_invoice_application_invoice` ADD COLUMN `invoice_pdf_file_url` varchar(1024) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''数电PDF下载地址(发票云5.0.025版本返回)'' AFTER `invoice_image_url`',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'blade_invoice_application_invoice'
AND COLUMN_NAME = 'invoice_pdf_file_url'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
-- ④ blade_invoice_application_invoice.invoice_xml_file_url
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_invoice_application_invoice` ADD COLUMN `invoice_xml_file_url` varchar(1024) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''数电XML下载地址(发票云5.0.025版本返回)'' AFTER `invoice_pdf_file_url`',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'blade_invoice_application_invoice'
AND COLUMN_NAME = 'invoice_xml_file_url'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
@@ -0,0 +1,75 @@
-- ① blade_kingdee_attachment_sync 建表【修复索引超长问题】
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'CREATE TABLE `blade_kingdee_attachment_sync` (
`id` bigint NOT NULL COMMENT ''主键'',
`tenant_id` varchar(12) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''租户ID'',
`biz_type` varchar(32) COLLATE utf8mb4_general_ci NOT NULL COMMENT ''业务单据类型(pay_application/formal_settlement_ap/formal_settlement_ar/invoice_receipt/invoice_application)'',
`biz_id` bigint NOT NULL COMMENT ''业务单据id'',
`attachment_key` varchar(768) COLLATE utf8mb4_general_ci NOT NULL COMMENT ''附件幂等键(用户附件=附件url;发票文件=A801-2的path)'',
`attachment_name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''附件名称(展示/排查用)'',
`kingdee_path` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''金蝶侧文件路径(A902 返回 data.path)'',
`sync_status` tinyint NOT NULL DEFAULT 0 COMMENT ''同步状态:1 成功 / 0 失败'',
`fail_reason` varchar(500) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''失败原因(超限/下载失败/金蝶报错)'',
`sync_time` datetime DEFAULT NULL COMMENT ''最近上传时间'',
`create_user` bigint DEFAULT NULL COMMENT ''创建人'',
`create_dept` bigint DEFAULT NULL COMMENT ''创建部门'',
`create_time` datetime DEFAULT NULL COMMENT ''创建时间'',
`update_user` bigint DEFAULT NULL COMMENT ''修改人'',
`update_time` datetime DEFAULT NULL COMMENT ''修改时间'',
`status` int DEFAULT NULL COMMENT ''业务状态'',
`is_deleted` int DEFAULT 0 COMMENT ''是否已删除'',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_biz_attachment` (`biz_type`,`biz_id`,`attachment_key`(256)),
KEY `idx_biz_type_biz_id` (`biz_type`,`biz_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT=''金蝶附件同步表(A902)''',
'SELECT 1')
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'blade_kingdee_attachment_sync'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
-- ② blade_formal_settlement.kingdee_bill_id
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_formal_settlement` ADD COLUMN `kingdee_bill_id` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''金蝶单据id(星瀚内部主键,A902 附件上传定位用)'' AFTER `kingdee_bill_no`',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'blade_formal_settlement'
AND COLUMN_NAME = 'kingdee_bill_id'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
-- ③ blade_invoice_receipt.kingdee_received_invoice_id
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_invoice_receipt` ADD COLUMN `kingdee_received_invoice_id` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''金蝶收票单id(星瀚内部主键,A902 附件上传定位用)'' AFTER `kingdee_received_invoice_no`',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'blade_invoice_receipt'
AND COLUMN_NAME = 'kingdee_received_invoice_id'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
-- ④ blade_invoice_application.kingdee_bill_id
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_invoice_application` ADD COLUMN `kingdee_bill_id` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''金蝶开票申请单id(星瀚内部主键,A902 附件上传定位用)'' AFTER `kingdee_bill_no`',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'blade_invoice_application'
AND COLUMN_NAME = 'kingdee_bill_id'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
@@ -0,0 +1,32 @@
-- 金蝶单据锁定记录表:lockBusiData 锁定 / unLockNotifyBusiData 解锁回调 / 锁定补偿
-- 一行 = 一张金蝶目标单:锁定留痕(人/时间/失败原因)+ 当前锁状态(编辑守卫/回调定位/补偿扫表)
-- lock_status:failed-锁定失败(补偿重试对象)/ locked-金蝶锁定中 / unlocked-已解锁(终态)
CREATE TABLE `blade_kingdee_bill_lock` (
`id` bigint NOT NULL COMMENT '主键',
`tenant_id` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '000000' COMMENT '租户ID',
`source_bill_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'WLTMS单据类型:SETTLEMENT正式结算单/INVOICE_APPLY开票申请单(预留PAY_APPLY付款申请单/RECEIVED_INVOICE收票单)',
`source_bill_id` bigint NOT NULL COMMENT 'WLTMS业务主键',
`source_bill_no` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'WLTMS单号',
`target_bill_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '金蝶单据类型:ApFin_other_BT_S应付单/arfin_other_BT_S应收单/cdm_paybill_bank_elect_BT_S开票单等固定值',
`target_bill_no` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '金蝶单据编号(开票申请按发票张次逐张一行)',
`lock_status` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '锁状态:failed锁定失败/locked金蝶锁定中/unlocked已解锁',
`operation_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '最近动作来源操作类型:SAVE单据新增/DELETE单据删除',
`try_count` int DEFAULT '0' COMMENT '锁定重试次数(补偿任务用,超上限停试)',
`lock_time` datetime DEFAULT NULL COMMENT '锁定时间',
`unlock_time` datetime DEFAULT NULL COMMENT '解锁时间',
`lock_operator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '推单发起人(锁定操作人)',
`notify_operator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '回调操作人(金蝶侧操作人)',
`fail_reason` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '锁定失败原因',
`create_user` bigint DEFAULT NULL COMMENT '创建人',
`create_dept` bigint DEFAULT NULL COMMENT '创建部门',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_user` bigint DEFAULT NULL COMMENT '修改人',
`update_time` datetime DEFAULT NULL COMMENT '修改时间',
`status` int DEFAULT NULL COMMENT '状态',
`is_deleted` int DEFAULT '0' COMMENT '是否已删除',
PRIMARY KEY (`id`),
INDEX `idx_kbl_source` (`source_bill_type`, `source_bill_id`),
INDEX `idx_kbl_target` (`target_bill_type`, `target_bill_no`),
INDEX `idx_kbl_status` (`lock_status`, `try_count`)
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '金蝶单据锁定记录' ROW_FORMAT = DYNAMIC;
@@ -0,0 +1,46 @@
-- 金蝶票池选票回切镜像读:镜像表新增可用过滤列 + 认领过滤索引
-- available_amount 剩余可用金额(A801-1 availableAmount,金蝶可用税额口径,选票本地过滤 >0)
-- amount_use_status 金额使用状态(A801-1 amountUseStatus,'0' 未使用可选 / '2' 全部使用)
-- 由定时同步(InvoiceReceiptKingdeeSyncTask)/ 手动同步端点 / 票号回源 / 收票保存重查 统一按 tenant_id + invoice_no upsert 回填;
-- 存量存根行两列为 NULL,不参与选票(可用过滤为 NULL 排除),随增量窗口同步自然回填
-- 认领过滤 EXISTS 子查询补 (tenant_id, invoice_no) 索引,避免统一查询全表扫
-- 以下结构升级支持重复执行
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_kingdee_invoice_pool` ADD COLUMN `available_amount` decimal(18,2) DEFAULT NULL COMMENT ''剩余可用金额(A801-1 availableAmount,金蝶可用税额口径)'' AFTER `source_updated_time`',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'blade_kingdee_invoice_pool'
AND COLUMN_NAME = 'available_amount'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_kingdee_invoice_pool` ADD COLUMN `amount_use_status` varchar(8) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''金额使用状态(0 未使用 / 2 全部使用)'' AFTER `available_amount`',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'blade_kingdee_invoice_pool'
AND COLUMN_NAME = 'amount_use_status'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
SET @idx_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_formal_settlement_invoice` ADD INDEX `idx_settlement_invoice_no` (`tenant_id`, `invoice_no`)',
'SELECT 1')
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'blade_formal_settlement_invoice'
AND INDEX_NAME = 'idx_settlement_invoice_no'
);
PREPARE idx_stmt FROM @idx_sql;
EXECUTE idx_stmt;
DEALLOCATE PREPARE idx_stmt;
@@ -0,0 +1,45 @@
-- ----------------------------
-- 小程序用户表(与 blade_user 分离,仅用于小程序登录)
-- 身份 identities:逗号分隔,当前支持 driver(司机)、admin(管理员),可同时拥有,后续可扩展
-- ----------------------------
CREATE TABLE IF NOT EXISTS `blade_mp_user` (
`id` bigint NOT NULL COMMENT '主键',
`tenant_id` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '000000' COMMENT '租户ID',
`code` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户编号',
`account` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '账号(通常为手机号)',
`password` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '密码(小程序登录可不使用)',
`name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '昵称',
`real_name` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '真名',
`avatar` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '头像',
`email` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '邮箱',
`phone` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '手机',
`birthday` datetime NULL DEFAULT NULL COMMENT '生日',
`sex` int NULL DEFAULT NULL COMMENT '性别',
`openid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '微信小程序 openid',
`identities` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '小程序身份,逗号分隔:driver,admin',
`dept_id` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '部门id',
`post_id` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '岗位id',
`remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
`create_user` bigint NULL DEFAULT NULL COMMENT '创建人',
`create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
`update_user` bigint NULL DEFAULT NULL COMMENT '修改人',
`update_time` datetime NULL DEFAULT NULL COMMENT '修改时间',
`status` int NULL DEFAULT 1 COMMENT '状态',
`is_deleted` int NULL DEFAULT 0 COMMENT '是否已删除',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `uk_mp_user_tenant_phone` (`tenant_id`, `phone`) USING BTREE,
UNIQUE KEY `uk_mp_user_tenant_openid` (`tenant_id`, `openid`) USING BTREE,
KEY `idx_mp_user_account` (`tenant_id`, `account`) USING BTREE,
KEY `idx_mp_user_identities` (`identities`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '小程序用户表';
-- 司机表 user_id 语义变更为关联小程序用户
ALTER TABLE `blade_transport_driver`
MODIFY COLUMN `user_id` bigint(20) DEFAULT NULL COMMENT '关联小程序用户ID(blade_mp_user.id)';
-- 示例:创建小程序管理员(调度端),identities 可同时包含 driver,admin
-- INSERT INTO `blade_mp_user`
-- (`id`, `tenant_id`, `account`, `name`, `real_name`, `phone`, `identities`, `create_time`, `status`, `is_deleted`)
-- VALUES
-- (2091900000000000001, '000000', '13800000000', '调度管理员', '调度管理员', '13800000000', 'admin', NOW(), 1, 0);
@@ -0,0 +1,90 @@
-- ----------------------------
-- 小程序用户管理菜单(挂在系统管理下)
-- 日期:2026-10-12
-- ----------------------------
INSERT INTO `blade_menu`
(`id`,`parent_id`,`code`,`name`,`alias`,`path`,`source`,`sort`,`category`,`action`,`is_open`,`component`,`remark`,`is_deleted`)
VALUES
(2091901200000000101,1123598815738675203,'mp_user','小程序用户','menu','/system/mp-user','iconfont icon-yonghu',3,1,0,1,NULL,'小程序用户管理',0),
(2091901200000000102,2091901200000000101,'mp_user_add','新增','add','','',1,2,0,1,NULL,'',0),
(2091901200000000103,2091901200000000101,'mp_user_edit','编辑','edit','','',2,2,0,1,NULL,'',0),
(2091901200000000104,2091901200000000101,'mp_user_delete','删除','delete','','',3,2,0,1,NULL,'',0),
(2091901200000000105,2091901200000000101,'mp_user_view','查看','view','','',4,2,0,1,NULL,'',0),
(2091901200000000106,2091901200000000101,'mp_user_status','修改状态','status','','',5,2,0,1,NULL,'',0),
(2091901200000000107,2091901200000000101,'mp_user_reset','密码重置','reset','','',6,2,0,1,NULL,'',0)
ON DUPLICATE KEY UPDATE
`parent_id`=VALUES(`parent_id`),
`code`=VALUES(`code`),
`name`=VALUES(`name`),
`alias`=VALUES(`alias`),
`path`=VALUES(`path`),
`source`=VALUES(`source`),
`sort`=VALUES(`sort`),
`category`=VALUES(`category`),
`remark`=VALUES(`remark`),
`is_deleted`=0;
-- 授权给超级管理员角色(幂等)
INSERT INTO `blade_role_menu` (`id`, `menu_id`, `role_id`)
SELECT 2091901200000000101 + (r.`id` % 1000), 2091901200000000101, r.`id`
FROM `blade_role` r
WHERE r.`role_alias` = 'administrator'
AND NOT EXISTS (
SELECT 1 FROM `blade_role_menu` x
WHERE x.`menu_id` = 2091901200000000101 AND x.`role_id` = r.`id`
);
INSERT INTO `blade_role_menu` (`id`, `menu_id`, `role_id`)
SELECT 2091901200000000102 + (r.`id` % 1000), 2091901200000000102, r.`id`
FROM `blade_role` r
WHERE r.`role_alias` = 'administrator'
AND NOT EXISTS (
SELECT 1 FROM `blade_role_menu` x
WHERE x.`menu_id` = 2091901200000000102 AND x.`role_id` = r.`id`
);
INSERT INTO `blade_role_menu` (`id`, `menu_id`, `role_id`)
SELECT 2091901200000000103 + (r.`id` % 1000), 2091901200000000103, r.`id`
FROM `blade_role` r
WHERE r.`role_alias` = 'administrator'
AND NOT EXISTS (
SELECT 1 FROM `blade_role_menu` x
WHERE x.`menu_id` = 2091901200000000103 AND x.`role_id` = r.`id`
);
INSERT INTO `blade_role_menu` (`id`, `menu_id`, `role_id`)
SELECT 2091901200000000104 + (r.`id` % 1000), 2091901200000000104, r.`id`
FROM `blade_role` r
WHERE r.`role_alias` = 'administrator'
AND NOT EXISTS (
SELECT 1 FROM `blade_role_menu` x
WHERE x.`menu_id` = 2091901200000000104 AND x.`role_id` = r.`id`
);
INSERT INTO `blade_role_menu` (`id`, `menu_id`, `role_id`)
SELECT 2091901200000000105 + (r.`id` % 1000), 2091901200000000105, r.`id`
FROM `blade_role` r
WHERE r.`role_alias` = 'administrator'
AND NOT EXISTS (
SELECT 1 FROM `blade_role_menu` x
WHERE x.`menu_id` = 2091901200000000105 AND x.`role_id` = r.`id`
);
INSERT INTO `blade_role_menu` (`id`, `menu_id`, `role_id`)
SELECT 2091901200000000106 + (r.`id` % 1000), 2091901200000000106, r.`id`
FROM `blade_role` r
WHERE r.`role_alias` = 'administrator'
AND NOT EXISTS (
SELECT 1 FROM `blade_role_menu` x
WHERE x.`menu_id` = 2091901200000000106 AND x.`role_id` = r.`id`
);
INSERT INTO `blade_role_menu` (`id`, `menu_id`, `role_id`)
SELECT 2091901200000000107 + (r.`id` % 1000), 2091901200000000107, r.`id`
FROM `blade_role` r
WHERE r.`role_alias` = 'administrator'
AND NOT EXISTS (
SELECT 1 FROM `blade_role_menu` x
WHERE x.`menu_id` = 2091901200000000107 AND x.`role_id` = r.`id`
);
@@ -0,0 +1,61 @@
-- ----------------------------
-- 将已关联 blade_user 的司机迁移到 blade_mp_user(可选,按环境执行)
-- 注意:执行前请先执行 blade_mp_user_20261012.sql 建表
-- 策略:小程序用户主键使用司机表 id(避免与 blade_user.id 冲突导致令牌刷新串用户)
-- 迁移后回写 driver.user_id;原 blade_user 账号不会自动删除,请人工确认后再清理
-- 调度端管理员需另行在 blade_mp_user 中维护 identities 含 admin 的账号
-- ----------------------------
-- 1) 按司机写入小程序用户
INSERT INTO `blade_mp_user` (
`id`, `tenant_id`, `account`, `name`, `real_name`, `phone`, `sex`,
`openid`, `identities`, `dept_id`,
`create_user`, `create_dept`, `create_time`, `update_user`, `update_time`,
`status`, `is_deleted`
)
SELECT
d.`id` AS `id`,
IFNULL(d.`tenant_id`, '000000') AS `tenant_id`,
d.`mobile` AS `account`,
d.`driver_name` AS `name`,
d.`driver_name` AS `real_name`,
d.`mobile` AS `phone`,
CASE
WHEN d.`gender` IN ('男', '1') THEN 1
WHEN d.`gender` IN ('女', '2') THEN 2
ELSE NULL
END AS `sex`,
oauth.`uuid` AS `openid`,
'driver' AS `identities`,
u.`dept_id` AS `dept_id`,
d.`create_user`,
d.`create_dept`,
IFNULL(d.`create_time`, NOW()) AS `create_time`,
d.`update_user`,
IFNULL(d.`update_time`, NOW()) AS `update_time`,
IFNULL(d.`status`, 1) AS `status`,
0 AS `is_deleted`
FROM `blade_transport_driver` d
LEFT JOIN `blade_user` u ON u.`id` = d.`user_id` AND u.`is_deleted` = 0
LEFT JOIN `blade_user_oauth` oauth
ON oauth.`user_id` = d.`user_id`
AND oauth.`source` = 'WECHAT_MINI'
AND oauth.`is_deleted` = 0
WHERE d.`is_deleted` = 0
AND d.`mobile` IS NOT NULL
AND d.`mobile` <> ''
AND NOT EXISTS (
SELECT 1 FROM `blade_mp_user` m
WHERE m.`id` = d.`id`
OR (m.`tenant_id` = IFNULL(d.`tenant_id`, '000000') AND m.`phone` = d.`mobile` AND m.`is_deleted` = 0)
);
-- 2) 回写司机关联的小程序用户ID
UPDATE `blade_transport_driver` d
INNER JOIN `blade_mp_user` m
ON m.`id` = d.`id`
OR (m.`tenant_id` = IFNULL(d.`tenant_id`, '000000') AND m.`phone` = d.`mobile` AND m.`is_deleted` = 0)
SET d.`user_id` = m.`id`
WHERE d.`is_deleted` = 0
AND d.`mobile` IS NOT NULL
AND d.`mobile` <> '';
@@ -0,0 +1,19 @@
-- 订正过程配置中「上传货量为是、货量类型为空」的脏配置
-- 日期:2026-10-05
--
-- 成因:过程配置页的「到场」「回单」两个节点模板缺 supportCargo 字段,货量开关
-- 在界面上不渲染,导致这两个节点被写成 uploadCargo=true 且 cargoTypes 恒为空。
-- 语义:「是否需要采集货量」以已勾选的货量类型为准——类型为空即不采集,
-- 不存在「没配类型所以三项全采集」。
-- 影响:订正后这些节点在小程序不再显示货量表单。因司机端解析过程配置时优先取
-- 启用中的活配置,本次订正会同时改变所有引用该项目的运单(含历史运单)的呈现。
-- 范围:只订正过程配置表,不修改 blade_waybill.process_json 快照列(那是历史留痕)。
-- 幂等:执行后目标子串不再存在,重复执行匹配 0 行。
UPDATE `blade_process_config`
SET `node_config_json` = REPLACE(
`node_config_json`,
'"uploadCargo":true,"cargoTypes":[]',
'"uploadCargo":false,"cargoTypes":[]')
WHERE `is_deleted` = 0
AND `node_config_json` LIKE '%"uploadCargo":true,"cargoTypes":[]%';
@@ -0,0 +1,4 @@
-- 平台公司支持多选:ID 逗号分隔,名称顿号分隔
ALTER TABLE `blade_project_apply`
MODIFY COLUMN `undertake_dept_id` varchar(500) DEFAULT NULL COMMENT '平台公司ID,多个逗号分隔',
MODIFY COLUMN `undertake_dept_name` varchar(500) DEFAULT NULL COMMENT '平台公司,多个顿号分隔';
@@ -18,8 +18,8 @@ CREATE TABLE `blade_project_apply` (
`project_type` varchar(50) DEFAULT NULL COMMENT '项目类型',
`business_dept_id` bigint(20) DEFAULT NULL COMMENT '业务部门ID',
`business_dept_name` varchar(100) DEFAULT NULL COMMENT '业务部门',
`undertake_dept_id` bigint(20) DEFAULT NULL COMMENT '承办部门ID',
`undertake_dept_name` varchar(100) DEFAULT NULL COMMENT '承办部门',
`undertake_dept_id` varchar(500) DEFAULT NULL COMMENT '平台公司ID,多个逗号分隔',
`undertake_dept_name` varchar(500) DEFAULT NULL COMMENT '平台公司,多个顿号分隔',
`project_source` varchar(50) DEFAULT NULL COMMENT '项目由来',
`source_remark` varchar(500) DEFAULT NULL COMMENT '项目由来说明',
`fund_limit` decimal(18,2) DEFAULT NULL COMMENT '项目资金使用额度(万元)',
@@ -80,8 +80,8 @@ CREATE TABLE `blade_temporary_credit_limit` (
`project_id` bigint(20) DEFAULT NULL COMMENT '项目ID',
`project_code` varchar(100) DEFAULT NULL COMMENT '项目编号',
`project_name` varchar(100) DEFAULT NULL COMMENT '项目名称',
`undertake_dept_id` bigint(20) DEFAULT NULL COMMENT '承办部门ID',
`undertake_dept_name` varchar(100) DEFAULT NULL COMMENT '承办部门',
`undertake_dept_id` varchar(500) DEFAULT NULL COMMENT '平台公司ID,多个逗号分隔',
`undertake_dept_name` varchar(500) DEFAULT NULL COMMENT '平台公司,多个顿号分隔',
`project_fund_limit` decimal(18,2) DEFAULT NULL COMMENT '项目资金使用额度(万元)',
`used_fund_limit` decimal(18,2) DEFAULT NULL COMMENT '已使用项目资金额度(万元)',
`remaining_fund_limit` decimal(18,2) DEFAULT NULL COMMENT '剩余项目资金使用额度(万元)',
@@ -119,8 +119,8 @@ CREATE TABLE `blade_contract_manage` (
`contract_name` varchar(100) DEFAULT NULL COMMENT '合同名称',
`project_id` bigint(20) DEFAULT NULL COMMENT '所属项目ID',
`project_name` varchar(100) DEFAULT NULL COMMENT '所属项目',
`organization_id` bigint(20) DEFAULT NULL COMMENT '所属组织ID',
`organization_name` varchar(100) DEFAULT NULL COMMENT '所属组织',
`organization_id` bigint(20) DEFAULT NULL COMMENT '合同负责部门ID',
`organization_name` varchar(100) DEFAULT NULL COMMENT '合同负责部门',
`contract_category` varchar(50) DEFAULT NULL COMMENT '合同类别',
`sign_type` varchar(50) DEFAULT NULL COMMENT '签约类型',
`party_a` varchar(200) DEFAULT NULL COMMENT '甲方',
@@ -132,6 +132,7 @@ CREATE TABLE `blade_contract_manage` (
`handler_user_id` bigint(20) DEFAULT NULL COMMENT '经办人ID',
`handler_user_name` varchar(100) DEFAULT NULL COMMENT '经办人',
`sign_date` date DEFAULT NULL COMMENT '签订日期',
`apply_date` date DEFAULT NULL COMMENT '申请日期(提交正式合同时写入)',
`settlement_mode` varchar(100) DEFAULT NULL COMMENT '结算方式',
`contract_format` varchar(50) DEFAULT NULL COMMENT '合同格式',
`legal_seal_flag` int(11) DEFAULT '0' COMMENT '是否需要加盖法人章',
@@ -160,6 +161,7 @@ CREATE TABLE `blade_contract_manage` (
`change_reason` varchar(500) DEFAULT NULL COMMENT '变更原因',
`change_attachments_json` text DEFAULT NULL COMMENT '待审批变更附件JSON',
`terminate_reason` varchar(500) DEFAULT NULL COMMENT '终止原因',
`main_content` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '合同主要内容',
`remark` varchar(2000) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`id`) USING BTREE,
KEY `idx_contract_project` (`project_id`) USING BTREE,
+1 -1
View File
@@ -6,7 +6,7 @@ CREATE TABLE `blade_railway_station` (
`id` bigint NOT NULL COMMENT '主键',
`code` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '编码',
`tmis_code` varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'TMIS国标编码',
`telegraph_code` varchar(3) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '电报码',
`telegraph_code` varchar(3) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '电报码',
`name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '车站名称',
`railway_line` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '所属铁路线路',
`province_code` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '所属省份编码',
@@ -0,0 +1,5 @@
-- 铁路车站电报略码改为非必填(有值时仍保持唯一)
-- 执行前请先备份数据库;如字段已是可空,可跳过本脚本。
ALTER TABLE `blade_railway_station`
MODIFY COLUMN `telegraph_code` varchar(3) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '电报码';
@@ -0,0 +1,136 @@
-- 收款认领推送金蝶重构(认领本地化 / A301-3 定时+手动推送 / 按流水归集)
-- 支持重复执行,兼容 20260924 脚本已执行/未执行的环境,与该脚本无执行顺序要求
-- 变更点:
-- 1. 收款流水表新增推送域字段(推送状态/失败原因/推送时间/推送编码/金蝶收款单号/回写状态)
-- 2. 认领主单移除 awrp_src_code 及其索引(推送编码上移至流水:分摊结算单号拼接)
-- 3. 收款流水表新增定时任务扫描索引与 A301-1 回写匹配索引
-- 1. 收款流水表:推送状态
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_kingdee_receipt_flow` ADD COLUMN `push_status` varchar(20) COLLATE utf8mb4_general_ci NOT NULL DEFAULT ''none'' COMMENT ''推送状态(none未推送/pushed已推送/failed推送失败)''',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'blade_kingdee_receipt_flow' AND COLUMN_NAME = 'push_status'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
-- 2. 收款流水表:最近一次推送失败原因
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_kingdee_receipt_flow` ADD COLUMN `push_fail_reason` varchar(1000) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''最近一次推送失败原因(成功后清空)''',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'blade_kingdee_receipt_flow' AND COLUMN_NAME = 'push_fail_reason'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
-- 3. 收款流水表:首次推送成功时间
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_kingdee_receipt_flow` ADD COLUMN `pushed_time` datetime DEFAULT NULL COMMENT ''首次推送金蝶成功时间''',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'blade_kingdee_receipt_flow' AND COLUMN_NAME = 'pushed_time'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
-- 4. 收款流水表:推送来源单据编码(A301-3 awrp_src_code,分摊结算单号拼接,A301-1 回写匹配键)
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_kingdee_receipt_flow` ADD COLUMN `awrp_src_code` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''金蝶推送来源单据编码(分摊结算单号下划线拼接,A301-1回写匹配键)''',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'blade_kingdee_receipt_flow' AND COLUMN_NAME = 'awrp_src_code'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
-- 5. 收款流水表:金蝶收款单号(推送响应回填 / A301-1 回写推进)
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_kingdee_receipt_flow` ADD COLUMN `kingdee_bill_no` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''金蝶收款单号''',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'blade_kingdee_receipt_flow' AND COLUMN_NAME = 'kingdee_bill_no'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
-- 6. 收款流水表:金蝶回写状态(A301-1 回写生命周期)
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_kingdee_receipt_flow` ADD COLUMN `kingdee_bill_status` varchar(20) COLLATE utf8mb4_general_ci NOT NULL DEFAULT ''none'' COMMENT ''金蝶回写状态(none未推送/pushed已推送/approved审核通过/received已收款/failed失败)''',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'blade_kingdee_receipt_flow' AND COLUMN_NAME = 'kingdee_bill_status'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
-- 7. 认领主单:删除 awrp_src_code 索引(列上移至流水表;0924 未执行过则本就无此索引)
SET @ddl_sql = (
SELECT IF(COUNT(*) > 0,
'ALTER TABLE `blade_receipt_claim` DROP KEY `idx_receipt_claim_src_code`',
'SELECT 1')
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'blade_receipt_claim' AND INDEX_NAME = 'idx_receipt_claim_src_code'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
-- 8. 认领主单:删除 awrp_src_code 列(0924 未执行过则本就无此列)
SET @ddl_sql = (
SELECT IF(COUNT(*) > 0,
'ALTER TABLE `blade_receipt_claim` DROP COLUMN `awrp_src_code`',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'blade_receipt_claim' AND COLUMN_NAME = 'awrp_src_code'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
-- 9. 收款流水表:定时任务扫描索引(push_status IN (none,failed) AND claim_status='claimed' AND bill_id 非空)
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_kingdee_receipt_flow` ADD KEY `idx_kingdee_receipt_flow_push_scan` (`tenant_id`,`push_status`,`claim_status`)',
'SELECT 1')
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'blade_kingdee_receipt_flow' AND INDEX_NAME = 'idx_kingdee_receipt_flow_push_scan'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
-- 10. 收款流水表:A301-1 回写匹配索引(sourcebillnumber = awrp_src_code)
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_kingdee_receipt_flow` ADD KEY `idx_kingdee_receipt_flow_src_code` (`tenant_id`,`awrp_src_code`)',
'SELECT 1')
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'blade_kingdee_receipt_flow' AND INDEX_NAME = 'idx_kingdee_receipt_flow_src_code'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
-- 11. 按钮权限:收款流水页「推送金蝶」(父级菜单 2090000000000001260 收款流水,排序 4)
INSERT INTO `blade_menu`
(`id`,`parent_id`,`code`,`name`,`alias`,`path`,`source`,`sort`,`category`,`action`,`is_open`,`component`,`remark`,`is_deleted`)
VALUES
(2090000000000001264,2090000000000001260,'receipt_flow_push','推送金蝶','receipt_flow_push','','',4,2,0,1,NULL,'',0)
ON DUPLICATE KEY UPDATE
`name`=VALUES(`name`),
`alias`=VALUES(`alias`),
`is_deleted`=0;
+1
View File
@@ -283,6 +283,7 @@ CREATE TABLE `blade_waybill` (
`plan_name` varchar(100) DEFAULT NULL COMMENT '计划名称',
`master_no` varchar(100) DEFAULT NULL COMMENT '多联总单',
`loading_no` varchar(100) DEFAULT NULL COMMENT '配载单号',
`loading_identifier` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '配载标识号',
`batch_no` varchar(100) DEFAULT NULL COMMENT '运单批次号',
`relation_no` varchar(100) DEFAULT NULL COMMENT '关联单号',
`current_process_node` varchar(100) DEFAULT NULL COMMENT '当前过程节点',
@@ -0,0 +1,277 @@
-- ----------------------------
-- 认证:存量司机 / 车辆补生效快照
-- 写业务数据。执行前必须先建备份表(第 0 节),执行后必须跑第 3 节校验。可重复执行。
-- ----------------------------
--
-- 为什么必须补:
-- 「能否接单」在运营状态之上叠加了认证门槛,判据是生效快照指针
-- blade_transport_driver.effective_cert_record_id 与
-- blade_transport_vehicle.effective_cert_record_id。这两列与门槛一起新增,
-- 新增时对存量对象一律为 NULL;门槛默认开启,于是存量司机与车辆全部被判成
-- 「未认证」,接单被直接拒绝。它们在此之前一直正常承运,可用性是既成事实,
-- 不该因为换了判定方式就丢掉。
--
-- 处置口径:给尚无生效快照的存量对象补一条「已通过」记录,并把指针指过去。
-- 这是自动认可、不是任何人的审核行为,故 audit_user / audit_time 一律留空,
-- 不凭空编造审核留痕。
--
-- 快照键名必须与 PersonCertSubmitRequest / VehicleCertSubmitRequest 完全一致。
-- 键名对不上不会报错、只会静默丢值:司机端「重新认证」表单会缺字段,
-- 审核详情会把每个字段都报成「已变更」。改 DTO 字段名时务必同步本脚本。
--
-- 司机的从业资格证有效期起(qualificationValidStart)在快照里没有来源:
-- blade_transport_driver 没有对应列,管理端的同名录入项也是只收不存。
-- 此处同样不造值,该键留空。
--
-- 司机快照里没有 mobile:审核列表的司机姓名/手机号取的是司机档案当前值,
-- 不是提交时的快照值,故无需写进快照。
--
-- 提交司机(submit_user)为什么一起补:
-- 审核列表的「司机姓名 / 司机手机号」取数路径是 submit_user -> 系统账号 -> 司机档案。
-- submit_user 为空,这两列就永远空白,审核队列「找得到人、联系得上」的价值就没了。
-- 车辆认证记录本身不含司机信息,其提交司机取「该车当前绑定的司机」——
-- 车辆认证的提交链路强制校验只能操作本人绑定的车辆,故真实提交的车辆认证记录,
-- 其提交司机就是这辆车的绑定司机。一条车牌有多个绑定司机时
-- (driving_vehicle 是逗号分隔的文本列、无唯一索引),取司机档案 update_time 最新者:
-- 库里没有绑定时间戳,这是可用的最好代理指标。
-- 解析不到系统账号的(该司机根本没有 blade_user),留 NULL,不编造。
--
-- 号段:blade_transport_cert_record.id 由应用侧雪花算法发号(当前约 2.1e18),
-- 本脚本自行发号,必须落在应用永远到不了的区间,否则会与真实提交撞主键。
-- 车辆与司机各占一段,段距 1e17,互不重叠,且都远低于 bigint 上限 9.22e18。
-- 该号段同时是回退的识别依据(第 4 节)。
-- ⚠️ 不要改成「取 MAX(id) + 偏移量」:雪花 id 每秒最多 +1000,
-- 取 MAX+1000000 的话应用约 17 分钟就能追平并开始撞号。
-- ⚠️ 也不要把 id 读出来再拼 UPDATE 的 WHERE:id 约 2.1e18 超过 JS/JSON
-- 安全整数上限 2^53,传回数据库时末位被截断,UPDATE 会静默匹配 0 行——
-- 记录插进去了、指针却没写,且不报任何错。故全程用 SQL 自关联
-- (JOIN ... ON r.biz_id = v.id),id 只在库内流转。
--
-- 发号用会话变量而不是 ROW_NUMBER():窗口函数要 MySQL 8.0 起,本脚本按 5.7 也能执行写。
--
-- 前置条件:blade_transport_cert_record 表与两张业务表上的
-- certification_status / certification_reject_reason / effective_cert_record_id
-- 列都已存在(见 blade_transport_cert_record_20261002.sql)。缺表时报
-- 「Table ... doesn't exist」,先补跑那个脚本再执行本脚本。
-- ----------------------------
-- 0. 备份(必须在订正之前执行,仅首次需要)
-- ----------------------------
-- CREATE TABLE blade_transport_vehicle_certbak AS
-- SELECT id, certification_status, certification_reject_reason, effective_cert_record_id
-- FROM blade_transport_vehicle;
-- CREATE TABLE blade_transport_driver_certbak AS
-- SELECT id, certification_status, certification_reject_reason, effective_cert_record_id
-- FROM blade_transport_driver;
-- CREATE TABLE blade_transport_cert_record_bak AS SELECT * FROM blade_transport_cert_record;
START TRANSACTION;
-- ----------------------------
-- 1. 为尚无生效快照的车辆补「已通过」记录
-- ----------------------------
-- 从段内已有的最大号之后接着发,而不是每次从段首发:
-- 订正过一次之后又导入了新车、再跑本脚本时,从段首发号会与已有记录撞主键。
-- 变量存的是**段内序号**(段基址已减掉),下面 SELECT 里再加回段基址。
SET @vehicle_seq := (SELECT IFNULL(MAX(id) - 9000000000000000000, 0)
FROM blade_transport_cert_record
WHERE id >= 9000000000000000000 AND id < 9100000000000000000);
INSERT INTO blade_transport_cert_record
(id, tenant_id, biz_type, biz_id, biz_key, status, snapshot_json,
submit_time, submit_user, create_time, update_time, is_deleted)
SELECT 9000000000000000000 + (@vehicle_seq := @vehicle_seq + 1),
IFNULL(v.tenant_id, '000000'), 'vehicle', v.id, IFNULL(v.plate_no, ''), 1,
JSON_OBJECT(
'plateNo', v.plate_no,
'ownerName', v.owner_name,
'plateColor', v.plate_color,
'vehicleType', v.vehicle_type,
'vin', v.vin,
'outerLength', v.outer_length,
'outerWidth', v.outer_width,
'outerHeight', v.outer_height,
'approvedLoadKg', v.approved_load_kg,
'tractionMassKg', v.traction_mass_kg,
'energyType', v.energy_type,
'businessRelation', v.business_relation,
'compulsoryScrapDate', v.compulsory_scrap_date,
'compulsoryScrapLongTerm', IF(v.compulsory_scrap_long_term = 1, 1, 0),
'drivingLicenseNo', v.driving_license_no,
'drivingLicenseImage', v.driving_license_image,
'drivingLicenseMainBack', v.driving_license_main_back,
'drivingLicenseViceFront', v.driving_license_vice_front,
'drivingLicenseViceBack', v.driving_license_vice_back,
'drivingLicenseStartDate', v.driving_license_start_date,
'drivingLicenseEndDate', v.driving_license_end_date,
'drivingLicenseLongTerm', IF(v.driving_license_long_term = 1, 1, 0),
'roadTransportCertNo', v.road_transport_cert_no,
'roadTransportCertImage', v.road_transport_cert_image,
'roadTransportCertStartDate', v.road_transport_cert_start_date,
'roadTransportCertEndDate', v.road_transport_cert_end_date,
'roadTransportCertLongTerm', IF(v.road_transport_cert_long_term = 1, 1, 0),
'registrationNo', v.registration_no,
'registrationImage', v.registration_image
),
NOW(),
(SELECT dr.user_id
FROM blade_transport_driver dr
WHERE dr.is_deleted = 0
AND dr.user_id IS NOT NULL
AND dr.driving_vehicle IS NOT NULL
AND FIND_IN_SET(v.plate_no, REPLACE(dr.driving_vehicle, ',', ',')) > 0
ORDER BY dr.update_time DESC, dr.id DESC
LIMIT 1),
NOW(), NOW(), 0
FROM blade_transport_vehicle v
LEFT JOIN blade_transport_cert_record r
ON r.biz_type = 'vehicle' AND r.biz_id = v.id
AND r.id >= 9000000000000000000 AND r.id < 9100000000000000000
WHERE v.is_deleted = 0
AND v.effective_cert_record_id IS NULL
AND r.id IS NULL
ORDER BY v.id;
-- 回填指针:靠 biz_id 自关联,不把 id 带出数据库
UPDATE blade_transport_vehicle v
JOIN blade_transport_cert_record r
ON r.biz_type = 'vehicle' AND r.biz_id = v.id
AND r.id >= 9000000000000000000 AND r.id < 9100000000000000000 AND r.status = 1
SET v.effective_cert_record_id = r.id,
v.certification_status = 1,
v.certification_reject_reason = NULL
WHERE v.effective_cert_record_id IS NULL AND v.is_deleted = 0;
-- ----------------------------
-- 2. 为尚无生效快照的司机补「已通过」记录
-- ----------------------------
SET @driver_seq := (SELECT IFNULL(MAX(id) - 9100000000000000000, 0)
FROM blade_transport_cert_record
WHERE id >= 9100000000000000000 AND id < 9200000000000000000);
INSERT INTO blade_transport_cert_record
(id, tenant_id, biz_type, biz_id, biz_key, status, snapshot_json,
submit_time, submit_user, create_time, update_time, is_deleted)
SELECT 9100000000000000000 + (@driver_seq := @driver_seq + 1),
IFNULL(d.tenant_id, '000000'), 'driver', d.id, IFNULL(d.driver_name, ''), 1,
JSON_OBJECT(
'realName', d.driver_name,
'idCardNo', d.id_card_no,
'idCardFrontUrl', d.id_card_front,
'idCardBackUrl', d.id_card_back,
'idCardValidStart', d.id_card_valid_start,
'idCardValidEnd', d.id_card_valid_end,
'idCardLongTerm', IF(d.id_card_long_term = 1, 1, 0),
'driverFileNo', d.driving_license_no,
'driverClass', d.driving_type,
'driverLicenseFrontUrl', d.driving_license_front,
'driverLicenseBackUrl', d.driving_license_back,
'driverValidStart', d.driving_license_start_date,
'driverValidEnd', d.driving_license_end_date,
'driverLongTerm', IF(d.driving_license_long_term = 1, 1, 0),
'qualificationType', d.qualification_type,
'qualificationNo', d.qualification_no,
'qualificationFront', d.qualification_front,
'qualificationBack', d.qualification_back,
'qualificationValidEnd', d.qualification_end_date,
'qualificationLongTerm', IF(d.qualification_long_term = 1, 1, 0),
'headPhoto', d.head_photo
),
NOW(),
-- 注册在司机档案上的用户 id 最直接;它为空时退回「按手机号找账号」
-- (司机登录账号就是手机号)。两者都落空说明这名司机没有系统账号,
-- 此时留 NULL —— 审核列表的司机列本来就取不到人,编不出来。
IFNULL(d.user_id,
(SELECT u.id
FROM blade_user u
WHERE u.account = d.mobile COLLATE utf8mb4_general_ci
ORDER BY u.id DESC
LIMIT 1)),
NOW(), NOW(), 0
FROM blade_transport_driver d
LEFT JOIN blade_transport_cert_record r
ON r.biz_type = 'driver' AND r.biz_id = d.id
AND r.id >= 9100000000000000000 AND r.id < 9200000000000000000
WHERE d.is_deleted = 0
AND d.effective_cert_record_id IS NULL
AND r.id IS NULL
ORDER BY d.id;
UPDATE blade_transport_driver d
JOIN blade_transport_cert_record r
ON r.biz_type = 'driver' AND r.biz_id = d.id
AND r.id >= 9100000000000000000 AND r.id < 9200000000000000000 AND r.status = 1
SET d.effective_cert_record_id = r.id,
d.certification_status = 1,
d.certification_reject_reason = NULL
WHERE d.effective_cert_record_id IS NULL AND d.is_deleted = 0;
COMMIT;
-- ----------------------------
-- 3. 校验(执行后必看,四个都必须返回 0)
-- ----------------------------
-- 下列查询非 0 说明还有对象没有生效快照,门槛开着它们就不可用。
-- SELECT COUNT(*) AS vehicle_missing FROM blade_transport_vehicle
-- WHERE effective_cert_record_id IS NULL AND is_deleted = 0;
-- SELECT COUNT(*) AS driver_missing FROM blade_transport_driver
-- WHERE effective_cert_record_id IS NULL AND is_deleted = 0;
--
-- 下列查询非 0 说明指针指向的不是一条「已通过」记录,生效值取不到内容。
-- SELECT COUNT(*) AS vehicle_bad_pointer
-- FROM blade_transport_vehicle v
-- LEFT JOIN blade_transport_cert_record r ON r.id = v.effective_cert_record_id
-- WHERE v.effective_cert_record_id IS NOT NULL AND (r.id IS NULL OR r.status <> 1);
-- SELECT COUNT(*) AS driver_bad_pointer
-- FROM blade_transport_driver d
-- LEFT JOIN blade_transport_cert_record r ON r.id = d.effective_cert_record_id
-- WHERE d.effective_cert_record_id IS NOT NULL AND (r.id IS NULL OR r.status <> 1);
--
-- 快照字段完整性:确认关键字段没有因为键名写错而丢失。
-- 司机快照必须含 driverClass(准驾车型),车辆快照必须含 drivingLicenseNo(行驶证档案编号)。
-- SELECT COUNT(*) AS driver_snapshot_bad FROM blade_transport_cert_record
-- WHERE biz_type = 'driver' AND JSON_EXTRACT(snapshot_json, '$.driverClass') IS NULL;
-- SELECT COUNT(*) AS vehicle_snapshot_bad FROM blade_transport_cert_record
-- WHERE biz_type = 'vehicle' AND JSON_EXTRACT(snapshot_json, '$.drivingLicenseNo') IS NULL;
--
-- 号段账目:号段内的记录数应等于本次订正的对象数(首次订正 = 车辆数 + 尚无快照的在用司机数),
-- 指针落在号段内的对象数也应等于它。两个数对不上说明有对象漏订正。
-- SELECT COUNT(*) AS in_range_record FROM blade_transport_cert_record
-- WHERE id >= 9000000000000000000 AND id < 9200000000000000000;
-- SELECT COUNT(*) AS driver_backfilled FROM blade_transport_driver
-- WHERE effective_cert_record_id >= 9000000000000000000
-- AND effective_cert_record_id < 9200000000000000000;
-- SELECT COUNT(*) AS vehicle_backfilled FROM blade_transport_vehicle
-- WHERE effective_cert_record_id >= 9000000000000000000
-- AND effective_cert_record_id < 9200000000000000000;
-- ----------------------------
-- 4. 回退
-- ----------------------------
-- 识别依据是 id 号段(>= 9.0e18),不是「备份表里没有的 id」:
-- 号段法不依赖备份表是否建过,也不会误删订正之后产生的真实提交记录。
-- 回退前先把门槛开关置 false(transport.certification.driver-gate-enabled /
-- vehicle-gate-enabled),否则清掉指针的瞬间所有对象都不可用。
-- 顺序:先清指针,再删记录;反了会在中间态留下悬空指针。
-- START TRANSACTION;
-- UPDATE blade_transport_driver
-- SET effective_cert_record_id = NULL, certification_status = NULL,
-- certification_reject_reason = NULL
-- WHERE effective_cert_record_id >= 9000000000000000000
-- AND effective_cert_record_id < 9200000000000000000;
-- UPDATE blade_transport_vehicle
-- SET effective_cert_record_id = NULL, certification_status = 0,
-- certification_reject_reason = NULL
-- WHERE effective_cert_record_id >= 9000000000000000000
-- AND effective_cert_record_id < 9200000000000000000;
-- DELETE FROM blade_transport_cert_record
-- WHERE id >= 9000000000000000000 AND id < 9200000000000000000;
-- COMMIT;
--
-- 车辆 certification_status 还原为 0 是近似值:订正会把原本 0 与 1 的车都写成 1,
-- 原分布无法反推。这只影响页面上的状态标,不影响可用性(重跑订正会再次全部写成 1)。
-- 要精确还原只能用订正前建好的 blade_transport_vehicle_certbak:
-- UPDATE blade_transport_vehicle v
-- JOIN blade_transport_vehicle_certbak b ON b.id = v.id
-- SET v.certification_status = b.certification_status,
-- v.certification_reject_reason = b.certification_reject_reason;
@@ -0,0 +1,140 @@
-- ----------------------------
-- 认证记录:建表,司机表 / 车辆表补认证字段与生效快照指针,订正司机表排序规则,
-- 并新增认证审核菜单。可重复执行。
-- ----------------------------
-- ----------------------------
-- 1. 认证记录表
-- ----------------------------
CREATE TABLE IF NOT EXISTS `blade_transport_cert_record` (
`id` bigint(20) NOT NULL COMMENT '主键',
`tenant_id` varchar(12) NOT NULL DEFAULT '000000' COMMENT '租户ID',
`biz_type` varchar(20) NOT NULL COMMENT '认证对象类型:driver-司机,vehicle-车辆',
`biz_id` bigint(20) NOT NULL COMMENT '认证对象主键:司机ID或车辆ID(车辆按具体车辆,不是司机)',
`biz_key` varchar(100) DEFAULT NULL COMMENT '展示键:司机姓名/车牌号',
`status` int(11) NOT NULL COMMENT '审核状态:0审核中 1已通过 2已驳回 3已作废',
`snapshot_json` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '该次提交的全量认证内容JSON,一经创建不可修改',
`reject_reason` varchar(200) DEFAULT NULL COMMENT '驳回原因,仅状态为已驳回时有值',
`submit_time` datetime DEFAULT NULL COMMENT '提交时间',
`submit_user` bigint(20) DEFAULT NULL COMMENT '提交人',
`audit_time` datetime DEFAULT NULL COMMENT '审核时间',
`audit_user` bigint(20) DEFAULT NULL COMMENT '审核人',
`create_user` bigint(20) DEFAULT NULL COMMENT '创建人',
`create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_user` bigint(20) DEFAULT NULL COMMENT '修改人',
`update_time` datetime DEFAULT NULL COMMENT '修改时间',
`is_deleted` int(11) DEFAULT '0' COMMENT '是否已删除',
`pending_biz_id` bigint(20) GENERATED ALWAYS AS (if((`status` = 0) and (`is_deleted` = 0),`biz_id`,NULL)) STORED COMMENT '待审唯一键:仅未删除的审核中记录非空,用于保证同对象至多一条待审快照',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `uk_cert_record_pending` (`tenant_id`,`biz_type`,`pending_biz_id`) USING BTREE,
KEY `idx_cert_record_biz` (`biz_type`,`biz_id`,`submit_time`) USING BTREE,
KEY `idx_cert_record_status` (`biz_type`,`status`,`submit_time`) USING BTREE,
KEY `idx_cert_record_submit_time` (`submit_time`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='认证记录';
-- ----------------------------
-- 2~4. 加列与排序规则订正
-- ----------------------------
DELIMITER $$
DROP PROCEDURE IF EXISTS `upgrade_transport_cert_record_20261002`$$
CREATE PROCEDURE `upgrade_transport_cert_record_20261002`()
BEGIN
DECLARE db_name varchar(128);
SET db_name = DATABASE();
IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = db_name AND table_name = 'blade_transport_driver' AND column_name = 'certification_status') THEN
ALTER TABLE `blade_transport_driver` ADD COLUMN `certification_status` int(11) DEFAULT NULL COMMENT '最新提交状态展示缓存:0审核中 1已通过 2已驳回 3已作废,NULL为从未提交' AFTER `remark`;
END IF;
IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = db_name AND table_name = 'blade_transport_driver' AND column_name = 'certification_reject_reason') THEN
ALTER TABLE `blade_transport_driver` ADD COLUMN `certification_reject_reason` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '最新一次驳回原因展示缓存' AFTER `certification_status`;
END IF;
IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = db_name AND table_name = 'blade_transport_driver' AND column_name = 'effective_cert_record_id') THEN
ALTER TABLE `blade_transport_driver` ADD COLUMN `effective_cert_record_id` bigint(20) DEFAULT NULL COMMENT '生效快照指针:指向 blade_transport_cert_record.id,NULL 表示从未认证通过;一经设置永不回退' AFTER `certification_reject_reason`;
END IF;
IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = db_name AND table_name = 'blade_transport_driver' AND column_name = 'id_card_valid_start') THEN
ALTER TABLE `blade_transport_driver` ADD COLUMN `id_card_valid_start` date DEFAULT NULL COMMENT '身份证有效期起' AFTER `id_card_back`;
END IF;
IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = db_name AND table_name = 'blade_transport_driver' AND column_name = 'id_card_valid_end') THEN
ALTER TABLE `blade_transport_driver` ADD COLUMN `id_card_valid_end` date DEFAULT NULL COMMENT '身份证有效期止' AFTER `id_card_valid_start`;
END IF;
IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = db_name AND table_name = 'blade_transport_driver' AND column_name = 'id_card_long_term') THEN
ALTER TABLE `blade_transport_driver` ADD COLUMN `id_card_long_term` int(11) DEFAULT '0' COMMENT '身份证长期有效:0否 1是' AFTER `id_card_valid_end`;
END IF;
IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = db_name AND table_name = 'blade_transport_vehicle' AND column_name = 'effective_cert_record_id') THEN
ALTER TABLE `blade_transport_vehicle` ADD COLUMN `effective_cert_record_id` bigint(20) DEFAULT NULL COMMENT '生效快照指针:指向 blade_transport_cert_record.id,NULL 表示从未认证通过;一经设置永不回退' AFTER `certification_reject_reason`;
END IF;
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = db_name AND table_name = 'blade_transport_driver' AND table_collation <> 'utf8mb4_general_ci') THEN
ALTER TABLE `blade_transport_driver` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
END IF;
IF EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_schema = db_name AND table_name = 'blade_transport_cert_record'
AND column_name = 'pending_biz_id' AND generation_expression NOT LIKE '%is_deleted%'
) THEN
ALTER TABLE `blade_transport_cert_record`
MODIFY COLUMN `pending_biz_id` bigint(20) GENERATED ALWAYS AS (if((`status` = 0) and (`is_deleted` = 0),`biz_id`,NULL)) STORED COMMENT '待审唯一键:仅未删除的审核中记录非空,用于保证同对象至多一条待审快照';
END IF;
-- tenant_id 必须 NOT NULL:唯一索引不对 NULL 去重,允许 NULL 则同一对象可并存两条待审记录
IF EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_schema = db_name AND table_name = 'blade_transport_cert_record'
AND column_name = 'tenant_id' AND is_nullable = 'YES'
) THEN
UPDATE `blade_transport_cert_record` SET `tenant_id` = '000000' WHERE `tenant_id` IS NULL;
ALTER TABLE `blade_transport_cert_record`
MODIFY COLUMN `tenant_id` varchar(12) NOT NULL DEFAULT '000000' COMMENT '租户ID';
END IF;
IF EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_schema = db_name AND table_name = 'blade_transport_vehicle'
AND column_name = 'certification_status' AND column_comment NOT LIKE '%已作废%'
) THEN
ALTER TABLE `blade_transport_vehicle`
MODIFY COLUMN `certification_status` int(11) DEFAULT '0' COMMENT '最新提交状态展示缓存:0审核中 1已通过 2已驳回 3已作废;可用性判定只看 effective_cert_record_id';
END IF;
IF EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_schema = db_name AND table_name = 'blade_transport_vehicle'
AND column_name = 'certification_reject_reason' AND column_comment NOT LIKE '%展示缓存%'
) THEN
ALTER TABLE `blade_transport_vehicle`
MODIFY COLUMN `certification_reject_reason` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '最新一次驳回原因展示缓存';
END IF;
END$$
CALL `upgrade_transport_cert_record_20261002`()$$
DROP PROCEDURE `upgrade_transport_cert_record_20261002`$$
DELIMITER ;
-- ----------------------------
-- 5. 菜单
-- 挂在「运力管理」2079000000000000001 下;ON DUPLICATE KEY UPDATE 使重跑可覆盖旧值。
-- ----------------------------
INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) VALUES
(2079000000000000300, 2079000000000000001, 'cert_certification_audit_driver', '司机审核', 'cert_certification_audit_driver', '/transportCapacity/cert-audit-driver', 'iconfont iconicon_doc', 4, 1, 0, 1, '', '司机认证待审列表', 0),
(2079000000000000301, 2079000000000000300, 'cert_certification_audit_driver_audit', '审核', 'cert_certification_audit_driver_audit', '', '', 1, 2, 0, 1, NULL, '通过/驳回司机认证', 0),
(2079000000000000310, 2079000000000000001, 'cert_certification_audit_vehicle', '车辆审核', 'cert_certification_audit_vehicle', '/transportCapacity/cert-audit-vehicle', 'iconfont iconicon_doc', 5, 1, 0, 1, '', '车辆认证待审列表', 0),
(2079000000000000311, 2079000000000000310, 'cert_certification_audit_vehicle_audit', '审核', 'cert_certification_audit_vehicle_audit', '', '', 1, 2, 0, 1, NULL, '通过/驳回车辆认证', 0)
ON DUPLICATE KEY UPDATE
`parent_id` = VALUES(`parent_id`),
`code` = VALUES(`code`),
`name` = VALUES(`name`),
`alias` = VALUES(`alias`),
`path` = VALUES(`path`),
`source` = VALUES(`source`),
`sort` = VALUES(`sort`),
`category` = VALUES(`category`),
`action` = VALUES(`action`),
`is_open` = VALUES(`is_open`),
`component` = VALUES(`component`),
`remark` = VALUES(`remark`),
`is_deleted` = VALUES(`is_deleted`);
+8 -2
View File
@@ -13,10 +13,13 @@ CREATE TABLE `blade_transport_driver` (
`education` varchar(20) DEFAULT NULL COMMENT '学历',
`address_region` varchar(100) DEFAULT NULL COMMENT '地址区划',
`address` varchar(200) DEFAULT NULL COMMENT '详细地址',
`driving_vehicle` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '驾驶车辆车牌号',
`driving_vehicle` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '驾驶车辆车牌号,多个用逗号分隔',
`posts` varchar(100) DEFAULT NULL COMMENT '岗位,多个使用逗号分隔',
`id_card_front` varchar(1000) DEFAULT NULL COMMENT '身份证正面照',
`id_card_back` varchar(1000) DEFAULT NULL COMMENT '身份证反面照',
`id_card_valid_start` date DEFAULT NULL COMMENT '身份证有效期起',
`id_card_valid_end` date DEFAULT NULL COMMENT '身份证有效期止',
`id_card_long_term` int(11) DEFAULT '0' COMMENT '身份证长期有效:0否 1是',
`head_photo` varchar(1000) DEFAULT NULL COMMENT '大头照',
`driving_type` varchar(20) NOT NULL COMMENT '准驾车型',
`driving_license_no` varchar(50) DEFAULT NULL COMMENT '驾驶证档案编号',
@@ -39,6 +42,9 @@ CREATE TABLE `blade_transport_driver` (
`emergency_contact_name` varchar(20) NOT NULL COMMENT '紧急联系人姓名',
`emergency_contact_mobile` varchar(20) NOT NULL COMMENT '紧急联系人手机号',
`remark` varchar(200) DEFAULT NULL COMMENT '备注',
`certification_status` int(11) DEFAULT NULL COMMENT '最新提交状态展示缓存:0审核中 1已通过 2已驳回 3已作废,NULL为从未提交',
`certification_reject_reason` varchar(200) DEFAULT NULL COMMENT '最新一次驳回原因展示缓存',
`effective_cert_record_id` bigint(20) DEFAULT NULL COMMENT '生效快照指针:指向 blade_transport_cert_record.id,NULL 表示从未认证通过;一经设置永不回退',
`create_user` bigint(20) DEFAULT NULL COMMENT '创建人',
`create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
@@ -54,7 +60,7 @@ CREATE TABLE `blade_transport_driver` (
KEY `idx_transport_driver_license_end` (`driving_license_end_date`) USING BTREE,
KEY `idx_transport_driver_qualification_end` (`qualification_end_date`) USING BTREE,
KEY `idx_transport_driver_status` (`status`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='司机管理';
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='司机管理';
-- ----------------------------
-- Records of blade_menu for transport capacity driver
@@ -0,0 +1,27 @@
-- 司机「驾驶车辆」字段扩长:varchar(30) -> varchar(100)。
-- 该字段是逗号并列的车牌列表,一个司机最多 5 辆,30 字符不够;超长会静默截断成半个车牌。
DELIMITER $$
DROP PROCEDURE IF EXISTS `upgrade_transport_driver_driving_vehicle_widen_20261003`$$
CREATE PROCEDURE `upgrade_transport_driver_driving_vehicle_widen_20261003`()
BEGIN
DECLARE db_name varchar(128);
SET db_name = DATABASE();
IF EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_schema = db_name
AND table_name = 'blade_transport_driver'
AND column_name = 'driving_vehicle'
AND character_maximum_length < 100
) THEN
ALTER TABLE `blade_transport_driver`
MODIFY COLUMN `driving_vehicle` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '驾驶车辆车牌号,多个用逗号分隔';
END IF;
END$$
CALL `upgrade_transport_driver_driving_vehicle_widen_20261003`()$$
DROP PROCEDURE `upgrade_transport_driver_driving_vehicle_widen_20261003`$$
DELIMITER ;
@@ -8,8 +8,10 @@ CREATE TABLE `blade_transport_vehicle` (
`organization_name` varchar(50) NOT NULL COMMENT '所属组织',
`use_department` varchar(50) DEFAULT NULL COMMENT '使用部门',
`plate_no` varchar(16) NOT NULL COMMENT '车牌号',
`owner_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '所有人(行驶证登记的单位名称,不是司机)',
`plate_color` varchar(20) DEFAULT NULL COMMENT '车牌颜色',
`vehicle_type` varchar(50) NOT NULL COMMENT '车辆类型',
`vin` varchar(17) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '车辆识别代号(车架号)',
`outer_length` int(11) DEFAULT NULL COMMENT '外廓长度,毫米',
`outer_width` int(11) DEFAULT NULL COMMENT '外廓宽度,毫米',
`outer_height` int(11) DEFAULT NULL COMMENT '外廓高度,毫米',
@@ -39,8 +41,9 @@ CREATE TABLE `blade_transport_vehicle` (
`registration_date` date DEFAULT NULL COMMENT '机动车登记日期',
`registration_image` varchar(1000) DEFAULT NULL COMMENT '机动车登记本图片',
`remark` varchar(200) DEFAULT NULL COMMENT '备注',
`certification_status` int(11) DEFAULT '0' COMMENT '认证状态:0认证中 1认证通过 2认证驳回',
`certification_reject_reason` varchar(200) DEFAULT NULL COMMENT '认证驳回原因',
`certification_status` int(11) DEFAULT '0' COMMENT '最新提交状态展示缓存:0审核中 1已通过 2已驳回 3已作废;可用性判定只看 effective_cert_record_id',
`certification_reject_reason` varchar(200) DEFAULT NULL COMMENT '最新一次驳回原因展示缓存',
`effective_cert_record_id` bigint(20) DEFAULT NULL COMMENT '生效快照指针:指向 blade_transport_cert_record.id,NULL 表示从未认证通过;一经设置永不回退',
`create_user` bigint(20) DEFAULT NULL COMMENT '创建人',
`create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
@@ -0,0 +1,36 @@
-- 车辆档案补两列:所有人(行驶证登记的单位名称,不是司机)、车辆识别代号(车架号)。
-- 两列均可空,存量车辆没有值。
DELIMITER $$
DROP PROCEDURE IF EXISTS `upgrade_transport_vehicle_owner_vin_20261003`$$
CREATE PROCEDURE `upgrade_transport_vehicle_owner_vin_20261003`()
BEGIN
DECLARE db_name varchar(128);
SET db_name = DATABASE();
IF NOT EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_schema = db_name
AND table_name = 'blade_transport_vehicle'
AND column_name = 'owner_name'
) THEN
ALTER TABLE `blade_transport_vehicle`
ADD COLUMN `owner_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '所有人(行驶证登记的单位名称,不是司机)' AFTER `plate_no`;
END IF;
IF NOT EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_schema = db_name
AND table_name = 'blade_transport_vehicle'
AND column_name = 'vin'
) THEN
ALTER TABLE `blade_transport_vehicle`
ADD COLUMN `vin` varchar(17) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '车辆识别代号(车架号)' AFTER `vehicle_type`;
END IF;
END$$
CALL `upgrade_transport_vehicle_owner_vin_20261003`()$$
DROP PROCEDURE `upgrade_transport_vehicle_owner_vin_20261003`$$
DELIMITER ;
@@ -0,0 +1,9 @@
-- 用户多部门聚合字段扩容,避免 OA/IAM 同步时 dept_id 写入超长导致 Data truncation
-- 部署前先执行本脚本,再发布后端
ALTER TABLE `blade_user`
MODIFY COLUMN `dept_id` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '部门id';
-- 若库中已有 dept_codes 列,请同步执行以下语句(无该列时可跳过)
ALTER TABLE `blade_user`
MODIFY COLUMN `dept_codes` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '部门编码';
@@ -0,0 +1,4 @@
-- 用户表:记录 OA 的 modified(上次更新时间),用于增量同步比对
ALTER TABLE `blade_user`
ADD COLUMN `oa_modified` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'OA上次更新时间(modified)' AFTER `is_oa`;
@@ -0,0 +1,5 @@
-- 用户手机号字段扩容:SM2 加密后 Hex 远超 varchar(45),避免 IAM/OA 同步插入失败
-- 部署前先执行本脚本,再发布后端
ALTER TABLE `blade_user`
MODIFY COLUMN `phone` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '手机';
@@ -0,0 +1,2 @@
ALTER TABLE `blade_waybill`
ADD COLUMN `loading_identifier` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '配载标识号' AFTER `loading_no`;
@@ -11,7 +11,7 @@ CREATE TABLE IF NOT EXISTS `blade_waybill_node_punch` (
`longitude` decimal(12, 8) DEFAULT NULL COMMENT '经度',
`latitude` decimal(12, 8) DEFAULT NULL COMMENT '纬度',
`address` varchar(500) DEFAULT NULL COMMENT '打卡地址',
`photos` varchar(2000) DEFAULT NULL COMMENT '凭证照片URL,多张逗号分隔',
`photos` text DEFAULT NULL COMMENT '照片 JSON 数组 [{type,url}],每类型至多 9 张',
`weight` varchar(32) DEFAULT NULL COMMENT '重量(吨)',
`volume` varchar(32) DEFAULT NULL COMMENT '体积(方)',
`quantity` varchar(32) DEFAULT NULL COMMENT '数量(件)',
@@ -27,4 +27,4 @@ CREATE TABLE IF NOT EXISTS `blade_waybill_node_punch` (
PRIMARY KEY (`id`) USING BTREE,
KEY `idx_node_punch_waybill` (`waybill_id`, `node_code`, `punch_time`) USING BTREE,
KEY `idx_node_punch_driver` (`driver_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='运单过程节点打卡记录';
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='运单过程节点打卡记录';
@@ -0,0 +1,10 @@
-- ----------------------------
-- 节点打卡照片列加宽:varchar(2000) 改为 text
-- ----------------------------
-- 一个节点可传「打卡照片 9 张 + 每个凭证类型各 9 张」,勾了 4 类凭证时共 45 张;
-- 库里实测每张照片含类型的 JSON 串约 111 字符,36 张约 4000 字符,已超 varchar(2000) 一倍。
-- 超长时严格模式报 Data too long,非严格模式会静默截断成半个 JSON,后者更难查。
-- 内容形状不变,仍是扁平 [{"type","url"}]。可重复执行。
ALTER TABLE `blade_waybill_node_punch`
MODIFY COLUMN `photos` text DEFAULT NULL COMMENT '照片 JSON 数组 [{type,url}],每类型至多 9 张';
@@ -0,0 +1,17 @@
-- 付款管理:金蝶付款结果定时回写(A103-2 付款申请单查询 / A103-4 付款处理查询)
-- 新增 kingdee_bill_id:保存 A103-1/A103-3 推送返回的星瀚单据内部主键(A902 附件上传等使用);
-- kingdee_bill_no 字段语义调整为保存金蝶单据编号(billno,如 FKSQ-xxxx),由定时回写任务回填
-- 以下结构升级支持重复执行
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_payment_application` ADD COLUMN `kingdee_bill_id` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''金蝶单据id(星瀚内部主键)'' AFTER `kingdee_bill_no`',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'blade_payment_application'
AND COLUMN_NAME = 'kingdee_bill_id'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
@@ -0,0 +1,16 @@
-- 客商档案:金蝶(星瀚)协同字段
-- kingdee_status:none未推送 / exist金蝶已有档案(A902-1查到已审核,跳过推送) / synced已推送成功 / failed推送失败或金蝶审核中
-- 金蝶客户编码与 TMS 客商编号(customer_code)一致(A902-2 number 传入客商编号),无需单独存储
ALTER TABLE `blade_customer_archive`
ADD COLUMN `kingdee_status` varchar(20) NOT NULL DEFAULT 'none' COMMENT '金蝶协同状态:none未推送/exist金蝶已有/synced已推送/failed推送失败' AFTER `approved_time`,
ADD COLUMN `kingdee_fail_reason` varchar(500) NULL DEFAULT NULL COMMENT '金蝶推送失败原因' AFTER `kingdee_status`,
ADD COLUMN `kingdee_sync_time` datetime NULL DEFAULT NULL COMMENT '金蝶推送时间' AFTER `kingdee_fail_reason`;
CREATE INDEX idx_kingdee_status ON blade_customer_archive (kingdee_status);
-- 列表「同步金蝶」按钮权限(审批通过后推送失败的重推入口;parent_id 通过菜单 code 关联,避免写死 id)
INSERT INTO blade_menu (id, parent_id, code, name, alias, path, source, sort, category, action, is_open, component, remark, is_deleted)
SELECT 2075431800000000001, m.id, 'customer_archive_sync', '同步金蝶', 'customer_archive_sync', '', '', 1, 2, 0, 1, '', '', 0
FROM blade_menu m
WHERE m.code = 'customer_archive' AND m.is_deleted = 0;
@@ -0,0 +1,61 @@
-- 收票管理:金蝶全票池发票同步(A801-1 查询 + 批量同步 + 定时绑定关联)
-- 票据池镜像表新增金蝶票池字段:
-- serial_no 发票流水号(票池唯一标识,A801-1 serialNo,同步回填 kingdee_bill_no)
-- buyer_tax_no 购方税号(A801-1 buyerTaxNo)
-- saler_tax_no 销方税号(A801-1 salerTaxNo)
-- check_status 查验状态(A801-1 checkStatus,0 未查验 / 1 通过 / 2 不通过)
-- 由手动批量同步与定时绑定任务按 tenant_id + invoice_no upsert 回填;
-- 发票号码唯一索引 uk_kingdee_invoice_pool_no(tenant_id, invoice_no)建表时已存在,无需新增
-- 以下结构升级支持重复执行
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_kingdee_invoice_pool` ADD COLUMN `serial_no` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''金蝶发票流水号(票池唯一标识)'' AFTER `invoice_no`',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'blade_kingdee_invoice_pool'
AND COLUMN_NAME = 'serial_no'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_kingdee_invoice_pool` ADD COLUMN `buyer_tax_no` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''购方税号'' AFTER `receiver_name`',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'blade_kingdee_invoice_pool'
AND COLUMN_NAME = 'buyer_tax_no'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_kingdee_invoice_pool` ADD COLUMN `saler_tax_no` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''销方税号'' AFTER `issuer_name`',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'blade_kingdee_invoice_pool'
AND COLUMN_NAME = 'saler_tax_no'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_kingdee_invoice_pool` ADD COLUMN `check_status` varchar(8) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''查验状态(0未查验/1通过/2不通过)'' AFTER `kingdee_status`',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'blade_kingdee_invoice_pool'
AND COLUMN_NAME = 'check_status'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
@@ -0,0 +1,21 @@
-- 应收结算与开票申请同步金蝶(A303-1 开票申请推送)
-- 开票申请商品行新增字段:
-- tax_classification_code 税收分类编码(开票项目主数据 blade_invoice_item.tax_classification_code,
-- 新增/编辑开票申请选择开票内容时快照落库,A303-1 分录 taxratecodeid.number 取数来源)
-- 销方名称/销方税号不走 Nacos 配置与表结构:销方名称取开票申请开票单位快照(issuer_name,结算单收款方带出),
-- 销方税号按开票单位查客商档案统一社会信用代码(unified_credit_code)
-- 开票申请基础建表脚本 blade_invoice_application_20260821.sql 保持不动,本脚本支持重复执行
-- 以下结构升级支持重复执行
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_invoice_application_line` ADD COLUMN `tax_classification_code` varchar(30) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''税收分类编码(开票内容快照)'' AFTER `goods_name`',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'blade_invoice_application_line'
AND COLUMN_NAME = 'tax_classification_code'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
@@ -0,0 +1,22 @@
-- 开票申请金蝶发票结果表(A303-5 定时回写落库,发票号唯一幂等)
CREATE TABLE IF NOT EXISTS `blade_invoice_application_invoice` (
`id` bigint(20) NOT NULL COMMENT '主键',
`tenant_id` varchar(12) NOT NULL DEFAULT '000000' COMMENT '租户ID',
`create_user` bigint(20) DEFAULT NULL COMMENT '创建人',
`create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_user` bigint(20) DEFAULT NULL COMMENT '修改人',
`update_time` datetime DEFAULT NULL COMMENT '修改时间',
`status` int(11) DEFAULT '1' COMMENT '状态',
`is_deleted` int(11) DEFAULT '0' COMMENT '是否删除',
`invoice_application_id` bigint(20) NOT NULL COMMENT '开票申请ID',
`serial_no` varchar(64) DEFAULT NULL COMMENT '金蝶开票申请单编号(A303-5 serialNo)',
`invoice_no` varchar(64) NOT NULL COMMENT '发票号码',
`invoice_date` datetime DEFAULT NULL COMMENT '开票日期',
`invoice_amount` decimal(18,2) DEFAULT NULL COMMENT '价税合计',
`raw_json` text COMMENT 'A303-5返回原文JSON留档',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_application_invoice` (`tenant_id`,`invoice_application_id`,`invoice_no`),
KEY `idx_iai_application_id` (`invoice_application_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='开票申请金蝶发票结果';
@@ -0,0 +1,94 @@
-- 收票管理 图05 环节②③:推送金蝶收票单(A303-2 收票单批量保存 + A302-6 收票指定应付 + A801-3 定时回写)
-- 票据池镜像表 blade_kingdee_invoice_pool 新增:
-- invoice_type_code 票易通原始发票类型编码(A801-1 invoiceType,如 26/27,A303-2 invoicetypef7_number 取数)
-- items_json A801-1 发票明细行JSON(品名/数量/单价/金额/税率/税额/税收分类编码,A303-2 分录取数来源)
-- 收票登记表 blade_invoice_receipt 新增:
-- kingdee_received_invoice_no 金蝶收票单单据编号(A303-2 返回/幂等预检命中回填)
-- kingdee_push_status 收票单推送状态(unsynced 未推送 / pushed 已保存 / assigned 已指定应付 / failed 推送失败)
-- kingdee_push_msg 推送失败原因(金蝶侧删除/红冲/查验不通过等异常回收提示人工)
-- kingdee_push_time 最近一次推送/回写时间
-- 以下结构升级支持重复执行
-- ① blade_kingdee_invoice_pool.invoice_type_code
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_kingdee_invoice_pool` ADD COLUMN `invoice_type_code` varchar(8) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''票易通原始发票类型编码(A801-1 invoiceType,如26/27)'' AFTER `invoice_type`',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'blade_kingdee_invoice_pool'
AND COLUMN_NAME = 'invoice_type_code'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
-- ② blade_kingdee_invoice_pool.items_json
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_kingdee_invoice_pool` ADD COLUMN `items_json` longtext COLLATE utf8mb4_general_ci COMMENT ''A801-1发票明细行JSON(A303-2分录取数来源)'' AFTER `attachments_json`',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'blade_kingdee_invoice_pool'
AND COLUMN_NAME = 'items_json'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
-- ③ blade_invoice_receipt.kingdee_received_invoice_no
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_invoice_receipt` ADD COLUMN `kingdee_received_invoice_no` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''金蝶收票单单据编号(A303-2生成)'' AFTER `kingdee_bill_no`',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'blade_invoice_receipt'
AND COLUMN_NAME = 'kingdee_received_invoice_no'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
-- ④ blade_invoice_receipt.kingdee_push_status
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_invoice_receipt` ADD COLUMN `kingdee_push_status` varchar(16) COLLATE utf8mb4_general_ci NOT NULL DEFAULT ''unsynced'' COMMENT ''收票单推送状态(unsynced未推送/pushed已保存/assigned已指定应付/failed推送失败)'' AFTER `kingdee_status`',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'blade_invoice_receipt'
AND COLUMN_NAME = 'kingdee_push_status'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
-- ⑤ blade_invoice_receipt.kingdee_push_msg
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_invoice_receipt` ADD COLUMN `kingdee_push_msg` varchar(500) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''收票单推送失败原因'' AFTER `kingdee_push_status`',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'blade_invoice_receipt'
AND COLUMN_NAME = 'kingdee_push_msg'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
-- ⑥ blade_invoice_receipt.kingdee_push_time
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_invoice_receipt` ADD COLUMN `kingdee_push_time` datetime DEFAULT NULL COMMENT ''最近一次收票单推送/回写时间'' AFTER `kingdee_push_msg`',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'blade_invoice_receipt'
AND COLUMN_NAME = 'kingdee_push_time'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
@@ -0,0 +1,17 @@
-- 金蝶票池镜像降级为登记存根(2026-09-22 票池改回实时查询收尾)
-- 背景:选票链路已改为实时查询 A801-1,blade_kingdee_invoice_pool 仅保留被收票登记引用的镜像行(登记存根),
-- 历史全量同步落库的未被引用镜像行属于退役数据,予以清理。
-- 幂等:可重复执行,第二次影响 0 行。
-- 注意:执行前必须先向用户报盘点数字并获确认(dev 库清理口径:事务 + 回滚 SQL + mysqldump 文本兜底)。
-- 执行前先跑盘点(只读):
-- SELECT COUNT(*) AS prune_rows FROM blade_kingdee_invoice_pool p
-- LEFT JOIN blade_invoice_receipt r ON r.kingdee_invoice_pool_id = p.id AND r.is_deleted = 0
-- WHERE r.id IS NULL;
-- SELECT COUNT(*) AS keep_rows FROM blade_kingdee_invoice_pool p
-- INNER JOIN blade_invoice_receipt r ON r.kingdee_invoice_pool_id = p.id AND r.is_deleted = 0;
-- 票池镜像降级为登记存根:删除未被任何未删收票登记引用的镜像行(实时查询模式上线前执行)
-- DELETE p FROM blade_kingdee_invoice_pool p
-- LEFT JOIN blade_invoice_receipt r ON r.kingdee_invoice_pool_id = p.id AND r.is_deleted = 0
-- WHERE r.id IS NULL;
@@ -0,0 +1,33 @@
-- 收票管理金蝶功能精简:删除 blade_invoice_receipt 冗余同步字段
-- kingdee_bill_no 金蝶单据号(冗余,等于票池镜像 serialNo,可经 kingdee_invoice_pool_id 关联查询)
-- kingdee_status 金蝶同步状态(冗余,手动同步功能已下线,推送状态 kingdee_push_status 为唯一状态源)
-- 金蝶状态展示口径:kingdee_push_status 四态经 kingdeePushStatusName 展示(未推送/已保存收票单/已指定应付/推送失败)
-- 以下结构升级支持重复执行
-- ① blade_invoice_receipt.kingdee_bill_no
SET @ddl_sql = (
SELECT IF(COUNT(*) > 0,
'ALTER TABLE `blade_invoice_receipt` DROP COLUMN `kingdee_bill_no`',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'blade_invoice_receipt'
AND COLUMN_NAME = 'kingdee_bill_no'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
-- ② blade_invoice_receipt.kingdee_status(索引 idx_invoice_receipt_kingdee 随列自动删除)
SET @ddl_sql = (
SELECT IF(COUNT(*) > 0,
'ALTER TABLE `blade_invoice_receipt` DROP COLUMN `kingdee_status`',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'blade_invoice_receipt'
AND COLUMN_NAME = 'kingdee_status'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
@@ -0,0 +1,75 @@
-- ① blade_kingdee_attachment_sync 建表【修复索引超长问题】
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'CREATE TABLE `blade_kingdee_attachment_sync` (
`id` bigint NOT NULL COMMENT ''主键'',
`tenant_id` varchar(12) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''租户ID'',
`biz_type` varchar(32) COLLATE utf8mb4_general_ci NOT NULL COMMENT ''业务单据类型(pay_application/formal_settlement_ap/formal_settlement_ar/invoice_receipt/invoice_application)'',
`biz_id` bigint NOT NULL COMMENT ''业务单据id'',
`attachment_key` varchar(768) COLLATE utf8mb4_general_ci NOT NULL COMMENT ''附件幂等键(用户附件=附件url;发票文件=A801-2的path)'',
`attachment_name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''附件名称(展示/排查用)'',
`kingdee_path` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''金蝶侧文件路径(A902 返回 data.path)'',
`sync_status` tinyint NOT NULL DEFAULT 0 COMMENT ''同步状态:1 成功 / 0 失败'',
`fail_reason` varchar(500) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''失败原因(超限/下载失败/金蝶报错)'',
`sync_time` datetime DEFAULT NULL COMMENT ''最近上传时间'',
`create_user` bigint DEFAULT NULL COMMENT ''创建人'',
`create_dept` bigint DEFAULT NULL COMMENT ''创建部门'',
`create_time` datetime DEFAULT NULL COMMENT ''创建时间'',
`update_user` bigint DEFAULT NULL COMMENT ''修改人'',
`update_time` datetime DEFAULT NULL COMMENT ''修改时间'',
`status` int DEFAULT NULL COMMENT ''业务状态'',
`is_deleted` int DEFAULT 0 COMMENT ''是否已删除'',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_biz_attachment` (`biz_type`,`biz_id`,`attachment_key`(256)),
KEY `idx_biz_type_biz_id` (`biz_type`,`biz_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT=''金蝶附件同步表(A902)''',
'SELECT 1')
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'blade_kingdee_attachment_sync'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
-- ② blade_formal_settlement.kingdee_bill_id
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_formal_settlement` ADD COLUMN `kingdee_bill_id` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''金蝶单据id(星瀚内部主键,A902 附件上传定位用)'' AFTER `kingdee_bill_no`',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'blade_formal_settlement'
AND COLUMN_NAME = 'kingdee_bill_id'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
-- ③ blade_invoice_receipt.kingdee_received_invoice_id
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_invoice_receipt` ADD COLUMN `kingdee_received_invoice_id` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''金蝶收票单id(星瀚内部主键,A902 附件上传定位用)'' AFTER `kingdee_received_invoice_no`',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'blade_invoice_receipt'
AND COLUMN_NAME = 'kingdee_received_invoice_id'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
-- ④ blade_invoice_application.kingdee_bill_id
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_invoice_application` ADD COLUMN `kingdee_bill_id` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''金蝶开票申请单id(星瀚内部主键,A902 附件上传定位用)'' AFTER `kingdee_bill_no`',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'blade_invoice_application'
AND COLUMN_NAME = 'kingdee_bill_id'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
@@ -0,0 +1,50 @@
-- ============================================================
-- blade_invoice_application_sheet_kingdee_bill_no_20260924.sql
-- ============================================================
-- 开票申请同步金蝶按发票张次拆分开票(A303-1 一张发票张次一张开票申请单)
-- blade_invoice_application_sheet.kingdee_bill_no 本张发票对应的金蝶开票申请单编号(A303-1 返回,A303-5 serialNo 查询入口)
-- blade_invoice_application.kingdee_bill_no 多张发票时逗号拼接全部金蝶单号,列加宽至 varchar(500) 防溢出
-- blade_invoice_application_record.kingdee_bill_no 操作记录的同一字段同步加宽,避免多张单号拼接超长导致插入失败
-- 以下结构升级支持重复执行
-- ① blade_invoice_application_sheet.kingdee_bill_no
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_invoice_application_sheet` ADD COLUMN `kingdee_bill_no` varchar(100) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''金蝶开票申请单编号(本张发票对应)'' AFTER `invoice_amount`',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'blade_invoice_application_sheet'
AND COLUMN_NAME = 'kingdee_bill_no'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
-- ② blade_invoice_application.kingdee_bill_no 加宽
SET @ddl_sql = (
SELECT IF(CHARACTER_MAXIMUM_LENGTH < 500,
'ALTER TABLE `blade_invoice_application` MODIFY COLUMN `kingdee_bill_no` varchar(500) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''金蝶开票申请单编号(多张发票逗号拼接)''',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'blade_invoice_application'
AND COLUMN_NAME = 'kingdee_bill_no'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
-- ③ blade_invoice_application_record.kingdee_bill_no 加宽
SET @ddl_sql = (
SELECT IF(CHARACTER_MAXIMUM_LENGTH < 500,
'ALTER TABLE `blade_invoice_application_record` MODIFY COLUMN `kingdee_bill_no` varchar(500) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''金蝶开票申请单编号(多张发票逗号拼接)''',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'blade_invoice_application_record'
AND COLUMN_NAME = 'kingdee_bill_no'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
@@ -0,0 +1,103 @@
-- 收款认领金蝶对接(A301-2 认领公告同步 / A301-3 认领结果推送 / A301-1 收款单回写)
-- 支持重复执行,兼容已执行 DDL 的场景
-- 1. 收款流水表新增金蝶认领公告字段
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_kingdee_receipt_flow` ADD COLUMN `bill_id` bigint(20) DEFAULT NULL COMMENT ''金蝶认领公告id(A301-2返回,A301-3推送必填)'' AFTER `source_updated_time`',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'blade_kingdee_receipt_flow' AND COLUMN_NAME = 'bill_id'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_kingdee_receipt_flow` ADD COLUMN `payer_id` varchar(100) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''金蝶付款人id(A301-3推送用)'' AFTER `bill_id`',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'blade_kingdee_receipt_flow' AND COLUMN_NAME = 'payer_id'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_kingdee_receipt_flow` ADD COLUMN `kingdee_claim_status` varchar(30) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''公告认领状态(A301-2 claimstatus:0未认领/1已认领)'' AFTER `payer_id`',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'blade_kingdee_receipt_flow' AND COLUMN_NAME = 'kingdee_claim_status'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_kingdee_receipt_flow` ADD COLUMN `claim_me` tinyint(1) DEFAULT NULL COMMENT ''我已认领(A301-2 claimme)'' AFTER `kingdee_claim_status`',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'blade_kingdee_receipt_flow' AND COLUMN_NAME = 'claim_me'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_kingdee_receipt_flow` ADD COLUMN `unclaimed_amount` decimal(18,2) NOT NULL DEFAULT ''0.00'' COMMENT ''未认领金额(A301-2 unclaimamount)'' AFTER `claim_me`',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'blade_kingdee_receipt_flow' AND COLUMN_NAME = 'unclaimed_amount'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_kingdee_receipt_flow` ADD COLUMN `fee` decimal(18,2) DEFAULT NULL COMMENT ''手续费(A301-2 fee)'' AFTER `unclaimed_amount`',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'blade_kingdee_receipt_flow' AND COLUMN_NAME = 'fee'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_kingdee_receipt_flow` ADD COLUMN `payee_name` varchar(200) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''收款人(A301-2 recpayee)'' AFTER `fee`',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'blade_kingdee_receipt_flow' AND COLUMN_NAME = 'payee_name'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
-- 2. 认领主单新增来源单据编码(A301-3 awrp_src_code,A301-1 回写匹配键)
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_receipt_claim` ADD COLUMN `awrp_src_code` varchar(100) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''金蝶认领结果推送来源单据编码(awrp_src_code)'' AFTER `kingdee_bill_status`',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'blade_receipt_claim' AND COLUMN_NAME = 'awrp_src_code'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_receipt_claim` ADD KEY `idx_receipt_claim_src_code` (`tenant_id`,`awrp_src_code`)',
'SELECT 1')
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'blade_receipt_claim' AND INDEX_NAME = 'idx_receipt_claim_src_code'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
@@ -0,0 +1,136 @@
-- 收款认领推送金蝶重构(认领本地化 / A301-3 定时+手动推送 / 按流水归集)
-- 支持重复执行,兼容 20260924 脚本已执行/未执行的环境,与该脚本无执行顺序要求
-- 变更点:
-- 1. 收款流水表新增推送域字段(推送状态/失败原因/推送时间/推送编码/金蝶收款单号/回写状态)
-- 2. 认领主单移除 awrp_src_code 及其索引(推送编码上移至流水:分摊结算单号拼接)
-- 3. 收款流水表新增定时任务扫描索引与 A301-1 回写匹配索引
-- 1. 收款流水表:推送状态
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_kingdee_receipt_flow` ADD COLUMN `push_status` varchar(20) COLLATE utf8mb4_general_ci NOT NULL DEFAULT ''none'' COMMENT ''推送状态(none未推送/pushed已推送/failed推送失败)''',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'blade_kingdee_receipt_flow' AND COLUMN_NAME = 'push_status'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
-- 2. 收款流水表:最近一次推送失败原因
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_kingdee_receipt_flow` ADD COLUMN `push_fail_reason` varchar(1000) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''最近一次推送失败原因(成功后清空)''',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'blade_kingdee_receipt_flow' AND COLUMN_NAME = 'push_fail_reason'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
-- 3. 收款流水表:首次推送成功时间
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_kingdee_receipt_flow` ADD COLUMN `pushed_time` datetime DEFAULT NULL COMMENT ''首次推送金蝶成功时间''',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'blade_kingdee_receipt_flow' AND COLUMN_NAME = 'pushed_time'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
-- 4. 收款流水表:推送来源单据编码(A301-3 awrp_src_code,分摊结算单号拼接,A301-1 回写匹配键)
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_kingdee_receipt_flow` ADD COLUMN `awrp_src_code` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''金蝶推送来源单据编码(分摊结算单号下划线拼接,A301-1回写匹配键)''',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'blade_kingdee_receipt_flow' AND COLUMN_NAME = 'awrp_src_code'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
-- 5. 收款流水表:金蝶收款单号(推送响应回填 / A301-1 回写推进)
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_kingdee_receipt_flow` ADD COLUMN `kingdee_bill_no` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''金蝶收款单号''',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'blade_kingdee_receipt_flow' AND COLUMN_NAME = 'kingdee_bill_no'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
-- 6. 收款流水表:金蝶回写状态(A301-1 回写生命周期)
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_kingdee_receipt_flow` ADD COLUMN `kingdee_bill_status` varchar(20) COLLATE utf8mb4_general_ci NOT NULL DEFAULT ''none'' COMMENT ''金蝶回写状态(none未推送/pushed已推送/approved审核通过/received已收款/failed失败)''',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'blade_kingdee_receipt_flow' AND COLUMN_NAME = 'kingdee_bill_status'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
-- 7. 认领主单:删除 awrp_src_code 索引(列上移至流水表;0924 未执行过则本就无此索引)
SET @ddl_sql = (
SELECT IF(COUNT(*) > 0,
'ALTER TABLE `blade_receipt_claim` DROP KEY `idx_receipt_claim_src_code`',
'SELECT 1')
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'blade_receipt_claim' AND INDEX_NAME = 'idx_receipt_claim_src_code'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
-- 8. 认领主单:删除 awrp_src_code 列(0924 未执行过则本就无此列)
SET @ddl_sql = (
SELECT IF(COUNT(*) > 0,
'ALTER TABLE `blade_receipt_claim` DROP COLUMN `awrp_src_code`',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'blade_receipt_claim' AND COLUMN_NAME = 'awrp_src_code'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
-- 9. 收款流水表:定时任务扫描索引(push_status IN (none,failed) AND claim_status='claimed' AND bill_id 非空)
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_kingdee_receipt_flow` ADD KEY `idx_kingdee_receipt_flow_push_scan` (`tenant_id`,`push_status`,`claim_status`)',
'SELECT 1')
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'blade_kingdee_receipt_flow' AND INDEX_NAME = 'idx_kingdee_receipt_flow_push_scan'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
-- 10. 收款流水表:A301-1 回写匹配索引(sourcebillnumber = awrp_src_code)
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_kingdee_receipt_flow` ADD KEY `idx_kingdee_receipt_flow_src_code` (`tenant_id`,`awrp_src_code`)',
'SELECT 1')
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'blade_kingdee_receipt_flow' AND INDEX_NAME = 'idx_kingdee_receipt_flow_src_code'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
-- 11. 按钮权限:收款流水页「推送金蝶」(父级菜单 2090000000000001260 收款流水,排序 4)
INSERT INTO `blade_menu`
(`id`,`parent_id`,`code`,`name`,`alias`,`path`,`source`,`sort`,`category`,`action`,`is_open`,`component`,`remark`,`is_deleted`)
VALUES
(2090000000000001264,2090000000000001260,'receipt_flow_push','推送金蝶','receipt_flow_push','','',4,2,0,1,NULL,'',0)
ON DUPLICATE KEY UPDATE
`name`=VALUES(`name`),
`alias`=VALUES(`alias`),
`is_deleted`=0;
@@ -0,0 +1,65 @@
-- ============================================================
-- blade_invoice_application_invoice_urls_20260930.sql
-- ============================================================
-- 开票申请金蝶发票结果表补充发票文件下载地址(A303-5 返回,正式结算单详情查看/下载发票):
-- invoice_file_url 板式文件下载地址(数电票为OFD,航信百望税盘普通电票为PDF,电子专票/UKey电票为OFD)
-- invoice_image_url PDF图片预览地址
-- invoice_pdf_file_url 数电PDF下载地址(发票云5.0.025版本返回)
-- invoice_xml_file_url 数电XML下载地址(发票云5.0.025版本返回)
-- 以下结构升级支持重复执行
-- ① blade_invoice_application_invoice.invoice_file_url
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_invoice_application_invoice` ADD COLUMN `invoice_file_url` varchar(1024) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''板式文件下载地址(数电票为OFD,普通电票为PDF,电子专票为OFD)'' AFTER `invoice_amount`',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'blade_invoice_application_invoice'
AND COLUMN_NAME = 'invoice_file_url'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
-- ② blade_invoice_application_invoice.invoice_image_url
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_invoice_application_invoice` ADD COLUMN `invoice_image_url` varchar(1024) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''PDF图片预览地址'' AFTER `invoice_file_url`',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'blade_invoice_application_invoice'
AND COLUMN_NAME = 'invoice_image_url'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
-- ③ blade_invoice_application_invoice.invoice_pdf_file_url
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_invoice_application_invoice` ADD COLUMN `invoice_pdf_file_url` varchar(1024) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''数电PDF下载地址(发票云5.0.025版本返回)'' AFTER `invoice_image_url`',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'blade_invoice_application_invoice'
AND COLUMN_NAME = 'invoice_pdf_file_url'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
-- ④ blade_invoice_application_invoice.invoice_xml_file_url
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_invoice_application_invoice` ADD COLUMN `invoice_xml_file_url` varchar(1024) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''数电XML下载地址(发票云5.0.025版本返回)'' AFTER `invoice_pdf_file_url`',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'blade_invoice_application_invoice'
AND COLUMN_NAME = 'invoice_xml_file_url'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
@@ -0,0 +1,46 @@
-- 金蝶票池选票回切镜像读:镜像表新增可用过滤列 + 认领过滤索引
-- available_amount 剩余可用金额(A801-1 availableAmount,金蝶可用税额口径,选票本地过滤 >0)
-- amount_use_status 金额使用状态(A801-1 amountUseStatus,'0' 未使用可选 / '2' 全部使用)
-- 由定时同步(InvoiceReceiptKingdeeSyncTask)/ 手动同步端点 / 票号回源 / 收票保存重查 统一按 tenant_id + invoice_no upsert 回填;
-- 存量存根行两列为 NULL,不参与选票(可用过滤为 NULL 排除),随增量窗口同步自然回填
-- 认领过滤 EXISTS 子查询补 (tenant_id, invoice_no) 索引,避免统一查询全表扫
-- 以下结构升级支持重复执行
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_kingdee_invoice_pool` ADD COLUMN `available_amount` decimal(18,2) DEFAULT NULL COMMENT ''剩余可用金额(A801-1 availableAmount,金蝶可用税额口径)'' AFTER `source_updated_time`',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'blade_kingdee_invoice_pool'
AND COLUMN_NAME = 'available_amount'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_kingdee_invoice_pool` ADD COLUMN `amount_use_status` varchar(8) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''金额使用状态(0 未使用 / 2 全部使用)'' AFTER `available_amount`',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'blade_kingdee_invoice_pool'
AND COLUMN_NAME = 'amount_use_status'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
SET @idx_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_formal_settlement_invoice` ADD INDEX `idx_settlement_invoice_no` (`tenant_id`, `invoice_no`)',
'SELECT 1')
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'blade_formal_settlement_invoice'
AND INDEX_NAME = 'idx_settlement_invoice_no'
);
PREPARE idx_stmt FROM @idx_sql;
EXECUTE idx_stmt;
DEALLOCATE PREPARE idx_stmt;
@@ -0,0 +1,32 @@
-- 金蝶单据锁定记录表:lockBusiData 锁定 / unLockNotifyBusiData 解锁回调 / 锁定补偿
-- 一行 = 一张金蝶目标单:锁定留痕(人/时间/失败原因)+ 当前锁状态(编辑守卫/回调定位/补偿扫表)
-- lock_status:failed-锁定失败(补偿重试对象)/ locked-金蝶锁定中 / unlocked-已解锁(终态)
CREATE TABLE `blade_kingdee_bill_lock` (
`id` bigint NOT NULL COMMENT '主键',
`tenant_id` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '000000' COMMENT '租户ID',
`source_bill_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'WLTMS单据类型:SETTLEMENT正式结算单/INVOICE_APPLY开票申请单(预留PAY_APPLY付款申请单/RECEIVED_INVOICE收票单)',
`source_bill_id` bigint NOT NULL COMMENT 'WLTMS业务主键',
`source_bill_no` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'WLTMS单号',
`target_bill_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '金蝶单据类型:ApFin_other_BT_S应付单/arfin_other_BT_S应收单/cdm_paybill_bank_elect_BT_S开票单等固定值',
`target_bill_no` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '金蝶单据编号(开票申请按发票张次逐张一行)',
`lock_status` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '锁状态:failed锁定失败/locked金蝶锁定中/unlocked已解锁',
`operation_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '最近动作来源操作类型:SAVE单据新增/DELETE单据删除',
`try_count` int DEFAULT '0' COMMENT '锁定重试次数(补偿任务用,超上限停试)',
`lock_time` datetime DEFAULT NULL COMMENT '锁定时间',
`unlock_time` datetime DEFAULT NULL COMMENT '解锁时间',
`lock_operator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '推单发起人(锁定操作人)',
`notify_operator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '回调操作人(金蝶侧操作人)',
`fail_reason` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '锁定失败原因',
`create_user` bigint DEFAULT NULL COMMENT '创建人',
`create_dept` bigint DEFAULT NULL COMMENT '创建部门',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_user` bigint DEFAULT NULL COMMENT '修改人',
`update_time` datetime DEFAULT NULL COMMENT '修改时间',
`status` int DEFAULT NULL COMMENT '状态',
`is_deleted` int DEFAULT '0' COMMENT '是否已删除',
PRIMARY KEY (`id`),
INDEX `idx_kbl_source` (`source_bill_type`, `source_bill_id`),
INDEX `idx_kbl_target` (`target_bill_type`, `target_bill_no`),
INDEX `idx_kbl_status` (`lock_status`, `try_count`)
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '金蝶单据锁定记录' ROW_FORMAT = DYNAMIC;
@@ -0,0 +1,443 @@
-- 统计指定账号在指定日期内、各业务模块创建的数据量
--
-- 使用前只改下面两个日期(含首尾)。单日统计时两个日期填同一天。
-- 统计口径:
-- 1. 按 blade_user.account 找到用户 ID,再按各业务主表 create_user、create_time 计数。
-- 2. 同一账号若存在多个用户 ID(含已删除账号),历史数据会一并计入该账号。
-- 3. 只统计各功能列表对应的主表。随主单保存的明细、联系人、附件、变更流水不重复计数。
-- 4. 含已逻辑删除的数据,因为这些记录确实被创建过。
-- 5. 客商档案菜单挂在「车/船务管理」下,这里按统计口径单独计入「客商管理」。
-- 6. 未纳入:结算管理、首付款管理、在途管理,以及系统管理下的开票项目。
-- 7. 导入运单产生的运单计入「业务模块-运单管理」,不另计导入批次。
SET NAMES utf8mb4;
SET @stat_start = '2026-09-29';
SET @stat_end = '2026-09-29';
SET @stat_end_exclusive = DATE_ADD(@stat_end, INTERVAL 1 DAY);
DROP TEMPORARY TABLE IF EXISTS tmp_stat_account;
CREATE TEMPORARY TABLE tmp_stat_account (
sort_no INT NOT NULL,
account VARCHAR(45) NOT NULL,
PRIMARY KEY (account)
);
INSERT INTO tmp_stat_account (sort_no, account) VALUES
(1, 'zhanghu01'),
(2, 'zhanghu02'),
(3, 'zhanghu03'),
(4, 'zhanghu04'),
(5, 'zhanghu05'),
(6, 'zhanghu06'),
(7, 'zhanghu07'),
(8, 'zhanghu08'),
(9, 'zhanghu09'),
(10, 'zhanghu10'),
(11, 'zhanghu11'),
(12, 'zhanghu12'),
(13, 'zhanghu13'),
(14, 'zhanghu14'),
(15, 'zhanghu15'),
(16, 'zhanghu16');
DROP TEMPORARY TABLE IF EXISTS tmp_stat_user;
CREATE TEMPORARY TABLE tmp_stat_user AS
SELECT u.id, u.account, u.real_name, u.tenant_id, u.is_deleted, a.sort_no
FROM blade_user u
INNER JOIN tmp_stat_account a ON a.account = u.account;
ALTER TABLE tmp_stat_user ADD PRIMARY KEY (id);
ALTER TABLE tmp_stat_user ADD INDEX idx_tmp_stat_user_account (account);
DROP TEMPORARY TABLE IF EXISTS tmp_stat_detail;
CREATE TEMPORARY TABLE tmp_stat_detail (
create_user BIGINT NOT NULL,
module_sort INT NOT NULL,
module_name VARCHAR(32) NOT NULL,
biz_sort INT NOT NULL,
biz_name VARCHAR(64) NOT NULL,
table_name VARCHAR(64) NOT NULL,
cnt BIGINT NOT NULL,
KEY idx_tmp_stat_detail_user (create_user)
);
-- 每张表单独插入。MySQL 不允许同一条语句多次打开临时表。
INSERT INTO tmp_stat_detail (create_user, module_sort, module_name, biz_sort, biz_name, table_name, cnt)
SELECT t.create_user, 1, '基础配置', 1, '客商类型', 'blade_customer_type', COUNT(*)
FROM blade_customer_type t
INNER JOIN tmp_stat_user u ON u.id = t.create_user
WHERE t.create_time >= @stat_start AND t.create_time < @stat_end_exclusive
GROUP BY t.create_user
;
INSERT INTO tmp_stat_detail (create_user, module_sort, module_name, biz_sort, biz_name, table_name, cnt)
SELECT t.create_user, 1, '基础配置', 2, '费用项', 'blade_fee_item', COUNT(*)
FROM blade_fee_item t
INNER JOIN tmp_stat_user u ON u.id = t.create_user
WHERE t.create_time >= @stat_start AND t.create_time < @stat_end_exclusive
GROUP BY t.create_user
;
INSERT INTO tmp_stat_detail (create_user, module_sort, module_name, biz_sort, biz_name, table_name, cnt)
SELECT t.create_user, 1, '基础配置', 3, '币种汇率管理', 'blade_currency', COUNT(*)
FROM blade_currency t
INNER JOIN tmp_stat_user u ON u.id = t.create_user
WHERE t.create_time >= @stat_start AND t.create_time < @stat_end_exclusive
GROUP BY t.create_user
;
INSERT INTO tmp_stat_detail (create_user, module_sort, module_name, biz_sort, biz_name, table_name, cnt)
SELECT t.create_user, 1, '基础配置', 4, '计量单位', 'blade_measurement_unit', COUNT(*)
FROM blade_measurement_unit t
INNER JOIN tmp_stat_user u ON u.id = t.create_user
WHERE t.create_time >= @stat_start AND t.create_time < @stat_end_exclusive
GROUP BY t.create_user
;
INSERT INTO tmp_stat_detail (create_user, module_sort, module_name, biz_sort, biz_name, table_name, cnt)
SELECT t.create_user, 1, '基础配置', 5, '货物类型', 'blade_cargo_type', COUNT(*)
FROM blade_cargo_type t
INNER JOIN tmp_stat_user u ON u.id = t.create_user
WHERE t.create_time >= @stat_start AND t.create_time < @stat_end_exclusive
GROUP BY t.create_user
;
INSERT INTO tmp_stat_detail (create_user, module_sort, module_name, biz_sort, biz_name, table_name, cnt)
SELECT t.create_user, 1, '基础配置', 6, '行政区划', 'blade_region', COUNT(*)
FROM blade_region t
INNER JOIN tmp_stat_user u ON u.id = t.create_user
WHERE t.create_time >= @stat_start AND t.create_time < @stat_end_exclusive
GROUP BY t.create_user
;
INSERT INTO tmp_stat_detail (create_user, module_sort, module_name, biz_sort, biz_name, table_name, cnt)
SELECT t.create_user, 1, '基础配置', 7, '港口码头主数据', 'blade_port_terminal', COUNT(*)
FROM blade_port_terminal t
INNER JOIN tmp_stat_user u ON u.id = t.create_user
WHERE t.create_time >= @stat_start AND t.create_time < @stat_end_exclusive
GROUP BY t.create_user
;
INSERT INTO tmp_stat_detail (create_user, module_sort, module_name, biz_sort, biz_name, table_name, cnt)
SELECT t.create_user, 1, '基础配置', 8, '空港机场主数据', 'blade_airport_master', COUNT(*)
FROM blade_airport_master t
INNER JOIN tmp_stat_user u ON u.id = t.create_user
WHERE t.create_time >= @stat_start AND t.create_time < @stat_end_exclusive
GROUP BY t.create_user
;
INSERT INTO tmp_stat_detail (create_user, module_sort, module_name, biz_sort, biz_name, table_name, cnt)
SELECT t.create_user, 1, '基础配置', 9, '铁路车站主数据', 'blade_railway_station', COUNT(*)
FROM blade_railway_station t
INNER JOIN tmp_stat_user u ON u.id = t.create_user
WHERE t.create_time >= @stat_start AND t.create_time < @stat_end_exclusive
GROUP BY t.create_user
;
INSERT INTO tmp_stat_detail (create_user, module_sort, module_name, biz_sort, biz_name, table_name, cnt)
SELECT t.create_user, 1, '基础配置', 10, '保险OCR识别模板', 'blade_insurance_ocr_template', COUNT(*)
FROM blade_insurance_ocr_template t
INNER JOIN tmp_stat_user u ON u.id = t.create_user
WHERE t.create_time >= @stat_start AND t.create_time < @stat_end_exclusive
GROUP BY t.create_user
;
INSERT INTO tmp_stat_detail (create_user, module_sort, module_name, biz_sort, biz_name, table_name, cnt)
SELECT t.create_user, 2, '基础数据', 1, '常用地址', 'blade_common_address', COUNT(*)
FROM blade_common_address t
INNER JOIN tmp_stat_user u ON u.id = t.create_user
WHERE t.create_time >= @stat_start AND t.create_time < @stat_end_exclusive
GROUP BY t.create_user
;
INSERT INTO tmp_stat_detail (create_user, module_sort, module_name, biz_sort, biz_name, table_name, cnt)
SELECT t.create_user, 3, '客商管理', 1, '客商档案', 'blade_customer_archive', COUNT(*)
FROM blade_customer_archive t
INNER JOIN tmp_stat_user u ON u.id = t.create_user
WHERE t.create_time >= @stat_start AND t.create_time < @stat_end_exclusive
GROUP BY t.create_user
;
INSERT INTO tmp_stat_detail (create_user, module_sort, module_name, biz_sort, biz_name, table_name, cnt)
SELECT t.create_user, 4, '项目管理', 1, '项目管理', 'blade_project_apply', COUNT(*)
FROM blade_project_apply t
INNER JOIN tmp_stat_user u ON u.id = t.create_user
WHERE t.create_time >= @stat_start AND t.create_time < @stat_end_exclusive
GROUP BY t.create_user
;
INSERT INTO tmp_stat_detail (create_user, module_sort, module_name, biz_sort, biz_name, table_name, cnt)
SELECT t.create_user, 4, '项目管理', 2, '临时额度管理', 'blade_temporary_credit_limit', COUNT(*)
FROM blade_temporary_credit_limit t
INNER JOIN tmp_stat_user u ON u.id = t.create_user
WHERE t.create_time >= @stat_start AND t.create_time < @stat_end_exclusive
GROUP BY t.create_user
;
INSERT INTO tmp_stat_detail (create_user, module_sort, module_name, biz_sort, biz_name, table_name, cnt)
SELECT t.create_user, 5, '合同模块', 1, '合同管理', 'blade_contract_manage', COUNT(*)
FROM blade_contract_manage t
INNER JOIN tmp_stat_user u ON u.id = t.create_user
WHERE t.create_time >= @stat_start AND t.create_time < @stat_end_exclusive
GROUP BY t.create_user
;
INSERT INTO tmp_stat_detail (create_user, module_sort, module_name, biz_sort, biz_name, table_name, cnt)
SELECT t.create_user, 6, '业务模块', 1, '常用货物', 'blade_common_cargo', COUNT(*)
FROM blade_common_cargo t
INNER JOIN tmp_stat_user u ON u.id = t.create_user
WHERE t.create_time >= @stat_start AND t.create_time < @stat_end_exclusive
GROUP BY t.create_user
;
INSERT INTO tmp_stat_detail (create_user, module_sort, module_name, biz_sort, biz_name, table_name, cnt)
SELECT t.create_user, 6, '业务模块', 2, '常用线路', 'blade_common_route', COUNT(*)
FROM blade_common_route t
INNER JOIN tmp_stat_user u ON u.id = t.create_user
WHERE t.create_time >= @stat_start AND t.create_time < @stat_end_exclusive
GROUP BY t.create_user
;
INSERT INTO tmp_stat_detail (create_user, module_sort, module_name, biz_sort, biz_name, table_name, cnt)
SELECT t.create_user, 6, '业务模块', 3, '发货模板', 'blade_shipping_template', COUNT(*)
FROM blade_shipping_template t
INNER JOIN tmp_stat_user u ON u.id = t.create_user
WHERE t.create_time >= @stat_start AND t.create_time < @stat_end_exclusive
GROUP BY t.create_user
;
INSERT INTO tmp_stat_detail (create_user, module_sort, module_name, biz_sort, biz_name, table_name, cnt)
SELECT t.create_user, 6, '业务模块', 4, '过程配置', 'blade_process_config', COUNT(*)
FROM blade_process_config t
INNER JOIN tmp_stat_user u ON u.id = t.create_user
WHERE t.create_time >= @stat_start AND t.create_time < @stat_end_exclusive
GROUP BY t.create_user
;
INSERT INTO tmp_stat_detail (create_user, module_sort, module_name, biz_sort, biz_name, table_name, cnt)
SELECT t.create_user, 6, '业务模块', 5, '总单管理', 'blade_master_order', COUNT(*)
FROM blade_master_order t
INNER JOIN tmp_stat_user u ON u.id = t.create_user
WHERE t.create_time >= @stat_start AND t.create_time < @stat_end_exclusive
GROUP BY t.create_user
;
INSERT INTO tmp_stat_detail (create_user, module_sort, module_name, biz_sort, biz_name, table_name, cnt)
SELECT t.create_user, 6, '业务模块', 6, '运输计划', 'blade_transport_plan', COUNT(*)
FROM blade_transport_plan t
INNER JOIN tmp_stat_user u ON u.id = t.create_user
WHERE t.create_time >= @stat_start AND t.create_time < @stat_end_exclusive
GROUP BY t.create_user
;
INSERT INTO tmp_stat_detail (create_user, module_sort, module_name, biz_sort, biz_name, table_name, cnt)
SELECT t.create_user, 6, '业务模块', 7, '配载管理', 'blade_loading_manage', COUNT(*)
FROM blade_loading_manage t
INNER JOIN tmp_stat_user u ON u.id = t.create_user
WHERE t.create_time >= @stat_start AND t.create_time < @stat_end_exclusive
GROUP BY t.create_user
;
INSERT INTO tmp_stat_detail (create_user, module_sort, module_name, biz_sort, biz_name, table_name, cnt)
SELECT t.create_user, 6, '业务模块', 8, '运单管理', 'blade_waybill', COUNT(*)
FROM blade_waybill t
INNER JOIN tmp_stat_user u ON u.id = t.create_user
WHERE t.create_time >= @stat_start AND t.create_time < @stat_end_exclusive
GROUP BY t.create_user
;
INSERT INTO tmp_stat_detail (create_user, module_sort, module_name, biz_sort, biz_name, table_name, cnt)
SELECT t.create_user, 6, '业务模块', 9, '凭证管理', 'blade_voucher_manage', COUNT(*)
FROM blade_voucher_manage t
INNER JOIN tmp_stat_user u ON u.id = t.create_user
WHERE t.create_time >= @stat_start AND t.create_time < @stat_end_exclusive
GROUP BY t.create_user
;
INSERT INTO tmp_stat_detail (create_user, module_sort, module_name, biz_sort, biz_name, table_name, cnt)
SELECT t.create_user, 7, '车/船务模块', 1, '设备台账', 'blade_equipment_ledger', COUNT(*)
FROM blade_equipment_ledger t
INNER JOIN tmp_stat_user u ON u.id = t.create_user
WHERE t.create_time >= @stat_start AND t.create_time < @stat_end_exclusive
GROUP BY t.create_user
;
INSERT INTO tmp_stat_detail (create_user, module_sort, module_name, biz_sort, biz_name, table_name, cnt)
SELECT t.create_user, 7, '车/船务模块', 2, '保险记录', 'blade_insurance_record', COUNT(*)
FROM blade_insurance_record t
INNER JOIN tmp_stat_user u ON u.id = t.create_user
WHERE t.create_time >= @stat_start AND t.create_time < @stat_end_exclusive
GROUP BY t.create_user
;
INSERT INTO tmp_stat_detail (create_user, module_sort, module_name, biz_sort, biz_name, table_name, cnt)
SELECT t.create_user, 7, '车/船务模块', 3, '年检记录', 'blade_annual_inspection_record', COUNT(*)
FROM blade_annual_inspection_record t
INNER JOIN tmp_stat_user u ON u.id = t.create_user
WHERE t.create_time >= @stat_start AND t.create_time < @stat_end_exclusive
GROUP BY t.create_user
;
INSERT INTO tmp_stat_detail (create_user, module_sort, module_name, biz_sort, biz_name, table_name, cnt)
SELECT t.create_user, 7, '车/船务模块', 4, '保养记录', 'blade_vehicle_maintenance_plan', COUNT(*)
FROM blade_vehicle_maintenance_plan t
INNER JOIN tmp_stat_user u ON u.id = t.create_user
WHERE t.create_time >= @stat_start AND t.create_time < @stat_end_exclusive
GROUP BY t.create_user
;
INSERT INTO tmp_stat_detail (create_user, module_sort, module_name, biz_sort, biz_name, table_name, cnt)
SELECT t.create_user, 7, '车/船务模块', 5, '维修记录', 'blade_vehicle_maintenance_record', COUNT(*)
FROM blade_vehicle_maintenance_record t
INNER JOIN tmp_stat_user u ON u.id = t.create_user
WHERE t.create_time >= @stat_start AND t.create_time < @stat_end_exclusive
GROUP BY t.create_user
;
INSERT INTO tmp_stat_detail (create_user, module_sort, module_name, biz_sort, biz_name, table_name, cnt)
SELECT t.create_user, 7, '车/船务模块', 6, '违章记录', 'blade_violation_record', COUNT(*)
FROM blade_violation_record t
INNER JOIN tmp_stat_user u ON u.id = t.create_user
WHERE t.create_time >= @stat_start AND t.create_time < @stat_end_exclusive
GROUP BY t.create_user
;
INSERT INTO tmp_stat_detail (create_user, module_sort, module_name, biz_sort, biz_name, table_name, cnt)
SELECT t.create_user, 7, '车/船务模块', 7, '事故记录', 'blade_accident_record', COUNT(*)
FROM blade_accident_record t
INNER JOIN tmp_stat_user u ON u.id = t.create_user
WHERE t.create_time >= @stat_start AND t.create_time < @stat_end_exclusive
GROUP BY t.create_user
;
INSERT INTO tmp_stat_detail (create_user, module_sort, module_name, biz_sort, biz_name, table_name, cnt)
SELECT t.create_user, 7, '车/船务模块', 8, 'ETC记录', 'blade_etc_record', COUNT(*)
FROM blade_etc_record t
INNER JOIN tmp_stat_user u ON u.id = t.create_user
WHERE t.create_time >= @stat_start AND t.create_time < @stat_end_exclusive
GROUP BY t.create_user
;
INSERT INTO tmp_stat_detail (create_user, module_sort, module_name, biz_sort, biz_name, table_name, cnt)
SELECT t.create_user, 7, '车/船务模块', 9, '油电记录', 'blade_oil_electric_record', COUNT(*)
FROM blade_oil_electric_record t
INNER JOIN tmp_stat_user u ON u.id = t.create_user
WHERE t.create_time >= @stat_start AND t.create_time < @stat_end_exclusive
GROUP BY t.create_user
;
INSERT INTO tmp_stat_detail (create_user, module_sort, module_name, biz_sort, biz_name, table_name, cnt)
SELECT t.create_user, 7, '车/船务模块', 10, '里程记录', 'blade_mileage_record', COUNT(*)
FROM blade_mileage_record t
INNER JOIN tmp_stat_user u ON u.id = t.create_user
WHERE t.create_time >= @stat_start AND t.create_time < @stat_end_exclusive
GROUP BY t.create_user
;
INSERT INTO tmp_stat_detail (create_user, module_sort, module_name, biz_sort, biz_name, table_name, cnt)
SELECT t.create_user, 7, '车/船务模块', 11, '换胎记录', 'blade_tire_replacement_record', COUNT(*)
FROM blade_tire_replacement_record t
INNER JOIN tmp_stat_user u ON u.id = t.create_user
WHERE t.create_time >= @stat_start AND t.create_time < @stat_end_exclusive
GROUP BY t.create_user
;
INSERT INTO tmp_stat_detail (create_user, module_sort, module_name, biz_sort, biz_name, table_name, cnt)
SELECT t.create_user, 7, '车/船务模块', 12, '其他费用记录', 'blade_other_expense_record', COUNT(*)
FROM blade_other_expense_record t
INNER JOIN tmp_stat_user u ON u.id = t.create_user
WHERE t.create_time >= @stat_start AND t.create_time < @stat_end_exclusive
GROUP BY t.create_user
;
INSERT INTO tmp_stat_detail (create_user, module_sort, module_name, biz_sort, biz_name, table_name, cnt)
SELECT t.create_user, 7, '车/船务模块', 13, '变更记录', 'blade_transport_change_record', COUNT(*)
FROM blade_transport_change_record t
INNER JOIN tmp_stat_user u ON u.id = t.create_user
WHERE t.create_time >= @stat_start AND t.create_time < @stat_end_exclusive
GROUP BY t.create_user
;
INSERT INTO tmp_stat_detail (create_user, module_sort, module_name, biz_sort, biz_name, table_name, cnt)
SELECT t.create_user, 7, '车/船务模块', 14, '评分量化表', 'blade_credit_score_quantification', COUNT(*)
FROM blade_credit_score_quantification t
INNER JOIN tmp_stat_user u ON u.id = t.create_user
WHERE t.create_time >= @stat_start AND t.create_time < @stat_end_exclusive
GROUP BY t.create_user
;
INSERT INTO tmp_stat_detail (create_user, module_sort, module_name, biz_sort, biz_name, table_name, cnt)
SELECT t.create_user, 8, '运力模块', 1, '车辆管理', 'blade_transport_vehicle', COUNT(*)
FROM blade_transport_vehicle t
INNER JOIN tmp_stat_user u ON u.id = t.create_user
WHERE t.create_time >= @stat_start AND t.create_time < @stat_end_exclusive
GROUP BY t.create_user
;
INSERT INTO tmp_stat_detail (create_user, module_sort, module_name, biz_sort, biz_name, table_name, cnt)
SELECT t.create_user, 8, '运力模块', 2, '船舶管理', 'blade_transport_ship', COUNT(*)
FROM blade_transport_ship t
INNER JOIN tmp_stat_user u ON u.id = t.create_user
WHERE t.create_time >= @stat_start AND t.create_time < @stat_end_exclusive
GROUP BY t.create_user
;
INSERT INTO tmp_stat_detail (create_user, module_sort, module_name, biz_sort, biz_name, table_name, cnt)
SELECT t.create_user, 8, '运力模块', 3, '司机管理', 'blade_transport_driver', COUNT(*)
FROM blade_transport_driver t
INNER JOIN tmp_stat_user u ON u.id = t.create_user
WHERE t.create_time >= @stat_start AND t.create_time < @stat_end_exclusive
GROUP BY t.create_user
;
INSERT INTO tmp_stat_detail (create_user, module_sort, module_name, biz_sort, biz_name, table_name, cnt)
SELECT t.create_user, 8, '运力模块', 4, '车辆调度', 'blade_transport_vehicle_dispatch', COUNT(*)
FROM blade_transport_vehicle_dispatch t
INNER JOIN tmp_stat_user u ON u.id = t.create_user
WHERE t.create_time >= @stat_start AND t.create_time < @stat_end_exclusive
GROUP BY t.create_user;
-- 结果 1:账号匹配情况。用户 ID 为空表示库中没有该账号。
SELECT
a.sort_no AS `序号`,
a.account AS `账号`,
u.id AS `用户ID`,
u.real_name AS `姓名`,
u.tenant_id AS `租户`,
CASE WHEN u.id IS NULL THEN '未找到' WHEN u.is_deleted = 0 THEN '正常' ELSE '已删除' END AS `账号状态`
FROM tmp_stat_account a
LEFT JOIN tmp_stat_user u ON u.account = a.account
ORDER BY a.sort_no, u.id;
-- 结果 2:按账号、模块汇总创建数量。
SELECT
a.account AS `账号`,
IFNULL(GROUP_CONCAT(DISTINCT NULLIF(u.real_name, '') ORDER BY u.id SEPARATOR '、'), '') AS `姓名`,
IFNULL(SUM(CASE WHEN d.module_name = '基础配置' THEN d.cnt ELSE 0 END), 0) AS `基础配置`,
IFNULL(SUM(CASE WHEN d.module_name = '基础数据' THEN d.cnt ELSE 0 END), 0) AS `基础数据`,
IFNULL(SUM(CASE WHEN d.module_name = '客商管理' THEN d.cnt ELSE 0 END), 0) AS `客商管理`,
IFNULL(SUM(CASE WHEN d.module_name = '项目管理' THEN d.cnt ELSE 0 END), 0) AS `项目管理`,
IFNULL(SUM(CASE WHEN d.module_name = '合同模块' THEN d.cnt ELSE 0 END), 0) AS `合同模块`,
IFNULL(SUM(CASE WHEN d.module_name = '业务模块' THEN d.cnt ELSE 0 END), 0) AS `业务模块`,
IFNULL(SUM(CASE WHEN d.module_name = '车/船务模块' THEN d.cnt ELSE 0 END), 0) AS `车/船务模块`,
IFNULL(SUM(CASE WHEN d.module_name = '运力模块' THEN d.cnt ELSE 0 END), 0) AS `运力模块`,
IFNULL(SUM(d.cnt), 0) AS `合计`
FROM tmp_stat_account a
LEFT JOIN tmp_stat_user u ON u.account = a.account
LEFT JOIN tmp_stat_detail d ON d.create_user = u.id
GROUP BY a.sort_no, a.account
ORDER BY a.sort_no;
-- 结果 3:按账号、功能展开,只显示创建数量大于 0 的项。
SELECT
a.account AS `账号`,
d.module_name AS `模块`,
d.biz_name AS `功能`,
d.table_name AS `数据表`,
SUM(d.cnt) AS `创建数量`
FROM tmp_stat_account a
INNER JOIN tmp_stat_user u ON u.account = a.account
INNER JOIN tmp_stat_detail d ON d.create_user = u.id
GROUP BY a.sort_no, a.account, d.module_sort, d.module_name, d.biz_sort, d.biz_name, d.table_name
ORDER BY a.sort_no, d.module_sort, d.biz_sort;
+3 -3
View File
@@ -1420,7 +1420,7 @@ CREATE TABLE `blade_railway_station` (
`id` bigint(20) NOT NULL COMMENT '主键',
`code` varchar(20) NOT NULL COMMENT '编码',
`tmis_code` varchar(5) NOT NULL COMMENT 'TMIS国标编码',
`telegraph_code` varchar(3) NOT NULL COMMENT '电报码',
`telegraph_code` varchar(3) DEFAULT NULL COMMENT '电报码',
`name` varchar(100) NOT NULL COMMENT '车站名称',
`railway_line` varchar(100) DEFAULT NULL COMMENT '所属铁路线路',
`province_code` varchar(12) DEFAULT NULL COMMENT '所属省份编码',
@@ -5422,11 +5422,11 @@ CREATE TABLE `blade_user` (
`real_name` varchar(10) DEFAULT NULL COMMENT '真名',
`avatar` varchar(500) DEFAULT NULL COMMENT '头像',
`email` varchar(45) DEFAULT NULL COMMENT '邮箱',
`phone` varchar(45) DEFAULT NULL COMMENT '手机',
`phone` varchar(500) DEFAULT NULL COMMENT '手机',
`birthday` datetime DEFAULT NULL COMMENT '生日',
`sex` int(11) DEFAULT NULL COMMENT '性别',
`role_id` varchar(1000) DEFAULT NULL COMMENT '角色id',
`dept_id` varchar(1000) DEFAULT NULL COMMENT '部门id',
`dept_id` varchar(2000) DEFAULT NULL COMMENT '部门id',
`post_id` varchar(1000) DEFAULT NULL COMMENT '岗位id',
`leader_id` varchar(1000) DEFAULT NULL COMMENT '主管id',
`is_leader` int(11) DEFAULT '0' COMMENT '是否主管',