提交
This commit is contained in:
1 parent
fb85230d25
commit
05684ba2a4
56 files changed
+26110
-13601
No files matched your search
@@ -0,0 +1,100 @@
|
||||
# 字段一致性开发指南
|
||||
|
||||
## 问题背景
|
||||
|
||||
在前后端全链路开发中,一个字段需要同时出现在 **5 个位置** 才能完整打通:
|
||||
|
||||
```
|
||||
前端 formData → API Schema (Pydantic) → API Handler 传参 → CRUD 函数签名 → ORM 赋值
|
||||
```
|
||||
|
||||
任何一层遗漏都会导致字段**静默丢失**(Pydantic 默认忽略未定义字段,不报错),产生难以发现的 bug。
|
||||
|
||||
## 历史问题
|
||||
|
||||
| 时间 | 问题 | 根因 |
|
||||
|------|------|------|
|
||||
| 2026-05 | 耗材/试剂新增时 `warning_qty` 未保存 | Schema 缺字段 → Handler 没传 → CRUD 没接 |
|
||||
| 2026-05 | 耗材/试剂新增时 `status` 未保存 | 同上 |
|
||||
| 2026-05 | 变动记录筛选"出库"无效 | 前端 value 与后端期望值不匹配 |
|
||||
|
||||
## 开发纪律(MUST)
|
||||
|
||||
### 1. `_row_to_dict` 是单一真相源
|
||||
|
||||
CRUD 文件中的 `_row_to_dict` 函数定义了实体返回给前端的**所有可读字段**。它是字段一致性的基准。
|
||||
|
||||
### 2. 先写 `_row_to_dict`,再写 create/update
|
||||
|
||||
新增实体时:
|
||||
1. 先定义 `_row_to_dict`,列出所有字段的读取逻辑
|
||||
2. 根据 `_row_to_dict` 的字段列表,逐字段编写 CreateBody/UpdateBody
|
||||
3. 根据 Schema 字段,逐字段编写 create/update 函数签名和 ORM 赋值
|
||||
4. 根据后端字段列表,编写前端 formData
|
||||
|
||||
### 3. 排除只读字段
|
||||
|
||||
以下字段出现在 `_row_to_dict` 中但**不需要**出现在 CreateBody/UpdateBody 或 formData 中:
|
||||
|
||||
- `id` — 自动生成
|
||||
- `createTime` / `updateTime` — 自动维护
|
||||
- `stockQty` — 通过出入库操作维护,不可直接设置
|
||||
- `tenantNo` — 从认证上下文获取
|
||||
|
||||
### 4. 每个字段必须检查的 5 个位置
|
||||
|
||||
以 `warningQty` 为例:
|
||||
|
||||
| 位置 | 代码 | 必须 |
|
||||
|------|------|------|
|
||||
| `_row_to_dict` | `"warningQty": _dec(c.warning_qty)` | ✅ 读取 |
|
||||
| CreateBody | `warning_qty: Optional[float] = Field(0, alias="warningQty")` | ✅ 接收 |
|
||||
| Handler | `warning_qty=body.warning_qty` | ✅ 传递 |
|
||||
| create 函数签名 | `warning_qty: Optional[float] = None` | ✅ 接收 |
|
||||
| create ORM 赋值 | `warning_qty=warning_qty if warning_qty is not None else 0` | ✅ 写入 |
|
||||
|
||||
### 5. 实现后验证
|
||||
|
||||
每个实体完成后运行:
|
||||
|
||||
```bash
|
||||
python backend/scripts/check_field_consistency.py
|
||||
```
|
||||
|
||||
检查项:
|
||||
- `_row_to_dict` 中的可写字段是否都在 CreateBody/UpdateBody 中
|
||||
- `_row_to_dict` 中的可写字段是否都在前端 formData 中
|
||||
- 前后端字段值映射是否一致(如筛选条件 value 对应关系)
|
||||
|
||||
## 校验脚本
|
||||
|
||||
`backend/scripts/check_field_consistency.py` 自动扫描以下三层,输出 diff 报告:
|
||||
|
||||
1. **CRUD 层**:提取 `_row_to_dict` 的所有 camelCase key
|
||||
2. **API 层**:提取 CreateBody/UpdateBody 的所有字段(含 alias)
|
||||
3. **前端层**:提取 `formData` 的所有 key
|
||||
|
||||
### 使用方式
|
||||
|
||||
```bash
|
||||
# 检查所有注册实体
|
||||
python backend/scripts/check_field_consistency.py
|
||||
|
||||
# 检查单个实体
|
||||
python backend/scripts/check_field_consistency.py --entity consumable
|
||||
|
||||
# JSON 格式输出
|
||||
python backend/scripts/check_field_consistency.py --json
|
||||
```
|
||||
|
||||
### 退出码
|
||||
|
||||
- `0`:所有检查通过
|
||||
- `1`:发现字段不一致
|
||||
|
||||
## 常见陷阱
|
||||
|
||||
1. **alias 遗漏**:Schema 字段有 `alias="warningQty"` 但忘记写,Pydantic 只接受 snake_case 键名
|
||||
2. **Handler 传参遗漏**:Schema 有字段但 Handler 没传给 CRUD,字段在 Schema 层就被丢弃
|
||||
3. **CRUD 签名遗漏**:Handler 传了但 CRUD 函数签名没接收,Python 会报 unexpected keyword argument(运行时错误)
|
||||
4. **前端 value 与后端不匹配**:如筛选条件下拉框的 value 是 `"use"` 但后端期望 `"out"`
|
||||
@@ -1,19 +0,0 @@
|
||||
-- 细胞产品库字段重设计迁移
|
||||
-- 日期: 2026-05-21
|
||||
-- 设计文档: docs/superpowers/specs/2026-05-21-cell-product-library-design.md
|
||||
|
||||
-- 1. 新增 4 个业务字段(放在 storage_slot_id 之后,product_status 之前)
|
||||
ALTER TABLE biz_cell_product
|
||||
ADD COLUMN `passage` VARCHAR(8) DEFAULT NULL COMMENT '代次(P1~P8)' AFTER `storage_slot_id`,
|
||||
ADD COLUMN `freeze_date` DATETIME DEFAULT NULL COMMENT '冻存日期' AFTER `passage`,
|
||||
ADD COLUMN `expected_cell_count` DECIMAL(18,4) DEFAULT NULL COMMENT '预计细胞数量(单位:亿)' AFTER `freeze_date`,
|
||||
ADD COLUMN `viability` DECIMAL(5,2) DEFAULT NULL COMMENT '活性(百分比,0~100)' AFTER `expected_cell_count`;
|
||||
|
||||
-- 2. 更新 product_status 默认值和注释
|
||||
ALTER TABLE biz_cell_product
|
||||
MODIFY COLUMN `product_status` VARCHAR(16) DEFAULT 'frozen' COMMENT '状态: frozen已冻存/sold已售卖/used已使用';
|
||||
|
||||
-- 3. 迁移旧状态数据(如有)
|
||||
UPDATE biz_cell_product SET product_status = 'frozen' WHERE product_status = 'zk';
|
||||
UPDATE biz_cell_product SET product_status = 'sold' WHERE product_status = 'yc';
|
||||
UPDATE biz_cell_product SET product_status = 'used' WHERE product_status = 'ysy';
|
||||
@@ -1,168 +0,0 @@
|
||||
-- 细胞产品库初始化测试数据(20 条,覆盖各种场景)
|
||||
-- 日期: 2026-05-21
|
||||
-- 前提: 已执行 2026-05-21-cell-product-alter.sql 迁移
|
||||
|
||||
-- 场景覆盖:
|
||||
-- 状态: frozen(12条) / sold(5条) / used(3条)
|
||||
-- 代次: P1~P8 均有覆盖
|
||||
-- 活性: 70.0 ~ 99.5,含 NULL
|
||||
-- 预计细胞数量: 0.5 ~ 50.0 亿,含 NULL
|
||||
-- 冻存日期: 有值 / NULL / 未来日期
|
||||
-- 有效期: 已过期 / 未过期 / NULL
|
||||
-- 产品图片: 有值 / NULL
|
||||
-- 备注: 有值 / NULL
|
||||
-- 数量/单位: 1~100 份
|
||||
|
||||
INSERT INTO biz_cell_product
|
||||
(id, product_code, product_name, product_type_id, spec_id, batch_no, storage_slot_id,
|
||||
passage, freeze_date, expected_cell_count, viability,
|
||||
product_status, source_type, production_task_id,
|
||||
quantity, unit, expiry_date, product_images,
|
||||
tenant_no, order_num, remark, create_by, create_dept_id, create_time, update_by, update_time, del_flag)
|
||||
VALUES
|
||||
|
||||
-- ==================== 已冻存 frozen (12条) ====================
|
||||
|
||||
-- 1. 典型冻存产品:高活性、P2代次、有图片有备注
|
||||
('60eaac11fceb4fd6b62e58e8be2c51cc', 'CP20260501000001', '间充质干细胞-MSC-P2-001', NULL, NULL, 'B20260501-001', NULL,
|
||||
'P2', '2026-05-01 10:30:00', 5.0000, 95.50,
|
||||
'frozen', 'manual', NULL,
|
||||
10, '份', '2027-05-01 00:00:00', 'https://minio.example.com/cell-product/msc-p2-001.jpg',
|
||||
'zkxw', 1, '高活性批次,来源于健康供体', 'admin', '', '2026-05-01 10:30:00', 'admin', '2026-05-01 10:30:00', 0),
|
||||
|
||||
-- 2. P1初代产品:数量大、高活性
|
||||
('5ea198fede454198be443211d2687ab3', 'CP20260502000001', '脐带血造血干细胞-HSC-P1-002', NULL, NULL, 'B20260502-002', NULL,
|
||||
'P1', '2026-05-02 14:20:00', 10.0000, 98.00,
|
||||
'frozen', 'manual', NULL,
|
||||
20, '份', '2027-11-02 00:00:00', NULL,
|
||||
'zkxw', 2, NULL, 'admin', '', '2026-05-02 14:20:00', 'admin', '2026-05-02 14:20:00', 0),
|
||||
|
||||
-- 3. P3代次、低活性、无冻存日期
|
||||
('661bcbadd41c4f478b16f3b9dd577914', 'CP20260503000001', '脂肪干细胞-ADSC-P3-003', NULL, NULL, 'B20260503-003', NULL,
|
||||
'P3', NULL, 3.0000, 72.00,
|
||||
'frozen', 'manual', NULL,
|
||||
5, '份', '2026-08-03 00:00:00', NULL,
|
||||
'zkxw', 3, '活性偏低,需进一步检测', 'admin', '', '2026-05-03 09:00:00', 'admin', '2026-05-03 09:00:00', 0),
|
||||
|
||||
-- 4. P4、中等活性、无预计细胞数量
|
||||
('dd8d414f36a244bca611a51a96581a85', 'CP20260505000001', '神经干细胞-NSC-P4-004', NULL, NULL, 'B20260505-004', NULL,
|
||||
'P4', '2026-05-05 08:15:00', NULL, 88.00,
|
||||
'frozen', 'manual', NULL,
|
||||
8, '份', '2027-05-05 00:00:00', 'https://minio.example.com/cell-product/nsc-p4-004.jpg',
|
||||
'zkxw', 4, NULL, 'admin', '', '2026-05-05 08:15:00', 'admin', '2026-05-05 08:15:00', 0),
|
||||
|
||||
-- 5. P5、活性为NULL(未检测)
|
||||
('815d5312900140c99e453c685c6d81a6', 'CP20260506000001', '诱导多能干细胞-iPSC-P5-005', NULL, NULL, 'B20260506-005', NULL,
|
||||
'P5', '2026-05-06 16:45:00', 2.5000, NULL,
|
||||
'frozen', 'manual', NULL,
|
||||
3, '份', '2027-02-06 00:00:00', NULL,
|
||||
'zkxw', 5, '待活性检测', 'admin', '', '2026-05-06 16:45:00', 'admin', '2026-05-06 16:45:00', 0),
|
||||
|
||||
-- 6. P6、大数量、有效期已过期(异常数据)
|
||||
('da9b6201f2a74921b475c234e0d72841', 'CP20260507000001', '软骨细胞-CC-P6-006', NULL, NULL, 'B20260507-006', NULL,
|
||||
'P6', '2026-05-07 11:00:00', 1.2000, 85.00,
|
||||
'frozen', 'manual', NULL,
|
||||
15, '份', '2025-05-07 00:00:00', NULL,
|
||||
'zkxw', 6, '有效期已过,需处理', 'admin', '', '2026-05-07 11:00:00', 'admin', '2026-05-07 11:00:00', 0),
|
||||
|
||||
-- 7. P7、极小数量、极高活性
|
||||
('e26ac18706b84c3da114f24eb50ec7e9', 'CP20260508000001', '心肌细胞-CM-P7-007', NULL, NULL, 'B20260508-007', NULL,
|
||||
'P7', '2026-05-08 09:30:00', 0.5000, 99.50,
|
||||
'frozen', 'manual', NULL,
|
||||
1, '份', '2027-11-08 00:00:00', NULL,
|
||||
'zkxw', 7, NULL, 'admin', '', '2026-05-08 09:30:00', 'admin', '2026-05-08 09:30:00', 0),
|
||||
|
||||
-- 8. P8、最大代次、多张图片
|
||||
('177e808ce4b8454cb074e5965ed94bb1', 'CP20260509000001', '肝细胞-HC-P8-008', NULL, NULL, 'B20260509-008', NULL,
|
||||
'P8', '2026-05-09 13:00:00', 8.0000, 80.00,
|
||||
'frozen', 'manual', NULL,
|
||||
12, '份', '2027-05-09 00:00:00', 'https://minio.example.com/cell-product/hc-p8-008a.jpg,https://minio.example.com/cell-product/hc-p8-008b.jpg',
|
||||
'zkxw', 8, '代次较高,建议尽快使用', 'admin', '', '2026-05-09 13:00:00', 'admin', '2026-05-09 13:00:00', 0),
|
||||
|
||||
-- 9. P1、大预计细胞数量50亿
|
||||
('0fe62984ef6c4d3eafa8bcff70c6e151', 'CP20260510000001', 'NK细胞-NK-P1-009', NULL, NULL, 'B20260510-009', NULL,
|
||||
'P1', '2026-05-10 07:00:00', 50.0000, 96.00,
|
||||
'frozen', 'manual', NULL,
|
||||
30, '份', '2027-11-10 00:00:00', 'https://minio.example.com/cell-product/nk-p1-009.jpg',
|
||||
'zkxw', 9, '大批次生产', 'admin', '', '2026-05-10 07:00:00', 'admin', '2026-05-10 07:00:00', 0),
|
||||
|
||||
-- 10. P3、无有效期
|
||||
('cb8e8ea1581348f18c119e1611fba39f', 'CP20260511000001', 'T细胞-TC-P3-010', NULL, NULL, 'B20260511-010', NULL,
|
||||
'P3', '2026-05-11 15:30:00', 15.0000, 91.00,
|
||||
'frozen', 'manual', NULL,
|
||||
25, '份', NULL, NULL,
|
||||
'zkxw', 10, NULL, 'admin', '', '2026-05-11 15:30:00', 'admin', '2026-05-11 15:30:00', 0),
|
||||
|
||||
-- 11. P2、活性偏低70%
|
||||
('28c6b50ccd3d4cf8ae9bbbbffef96418', 'CP20260512000001', '树突状细胞-DC-P2-011', NULL, NULL, 'B20260512-011', NULL,
|
||||
'P2', '2026-05-12 10:00:00', 4.0000, 70.00,
|
||||
'frozen', 'manual', NULL,
|
||||
6, '份', '2026-11-12 00:00:00', NULL,
|
||||
'zkxw', 11, '活性偏低,需复检', 'admin', '', '2026-05-12 10:00:00', 'admin', '2026-05-12 10:00:00', 0),
|
||||
|
||||
-- 12. P4、未来冻存日期(计划冻存)
|
||||
('940c82c006954865adb09e31fae36038', 'CP20260513000001', '表皮细胞-EC-P4-012', NULL, NULL, 'B20260513-012', NULL,
|
||||
'P4', '2026-06-15 00:00:00', 6.0000, 92.50,
|
||||
'frozen', 'manual', NULL,
|
||||
4, '份', '2027-06-15 00:00:00', NULL,
|
||||
'zkxw', 12, '计划冻存,待入库', 'admin', '', '2026-05-13 08:00:00', 'admin', '2026-05-13 08:00:00', 0),
|
||||
|
||||
-- ==================== 已售卖 sold (5条) ====================
|
||||
|
||||
-- 13. P2、已售卖、高活性
|
||||
('338ae843fb4a4914a1eb672fd7a5ee38', 'CP20260420000001', '间充质干细胞-MSC-P2-S01', NULL, NULL, 'B20260420-S01', NULL,
|
||||
'P2', '2026-04-20 09:00:00', 5.0000, 97.00,
|
||||
'sold', 'manual', NULL,
|
||||
10, '份', '2027-04-20 00:00:00', 'https://minio.example.com/cell-product/msc-p2-s01.jpg',
|
||||
'zkxw', 13, '已出售给合作医院', 'admin', '', '2026-04-20 09:00:00', 'admin', '2026-05-15 14:00:00', 0),
|
||||
|
||||
-- 14. P1、已售卖、最大批次
|
||||
('237d80589852465180706d1f7a3d3586', 'CP20260418000001', '脐带血造血干细胞-HSC-P1-S02', NULL, NULL, 'B20260418-S02', NULL,
|
||||
'P1', '2026-04-18 11:30:00', 20.0000, 99.00,
|
||||
'sold', 'manual', NULL,
|
||||
50, '份', '2027-10-18 00:00:00', NULL,
|
||||
'zkxw', 14, NULL, 'admin', '', '2026-04-18 11:30:00', 'admin', '2026-05-16 09:30:00', 0),
|
||||
|
||||
-- 15. P3、已售卖、中活性
|
||||
('a6380097234e4c15b04349f27348a9dd', 'CP20260415000001', '脂肪干细胞-ADSC-P3-S03', NULL, NULL, 'B20260415-S03', NULL,
|
||||
'P3', '2026-04-15 08:00:00', 8.0000, 88.50,
|
||||
'sold', 'manual', NULL,
|
||||
15, '份', '2027-04-15 00:00:00', 'https://minio.example.com/cell-product/adsc-p3-s03a.jpg,https://minio.example.com/cell-product/adsc-p3-s03b.jpg',
|
||||
'zkxw', 15, '科研合作项目使用', 'admin', '', '2026-04-15 08:00:00', 'admin', '2026-05-17 10:00:00', 0),
|
||||
|
||||
-- 16. P5、已售卖、低活性
|
||||
('853e0e67632c4291bf9d111a43a17b71', 'CP20260410000001', '神经干细胞-NSC-P5-S04', NULL, NULL, 'B20260410-S04', NULL,
|
||||
'P5', '2026-04-10 14:00:00', 2.0000, 75.00,
|
||||
'sold', 'manual', NULL,
|
||||
5, '份', '2026-10-10 00:00:00', NULL,
|
||||
'zkxw', 16, '低价出售,活性一般', 'admin', '', '2026-04-10 14:00:00', 'admin', '2026-05-18 11:00:00', 0),
|
||||
|
||||
-- 17. P1、已售卖、未填活性
|
||||
('ec5309d6870f486695cf5b5f63fd91d1', 'CP20260405000001', 'NK细胞-NK-P1-S05', NULL, NULL, 'B20260405-S05', NULL,
|
||||
'P1', '2026-04-05 10:00:00', 30.0000, NULL,
|
||||
'sold', 'manual', NULL,
|
||||
20, '份', '2027-10-05 00:00:00', NULL,
|
||||
'zkxw', 17, NULL, 'admin', '', '2026-04-05 10:00:00', 'admin', '2026-05-19 16:00:00', 0),
|
||||
|
||||
-- ==================== 已使用 used (3条) ====================
|
||||
|
||||
-- 18. P3、已使用(用于生产分化)
|
||||
('5e1f8cf0bab14e3f964d5a7aafb09d0d', 'CP20260301000001', '间充质干细胞-MSC-P3-U01', NULL, NULL, 'B20260301-U01', NULL,
|
||||
'P3', '2026-03-01 08:30:00', 10.0000, 93.00,
|
||||
'used', 'manual', NULL,
|
||||
8, '份', '2027-03-01 00:00:00', 'https://minio.example.com/cell-product/msc-p3-u01.jpg',
|
||||
'zkxw', 18, '用于生产分化为软骨细胞', 'admin', '', '2026-03-01 08:30:00', 'admin', '2026-05-10 09:00:00', 0),
|
||||
|
||||
-- 19. P4、已使用、来源生产任务
|
||||
('292c2ec830084ba08daf151845043dba', 'CP20260215000001', '诱导多能干细胞-iPSC-P4-U02', NULL, NULL, 'B20260215-U02', NULL,
|
||||
'P4', '2026-02-15 12:00:00', 12.0000, 90.00,
|
||||
'used', 'production', 'task-uuid-placeholder-001',
|
||||
6, '份', '2027-02-15 00:00:00', NULL,
|
||||
'zkxw', 19, '生产任务产出的细胞被用于后续分化实验', 'admin', '', '2026-02-15 12:00:00', 'admin', '2026-04-20 15:00:00', 0),
|
||||
|
||||
-- 20. P6、已使用、高代次低活性(极限场景)
|
||||
('e1cb9f8cbe6a40998686a8bb8fb76c9a', 'CP20260201000001', '肝细胞-HC-P6-U03', NULL, NULL, 'B20260201-U03', NULL,
|
||||
'P6', '2026-02-01 09:00:00', 1.5000, 78.50,
|
||||
'used', 'manual', NULL,
|
||||
2, '份', '2026-08-01 00:00:00', 'https://minio.example.com/cell-product/hc-p6-u03.jpg,https://minio.example.com/cell-product/hc-p6-u03-report.pdf',
|
||||
'zkxw', 20, '高代次细胞,已用于药物毒性测试', 'admin', '', '2026-02-01 09:00:00', 'admin', '2026-03-15 10:00:00', 0);
|
||||
@@ -1,37 +0,0 @@
|
||||
-- ============================================================
|
||||
-- 库位占用记录功能迁移
|
||||
-- 日期: 2026-05-22
|
||||
-- ============================================================
|
||||
|
||||
-- 1. 新增:库位占用记录表
|
||||
CREATE TABLE biz_storage_slot_occupancy (
|
||||
id VARCHAR(64) NOT NULL COMMENT '主键ID',
|
||||
slot_id VARCHAR(64) NOT NULL COMMENT '储物格ID (FK → biz_storage_facility_slot)',
|
||||
item_type VARCHAR(32) NOT NULL COMMENT '物品类型: cell_product=细胞产品, other=其他',
|
||||
item_id VARCHAR(64) NOT NULL COMMENT '物品ID (指向对应业务表主键)',
|
||||
item_code VARCHAR(64) NULL COMMENT '物品编码 (冗余展示)',
|
||||
item_name VARCHAR(200) NULL COMMENT '物品名称 (冗余展示)',
|
||||
item_source VARCHAR(32) NULL COMMENT '来源: production=生产入库, manual=手动入库, transfer=转移',
|
||||
stored_at DATETIME NULL COMMENT '入库时间',
|
||||
removed_at DATETIME NULL COMMENT '出库时间 (NULL=当前在库)',
|
||||
occupancy_status VARCHAR(16) NOT NULL DEFAULT 'stored' COMMENT 'stored=在库, removed=已出库',
|
||||
tenant_no VARCHAR(64) NULL COMMENT '租户编号',
|
||||
order_num INT DEFAULT 0 COMMENT '排序',
|
||||
remark VARCHAR(500) NULL COMMENT '备注',
|
||||
create_by VARCHAR(64) NULL COMMENT '创建者',
|
||||
create_dept_id VARCHAR(64) NULL COMMENT '创建部门',
|
||||
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
update_by VARCHAR(64) NULL COMMENT '更新者',
|
||||
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
del_flag CHAR(1) DEFAULT '0' COMMENT '删除标志(0存在 1删除)',
|
||||
PRIMARY KEY (id),
|
||||
INDEX idx_sso_slot (slot_id, occupancy_status, del_flag),
|
||||
INDEX idx_sso_item (item_type, item_id, del_flag),
|
||||
INDEX idx_sso_tenant (tenant_no, del_flag)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='库位占用记录表';
|
||||
|
||||
-- 2. 增强:biz_storage_facility_slot 增加缓存字段
|
||||
ALTER TABLE biz_storage_facility_slot
|
||||
ADD COLUMN occupied_count INT DEFAULT 0 COMMENT '当前占用数量',
|
||||
ADD COLUMN last_item_type VARCHAR(32) NULL COMMENT '最近存储物品类型',
|
||||
ADD COLUMN last_stored_at DATETIME NULL COMMENT '最近入库时间';
|
||||
@@ -1,51 +0,0 @@
|
||||
-- ============================================================
|
||||
-- 入库放行审核 biz_storage_release_review
|
||||
-- Date: 2026-05-23
|
||||
-- ============================================================
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for biz_storage_release_review
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `biz_storage_release_review`;
|
||||
CREATE TABLE `biz_storage_release_review` (
|
||||
`id` VARCHAR(64) NOT NULL COMMENT '主键ID',
|
||||
`sample_code` VARCHAR(64) NOT NULL COMMENT '样本编码(关联键)',
|
||||
`reception_source` VARCHAR(32) NOT NULL COMMENT '来源:cell_storage=采集/research_donation=捐赠',
|
||||
`protocol_id` VARCHAR(64) DEFAULT NULL COMMENT '协议单ID',
|
||||
`reception_id` VARCHAR(64) DEFAULT NULL COMMENT '样本接收记录ID',
|
||||
`protocol_no` VARCHAR(64) DEFAULT NULL COMMENT '协议编号',
|
||||
`sample_name` VARCHAR(128) DEFAULT NULL COMMENT '样本名称',
|
||||
`review_conclusion` VARCHAR(16) DEFAULT NULL COMMENT '审核结论:tg=通过/btg=不通过/NULL=待审核',
|
||||
`review_remark` VARCHAR(512) DEFAULT NULL COMMENT '审核备注',
|
||||
`review_attachments` VARCHAR(4000) DEFAULT NULL COMMENT '审核附件(逗号分隔URL)',
|
||||
`review_by` VARCHAR(64) DEFAULT NULL COMMENT '审核人ID',
|
||||
`review_by_name` VARCHAR(64) DEFAULT NULL COMMENT '审核人姓名',
|
||||
`review_time` DATETIME DEFAULT NULL COMMENT '审核时间',
|
||||
`storage_status` VARCHAR(16) NOT NULL DEFAULT 'drk' COMMENT '入库状态:drk=待入库/yrk=已入库',
|
||||
`storage_by` VARCHAR(64) DEFAULT NULL COMMENT '入库操作人ID',
|
||||
`storage_by_name` VARCHAR(64) DEFAULT NULL COMMENT '入库操作人姓名',
|
||||
`storage_time` DATETIME DEFAULT NULL COMMENT '入库时间',
|
||||
`tenant_no` VARCHAR(64) NOT NULL DEFAULT '' 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_srr_sample` (`tenant_no`, `sample_code`, `del_flag`),
|
||||
KEY `idx_srr_protocol` (`tenant_no`, `protocol_id`, `del_flag`),
|
||||
KEY `idx_srr_status` (`tenant_no`, `review_conclusion`, `storage_status`, `del_flag`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='入库放行审核';
|
||||
|
||||
-- ----------------------------
|
||||
-- Menu entry: 入库放行审核 (under 质量检测)
|
||||
-- ----------------------------
|
||||
-- 父菜单: 质量检测 id=70000000000000000000000000000001
|
||||
-- 新菜单 ID: 70000000000000000000000000000011 (递增)
|
||||
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 ('70000000000000000000000000000011', '入库放行审核', '70000000000000000000000000000001', 'C', 'storage-release-review', '/quality-inspection/storage-release-review/index', 'biz:storageReleaseReview:list', 1, '1', '1', 'zkxw', 10, NULL, NULL, '', NOW(), NULL, NOW(), 0);
|
||||
@@ -1,91 +0,0 @@
|
||||
-- 快递公司初始化(仅国内)
|
||||
-- 用法:
|
||||
-- 1) 默认租户为 zkxw,如需其他租户请修改 @tenant_no
|
||||
-- 2) 可重复执行:按 tenant_no + express_code + del_flag=0 去重插入
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
SET FOREIGN_KEY_CHECKS = 0;
|
||||
|
||||
SET @tenant_no = 'zkxw';
|
||||
SET @operator_id = 'd3000000000000000000000000000001';
|
||||
|
||||
START TRANSACTION;
|
||||
|
||||
DROP TEMPORARY TABLE IF EXISTS tmp_express_company_seed;
|
||||
CREATE TEMPORARY TABLE tmp_express_company_seed (
|
||||
express_code varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL,
|
||||
express_name varchar(200) COLLATE utf8mb4_unicode_ci NOT NULL,
|
||||
order_num int(11) DEFAULT NULL,
|
||||
remark varchar(512) COLLATE utf8mb4_unicode_ci DEFAULT NULL
|
||||
) ENGINE=Memory DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
INSERT INTO tmp_express_company_seed (express_code, express_name, order_num, remark) VALUES
|
||||
('sf', '顺丰速运', 1, '国内主流快递'),
|
||||
('jd', '京东快递', 2, '国内主流快递'),
|
||||
('zt', '中通快递', 3, '国内主流快递'),
|
||||
('yt', '圆通速递', 4, '国内主流快递'),
|
||||
('sto', '申通快递', 5, '国内主流快递'),
|
||||
('yunda', '韵达速递', 6, '国内主流快递'),
|
||||
('deppon', '德邦快递', 7, '国内主流快递'),
|
||||
('ems', 'EMS中国邮政速递物流', 8, '国家邮政体系'),
|
||||
('youzheng', '中国邮政', 9, '邮政包裹/普邮'),
|
||||
('jtexpress', '极兔速递', 10, '国内主流快递'),
|
||||
('zjs', '宅急送', 11, '国内常见快递'),
|
||||
('anneng', '安能物流', 12, '零担/大件常见'),
|
||||
('suning', '苏宁物流', 13, '电商体系物流'),
|
||||
('best', '百世快递', 14, '原百世快递体系'),
|
||||
('tiantian', '天天快递', 15, '历史常见渠道'),
|
||||
('guotong', '国通快递', 16, '历史常见渠道'),
|
||||
('quanfen', '全峰快递', 17, '历史常见渠道'),
|
||||
('rufengda', '如风达', 18, '历史常见渠道'),
|
||||
('kuaijie', '快捷快递', 19, '历史常见渠道'),
|
||||
('huitong', '汇通快运', 20, '区域快运常见'),
|
||||
('yousu', '优速快递', 21, '国内常见快递'),
|
||||
('suer', '速尔快递', 22, '国内常见快递'),
|
||||
('ky', '跨越速运', 23, '企业件/时效件常见'),
|
||||
('ymdd', '壹米滴答', 24, '零担快运常见'),
|
||||
('longbang', '龙邦快递', 25, '国内常见快递');
|
||||
|
||||
INSERT INTO biz_express_company (
|
||||
id,
|
||||
express_code,
|
||||
express_name,
|
||||
tenant_no,
|
||||
order_num,
|
||||
remark,
|
||||
create_by,
|
||||
create_dept_id,
|
||||
create_time,
|
||||
update_by,
|
||||
update_time,
|
||||
del_flag
|
||||
)
|
||||
SELECT
|
||||
CONCAT(
|
||||
REPLACE(UUID(), '-', ''),
|
||||
LPAD(CONV(CRC32(t.express_code), 10, 16), 8, '0')
|
||||
),
|
||||
t.express_code,
|
||||
t.express_name,
|
||||
@tenant_no,
|
||||
t.order_num,
|
||||
t.remark,
|
||||
@operator_id,
|
||||
'',
|
||||
NOW(),
|
||||
@operator_id,
|
||||
NOW(),
|
||||
0
|
||||
FROM tmp_express_company_seed t
|
||||
WHERE NOT EXISTS (
|
||||
SELECT 1
|
||||
FROM biz_express_company e
|
||||
WHERE e.tenant_no COLLATE utf8mb4_unicode_ci = @tenant_no COLLATE utf8mb4_unicode_ci
|
||||
AND e.express_code COLLATE utf8mb4_unicode_ci = t.express_code COLLATE utf8mb4_unicode_ci
|
||||
AND e.del_flag = 0
|
||||
);
|
||||
|
||||
DROP TEMPORARY TABLE IF EXISTS tmp_express_company_seed;
|
||||
|
||||
COMMIT;
|
||||
SET FOREIGN_KEY_CHECKS = 1;
|
||||
@@ -1,3 +0,0 @@
|
||||
-- 市场物料库:增加预警库存字段(与质检物料库 biz_qc_material.warning_qty 对齐)
|
||||
ALTER TABLE `biz_material`
|
||||
ADD COLUMN `warning_qty` decimal(18, 4) NOT NULL DEFAULT 0 COMMENT '预警库存量' AFTER `stock_qty`;
|
||||
@@ -1,80 +0,0 @@
|
||||
-- ============================================================
|
||||
-- 生产物料库存管理 - 数据库迁移脚本
|
||||
-- 变更: production-material-inventory
|
||||
-- ============================================================
|
||||
|
||||
-- 1. biz_consumable 新增库存字段
|
||||
ALTER TABLE `biz_consumable`
|
||||
ADD COLUMN `stock_qty` DECIMAL(18,4) NOT NULL DEFAULT 0.0000 COMMENT '当前库存量' AFTER `description`,
|
||||
ADD COLUMN `warning_qty` DECIMAL(18,4) NOT NULL DEFAULT 0.0000 COMMENT '预警库存量' AFTER `stock_qty`,
|
||||
ADD COLUMN `status` CHAR(1) NOT NULL DEFAULT '1' COMMENT '1-启用 0-停用' AFTER `warning_qty`;
|
||||
|
||||
-- 2. biz_reagent 新增库存字段
|
||||
ALTER TABLE `biz_reagent`
|
||||
ADD COLUMN `stock_qty` DECIMAL(18,4) NOT NULL DEFAULT 0.0000 COMMENT '当前库存量' AFTER `description`,
|
||||
ADD COLUMN `warning_qty` DECIMAL(18,4) NOT NULL DEFAULT 0.0000 COMMENT '预警库存量' AFTER `stock_qty`,
|
||||
ADD COLUMN `status` CHAR(1) NOT NULL DEFAULT '1' COMMENT '1-启用 0-停用' AFTER `warning_qty`;
|
||||
|
||||
-- 3. 耗材变动记录表
|
||||
CREATE TABLE `biz_consumable_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 '变动类型:in入库 / use使用出库',
|
||||
`change_qty` DECIMAL(18,4) NOT NULL COMMENT '变动数量(入库正数,出库负数)',
|
||||
`stock_before` DECIMAL(18,4) NOT NULL COMMENT '变动前库存',
|
||||
`stock_after` DECIMAL(18,4) NOT NULL COMMENT '变动后库存',
|
||||
`source_type` VARCHAR(16) NOT NULL COMMENT '来源:manual_in / manual_out / step_save',
|
||||
`step_id` VARCHAR(64) DEFAULT NULL COMMENT '生产任务步骤ID(step_save时有值)',
|
||||
`task_id` VARCHAR(64) DEFAULT NULL COMMENT '生产任务ID(step_save时有值)',
|
||||
`task_no` VARCHAR(32) DEFAULT 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` SMALLINT NOT NULL DEFAULT 0 COMMENT '删除标记',
|
||||
PRIMARY KEY (`id`),
|
||||
INDEX `idx_csl_material` (`material_id`, `del_flag`),
|
||||
INDEX `idx_csl_step` (`step_id`, `del_flag`),
|
||||
INDEX `idx_csl_task` (`task_id`, `del_flag`),
|
||||
INDEX `idx_csl_tenant_time` (`tenant_no`, `change_type`, `create_time`),
|
||||
INDEX `idx_csl_source` (`source_type`, `del_flag`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='耗材变动记录';
|
||||
|
||||
-- 4. 试剂变动记录表
|
||||
CREATE TABLE `biz_reagent_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 '变动类型:in入库 / use使用出库',
|
||||
`change_qty` DECIMAL(18,4) NOT NULL COMMENT '变动数量(入库正数,出库负数)',
|
||||
`stock_before` DECIMAL(18,4) NOT NULL COMMENT '变动前库存',
|
||||
`stock_after` DECIMAL(18,4) NOT NULL COMMENT '变动后库存',
|
||||
`source_type` VARCHAR(16) NOT NULL COMMENT '来源:manual_in / manual_out / step_save',
|
||||
`step_id` VARCHAR(64) DEFAULT NULL COMMENT '生产任务步骤ID(step_save时有值)',
|
||||
`task_id` VARCHAR(64) DEFAULT NULL COMMENT '生产任务ID(step_save时有值)',
|
||||
`task_no` VARCHAR(32) DEFAULT 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` SMALLINT NOT NULL DEFAULT 0 COMMENT '删除标记',
|
||||
PRIMARY KEY (`id`),
|
||||
INDEX `idx_rsl_material` (`material_id`, `del_flag`),
|
||||
INDEX `idx_rsl_step` (`step_id`, `del_flag`),
|
||||
INDEX `idx_rsl_task` (`task_id`, `del_flag`),
|
||||
INDEX `idx_rsl_tenant_time` (`tenant_no`, `change_type`, `create_time`),
|
||||
INDEX `idx_rsl_source` (`source_type`, `del_flag`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='试剂变动记录';
|
||||
@@ -1,5 +0,0 @@
|
||||
-- 生产任务表增加任务类型字段
|
||||
-- 区分入库生产单 (cell_storage) / 出库生产单 (outbound)
|
||||
ALTER TABLE biz_production_task
|
||||
ADD COLUMN task_type VARCHAR(20) NOT NULL DEFAULT 'cell_storage' COMMENT '任务类型 cell_storage入库生产单 outbound出库生产单'
|
||||
AFTER work_order_id;
|
||||
@@ -1,109 +0,0 @@
|
||||
-- 质检物料库测试数据(biz_qc_material / biz_qc_material_usage)
|
||||
--
|
||||
-- 用法:
|
||||
-- 1) 默认租户 zkxw,默认操作人 d3000000000000000000000000000001(与 zkxw.sql 演示账号一致)
|
||||
-- 2) 可重复执行:按物料编码前缀 QC-MAT-DEMO- 清理后重新插入
|
||||
-- 3) 执行前请确认已建表(见 docs/superpowers/plans/2026-05-20-qc-material-library.md 中 DDL)
|
||||
--
|
||||
-- 示例:
|
||||
-- mysql -u root -p zkxw < docs/sql/qc_material_demo_seed.sql
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
SET FOREIGN_KEY_CHECKS = 0;
|
||||
|
||||
SET @tenant_no = 'zkxw';
|
||||
SET @operator_id = 'd3000000000000000000000000000001';
|
||||
SET @now = NOW();
|
||||
|
||||
START TRANSACTION;
|
||||
|
||||
-- 清理旧测试数据(先删变动记录,再删物料)
|
||||
DELETE u
|
||||
FROM `biz_qc_material_usage` u
|
||||
INNER JOIN `biz_qc_material` m ON m.`id` = u.`material_id`
|
||||
WHERE m.`tenant_no` = @tenant_no
|
||||
AND m.`material_code` LIKE 'QC-MAT-DEMO-%';
|
||||
|
||||
DELETE FROM `biz_qc_material`
|
||||
WHERE `tenant_no` = @tenant_no
|
||||
AND `material_code` LIKE 'QC-MAT-DEMO-%';
|
||||
|
||||
-- ----------------------------
|
||||
-- 质检物料主数据(10 条)
|
||||
-- 覆盖:正常库存 / 库存预警 / 零库存 / 停用
|
||||
-- ----------------------------
|
||||
INSERT INTO `biz_qc_material` (
|
||||
`id`,
|
||||
`material_code`,
|
||||
`material_name`,
|
||||
`spec_model`,
|
||||
`unit`,
|
||||
`stock_qty`,
|
||||
`warning_qty`,
|
||||
`status`,
|
||||
`tenant_no`,
|
||||
`order_num`,
|
||||
`remark`,
|
||||
`create_by`,
|
||||
`create_dept_id`,
|
||||
`create_time`,
|
||||
`update_by`,
|
||||
`update_time`,
|
||||
`del_flag`
|
||||
) VALUES
|
||||
('q1000000000000000000000000000001', 'QC-MAT-DEMO-001', 'PCR 扩增引物 Mix', '20× 预混', '支', 120.0000, 50.0000, '1', @tenant_no, 1, '常温避光', @operator_id, '', @now, @operator_id, @now, 0),
|
||||
('q1000000000000000000000000000002', 'QC-MAT-DEMO-002', '核酸提取试剂盒', '96 孔板适用', '盒', 35.0000, 40.0000, '1', @tenant_no, 2, '库存低于预警线', @operator_id, '', @now, @operator_id, @now, 0),
|
||||
('q1000000000000000000000000000003', 'QC-MAT-DEMO-003', '琼脂糖', 'Bio-Rad 常规型', 'g', 8.0000, 10.0000, '1', @tenant_no, 3, '粉末,干燥保存', @operator_id, '', @now, @operator_id, @now, 0),
|
||||
('q1000000000000000000000000000004', 'QC-MAT-DEMO-004', 'TAE 电泳缓冲液', '50× 浓缩', '瓶', 200.0000, 30.0000, '1', @tenant_no, 4, NULL, @operator_id, '', @now, @operator_id, @now, 0),
|
||||
('q1000000000000000000000000000005', 'QC-MAT-DEMO-005', '无菌吸头', '200μL 滤芯', '盒', 5000.0000, 500.0000, '1', @tenant_no, 5, '每盒 96 支', @operator_id, '', @now, @operator_id, @now, 0),
|
||||
('q1000000000000000000000000000006', 'QC-MAT-DEMO-006', 'EP 离心管', '1.5mL 锥底', '包', 3000.0000, 200.0000, '1', @tenant_no, 6, '每包 500 支', @operator_id, '', @now, @operator_id, @now, 0),
|
||||
('q1000000000000000000000000000007', 'QC-MAT-DEMO-007', '医用丁腈手套', 'M 码 无粉', '盒', 150.0000, 50.0000, '1', @tenant_no, 7, '每盒 100 只', @operator_id, '', @now, @operator_id, @now, 0),
|
||||
('q1000000000000000000000000000008', 'QC-MAT-DEMO-008', '75% 乙醇消毒液', '500ml 喷雾', '瓶', 0.0000, 20.0000, '1', @tenant_no, 8, '零库存,可测入库', @operator_id, '', @now, @operator_id, @now, 0),
|
||||
('q1000000000000000000000000000009', 'QC-MAT-DEMO-009', '质检标准品', '冻干粉 1mg', '支', 25.0000, 10.0000, '1', @tenant_no, 9, '-20℃ 保存', @operator_id, '', @now, @operator_id, @now, 0),
|
||||
('q1000000000000000000000000000010', 'QC-MAT-DEMO-010', '细胞培养基(旧批次)', '500ml', '瓶', 15.0000, 5.0000, '0', @tenant_no, 10, '停用批次,仅保留档案', @operator_id, '', @now, @operator_id, @now, 0);
|
||||
|
||||
-- ----------------------------
|
||||
-- 物料变动记录(3 条,便于「物料变动记录」页联调)
|
||||
-- change_type: in=入库 / use=使用;source_type: manual_in / task_complete
|
||||
-- ----------------------------
|
||||
INSERT INTO `biz_qc_material_usage` (
|
||||
`id`,
|
||||
`material_id`,
|
||||
`material_code`,
|
||||
`material_name`,
|
||||
`change_type`,
|
||||
`change_qty`,
|
||||
`stock_after`,
|
||||
`qc_task_id`,
|
||||
`qc_task_no`,
|
||||
`source_type`,
|
||||
`tenant_no`,
|
||||
`remark`,
|
||||
`create_by`,
|
||||
`create_dept_id`,
|
||||
`create_time`,
|
||||
`update_by`,
|
||||
`update_time`,
|
||||
`del_flag`
|
||||
) VALUES
|
||||
('qu100000000000000000000000000001', 'q1000000000000000000000000000001', 'QC-MAT-DEMO-001', 'PCR 扩增引物 Mix', 'in', 50.0000, 70.0000, NULL, NULL, 'manual_in', @tenant_no, '期初入库', @operator_id, '', DATE_SUB(@now, INTERVAL 7 DAY), @operator_id, DATE_SUB(@now, INTERVAL 7 DAY), 0),
|
||||
('qu100000000000000000000000000002', 'q1000000000000000000000000000001', 'QC-MAT-DEMO-001', 'PCR 扩增引物 Mix', 'in', 50.0000, 120.0000, NULL, NULL, 'manual_in', @tenant_no, '补货入库', @operator_id, '', DATE_SUB(@now, INTERVAL 2 DAY), @operator_id, DATE_SUB(@now, INTERVAL 2 DAY), 0),
|
||||
('qu100000000000000000000000000003', 'q1000000000000000000000000000002', 'QC-MAT-DEMO-002', '核酸提取试剂盒', 'use', -5.0000, 35.0000, NULL, 'QC-DEMO-TASK-001', 'task_complete', @tenant_no, '演示任务消耗', @operator_id, '', DATE_SUB(@now, INTERVAL 1 DAY), @operator_id, DATE_SUB(@now, INTERVAL 1 DAY), 0);
|
||||
|
||||
COMMIT;
|
||||
|
||||
SET FOREIGN_KEY_CHECKS = 1;
|
||||
|
||||
-- 插入结果速览
|
||||
SELECT
|
||||
material_code AS `物料编码`,
|
||||
material_name AS `物料名称`,
|
||||
stock_qty AS `当前库存`,
|
||||
warning_qty AS `预警库存`,
|
||||
CASE WHEN status = '1' THEN '正常' ELSE '停用' END AS `状态`,
|
||||
CASE WHEN stock_qty <= warning_qty THEN '库存预警' ELSE '正常' END AS `库存状态`
|
||||
FROM `biz_qc_material`
|
||||
WHERE `tenant_no` = @tenant_no
|
||||
AND `material_code` LIKE 'QC-MAT-DEMO-%'
|
||||
AND `del_flag` = 0
|
||||
ORDER BY `order_num`;
|
||||
@@ -1,33 +0,0 @@
|
||||
-- 质检物料变动记录:出库领用人/用途独立字段,来源类型补充 manual_out
|
||||
-- 用法:mysql -u root -p zkxw < docs/sql/qc_material_usage_out_fields_alter.sql
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
|
||||
ALTER TABLE `biz_qc_material_usage`
|
||||
ADD COLUMN `receiver` varchar(64) DEFAULT NULL COMMENT '领用人(手动出库)' AFTER `qc_task_no`,
|
||||
ADD COLUMN `purpose` varchar(512) DEFAULT NULL COMMENT '用途/事由(手动出库)' AFTER `receiver`;
|
||||
|
||||
ALTER TABLE `biz_qc_material_usage`
|
||||
MODIFY COLUMN `source_type` varchar(16) NOT NULL COMMENT '来源:task_complete任务完成 / manual_in手动入库 / manual_out手动出库';
|
||||
|
||||
-- 历史数据:从备注中回填领用人、用途(格式:领用人:xxx;用途:yyy)
|
||||
UPDATE `biz_qc_material_usage`
|
||||
SET
|
||||
`receiver` = TRIM(
|
||||
SUBSTRING_INDEX(
|
||||
SUBSTRING_INDEX(`remark`, '领用人:', -1),
|
||||
';',
|
||||
1
|
||||
)
|
||||
),
|
||||
`purpose` = TRIM(
|
||||
SUBSTRING_INDEX(
|
||||
SUBSTRING_INDEX(`remark`, '用途:', -1),
|
||||
';',
|
||||
1
|
||||
)
|
||||
)
|
||||
WHERE `source_type` = 'manual_out'
|
||||
AND `del_flag` = 0
|
||||
AND (`receiver` IS NULL OR `receiver` = '')
|
||||
AND `remark` LIKE '%领用人:%';
|
||||
@@ -1,25 +0,0 @@
|
||||
-- 回填手动出库记录的领用人、用途(从 remark 解析,可重复执行)
|
||||
SET NAMES utf8mb4;
|
||||
|
||||
UPDATE `biz_qc_material_usage`
|
||||
SET
|
||||
`receiver` = TRIM(
|
||||
SUBSTRING_INDEX(
|
||||
SUBSTRING_INDEX(`remark`, '领用人:', -1),
|
||||
';',
|
||||
1
|
||||
)
|
||||
),
|
||||
`purpose` = TRIM(
|
||||
SUBSTRING_INDEX(
|
||||
SUBSTRING_INDEX(`remark`, '用途:', -1),
|
||||
';',
|
||||
1
|
||||
)
|
||||
)
|
||||
WHERE `source_type` = 'manual_out'
|
||||
AND `del_flag` = 0
|
||||
AND `remark` LIKE '%领用人:%'
|
||||
AND (
|
||||
`receiver` IS NULL OR `receiver` = '' OR `purpose` IS NULL OR `purpose` = ''
|
||||
);
|
||||
@@ -1,18 +0,0 @@
|
||||
-- 细胞存储管理:菜单更名
|
||||
-- 物料库 → 市场物料库(id=50000000000000000000000000000009)
|
||||
-- 物料变动记录 → 市场物料变动记录(id=50000000000000000000000000000010)
|
||||
-- 用法:mysql -u root -p zkxw < docs/sql/sys_menu_cell_storage_material_rename.sql
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
|
||||
UPDATE `sys_menu`
|
||||
SET `menu_name` = '市场物料库',
|
||||
`update_time` = NOW()
|
||||
WHERE `id` = '50000000000000000000000000000009'
|
||||
AND `del_flag` = 0;
|
||||
|
||||
UPDATE `sys_menu`
|
||||
SET `menu_name` = '市场物料变动记录',
|
||||
`update_time` = NOW()
|
||||
WHERE `id` = '50000000000000000000000000000010'
|
||||
AND `del_flag` = 0;
|
||||
@@ -1,10 +0,0 @@
|
||||
-- 质量检测:菜单「物料变动记录」更名为「质检物料变动记录」
|
||||
-- 用法:mysql -u root -p zkxw < docs/sql/sys_menu_qc_material_usage_rename.sql
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
|
||||
UPDATE `sys_menu`
|
||||
SET `menu_name` = '质检物料变动记录',
|
||||
`update_time` = NOW()
|
||||
WHERE `id` = '70000000000000000000000000000010'
|
||||
AND `del_flag` = 0;
|
||||
+3664
-1161
File diff suppressed because it is too large.
Load diff
Reference in new issue
Block a user