Merge remote-tracking branch 'origin/feature/20261019-bfi-all' into feature/hcs-api-p0

# Conflicts:
#	blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/PaymentApplicationServiceImpl.java
This commit is contained in:
刘泉佳
2026-10-22 09:39:06 +08:00
250 changed files with 23455 additions and 1479 deletions
+4 -1
View File
@@ -305,6 +305,7 @@ CREATE TABLE `blade_dept` (
`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 '合同编码前缀',
`contract_initial_serial` int 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 '助记码',
@@ -1324,7 +1325,9 @@ CREATE TABLE `blade_user_dept` (
`oa_id` varchar(64) NULL DEFAULT NULL COMMENT 'OA人员ID',
`oa_login_id` varchar(128) NULL DEFAULT NULL COMMENT 'OA登录账号',
`sync_time` datetime NULL DEFAULT NULL COMMENT '同步时间',
PRIMARY KEY (`id`) USING BTREE
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_blade_user_dept_user` (`user_id`, `is_deleted`, `status`) USING BTREE,
INDEX `idx_blade_user_dept_dept` (`dept_id`, `is_deleted`, `status`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户部门表';
-- ----------------------------
@@ -9,8 +9,16 @@ ALTER TABLE `blade_customer_archive`
CREATE INDEX idx_kingdee_status ON blade_customer_archive (kingdee_status);
-- 列表「同步金蝶」按钮权限(审批通过后推送失败的重推入口;parent_id 通过菜单 code 关联,避免写死 id)
-- 列表「同步金蝶」按钮权限(审批通过且未推送/推送失败时可点;parent_id 通过菜单 code 关联)
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
SELECT 2077600000000000011, m.id, 'customer_archive_sync', '同步金蝶', 'customer_archive_sync', '', '', 10, 2, 0, 1, NULL, '', 0
FROM blade_menu m
WHERE m.code = 'customer_archive' AND m.is_deleted = 0;
WHERE m.code = 'customer_archive' AND m.is_deleted = 0
LIMIT 1
ON DUPLICATE KEY UPDATE
parent_id = VALUES(parent_id),
name = VALUES(name),
alias = VALUES(alias),
sort = VALUES(sort),
category = VALUES(category),
is_deleted = 0;
@@ -0,0 +1,22 @@
-- 修复「同步金蝶」按钮菜单:按 code 幂等补齐/纠正,避免权限勾了但不生效
-- 执行后需:角色重新勾选「同步金蝶」→ 用户重新登录
INSERT INTO blade_menu (id, parent_id, code, name, alias, path, source, sort, category, action, is_open, component, remark, is_deleted)
SELECT 2077600000000000011, m.id, 'customer_archive_sync', '同步金蝶', 'customer_archive_sync', '', '', 10, 2, 0, 1, NULL, '', 0
FROM blade_menu m
WHERE m.code = 'customer_archive' AND m.is_deleted = 0
AND NOT EXISTS (
SELECT 1 FROM blade_menu x WHERE x.code = 'customer_archive_sync' AND x.is_deleted = 0
)
LIMIT 1;
UPDATE blade_menu child
INNER JOIN blade_menu parent ON parent.code = 'customer_archive' AND parent.is_deleted = 0
SET
child.parent_id = parent.id,
child.name = '同步金蝶',
child.alias = 'customer_archive_sync',
child.category = 2,
child.sort = 10,
child.is_deleted = 0
WHERE child.code = 'customer_archive_sync';
@@ -0,0 +1,3 @@
-- 组织机构新增合同初始流水号:该部门当年首个合同从此流水号起编,后续递增
ALTER TABLE `blade_dept`
ADD COLUMN `contract_initial_serial` int(11) DEFAULT NULL COMMENT '合同初始流水号' AFTER `contract_code_prefix`;
@@ -44,7 +44,9 @@ CREATE TABLE IF NOT EXISTS `blade_formal_settlement_change_record` (
`update_user` bigint(20) DEFAULT NULL, `update_time` datetime DEFAULT NULL, `status` int(11) DEFAULT '1', `is_deleted` int(11) DEFAULT '0',
`formal_settlement_id` bigint(20) NOT NULL COMMENT '正式结算单ID', `change_type` varchar(50) NOT NULL COMMENT '变更类型',
`line_no` int(11) DEFAULT NULL COMMENT '行号', `operation_type` varchar(30) NOT NULL COMMENT '操作类型',
`change_content` text NOT NULL COMMENT '变更内容', `change_reason` varchar(200) DEFAULT NULL COMMENT '变更原因',
`change_content` text NOT NULL COMMENT '变更内容',
`before_data` longtext COMMENT '变更前数据JSON', `after_data` longtext COMMENT '变更后数据JSON',
`change_reason` varchar(200) DEFAULT NULL COMMENT '变更原因',
`operator_name` varchar(100) DEFAULT NULL COMMENT '操作人', `change_time` datetime NOT NULL COMMENT '变更时间',
PRIMARY KEY (`id`), KEY `idx_formal_settlement_change_bill` (`formal_settlement_id`),
KEY `idx_formal_settlement_change_time` (`change_time`)
@@ -123,17 +125,29 @@ CREATE TABLE IF NOT EXISTS `blade_formal_settlement_payment` (
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='正式结算付款申请';
INSERT INTO `blade_menu` (`id`,`parent_id`,`code`,`name`,`alias`,`path`,`source`,`sort`,`category`,`action`,`is_open`,`component`,`remark`,`is_deleted`) VALUES
(2090000000000001040,2090000000000001000,'formal_settlement','正式结算单','formal_settlement','/settlement/formal-settlement','iconfont icon-caidanguanli',4,1,0,1,NULL,'',0),
(2090000000000001041,2090000000000001040,'formal_settlement_view','查看','formal_settlement_view','','',1,2,0,1,NULL,'',0),
(2090000000000001042,2090000000000001040,'formal_settlement_add','新增','formal_settlement_add','','',2,2,0,1,NULL,'',0),
(2090000000000001043,2090000000000001040,'formal_settlement_edit','编辑','formal_settlement_edit','','',3,2,0,1,NULL,'',0),
(2090000000000001044,2090000000000001040,'formal_settlement_delete','删除','formal_settlement_delete','','',4,2,0,1,NULL,'',0),
(2090000000000001045,2090000000000001040,'formal_settlement_submit','提交审批','formal_settlement_submit','','',5,2,0,1,NULL,'',0),
(2090000000000001046,2090000000000001040,'formal_settlement_approve','审批','formal_settlement_approve','','',6,2,0,1,NULL,'',0),
(2090000000000001047,2090000000000001040,'formal_settlement_sync','同步金蝶','formal_settlement_sync','','',7,2,0,1,NULL,'',0),
(2090000000000001048,2090000000000001040,'formal_settlement_print','打印','formal_settlement_print','','',8,2,0,1,NULL,'',0),
(2090000000000001049,2090000000000001040,'formal_settlement_export','导出','formal_settlement_export','','',9,2,0,1,NULL,'',0),
(2090000000000001050,2090000000000001040,'formal_settlement_void','作废','formal_settlement_void','','',10,2,0,1,NULL,'',0),
(2090000000000001051,2090000000000001040,'formal_settlement_adjust','明细调整','formal_settlement_adjust','','',11,2,0,1,NULL,'',0),
(2090000000000001052,2090000000000001040,'formal_settlement_payment','付款申请','formal_settlement_payment','','',12,2,0,1,NULL,'',0)
(2090000000000001040,2090000000000001000,'payment_settlement','付款结算单','payment_settlement','/settlement/payment-settlement','iconfont icon-caidanguanli',4,1,0,1,NULL,'',0),
(2090000000000001041,2090000000000001040,'payment_settlement_view','查看','payment_settlement_view','','',1,2,0,1,NULL,'',0),
(2090000000000001042,2090000000000001040,'payment_settlement_add','新增','payment_settlement_add','','',2,2,0,1,NULL,'',0),
(2090000000000001043,2090000000000001040,'payment_settlement_edit','编辑','payment_settlement_edit','','',3,2,0,1,NULL,'',0),
(2090000000000001044,2090000000000001040,'payment_settlement_delete','删除','payment_settlement_delete','','',4,2,0,1,NULL,'',0),
(2090000000000001045,2090000000000001040,'payment_settlement_submit','提交审批','payment_settlement_submit','','',5,2,0,1,NULL,'',0),
(2090000000000001046,2090000000000001040,'payment_settlement_approve','审批','payment_settlement_approve','','',6,2,0,1,NULL,'',0),
(2090000000000001047,2090000000000001040,'payment_settlement_sync','同步金蝶','payment_settlement_sync','','',7,2,0,1,NULL,'',0),
(2090000000000001048,2090000000000001040,'payment_settlement_print','打印','payment_settlement_print','','',8,2,0,1,NULL,'',0),
(2090000000000001049,2090000000000001040,'payment_settlement_export','导出','payment_settlement_export','','',9,2,0,1,NULL,'',0),
(2090000000000001050,2090000000000001040,'payment_settlement_void','作废','payment_settlement_void','','',10,2,0,1,NULL,'',0),
(2090000000000001051,2090000000000001040,'payment_settlement_adjust','明细调整','payment_settlement_adjust','','',11,2,0,1,NULL,'',0),
(2090000000000001052,2090000000000001040,'payment_settlement_payment','付款申请','payment_settlement_payment','','',12,2,0,1,NULL,'',0),
(2090000000000002100,2090000000000001000,'receipt_settlement','收款结算单','receipt_settlement','/settlement/receipt-settlement','iconfont icon-caidanguanli',5,1,0,1,NULL,'',0),
(2090000000000002101,2090000000000002100,'receipt_settlement_view','查看','receipt_settlement_view','','',1,2,0,1,NULL,'',0),
(2090000000000002102,2090000000000002100,'receipt_settlement_add','新增','receipt_settlement_add','','',2,2,0,1,NULL,'',0),
(2090000000000002103,2090000000000002100,'receipt_settlement_edit','编辑','receipt_settlement_edit','','',3,2,0,1,NULL,'',0),
(2090000000000002104,2090000000000002100,'receipt_settlement_delete','删除','receipt_settlement_delete','','',4,2,0,1,NULL,'',0),
(2090000000000002105,2090000000000002100,'receipt_settlement_submit','提交审批','receipt_settlement_submit','','',5,2,0,1,NULL,'',0),
(2090000000000002106,2090000000000002100,'receipt_settlement_approve','审批','receipt_settlement_approve','','',6,2,0,1,NULL,'',0),
(2090000000000002107,2090000000000002100,'receipt_settlement_sync','同步金蝶','receipt_settlement_sync','','',7,2,0,1,NULL,'',0),
(2090000000000002108,2090000000000002100,'receipt_settlement_print','打印','receipt_settlement_print','','',8,2,0,1,NULL,'',0),
(2090000000000002109,2090000000000002100,'receipt_settlement_export','导出','receipt_settlement_export','','',9,2,0,1,NULL,'',0),
(2090000000000002110,2090000000000002100,'receipt_settlement_void','作废','receipt_settlement_void','','',10,2,0,1,NULL,'',0),
(2090000000000002111,2090000000000002100,'receipt_settlement_adjust','明细调整','receipt_settlement_adjust','','',11,2,0,1,NULL,'',0)
ON DUPLICATE KEY UPDATE `name`=VALUES(`name`),`path`=VALUES(`path`),`is_deleted`=0;
@@ -14,6 +14,8 @@ CREATE TABLE IF NOT EXISTS `blade_formal_settlement_change_record` (
`line_no` int(11) DEFAULT NULL COMMENT '行号',
`operation_type` varchar(30) COLLATE utf8mb4_general_ci NOT NULL COMMENT '操作类型',
`change_content` text COLLATE utf8mb4_general_ci NOT NULL COMMENT '变更内容',
`before_data` longtext COLLATE utf8mb4_general_ci COMMENT '变更前数据JSON',
`after_data` longtext COLLATE utf8mb4_general_ci COMMENT '变更后数据JSON',
`change_reason` varchar(200) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '变更原因',
`operator_name` varchar(100) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '操作人',
`change_time` datetime NOT NULL COMMENT '变更时间',
@@ -0,0 +1,30 @@
-- 正式结算变更记录补充前后值明细,与预结算变更记录口径一致。
SET @before_data_exists := (
SELECT COUNT(1) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'blade_formal_settlement_change_record'
AND COLUMN_NAME = 'before_data'
);
SET @before_data_sql := IF(
@before_data_exists = 0,
'ALTER TABLE `blade_formal_settlement_change_record` ADD COLUMN `before_data` longtext COLLATE utf8mb4_general_ci COMMENT ''变更前数据JSON'' AFTER `change_content`',
'SELECT 1'
);
PREPARE before_data_stmt FROM @before_data_sql;
EXECUTE before_data_stmt;
DEALLOCATE PREPARE before_data_stmt;
SET @after_data_exists := (
SELECT COUNT(1) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'blade_formal_settlement_change_record'
AND COLUMN_NAME = 'after_data'
);
SET @after_data_sql := IF(
@after_data_exists = 0,
'ALTER TABLE `blade_formal_settlement_change_record` ADD COLUMN `after_data` longtext COLLATE utf8mb4_general_ci COMMENT ''变更后数据JSON'' AFTER `before_data`',
'SELECT 1'
);
PREPARE after_data_stmt FROM @after_data_sql;
EXECUTE after_data_stmt;
DEALLOCATE PREPARE after_data_stmt;
@@ -0,0 +1,30 @@
-- 收票登记:删除冗余的 kingdee_bill_no / kingdee_status 两列
-- 这两列由收票登记旧版金蝶同步链路写入,同步功能已下线,代码中已无任何读写。
-- 收票登记的金蝶状态以 kingdee_push_status 为唯一状态源(未推送/已保存收票单/已指定应付/推送失败);
-- 金蝶单据号可经 kingdee_invoice_pool_id 关联 blade_kingdee_invoice_pool 取 serial_no,
-- 两列的取值集合也与新模型对不上(旧值 pushed / assigned 在新模型里不存在),故不搬运数据。
-- 基线建表脚本 blade_invoice_receipt_20260821.sql 仍声明这两列,
-- 而 CREATE TABLE IF NOT EXISTS 对已存在的表是空操作,存量库只能靠 ALTER 收敛。
-- 以下语句可重复执行。
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;
-- 索引 idx_invoice_receipt_kingdee 建在 kingdee_status 上,随该列一并删除,无需单独 DROP INDEX
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,82 @@
-- 付款申请可关联多张预结算单:关联表补充预结算字段,正式结算字段改为可空
SET @ddl_sql = (
SELECT IF(COUNT(*) > 0,
'ALTER TABLE `blade_payment_application_settlement` MODIFY COLUMN `formal_settlement_id` bigint(20) NULL COMMENT ''正式结算单ID''',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'blade_payment_application_settlement'
AND COLUMN_NAME = 'formal_settlement_id'
AND IS_NULLABLE = 'NO'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
SET @ddl_sql = (
SELECT IF(COUNT(*) > 0,
'ALTER TABLE `blade_payment_application_settlement` MODIFY COLUMN `formal_settlement_no` varchar(100) COLLATE utf8mb4_general_ci NULL COMMENT ''正式结算单号''',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'blade_payment_application_settlement'
AND COLUMN_NAME = 'formal_settlement_no'
AND IS_NULLABLE = 'NO'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_payment_application_settlement` ADD COLUMN `pre_settlement_id` bigint(20) DEFAULT NULL COMMENT ''预结算单ID'' AFTER `formal_settlement_no`',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'blade_payment_application_settlement'
AND COLUMN_NAME = 'pre_settlement_id'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_payment_application_settlement` ADD COLUMN `pre_settlement_no` varchar(100) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''预结算单号'' AFTER `pre_settlement_id`',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'blade_payment_application_settlement'
AND COLUMN_NAME = 'pre_settlement_no'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_payment_application_settlement` ADD KEY `idx_payment_settlement_pre` (`pre_settlement_id`)',
'SELECT 1')
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'blade_payment_application_settlement'
AND INDEX_NAME = 'idx_payment_settlement_pre'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
SET @ddl_sql = (
SELECT IF(COUNT(*) > 0,
'ALTER TABLE `blade_payment_application` MODIFY COLUMN `pre_settlement_no` varchar(500) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''预结算单号''',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'blade_payment_application'
AND COLUMN_NAME = 'pre_settlement_no'
AND CHARACTER_MAXIMUM_LENGTH < 500
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
@@ -200,7 +200,7 @@ CREATE TABLE IF NOT EXISTS `blade_pre_settlement_change_record` (
INSERT INTO `blade_menu`
(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`)
VALUES
(2090000000000001020, 2090000000000001000, 'pre_settlement', '预结算', 'pre_settlement', '/settlement/pre-settlement', 'iconfont icon-caidanguanli', 3, 1, 0, 1, NULL, '', 0),
(2090000000000001020, 2090000000000001000, 'pre_settlement', '预付结算单', 'pre_settlement', '/settlement/pre-settlement', 'iconfont icon-caidanguanli', 3, 1, 0, 1, NULL, '', 0),
(2090000000000001021, 2090000000000001020, 'pre_settlement_view', '查看', 'pre_settlement_view', '', '', 1, 2, 0, 1, NULL, '', 0),
(2090000000000001022, 2090000000000001020, 'pre_settlement_add', '新增', 'pre_settlement_add', '', '', 2, 2, 0, 1, NULL, '', 0),
(2090000000000001023, 2090000000000001020, 'pre_settlement_edit', '编辑', 'pre_settlement_edit', '', '', 3, 2, 0, 1, NULL, '', 0),
@@ -1,4 +1,64 @@
-- 平台公司支持多选: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 '平台公司,多个顿号分隔';
-- 项目立项平台公司多选:ID 逗号分隔,名称顿号分隔
-- 原字段:undertake_dept_id bigint、undertake_dept_name varchar(100)
-- 选择 2 个及以上平台公司时,若未扩容会报 Incorrect integer value / Data truncation
-- 整列索引挂在 varchar(500) 上可能因键长超限导致 ALTER 失败,故先删索引再改前缀索引
DELIMITER $$
DROP PROCEDURE IF EXISTS `upgrade_project_apply_undertake_dept_multi_20261014`$$
CREATE PROCEDURE `upgrade_project_apply_undertake_dept_multi_20261014`()
BEGIN
DECLARE db_name varchar(128);
DECLARE need_modify tinyint DEFAULT 0;
SET db_name = DATABASE();
IF EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_schema = db_name
AND table_name = 'blade_project_apply'
AND column_name = 'undertake_dept_id'
AND (
data_type IN ('bigint', 'int', 'integer')
OR (data_type IN ('varchar', 'char') AND IFNULL(character_maximum_length, 0) < 500)
)
) OR EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_schema = db_name
AND table_name = 'blade_project_apply'
AND column_name = 'undertake_dept_name'
AND data_type IN ('varchar', 'char')
AND IFNULL(character_maximum_length, 0) < 500
) THEN
SET need_modify = 1;
END IF;
IF need_modify = 1 THEN
IF EXISTS (
SELECT 1 FROM information_schema.statistics
WHERE table_schema = db_name
AND table_name = 'blade_project_apply'
AND index_name = 'idx_project_apply_dept'
) THEN
ALTER TABLE `blade_project_apply` DROP INDEX `idx_project_apply_dept`;
END IF;
ALTER TABLE `blade_project_apply`
MODIFY COLUMN `undertake_dept_id` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '平台公司ID,多个逗号分隔',
MODIFY COLUMN `undertake_dept_name` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '平台公司,多个顿号分隔';
END IF;
IF NOT EXISTS (
SELECT 1 FROM information_schema.statistics
WHERE table_schema = db_name
AND table_name = 'blade_project_apply'
AND index_name = 'idx_project_apply_dept'
) THEN
ALTER TABLE `blade_project_apply`
ADD INDEX `idx_project_apply_dept` (`undertake_dept_id`(191)) USING BTREE;
END IF;
END$$
CALL `upgrade_project_apply_undertake_dept_multi_20261014`()$$
DROP PROCEDURE `upgrade_project_apply_undertake_dept_multi_20261014`$$
DELIMITER ;
@@ -60,7 +60,7 @@ CREATE TABLE `blade_project_apply` (
`void_reason` varchar(500) DEFAULT NULL COMMENT '作废原因',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `uk_project_apply_name` (`project_name`, `is_deleted`) USING BTREE,
KEY `idx_project_apply_dept` (`undertake_dept_id`) USING BTREE,
KEY `idx_project_apply_dept` (`undertake_dept_id`(191)) USING BTREE,
KEY `idx_project_apply_status` (`approval_status`) USING BTREE,
KEY `idx_project_apply_create_time` (`create_time`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 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` varchar(500) DEFAULT NULL COMMENT '平台公司ID,多个逗号分隔',
`undertake_dept_name` varchar(500) DEFAULT NULL COMMENT '平台公司,多个顿号分隔',
`undertake_dept_id` bigint(20) DEFAULT NULL COMMENT '承办部门ID',
`undertake_dept_name` varchar(100) 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 '剩余项目资金使用额度(万元)',
@@ -0,0 +1,61 @@
-- 结算调整单接入金蝶(未推送自动推 · 已推送手工冲销后重推新单)
-- 整理日期:2026-10-16
-- 结算调整单:落金蝶单据号(未推送场景回填原单金蝶单号;已推送重推场景回填新单金蝶单号)
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_settlement_adjustment` ADD COLUMN `kingdee_bill_no` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''金蝶单据号'' AFTER `kingdee_sync_status`',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'blade_settlement_adjustment'
AND COLUMN_NAME = 'kingdee_bill_no'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
-- 正式结算单:来源原单号(重推生成的新单,接续原单来源)
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_formal_settlement` ADD COLUMN `origin_formal_settlement_no` varchar(100) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''来源原正式结算单号(结算调整重推生成)''',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'blade_formal_settlement'
AND COLUMN_NAME = 'origin_formal_settlement_no'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
-- 正式结算单:调整标记(被调整的原单)
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_formal_settlement` ADD COLUMN `adjust_status` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''调整状态:adjusted=已被结算调整'' AFTER `origin_formal_settlement_no`',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'blade_formal_settlement'
AND COLUMN_NAME = 'adjust_status'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
-- 正式结算单:来源原单号索引(重推幂等按来源原单号查已克隆新单)
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_formal_settlement` ADD KEY `idx_formal_origin_no` (`origin_formal_settlement_no`)',
'SELECT 1')
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'blade_formal_settlement'
AND INDEX_NAME = 'idx_formal_origin_no'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
-- 推送金蝶 / 重新推送已合并为单一按钮(按金蝶状态自动分流),复用既有菜单 settlement_adjustment_repush,
-- 菜单已在 blade_settlement_adjustment_20260818.sql 初始化,本脚本无需新增菜单。
@@ -0,0 +1,68 @@
-- 导入结算单批次表 + 菜单
CREATE TABLE IF NOT EXISTS `blade_settlement_import_batch` (
`id` bigint NOT NULL COMMENT '主键',
`tenant_id` varchar(12) NOT NULL DEFAULT '000000' COMMENT '租户ID',
`batch_no` varchar(64) NOT NULL COMMENT '批次号 DJS+yyyyMMdd+序号',
`project_id` bigint DEFAULT NULL COMMENT '项目ID',
`project_name` varchar(200) DEFAULT NULL COMMENT '项目名称',
`settlement_type` varchar(30) NOT NULL COMMENT 'receivable/payable',
`settlement_bill_type` varchar(20) NOT NULL DEFAULT 'formal' COMMENT '结算单类型 formal/pre',
`customer_contract_id` bigint DEFAULT NULL COMMENT '客户合同ID',
`customer_contract_name` varchar(200) DEFAULT NULL COMMENT '客户合同名称',
`customer_name` varchar(200) DEFAULT NULL COMMENT '客户名称',
`carrier_contract_id` bigint DEFAULT NULL COMMENT '承运商合同ID',
`carrier_contract_name` varchar(200) DEFAULT NULL COMMENT '承运商合同名称',
`carrier_name` varchar(200) DEFAULT NULL COMMENT '承运商名称',
`waybill_mode` varchar(20) DEFAULT 'new' COMMENT '运单模式 new/history',
`import_status` varchar(32) NOT NULL COMMENT 'draft/completed/voided',
`waybill_count` int DEFAULT 0 COMMENT '运单数量',
`detail_count` int DEFAULT 0 COMMENT '明细数量',
`formal_settlement_id` bigint DEFAULT NULL COMMENT '正式结算单ID',
`formal_settlement_no` varchar(100) DEFAULT NULL COMMENT '正式结算单号',
`pre_settlement_id` bigint DEFAULT NULL COMMENT '预结算单ID',
`pre_settlement_no` varchar(100) DEFAULT NULL COMMENT '预结算单号',
`fee_item_names_json` longtext COMMENT '动态费用列名JSON数组',
`rows_json` longtext COMMENT '导入明细行JSON数组',
`remark` varchar(200) DEFAULT NULL COMMENT '备注',
`waybill_import_batch_id` bigint 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 1 COMMENT '业务状态',
`is_deleted` int DEFAULT 0 COMMENT '是否已删除',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_settlement_import_batch_no` (`tenant_id`,`batch_no`),
KEY `idx_settlement_import_project` (`project_id`),
KEY `idx_settlement_import_formal` (`formal_settlement_id`),
KEY `idx_settlement_import_pre` (`pre_settlement_id`),
KEY `idx_settlement_import_waybill_batch` (`waybill_import_batch_id`),
KEY `idx_settlement_import_create_time` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='导入结算单批次';
-- 已建表环境增量字段(列已存在可忽略报错)
ALTER TABLE `blade_settlement_import_batch` ADD COLUMN `settlement_bill_type` varchar(20) NOT NULL DEFAULT 'formal' COMMENT '结算单类型 formal/pre' AFTER `settlement_type`;
ALTER TABLE `blade_settlement_import_batch` ADD COLUMN `pre_settlement_id` bigint DEFAULT NULL COMMENT '预结算单ID' AFTER `formal_settlement_no`;
ALTER TABLE `blade_settlement_import_batch` ADD COLUMN `pre_settlement_no` varchar(100) DEFAULT NULL COMMENT '预结算单号' AFTER `pre_settlement_id`;
ALTER TABLE `blade_settlement_import_batch` ADD KEY `idx_settlement_import_pre` (`pre_settlement_id`);
ALTER TABLE `blade_settlement_import_batch` ADD COLUMN `rows_json` longtext COMMENT '导入明细行JSON数组' AFTER `fee_item_names_json`;
-- 运单关联导入结算批次(可选,若列已存在可忽略报错)
ALTER TABLE `blade_waybill` ADD COLUMN `settlement_import_batch_id` bigint DEFAULT NULL COMMENT '导入结算单批次ID';
ALTER TABLE `blade_waybill` ADD KEY `idx_waybill_settlement_import_batch_id` (`settlement_import_batch_id`);
INSERT INTO `blade_menu` (`id`,`parent_id`,`code`,`name`,`alias`,`path`,`source`,`sort`,`category`,`action`,`is_open`,`component`,`remark`,`is_deleted`) VALUES
(2090000000000002080,2090000000000001000,'settlement_import','导入结算单','settlement_import','/settlement/settlement-import','iconfont icon-caidanguanli',6,1,0,1,NULL,'',0),
(2090000000000002081,2090000000000002080,'settlement_import_view','查看','settlement_import_view','','',1,2,0,1,NULL,'',0),
(2090000000000002082,2090000000000002080,'settlement_import_add','新增','settlement_import_add','','',2,2,0,1,NULL,'',0),
(2090000000000002083,2090000000000002080,'settlement_import_detail','详情','settlement_import_detail','','',3,2,0,1,NULL,'',0),
(2090000000000002084,2090000000000002080,'settlement_import_void','作废','settlement_import_void','','',4,2,0,1,NULL,'',0),
(2090000000000002085,2090000000000002080,'settlement_import_template','下载模板','settlement_import_template','','',5,2,0,1,NULL,'',0),
(2090000000000002086,2090000000000002080,'settlement_import_delete','删除','settlement_import_delete','','',6,2,0,1,NULL,'',0)
ON DUPLICATE KEY UPDATE `name`=VALUES(`name`),`path`=VALUES(`path`),`is_deleted`=0;
-- 已建表环境增量菜单(已存在可忽略)
INSERT INTO `blade_menu` (`id`,`parent_id`,`code`,`name`,`alias`,`path`,`source`,`sort`,`category`,`action`,`is_open`,`component`,`remark`,`is_deleted`) VALUES
(2090000000000002086,2090000000000002080,'settlement_import_delete','删除','settlement_import_delete','','',6,2,0,1,NULL,'',0)
ON DUPLICATE KEY UPDATE `name`=VALUES(`name`),`path`=VALUES(`path`),`is_deleted`=0;
@@ -0,0 +1,7 @@
-- 导入结算单:草稿明细落库 + 删除菜单
ALTER TABLE `blade_settlement_import_batch`
ADD COLUMN `rows_json` longtext COMMENT '导入明细行JSON数组' AFTER `fee_item_names_json`;
INSERT INTO `blade_menu` (`id`,`parent_id`,`code`,`name`,`alias`,`path`,`source`,`sort`,`category`,`action`,`is_open`,`component`,`remark`,`is_deleted`) VALUES
(2090000000000002086,2090000000000002080,'settlement_import_delete','删除','settlement_import_delete','','',6,2,0,1,NULL,'',0)
ON DUPLICATE KEY UPDATE `name`=VALUES(`name`),`path`=VALUES(`path`),`is_deleted`=0;
@@ -0,0 +1,163 @@
-- 结算菜单调整:
-- 1)预结算 → 预付结算单
-- 2)正式结算单拆分为:付款结算单(应付)、收款结算单(应收)
-- 执行后需重新登录;已授权「正式结算单/付款结算单」的角色会同步授权「收款结算单」。
-- ① 预结算改名
UPDATE `blade_menu`
SET `name` = '预付结算单'
WHERE `code` = 'pre_settlement'
AND `is_deleted` = 0;
-- ② 原正式结算单菜单改为「付款结算单」(保留原菜单 id,角色授权不丢)
UPDATE `blade_menu`
SET `code` = 'payment_settlement',
`name` = '付款结算单',
`alias` = 'payment_settlement',
`path` = '/settlement/payment-settlement',
`is_deleted` = 0
WHERE `code` IN ('formal_settlement', 'payment_settlement')
AND `category` = 1
AND `is_deleted` = 0;
-- 付款结算单按钮权限码:formal_settlement_* → payment_settlement_*
UPDATE `blade_menu` child
INNER JOIN `blade_menu` parent
ON parent.`id` = child.`parent_id`
AND parent.`code` = 'payment_settlement'
AND parent.`is_deleted` = 0
SET child.`code` = REPLACE(child.`code`, 'formal_settlement_', 'payment_settlement_'),
child.`alias` = REPLACE(IFNULL(child.`alias`, child.`code`), 'formal_settlement_', 'payment_settlement_'),
child.`is_deleted` = 0
WHERE child.`category` = 2
AND child.`code` LIKE 'formal_settlement_%';
-- ③ 新增「收款结算单」菜单
INSERT INTO `blade_menu`
(`id`,`parent_id`,`code`,`name`,`alias`,`path`,`source`,`sort`,`category`,`action`,`is_open`,`component`,`remark`,`is_deleted`)
SELECT
2090000000000002100,
parent.`parent_id`,
'receipt_settlement',
'收款结算单',
'receipt_settlement',
'/settlement/receipt-settlement',
IFNULL(parent.`source`, 'iconfont icon-caidanguanli'),
IFNULL(parent.`sort`, 4) + 1,
1, 0, 1, NULL, '', 0
FROM `blade_menu` parent
WHERE parent.`code` = 'payment_settlement'
AND parent.`is_deleted` = 0
AND NOT EXISTS (
SELECT 1 FROM `blade_menu` x WHERE x.`code` = 'receipt_settlement' AND x.`is_deleted` = 0
)
LIMIT 1;
INSERT INTO `blade_menu`
(`id`,`parent_id`,`code`,`name`,`alias`,`path`,`source`,`sort`,`category`,`action`,`is_open`,`component`,`remark`,`is_deleted`)
SELECT 2090000000000002101, p.id, 'receipt_settlement_view', '查看', 'receipt_settlement_view', '', '', 1, 2, 0, 1, NULL, '', 0
FROM `blade_menu` p WHERE p.code = 'receipt_settlement' AND p.is_deleted = 0
AND NOT EXISTS (SELECT 1 FROM `blade_menu` x WHERE x.code = 'receipt_settlement_view' AND x.is_deleted = 0)
LIMIT 1;
INSERT INTO `blade_menu`
(`id`,`parent_id`,`code`,`name`,`alias`,`path`,`source`,`sort`,`category`,`action`,`is_open`,`component`,`remark`,`is_deleted`)
SELECT 2090000000000002102, p.id, 'receipt_settlement_add', '新增', 'receipt_settlement_add', '', '', 2, 2, 0, 1, NULL, '', 0
FROM `blade_menu` p WHERE p.code = 'receipt_settlement' AND p.is_deleted = 0
AND NOT EXISTS (SELECT 1 FROM `blade_menu` x WHERE x.code = 'receipt_settlement_add' AND x.is_deleted = 0)
LIMIT 1;
INSERT INTO `blade_menu`
(`id`,`parent_id`,`code`,`name`,`alias`,`path`,`source`,`sort`,`category`,`action`,`is_open`,`component`,`remark`,`is_deleted`)
SELECT 2090000000000002103, p.id, 'receipt_settlement_edit', '编辑', 'receipt_settlement_edit', '', '', 3, 2, 0, 1, NULL, '', 0
FROM `blade_menu` p WHERE p.code = 'receipt_settlement' AND p.is_deleted = 0
AND NOT EXISTS (SELECT 1 FROM `blade_menu` x WHERE x.code = 'receipt_settlement_edit' AND x.is_deleted = 0)
LIMIT 1;
INSERT INTO `blade_menu`
(`id`,`parent_id`,`code`,`name`,`alias`,`path`,`source`,`sort`,`category`,`action`,`is_open`,`component`,`remark`,`is_deleted`)
SELECT 2090000000000002104, p.id, 'receipt_settlement_delete', '删除', 'receipt_settlement_delete', '', '', 4, 2, 0, 1, NULL, '', 0
FROM `blade_menu` p WHERE p.code = 'receipt_settlement' AND p.is_deleted = 0
AND NOT EXISTS (SELECT 1 FROM `blade_menu` x WHERE x.code = 'receipt_settlement_delete' AND x.is_deleted = 0)
LIMIT 1;
INSERT INTO `blade_menu`
(`id`,`parent_id`,`code`,`name`,`alias`,`path`,`source`,`sort`,`category`,`action`,`is_open`,`component`,`remark`,`is_deleted`)
SELECT 2090000000000002105, p.id, 'receipt_settlement_submit', '提交审批', 'receipt_settlement_submit', '', '', 5, 2, 0, 1, NULL, '', 0
FROM `blade_menu` p WHERE p.code = 'receipt_settlement' AND p.is_deleted = 0
AND NOT EXISTS (SELECT 1 FROM `blade_menu` x WHERE x.code = 'receipt_settlement_submit' AND x.is_deleted = 0)
LIMIT 1;
INSERT INTO `blade_menu`
(`id`,`parent_id`,`code`,`name`,`alias`,`path`,`source`,`sort`,`category`,`action`,`is_open`,`component`,`remark`,`is_deleted`)
SELECT 2090000000000002106, p.id, 'receipt_settlement_approve', '审批', 'receipt_settlement_approve', '', '', 6, 2, 0, 1, NULL, '', 0
FROM `blade_menu` p WHERE p.code = 'receipt_settlement' AND p.is_deleted = 0
AND NOT EXISTS (SELECT 1 FROM `blade_menu` x WHERE x.code = 'receipt_settlement_approve' AND x.is_deleted = 0)
LIMIT 1;
INSERT INTO `blade_menu`
(`id`,`parent_id`,`code`,`name`,`alias`,`path`,`source`,`sort`,`category`,`action`,`is_open`,`component`,`remark`,`is_deleted`)
SELECT 2090000000000002107, p.id, 'receipt_settlement_sync', '同步金蝶', 'receipt_settlement_sync', '', '', 7, 2, 0, 1, NULL, '', 0
FROM `blade_menu` p WHERE p.code = 'receipt_settlement' AND p.is_deleted = 0
AND NOT EXISTS (SELECT 1 FROM `blade_menu` x WHERE x.code = 'receipt_settlement_sync' AND x.is_deleted = 0)
LIMIT 1;
INSERT INTO `blade_menu`
(`id`,`parent_id`,`code`,`name`,`alias`,`path`,`source`,`sort`,`category`,`action`,`is_open`,`component`,`remark`,`is_deleted`)
SELECT 2090000000000002108, p.id, 'receipt_settlement_print', '打印', 'receipt_settlement_print', '', '', 8, 2, 0, 1, NULL, '', 0
FROM `blade_menu` p WHERE p.code = 'receipt_settlement' AND p.is_deleted = 0
AND NOT EXISTS (SELECT 1 FROM `blade_menu` x WHERE x.code = 'receipt_settlement_print' AND x.is_deleted = 0)
LIMIT 1;
INSERT INTO `blade_menu`
(`id`,`parent_id`,`code`,`name`,`alias`,`path`,`source`,`sort`,`category`,`action`,`is_open`,`component`,`remark`,`is_deleted`)
SELECT 2090000000000002109, p.id, 'receipt_settlement_export', '导出', 'receipt_settlement_export', '', '', 9, 2, 0, 1, NULL, '', 0
FROM `blade_menu` p WHERE p.code = 'receipt_settlement' AND p.is_deleted = 0
AND NOT EXISTS (SELECT 1 FROM `blade_menu` x WHERE x.code = 'receipt_settlement_export' AND x.is_deleted = 0)
LIMIT 1;
INSERT INTO `blade_menu`
(`id`,`parent_id`,`code`,`name`,`alias`,`path`,`source`,`sort`,`category`,`action`,`is_open`,`component`,`remark`,`is_deleted`)
SELECT 2090000000000002110, p.id, 'receipt_settlement_void', '作废', 'receipt_settlement_void', '', '', 10, 2, 0, 1, NULL, '', 0
FROM `blade_menu` p WHERE p.code = 'receipt_settlement' AND p.is_deleted = 0
AND NOT EXISTS (SELECT 1 FROM `blade_menu` x WHERE x.code = 'receipt_settlement_void' AND x.is_deleted = 0)
LIMIT 1;
INSERT INTO `blade_menu`
(`id`,`parent_id`,`code`,`name`,`alias`,`path`,`source`,`sort`,`category`,`action`,`is_open`,`component`,`remark`,`is_deleted`)
SELECT 2090000000000002111, p.id, 'receipt_settlement_adjust', '明细调整', 'receipt_settlement_adjust', '', '', 11, 2, 0, 1, NULL, '', 0
FROM `blade_menu` p WHERE p.code = 'receipt_settlement' AND p.is_deleted = 0
AND NOT EXISTS (SELECT 1 FROM `blade_menu` x WHERE x.code = 'receipt_settlement_adjust' AND x.is_deleted = 0)
LIMIT 1;
-- ④ 角色授权:持有付款结算单的角色同步收款结算单(含按钮)
INSERT INTO `blade_role_menu` (`id`, `menu_id`, `role_id`)
SELECT
2091200000000000000 + CAST(rm.`role_id` AS UNSIGNED) % 100000,
receipt.`id`,
rm.`role_id`
FROM `blade_role_menu` rm
JOIN `blade_menu` payment ON payment.`id` = rm.`menu_id`
AND payment.`code` = 'payment_settlement'
AND payment.`is_deleted` = 0
JOIN `blade_menu` receipt ON receipt.`code` = 'receipt_settlement'
AND receipt.`is_deleted` = 0
WHERE NOT EXISTS (
SELECT 1 FROM `blade_role_menu` x
WHERE x.`menu_id` = receipt.`id` AND x.`role_id` = rm.`role_id`
);
INSERT INTO `blade_role_menu` (`id`, `menu_id`, `role_id`)
SELECT
2091300000000000000
+ (CAST(rm.`role_id` AS UNSIGNED) % 100000) * 20
+ (CAST(receipt_btn.`id` AS UNSIGNED) % 20),
receipt_btn.`id`,
rm.`role_id`
FROM `blade_role_menu` rm
JOIN `blade_menu` payment_btn ON payment_btn.`id` = rm.`menu_id`
AND payment_btn.`code` LIKE 'payment_settlement_%'
AND payment_btn.`is_deleted` = 0
JOIN `blade_menu` receipt_btn
ON receipt_btn.`code` = REPLACE(payment_btn.`code`, 'payment_settlement_', 'receipt_settlement_')
AND receipt_btn.`is_deleted` = 0
WHERE NOT EXISTS (
SELECT 1 FROM `blade_role_menu` x
WHERE x.`menu_id` = receipt_btn.`id` AND x.`role_id` = rm.`role_id`
);
-- ⑤ 残留旧正式结算菜单隐藏
UPDATE `blade_menu`
SET `is_deleted` = 1
WHERE `code` = 'formal_settlement'
AND `category` = 1;
@@ -0,0 +1,23 @@
-- 结算单项目预付核销明细
CREATE TABLE IF NOT EXISTS `blade_settlement_project_advance_write_off` (
`id` bigint NOT NULL COMMENT '主键',
`tenant_id` varchar(12) NOT NULL DEFAULT '000000' COMMENT '租户ID',
`settlement_type` varchar(20) NOT NULL COMMENT '结算单类型 pre/formal',
`settlement_id` bigint NOT NULL COMMENT '预结算/正式结算单ID',
`payment_application_id` bigint NOT NULL COMMENT '项目预付付款申请ID',
`payment_no` varchar(64) DEFAULT NULL COMMENT '预付单号',
`project_advance_amount` decimal(18,2) DEFAULT 0.00 COMMENT '项目预付金额',
`write_off_amount` decimal(18,2) NOT NULL DEFAULT 0.00 COMMENT '本次核销金额',
`kingdee_bill_no` varchar(100) 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 1 COMMENT '业务状态',
`is_deleted` int DEFAULT 0 COMMENT '是否已删除',
PRIMARY KEY (`id`),
KEY `idx_spa_write_off_settlement` (`settlement_type`,`settlement_id`),
KEY `idx_spa_write_off_payment` (`payment_application_id`),
KEY `idx_spa_write_off_create_time` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='结算单项目预付核销';
@@ -0,0 +1,6 @@
-- 用户部门关联表索引:加速人员列表按组织树过滤
-- 部署时在业务库执行本脚本
ALTER TABLE `blade_user_dept`
ADD INDEX `idx_blade_user_dept_user` (`user_id`, `is_deleted`, `status`) USING BTREE,
ADD INDEX `idx_blade_user_dept_dept` (`dept_id`, `is_deleted`, `status`) USING BTREE;
@@ -0,0 +1,18 @@
-- 用户表:新增 OA 登录名,支持用户管理后台维护
-- 排序规则 utf8mb4_general_ci
ALTER TABLE `blade_user`
ADD COLUMN `oa_login_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'OA登录名' AFTER `is_oa`;
-- 从用户部门关联表回填已有 OA 登录账号
UPDATE `blade_user` bu
INNER JOIN (
SELECT `user_id`, MAX(`oa_login_id`) AS `oa_login_id`
FROM `blade_user_dept`
WHERE `is_deleted` = 0
AND `oa_login_id` IS NOT NULL
AND `oa_login_id` <> ''
GROUP BY `user_id`
) bud ON bud.`user_id` = bu.`id`
SET bu.`oa_login_id` = bud.`oa_login_id`
WHERE bu.`oa_login_id` IS NULL OR bu.`oa_login_id` = '';
@@ -0,0 +1,61 @@
-- ----------------------------
-- 调度端运单列表按组织过滤:dept_id 缺失的存量运单订正回它所属的组织
-- 写业务数据。执行前必须先建备份表(第 0 节),执行后必须跑第 2 节校验。可重复执行。
-- ----------------------------
--
-- 为什么要订正:
-- 调度端(小程序管理端)运单列表的可见范围是「本组织」,超管看全租户。
-- dept_id 为 NULL 或 -1 的运单不属于任何组织,普通用户再也看不到它们。
-- 本机库实测 42 张:34 张的 dept_id = -1、8 张为 NULL,全部是 2026-10-15 / 10-16
-- 由 admin 在 1123598813738675201 下建的(-1 是客户端把「未选组织」当 -1 传上来的哨兵值,
-- 服务端写入前的兜底只判空、拦不住负数)。
--
-- 处置口径:取该运单的 create_dept(创建人所属组织)作为它的组织。
-- 42 张的 create_dept 都是 1123598813738675201,与它们的业务归属一致;
-- 按 create_dept 取而不是写死这个 id,其它环境执行时同样成立。
-- dept_name 取组织表当前的名字:新建运单写的就是这个名字,不跟随存量行里的历史短名
-- (「桂物物流集团」这类短名是历史写法,本次只补缺失值,不复位已存在的值)。
-- 只动 dept_id 为空或非正数的行,且要求 create_dept 为正数:重复执行不再改动任何行。
-- update_time 不在 SET 里,保留原值。
-- ----------------------------
-- 0. 备份(必须在订正之前执行,仅首次需要)
-- ----------------------------
-- CREATE TABLE blade_waybill_dept_bak AS
-- SELECT id, waybill_no, dept_id, dept_name, create_dept, update_time
-- FROM blade_waybill
-- WHERE is_deleted = 0 AND (dept_id IS NULL OR dept_id <= 0);
START TRANSACTION;
-- ----------------------------
-- 1. 订正组织
-- ----------------------------
UPDATE `blade_waybill`
SET `dept_id` = `create_dept`,
`dept_name` = (SELECT `dept_name` FROM `blade_dept` WHERE `id` = `blade_waybill`.`create_dept` LIMIT 1)
WHERE `is_deleted` = 0
AND (`dept_id` IS NULL OR `dept_id` <= 0)
AND `create_dept` IS NOT NULL
AND `create_dept` > 0;
COMMIT;
-- ----------------------------
-- 2. 校验(执行后必看,两个都必须返回 0)
-- ----------------------------
-- -- 仍不属于任何组织的可见运单
-- SELECT COUNT(*) FROM blade_waybill
-- WHERE is_deleted = 0 AND (dept_id IS NULL OR dept_id <= 0) AND create_dept > 0;
--
-- -- 本次订正过的行,组织 ID 与组织名都必须跟组织表一致
-- SELECT COUNT(*) FROM blade_waybill w
-- JOIN blade_waybill_dept_bak b ON b.id = w.id
-- JOIN blade_dept d ON d.id = w.dept_id
-- WHERE w.dept_id <> w.create_dept OR w.dept_name <> d.dept_name;
-- ----------------------------
-- 3. 回退(订正后发现问题时执行)
-- ----------------------------
-- UPDATE blade_waybill w
-- JOIN blade_waybill_dept_bak b ON b.id = w.id
-- SET w.dept_id = b.dept_id, w.dept_name = b.dept_name;
+3 -1
View File
@@ -5487,7 +5487,9 @@ CREATE TABLE `blade_user_dept` (
`oa_id` varchar(64) DEFAULT NULL COMMENT 'OA人员ID',
`oa_login_id` varchar(128) DEFAULT NULL COMMENT 'OA登录账号',
`sync_time` datetime DEFAULT NULL COMMENT '同步时间',
PRIMARY KEY (`id`) USING BTREE
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_blade_user_dept_user` (`user_id`, `is_deleted`, `status`) USING BTREE,
INDEX `idx_blade_user_dept_dept` (`dept_id`, `is_deleted`, `status`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户部门表';
-- ----------------------------