提交
This commit is contained in:
1 parent
e6072457fd
commit
be4fab78e1
578 files changed
+174415
-214
No files matched your search
@@ -0,0 +1,110 @@
|
||||
-- =============================================
|
||||
-- 1. 保险公司主表
|
||||
-- =============================================
|
||||
DROP TABLE IF EXISTS `biz_insurance_company`;
|
||||
CREATE TABLE `biz_insurance_company` (
|
||||
`id` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '主键ID',
|
||||
`company_name` varchar(200) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '保险公司名称',
|
||||
`company_address` varchar(512) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '公司地址',
|
||||
`contact_name` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '联系人',
|
||||
`contact_phone` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '联系电话',
|
||||
`status` char(1) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '1' COMMENT '1正常 0停用',
|
||||
`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` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_ins_company` (`tenant_no`,`del_flag`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='保险公司';
|
||||
|
||||
-- =============================================
|
||||
-- 2. 保险公司开票信息
|
||||
-- =============================================
|
||||
DROP TABLE IF EXISTS `biz_insurance_company_invoice`;
|
||||
CREATE TABLE `biz_insurance_company_invoice` (
|
||||
`id` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '主键ID',
|
||||
`insurance_company_id` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '保险公司ID',
|
||||
`company_name` varchar(200) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '单位名称',
|
||||
`tax_no` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '税号',
|
||||
`company_address` varchar(512) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '单位地址',
|
||||
`company_phone` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '电话',
|
||||
`bank_name` varchar(200) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '开户银行',
|
||||
`bank_account` 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` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_ins_inv` (`insurance_company_id`,`del_flag`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='保险公司开票信息';
|
||||
|
||||
-- =============================================
|
||||
-- 3. 保险项目价格
|
||||
-- =============================================
|
||||
DROP TABLE IF EXISTS `biz_insurance_project_price`;
|
||||
CREATE TABLE `biz_insurance_project_price` (
|
||||
`id` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '主键ID',
|
||||
`insurance_company_id` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '保险公司ID',
|
||||
`project_name` varchar(200) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '项目名称',
|
||||
`project_fee` decimal(18,2) DEFAULT NULL COMMENT '项目费用(元)',
|
||||
`status` char(1) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '1' COMMENT '1正常 0停用',
|
||||
`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` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_ins_proj` (`insurance_company_id`,`del_flag`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='保险项目价格';
|
||||
|
||||
-- =============================================
|
||||
-- 4. 满月待办表扩展(新增 8 个保险字段)
|
||||
-- =============================================
|
||||
ALTER TABLE `biz_protocol_fullmoon_todo`
|
||||
ADD COLUMN `insurance_company_id` varchar(64) DEFAULT NULL COMMENT '保险公司ID' AFTER `insurance_attachments`,
|
||||
ADD COLUMN `insurance_company_name` varchar(200) DEFAULT NULL COMMENT '保险公司名称(冗余快照)' AFTER `insurance_company_id`,
|
||||
ADD COLUMN `insurance_type` varchar(200) DEFAULT NULL COMMENT '保险险种' AFTER `insurance_company_name`,
|
||||
ADD COLUMN `insurance_policy_no` varchar(100) DEFAULT NULL COMMENT '保险单号' AFTER `insurance_type`,
|
||||
ADD COLUMN `insurance_effective_date` char(8) DEFAULT NULL COMMENT '保险单生效时间YYYYMMDD' AFTER `insurance_policy_no`,
|
||||
ADD COLUMN `insurance_expiry_date` char(8) DEFAULT NULL COMMENT '保险单失效时间YYYYMMDD' AFTER `insurance_effective_date`,
|
||||
ADD COLUMN `insurance_subscribed` char(1) DEFAULT '0' COMMENT '是否已订购保险(1是 0否)' AFTER `insurance_expiry_date`,
|
||||
ADD COLUMN `insurance_fee` decimal(18,2) DEFAULT NULL COMMENT '保单费用(元)' AFTER `insurance_subscribed`;
|
||||
|
||||
-- =============================================
|
||||
-- 5. 菜单数据初始化
|
||||
-- =============================================
|
||||
-- 父菜单:细胞存储管理 = 50000000000000000000000000000001 (parent_id=2)
|
||||
-- 父菜单:基础信息管理 = 120 (parent_id=2)
|
||||
|
||||
-- 储存证管理:复用已软删除的 ...06 ID(原"分期缴费预警" del_flag=1)
|
||||
UPDATE `sys_menu` SET
|
||||
`menu_name` = '储存证管理',
|
||||
`path` = 'storage-cert',
|
||||
`component` = '/cell-storage/storage-cert/index',
|
||||
`perms` = 'cell-storage:storage-cert:list',
|
||||
`order_num` = 6,
|
||||
`del_flag` = 0,
|
||||
`update_time` = NOW()
|
||||
WHERE `id` = '50000000000000000000000000000006';
|
||||
|
||||
-- 满月待办管理:新插入
|
||||
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`)
|
||||
VALUES ('50000000000000000000000000000008', '满月待办管理', '50000000000000000000000000000001', 'C', 'fullmoon-todo', '/cell-storage/fullmoon-todo/index', 'cell-storage:fullmoon-todo:list', 1, '1', '1', 'zkxw', 7, NULL, '1', '', NOW(), '1', NOW(), 0);
|
||||
|
||||
-- 保险公司及项目价格:新插入
|
||||
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`)
|
||||
VALUES ('40000000000000000000000000000007', '保险公司及项目价格', '120', 'C', 'insurance-company', '/basic-info/insurance-company/index', 'basic-info:insurance-company:list', 1, '1', '1', 'zkxw', 6, NULL, '1', '', NOW(), '1', NOW(), 0);
|
||||
@@ -0,0 +1,281 @@
|
||||
-- =============================================
|
||||
-- 保险公司及项目价格 — 演示/初始化数据
|
||||
-- =============================================
|
||||
-- 前置条件:已执行 docs/sql/insurance_and_fullmoon.sql(建表 + 菜单)
|
||||
-- 用法:mysql -u... -p... <dbname> < docs/sql/insurance_company_seed.sql
|
||||
-- 说明:使用固定主键,先删后插,可重复执行;仅写入 tenant_no=zkxw 的演示数据
|
||||
-- =============================================
|
||||
|
||||
SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
|
||||
-- 固定主键(32 位十六进制,无连字符;变量显式指定与表字段一致的 collation)
|
||||
SET @ins_co_1 = 'A1B2C3D4E5F6478091A2B3C4D5E6F701' COLLATE utf8mb4_unicode_ci;
|
||||
SET @ins_co_2 = 'A1B2C3D4E5F6478091A2B3C4D5E6F702' COLLATE utf8mb4_unicode_ci;
|
||||
SET @ins_co_3 = 'A1B2C3D4E5F6478091A2B3C4D5E6F703' COLLATE utf8mb4_unicode_ci;
|
||||
SET @ins_inv_1 = 'B1B2C3D4E5F6478091A2B3C4D5E6F701' COLLATE utf8mb4_unicode_ci;
|
||||
SET @ins_inv_2 = 'B1B2C3D4E5F6478091A2B3C4D5E6F702' COLLATE utf8mb4_unicode_ci;
|
||||
SET @ins_inv_3 = 'B1B2C3D4E5F6478091A2B3C4D5E6F703' COLLATE utf8mb4_unicode_ci;
|
||||
SET @ins_pr_1 = 'C1B2C3D4E5F6478091A2B3C4D5E6F701' COLLATE utf8mb4_unicode_ci;
|
||||
SET @ins_pr_2 = 'C1B2C3D4E5F6478091A2B3C4D5E6F702' COLLATE utf8mb4_unicode_ci;
|
||||
SET @ins_pr_3 = 'C1B2C3D4E5F6478091A2B3C4D5E6F703' COLLATE utf8mb4_unicode_ci;
|
||||
SET @ins_pr_4 = 'C1B2C3D4E5F6478091A2B3C4D5E6F704' COLLATE utf8mb4_unicode_ci;
|
||||
SET @ins_pr_5 = 'C1B2C3D4E5F6478091A2B3C4D5E6F705' COLLATE utf8mb4_unicode_ci;
|
||||
SET @ins_pr_6 = 'C1B2C3D4E5F6478091A2B3C4D5E6F706' COLLATE utf8mb4_unicode_ci;
|
||||
SET @admin_id = 'd3000000000000000000000000000001' COLLATE utf8mb4_unicode_ci;
|
||||
|
||||
-- 清理旧种子(子表 → 主表;DELETE 使用字面量避免 IN 与变量 collation 混用)
|
||||
DELETE FROM `biz_insurance_project_price`
|
||||
WHERE `id` IN (
|
||||
'C1B2C3D4E5F6478091A2B3C4D5E6F701',
|
||||
'C1B2C3D4E5F6478091A2B3C4D5E6F702',
|
||||
'C1B2C3D4E5F6478091A2B3C4D5E6F703',
|
||||
'C1B2C3D4E5F6478091A2B3C4D5E6F704',
|
||||
'C1B2C3D4E5F6478091A2B3C4D5E6F705',
|
||||
'C1B2C3D4E5F6478091A2B3C4D5E6F706'
|
||||
);
|
||||
DELETE FROM `biz_insurance_company_invoice`
|
||||
WHERE `id` IN (
|
||||
'B1B2C3D4E5F6478091A2B3C4D5E6F701',
|
||||
'B1B2C3D4E5F6478091A2B3C4D5E6F702',
|
||||
'B1B2C3D4E5F6478091A2B3C4D5E6F703'
|
||||
);
|
||||
DELETE FROM `biz_insurance_company`
|
||||
WHERE `id` IN (
|
||||
'A1B2C3D4E5F6478091A2B3C4D5E6F701',
|
||||
'A1B2C3D4E5F6478091A2B3C4D5E6F702',
|
||||
'A1B2C3D4E5F6478091A2B3C4D5E6F703'
|
||||
);
|
||||
|
||||
-- =============================================
|
||||
-- 1. 保险公司主表
|
||||
-- =============================================
|
||||
INSERT INTO `biz_insurance_company` (
|
||||
`id`, `company_name`, `company_address`, `contact_name`, `contact_phone`,
|
||||
`status`, `tenant_no`, `order_num`, `remark`,
|
||||
`create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag`
|
||||
) VALUES
|
||||
(
|
||||
@ins_co_1,
|
||||
'中国人寿保险股份有限公司安徽省分公司',
|
||||
'安徽省合肥市蜀山区长江西路200号国寿大厦',
|
||||
'张经理',
|
||||
'0551-62880001',
|
||||
'1',
|
||||
'zkxw',
|
||||
1,
|
||||
'满月待办默认合作保险公司(演示数据)',
|
||||
@admin_id,
|
||||
'',
|
||||
NOW(),
|
||||
@admin_id,
|
||||
NOW(),
|
||||
0
|
||||
),
|
||||
(
|
||||
@ins_co_2,
|
||||
'中国平安财产保险股份有限公司合肥中心支公司',
|
||||
'安徽省合肥市包河区徽州大道与九华山路交口平安大厦',
|
||||
'李经理',
|
||||
'0551-63660002',
|
||||
'1',
|
||||
'zkxw',
|
||||
2,
|
||||
'演示数据',
|
||||
@admin_id,
|
||||
'',
|
||||
NOW(),
|
||||
@admin_id,
|
||||
NOW(),
|
||||
0
|
||||
),
|
||||
(
|
||||
@ins_co_3,
|
||||
'太平洋人寿保险股份有限公司安徽分公司',
|
||||
'安徽省合肥市庐阳区阜阳北路与北一环交口',
|
||||
'王经理',
|
||||
'0551-65660003',
|
||||
'0',
|
||||
'zkxw',
|
||||
3,
|
||||
'停用状态示例,用于筛选演示',
|
||||
@admin_id,
|
||||
'',
|
||||
NOW(),
|
||||
@admin_id,
|
||||
NOW(),
|
||||
0
|
||||
);
|
||||
|
||||
-- =============================================
|
||||
-- 2. 保险公司开票信息
|
||||
-- =============================================
|
||||
INSERT INTO `biz_insurance_company_invoice` (
|
||||
`id`, `insurance_company_id`, `company_name`, `tax_no`, `company_address`, `company_phone`,
|
||||
`bank_name`, `bank_account`, `tenant_no`, `order_num`, `remark`,
|
||||
`create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag`
|
||||
) VALUES
|
||||
(
|
||||
@ins_inv_1,
|
||||
@ins_co_1,
|
||||
'中国人寿保险股份有限公司安徽省分公司',
|
||||
'91340000123456789A',
|
||||
'安徽省合肥市蜀山区长江西路200号',
|
||||
'0551-62880001',
|
||||
'中国工商银行合肥蜀山支行',
|
||||
'6222021234567890123',
|
||||
'zkxw',
|
||||
1,
|
||||
NULL,
|
||||
@admin_id,
|
||||
'',
|
||||
NOW(),
|
||||
@admin_id,
|
||||
NOW(),
|
||||
0
|
||||
),
|
||||
(
|
||||
@ins_inv_2,
|
||||
@ins_co_2,
|
||||
'中国平安财产保险股份有限公司合肥中心支公司',
|
||||
'91340000987654321B',
|
||||
'安徽省合肥市包河区徽州大道平安大厦',
|
||||
'0551-63660002',
|
||||
'招商银行合肥分行',
|
||||
'6225881234567890123',
|
||||
'zkxw',
|
||||
1,
|
||||
NULL,
|
||||
@admin_id,
|
||||
'',
|
||||
NOW(),
|
||||
@admin_id,
|
||||
NOW(),
|
||||
0
|
||||
),
|
||||
(
|
||||
@ins_inv_3,
|
||||
@ins_co_3,
|
||||
'太平洋人寿保险股份有限公司安徽分公司',
|
||||
'91340000555555555C',
|
||||
'安徽省合肥市庐阳区阜阳北路',
|
||||
'0551-65660003',
|
||||
'中国建设银行合肥庐阳支行',
|
||||
'6227001234567890123',
|
||||
'zkxw',
|
||||
1,
|
||||
NULL,
|
||||
@admin_id,
|
||||
'',
|
||||
NOW(),
|
||||
@admin_id,
|
||||
NOW(),
|
||||
0
|
||||
);
|
||||
|
||||
-- =============================================
|
||||
-- 3. 保险项目价格
|
||||
-- =============================================
|
||||
INSERT INTO `biz_insurance_project_price` (
|
||||
`id`, `insurance_company_id`, `project_name`, `project_fee`, `status`,
|
||||
`tenant_no`, `order_num`, `remark`,
|
||||
`create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag`
|
||||
) VALUES
|
||||
-- 中国人寿:细胞储存相关险种
|
||||
(
|
||||
@ins_pr_1,
|
||||
@ins_co_1,
|
||||
'新生儿干细胞储存险',
|
||||
1280.00,
|
||||
'1',
|
||||
'zkxw',
|
||||
1,
|
||||
'适用于满月待办订购,含首年保障',
|
||||
@admin_id,
|
||||
'',
|
||||
NOW(),
|
||||
@admin_id,
|
||||
NOW(),
|
||||
0
|
||||
),
|
||||
(
|
||||
@ins_pr_2,
|
||||
@ins_co_1,
|
||||
'脐带血储存综合险',
|
||||
2580.00,
|
||||
'1',
|
||||
'zkxw',
|
||||
2,
|
||||
'脐带血+干细胞联合保障',
|
||||
@admin_id,
|
||||
'',
|
||||
NOW(),
|
||||
@admin_id,
|
||||
NOW(),
|
||||
0
|
||||
),
|
||||
(
|
||||
@ins_pr_3,
|
||||
@ins_co_1,
|
||||
'细胞储存年度续保',
|
||||
680.00,
|
||||
'1',
|
||||
'zkxw',
|
||||
3,
|
||||
'次年续保参考价',
|
||||
@admin_id,
|
||||
'',
|
||||
NOW(),
|
||||
@admin_id,
|
||||
NOW(),
|
||||
0
|
||||
),
|
||||
-- 平安:分级保障计划
|
||||
(
|
||||
@ins_pr_4,
|
||||
@ins_co_2,
|
||||
'新生儿保障计划(基础版)',
|
||||
980.00,
|
||||
'1',
|
||||
'zkxw',
|
||||
1,
|
||||
NULL,
|
||||
@admin_id,
|
||||
'',
|
||||
NOW(),
|
||||
@admin_id,
|
||||
NOW(),
|
||||
0
|
||||
),
|
||||
(
|
||||
@ins_pr_5,
|
||||
@ins_co_2,
|
||||
'新生儿保障计划(尊享版)',
|
||||
1980.00,
|
||||
'1',
|
||||
'zkxw',
|
||||
2,
|
||||
'含住院津贴及意外医疗',
|
||||
@admin_id,
|
||||
'',
|
||||
NOW(),
|
||||
@admin_id,
|
||||
NOW(),
|
||||
0
|
||||
),
|
||||
-- 太平洋(公司已停用,项目仍可作历史参考)
|
||||
(
|
||||
@ins_pr_6,
|
||||
@ins_co_3,
|
||||
'围产期母婴健康险',
|
||||
1580.00,
|
||||
'0',
|
||||
'zkxw',
|
||||
1,
|
||||
'已停用项目示例',
|
||||
@admin_id,
|
||||
'',
|
||||
NOW(),
|
||||
@admin_id,
|
||||
NOW(),
|
||||
0
|
||||
);
|
||||
@@ -0,0 +1,86 @@
|
||||
-- ----------------------------
|
||||
-- 市场物料库 + 物料变动记录
|
||||
-- ----------------------------
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for biz_material
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `biz_material`;
|
||||
CREATE TABLE `biz_material` (
|
||||
`id` varchar(64) NOT NULL COMMENT '主键ID',
|
||||
`material_code` varchar(64) NOT NULL COMMENT '物料编码',
|
||||
`material_name` varchar(200) NOT NULL COMMENT '物料名称',
|
||||
`category` varchar(50) DEFAULT NULL COMMENT '物料分类(字典表 wllb 管理:xccyw - 宣传物料、ccyw - 采集业务物料 等)',
|
||||
`spec_model` varchar(200) DEFAULT NULL COMMENT '规格型号',
|
||||
`unit` varchar(32) DEFAULT NULL COMMENT '单位',
|
||||
`stock_qty` decimal(18,4) NOT NULL DEFAULT 0.0000 COMMENT '当前库存量',
|
||||
`status` char(1) NOT NULL DEFAULT '1' COMMENT '1-启用 0-停用',
|
||||
`image_urls` varchar(2000) DEFAULT NULL COMMENT '物料图片(多个逗号分隔)',
|
||||
`tenant_no` varchar(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
|
||||
`order_num` int(11) DEFAULT NULL COMMENT '排序号',
|
||||
`remark` varchar(512) DEFAULT NULL COMMENT '备注',
|
||||
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
|
||||
`create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_mat_tenant_code` (`tenant_no`, `material_code`, `del_flag`),
|
||||
KEY `idx_mat_tenant_status` (`tenant_no`, `status`, `del_flag`),
|
||||
KEY `idx_mat_tenant_category` (`tenant_no`, `category`, `del_flag`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='市场物料';
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for biz_material_stock_log
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `biz_material_stock_log`;
|
||||
CREATE TABLE `biz_material_stock_log` (
|
||||
`id` varchar(64) NOT NULL COMMENT '主键ID',
|
||||
`material_id` varchar(64) NOT NULL COMMENT '物料ID',
|
||||
`material_code` varchar(64) DEFAULT NULL COMMENT '物料编码快照',
|
||||
`material_name` varchar(200) DEFAULT NULL COMMENT '物料名称快照',
|
||||
`change_type` varchar(16) NOT NULL COMMENT '变动类型:rk入库 / ck出库',
|
||||
`change_qty` decimal(18,4) NOT NULL COMMENT '变动数量(正数)',
|
||||
`stock_before` decimal(18,4) NOT NULL COMMENT '变动前库存',
|
||||
`stock_after` decimal(18,4) NOT NULL COMMENT '变动后库存',
|
||||
`receiver` varchar(64) DEFAULT NULL COMMENT '领用人(出库时填写)',
|
||||
`purpose` varchar(512) DEFAULT NULL COMMENT '用途/事由',
|
||||
`tenant_no` varchar(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
|
||||
`remark` varchar(512) DEFAULT NULL COMMENT '备注',
|
||||
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
|
||||
`create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_msl_material` (`material_id`, `del_flag`),
|
||||
KEY `idx_msl_tenant_time` (`tenant_no`, `change_type`, `create_time`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='市场物料变动记录';
|
||||
|
||||
-- ----------------------------
|
||||
-- 字典类型:物料类别 (wllb)
|
||||
-- ----------------------------
|
||||
INSERT INTO `sys_dict_type` (`id`, `dict_name`, `dict_type`, `tenant_no`, `order_num`, `remark`, `create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag`)
|
||||
VALUES (REPLACE(UUID(),'-',''), '物料类别', 'wllb', 'zkxw', NULL, '市场物料分类', NULL, '', NOW(), NULL, NOW(), 0);
|
||||
|
||||
-- ----------------------------
|
||||
-- 字典数据:物料类别
|
||||
-- ----------------------------
|
||||
INSERT INTO `sys_dict_data` (`id`, `dict_label`, `dict_value`, `dict_type`, `tenant_no`, `order_num`, `remark`, `create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag`)
|
||||
VALUES (REPLACE(UUID(),'-',''), '宣传物料', 'xccyw', 'wllb', 'zkxw', 1, '市场宣传用物料', NULL, '', NOW(), NULL, NOW(), 0);
|
||||
|
||||
INSERT INTO `sys_dict_data` (`id`, `dict_label`, `dict_value`, `dict_type`, `tenant_no`, `order_num`, `remark`, `create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag`)
|
||||
VALUES (REPLACE(UUID(),'-',''), '采集业务物料', 'ccyw', 'wllb', 'zkxw', 2, '采集业务相关物料', NULL, '', NOW(), NULL, NOW(), 0);
|
||||
|
||||
-- ----------------------------
|
||||
-- 菜单数据:在细胞存储管理下添加物料库和物料变动记录菜单
|
||||
-- ----------------------------
|
||||
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`)
|
||||
VALUES ('50000000000000000000000000000009', '物料库', '50000000000000000000000000000001', 'C', 'material', '/cell-storage/material/index', 'biz:material:list', 1, '1', '1', 'zkxw', 9, NULL, NULL, '', NOW(), NULL, NOW(), 0);
|
||||
|
||||
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`)
|
||||
VALUES ('50000000000000000000000000000010', '物料变动记录', '50000000000000000000000000000001', 'C', 'material-stock-log', '/cell-storage/material-stock-log/index', 'biz:materialStockLog:list', 1, '1', '1', 'zkxw', 10, NULL, NULL, '', NOW(), NULL, NOW(), 0);
|
||||
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,524 @@
|
||||
# 入库生产工单 + 生产任务 + 细胞产品库 设计文档
|
||||
|
||||
> 日期: 2026-05-19
|
||||
> 状态: 已确认
|
||||
> 关联模块: 样本接收、工艺路线管理、库位管理
|
||||
|
||||
---
|
||||
|
||||
## 1. 业务背景
|
||||
|
||||
当前系统中,样本接收(accept_conclusion="js")后会自动触发一个入库质检工单。现在需要在此基础上,同时触发生成一个**入库生产工单**。生产工单可以创建多个**生产任务单**,生产任务单用于记录完整的工艺过程执行数据。
|
||||
|
||||
### 业务流程
|
||||
|
||||
```
|
||||
样本接收(accept_conclusion="js")
|
||||
├→ 自动创建 入库质检工单 (已有)
|
||||
└→ 自动创建 入库生产工单 (新增, 状态=dpz待配置)
|
||||
└→ 用户在工单中手动创建 生产任务单(1:N)
|
||||
├→ 选择一个工艺路线 → 克隆全部步骤(含试剂/耗材/产出/采集项)
|
||||
├→ 可新增/删除工艺步骤
|
||||
├→ 可录入输入(样本或细胞产品)
|
||||
├→ 执行过程中填写实际用量、采集值
|
||||
└→ 录入输出(细胞产品 → 存入细胞产品库 → 关联储物格)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 2. 需求共识
|
||||
|
||||
1. **触发机制**: 样本接收后自动创建入库生产工单(状态为"待配置"),与质检工单在同一个事务中
|
||||
2. **工单→任务关系**: 1对多,用户在工单中自由创建多个生产任务单
|
||||
3. **生产任务单三部分**(全部用子表):
|
||||
- **输入子表**: 可选关联样本或细胞产品
|
||||
- **工艺过程**: 必选一个工艺路线,克隆其所有步骤(含试剂、耗材、产出物、数据采集项),可修改
|
||||
- **输出子表**: 记录产出的细胞产品,关联储物格位置
|
||||
4. **细胞产品库**: 新建 `biz_cell_product` 表(产品编码、类型、规格、储物格、状态等)
|
||||
5. **菜单位置**: 在【生产管理】下新增"入库生产工单"、"生产任务"、"细胞产品库"三个二级菜单
|
||||
6. **数据采集填写**: 克隆数据采集项后,用户在生产执行过程中填写采集值
|
||||
7. **工艺过程可编辑**: 选了工艺路线后可以新增/删除工艺步骤;执行中仍可继续增删
|
||||
8. **实际用量录入**: 用户可录入耗材实际使用量、试剂实际使用量、数据采集值等
|
||||
|
||||
---
|
||||
|
||||
## 3. 数据库设计
|
||||
|
||||
### 3.1 新增表概览(10 张)
|
||||
|
||||
| # | 表名 | 说明 |
|
||||
|---|------|------|
|
||||
| 1 | `biz_cell_product` | 细胞产品库 |
|
||||
| 2 | `biz_production_work_order` | 入库生产工单 |
|
||||
| 3 | `biz_production_task` | 生产任务 |
|
||||
| 4 | `biz_production_task_input` | 任务输入子表 |
|
||||
| 5 | `biz_production_task_step` | 任务工艺步骤(克隆自路线) |
|
||||
| 6 | `biz_production_task_step_reagent` | 步骤试剂 + 实际用量 |
|
||||
| 7 | `biz_production_task_step_consumable` | 步骤耗材 + 实际用量 |
|
||||
| 8 | `biz_production_task_step_output` | 步骤产出物 + 实际条码 |
|
||||
| 9 | `biz_production_task_step_data_collection` | 步骤数据采集项 + 填写值 |
|
||||
| 10 | `biz_production_task_output` | 任务输出子表(细胞产品+储物格) |
|
||||
|
||||
### 3.2 表关系图
|
||||
|
||||
```
|
||||
biz_sample_reception ──→ biz_production_work_order ──→ biz_production_task
|
||||
│ │
|
||||
└──→ biz_qc_work_order (已有) ├── biz_production_task_input
|
||||
├── biz_production_task_step (克隆自)
|
||||
│ └── biz_process_route_step
|
||||
│ ├── ..._reagent
|
||||
│ ├── ..._consumable
|
||||
│ ├── ..._output
|
||||
│ └── ..._data_collection
|
||||
├── biz_production_task_output
|
||||
└── biz_cell_product ← 细胞产品库
|
||||
└── biz_storage_facility_slot (库位)
|
||||
```
|
||||
|
||||
### 3.3 详细字段设计
|
||||
|
||||
#### 3.3.1 `biz_cell_product` — 细胞产品库
|
||||
|
||||
```sql
|
||||
CREATE TABLE `biz_cell_product` (
|
||||
`id` varchar(64) NOT NULL COMMENT '主键ID',
|
||||
`product_code` varchar(64) NOT NULL COMMENT '产品编码',
|
||||
`product_name` varchar(200) NOT NULL COMMENT '产品名称',
|
||||
`product_type_id` varchar(64) DEFAULT NULL COMMENT '细胞产品类型ID',
|
||||
`spec_id` varchar(64) DEFAULT NULL COMMENT '规格ID',
|
||||
`batch_no` varchar(64) DEFAULT NULL COMMENT '批次号',
|
||||
`storage_slot_id` varchar(64) DEFAULT NULL COMMENT '储物格ID',
|
||||
`product_status` varchar(16) NOT NULL DEFAULT 'zk' COMMENT '状态(zk在库/yc已出库/ysy已使用)',
|
||||
`source_type` varchar(20) DEFAULT 'production' COMMENT '来源类型(production生产/manual手动录入)',
|
||||
`production_task_id` varchar(64) DEFAULT NULL COMMENT '来源生产任务ID',
|
||||
`quantity` decimal(18,4) DEFAULT NULL COMMENT '数量',
|
||||
`unit` varchar(64) DEFAULT NULL COMMENT '单位',
|
||||
`expiry_date` datetime DEFAULT NULL COMMENT '有效期',
|
||||
`product_images` varchar(4000) DEFAULT NULL COMMENT '产品图片URL(逗号分隔)',
|
||||
`tenant_no` varchar(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
|
||||
`order_num` int(11) DEFAULT NULL COMMENT '排序号',
|
||||
`remark` varchar(512) DEFAULT NULL COMMENT '备注',
|
||||
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
|
||||
`create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_cp_tenant_status` (`tenant_no`,`product_status`,`del_flag`),
|
||||
KEY `idx_cp_type` (`product_type_id`,`del_flag`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='细胞产品库';
|
||||
```
|
||||
|
||||
#### 3.3.2 `biz_production_work_order` — 入库生产工单
|
||||
|
||||
```sql
|
||||
CREATE TABLE `biz_production_work_order` (
|
||||
`id` varchar(64) NOT NULL COMMENT '主键ID',
|
||||
`work_order_no` varchar(32) NOT NULL COMMENT '工单号(前缀SC)',
|
||||
`reception_id` varchar(64) NOT NULL COMMENT '样本接收记录ID',
|
||||
`protocol_sample_id` varchar(64) NOT NULL COMMENT '协议样本ID',
|
||||
`collection_protocol_id` varchar(64) NOT NULL COMMENT '协议单ID',
|
||||
`protocol_no` varchar(64) DEFAULT NULL COMMENT '协议号快照',
|
||||
`sample_code` varchar(32) DEFAULT NULL COMMENT '样本编码快照',
|
||||
`reception_source` varchar(20) NOT NULL DEFAULT 'cell_storage' COMMENT '来源(cell_storage/research_donation)',
|
||||
`work_order_status` varchar(16) NOT NULL DEFAULT 'dpz' COMMENT '状态(dpz待配置/ywc已完成)',
|
||||
`tenant_no` varchar(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
|
||||
`order_num` int(11) DEFAULT NULL COMMENT '排序号',
|
||||
`remark` varchar(512) DEFAULT NULL COMMENT '备注',
|
||||
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
|
||||
`create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_pwo_reception` (`reception_id`,`del_flag`),
|
||||
KEY `idx_pwo_tenant_status` (`tenant_no`,`work_order_status`,`del_flag`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='入库生产工单';
|
||||
```
|
||||
|
||||
#### 3.3.3 `biz_production_task` — 生产任务
|
||||
|
||||
```sql
|
||||
CREATE TABLE `biz_production_task` (
|
||||
`id` varchar(64) NOT NULL COMMENT '主键ID',
|
||||
`task_no` varchar(32) NOT NULL COMMENT '任务号(前缀RW)',
|
||||
`work_order_id` varchar(64) NOT NULL COMMENT '所属工单ID',
|
||||
`task_name` varchar(200) DEFAULT NULL COMMENT '任务名称',
|
||||
`description` varchar(500) DEFAULT NULL COMMENT '描述',
|
||||
`route_id` varchar(64) DEFAULT NULL COMMENT '所选工艺路线ID(仅记录来源)',
|
||||
`task_status` varchar(16) NOT NULL DEFAULT 'dpz' COMMENT '状态(dpz待配置/jxz进行中/ywc已完成)',
|
||||
`started_time` datetime DEFAULT NULL COMMENT '开始时间',
|
||||
`completed_time` datetime DEFAULT NULL COMMENT '完成时间',
|
||||
`remark` varchar(512) DEFAULT NULL COMMENT '备注',
|
||||
`attachments` varchar(4000) DEFAULT NULL COMMENT '附件/图片URL(逗号分隔)',
|
||||
`tenant_no` varchar(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
|
||||
`order_num` int(11) DEFAULT NULL COMMENT '排序号',
|
||||
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
|
||||
`create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_pt_wo` (`work_order_id`,`del_flag`),
|
||||
KEY `idx_pt_tenant_status` (`tenant_no`,`task_status`,`del_flag`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='生产任务';
|
||||
```
|
||||
|
||||
#### 3.3.4 `biz_production_task_input` — 任务输入子表
|
||||
|
||||
```sql
|
||||
CREATE TABLE `biz_production_task_input` (
|
||||
`id` varchar(64) NOT NULL COMMENT '主键ID',
|
||||
`task_id` varchar(64) NOT NULL COMMENT '任务ID',
|
||||
`input_type` varchar(20) NOT NULL COMMENT '类型(sample样本/cell_product细胞产品)',
|
||||
`input_id` varchar(64) DEFAULT NULL COMMENT '关联ID(样本ID或细胞产品ID)',
|
||||
`input_code` varchar(64) DEFAULT NULL COMMENT '编码快照',
|
||||
`input_name` varchar(200) DEFAULT NULL COMMENT '名称快照',
|
||||
`tenant_no` varchar(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
|
||||
`order_num` int(11) DEFAULT NULL COMMENT '排序号',
|
||||
`remark` varchar(512) DEFAULT NULL COMMENT '备注',
|
||||
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
|
||||
`create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_pti_task` (`task_id`,`del_flag`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='生产任务输入';
|
||||
```
|
||||
|
||||
#### 3.3.5 `biz_production_task_step` — 任务工艺步骤
|
||||
|
||||
```sql
|
||||
CREATE TABLE `biz_production_task_step` (
|
||||
`id` varchar(64) NOT NULL COMMENT '主键ID',
|
||||
`task_id` varchar(64) NOT NULL COMMENT '任务ID',
|
||||
`step_order` int(11) DEFAULT NULL COMMENT '步骤顺序',
|
||||
`process_code` varchar(64) DEFAULT NULL COMMENT '工序代码',
|
||||
`category_id` varchar(64) DEFAULT NULL COMMENT '工序分类ID',
|
||||
`process_name` varchar(100) DEFAULT NULL COMMENT '工序名称',
|
||||
`description` varchar(500) DEFAULT NULL COMMENT '描述',
|
||||
`equipment_name` varchar(200) DEFAULT NULL COMMENT '设备名称',
|
||||
`estimated_duration` varchar(100) DEFAULT NULL COMMENT '预估耗时',
|
||||
`actual_duration` varchar(100) DEFAULT NULL COMMENT '实际耗时',
|
||||
`sop_ids` varchar(1000) DEFAULT NULL COMMENT 'SOP文档ID(逗号分隔)',
|
||||
`step_status` varchar(16) NOT NULL DEFAULT 'dzx' COMMENT '状态(dzx待执行/jxz进行中/ywc已完成)',
|
||||
`started_time` datetime DEFAULT NULL COMMENT '开始时间',
|
||||
`completed_time` datetime DEFAULT NULL COMMENT '完成时间',
|
||||
`tenant_no` varchar(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
|
||||
`order_num` int(11) DEFAULT NULL COMMENT '排序号',
|
||||
`remark` varchar(512) DEFAULT NULL COMMENT '备注',
|
||||
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
|
||||
`create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_pts_task` (`task_id`,`del_flag`),
|
||||
KEY `idx_pts_tenant` (`tenant_no`,`del_flag`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='生产任务工艺步骤';
|
||||
```
|
||||
|
||||
#### 3.3.6 `biz_production_task_step_reagent` — 步骤试剂
|
||||
|
||||
```sql
|
||||
CREATE TABLE `biz_production_task_step_reagent` (
|
||||
`id` varchar(64) NOT NULL COMMENT '主键ID',
|
||||
`step_id` varchar(64) NOT NULL COMMENT '步骤ID',
|
||||
`reagent_code` varchar(64) DEFAULT NULL COMMENT '试剂编码',
|
||||
`reagent_name` varchar(100) DEFAULT NULL COMMENT '试剂名称',
|
||||
`spec` varchar(200) DEFAULT NULL COMMENT '规格',
|
||||
`standard_usage` varchar(100) DEFAULT NULL COMMENT '标准用量',
|
||||
`actual_usage` varchar(100) DEFAULT NULL COMMENT '实际用量',
|
||||
`unit` varchar(64) DEFAULT NULL COMMENT '单位',
|
||||
`is_key_material` char(1) DEFAULT '0' COMMENT '是否关键物料(0否 1是)',
|
||||
`tenant_no` varchar(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
|
||||
`order_num` int(11) DEFAULT NULL COMMENT '排序号',
|
||||
`remark` varchar(512) DEFAULT NULL COMMENT '备注',
|
||||
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
|
||||
`create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_ptsr_step` (`step_id`,`del_flag`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='生产任务步骤试剂';
|
||||
```
|
||||
|
||||
#### 3.3.7 `biz_production_task_step_consumable` — 步骤耗材
|
||||
|
||||
```sql
|
||||
CREATE TABLE `biz_production_task_step_consumable` (
|
||||
`id` varchar(64) NOT NULL COMMENT '主键ID',
|
||||
`step_id` varchar(64) NOT NULL COMMENT '步骤ID',
|
||||
`consumable_code` varchar(64) DEFAULT NULL COMMENT '耗材编码',
|
||||
`consumable_name` varchar(100) DEFAULT NULL COMMENT '耗材名称',
|
||||
`spec_model` varchar(200) DEFAULT NULL COMMENT '规格型号',
|
||||
`standard_usage` varchar(100) DEFAULT NULL COMMENT '标准用量',
|
||||
`actual_usage` varchar(100) DEFAULT NULL COMMENT '实际用量',
|
||||
`unit` varchar(64) DEFAULT NULL COMMENT '单位',
|
||||
`is_required` char(1) DEFAULT '1' COMMENT '是否必需(1必须 0可选)',
|
||||
`tenant_no` varchar(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
|
||||
`order_num` int(11) DEFAULT NULL COMMENT '排序号',
|
||||
`remark` varchar(512) DEFAULT NULL COMMENT '备注',
|
||||
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
|
||||
`create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_ptsc_step` (`step_id`,`del_flag`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='生产任务步骤耗材';
|
||||
```
|
||||
|
||||
#### 3.3.8 `biz_production_task_step_output` — 步骤产出物
|
||||
|
||||
```sql
|
||||
CREATE TABLE `biz_production_task_step_output` (
|
||||
`id` varchar(64) NOT NULL COMMENT '主键ID',
|
||||
`step_id` varchar(64) NOT NULL COMMENT '步骤ID',
|
||||
`output_type_id` varchar(64) DEFAULT NULL COMMENT '产出类型ID',
|
||||
`output_name` varchar(200) DEFAULT NULL COMMENT '产出物名称',
|
||||
`output_barcode` varchar(200) DEFAULT NULL COMMENT '实际条码',
|
||||
`tenant_no` varchar(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
|
||||
`order_num` int(11) DEFAULT NULL COMMENT '排序号',
|
||||
`remark` varchar(512) DEFAULT NULL COMMENT '备注',
|
||||
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
|
||||
`create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_ptso_step` (`step_id`,`del_flag`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='生产任务步骤产出物';
|
||||
```
|
||||
|
||||
#### 3.3.9 `biz_production_task_step_data_collection` — 步骤数据采集
|
||||
|
||||
```sql
|
||||
CREATE TABLE `biz_production_task_step_data_collection` (
|
||||
`id` varchar(64) NOT NULL COMMENT '主键ID',
|
||||
`step_id` varchar(64) NOT NULL COMMENT '步骤ID',
|
||||
`collection_name` varchar(100) DEFAULT NULL COMMENT '采集项名称',
|
||||
`unit` varchar(64) DEFAULT NULL COMMENT '单位',
|
||||
`collection_value` varchar(500) DEFAULT NULL COMMENT '填写值',
|
||||
`tenant_no` varchar(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
|
||||
`order_num` int(11) DEFAULT NULL COMMENT '排序号',
|
||||
`remark` varchar(512) DEFAULT NULL COMMENT '备注',
|
||||
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
|
||||
`create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_ptsdc_step` (`step_id`,`del_flag`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='生产任务步骤数据采集';
|
||||
```
|
||||
|
||||
#### 3.3.10 `biz_production_task_output` — 任务输出
|
||||
|
||||
```sql
|
||||
CREATE TABLE `biz_production_task_output` (
|
||||
`id` varchar(64) NOT NULL COMMENT '主键ID',
|
||||
`task_id` varchar(64) NOT NULL COMMENT '任务ID',
|
||||
`cell_product_id` varchar(64) DEFAULT NULL COMMENT '关联细胞产品ID',
|
||||
`storage_slot_id` varchar(64) DEFAULT NULL COMMENT '储物格ID',
|
||||
`output_name` varchar(200) DEFAULT NULL COMMENT '产出物名称',
|
||||
`output_barcode` varchar(200) DEFAULT NULL COMMENT '产出物条码',
|
||||
`quantity` decimal(18,4) DEFAULT NULL COMMENT '数量',
|
||||
`unit` varchar(64) DEFAULT NULL COMMENT '单位',
|
||||
`remark` varchar(512) DEFAULT NULL COMMENT '备注',
|
||||
`attachments` varchar(4000) DEFAULT NULL COMMENT '图片URL(逗号分隔)',
|
||||
`tenant_no` varchar(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
|
||||
`order_num` int(11) DEFAULT NULL COMMENT '排序号',
|
||||
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
|
||||
`create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_pto_task` (`task_id`,`del_flag`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='生产任务输出';
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. 后端架构
|
||||
|
||||
### 4.1 触发点
|
||||
|
||||
**文件**: `backend/app/crud/sample_reception.py` 第 757-766 行
|
||||
|
||||
在现有的 `if conclusion == "js"` 判断中,紧跟质检工单创建之后,添加生产工单创建调用。
|
||||
|
||||
```python
|
||||
if conclusion == "js":
|
||||
# 现有:质检工单
|
||||
from app.crud import qc_work_order as qc_wo_svc
|
||||
qc_wo_svc.create_work_order_from_reception(...)
|
||||
|
||||
# 新增:生产工单
|
||||
from app.crud import production_work_order as prod_wo_svc
|
||||
prod_wo_svc.create_production_work_order_from_reception(
|
||||
db, reception=obj, tenant_no=tenant_no,
|
||||
user_id=user_id, create_dept_id=create_dept_id or "",
|
||||
)
|
||||
```
|
||||
|
||||
### 4.2 新增文件清单
|
||||
|
||||
| 层 | 文件 | 说明 |
|
||||
|---|------|------|
|
||||
| Models | `models.py` 新增 10 个 SQLAlchemy 模型 | 对应 10 张新表 |
|
||||
| CRUD | `crud/production_work_order.py` | 工单 CRUD + `create_production_work_order_from_reception()` |
|
||||
| CRUD | `crud/production_task.py` | 任务 CRUD + 克隆工艺路线 + 步骤增删改 |
|
||||
| CRUD | `crud/cell_product.py` | 细胞产品库 CRUD |
|
||||
| API | `api/production.py` 扩展 | 新增工单/任务/产品库路由 |
|
||||
| Schemas | `schemas/production_work_order.py` | 工单 Pydantic 模型 |
|
||||
| Schemas | `schemas/production_task.py` | 任务 Pydantic 模型 |
|
||||
| Schemas | `schemas/cell_product.py` | 产品 Pydantic 模型 |
|
||||
|
||||
### 4.3 核心业务逻辑
|
||||
|
||||
#### 工单号生成
|
||||
- 前缀 "SC" + 日期 YYYYMMDD + 4 位序号(如 `SC202605190001`)
|
||||
- 与质检工单 ZJ 前缀对应
|
||||
- 同一租户同一天内序号递增
|
||||
|
||||
#### 任务号生成
|
||||
- 前缀 "RW" + 日期 YYYYMMDD + 4 位序号(如 `RW202605190001`)
|
||||
|
||||
#### 克隆工艺路线到任务步骤
|
||||
1. 读取 `biz_process_route_step` 及其 4 个子表(reagent/consumable/output/data_collection)
|
||||
2. 将每个步骤克隆到 `biz_production_task_step`(task_id 替换 route_id)
|
||||
3. 将步骤的试剂/耗材/产出物/数据采集项克隆到对应的 task_step 子表
|
||||
4. 数据采集项的 `collection_value` 初始为空,等待用户执行时填写
|
||||
5. 试剂和耗材的 `actual_usage` 初始为空
|
||||
|
||||
#### 执行中增删工艺
|
||||
- **新增步骤**: 直接在 `biz_production_task_step` 中插入新记录,重新排序 step_order
|
||||
- **删除步骤**: 软删除(del_flag=1)步骤及其子表,重新排序
|
||||
- **编辑步骤**: 直接更新步骤及其子表(整体替换模式)
|
||||
|
||||
---
|
||||
|
||||
## 5. 前端架构
|
||||
|
||||
### 5.1 新增菜单(在【生产管理】下)
|
||||
|
||||
| 菜单名称 | 路由路径 | 组件 |
|
||||
|---------|---------|------|
|
||||
| 入库生产工单 | /production/work-order | views/production/production-work-order/index.vue |
|
||||
| 生产任务 | /production/task | views/production/production-task/index.vue |
|
||||
| 细胞产品库 | /production/cell-product | views/production/cell-product/index.vue |
|
||||
|
||||
### 5.2 新增前端文件
|
||||
|
||||
| 文件 | 说明 |
|
||||
|------|------|
|
||||
| `views/production/production-work-order/index.vue` | 入库生产工单列表+详情 |
|
||||
| `views/production/production-task/index.vue` | 生产任务列表+执行界面 |
|
||||
| `views/production/cell-product/index.vue` | 细胞产品库管理 |
|
||||
| `api/production-work-order.ts` | 工单 API |
|
||||
| `api/production-task.ts` | 任务 API |
|
||||
| `api/cell-product.ts` | 产品 API |
|
||||
|
||||
### 5.3 界面设计要点
|
||||
|
||||
- **入库生产工单**: 标准 list 页面,展示工单号、协议号、样本编码、状态、创建时间。支持查看详情(含关联的生产任务列表)
|
||||
- **生产任务**: list 页面展示任务号、所属工单、状态、工艺路线、开始/完成时间。进入详情可执行工艺步骤、录入数据
|
||||
- **细胞产品库**: 标准 list 页面,支持新增手动录入或从生产任务产出自动生成
|
||||
|
||||
---
|
||||
|
||||
## 6. API 路由设计
|
||||
|
||||
### 6.1 入库生产工单 API
|
||||
|
||||
| Method | Path | 说明 |
|
||||
|--------|------|------|
|
||||
| GET | /web/admin/production-work-orders | 工单列表(分页) |
|
||||
| GET | /web/admin/production-work-orders/{id} | 工单详情 |
|
||||
| PUT | /web/admin/production-work-orders/{id}/complete | 完成工单 |
|
||||
|
||||
### 6.2 生产任务 API
|
||||
|
||||
| Method | Path | 说明 |
|
||||
|--------|------|------|
|
||||
| POST | /web/admin/production-tasks | 创建任务(选工艺路线,克隆步骤) |
|
||||
| GET | /web/admin/production-tasks | 任务列表(分页,支持按工单ID筛选) |
|
||||
| GET | /web/admin/production-tasks/{id} | 任务详情(含步骤+子表) |
|
||||
| PUT | /web/admin/production-tasks/{id} | 更新任务基本信息 |
|
||||
| PUT | /web/admin/production-tasks/{id}/status | 更新任务状态 |
|
||||
| POST | /web/admin/production-tasks/{id}/steps | 新增步骤 |
|
||||
| PUT | /web/admin/production-tasks/{id}/steps/{step_id} | 更新步骤 |
|
||||
| DELETE | /web/admin/production-tasks/{id}/steps/{step_id} | 删除步骤 |
|
||||
| PUT | /web/admin/production-tasks/{id}/steps/{step_id}/reagents | 替换步骤试剂 |
|
||||
| PUT | /web/admin/production-tasks/{id}/steps/{step_id}/consumables | 替换步骤耗材 |
|
||||
| PUT | /web/admin/production-tasks/{id}/steps/{step_id}/data-collection | 替换步骤数据采集 |
|
||||
| POST | /web/admin/production-tasks/{id}/inputs | 设置任务输入 |
|
||||
| POST | /web/admin/production-tasks/{id}/outputs | 设置任务输出 |
|
||||
|
||||
### 6.3 细胞产品库 API
|
||||
|
||||
| Method | Path | 说明 |
|
||||
|--------|------|------|
|
||||
| GET | /web/admin/cell-products | 产品列表(分页) |
|
||||
| GET | /web/admin/cell-products/{id} | 产品详情 |
|
||||
| POST | /web/admin/cell-products | 新增产品 |
|
||||
| PUT | /web/admin/cell-products/{id} | 更新产品 |
|
||||
| DELETE | /web/admin/cell-products/{id} | 删除产品(软删除) |
|
||||
|
||||
---
|
||||
|
||||
## 7. 状态流转
|
||||
|
||||
### 7.1 入库生产工单
|
||||
|
||||
```
|
||||
dpz(待配置) ──→ ywc(已完成)
|
||||
```
|
||||
- 创建时默认 dpz
|
||||
- 所有关联任务完成后,可手动标记为 ywc
|
||||
|
||||
### 7.2 生产任务
|
||||
|
||||
```
|
||||
dpz(待配置) ──→ jxz(进行中) ──→ ywc(已完成)
|
||||
```
|
||||
- 创建时默认 dpz(已克隆工艺步骤)
|
||||
- 用户开始执行时手动标记为 jxz
|
||||
- 所有步骤完成后标记为 ywc
|
||||
|
||||
### 7.3 生产任务步骤
|
||||
|
||||
```
|
||||
dzx(待执行) ──→ jxz(进行中) ──→ ywc(已完成)
|
||||
```
|
||||
- 克隆时默认 dzx
|
||||
- 用户开始该步骤时标记为 jxz,记录 started_time
|
||||
- 步骤完成时标记为 ywc,记录 completed_time
|
||||
|
||||
---
|
||||
|
||||
## 8. 约束与注意事项
|
||||
|
||||
1. **租户隔离**: 所有查询必须带 tenant_no 过滤
|
||||
2. **软删除**: 所有删除操作设置 del_flag=1,不物理删除
|
||||
3. **工单号唯一**: SC 前缀 + 日期 + 序号,同一租户同一天唯一
|
||||
4. **任务号唯一**: RW 前缀 + 日期 + 序号,同一租户同一天唯一
|
||||
5. **克隆独立性**: 任务步骤克隆后与原工艺路线完全独立,后续修改互不影响
|
||||
6. **细胞产品编码唯一**: 产品编码在租户内唯一
|
||||
7. **储物格关联**: 细胞产品的 storage_slot_id 关联 biz_storage_facility_slot
|
||||
8. **触发原子性**: 生产工单与质检工单在同一事务中创建,确保要么同时成功要么同时失败
|
||||
@@ -0,0 +1,253 @@
|
||||
# 质检物料库 + 物料使用扣减设计
|
||||
|
||||
> 日期: 2026-05-20
|
||||
> 状态: 待审阅
|
||||
> 父模块: 质量检测 (质量检测一级菜单)
|
||||
|
||||
## 1. 背景与目标
|
||||
|
||||
### 现状
|
||||
「质量检测」一级菜单下已实现质检工单和质检任务的完整流程(样本接收 → 质检工单 → 质检任务 → 填写检测结果)。但质检任务中只记录了质量检测结果,没有记录质量检测过程中使用的物料(如试剂、耗材等)。
|
||||
|
||||
### 目标
|
||||
1. 在「质量检测」一级菜单下新增 **质检物料库**,用于管理质检专用的物料信息及库存
|
||||
2. 每次质检任务完成时,登记使用的物料及用量,从物料库 **扣减库存**
|
||||
3. 支持手动入库补充库存
|
||||
4. 通过物料变动记录实现 **盘存** 目的
|
||||
|
||||
### 约束
|
||||
- 质检物料库 **独立于** 生产模块的耗材 (biz_consumable) 和试剂 (biz_reagent)
|
||||
- 简单模式:主表 + 库存量 + 变动记录,不做批次、有效期、库位管理
|
||||
- 扣减时机:质检任务完成时一次性扣减
|
||||
- 入库方式:手动入库(直接增加数量)
|
||||
|
||||
## 2. 数据库设计
|
||||
|
||||
### 2.1 biz_qc_material(质检物料主表)
|
||||
|
||||
```sql
|
||||
DROP TABLE IF EXISTS `biz_qc_material`;
|
||||
CREATE TABLE `biz_qc_material` (
|
||||
`id` varchar(64) NOT NULL COMMENT '主键ID',
|
||||
`material_code` varchar(64) NOT NULL COMMENT '物料编码',
|
||||
`material_name` varchar(200) NOT NULL COMMENT '物料名称',
|
||||
`spec_model` varchar(200) DEFAULT NULL COMMENT '规格型号',
|
||||
`unit` varchar(32) DEFAULT NULL COMMENT '单位',
|
||||
`stock_qty` decimal(18,4) NOT NULL DEFAULT 0.0000 COMMENT '当前库存量',
|
||||
`warning_qty` decimal(18,4) NOT NULL DEFAULT 0.0000 COMMENT '预警库存量',
|
||||
`status` char(1) NOT NULL DEFAULT '1' COMMENT '1-启用 0-停用',
|
||||
`tenant_no` varchar(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
|
||||
`order_num` int(11) DEFAULT NULL COMMENT '排序号',
|
||||
`remark` varchar(512) DEFAULT NULL COMMENT '备注',
|
||||
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
|
||||
`create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_qc_mat_tenant_code` (`tenant_no`, `material_code`, `del_flag`),
|
||||
KEY `idx_qc_mat_tenant_status` (`tenant_no`, `status`, `del_flag`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='质检物料';
|
||||
```
|
||||
|
||||
### 2.2 biz_qc_material_usage(物料变动记录)
|
||||
|
||||
```sql
|
||||
DROP TABLE IF EXISTS `biz_qc_material_usage`;
|
||||
CREATE TABLE `biz_qc_material_usage` (
|
||||
`id` varchar(64) NOT NULL COMMENT '主键ID',
|
||||
`material_id` varchar(64) NOT NULL COMMENT '物料ID',
|
||||
`material_code` varchar(64) DEFAULT NULL COMMENT '物料编码快照',
|
||||
`material_name` varchar(200) DEFAULT NULL COMMENT '物料名称快照',
|
||||
`change_type` varchar(16) NOT NULL COMMENT '变动类型:use使用 / in入库',
|
||||
`change_qty` decimal(18,4) NOT NULL COMMENT '变动数量(使用为负,入库为正)',
|
||||
`stock_after` decimal(18,4) NOT NULL COMMENT '变动后库存量',
|
||||
`qc_task_id` varchar(64) DEFAULT NULL COMMENT '关联质检任务ID(使用时有值)',
|
||||
`qc_task_no` varchar(32) DEFAULT NULL COMMENT '质检任务号快照',
|
||||
`source_type` varchar(16) NOT NULL COMMENT '来源类型:task_complete任务完成 / manual_in手动入库',
|
||||
`tenant_no` varchar(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
|
||||
`remark` varchar(512) DEFAULT NULL COMMENT '备注',
|
||||
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
|
||||
`create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_qc_mu_material` (`material_id`, `del_flag`),
|
||||
KEY `idx_qc_mu_task` (`qc_task_id`, `del_flag`),
|
||||
KEY `idx_qc_mu_tenant_time` (`tenant_no`, `change_type`, `create_time`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='质检物料变动记录';
|
||||
```
|
||||
|
||||
### 2.3 菜单数据
|
||||
|
||||
在 `sys_menu` 表中,父菜单 `70000000000000000000000000000001`(质量检测)下新增:
|
||||
|
||||
```sql
|
||||
-- 质检物料库
|
||||
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`)
|
||||
VALUES ('70000000000000000000000000000009', '质检物料库', '70000000000000000000000000000001', 'C', 'qc-material', '/quality-inspection/qc-material/index', 'biz:qcMaterial:list', 1, '1', '1', 'zkxw', 8, NULL, NULL, '', NOW(), NULL, NOW(), 0);
|
||||
|
||||
-- 物料变动记录
|
||||
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`)
|
||||
VALUES ('70000000000000000000000000000010', '物料变动记录', '70000000000000000000000000000001', 'C', 'qc-material-usage', '/quality-inspection/qc-material-usage/index', 'biz:qcMaterialUsage:list', 1, '1', '1', 'zkxw', 9, NULL, NULL, '', NOW(), NULL, NOW(), 0);
|
||||
```
|
||||
|
||||
## 3. 业务流程
|
||||
|
||||
### 3.1 物料库管理
|
||||
|
||||
```
|
||||
新增物料:填写编码、名称、规格、单位、预警量 → stock_qty 初始为 0
|
||||
编辑物料:修改名称、规格、预警量等(编码不可改)
|
||||
停用物料:设置 status=0,不影响历史变动记录
|
||||
删除物料:软删除 del_flag=1,仅限库存为 0 的物料
|
||||
```
|
||||
|
||||
### 3.2 手动入库
|
||||
|
||||
```
|
||||
在物料库页面点击"入库"按钮 → 弹窗中填写入库数量、备注
|
||||
→ 校验:入库数量 > 0
|
||||
→ 更新 biz_qc_material.stock_qty += 入库数量
|
||||
→ 写入 biz_qc_material_usage(change_type=in, source_type=manual_in)
|
||||
```
|
||||
|
||||
### 3.3 质检任务完成 + 物料扣减
|
||||
|
||||
```
|
||||
质检人员点击"完成任务" → 弹窗:
|
||||
① 现有的检测结果填写区域
|
||||
② 新增:物料使用表格(可添加多行)
|
||||
- 从物料库下拉选择(仅显示 status=1 且 stock_qty > 0 的物料)
|
||||
- 自动带出:物料名称、规格、当前库存
|
||||
- 填写:使用数量
|
||||
|
||||
提交:
|
||||
① 保存检测结果(现有逻辑不变)
|
||||
② 遍历物料使用行:
|
||||
- 校验:使用数量 ≤ 物料当前 stock_qty
|
||||
- 更新 biz_qc_material.stock_qty -= 使用数量
|
||||
- 写入 biz_qc_material_usage(change_type=use, source_type=task_complete, qc_task_id=任务ID)
|
||||
③ 更新任务状态为已完成(现有逻辑不变)
|
||||
|
||||
失败回滚:任何一行物料校验不通过,整个提交回滚,任务状态不变
|
||||
```
|
||||
|
||||
### 3.4 盘存
|
||||
|
||||
```
|
||||
物料变动记录页面:
|
||||
- 支持按物料、变动类型、时间范围筛选
|
||||
- 每条记录显示:物料名称、变动类型、变动数量、变动后库存、关联任务号、操作人、时间
|
||||
- 可导出为盘点报表
|
||||
```
|
||||
|
||||
## 4. 后端实现
|
||||
|
||||
### 4.1 新增文件
|
||||
|
||||
| 文件 | 说明 |
|
||||
|------|------|
|
||||
| `backend/app/models/qc_material.py` | BizQcMaterial + BizQcMaterialUsage SQLAlchemy 模型 |
|
||||
| `backend/app/crud/qc_material.py` | 物料 CRUD: list/get/create/update/soft_delete + stock_in(入库) |
|
||||
| `backend/app/crud/qc_material_usage.py` | 变动记录: list + deduct_for_task(扣减) |
|
||||
|
||||
### 4.2 修改文件
|
||||
|
||||
| 文件 | 修改内容 |
|
||||
|------|----------|
|
||||
| `backend/app/api/qc.py` | 新增物料库和变动记录的路由端点 |
|
||||
| `backend/app/api/__init__.py` | 无需修改(共用 qc_router) |
|
||||
| `backend/app/crud/qc_task.py` | `complete_with_result` 方法扩展:接收物料使用数据,调用 deduct_for_task |
|
||||
|
||||
### 4.3 API 端点设计
|
||||
|
||||
```
|
||||
# 质检物料库
|
||||
GET /api/admin/web/admin/qc-materials # 物料列表(分页、关键词搜索)
|
||||
GET /api/admin/web/admin/qc-materials/options # 下拉选项(status=1)
|
||||
POST /api/admin/web/admin/qc-materials # 新增物料
|
||||
PUT /api/admin/web/admin/qc-materials/{id} # 编辑物料
|
||||
DELETE /api/admin/web/admin/qc-materials/{id} # 删除物料(软删除)
|
||||
POST /api/admin/web/admin/qc-materials/{id}/stock-in # 手动入库
|
||||
|
||||
# 物料变动记录
|
||||
GET /api/admin/web/admin/qc-material-usages # 变动记录列表(分页、筛选)
|
||||
|
||||
# 修改现有端点
|
||||
POST /api/admin/web/admin/qc-tasks/{id}/complete-with-result # 扩展请求体,增加 materialUsages 字段
|
||||
```
|
||||
|
||||
### 4.4 CRUD 模式
|
||||
|
||||
遵循 `backend/app/crud/qc_third_party_company.py` 的标准模式:
|
||||
- `_row_to_dict()` - 序列化,camelCase 键名
|
||||
- `list_xxx()` - 分页 + keyword 搜索 + tenant_no 过滤 + create_time DESC
|
||||
- `get_xxx()` - 按 ID + del_flag=0
|
||||
- `create_xxx()` - UUID ID,strip 字符串,编码唯一性校验
|
||||
- `update_xxx()` - 部分更新(仅非 None 字段)
|
||||
- `soft_delete_xxx()` - del_flag=1
|
||||
|
||||
## 5. 前端实现
|
||||
|
||||
### 5.1 新增文件
|
||||
|
||||
| 文件 | 说明 |
|
||||
|------|------|
|
||||
| `web-admin/src/api/qc-material.ts` | 物料 API 类型定义 + fetch 函数 |
|
||||
| `web-admin/src/api/qc-material-usage.ts` | 变动记录 API 类型定义 + fetch 函数 |
|
||||
| `web-admin/src/views/quality-inspection/qc-material/index.vue` | 质检物料库列表页 |
|
||||
| `web-admin/src/views/quality-inspection/qc-material-usage/index.vue` | 物料变动记录列表页 |
|
||||
|
||||
### 5.2 修改文件
|
||||
|
||||
| 文件 | 修改内容 |
|
||||
|------|----------|
|
||||
| `web-admin/src/router/modules/sqxp.ts` | 新增 qc-material 和 qc-material-usage 路由 |
|
||||
| `web-admin/src/views/quality-inspection/qc-task/index.vue` | 完成任务弹窗中嵌入物料使用表格 |
|
||||
| `web-admin/src/utils/status-tag-registry.ts` | 新增 changeType 注册(use/in) |
|
||||
|
||||
### 5.3 页面设计
|
||||
|
||||
**质检物料库页面**(参照 `production/consumable/index.vue`):
|
||||
- 标准列表:编码、名称、规格型号、单位、当前库存、预警库存、状态
|
||||
- 工具栏:搜索 + 新增按钮
|
||||
- 操作列:编辑、入库、停用/启用、删除
|
||||
- 入库弹窗:入库数量(el-input-number)+ 备注
|
||||
- 库存预警:stock_qty <= warning_qty 时,库存列标红显示
|
||||
|
||||
**物料变动记录页面**(参照标准列表页):
|
||||
- 筛选条件:物料(下拉)、变动类型(下拉)、时间范围
|
||||
- 列表列:物料名称、物料编码、变动类型(Tag)、变动数量、变动后库存、关联任务号、操作人、时间
|
||||
- 只读列表,无新增/编辑/删除操作
|
||||
|
||||
**完成任务弹窗扩展**(修改现有 qc-task 完成弹窗):
|
||||
- 在现有检测结果区域下方,新增"物料使用"折叠面板或分隔区域
|
||||
- 物料使用表格:物料选择(远程搜索下拉)、规格(自动带出)、当前库存(自动带出)、使用数量(el-input-number)、操作(删除行)
|
||||
- 添加物料行按钮
|
||||
- 提交时校验:每行使用数量 > 0 且 ≤ 当前库存
|
||||
|
||||
## 6. 影响范围
|
||||
|
||||
### 不影响的部分
|
||||
- 现有质检工单创建/配置流程不变
|
||||
- 现有质检任务列表/查看/启动逻辑不变
|
||||
- 现有检测结果保存逻辑不变
|
||||
- 生产模块的耗材/试剂管理不受影响
|
||||
- 物料使用是 **可选的**,不填物料也能完成任务(向后兼容)
|
||||
|
||||
### 需要注意的
|
||||
- `complete_with_result` API 的请求体扩展需要向后兼容:materialUsages 为可选字段,为空时不执行扣减
|
||||
- 并发扣减防护:在 deduct_for_task 中使用数据库行锁(SELECT ... FOR UPDATE)确保库存不超扣
|
||||
|
||||
## 7. 未来扩展(当前不做)
|
||||
|
||||
- 批次号管理
|
||||
- 有效期管理
|
||||
- 采购/入库单据流程
|
||||
- 库位管理
|
||||
- 自动盘点
|
||||
- 物料预警通知(当库存低于预警量时推送消息)
|
||||
@@ -0,0 +1,322 @@
|
||||
# 设计文档:储存证管理 + 满月待办管理 + 保险公司及项目价格
|
||||
|
||||
> 日期:2026-05-20
|
||||
> 状态:已审批
|
||||
> 涉及模块:细胞存储管理、基础信息管理
|
||||
|
||||
---
|
||||
|
||||
## 1. 需求概述
|
||||
|
||||
在系统中新增三个功能模块:
|
||||
|
||||
1. **储存证管理**(细胞存储管理 → 二级菜单):对已生效且样本已入库的采集协议单,管理储存证的上传和状态。
|
||||
2. **满月待办管理**(细胞存储管理 → 二级菜单):对已生效且新生儿满月的采集协议单,管理保险相关信息(保险单号、保险公司、保险险种、保单费用、生效/失效时间等)。
|
||||
3. **保险公司及项目价格**(基础信息管理 → 二级菜单):维护保险公司基础信息、开票信息、保险项目价格,供满月待办业务使用。
|
||||
|
||||
### 1.1 现有系统关联
|
||||
|
||||
- **储存证表** `biz_protocol_storage_cert`:已存在,当前作为采集协议单子资源管理,有 `make_status`、`cert_image_urls`、`make_date` 字段。后端 CRUD 已有 `get_storage_cert()`、`upsert_storage_cert()`。
|
||||
- **满月待办表** `biz_protocol_fullmoon_todo`:已存在,仅有基础字段(`todo_status`、`handle_date`、`handle_remark`、`insurance_attachments`),**缺少保险相关字段**。
|
||||
- **保险公司表**:**完全不存在**,需新建。
|
||||
- **体检机构模式**:系统中已有 `biz_checkup_institution` + `biz_checkup_institution_invoice` + `biz_checkup_institution_project` 的机构管理模式,保险公司模块参照此模式。
|
||||
|
||||
---
|
||||
|
||||
## 2. 数据库设计
|
||||
|
||||
### 2.1 模块 A:保险公司及项目价格(3 张新表)
|
||||
|
||||
#### 2.1.1 `biz_insurance_company` — 保险公司主表
|
||||
|
||||
```sql
|
||||
CREATE TABLE `biz_insurance_company` (
|
||||
`id` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '主键ID',
|
||||
`company_name` varchar(200) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '保险公司名称',
|
||||
`company_address` varchar(512) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '公司地址',
|
||||
`contact_name` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '联系人',
|
||||
`contact_phone` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '联系电话',
|
||||
`status` char(1) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '1' COMMENT '1正常 0停用',
|
||||
`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` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_ins_company` (`tenant_no`,`del_flag`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='保险公司';
|
||||
```
|
||||
|
||||
#### 2.1.2 `biz_insurance_company_invoice` — 保险公司开票信息(1:N)
|
||||
|
||||
```sql
|
||||
CREATE TABLE `biz_insurance_company_invoice` (
|
||||
`id` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '主键ID',
|
||||
`insurance_company_id` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '保险公司ID',
|
||||
`company_name` varchar(200) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '单位名称',
|
||||
`tax_no` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '税号',
|
||||
`company_address` varchar(512) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '单位地址',
|
||||
`company_phone` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '电话',
|
||||
`bank_name` varchar(200) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '开户银行',
|
||||
`bank_account` 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` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_ins_inv` (`insurance_company_id`,`del_flag`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='保险公司开票信息';
|
||||
```
|
||||
|
||||
#### 2.1.3 `biz_insurance_project_price` — 保险项目价格(1:N)
|
||||
|
||||
```sql
|
||||
CREATE TABLE `biz_insurance_project_price` (
|
||||
`id` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '主键ID',
|
||||
`insurance_company_id` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '保险公司ID',
|
||||
`project_name` varchar(200) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '项目名称',
|
||||
`project_fee` decimal(18,2) DEFAULT NULL COMMENT '项目费用(元)',
|
||||
`status` char(1) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '1' COMMENT '1正常 0停用',
|
||||
`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` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_ins_proj` (`insurance_company_id`,`del_flag`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='保险项目价格';
|
||||
```
|
||||
|
||||
### 2.2 模块 B:满月待办管理(ALTER 扩展现有表)
|
||||
|
||||
在现有 `biz_protocol_fullmoon_todo` 表上新增 8 个字段:
|
||||
|
||||
```sql
|
||||
ALTER TABLE `biz_protocol_fullmoon_todo`
|
||||
ADD COLUMN `insurance_company_id` varchar(64) DEFAULT NULL COMMENT '保险公司ID' AFTER `insurance_attachments`,
|
||||
ADD COLUMN `insurance_company_name` varchar(200) DEFAULT NULL COMMENT '保险公司名称(冗余快照)' AFTER `insurance_company_id`,
|
||||
ADD COLUMN `insurance_type` varchar(200) DEFAULT NULL COMMENT '保险险种' AFTER `insurance_company_name`,
|
||||
ADD COLUMN `insurance_policy_no` varchar(100) DEFAULT NULL COMMENT '保险单号' AFTER `insurance_type`,
|
||||
ADD COLUMN `insurance_effective_date` char(8) DEFAULT NULL COMMENT '保险单生效时间YYYYMMDD' AFTER `insurance_policy_no`,
|
||||
ADD COLUMN `insurance_expiry_date` char(8) DEFAULT NULL COMMENT '保险单失效时间YYYYMMDD' AFTER `insurance_effective_date`,
|
||||
ADD COLUMN `insurance_subscribed` char(1) DEFAULT '0' COMMENT '是否已订购保险(1是 0否)' AFTER `insurance_expiry_date`,
|
||||
ADD COLUMN `insurance_fee` decimal(18,2) DEFAULT NULL COMMENT '保单费用(元)' AFTER `insurance_subscribed`;
|
||||
```
|
||||
|
||||
**数据筛选逻辑**:满月待办列表仅展示满足以下条件的采集协议单:
|
||||
- `biz_collection_protocol.protocol_status = 'sxz'`(生效中)
|
||||
- `biz_protocol_party_customer.newborn_delivery_time + 30天 ≤ 当前日期`(新生儿已满月)
|
||||
|
||||
**字段语义说明**:
|
||||
- `todo_status`:满月待办整体完成状态('0'未办保险 → '1'已办报销),表示整个流程是否结束
|
||||
- `insurance_subscribed`:是否已订购保险('0'否 → '1'是),表示保险购买这一步骤是否完成
|
||||
- 两者关系:`insurance_subscribed='1'` 是 `todo_status='1'` 的前提条件之一,但不是充分条件(可能还需要其他步骤如报销完成)
|
||||
- 前端更新保险信息时,如果 `insurance_subscribed` 设为 '1',可联动将 `todo_status` 更新为 '1'(用户可覆盖)
|
||||
|
||||
### 2.3 模块 C:储存证管理(复用现有表)
|
||||
|
||||
复用现有 `biz_protocol_storage_cert` 表,**不修改表结构**。
|
||||
|
||||
**数据筛选逻辑**:储存证管理列表仅展示满足以下条件的采集协议单:
|
||||
- `biz_collection_protocol.protocol_status = 'sxz'`(生效中)
|
||||
- 关联的 `biz_protocol_sample` 中存在 `sample_status = 'yrk'`(已入库)
|
||||
|
||||
---
|
||||
|
||||
## 3. 后端设计
|
||||
|
||||
### 3.1 模块 A:保险公司及项目价格
|
||||
|
||||
#### 新增文件
|
||||
|
||||
| 文件 | 说明 |
|
||||
|------|------|
|
||||
| `backend/app/api/insurance_company.py` | API 路由文件,参照 `pilot_service.py` 中体检机构的路由模式 |
|
||||
|
||||
#### API 接口设计
|
||||
|
||||
**保险公司 CRUD**:
|
||||
- `GET /web/admin/insurance-companies` — 分页列表
|
||||
- `POST /web/admin/insurance-companies` — 新增
|
||||
- `PUT /web/admin/insurance-companies/{id}` — 修改
|
||||
- `DELETE /web/admin/insurance-companies/{id}` — 软删除
|
||||
|
||||
**开票信息 CRUD**:
|
||||
- `GET /web/admin/insurance-company-invoices?insurance_company_id=xxx` — 按公司查列表
|
||||
- `POST /web/admin/insurance-company-invoices` — 新增
|
||||
- `PUT /web/admin/insurance-company-invoices/{id}` — 修改
|
||||
- `DELETE /web/admin/insurance-company-invoices/{id}` — 软删除
|
||||
|
||||
**保险项目价格 CRUD**:
|
||||
- `GET /web/admin/insurance-project-prices?insurance_company_id=xxx` — 按公司查列表
|
||||
- `POST /web/admin/insurance-project-prices` — 新增
|
||||
- `PUT /web/admin/insurance-project-prices/{id}` — 修改
|
||||
- `DELETE /web/admin/insurance-project-prices/{id}` — 软删除
|
||||
|
||||
#### 修改文件
|
||||
|
||||
| 文件 | 变更 |
|
||||
|------|------|
|
||||
| `backend/app/models/models.py` | 新增 3 个 Model:`BizInsuranceCompany`、`BizInsuranceCompanyInvoice`、`BizInsuranceProjectPrice` |
|
||||
| `backend/app/api/__init__.py` | 导入 `insurance_company_router` |
|
||||
| `backend/app/main.py` | 注册 `insurance_company_router` |
|
||||
|
||||
#### CRUD 函数
|
||||
|
||||
CRUD 函数直接写在 `insurance_company.py` 路由文件中(参照项目既有模式:`pilot_service.py` 中体检机构 CRUD 内联在路由文件中),使用 `_X_to_dict()` 手动序列化模式。
|
||||
|
||||
### 3.2 模块 B:满月待办管理
|
||||
|
||||
#### 修改文件
|
||||
|
||||
| 文件 | 变更 |
|
||||
|------|------|
|
||||
| `backend/app/api/collection_protocol.py` | 新增满月待办列表接口 + 保险信息更新接口 |
|
||||
| `backend/app/models/models.py` | `BizProtocolFullmoonTodo` 模型新增 8 个字段 |
|
||||
|
||||
#### API 接口设计
|
||||
|
||||
- `GET /web/admin/fullmoon-todos` — 满月待办分页列表(自动筛选已生效+已满月的协议单,关联查询客户信息和保险信息)
|
||||
- `PUT /web/admin/fullmoon-todos/{id}/insurance` — 更新保险信息(保险公司、保险险种、保险单号、保单费用、生效/失效时间、是否已订购保险、保险附件)
|
||||
|
||||
#### 满月待办列表返回数据结构
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "满月待办ID",
|
||||
"collection_protocol_id": "协议单ID",
|
||||
"protocol_no": "采集协议号",
|
||||
"mother_name": "母亲姓名",
|
||||
"newborn_delivery_time": "新生儿分娩时间",
|
||||
"fullmoon_date": "满月日期(计算值:分娩时间+30天)",
|
||||
"todo_status": "满月待办状态",
|
||||
"insurance_company_id": "保险公司ID",
|
||||
"insurance_company_name": "保险公司名称",
|
||||
"insurance_type": "保险险种",
|
||||
"insurance_policy_no": "保险单号",
|
||||
"insurance_effective_date": "保险生效时间",
|
||||
"insurance_expiry_date": "保险失效时间",
|
||||
"insurance_subscribed": "是否已订购保险",
|
||||
"insurance_fee": "保单费用",
|
||||
"insurance_attachments": "保险附件",
|
||||
"handle_date": "办理日期",
|
||||
"handle_remark": "办理备注"
|
||||
}
|
||||
```
|
||||
|
||||
### 3.3 模块 C:储存证管理
|
||||
|
||||
#### 修改文件
|
||||
|
||||
| 文件 | 变更 |
|
||||
|------|------|
|
||||
| `backend/app/api/collection_protocol.py` | 新增储存证管理列表接口 |
|
||||
|
||||
#### API 接口设计
|
||||
|
||||
- `GET /web/admin/storage-certs` — 储存证管理分页列表(自动筛选已生效+样本已入库的协议单,关联查询储存证信息)
|
||||
- 现有 `upsert_storage_cert()` 函数可复用,前端通过采集协议单编辑接口保存储存证
|
||||
|
||||
#### 储存证列表返回数据结构
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "储存证ID",
|
||||
"collection_protocol_id": "协议单ID",
|
||||
"protocol_no": "采集协议号",
|
||||
"mother_name": "母亲姓名",
|
||||
"newborn_delivery_time": "新生儿分娩时间",
|
||||
"sample_info": "样本信息概要(类型+编码)",
|
||||
"make_status": "制作状态(0未制作 1已制作)",
|
||||
"cert_image_urls": "储存证图片URL列表",
|
||||
"make_date": "制作日期",
|
||||
"storage_in_date": "入库日期"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. 前端设计
|
||||
|
||||
### 4.1 菜单注册(`sqxp.ts` 变更)
|
||||
|
||||
**细胞存储管理**(id: `50000000000000000000000000000001`)新增 2 个 children:
|
||||
|
||||
```ts
|
||||
{
|
||||
id: '50000000000000000000000000000006',
|
||||
name: 'CellStorageStorageCert',
|
||||
path: 'storage-cert',
|
||||
component: '/cell-storage/storage-cert/index',
|
||||
meta: { title: '储存证管理', keepAlive: true, menuCode: 'cell-storage:storage-cert' }
|
||||
},
|
||||
{
|
||||
id: '50000000000000000000000000000008',
|
||||
name: 'CellStorageFullmoonTodo',
|
||||
path: 'fullmoon-todo',
|
||||
component: '/cell-storage/fullmoon-todo/index',
|
||||
meta: { title: '满月待办管理', keepAlive: true, menuCode: 'cell-storage:fullmoon-todo' }
|
||||
}
|
||||
```
|
||||
|
||||
**基础信息管理**(id: `40000000000000000000000000000001`)新增 1 个 child:
|
||||
|
||||
```ts
|
||||
{
|
||||
id: '40000000000000000000000000000007',
|
||||
name: 'BasicInfoInsuranceCompany',
|
||||
path: 'insurance-company',
|
||||
component: '/basic-info/insurance-company/index',
|
||||
meta: { title: '保险公司及项目价格', keepAlive: true, menuCode: 'basic-info:insurance-company' }
|
||||
}
|
||||
```
|
||||
|
||||
### 4.2 新增页面文件
|
||||
|
||||
| 文件路径 | 参照模板 | 说明 |
|
||||
|----------|---------|------|
|
||||
| `web-admin/src/views/cell-storage/storage-cert/index.vue` | `system/unit/index.vue` | 储存证管理列表页,含查看弹窗 + 上传储存证弹窗 |
|
||||
| `web-admin/src/views/cell-storage/fullmoon-todo/index.vue` | `system/order/index.vue` | 满月待办管理列表页(复杂列表),含保险信息编辑弹窗 |
|
||||
| `web-admin/src/views/basic-info/insurance-company/index.vue` | `pilot-service/checkup-institution/index.vue` | 保险公司管理页,含 Tab 切换(开票信息 / 项目价格) |
|
||||
|
||||
### 4.3 API 接口函数
|
||||
|
||||
新增文件或在现有 `web-admin/src/api/admin.ts` 中追加:
|
||||
|
||||
- 储存证列表:`getStorageCertList(params)`
|
||||
- 满月待办列表:`getFullmoonTodoList(params)`
|
||||
- 满月待办保险更新:`updateFullmoonTodoInsurance(id, data)`
|
||||
- 保险公司 CRUD:`getInsuranceCompanyList(params)`、`createInsuranceCompany(data)`、`updateInsuranceCompany(id, data)`、`deleteInsuranceCompany(id)`
|
||||
- 开票信息 CRUD:`getInsuranceInvoiceList(params)`、`createInsuranceInvoice(data)`、`updateInsuranceInvoice(id, data)`、`deleteInsuranceInvoice(id)`
|
||||
- 项目价格 CRUD:`getInsuranceProjectPriceList(params)`、`createInsuranceProjectPrice(data)`、`updateInsuranceProjectPrice(id, data)`、`deleteInsuranceProjectPrice(id)`
|
||||
|
||||
---
|
||||
|
||||
## 5. 菜单数据初始化
|
||||
|
||||
需在 `sys_menu` 表中插入 3 条新菜单记录,父菜单为 web 端对应的二级菜单节点。同时需要在角色的菜单权限中授权。
|
||||
|
||||
---
|
||||
|
||||
## 6. 约束与规范
|
||||
|
||||
- 所有表遵循公共字段规范(id, tenant_no, order_num, remark, create_by, create_dept_id, create_time, update_by, update_time, del_flag)
|
||||
- 所有查询必须加 `tenant_no` 过滤 + 数据权限过滤
|
||||
- 前端遵循 Fresh Mint 配色(`--primary #10b981`)
|
||||
- 弹窗表单 `label-position="top"`
|
||||
- 状态字段使用 `<el-tag>` 渲染
|
||||
- 附件使用 MinIO,多个附件逗号分隔
|
||||
- 列表默认按 `create_time DESC` 排序
|
||||
Reference in new issue
Block a user