feat: 细胞存储缴费催缴、统一样本信息与协议支付能力增强

汇总近期业务改动:催缴菜单与后端、样本信息快捷登记与进度、运费关联、客户档案扩展、协议优惠/期次与押金划转,并同步 SQL 迁移与管理端页面收敛。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
zlwuandCursor committed 2026-10-10 21:20:37 +08:00
1 parent 2d3472f5c4
commit db31990ebe
235 files changed
+14898 -10196

No files matched your search

+32 -9
View File
@@ -3,7 +3,8 @@
-- 说明:
-- 1) biz_collection_protocol 增量字段用 information_schema 判断后 ADD,可重复执行
-- 2) payment_model_version 默认 2;首次升级将存量行置为 1(已有 version=1 则跳过 UPDATE)
-- 3) 新表 CREATE TABLE IF NOT EXISTS
-- 3) 新表 CREATE TABLE IF NOT EXISTS,校对规则与存量库一致:utf8mb4_unicode_ci
-- 4) 第 9 节 CONVERT 用于已建表纠偏(可重复执行)
-- ---------------------------------------------------------------------------
-- 1) 采集协议单增量字段
@@ -75,7 +76,7 @@ CREATE TABLE IF NOT EXISTS `biz_protocol_sample_payment` (
PRIMARY KEY (`id`),
KEY `idx_psp_tenant_protocol` (`tenant_no`,`collection_protocol_id`,`del_flag`),
KEY `idx_psp_tenant_sample` (`tenant_no`,`sample_code`,`del_flag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='采集协议单-按样本缴费方案';
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='采集协议单-按样本缴费方案';
-- ---------------------------------------------------------------------------
-- 3) 应缴批次
@@ -100,7 +101,7 @@ CREATE TABLE IF NOT EXISTS `biz_protocol_payment_schedule` (
`del_flag` smallint(6) NOT NULL DEFAULT '0' COMMENT '删除标记',
PRIMARY KEY (`id`),
KEY `idx_pps_tenant_protocol` (`tenant_no`,`collection_protocol_id`,`del_flag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='采集协议单-应缴批次';
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='采集协议单-应缴批次';
-- ---------------------------------------------------------------------------
-- 4) 转账笔(无退费字段)
@@ -131,7 +132,7 @@ CREATE TABLE IF NOT EXISTS `biz_protocol_payment_transfer` (
KEY `idx_ppt_tenant_protocol` (`tenant_no`,`collection_protocol_id`,`del_flag`),
KEY `idx_ppt_tenant_sample` (`tenant_no`,`sample_code`,`del_flag`),
KEY `idx_ppt_tenant_pay_status` (`tenant_no`,`pay_status`,`del_flag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='采集协议单-缴费转账笔';
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='采集协议单-缴费转账笔';
-- ---------------------------------------------------------------------------
-- 5) 协议退费登记
@@ -155,7 +156,7 @@ CREATE TABLE IF NOT EXISTS `biz_protocol_refund_record` (
`del_flag` smallint(6) NOT NULL DEFAULT '0' COMMENT '删除标记',
PRIMARY KEY (`id`),
KEY `idx_prr_tenant_protocol` (`tenant_no`,`collection_protocol_id`,`del_flag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='采集协议单-退费登记';
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='采集协议单-退费登记';
-- ---------------------------------------------------------------------------
-- 6) 预签约订单
@@ -171,8 +172,9 @@ CREATE TABLE IF NOT EXISTS `biz_presign_order` (
`sample_collect_time` datetime DEFAULT NULL COMMENT '采集时间',
`pay_mode` varchar(8) DEFAULT NULL COMMENT '整单缴费方式 dj/fq',
`contract_amount` decimal(18,2) DEFAULT NULL COMMENT '整单合同金额',
`collector_user_id` varchar(64) DEFAULT NULL COMMENT '采集专员用户ID',
`sales_user_id` varchar(64) DEFAULT NULL COMMENT '市场专员用户ID',
`region_manager_user_id` varchar(64) DEFAULT NULL COMMENT '地区经理用户ID',
`region_manager_user_id` varchar(64) DEFAULT NULL COMMENT '采集经理/地区经理用户ID',
`order_status` varchar(16) DEFAULT NULL COMMENT '订单状态 draft/active/converted/void',
`converted_protocol_id` varchar(64) DEFAULT NULL COMMENT '转成的正式协议ID',
`tenant_no` varchar(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
@@ -186,7 +188,17 @@ CREATE TABLE IF NOT EXISTS `biz_presign_order` (
`del_flag` smallint(6) NOT NULL DEFAULT '0' COMMENT '删除标记',
PRIMARY KEY (`id`),
KEY `idx_po_tenant_protocol_no` (`tenant_no`,`protocol_no`,`del_flag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='预签约订单';
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='预签约订单';
-- 已建表环境增量:采集专员
SET @col_exists := (
SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'biz_presign_order' AND COLUMN_NAME = 'collector_user_id'
);
SET @sql := IF(@col_exists = 0,
'ALTER TABLE `biz_presign_order` ADD COLUMN `collector_user_id` VARCHAR(64) DEFAULT NULL COMMENT ''采集专员用户ID'' AFTER `contract_amount`',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
-- ---------------------------------------------------------------------------
-- 7) 预签约样本类型
@@ -206,7 +218,7 @@ CREATE TABLE IF NOT EXISTS `biz_presign_order_sample_type` (
`del_flag` smallint(6) NOT NULL DEFAULT '0' COMMENT '删除标记',
PRIMARY KEY (`id`),
KEY `idx_post_presign` (`tenant_no`,`presign_order_id`,`del_flag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='预签约订单-样本类型';
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='预签约订单-样本类型';
-- ---------------------------------------------------------------------------
-- 8) 预签约意向金转账笔
@@ -233,4 +245,15 @@ CREATE TABLE IF NOT EXISTS `biz_presign_transfer` (
PRIMARY KEY (`id`),
KEY `idx_pt_tenant_pay_status` (`tenant_no`,`pay_status`,`del_flag`),
KEY `idx_pt_presign` (`tenant_no`,`presign_order_id`,`del_flag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='预签约订单-意向金转账笔';
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='预签约订单-意向金转账笔';
-- ---------------------------------------------------------------------------
-- 9) 已建表校对规则对齐存量库 utf8mb4_unicode_ci(避免 JOIN 报 1267 mix of collations)
-- ---------------------------------------------------------------------------
ALTER TABLE `biz_protocol_sample_payment` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `biz_protocol_payment_schedule` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `biz_protocol_payment_transfer` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `biz_protocol_refund_record` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `biz_presign_order` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `biz_presign_order_sample_type` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `biz_presign_transfer` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
@@ -1,18 +0,0 @@
-- 菜单更名:细胞采集基础信息维护 → 采集地区及医院
-- 对应前端路由/静态菜单:sqxp.ts、backend/app/api/menu.py
UPDATE `sys_menu`
SET
`menu_name` = '采集地区及医院',
`update_time` = NOW()
WHERE `id` = '123'
AND `del_flag` = 0;
-- 兼容按权限标识匹配(若环境环境 id 不同)
UPDATE `sys_menu`
SET
`menu_name` = '采集地区及医院',
`update_time` = NOW()
WHERE `del_flag` = 0
AND `perms` = 'biz:collectionRegion:list'
AND `menu_name` <> '采集地区及医院';
@@ -1,20 +0,0 @@
-- OA 审批实例评论
CREATE TABLE IF NOT EXISTS `oa_instance_comment` (
`id` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '主键ID',
`instance_id` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '所属实例ID',
`content` varchar(1024) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '评论正文',
`attachment_refs_json` text COLLATE utf8mb4_unicode_ci COMMENT '引用表单附件快照 JSON',
`status` varchar(16) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'normal' COMMENT 'normal/revoked',
`revoked_time` datetime DEFAULT NULL COMMENT '撤回时间',
`tenant_no` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
`order_num` int(11) DEFAULT NULL COMMENT '排序号',
`remark` varchar(512) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '备注',
`create_by` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '创建人id(评论作者)',
`create_dept_id` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '创建人部门ID',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_by` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '更新人id',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`del_flag` smallint(6) NOT NULL DEFAULT '0' COMMENT '删除标记',
PRIMARY KEY (`id`),
KEY `idx_oa_comment_tenant_inst_time` (`tenant_no`,`instance_id`,`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='OA审批实例评论';
@@ -1,97 +0,0 @@
-- 评论 @ 用户:查看授权(不写入抄送任务)
ALTER TABLE `oa_instance_comment`
ADD COLUMN `mention_user_ids_json` text COLLATE utf8mb4_unicode_ci NULL COMMENT '评论@用户ID列表 JSON' AFTER `revoked_time`;
CREATE TABLE IF NOT EXISTS `oa_instance_view_grant` (
`id` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '主键ID',
`instance_id` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '实例ID',
`user_id` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '被授权查看人',
`source` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'comment_mention' COMMENT 'comment_mention',
`comment_id` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '来源评论ID,撤回评论不删除授权',
`granted_by` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '授权人',
`tenant_no` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
`order_num` int(11) DEFAULT NULL COMMENT '排序号',
`remark` varchar(512) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '备注',
`create_by` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '创建人id',
`create_dept_id` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '创建人部门ID',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_by` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '更新人id',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`del_flag` smallint(6) NOT NULL DEFAULT '0' COMMENT '删除标记',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_oa_view_grant_user` (`tenant_no`,`instance_id`,`user_id`),
KEY `idx_oa_view_grant_user_time` (`tenant_no`,`user_id`,`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='OA审批实例查看授权';
-- 移动端「提到我的」:挂在与「抄送我的」相同的父菜单下,并复制其角色授权
INSERT INTO `sys_menu` (
`id`, `menu_name`, `parent_id`, `menu_type`, `path`, `component`, `perms`,
`is_frame`, `visible`, `status`, `tenant_no`, `order_num`, `remark`,
`create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag`
)
SELECT
MD5(CONCAT('oa-mention-', s.`tenant_no`, '-', s.`id`)),
'提到我的',
s.`parent_id`,
s.`menu_type`,
'/pages/oa/mentions/index',
s.`component`,
'oa:mention',
s.`is_frame`,
s.`visible`,
s.`status`,
s.`tenant_no`,
IFNULL(s.`order_num`, 0) + 1,
'评论@后可查看的审批单',
s.`create_by`,
s.`create_dept_id`,
NOW(),
s.`update_by`,
NOW(),
0
FROM `sys_menu` s
WHERE s.`del_flag` = 0
AND s.`menu_name` = '抄送我的'
AND s.`path` LIKE '%oa/cc%'
AND NOT EXISTS (
SELECT 1 FROM `sys_menu` x
WHERE x.`del_flag` = 0
AND x.`tenant_no` = s.`tenant_no`
AND x.`path` LIKE '%oa/mentions%'
);
INSERT INTO `sys_role_menu` (
`id`, `role_id`, `menu_id`, `tenant_no`, `order_num`, `remark`,
`create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag`
)
SELECT
MD5(CONCAT('oa-mention-role-', rm.`role_id`, '-', m.`id`)),
rm.`role_id`,
m.`id`,
m.`tenant_no`,
NULL,
NULL,
rm.`create_by`,
IFNULL(rm.`create_dept_id`, ''),
NOW(),
rm.`update_by`,
NOW(),
0
FROM `sys_menu` m
JOIN `sys_menu` cc
ON cc.`del_flag` = 0
AND cc.`tenant_no` = m.`tenant_no`
AND cc.`parent_id` = m.`parent_id`
AND cc.`menu_name` = '抄送我的'
AND cc.`path` LIKE '%oa/cc%'
JOIN `sys_role_menu` rm
ON rm.`del_flag` = 0
AND rm.`menu_id` = cc.`id`
WHERE m.`del_flag` = 0
AND m.`path` LIKE '%oa/mentions%'
AND NOT EXISTS (
SELECT 1 FROM `sys_role_menu` x
WHERE x.`del_flag` = 0
AND x.`role_id` = rm.`role_id`
AND x.`menu_id` = m.`id`
);
@@ -1,68 +0,0 @@
-- =============================================================================
-- 清空 OA 审批「运行时实例」数据(上线前清理测试数据用)
--
-- 删除范围(物理删除):
-- oa_instance_view_grant 评论@产生的查看授权
-- oa_instance_comment 实例评论
-- oa_relation 关联审批
-- oa_instance_event 实例操作事件
-- oa_task 待办/已办/抄送任务
-- oa_instance 审批实例
-- oa_instance_draft 发起审批草稿(非模板设计草稿)
--
-- 保留(不删除):
-- oa_app_group / oa_app / oa_app_version 流程定义与已发布版本
-- oa_receive_account 收款账户主数据
--
-- 使用前请先备份;默认清理全部租户。若只清某一租户,取消下方 @tenant_no 注释并赋值。
-- =============================================================================
-- SET @tenant_no = 'zkxw';
START TRANSACTION;
-- 1) 评论查看授权
DELETE FROM `oa_instance_view_grant`
-- WHERE `tenant_no` = @tenant_no
;
-- 2) 实例评论
DELETE FROM `oa_instance_comment`
-- WHERE `tenant_no` = @tenant_no
;
-- 3) 关联审批
DELETE FROM `oa_relation`
-- WHERE `tenant_no` = @tenant_no
;
-- 4) 实例事件
DELETE FROM `oa_instance_event`
-- WHERE `tenant_no` = @tenant_no
;
-- 5) 审批任务
DELETE FROM `oa_task`
-- WHERE `tenant_no` = @tenant_no
;
-- 6) 审批实例
DELETE FROM `oa_instance`
-- WHERE `tenant_no` = @tenant_no
;
-- 7) 发起草稿
DELETE FROM `oa_instance_draft`
-- WHERE `tenant_no` = @tenant_no
;
COMMIT;
-- 执行后核对(期望均为 0)
SELECT 'oa_instance_view_grant' AS tbl, COUNT(*) AS cnt FROM `oa_instance_view_grant`
UNION ALL SELECT 'oa_instance_comment', COUNT(*) FROM `oa_instance_comment`
UNION ALL SELECT 'oa_relation', COUNT(*) FROM `oa_relation`
UNION ALL SELECT 'oa_instance_event', COUNT(*) FROM `oa_instance_event`
UNION ALL SELECT 'oa_task', COUNT(*) FROM `oa_task`
UNION ALL SELECT 'oa_instance', COUNT(*) FROM `oa_instance`
UNION ALL SELECT 'oa_instance_draft', COUNT(*) FROM `oa_instance_draft`;
@@ -0,0 +1,73 @@
-- =============================================================================
-- 预签约订单菜单:插入 sys_menu,并授权给已有「采集协议单」的角色
-- 测试库 zkxw-sc 已确认原先没有该菜单行。
-- 菜单位置:采集协议单 之下、缴费信息/样本信息管理 之上
-- id: 50000000000000000000000000000020
-- perms: cell-storage:presign-order:list
-- =============================================================================
INSERT INTO sys_menu (
id, menu_name, parent_id, menu_type, path, component, perms,
is_frame, visible, status, tenant_no, order_num, remark,
create_by, create_dept_id, create_time, update_by, update_time, del_flag
)
SELECT
'50000000000000000000000000000020',
'预签约订单',
'CEL00000000000000000000000000001',
'C',
'presign-order',
'/cell-storage/presign-order/index',
'cell-storage:presign-order:list',
1,
'1',
'1',
'zkxw',
3,
'细胞存储:预签约订单',
NULL,
'',
NOW(),
NULL,
NOW(),
0
FROM DUAL
WHERE NOT EXISTS (
SELECT 1 FROM sys_menu m
WHERE m.del_flag = 0
AND (
m.id = '50000000000000000000000000000020'
OR m.perms = 'cell-storage:presign-order:list'
)
);
-- 已有采集协议单权限的角色补授权(幂等)
INSERT INTO sys_role_menu (
id, role_id, menu_id, tenant_no, order_num, remark,
create_by, create_dept_id, create_time, update_by, update_time, del_flag
)
SELECT
MD5(CONCAT(r.id, '|50000000000000000000000000000020')),
r.id,
'50000000000000000000000000000020',
IFNULL(NULLIF(r.tenant_no, ''), 'zkxw'),
0,
'grant presign-order to protocol-audit roles',
NULL,
'',
NOW(),
NULL,
NOW(),
0
FROM sys_role r
INNER JOIN sys_role_menu rm
ON rm.role_id = r.id
AND rm.menu_id = '50000000000000000000000000000003'
AND rm.del_flag = 0
WHERE r.del_flag = 0
AND NOT EXISTS (
SELECT 1 FROM sys_role_menu x
WHERE x.role_id = r.id
AND x.menu_id = '50000000000000000000000000000020'
AND x.del_flag = 0
);
@@ -87,11 +87,33 @@ WHERE NOT EXISTS (
)
);
-- 3) 可选:为已有角色补授权(将 super_admin 角色 id 替换为实际值后取消注释)
-- INSERT INTO sys_role_menu (id, role_id, menu_id, tenant_no, create_time, update_time, del_flag)
-- SELECT UUID(), '<role_id>', '904b5173519411f1944300163e3bdd96', 'zkxw', NOW(), NOW(), 0
-- FROM DUAL
-- WHERE NOT EXISTS (
-- SELECT 1 FROM sys_role_menu rm
-- WHERE rm.menu_id = '904b5173519411f1944300163e3bdd96' AND rm.role_id = '<role_id>' AND rm.del_flag = 0
-- );
-- 3) 已有「采集协议单」权限的角色补授权(幂等)
INSERT INTO sys_role_menu (
id, role_id, menu_id, tenant_no, order_num, remark,
create_by, create_dept_id, create_time, update_by, update_time, del_flag
)
SELECT
MD5(CONCAT(r.id, '|904b5173519411f1944300163e3bdd96')),
r.id,
'904b5173519411f1944300163e3bdd96',
IFNULL(NULLIF(r.tenant_no, ''), 'zkxw'),
0,
'grant payment-info to protocol-audit roles',
NULL,
'',
NOW(),
NULL,
NOW(),
0
FROM sys_role r
INNER JOIN sys_role_menu rm
ON rm.role_id = r.id
AND rm.menu_id = '50000000000000000000000000000003'
AND rm.del_flag = 0
WHERE r.del_flag = 0
AND NOT EXISTS (
SELECT 1 FROM sys_role_menu x
WHERE x.role_id = r.id
AND x.menu_id = '904b5173519411f1944300163e3bdd96'
AND x.del_flag = 0
);
@@ -0,0 +1,29 @@
-- =============================================================================
-- 下线「科研捐赠 → 样本信息管理」侧栏菜单(2026-10-06)
-- =============================================================================
--
-- 【主路径 — 前端固定菜单】
-- 当前 Web 管理端使用 VITE_ACCESS_MODE=frontend,菜单树已从以下两处移除该子项:
-- - web-admin/src/router/modules/sqxp.ts
-- - backend/app/api/menu.py
-- 样本信息仍从「细胞存储 → 样本信息管理」进入(统一页含科研捐赠 Tab)。
-- 前端模式环境 **无需执行** 本脚本;保留供 DB 菜单模式同步。
--
-- 科研捐赠目录 parent_id: RSC00000000000000000000000000001
-- 样本信息 id: 60000000000000000000000000000004
-- perms: research-donation:sample-info:list
-- visible: '0'=隐藏(权限码保留,统一页 Tab / 接口授权仍可用)
-- =============================================================================
UPDATE sys_menu
SET visible = '0',
update_time = NOW()
WHERE del_flag = 0
AND (
id = '60000000000000000000000000000004'
OR perms = 'research-donation:sample-info:list'
OR (
path = 'sample-info'
AND parent_id = 'RSC00000000000000000000000000001'
)
);
@@ -0,0 +1,10 @@
-- 客户主档:通用个人档案字段
-- Spec: docs/superpowers/specs/2026-10-08-customer-profile-expand-sync-design.md
SET NAMES utf8mb4;
ALTER TABLE `biz_customer`
ADD COLUMN `birth_ym` char(6) DEFAULT NULL COMMENT '出生年月YYYYMM' AFTER `age`,
ADD COLUMN `ethnic` varchar(32) DEFAULT NULL COMMENT '民族' AFTER `birth_ym`,
ADD COLUMN `email` varchar(128) DEFAULT NULL COMMENT '邮箱' AFTER `ethnic`,
ADD COLUMN `address` varchar(512) DEFAULT NULL COMMENT '家庭住址' AFTER `email`;
@@ -0,0 +1,10 @@
-- 采集协议 / 科研捐赠:地区经理用户ID
-- Spec: docs/superpowers/specs/2026-10-08-protocol-market-specialist-region-manager-design.md
SET NAMES utf8mb4;
ALTER TABLE `biz_protocol_collection_info`
ADD COLUMN `region_manager_user_id` varchar(64) DEFAULT NULL COMMENT '地区经理用户ID' AFTER `sales_user_id`;
ALTER TABLE `biz_research_donation_collection`
ADD COLUMN `region_manager_user_id` varchar(64) DEFAULT NULL COMMENT '地区经理用户ID' AFTER `sales_user_id`;
@@ -0,0 +1,21 @@
-- =============================================================================
-- 侧栏二级菜单「细胞存储」更名为「存储服务」
-- id: CEL00000000000000000000000000001
-- 原因:该目录下统一承载细胞存储与科研捐赠业务入口
--
-- 【前端固定菜单】同步修改:
-- - web-admin/src/router/modules/sqxp.ts
-- - backend/app/api/menu.py
-- =============================================================================
UPDATE sys_menu
SET menu_name = '存储服务',
remark = CASE
WHEN remark IS NULL OR TRIM(remark) = '' THEN '存储服务:含细胞存储与科研捐赠统一业务入口'
WHEN remark LIKE '%细胞存储%' THEN REPLACE(remark, '细胞存储', '存储服务')
ELSE remark
END,
update_time = NOW()
WHERE del_flag = 0
AND id = 'CEL00000000000000000000000000001'
AND menu_name = '细胞存储';
@@ -0,0 +1,30 @@
-- 若已按旧规则 YF+YYYY-MM-DD+序号 回填,纠正为 YF+YYYYMMDD+001~999
SET @grp := '';
SET @seq := 0;
UPDATE biz_sample_freight f
INNER JOIN (
SELECT
id,
CONCAT(
'YF',
DATE_FORMAT(create_time, '%Y%m%d'),
LPAD(
@seq := IF(
@grp = CONCAT(tenant_no, '|', DATE_FORMAT(create_time, '%Y%m%d')),
@seq + 1,
1
),
3,
'0'
)
) AS new_no,
@grp := CONCAT(tenant_no, '|', DATE_FORMAT(create_time, '%Y%m%d')) AS _grp
FROM biz_sample_freight
ORDER BY tenant_no ASC, create_time ASC, id ASC
) t ON f.id = t.id
SET f.freight_no = t.new_no;
ALTER TABLE biz_sample_freight
MODIFY COLUMN freight_no VARCHAR(32) NOT NULL DEFAULT '' COMMENT '运费批次号 YF+YYYYMMDD+序号';
@@ -0,0 +1,35 @@
-- 运费批次号:YF + YYYYMMDD + 001~999(按租户、按日递增)
ALTER TABLE biz_sample_freight
ADD COLUMN freight_no VARCHAR(32) NOT NULL DEFAULT '' COMMENT '运费批次号 YF+YYYYMMDD+序号' AFTER id;
-- 按租户 + 创建日回填历史数据
SET @grp := '';
SET @seq := 0;
UPDATE biz_sample_freight f
INNER JOIN (
SELECT
id,
CONCAT(
'YF',
DATE_FORMAT(create_time, '%Y%m%d'),
LPAD(
@seq := IF(
@grp = CONCAT(tenant_no, '|', DATE_FORMAT(create_time, '%Y%m%d')),
@seq + 1,
1
),
3,
'0'
)
) AS new_no,
@grp := CONCAT(tenant_no, '|', DATE_FORMAT(create_time, '%Y%m%d')) AS _grp
FROM biz_sample_freight
ORDER BY tenant_no ASC, create_time ASC, id ASC
) t ON f.id = t.id
SET f.freight_no = t.new_no
WHERE f.freight_no = '' OR f.freight_no IS NULL;
ALTER TABLE biz_sample_freight
ADD UNIQUE KEY uk_sample_freight_tenant_no (tenant_no, freight_no);
@@ -0,0 +1,74 @@
-- =============================================================================
-- 催缴信息菜单:插在缴费信息之下、样本信息管理之上
-- id: 50000000000000000000000000000022
-- perms / menuCode: cellStorage:paymentChase:list
-- =============================================================================
INSERT INTO sys_menu (
id, menu_name, parent_id, menu_type, path, component, perms,
is_frame, visible, status, tenant_no, order_num, remark,
create_by, create_dept_id, create_time, update_by, update_time, del_flag
)
SELECT
'50000000000000000000000000000022',
'催缴信息',
'CEL00000000000000000000000000001',
'C',
'payment-chase',
'/cell-storage/payment-chase/index',
'cellStorage:paymentChase:list',
1,
'1',
'1',
'zkxw',
5,
'细胞存储:催缴信息(逾期∪近30天)',
NULL,
'',
NOW(),
NULL,
NOW(),
0
FROM DUAL
WHERE NOT EXISTS (
SELECT 1 FROM sys_menu m
WHERE m.del_flag = 0
AND (
m.id = '50000000000000000000000000000022'
OR m.perms = 'cellStorage:paymentChase:list'
)
);
-- 已有缴费信息权限的角色补授权(幂等)
INSERT INTO sys_role_menu (
id, role_id, menu_id, tenant_no, order_num, remark,
create_by, create_dept_id, create_time, update_by, update_time, del_flag
)
SELECT
MD5(CONCAT(r.id, '|50000000000000000000000000000022')),
r.id,
'50000000000000000000000000000022',
IFNULL(NULLIF(r.tenant_no, ''), 'zkxw'),
0,
'grant payment-chase to payment-info roles',
NULL,
'',
NOW(),
NULL,
NOW(),
0
FROM sys_role r
INNER JOIN sys_role_menu rm
ON rm.role_id = r.id
AND rm.del_flag = 0
INNER JOIN sys_menu m
ON m.id = rm.menu_id
AND m.del_flag = 0
AND m.perms = 'cellStorage:paymentInfo:list'
WHERE r.del_flag = 0
AND NOT EXISTS (
SELECT 1 FROM sys_role_menu x
WHERE x.del_flag = 0
AND x.role_id = r.id
AND x.menu_id = '50000000000000000000000000000022'
);
@@ -0,0 +1,8 @@
-- 意向金不落协议侧快照表:正式协议通过 biz_collection_protocol.source_presign_order_id
-- 关联预签订单,读写同一份 biz_presign_transfer,保证财务审批/调整两边一致。
--
-- 若此前已执行过「创建 biz_protocol_deposit_transfer」的旧脚本,执行下方 DROP 清理。
SET NAMES utf8mb4;
DROP TABLE IF EXISTS `biz_protocol_deposit_transfer`;