commit content

This commit is contained in:
panchengyong
2026-03-06 02:02:59 +08:00
parent 99b07682e7
commit c28ada5050
733 changed files with 128794 additions and 248 deletions

BIN
prd/db/.DS_Store vendored Normal file

Binary file not shown.

View File

@@ -0,0 +1,44 @@
-- ============================================================
-- erp_mp_mbom 表补充缺失字段
-- 修复: Unknown column 'business_type' in 'field list'
-- MpMbomMapper 与 MpMbom 实体需要的字段需与表结构一致
-- 生成日期: 2026-02-06
-- ============================================================
SET NAMES utf8mb4;
-- 辅助存储过程 (若已存在可跳过)
DROP PROCEDURE IF EXISTS `proc_add_column_if_not_exists`;
DELIMITER //
CREATE PROCEDURE `proc_add_column_if_not_exists`(
IN p_table_name VARCHAR(64),
IN p_column_name VARCHAR(64),
IN p_column_definition VARCHAR(500)
)
BEGIN
DECLARE v_count INT DEFAULT 0;
SELECT COUNT(*) INTO v_count
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = p_table_name
AND COLUMN_NAME = p_column_name;
IF v_count = 0 THEN
SET @sql = CONCAT('ALTER TABLE `', p_table_name, '` ADD COLUMN `', p_column_name, '` ', p_column_definition);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END IF;
END //
DELIMITER ;
-- erp_mp_mbom 补充 MpMbomMapper 所需的缺失字段
CALL proc_add_column_if_not_exists('erp_mp_mbom', 'business_type', "varchar(20) DEFAULT NULL COMMENT '业务类型(BOM运算/生产补料)'");
CALL proc_add_column_if_not_exists('erp_mp_mbom', 'sales_order_id', "bigint(20) DEFAULT NULL COMMENT '销售订单ID'");
CALL proc_add_column_if_not_exists('erp_mp_mbom', 'operator_id', "bigint(20) DEFAULT NULL COMMENT '操作员ID'");
CALL proc_add_column_if_not_exists('erp_mp_mbom', 'operator_name', "varchar(50) DEFAULT NULL COMMENT '操作员名称'");
CALL proc_add_column_if_not_exists('erp_mp_mbom', 'approver_id', "bigint(20) DEFAULT NULL COMMENT '审核员ID'");
CALL proc_add_column_if_not_exists('erp_mp_mbom', 'approver_name', "varchar(50) DEFAULT NULL COMMENT '审核员名称'");
CALL proc_add_column_if_not_exists('erp_mp_mbom', 'approve_date', "datetime DEFAULT NULL COMMENT '审核日期'");
DROP PROCEDURE IF EXISTS `proc_add_column_if_not_exists`;

View File

@@ -0,0 +1,35 @@
-- ============================================================
-- erp_mp_mbom 表增加下发时间字段
-- 下发时间: issue_date用于记录物料清单下发车间的时间
-- 生成日期: 2026-02-13
-- ============================================================
SET NAMES utf8mb4;
DROP PROCEDURE IF EXISTS `proc_add_column_if_not_exists`;
DELIMITER //
CREATE PROCEDURE `proc_add_column_if_not_exists`(
IN p_table_name VARCHAR(64),
IN p_column_name VARCHAR(64),
IN p_column_definition VARCHAR(500)
)
BEGIN
DECLARE v_count INT DEFAULT 0;
SELECT COUNT(*) INTO v_count
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = p_table_name
AND COLUMN_NAME = p_column_name;
IF v_count = 0 THEN
SET @sql = CONCAT('ALTER TABLE `', p_table_name, '` ADD COLUMN `', p_column_name, '` ', p_column_definition);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END IF;
END //
DELIMITER ;
CALL proc_add_column_if_not_exists('erp_mp_mbom', 'issue_date', "datetime DEFAULT NULL COMMENT '下发时间'");
DROP PROCEDURE IF EXISTS `proc_add_column_if_not_exists`;

View File

@@ -0,0 +1,40 @@
-- ============================================================
-- erp_mp_mbom_line 表增加与 MpMbomLineMapper 一致的字段
-- 含: line_no, parent_item_id, bom_level, base_qty, loss_rate
-- (pick_type 见 alter_erp_mp_mbom_line_add_pick_type.sql)
-- 生成日期: 2026-02-13
-- ============================================================
SET NAMES utf8mb4;
DROP PROCEDURE IF EXISTS `proc_add_column_if_not_exists`;
DELIMITER //
CREATE PROCEDURE `proc_add_column_if_not_exists`(
IN p_table_name VARCHAR(64),
IN p_column_name VARCHAR(64),
IN p_column_definition VARCHAR(500)
)
BEGIN
DECLARE v_count INT DEFAULT 0;
SELECT COUNT(*) INTO v_count
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = p_table_name
AND COLUMN_NAME = p_column_name;
IF v_count = 0 THEN
SET @sql = CONCAT('ALTER TABLE `', p_table_name, '` ADD COLUMN `', p_column_name, '` ', p_column_definition);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END IF;
END //
DELIMITER ;
CALL proc_add_column_if_not_exists('erp_mp_mbom_line', 'line_no', "int(11) DEFAULT 0 COMMENT '行号'");
CALL proc_add_column_if_not_exists('erp_mp_mbom_line', 'parent_item_id', "bigint(20) DEFAULT NULL COMMENT '父级物料ID'");
CALL proc_add_column_if_not_exists('erp_mp_mbom_line', 'bom_level', "int(11) DEFAULT 1 COMMENT 'BOM层级'");
CALL proc_add_column_if_not_exists('erp_mp_mbom_line', 'base_qty', "decimal(18,6) DEFAULT 1.000000 COMMENT '基本用量'");
CALL proc_add_column_if_not_exists('erp_mp_mbom_line', 'loss_rate', "decimal(5,2) DEFAULT 0.00 COMMENT '损耗率(%)'");
DROP PROCEDURE IF EXISTS `proc_add_column_if_not_exists`;

View File

@@ -0,0 +1,35 @@
-- ============================================================
-- erp_mp_mbom_line 表增加领料方式字段
-- 领料方式: ORDER按单领用 / DIRECT直接领用
-- 生成日期: 2026-02-13
-- ============================================================
SET NAMES utf8mb4;
DROP PROCEDURE IF EXISTS `proc_add_column_if_not_exists`;
DELIMITER //
CREATE PROCEDURE `proc_add_column_if_not_exists`(
IN p_table_name VARCHAR(64),
IN p_column_name VARCHAR(64),
IN p_column_definition VARCHAR(500)
)
BEGIN
DECLARE v_count INT DEFAULT 0;
SELECT COUNT(*) INTO v_count
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = p_table_name
AND COLUMN_NAME = p_column_name;
IF v_count = 0 THEN
SET @sql = CONCAT('ALTER TABLE `', p_table_name, '` ADD COLUMN `', p_column_name, '` ', p_column_definition);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END IF;
END //
DELIMITER ;
CALL proc_add_column_if_not_exists('erp_mp_mbom_line', 'pick_type', "varchar(20) DEFAULT 'ORDER' COMMENT '领料方式(ORDER按单领用/DIRECT直接领用)'");
DROP PROCEDURE IF EXISTS `proc_add_column_if_not_exists`;

View File

@@ -0,0 +1,50 @@
-- =====================================================
-- 采购计划单表(erp_mp_purchase) - 新增字段
-- 日期: 2026-02-07
-- 说明: 补充采购计划单页面所需的扩展字段;若表由 mom-db-260206 的
-- erp_mp_purchase 建表脚本创建,需执行本脚本以支持 /erp/mp/purchase 接口。
-- 若某列已存在会报 Duplicate column可跳过该条或注释掉。
-- =====================================================
-- 业务类型(原材料、零部件、装配件、五金件、包装物等)
ALTER TABLE `erp_mp_purchase` ADD COLUMN `business_type` varchar(50) DEFAULT NULL COMMENT '业务类型' AFTER `need_type`;
-- 业务状态NORMAL、PAUSE、CANCEL、COMPLETED
ALTER TABLE `erp_mp_purchase` ADD COLUMN `business_status` varchar(20) DEFAULT 'NORMAL' COMMENT '业务状态' AFTER `business_type`;
-- 业务部门
ALTER TABLE `erp_mp_purchase` ADD COLUMN `dept_id` bigint DEFAULT NULL COMMENT '业务部门ID' AFTER `business_status`;
ALTER TABLE `erp_mp_purchase` ADD COLUMN `dept_name` varchar(100) DEFAULT NULL COMMENT '业务部门名称' AFTER `dept_id`;
-- 销售员名称
ALTER TABLE `erp_mp_purchase` ADD COLUMN `sales_user_name` varchar(50) DEFAULT NULL COMMENT '销售员名称' AFTER `sales_order_code`;
-- 需求数量和需求日期(物料明细级别)
ALTER TABLE `erp_mp_purchase` ADD COLUMN `demand_qty` decimal(18,4) DEFAULT NULL COMMENT '需求数量' AFTER `unit_name`;
ALTER TABLE `erp_mp_purchase` ADD COLUMN `demand_date` date DEFAULT NULL COMMENT '需求日期' AFTER `demand_qty`;
-- 可用量(库存可用量,可为负表示缺料)
ALTER TABLE `erp_mp_purchase` ADD COLUMN `available_qty` decimal(18,4) DEFAULT NULL COMMENT '可用量' AFTER `demand_date`;
-- 主产品数量(表头级别,引入后自动带入)
ALTER TABLE `erp_mp_purchase` ADD COLUMN `total_quantity` decimal(18,4) DEFAULT NULL COMMENT '主产品数量' AFTER `ordered_qty`;
-- 销售订单ID与 sales_order_code 对应)
ALTER TABLE `erp_mp_purchase` ADD COLUMN `sales_order_id` bigint DEFAULT NULL COMMENT '销售订单ID' AFTER `plan_code`;
-- 操作员、审核员(基础表若无则需先添加,再添加 operator_name2
ALTER TABLE `erp_mp_purchase` ADD COLUMN `operator_id` bigint DEFAULT NULL COMMENT '操作员ID' AFTER `remark`;
ALTER TABLE `erp_mp_purchase` ADD COLUMN `operator_name` varchar(50) DEFAULT NULL COMMENT '操作员名称' AFTER `operator_id`;
ALTER TABLE `erp_mp_purchase` ADD COLUMN `approver_id` bigint DEFAULT NULL COMMENT '审核员ID' AFTER `operator_name`;
ALTER TABLE `erp_mp_purchase` ADD COLUMN `approver_name` varchar(50) DEFAULT NULL COMMENT '审核员名称' AFTER `approver_id`;
ALTER TABLE `erp_mp_purchase` ADD COLUMN `approve_date` datetime DEFAULT NULL COMMENT '审核日期' AFTER `approver_name`;
-- 业务人员(采购人员)
ALTER TABLE `erp_mp_purchase` ADD COLUMN `operator_name2` varchar(50) DEFAULT NULL COMMENT '业务人员' AFTER `operator_name`;
-- 物料分类ID用于快捷筛选
ALTER TABLE `erp_mp_purchase` ADD COLUMN `item_type_id` bigint DEFAULT NULL COMMENT '物料分类ID' AFTER `item_name`;
-- 更新DDL中的status默认值后端使用 PREPARE 而非 DRAFT
-- 如果原DDL使用 DEFAULT 'DRAFT',需要修改为:
-- ALTER TABLE `erp_mp_purchase` ALTER COLUMN `status` SET DEFAULT 'PREPARE';

View File

@@ -0,0 +1,19 @@
-- ============================================================
-- 为 md_bom 表添加 item_spec 字段
-- 说明: 修复字段缺失问题item_spec作为冗余字段存储产品物料规格
-- 生成日期: 2026-01-26
-- 兼容 MySQL 5.7+
-- ============================================================
SET NAMES utf8mb4;
-- 添加 item_spec 字段
ALTER TABLE `md_bom`
ADD COLUMN `item_spec` varchar(200) DEFAULT NULL COMMENT '产品物料规格 (冗余字段)'
AFTER `item_name`;
-- 更新现有数据从md_item表同步item_spec
UPDATE `md_bom` b
INNER JOIN `md_item` i ON b.item_id = i.item_id
SET b.item_spec = i.specification
WHERE b.item_spec IS NULL;

View File

@@ -0,0 +1,72 @@
-- =====================================================
-- 更新 md_client 表结构,合并 erp_sl_client 的字段
-- 执行日期: 2026-01-25
-- =====================================================
-- 1. 添加 tenant_id 字段租户ID
ALTER TABLE `md_client`
ADD COLUMN `tenant_id` varchar(20) DEFAULT NULL COMMENT '租户ID' AFTER `client_id`;
-- 2. 添加 client_level 字段(客户级别)
ALTER TABLE `md_client`
ADD COLUMN `client_level` varchar(10) DEFAULT 'B' COMMENT '客户级别(A/B/C/D)' AFTER `client_type`;
-- 3. 添加 client_source 字段(客户来源)
ALTER TABLE `md_client`
ADD COLUMN `client_source` varchar(50) DEFAULT NULL COMMENT '客户来源' AFTER `client_level`;
-- 4. 添加 client_industry 字段(所属行业)
ALTER TABLE `md_client`
ADD COLUMN `client_industry` varchar(50) DEFAULT NULL COMMENT '所属行业' AFTER `client_source`;
-- 5. 添加 province 字段(省份)
ALTER TABLE `md_client`
ADD COLUMN `province` varchar(50) DEFAULT NULL COMMENT '省份' AFTER `client_industry`;
-- 6. 添加 city 字段(城市)
ALTER TABLE `md_client`
ADD COLUMN `city` varchar(50) DEFAULT NULL COMMENT '城市' AFTER `province`;
-- 7. 添加 fax 字段(传真)
ALTER TABLE `md_client`
ADD COLUMN `fax` varchar(20) DEFAULT NULL COMMENT '传真' AFTER `tel`;
-- 8. 添加 bank_name 字段(开户银行)
ALTER TABLE `md_client`
ADD COLUMN `bank_name` varchar(100) DEFAULT NULL COMMENT '开户银行' AFTER `credit_code`;
-- 9. 添加 bank_account 字段(银行账号)
ALTER TABLE `md_client`
ADD COLUMN `bank_account` varchar(30) DEFAULT NULL COMMENT '银行账号' AFTER `bank_name`;
-- 10. 添加 tax_no 字段(税号)
ALTER TABLE `md_client`
ADD COLUMN `tax_no` varchar(30) DEFAULT NULL COMMENT '税号' AFTER `bank_account`;
-- 11. 添加 invoice_address 字段(开票地址电话)
ALTER TABLE `md_client`
ADD COLUMN `invoice_address` varchar(200) DEFAULT NULL COMMENT '开票地址电话' AFTER `tax_no`;
-- 12. 添加 del_flag 字段(删除标志)
ALTER TABLE `md_client`
ADD COLUMN `del_flag` char(1) NOT NULL DEFAULT '0' COMMENT '删除标志' AFTER `remark`;
-- 13. 添加唯一索引 uk_client_code客户编码+租户ID
ALTER TABLE `md_client`
ADD UNIQUE KEY `uk_client_code` (`client_code`, `tenant_id`);
-- 14. 添加普通索引 idx_client_name客户名称
ALTER TABLE `md_client`
ADD KEY `idx_client_name` (`client_name`);
-- 15. 添加普通索引 idx_client_tenant租户ID
ALTER TABLE `md_client`
ADD KEY `idx_client_tenant` (`tenant_id`);
-- =====================================================
-- 说明:
-- 1. 如果字段已存在,执行时会报错,需要先检查字段是否存在
-- 2. 如果索引已存在,执行时会报错,需要先检查索引是否存在
-- 3. 建议在生产环境执行前先备份数据库
-- 4. 执行后需要更新现有数据的 del_flag 字段为 '0'(如果原来没有该字段)
-- =====================================================

View File

@@ -0,0 +1,106 @@
-- ============================================================
-- 修改 md_product_bom 表以关联 md_bom 表
-- 说明: 将md_product_bom表的主键重命名并添加外键关联md_bom表
-- 生成日期: 2026-01-26
-- 兼容 MySQL 5.7+
-- ============================================================
SET NAMES utf8mb4;
-- ============================================================
-- 方案一: 重命名主键字段(推荐)
-- ============================================================
-- 将md_product_bom表的主键从bom_id重命名为bom_line_id
-- 然后添加bom_id字段作为外键关联md_bom表
-- 1. 重命名主键字段
ALTER TABLE `md_product_bom`
CHANGE COLUMN `bom_id` `bom_line_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'BOM明细行ID (主键)';
-- 2. 添加外键字段关联md_bom表
ALTER TABLE `md_product_bom`
ADD COLUMN `bom_id` bigint(20) DEFAULT NULL COMMENT 'BOM表头ID (外键关联md_bom.bom_id)' AFTER `bom_line_id`;
-- 3. 创建外键索引
ALTER TABLE `md_product_bom`
ADD INDEX `idx_bom_header` (`bom_id`);
-- 4. 如果需要创建外键约束(可选,根据实际需求)
-- ALTER TABLE `md_product_bom`
-- ADD CONSTRAINT `fk_bom_header` FOREIGN KEY (`bom_id`) REFERENCES `md_bom` (`bom_id`)
-- ON DELETE CASCADE ON UPDATE CASCADE;
-- ============================================================
-- 方案二: 保持现状,仅添加外键字段(如果不想重命名主键)
-- ============================================================
-- 如果不想重命名主键,可以添加一个新字段作为外键
-- 但这样会导致字段名混淆,不推荐
-- ALTER TABLE `md_product_bom`
-- ADD COLUMN `bom_header_id` bigint(20) DEFAULT NULL COMMENT 'BOM表头ID (外键关联md_bom.bom_id)' AFTER `bom_line_id`;
-- ALTER TABLE `md_product_bom`
-- ADD INDEX `idx_bom_header` (`bom_header_id`);
-- ============================================================
-- 数据迁移说明
-- ============================================================
--
-- 如果md_product_bom表中已有数据需要根据bom_code关联更新bom_id字段
--
-- UPDATE md_product_bom pb
-- INNER JOIN md_bom b ON pb.bom_code = b.bom_code
-- SET pb.bom_id = b.bom_id
-- WHERE pb.bom_id IS NULL;
--
-- 或者根据item_id关联如果bom_code不可用
--
-- UPDATE md_product_bom pb
-- INNER JOIN md_bom b ON pb.item_id = b.item_id
-- SET pb.bom_id = b.bom_id
-- WHERE pb.bom_id IS NULL
-- AND pb.item_id IS NOT NULL;
--
-- ============================================================
-- 字段说明
-- ============================================================
--
-- md_product_bom表字段修改后:
-- - bom_line_id: 主键BOM明细行ID原bom_id对应ERP的line_id
-- - bom_id: 外键关联md_bom.bom_idBOM表头ID
-- - item_id: 产品物料ID冗余字段用于快速查询
-- - bom_item_id: 子件物料ID
-- - 其他字段保持不变
--
-- ============================================================
-- 索引建议
-- ============================================================
--
-- 已存在的索引:
-- - PRIMARY KEY (bom_line_id) - 主键索引
-- - idx_bom_item (item_id) - 产品物料ID索引
-- - idx_bom_tenant (tenant_id) - 租户ID索引
-- - idx_bom_code (bom_code) - BOM编码索引
--
-- 新增索引:
-- - idx_bom_header (bom_id) - BOM表头ID索引外键索引
--
-- ============================================================
-- 表关系图(修改后)
-- ============================================================
--
-- md_bom (BOM表头)
-- ├─ bom_id (PK)
-- ├─ bom_code (UK)
-- ├─ item_id → md_item.item_id
-- └─ ...
--
-- md_product_bom (BOM明细)
-- ├─ bom_line_id (PK) ← 明细行ID原bom_id
-- ├─ bom_id (FK) → md_bom.bom_id ← 外键关联表头
-- ├─ item_id → md_item.item_id ← 产品物料ID冗余
-- ├─ bom_item_id → md_item.item_id ← 子件物料ID
-- ├─ line_no
-- └─ ...
--
-- ============================================================

View File

@@ -0,0 +1,73 @@
-- ==========================================
-- 同步ERP供应商字段到MOM系统 md_vendor 表
-- 日期: 2026-01-26
-- ==========================================
-- 添加供应商类型字段
ALTER TABLE md_vendor ADD COLUMN vendor_type VARCHAR(64) DEFAULT NULL COMMENT '供应商类型CORE-核心供应商、NORMAL-普通供应商、TEMP-临时供应商)' AFTER vendor_des;
-- 添加地区相关字段
ALTER TABLE md_vendor ADD COLUMN province VARCHAR(64) DEFAULT NULL COMMENT '省份' AFTER address;
ALTER TABLE md_vendor ADD COLUMN city VARCHAR(64) DEFAULT NULL COMMENT '城市' AFTER province;
ALTER TABLE md_vendor ADD COLUMN zip_code VARCHAR(20) DEFAULT NULL COMMENT '邮编' AFTER city;
-- 添加传真字段
ALTER TABLE md_vendor ADD COLUMN fax VARCHAR(64) DEFAULT NULL COMMENT '传真' AFTER tel;
-- 添加财务相关字段
ALTER TABLE md_vendor ADD COLUMN bank_name VARCHAR(128) DEFAULT NULL COMMENT '开户银行' AFTER credit_code;
ALTER TABLE md_vendor ADD COLUMN bank_account VARCHAR(64) DEFAULT NULL COMMENT '银行账号' AFTER bank_name;
ALTER TABLE md_vendor ADD COLUMN tax_no VARCHAR(64) DEFAULT NULL COMMENT '税号' AFTER bank_account;
ALTER TABLE md_vendor ADD COLUMN invoice_address VARCHAR(255) DEFAULT NULL COMMENT '开票地址' AFTER tax_no;
-- 添加供应料品字段
ALTER TABLE md_vendor ADD COLUMN supply_items VARCHAR(500) DEFAULT NULL COMMENT '供应料品(多个以逗号分隔)' AFTER invoice_address;
-- 添加删除标志字段
ALTER TABLE md_vendor ADD COLUMN del_flag CHAR(1) DEFAULT '0' COMMENT '删除标志0-正常 1-删除)' AFTER enable_flag;
-- 添加租户ID字段如果不存在
-- ALTER TABLE md_vendor ADD COLUMN tenant_id VARCHAR(64) DEFAULT '1001' COMMENT '租户ID' AFTER vendor_id;
-- ==========================================
-- 字段说明对照表
-- ==========================================
-- ERP字段名 | MOM字段名 | 说明
-- ------------------|-------------------|------------------
-- vendorId | vendor_id | 供应商ID已存在
-- vendorCode | vendor_code | 供应商编码(已存在)
-- vendorName | vendor_name | 供应商名称(已存在)
-- vendorNick | vendor_nick | 供应商简称(已存在)
-- vendorEn | vendor_en | 英文名称(已存在)
-- vendorDes | vendor_des | 供应商简介(已存在)
-- vendorType | vendor_type | 供应商类型(新增)
-- vendorLevel | vendor_level | 供应商等级(已存在)
-- vendorScore | vendor_score | 供应商评分(已存在)
-- vendorLogo | vendor_logo | Logo地址已存在
-- address | address | 公司地址(已存在)
-- province | province | 省份(新增)
-- city | city | 城市(新增)
-- zipCode | zip_code | 邮编(新增)
-- website | website | 网址(已存在)
-- email | email | 邮箱(已存在)
-- tel | tel | 电话(已存在)
-- fax | fax | 传真(新增)
-- contact1 | contact1 | 联系人1已存在
-- contact1Tel | contact1_tel | 联系人1电话已存在
-- contact1Email | contact1_email | 联系人1邮箱已存在
-- contact2 | contact2 | 联系人2已存在
-- contact2Tel | contact2_tel | 联系人2电话已存在
-- contact2Email | contact2_email | 联系人2邮箱已存在
-- creditCode | credit_code | 统一社会信用代码(已存在)
-- bankName | bank_name | 开户银行(新增)
-- bankAccount | bank_account | 银行账号(新增)
-- taxNo | tax_no | 税号(新增)
-- invoiceAddress | invoice_address | 开票地址(新增)
-- supplyItems | supply_items | 供应料品(新增)
-- enableFlag | enable_flag | 启用状态(已存在)
-- delFlag | del_flag | 删除标志(新增)
-- remark | remark | 备注(已存在)
-- createBy | create_by | 创建者(已存在)
-- createTime | create_time | 创建时间(已存在)
-- updateBy | update_by | 更新者(已存在)
-- updateTime | update_time | 更新时间(已存在)

View File

@@ -0,0 +1,129 @@
-- ============================================================
-- MOM系统 md_bom 表创建脚本
-- 对应ERP系统: erp_md_bom
-- 生成日期: 2026-01-26
-- 兼容 MySQL 5.7+
-- ============================================================
SET NAMES utf8mb4;
-- ============================================================
-- 创建 md_bom 表 (BOM表头)
-- ============================================================
DROP TABLE IF EXISTS `md_bom`;
CREATE TABLE `md_bom` (
`bom_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'BOM ID (主键)',
`tenant_id` varchar(20) NOT NULL COMMENT '租户ID',
`bom_code` varchar(32) NOT NULL COMMENT 'BOM编码',
`bom_name` varchar(100) DEFAULT NULL COMMENT 'BOM名称',
`item_id` bigint(20) NOT NULL COMMENT '产品物料ID (外键关联md_item.item_id)',
`item_code` varchar(32) NOT NULL COMMENT '产品物料编码 (冗余字段)',
`item_name` varchar(100) NOT NULL COMMENT '产品物料名称 (冗余字段)',
`item_spec` varchar(200) DEFAULT NULL COMMENT '产品物料规格 (冗余字段)',
`unit_name` varchar(20) DEFAULT NULL COMMENT '计量单位',
`base_qty` decimal(18,4) NOT NULL DEFAULT '1.0000' COMMENT '基本数量 (母件基数)',
`version` varchar(20) DEFAULT NULL COMMENT '版本号',
`version_desc` varchar(200) DEFAULT NULL COMMENT '版本说明',
`status` varchar(20) NOT NULL DEFAULT 'DRAFT' COMMENT 'BOM状态 (DRAFT/APPROVED/OBSOLETE)',
`enable_flag` char(1) NOT NULL DEFAULT 'Y' COMMENT '启用状态 (Y/N)',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
`del_flag` char(1) NOT NULL DEFAULT '0' COMMENT '删除标志 (0存在 1删除)',
`create_by` varchar(64) DEFAULT NULL COMMENT '创建者',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_by` varchar(64) DEFAULT NULL COMMENT '更新者',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`bom_id`),
UNIQUE KEY `uk_bom_code` (`bom_code`, `tenant_id`) COMMENT 'BOM编码唯一索引',
KEY `idx_bom_item` (`item_id`) COMMENT '产品物料ID索引',
KEY `idx_bom_tenant` (`tenant_id`) COMMENT '租户ID索引',
KEY `idx_bom_status` (`status`) COMMENT '状态索引',
KEY `idx_bom_code` (`bom_code`) COMMENT 'BOM编码索引'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='产品BOM表头 (同步自ERP: erp_md_bom)';
-- ============================================================
-- 表结构说明
-- ============================================================
--
-- 1. 表名: md_bom
-- 2. 说明: 存储产品BOM的表头信息对应ERP系统的erp_md_bom表
-- 3. 主键: bom_id (自增)
-- 4. 唯一约束: bom_code + tenant_id (同一租户内BOM编码唯一)
-- 5. 外键关联: item_id → md_item.item_id (产品物料)
--
-- 6. 与md_product_bom的关系:
-- - md_bom (1) ←→ (N) md_product_bom
-- - 一个BOM表头可以有多条明细记录
-- - 通过md_product_bom.bom_id外键关联md_bom.bom_id
--
-- 7. 与md_item的关系:
-- - md_bom.item_id → md_item.item_id (外键)
-- - md_item.default_bom_id → md_bom.bom_id (冗余字段用于快速查询默认BOM)
-- - 一个产品可以有多个BOM版本但只有一个默认BOM
--
-- ============================================================
-- 字段映射说明 (ERP → MOM)
-- ============================================================
--
-- erp_md_bom.bom_id → md_bom.bom_id
-- erp_md_bom.tenant_id → md_bom.tenant_id
-- erp_md_bom.bom_code → md_bom.bom_code
-- erp_md_bom.bom_name → md_bom.bom_name
-- erp_md_bom.item_id → md_bom.item_id
-- erp_md_bom.item_code → md_bom.item_code
-- erp_md_bom.item_name → md_bom.item_name
-- erp_md_bom.unit_name → md_bom.unit_name
-- erp_md_bom.base_qty → md_bom.base_qty
-- erp_md_bom.version → md_bom.version
-- erp_md_bom.version_desc → md_bom.version_desc
-- erp_md_bom.status → md_bom.status
-- erp_md_bom.enable_flag → md_bom.enable_flag
-- erp_md_bom.remark → md_bom.remark
-- erp_md_bom.del_flag → md_bom.del_flag
--
-- ============================================================
-- 索引说明
-- ============================================================
--
-- 1. PRIMARY KEY (bom_id): 主键索引
-- 2. UNIQUE KEY uk_bom_code (bom_code, tenant_id): BOM编码唯一索引
-- 3. KEY idx_bom_item (item_id): 产品物料ID索引用于关联查询
-- 4. KEY idx_bom_tenant (tenant_id): 租户ID索引用于多租户隔离
-- 5. KEY idx_bom_status (status): 状态索引,用于状态筛选
-- 6. KEY idx_bom_code (bom_code): BOM编码索引用于编码查询
--
-- ============================================================
-- 数据同步规则
-- ============================================================
--
-- 1. 同步方向: ERP → MOM
-- 2. 同步频率: 实时/准实时
-- 3. 同步顺序:
-- a. 先同步 erp_md_bom → md_bom (表头)
-- b. 再同步 erp_md_bom_line → md_product_bom (明细)
-- 4. 关联方式: 通过 bom_code 或 bom_id 关联
-- 5. 事务处理: 表头和明细必须在同一事务中同步
-- 6. 删除规则: 删除BOM时先删除所有明细记录再删除表头记录
--
-- ============================================================
-- 使用示例
-- ============================================================
--
-- -- 查询产品的所有BOM版本
-- SELECT * FROM md_bom
-- WHERE item_id = 123 AND del_flag = '0'
-- ORDER BY version DESC;
--
-- -- 查询产品的默认BOM通过md_item表
-- SELECT b.* FROM md_bom b
-- INNER JOIN md_item i ON b.bom_id = i.default_bom_id
-- WHERE i.item_id = 123 AND b.del_flag = '0';
--
-- -- 查询BOM及其所有明细
-- SELECT b.*, pb.* FROM md_bom b
-- LEFT JOIN md_product_bom pb ON b.bom_id = pb.bom_id
-- WHERE b.bom_id = 456 AND b.del_flag = '0' AND pb.del_flag = '0'
-- ORDER BY pb.line_no;
--
-- ============================================================

View File

@@ -0,0 +1,204 @@
-- ============================================================
-- ERP 业务单据编码规则初始化脚本
-- 将 15 条单据编码规则配置到通用编码引擎表中
-- 对应文档prd/mom系统单据编码规则文档.md
-- ============================================================
-- rule_id / part_id 均为自增主键,无需指定值
-- sys_auto_code_part.rule_id 通过子查询关联 sys_auto_code_rule.rule_code
-- ============================================================
SET NAMES utf8mb4;
-- ============================================================
-- 一、sys_auto_code_rule — 编码规则主表(共 15 条)
-- ============================================================
-- ---------- 销售模块(排序 1-5----------
INSERT INTO `sys_auto_code_rule` (`rule_code`, `rule_name`, `rule_desc`, `max_length`, `is_padded`, `padded_char`, `padded_method`, `enable_flag`, `remark`, `attr1`, `attr2`, `attr3`, `attr4`, `create_by`, `create_time`, `update_by`, `update_time`)
VALUES ('XSDD_CODE', '销售订单编码规则', '销售订单销售订单格式XSDD + 6位流水号', 10, 'N', NULL, 'L', 'Y', NULL, NULL, NULL, 0, 0, 'admin', NOW(), '', NULL);
INSERT INTO `sys_auto_code_rule` (`rule_code`, `rule_name`, `rule_desc`, `max_length`, `is_padded`, `padded_char`, `padded_method`, `enable_flag`, `remark`, `attr1`, `attr2`, `attr3`, `attr4`, `create_by`, `create_time`, `update_by`, `update_time`)
VALUES ('XSBH_CODE', '备货订单编码规则', '销售订单备货订单格式XSBH + 6位流水号', 10, 'N', NULL, 'L', 'Y', NULL, NULL, NULL, 0, 0, 'admin', NOW(), '', NULL);
INSERT INTO `sys_auto_code_rule` (`rule_code`, `rule_name`, `rule_desc`, `max_length`, `is_padded`, `padded_char`, `padded_method`, `enable_flag`, `remark`, `attr1`, `attr2`, `attr3`, `attr4`, `create_by`, `create_time`, `update_by`, `update_time`)
VALUES ('LJBK_CODE', '零部件订单编码规则', '销售订单零部件订单格式LJBK + 6位流水号', 10, 'N', NULL, 'L', 'Y', NULL, NULL, NULL, 0, 0, 'admin', NOW(), '', NULL);
INSERT INTO `sys_auto_code_rule` (`rule_code`, `rule_name`, `rule_desc`, `max_length`, `is_padded`, `padded_char`, `padded_method`, `enable_flag`, `remark`, `attr1`, `attr2`, `attr3`, `attr4`, `create_by`, `create_time`, `update_by`, `update_time`)
VALUES ('XSFH_CODE', '发货通知单编码规则', '发货通知单格式XSFH + 6位流水号', 10, 'N', NULL, 'L', 'Y', NULL, NULL, NULL, 0, 0, 'admin', NOW(), '', NULL);
INSERT INTO `sys_auto_code_rule` (`rule_code`, `rule_name`, `rule_desc`, `max_length`, `is_padded`, `padded_char`, `padded_method`, `enable_flag`, `remark`, `attr1`, `attr2`, `attr3`, `attr4`, `create_by`, `create_time`, `update_by`, `update_time`)
VALUES ('XSTH_CODE', '退货通知单编码规则', '退货通知单格式XSTH + 6位流水号', 10, 'N', NULL, 'L', 'Y', NULL, NULL, NULL, 0, 0, 'admin', NOW(), '', NULL);
INSERT INTO `sys_auto_code_rule` (`rule_code`, `rule_name`, `rule_desc`, `max_length`, `is_padded`, `padded_char`, `padded_method`, `enable_flag`, `remark`, `attr1`, `attr2`, `attr3`, `attr4`, `create_by`, `create_time`, `update_by`, `update_time`)
VALUES ('XSKP_CODE', '开票通知单编码规则', '开票通知单格式XSKP + 6位流水号', 10, 'N', NULL, 'L', 'Y', NULL, NULL, NULL, 0, 0, 'admin', NOW(), '', NULL);
-- ---------- 生产模块(排序 10-11----------
INSERT INTO `sys_auto_code_rule` (`rule_code`, `rule_name`, `rule_desc`, `max_length`, `is_padded`, `padded_char`, `padded_method`, `enable_flag`, `remark`, `attr1`, `attr2`, `attr3`, `attr4`, `create_by`, `create_time`, `update_by`, `update_time`)
VALUES ('SCJH_CODE', '生产计划单编码规则', '生产计划单格式SCJH + yyyyMMdd + 3位序号按日循环', 15, 'N', NULL, 'L', 'Y', NULL, NULL, NULL, 0, 0, 'admin', NOW(), '', NULL);
INSERT INTO `sys_auto_code_rule` (`rule_code`, `rule_name`, `rule_desc`, `max_length`, `is_padded`, `padded_char`, `padded_method`, `enable_flag`, `remark`, `attr1`, `attr2`, `attr3`, `attr4`, `create_by`, `create_time`, `update_by`, `update_time`)
VALUES ('MBOM_CODE', '物料清单编码规则', '物料清单格式MBOM + 6位流水号', 10, 'N', NULL, 'L', 'Y', NULL, NULL, NULL, 0, 0, 'admin', NOW(), '', NULL);
-- WORKORDER_CODE: 生产工单编码规则(数据库中已配置,无需重复插入)
-- INSERT INTO `sys_auto_code_rule` ... VALUES ('WORKORDER_CODE', '生产工单编码规则', ...);
-- ---------- 采购模块(排序 12-23----------
INSERT INTO `sys_auto_code_rule` (`rule_code`, `rule_name`, `rule_desc`, `max_length`, `is_padded`, `padded_char`, `padded_method`, `enable_flag`, `remark`, `attr1`, `attr2`, `attr3`, `attr4`, `create_by`, `create_time`, `update_by`, `update_time`)
VALUES ('CGJH_CODE', '采购计划单编码规则(原材料)', '采购计划单原材料格式CGJH + 6位流水号', 10, 'N', NULL, 'L', 'Y', NULL, NULL, NULL, 0, 0, 'admin', NOW(), '', NULL);
INSERT INTO `sys_auto_code_rule` (`rule_code`, `rule_name`, `rule_desc`, `max_length`, `is_padded`, `padded_char`, `padded_method`, `enable_flag`, `remark`, `attr1`, `attr2`, `attr3`, `attr4`, `create_by`, `create_time`, `update_by`, `update_time`)
VALUES ('FLJH_CODE', '采购计划单编码规则(零部件)', '采购计划单零部件格式FLJH + 6位流水号', 10, 'N', NULL, 'L', 'Y', NULL, NULL, NULL, 0, 0, 'admin', NOW(), '', NULL);
INSERT INTO `sys_auto_code_rule` (`rule_code`, `rule_name`, `rule_desc`, `max_length`, `is_padded`, `padded_char`, `padded_method`, `enable_flag`, `remark`, `attr1`, `attr2`, `attr3`, `attr4`, `create_by`, `create_time`, `update_by`, `update_time`)
VALUES ('BCJH_CODE', '采购计划单编码规则(五金)', '采购计划单五金格式BCJH + 6位流水号', 10, 'N', NULL, 'L', 'Y', NULL, NULL, NULL, 0, 0, 'admin', NOW(), '', NULL);
INSERT INTO `sys_auto_code_rule` (`rule_code`, `rule_name`, `rule_desc`, `max_length`, `is_padded`, `padded_char`, `padded_method`, `enable_flag`, `remark`, `attr1`, `attr2`, `attr3`, `attr4`, `create_by`, `create_time`, `update_by`, `update_time`)
VALUES ('CGDD_CODE', '采购订单编码规则', '采购订单格式CGDD + 6位流水号', 10, 'N', NULL, 'L', 'Y', NULL, NULL, NULL, 0, 0, 'admin', NOW(), '', NULL);
INSERT INTO `sys_auto_code_rule` (`rule_code`, `rule_name`, `rule_desc`, `max_length`, `is_padded`, `padded_char`, `padded_method`, `enable_flag`, `remark`, `attr1`, `attr2`, `attr3`, `attr4`, `create_by`, `create_time`, `update_by`, `update_time`)
VALUES ('CGDH_CODE', '采购到货单编码规则', '采购到货单格式CGDH + 6位流水号', 10, 'N', NULL, 'L', 'Y', NULL, NULL, NULL, 0, 0, 'admin', NOW(), '', NULL);
INSERT INTO `sys_auto_code_rule` (`rule_code`, `rule_name`, `rule_desc`, `max_length`, `is_padded`, `padded_char`, `padded_method`, `enable_flag`, `remark`, `attr1`, `attr2`, `attr3`, `attr4`, `create_by`, `create_time`, `update_by`, `update_time`)
VALUES ('CGTH_CODE', '采购退货单编码规则', '采购退货单格式CGTH + 6位流水号', 10, 'N', NULL, 'L', 'Y', NULL, NULL, NULL, 0, 0, 'admin', NOW(), '', NULL);
INSERT INTO `sys_auto_code_rule` (`rule_code`, `rule_name`, `rule_desc`, `max_length`, `is_padded`, `padded_char`, `padded_method`, `enable_flag`, `remark`, `attr1`, `attr2`, `attr3`, `attr4`, `create_by`, `create_time`, `update_by`, `update_time`)
VALUES ('CGFP_CODE', '采购发票单编码规则', '采购发票单格式CGFP + 6位流水号', 10, 'N', NULL, 'L', 'Y', NULL, NULL, NULL, 0, 0, 'admin', NOW(), '', NULL);
-- ============================================================
-- 二、sys_auto_code_part — 编码规则组成表(共 31 条)
-- rule_id 通过子查询 (SELECT rule_id FROM sys_auto_code_rule WHERE rule_code = ?) 关联
-- ============================================================
-- -------------------------------------------------------
-- 格式 AFIXCHAR(前缀4位) + SERIALNO(流水号6位),共 14 条规则 x 2 = 28 个 part
-- -------------------------------------------------------
-- XSDD_CODE: 销售订单
INSERT INTO `sys_auto_code_part` (`rule_id`, `part_index`, `part_type`, `part_code`, `part_name`, `part_length`, `date_format`, `input_character`, `fix_character`, `seria_start_no`, `seria_step`, `seria_now_no`, `cycle_flag`, `cycle_method`, `remark`, `attr1`, `attr2`, `attr3`, `attr4`, `create_by`, `create_time`, `update_by`, `update_time`)
VALUES ((SELECT rule_id FROM sys_auto_code_rule WHERE rule_code = 'XSDD_CODE'), 1, 'FIXCHAR', 'PREFIX', '前缀', 4, NULL, NULL, 'XSDD', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 'admin', NOW(), '', NULL);
INSERT INTO `sys_auto_code_part` (`rule_id`, `part_index`, `part_type`, `part_code`, `part_name`, `part_length`, `date_format`, `input_character`, `fix_character`, `seria_start_no`, `seria_step`, `seria_now_no`, `cycle_flag`, `cycle_method`, `remark`, `attr1`, `attr2`, `attr3`, `attr4`, `create_by`, `create_time`, `update_by`, `update_time`)
VALUES ((SELECT rule_id FROM sys_auto_code_rule WHERE rule_code = 'XSDD_CODE'), 2, 'SERIALNO', 'SERIAL', '流水号', 6, NULL, NULL, NULL, 1, 1, NULL, 'N', NULL, NULL, NULL, NULL, 0, 0, 'admin', NOW(), '', NULL);
-- XSBH_CODE: 备货订单
INSERT INTO `sys_auto_code_part` (`rule_id`, `part_index`, `part_type`, `part_code`, `part_name`, `part_length`, `date_format`, `input_character`, `fix_character`, `seria_start_no`, `seria_step`, `seria_now_no`, `cycle_flag`, `cycle_method`, `remark`, `attr1`, `attr2`, `attr3`, `attr4`, `create_by`, `create_time`, `update_by`, `update_time`)
VALUES ((SELECT rule_id FROM sys_auto_code_rule WHERE rule_code = 'XSBH_CODE'), 1, 'FIXCHAR', 'PREFIX', '前缀', 4, NULL, NULL, 'XSBH', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 'admin', NOW(), '', NULL);
INSERT INTO `sys_auto_code_part` (`rule_id`, `part_index`, `part_type`, `part_code`, `part_name`, `part_length`, `date_format`, `input_character`, `fix_character`, `seria_start_no`, `seria_step`, `seria_now_no`, `cycle_flag`, `cycle_method`, `remark`, `attr1`, `attr2`, `attr3`, `attr4`, `create_by`, `create_time`, `update_by`, `update_time`)
VALUES ((SELECT rule_id FROM sys_auto_code_rule WHERE rule_code = 'XSBH_CODE'), 2, 'SERIALNO', 'SERIAL', '流水号', 6, NULL, NULL, NULL, 1, 1, NULL, 'N', NULL, NULL, NULL, NULL, 0, 0, 'admin', NOW(), '', NULL);
-- LJBK_CODE: 零部件订单
INSERT INTO `sys_auto_code_part` (`rule_id`, `part_index`, `part_type`, `part_code`, `part_name`, `part_length`, `date_format`, `input_character`, `fix_character`, `seria_start_no`, `seria_step`, `seria_now_no`, `cycle_flag`, `cycle_method`, `remark`, `attr1`, `attr2`, `attr3`, `attr4`, `create_by`, `create_time`, `update_by`, `update_time`)
VALUES ((SELECT rule_id FROM sys_auto_code_rule WHERE rule_code = 'LJBK_CODE'), 1, 'FIXCHAR', 'PREFIX', '前缀', 4, NULL, NULL, 'LJBK', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 'admin', NOW(), '', NULL);
INSERT INTO `sys_auto_code_part` (`rule_id`, `part_index`, `part_type`, `part_code`, `part_name`, `part_length`, `date_format`, `input_character`, `fix_character`, `seria_start_no`, `seria_step`, `seria_now_no`, `cycle_flag`, `cycle_method`, `remark`, `attr1`, `attr2`, `attr3`, `attr4`, `create_by`, `create_time`, `update_by`, `update_time`)
VALUES ((SELECT rule_id FROM sys_auto_code_rule WHERE rule_code = 'LJBK_CODE'), 2, 'SERIALNO', 'SERIAL', '流水号', 6, NULL, NULL, NULL, 1, 1, NULL, 'N', NULL, NULL, NULL, NULL, 0, 0, 'admin', NOW(), '', NULL);
-- XSFH_CODE: 发货通知单
INSERT INTO `sys_auto_code_part` (`rule_id`, `part_index`, `part_type`, `part_code`, `part_name`, `part_length`, `date_format`, `input_character`, `fix_character`, `seria_start_no`, `seria_step`, `seria_now_no`, `cycle_flag`, `cycle_method`, `remark`, `attr1`, `attr2`, `attr3`, `attr4`, `create_by`, `create_time`, `update_by`, `update_time`)
VALUES ((SELECT rule_id FROM sys_auto_code_rule WHERE rule_code = 'XSFH_CODE'), 1, 'FIXCHAR', 'PREFIX', '前缀', 4, NULL, NULL, 'XSFH', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 'admin', NOW(), '', NULL);
INSERT INTO `sys_auto_code_part` (`rule_id`, `part_index`, `part_type`, `part_code`, `part_name`, `part_length`, `date_format`, `input_character`, `fix_character`, `seria_start_no`, `seria_step`, `seria_now_no`, `cycle_flag`, `cycle_method`, `remark`, `attr1`, `attr2`, `attr3`, `attr4`, `create_by`, `create_time`, `update_by`, `update_time`)
VALUES ((SELECT rule_id FROM sys_auto_code_rule WHERE rule_code = 'XSFH_CODE'), 2, 'SERIALNO', 'SERIAL', '流水号', 6, NULL, NULL, NULL, 1, 1, NULL, 'N', NULL, NULL, NULL, NULL, 0, 0, 'admin', NOW(), '', NULL);
-- XSTH_CODE: 退货通知单
INSERT INTO `sys_auto_code_part` (`rule_id`, `part_index`, `part_type`, `part_code`, `part_name`, `part_length`, `date_format`, `input_character`, `fix_character`, `seria_start_no`, `seria_step`, `seria_now_no`, `cycle_flag`, `cycle_method`, `remark`, `attr1`, `attr2`, `attr3`, `attr4`, `create_by`, `create_time`, `update_by`, `update_time`)
VALUES ((SELECT rule_id FROM sys_auto_code_rule WHERE rule_code = 'XSTH_CODE'), 1, 'FIXCHAR', 'PREFIX', '前缀', 4, NULL, NULL, 'XSTH', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 'admin', NOW(), '', NULL);
INSERT INTO `sys_auto_code_part` (`rule_id`, `part_index`, `part_type`, `part_code`, `part_name`, `part_length`, `date_format`, `input_character`, `fix_character`, `seria_start_no`, `seria_step`, `seria_now_no`, `cycle_flag`, `cycle_method`, `remark`, `attr1`, `attr2`, `attr3`, `attr4`, `create_by`, `create_time`, `update_by`, `update_time`)
VALUES ((SELECT rule_id FROM sys_auto_code_rule WHERE rule_code = 'XSTH_CODE'), 2, 'SERIALNO', 'SERIAL', '流水号', 6, NULL, NULL, NULL, 1, 1, NULL, 'N', NULL, NULL, NULL, NULL, 0, 0, 'admin', NOW(), '', NULL);
-- XSKP_CODE: 开票通知单
INSERT INTO `sys_auto_code_part` (`rule_id`, `part_index`, `part_type`, `part_code`, `part_name`, `part_length`, `date_format`, `input_character`, `fix_character`, `seria_start_no`, `seria_step`, `seria_now_no`, `cycle_flag`, `cycle_method`, `remark`, `attr1`, `attr2`, `attr3`, `attr4`, `create_by`, `create_time`, `update_by`, `update_time`)
VALUES ((SELECT rule_id FROM sys_auto_code_rule WHERE rule_code = 'XSKP_CODE'), 1, 'FIXCHAR', 'PREFIX', '前缀', 4, NULL, NULL, 'XSKP', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 'admin', NOW(), '', NULL);
INSERT INTO `sys_auto_code_part` (`rule_id`, `part_index`, `part_type`, `part_code`, `part_name`, `part_length`, `date_format`, `input_character`, `fix_character`, `seria_start_no`, `seria_step`, `seria_now_no`, `cycle_flag`, `cycle_method`, `remark`, `attr1`, `attr2`, `attr3`, `attr4`, `create_by`, `create_time`, `update_by`, `update_time`)
VALUES ((SELECT rule_id FROM sys_auto_code_rule WHERE rule_code = 'XSKP_CODE'), 2, 'SERIALNO', 'SERIAL', '流水号', 6, NULL, NULL, NULL, 1, 1, NULL, 'N', NULL, NULL, NULL, NULL, 0, 0, 'admin', NOW(), '', NULL);
-- -------------------------------------------------------
-- 格式 BFIXCHAR(前缀4位) + NOWDATE(日期8位) + SERIALNO(序号3位按日循环)
-- -------------------------------------------------------
-- SCJH_CODE: 生产计划单
INSERT INTO `sys_auto_code_part` (`rule_id`, `part_index`, `part_type`, `part_code`, `part_name`, `part_length`, `date_format`, `input_character`, `fix_character`, `seria_start_no`, `seria_step`, `seria_now_no`, `cycle_flag`, `cycle_method`, `remark`, `attr1`, `attr2`, `attr3`, `attr4`, `create_by`, `create_time`, `update_by`, `update_time`)
VALUES ((SELECT rule_id FROM sys_auto_code_rule WHERE rule_code = 'SCJH_CODE'), 1, 'FIXCHAR', 'PREFIX', '前缀', 4, NULL, NULL, 'SCJH', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 'admin', NOW(), '', NULL);
INSERT INTO `sys_auto_code_part` (`rule_id`, `part_index`, `part_type`, `part_code`, `part_name`, `part_length`, `date_format`, `input_character`, `fix_character`, `seria_start_no`, `seria_step`, `seria_now_no`, `cycle_flag`, `cycle_method`, `remark`, `attr1`, `attr2`, `attr3`, `attr4`, `create_by`, `create_time`, `update_by`, `update_time`)
VALUES ((SELECT rule_id FROM sys_auto_code_rule WHERE rule_code = 'SCJH_CODE'), 2, 'NOWDATE', 'DATEPART', '年月日', 8, 'yyyyMMdd', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 'admin', NOW(), '', NULL);
INSERT INTO `sys_auto_code_part` (`rule_id`, `part_index`, `part_type`, `part_code`, `part_name`, `part_length`, `date_format`, `input_character`, `fix_character`, `seria_start_no`, `seria_step`, `seria_now_no`, `cycle_flag`, `cycle_method`, `remark`, `attr1`, `attr2`, `attr3`, `attr4`, `create_by`, `create_time`, `update_by`, `update_time`)
VALUES ((SELECT rule_id FROM sys_auto_code_rule WHERE rule_code = 'SCJH_CODE'), 3, 'SERIALNO', 'SERIAL', '流水号', 3, NULL, NULL, NULL, 1, 1, NULL, 'Y', 'DAY', NULL, NULL, NULL, 0, 0, 'admin', NOW(), '', NULL);
-- -------------------------------------------------------
-- 继续格式 A
-- -------------------------------------------------------
-- MBOM_CODE: 物料清单
INSERT INTO `sys_auto_code_part` (`rule_id`, `part_index`, `part_type`, `part_code`, `part_name`, `part_length`, `date_format`, `input_character`, `fix_character`, `seria_start_no`, `seria_step`, `seria_now_no`, `cycle_flag`, `cycle_method`, `remark`, `attr1`, `attr2`, `attr3`, `attr4`, `create_by`, `create_time`, `update_by`, `update_time`)
VALUES ((SELECT rule_id FROM sys_auto_code_rule WHERE rule_code = 'MBOM_CODE'), 1, 'FIXCHAR', 'PREFIX', '前缀', 4, NULL, NULL, 'MBOM', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 'admin', NOW(), '', NULL);
INSERT INTO `sys_auto_code_part` (`rule_id`, `part_index`, `part_type`, `part_code`, `part_name`, `part_length`, `date_format`, `input_character`, `fix_character`, `seria_start_no`, `seria_step`, `seria_now_no`, `cycle_flag`, `cycle_method`, `remark`, `attr1`, `attr2`, `attr3`, `attr4`, `create_by`, `create_time`, `update_by`, `update_time`)
VALUES ((SELECT rule_id FROM sys_auto_code_rule WHERE rule_code = 'MBOM_CODE'), 2, 'SERIALNO', 'SERIAL', '流水号', 6, NULL, NULL, NULL, 1, 1, NULL, 'N', NULL, NULL, NULL, NULL, 0, 0, 'admin', NOW(), '', NULL);
-- WORKORDER_CODE: 生产工单(数据库中已配置,无需重复插入)
-- CGJH_CODE: 采购计划单(原材料)
INSERT INTO `sys_auto_code_part` (`rule_id`, `part_index`, `part_type`, `part_code`, `part_name`, `part_length`, `date_format`, `input_character`, `fix_character`, `seria_start_no`, `seria_step`, `seria_now_no`, `cycle_flag`, `cycle_method`, `remark`, `attr1`, `attr2`, `attr3`, `attr4`, `create_by`, `create_time`, `update_by`, `update_time`)
VALUES ((SELECT rule_id FROM sys_auto_code_rule WHERE rule_code = 'CGJH_CODE'), 1, 'FIXCHAR', 'PREFIX', '前缀', 4, NULL, NULL, 'CGJH', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 'admin', NOW(), '', NULL);
INSERT INTO `sys_auto_code_part` (`rule_id`, `part_index`, `part_type`, `part_code`, `part_name`, `part_length`, `date_format`, `input_character`, `fix_character`, `seria_start_no`, `seria_step`, `seria_now_no`, `cycle_flag`, `cycle_method`, `remark`, `attr1`, `attr2`, `attr3`, `attr4`, `create_by`, `create_time`, `update_by`, `update_time`)
VALUES ((SELECT rule_id FROM sys_auto_code_rule WHERE rule_code = 'CGJH_CODE'), 2, 'SERIALNO', 'SERIAL', '流水号', 6, NULL, NULL, NULL, 1, 1, NULL, 'N', NULL, NULL, NULL, NULL, 0, 0, 'admin', NOW(), '', NULL);
-- FLJH_CODE: 采购计划单(零部件)
INSERT INTO `sys_auto_code_part` (`rule_id`, `part_index`, `part_type`, `part_code`, `part_name`, `part_length`, `date_format`, `input_character`, `fix_character`, `seria_start_no`, `seria_step`, `seria_now_no`, `cycle_flag`, `cycle_method`, `remark`, `attr1`, `attr2`, `attr3`, `attr4`, `create_by`, `create_time`, `update_by`, `update_time`)
VALUES ((SELECT rule_id FROM sys_auto_code_rule WHERE rule_code = 'FLJH_CODE'), 1, 'FIXCHAR', 'PREFIX', '前缀', 4, NULL, NULL, 'FLJH', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 'admin', NOW(), '', NULL);
INSERT INTO `sys_auto_code_part` (`rule_id`, `part_index`, `part_type`, `part_code`, `part_name`, `part_length`, `date_format`, `input_character`, `fix_character`, `seria_start_no`, `seria_step`, `seria_now_no`, `cycle_flag`, `cycle_method`, `remark`, `attr1`, `attr2`, `attr3`, `attr4`, `create_by`, `create_time`, `update_by`, `update_time`)
VALUES ((SELECT rule_id FROM sys_auto_code_rule WHERE rule_code = 'FLJH_CODE'), 2, 'SERIALNO', 'SERIAL', '流水号', 6, NULL, NULL, NULL, 1, 1, NULL, 'N', NULL, NULL, NULL, NULL, 0, 0, 'admin', NOW(), '', NULL);
-- BCJH_CODE: 采购计划单(五金)
INSERT INTO `sys_auto_code_part` (`rule_id`, `part_index`, `part_type`, `part_code`, `part_name`, `part_length`, `date_format`, `input_character`, `fix_character`, `seria_start_no`, `seria_step`, `seria_now_no`, `cycle_flag`, `cycle_method`, `remark`, `attr1`, `attr2`, `attr3`, `attr4`, `create_by`, `create_time`, `update_by`, `update_time`)
VALUES ((SELECT rule_id FROM sys_auto_code_rule WHERE rule_code = 'BCJH_CODE'), 1, 'FIXCHAR', 'PREFIX', '前缀', 4, NULL, NULL, 'BCJH', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 'admin', NOW(), '', NULL);
INSERT INTO `sys_auto_code_part` (`rule_id`, `part_index`, `part_type`, `part_code`, `part_name`, `part_length`, `date_format`, `input_character`, `fix_character`, `seria_start_no`, `seria_step`, `seria_now_no`, `cycle_flag`, `cycle_method`, `remark`, `attr1`, `attr2`, `attr3`, `attr4`, `create_by`, `create_time`, `update_by`, `update_time`)
VALUES ((SELECT rule_id FROM sys_auto_code_rule WHERE rule_code = 'BCJH_CODE'), 2, 'SERIALNO', 'SERIAL', '流水号', 6, NULL, NULL, NULL, 1, 1, NULL, 'N', NULL, NULL, NULL, NULL, 0, 0, 'admin', NOW(), '', NULL);
-- CGDD_CODE: 采购订单
INSERT INTO `sys_auto_code_part` (`rule_id`, `part_index`, `part_type`, `part_code`, `part_name`, `part_length`, `date_format`, `input_character`, `fix_character`, `seria_start_no`, `seria_step`, `seria_now_no`, `cycle_flag`, `cycle_method`, `remark`, `attr1`, `attr2`, `attr3`, `attr4`, `create_by`, `create_time`, `update_by`, `update_time`)
VALUES ((SELECT rule_id FROM sys_auto_code_rule WHERE rule_code = 'CGDD_CODE'), 1, 'FIXCHAR', 'PREFIX', '前缀', 4, NULL, NULL, 'CGDD', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 'admin', NOW(), '', NULL);
INSERT INTO `sys_auto_code_part` (`rule_id`, `part_index`, `part_type`, `part_code`, `part_name`, `part_length`, `date_format`, `input_character`, `fix_character`, `seria_start_no`, `seria_step`, `seria_now_no`, `cycle_flag`, `cycle_method`, `remark`, `attr1`, `attr2`, `attr3`, `attr4`, `create_by`, `create_time`, `update_by`, `update_time`)
VALUES ((SELECT rule_id FROM sys_auto_code_rule WHERE rule_code = 'CGDD_CODE'), 2, 'SERIALNO', 'SERIAL', '流水号', 6, NULL, NULL, NULL, 1, 1, NULL, 'N', NULL, NULL, NULL, NULL, 0, 0, 'admin', NOW(), '', NULL);
-- CGDH_CODE: 采购到货单
INSERT INTO `sys_auto_code_part` (`rule_id`, `part_index`, `part_type`, `part_code`, `part_name`, `part_length`, `date_format`, `input_character`, `fix_character`, `seria_start_no`, `seria_step`, `seria_now_no`, `cycle_flag`, `cycle_method`, `remark`, `attr1`, `attr2`, `attr3`, `attr4`, `create_by`, `create_time`, `update_by`, `update_time`)
VALUES ((SELECT rule_id FROM sys_auto_code_rule WHERE rule_code = 'CGDH_CODE'), 1, 'FIXCHAR', 'PREFIX', '前缀', 4, NULL, NULL, 'CGDH', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 'admin', NOW(), '', NULL);
INSERT INTO `sys_auto_code_part` (`rule_id`, `part_index`, `part_type`, `part_code`, `part_name`, `part_length`, `date_format`, `input_character`, `fix_character`, `seria_start_no`, `seria_step`, `seria_now_no`, `cycle_flag`, `cycle_method`, `remark`, `attr1`, `attr2`, `attr3`, `attr4`, `create_by`, `create_time`, `update_by`, `update_time`)
VALUES ((SELECT rule_id FROM sys_auto_code_rule WHERE rule_code = 'CGDH_CODE'), 2, 'SERIALNO', 'SERIAL', '流水号', 6, NULL, NULL, NULL, 1, 1, NULL, 'N', NULL, NULL, NULL, NULL, 0, 0, 'admin', NOW(), '', NULL);
-- CGTH_CODE: 采购退货单
INSERT INTO `sys_auto_code_part` (`rule_id`, `part_index`, `part_type`, `part_code`, `part_name`, `part_length`, `date_format`, `input_character`, `fix_character`, `seria_start_no`, `seria_step`, `seria_now_no`, `cycle_flag`, `cycle_method`, `remark`, `attr1`, `attr2`, `attr3`, `attr4`, `create_by`, `create_time`, `update_by`, `update_time`)
VALUES ((SELECT rule_id FROM sys_auto_code_rule WHERE rule_code = 'CGTH_CODE'), 1, 'FIXCHAR', 'PREFIX', '前缀', 4, NULL, NULL, 'CGTH', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 'admin', NOW(), '', NULL);
INSERT INTO `sys_auto_code_part` (`rule_id`, `part_index`, `part_type`, `part_code`, `part_name`, `part_length`, `date_format`, `input_character`, `fix_character`, `seria_start_no`, `seria_step`, `seria_now_no`, `cycle_flag`, `cycle_method`, `remark`, `attr1`, `attr2`, `attr3`, `attr4`, `create_by`, `create_time`, `update_by`, `update_time`)
VALUES ((SELECT rule_id FROM sys_auto_code_rule WHERE rule_code = 'CGTH_CODE'), 2, 'SERIALNO', 'SERIAL', '流水号', 6, NULL, NULL, NULL, 1, 1, NULL, 'N', NULL, NULL, NULL, NULL, 0, 0, 'admin', NOW(), '', NULL);
-- CGFP_CODE: 采购发票单
INSERT INTO `sys_auto_code_part` (`rule_id`, `part_index`, `part_type`, `part_code`, `part_name`, `part_length`, `date_format`, `input_character`, `fix_character`, `seria_start_no`, `seria_step`, `seria_now_no`, `cycle_flag`, `cycle_method`, `remark`, `attr1`, `attr2`, `attr3`, `attr4`, `create_by`, `create_time`, `update_by`, `update_time`)
VALUES ((SELECT rule_id FROM sys_auto_code_rule WHERE rule_code = 'CGFP_CODE'), 1, 'FIXCHAR', 'PREFIX', '前缀', 4, NULL, NULL, 'CGFP', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 'admin', NOW(), '', NULL);
INSERT INTO `sys_auto_code_part` (`rule_id`, `part_index`, `part_type`, `part_code`, `part_name`, `part_length`, `date_format`, `input_character`, `fix_character`, `seria_start_no`, `seria_step`, `seria_now_no`, `cycle_flag`, `cycle_method`, `remark`, `attr1`, `attr2`, `attr3`, `attr4`, `create_by`, `create_time`, `update_by`, `update_time`)
VALUES ((SELECT rule_id FROM sys_auto_code_rule WHERE rule_code = 'CGFP_CODE'), 2, 'SERIALNO', 'SERIAL', '流水号', 6, NULL, NULL, NULL, 1, 1, NULL, 'N', NULL, NULL, NULL, NULL, 0, 0, 'admin', NOW(), '', NULL);
-- ============================================================
-- 三、规则速查表
-- ============================================================
-- rule_code | rule_name | 生成示例
-- ---------------+------------------------+---------------------
-- XSDD_CODE | 销售订单编码规则 | XSDD000001
-- XSBH_CODE | 备货订单编码规则 | XSBH000001
-- LJBK_CODE | 零部件订单编码规则 | LJBK000001
-- XSFH_CODE | 发货通知单编码规则 | XSFH000001
-- XSTH_CODE | 退货通知单编码规则 | XSTH000001
-- XSKP_CODE | 开票通知单编码规则 | XSKP000001
-- SCJH_CODE | 生产计划单编码规则 | SCJH20260213001
-- MBOM_CODE | 物料清单编码规则 | MBOM000001
-- WORKORDER_CODE | 生产工单编码规则 | (已在数据库中配置)
-- CGJH_CODE | 采购计划单编码(原材料) | CGJH000001
-- FLJH_CODE | 采购计划单编码(零部件) | FLJH000001
-- BCJH_CODE | 采购计划单编码(五金) | BCJH000001
-- CGDD_CODE | 采购订单编码规则 | CGDD000001
-- CGDH_CODE | 采购到货单编码规则 | CGDH000001
-- CGTH_CODE | 采购退货单编码规则 | CGTH000001
-- CGFP_CODE | 采购发票单编码规则 | CGFP000001
-- ============================================================
-- 调用方式GET /system/autocode/get/{ruleCode}
-- 示例GET /system/autocode/get/XSDD_CODE => XSDD000001
-- ============================================================

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,417 @@
# ERP数据库设计 - Swagger API补充模块
> 版本: 1.0.0
> 创建日期: 2026-02-06
> 数据来源: 目标ERP系统 Swagger 2.0 API文档实时抓取
> 说明: 本文档记录从Swagger API中发现的、当前数据库设计文档尚未覆盖的模块和表结构
---
## 1. 发现概述
通过实时抓取目标ERP系统的 Swagger API`https://demo.rsun.vip/prod-api/v2/api-docs?group=*`),发现以下模块在当前 `erp数据库设计-数据字典.md``erp数据库设计-DDL.sql` 中**尚未收录**
| 序号 | 模块 | API前缀 | Java包前缀 | 现有文档状态 | 表数量(估) |
|------|------|---------|-----------|-------------|-----------|
| 1 | 生产管理(车间) | /prs | Prs* | **未收录** | ~20 |
| 2 | 研发管理 | /rd | Rd* | **未收录** | ~10 |
| 3 | 委外管理 | /pu | Pu* | **未收录** | ~14 |
| 4 | 财务管理 | /fd | Fd* | **未收录** | ~30+ |
| 5 | 车间设置 | /prs (基础) | Prs* | **未收录** | ~8 |
### 1.1 重要发现ERP实际命名规范
通过Swagger API分析目标ERP系统的实际字段命名与当前数据库设计文档中**基于推测的命名存在差异**
| 概念 | 数据字典中的假设命名 | Swagger API实际命名 | 说明 |
|------|---------------------|-------------------|------|
| 主键ID | order_id, plan_id 等 | **uniqueId** | 统一使用uniqueId作为主键名 |
| 单据编码 | order_code, plan_code 等 | **模块Code** (如 puCode, prsCode, rdCode) | 按模块区分 |
| 物料编码 | item_code | **invCode** | inv = Inventory |
| 物料名称 | item_name | **invName** | inv = Inventory |
| 物料属性 | specification | **invAttribute** | |
| 物料分类ID | item_type_id | **invSortId** | sort = 分类 |
| 物料根分类 | - | **invSortRoot** | 顶级分类 |
| 计量单位编码 | unit_of_measure | **unitCode** | |
| 计量单位名称 | unit_name | **unitName** | 一致 |
| 单据日期 | order_date, plan_date | **invoiceDate** | 统一用invoiceDate |
| 单据状态 | status | **invoiceStatus** | invoice=单据 |
| 单据类型 | order_type | **invoiceType** | |
| 业务状态 | business_status | **workStatus** | |
| 业务类型 | business_type / work_type | **workType** | |
| 业务部门 | dept_name | **workDept** | |
| 业务人员 | operator_name | **workStaff** | |
| 跟单编号 | track_code | **ppNumber** | 全局唯一,关联销售订单 |
| 操作员 | operator_name | **userOper** | |
| 审核员 | approver_name | **userCheck** | |
| 审核日期 | approve_date | **checkDate** | |
| 表单配置 | - | **formConfig** | 动态表单配置标识 |
| 版本号 | version | **version** (int64) | 乐观锁版本号 |
| 供应方式 | supply_type | **invSupplyType** | |
| 已完成数量 | delivered_qty, arrived_qty | **wiQuantity** | wi = Written In |
| 删除标志 | del_flag | **delFlag** | 一致 |
> **关键结论**: ERP系统所有单据模块共享一套统一的基类字段BaseEntity包含: uniqueId, ppNumber, invoiceDate, invoiceStatus, invoiceType, workType, workStatus, workDept, workStaff, userOper, userCheck, checkDate, formConfig, version, delFlag, createBy, createTime, updateBy, updateTime, remark, remarks
---
## 2. 生产管理模块 (prs_*)
### 2.1 模块功能清单来自Swagger tags
| 序号 | 功能 | API前缀 | Java实体 | 说明 |
|------|------|---------|---------|------|
| 1 | 生产订单 | /prs/order | PrsOrderMaster | 生产订单(从计划单下发) |
| 2 | 生产领料单 | /prs/pick | PrsPickMaster | 车间生产领料 |
| 3 | 生产完工单 | /prs/product | PrsProductMaster | 工序报工/生产完工 |
| 4 | 生产入库单 | /prs/checkin | PrsCheckinMaster | 生产入库 |
| 5 | 生产指令单 | /prs/instruct | PrsInstructMaster | 生产指令(批次管理) |
| 6 | 生产报工单 | /prs/yield | PrsYieldMaster | 工序报工 |
| 7 | 工序完工单 | /prs/process | PrsProductProcess | 工序级完工 |
| 8 | 生产线 | /prs/beltline | PrsBeltline | 生产线管理 |
| 9 | 班组 | /prs/team | PrsTeam | 班组管理 |
| 10 | 工人 | /prs/worker | PrsWorker | 工人档案 |
| 11 | 工人工资 | /prs/wages | PrsWorkerWages | 计件工资 |
| 12 | 工种 | /prs/jobs | PrsJobs | 工种定义 |
| 13 | 标准工序段 | /prs/operate | PrsOperateSection | 工序段定义 |
| 14 | 工艺路线 | /prs/route | PrsProcessRoute | 产品工艺路线 |
| 15 | 设备 | /prs/equipment | PrsEquipment | 设备管理 |
| 16 | 包装线 | /prs/pack/line | PrsPackLine | 包装产线 |
| 17 | 包装工序 | /prs/pack/section | PrsPackSection | 包装工序 |
| 18 | 包装指令单 | /prs/pack | PrsPackMaster | 包装指令 |
### 2.2 生产订单 (PrsOrderMaster) 关键字段
> 来源: Swagger API GET /prs/order/list 参数列表
| Swagger字段名 | 数据库推断字段名 | 类型 | 说明 |
|--------------|----------------|------|------|
| uniqueId | unique_id | bigint | 主键ID |
| prsCode | prs_code | varchar | 生产订单编码 |
| invCode | inv_code | varchar | 物料编码 |
| invName | inv_name | varchar | 物料名称 |
| invAttribute | inv_attribute | varchar | 物料属性/规格 |
| invQuantity | inv_quantity | decimal | 物料数量 |
| invSortId | inv_sort_id | varchar | 物料分类ID |
| invSortRoot | inv_sort_root | varchar | 物料根分类ID |
| invSupplyType | inv_supply_type | varchar | 供应方式 |
| unitCode | unit_code | varchar | 计量单位编码 |
| unitName | unit_name | varchar | 计量单位名称 |
| drawingNo | drawing_no | varchar | 图纸号 |
| mpOrderCode | mp_order_code | varchar | 关联计划单编码 |
| woCode | wo_code | varchar | 关联工单编码(上游) |
| woQuantity | wo_quantity | decimal | 工单数量 |
| woDate | wo_date | datetime | 工单日期 |
| woType | wo_type | varchar | 工单类型 |
| woTypeId | wo_type_id | varchar | 工单类型ID |
| woInvoice | wo_invoice | varchar | 上游单据 |
| woInvoiceId | wo_invoice_id | varchar | 上游单据ID |
| woConfig | wo_config | varchar | 工单配置 |
| wiQuantity | wi_quantity | decimal | 已完成数量 |
| wiInstruct | wi_instruct | decimal | 已下达指令数量 |
| process | process | varchar | 工艺路线 |
| processId | process_id | varchar | 工艺路线ID |
| prsProcessCode | prs_process_code | varchar | 生产工序编码 |
| beltline | beltline | varchar | 生产线名称 |
| beltlineId | beltline_id | varchar | 生产线ID |
| warehouse | warehouse | varchar | 入库仓库 |
| duration | duration | bigint | 加工时长 |
| arrangeDate | arrange_date | datetime | 排产日期 |
| needDate | need_date | datetime | 需求日期 |
| ppDate | pp_date | datetime | 计划日期 |
| salesman | salesman | varchar | 销售员 |
| upstreamType | upstream_type | varchar | 上游类型 |
| nonZero | non_zero | varchar | 是否显示未完成 |
| *+BaseEntity公共字段* | | | 见上方公共字段表 |
### 2.3 车间基础设置表
| 表名推断 | 实体名 | 关键字段 | 说明 |
|---------|--------|---------|------|
| prs_beltline | PrsBeltline | uniqueId, code, name, processRoute, status | 生产线 |
| prs_team | PrsTeam | uniqueId, code, name, status | 班组 |
| prs_worker | PrsWorker | uniqueId, code, name, jobs, status | 工人 |
| prs_jobs | PrsJobs | uniqueId, code, name, jobs, ratio | 工种 |
| prs_operate_section | PrsOperateSection | uniqueId, code, name, duration, costRatio, countType, isQuality | 标准工序段 |
| prs_process_route | PrsProcessRoute | uniqueId, code, name, status | 工艺路线 |
| prs_equipment | PrsEquipment | uniqueId, code, name, deptName, status | 设备 |
---
## 3. 研发管理模块 (rd_*)
### 3.1 模块功能清单
| 序号 | 功能 | API前缀 | Java实体 | 说明 |
|------|------|---------|---------|------|
| 1 | 产品BOM(EBOM) | /rd/ebom | RdEbomMaster / RdEbomSalve | 研发物料清单(主从表) |
| 2 | 样品配方 | /rd/sample | RdSampleMaster / RdSampleSalve | 样品配方(主从表) |
| 3 | 孪生物料 | /rd/twin | RdTwinMaster / RdTwinSalve | 可替换/同色物料(主从表) |
| 4 | 放量 | /rd/tret | RdTret | 物料分类放量系数 |
| 5 | 研发设置 | /rd/setting | RdSetting | 参数配置 |
### 3.2 EBOM表头 (RdEbomMaster) 字段定义
> 来源: Swagger definitions.RdEbomMaster
| Swagger字段名 | 数据库推断字段名 | 类型 | 说明 |
|--------------|----------------|------|------|
| uniqueId | unique_id | bigint | 主键 |
| rdCode | rd_code | varchar | BOM单据编码 |
| invCode | inv_code | varchar | 母件物料编码 |
| invName | inv_name | varchar | 母件物料名称 |
| invAttribute | inv_attribute | varchar | 母件物料属性 |
| invSortId | inv_sort_id | bigint | 物料分类ID |
| invSortRoot | inv_sort_root | bigint | 物料根分类ID |
| unitCode | unit_code | varchar | 计量单位编码 |
| unitName | unit_name | varchar | 计量单位名称 |
| baseNumber | base_number | decimal | 母件基数 |
| verNumber | ver_number | varchar | 版本号 |
| verRemark | ver_remark | varchar | 版本说明 |
| drawingNo | drawing_no | varchar | 图纸号 |
| attribute | attribute | varchar | 属性 |
| colour | colour | varchar | 颜色 |
| density | density | float | 密度 |
| cost | cost | varchar | 成本 |
| cust | cust | varchar | 客户 |
| property | property | varchar | 性质 |
| rdRecipeSalveList | - | array | 明细行列表 |
| *+BaseEntity公共字段* | | | |
### 3.3 EBOM明细 (RdEbomSalve) 字段定义
| Swagger字段名 | 数据库推断字段名 | 类型 | 说明 |
|--------------|----------------|------|------|
| uniqueId | unique_id | bigint | 明细行主键 |
| rdCode | rd_code | varchar | 关联BOM编码 |
| invCode | inv_code | varchar | 子件物料编码 |
| invName | inv_name | varchar | 子件物料名称 |
| invAttribute | inv_attribute | varchar | 子件物料属性 |
| invSortId | inv_sort_id | bigint | 子件分类ID |
| invSortRoot | inv_sort_root | bigint | 子件根分类ID |
| invSupplyType | inv_supply_type | varchar | 子件供应方式 |
| invOutType | inv_out_type | varchar | 领料方式 |
| unitCode | unit_code | varchar | 计量单位编码 |
| unitName | unit_name | varchar | 计量单位名称 |
| ratio | ratio | decimal | 用量比例(分子) |
| fill | fill | varchar | 填充/用量方式 |
| drawingNo | drawing_no | varchar | 子件图纸号 |
| formula | formula | varchar | 公式 |
| orderNum | order_num | int | 排序号 |
| parentId | parent_id | bigint | 父节点ID(多阶) |
| ancestors | ancestors | varchar | 祖级列表 |
| children | - | array | 子节点(树形) |
### 3.4 孪生物料表头 (RdTwinMaster)
| Swagger字段名 | 说明 |
|--------------|------|
| uniqueId | 主键 |
| rdCode | 孪生物料单据编码 |
| invCode / invName | 物料编码/名称 |
| title | 标题/说明 |
| dynamicSpec | 动态规格 |
| rdTwinSalveList | 明细行(含 colour, priority 字段) |
### 3.5 放量表 (RdTret)
| Swagger字段名 | 说明 |
|--------------|------|
| uniqueId | 主键 |
| sortId / sortCode / sortName | 物料分类ID/编码/名称 |
| f1, f2, f3, f4, f5 | 5个放量系数(number类型) |
### 3.6 研发设置表 (RdSetting)
| Swagger字段名 | 说明 |
|--------------|------|
| uniqueId | 主键 |
| invCode / invName / invAttribute | 物料信息 |
| invSortId / invSortRoot | 物料分类 |
| enableColor | 启用颜色管理 |
| enableContent | 启用含量管理 |
| jsonContent | JSON配置内容 |
---
## 4. 委外管理模块 (pu_*)
### 4.1 模块功能清单
| 序号 | 功能 | API前缀 | Java实体 | 说明 |
|------|------|---------|---------|------|
| 1 | 委外商 | /pu/supplier | PuSupplier | 委外加工商档案 |
| 2 | 委外订单 | /pu/order | PuOrderMaster | 委外加工订单(主从表) |
| 3 | 委外到货单 | /pu/product | PuProductMaster | 委外到货(主从表) |
| 4 | 委外入库单 | /pu/checkin | PuCheckinMaster | 委外入库(主从表) |
| 5 | 委外发料单 | /pu/pick | PuPickMaster | 向委外商发料(主从表) |
| 6 | 委外退料单 | /pu/unpick | PuUnPickMaster | 委外退料(主从表) |
| 7 | 委外发票 | /pu/fapiao | PuFapiaoMaster | 委外加工费发票(含发票查验) |
### 4.2 委外订单 (PuOrderMaster) 关键特有字段
| Swagger字段名 | 说明 |
|--------------|------|
| puCode | 委外订单编码 |
| supplier / supplierId | 委外商名称/ID |
| contract | 合同号 |
| processingFee | 加工费 |
| shippingFee | 运费 |
| mpOrderCode | 关联计划单编码 |
| salesman | 销售员(跟单) |
| item | 物料项 |
| woCode / woQuantity / woDate / woType | 上游工单信息 |
| drawingNo | 图纸号 |
| duration | 加工周期 |
| arrangeDate | 排期日期 |
| needDate | 需求日期 |
### 4.3 委外发票 (PuFapiaoMaster) 特有字段
| Swagger字段名 | 说明 |
|--------------|------|
| puCode | 发票单据编码 |
| supplier / supplierId | 委外商 |
| vatCode | 发票代码 |
| vatNo | 发票号码 |
| vatDate | 开票日期 |
| vatKind | 发票种类 |
| vatType | 发票类型 |
| vatAmount | 发票金额(不含税) |
| vatTax | 税额 |
| vatTotal | 价税合计 |
| vatRate | 税率 |
| vatStatus | 发票状态 |
| taxNumber | 纳税人识别号 |
| entryType | 入账类型 |
| fdPeriod | 财务期间 |
| filePdf / fileXml / fileOfd | 发票附件 |
| bredNo / bredReason / bredVouch | 红冲信息 |
| wiAmount / wiAmountR / wiTaxR | 已核销金额 |
---
## 5. 与现有数据库设计的差异分析
### 5.1 已有文档中的命名 vs Swagger实际命名
现有 `erp数据库设计-DDL.sql` 中的表采用了**规范化的英文命名**(如 `erp_sl_order`, `order_code`, `item_code`),这些是**我们自行设计的DDL结构**。而目标ERP系统Swagger API揭示的**实际字段命名不同**。
| 现有DDL表名 | 实际API路径 | 实际实体名 | 状态 |
|-----------|-----------|-----------|------|
| erp_sl_order | /sl/order | SlOrderMaster | ✅ API已文档化DDL已设计 |
| erp_sl_deliver | /sl/deliver | SlDeliverMaster | ✅ API已文档化DDL已设计 |
| erp_po_order | /po/order | PoOrderMaster | ✅ API已文档化DDL已设计 |
| erp_po_checkin | /po/checkin | PoCheckinMaster | ✅ API已文档化DDL已设计 |
| erp_mp_plan | /mp/plan | MpPlanMaster | ✅ API已文档化DDL已设计 |
| erp_mp_mbom | /mp/mbom | MpMbomMaster | ✅ API已文档化DDL已设计 |
| (无) | /prs/order | PrsOrderMaster | ❌ **新发现 - 需补充** |
| (无) | /prs/pick | PrsPickMaster | ❌ **新发现 - 需补充** |
| (无) | /prs/checkin | PrsCheckinMaster | ❌ **新发现 - 需补充** |
| (无) | /rd/ebom | RdEbomMaster | ❌ **新发现 - 需补充** |
| (无) | /rd/sample | RdSampleMaster | ❌ **新发现 - 需补充** |
| (无) | /rd/twin | RdTwinMaster | ❌ **新发现 - 需补充** |
| (无) | /pu/order | PuOrderMaster | ❌ **新发现 - 需补充** |
| (无) | /pu/checkin | PuCheckinMaster | ❌ **新发现 - 需补充** |
| (无) | /pu/fapiao | PuFapiaoMaster | ❌ **新发现 - 需补充** |
| (无) | /fd/* | Fd* | ❌ **新发现 - 需补充** |
### 5.2 关于公共基类字段(BaseEntity)
Swagger API揭示所有单据实体都继承自同一个基类包含以下标准化字段。现有DDL中这些字段的命名**大部分一致**,但有几个需要特别注意:
| 基类字段 | 现有DDL命名 | 对齐建议 |
|---------|-----------|---------|
| ppNumber | track_code / order_code | 建议在DDL中增加 pp_number 字段 |
| invoiceDate | order_date / plan_date | 各模块已有对应日期字段,无需修改 |
| invoiceStatus | status | 一致 |
| workType | business_type / work_type | 一致 |
| workStatus | business_status | 建议统一 |
| formConfig | (无) | 建议增加 form_config 字段 |
| version | (无) | 建议增加 version 字段(乐观锁) |
| remarks | (无) | 建议增加 remarks 字段 |
---
## 6. 待补充到DDL的表清单
### 6.1 优先级P0 - 生产管理核心表
| 序号 | 推断表名 | 说明 | 对应API |
|------|---------|------|---------|
| 1 | erp_prs_order | 生产订单表头 | /prs/order |
| 2 | erp_prs_order_line | 生产订单明细 | /prs/order/chain |
| 3 | erp_prs_pick | 生产领料单表头 | /prs/pick |
| 4 | erp_prs_pick_line | 生产领料单明细 | /prs/pick/getDetail |
| 5 | erp_prs_product | 生产完工单表头 | /prs/product |
| 6 | erp_prs_product_line | 生产完工单明细 | /prs/product/chain |
| 7 | erp_prs_checkin | 生产入库单表头 | /prs/checkin |
| 8 | erp_prs_checkin_line | 生产入库单明细 | /prs/checkin/getDetail |
### 6.2 优先级P0 - 研发管理核心表
| 序号 | 推断表名 | 说明 | 对应API |
|------|---------|------|---------|
| 1 | erp_rd_ebom | EBOM表头 | /rd/ebom |
| 2 | erp_rd_ebom_line | EBOM明细 | /rd/ebom/getDetail |
| 3 | erp_rd_sample | 样品配方表头 | /rd/sample |
| 4 | erp_rd_sample_line | 样品配方明细 | /rd/sample/chain |
| 5 | erp_rd_twin | 孪生物料表头 | /rd/twin |
| 6 | erp_rd_twin_line | 孪生物料明细 | /rd/twin/chain |
| 7 | erp_rd_tret | 放量表 | /rd/tret |
| 8 | erp_rd_setting | 研发设置 | /rd/setting |
### 6.3 优先级P1 - 委外管理表
| 序号 | 推断表名 | 说明 | 对应API |
|------|---------|------|---------|
| 1 | erp_pu_supplier | 委外商档案 | /pu/supplier |
| 2 | erp_pu_order | 委外订单表头 | /pu/order |
| 3 | erp_pu_order_line | 委外订单明细 | /pu/order/chain |
| 4 | erp_pu_product | 委外到货单表头 | /pu/product |
| 5 | erp_pu_checkin | 委外入库单表头 | /pu/checkin |
| 6 | erp_pu_pick | 委外发料单表头 | /pu/pick |
| 7 | erp_pu_unpick | 委外退料单表头 | /pu/unpick |
| 8 | erp_pu_fapiao | 委外发票表头 | /pu/fapiao |
### 6.4 优先级P1 - 车间设置基础表
| 序号 | 推断表名 | 说明 | 对应API |
|------|---------|------|---------|
| 1 | erp_prs_beltline | 生产线 | /prs/beltline |
| 2 | erp_prs_team | 班组 | /prs/team |
| 3 | erp_prs_worker | 工人 | /prs/worker |
| 4 | erp_prs_jobs | 工种 | /prs/jobs |
| 5 | erp_prs_operate_section | 标准工序段 | /prs/operate |
| 6 | erp_prs_process_route | 工艺路线 | /prs/route |
| 7 | erp_prs_equipment | 设备 | /prs/equipment |
### 6.5 优先级P2 - 财务管理表
> 财务模块接口数量多,功能复杂(含凭证、科目、应收应付、成本核算等),建议后续单独分析和设计。
---
## 7. API路径与现有文档的完整对照
| 模块 | API前缀 | Swagger API文档地址 | 现有数据字典 | 现有DDL |
|------|---------|-------------------|------------|--------|
| 销售模块 | /sl | group=销售模块 | ✅ Section 6 | ✅ erp_sl_* |
| 采购模块 | /po | group=采购模块 | ✅ Section 7 | ✅ erp_po_* |
| 生产计划 | /mp | group=计划模块 (部分) | ✅ Section 8 | ✅ erp_mp_* |
| 物料模块 | /md | group=物料模块 | ✅ Section 4 | ✅ erp_md_* |
| 仓库模块 | /wm | group=仓库模块 | ✅ Section 5 | ✅ erp_wm_* |
| **生产管理** | **/prs** | **group=生产模块** | **❌ 缺失** | **❌ 缺失** |
| **研发管理** | **/rd** | **group=研发模块** | **❌ 缺失** | **❌ 缺失** |
| **委外管理** | **/pu** | **group=委外模块** | **❌ 缺失** | **❌ 缺失** |
| **财务管理** | **/fd** | **group=财务模块** | **❌ 缺失** | **❌ 缺失** |
| 计划模块 | /pl | group=计划模块 | 部分 | 部分 |
| 系统管理 | /system | group=系统模块 | ❌ | ❌ |
---
## 修订历史
| 版本 | 日期 | 修订内容 | 修订人 |
|------|------|----------|--------|
| 1.0.0 | 2026-02-06 | 初始版本基于Swagger API实时分析整理 | System |

View File

@@ -0,0 +1,213 @@
-- =====================================================
-- ERP系统数据库设计 - 初始数据脚本
-- 版本: 1.0.0
-- 创建日期: 2026-01-25
-- 说明: 系统初始化数据,包含默认租户、字典、计量单位等
-- =====================================================
SET NAMES utf8mb4;
-- =====================================================
-- 1. 默认租户数据
-- 说明: 用户表(sys_user)和部门表(sys_dept)已在原项目数据库中定义,此处不再插入初始数据
-- =====================================================
INSERT INTO `sys_tenant` (`tenant_id`, `tenant_name`, `contact_name`, `contact_phone`, `status`, `del_flag`, `create_time`) VALUES
('000000', '默认租户', '管理员', '13800000000', '0', '0', NOW());
-- =====================================================
-- 2. 计量单位数据
-- =====================================================
INSERT INTO `erp_md_unit` (`tenant_id`, `unit_code`, `unit_name`, `unit_type`, `order_num`, `enable_flag`, `del_flag`, `create_time`) VALUES
-- 数量单位
('000000', 'PCS', '', 'COUNT', 1, 'Y', '0', NOW()),
('000000', 'SET', '', 'COUNT', 2, 'Y', '0', NOW()),
('000000', 'PAIR', '', 'COUNT', 3, 'Y', '0', NOW()),
('000000', 'BATCH', '', 'COUNT', 4, 'Y', '0', NOW()),
('000000', 'ROLL', '', 'COUNT', 5, 'Y', '0', NOW()),
('000000', 'SHEET', '', 'COUNT', 6, 'Y', '0', NOW()),
('000000', 'BOX', '', 'COUNT', 7, 'Y', '0', NOW()),
('000000', 'BAG', '', 'COUNT', 8, 'Y', '0', NOW()),
('000000', 'BOTTLE', '', 'COUNT', 9, 'Y', '0', NOW()),
('000000', 'CAN', '', 'COUNT', 10, 'Y', '0', NOW()),
-- 重量单位
('000000', 'KG', '千克', 'WEIGHT', 20, 'Y', '0', NOW()),
('000000', 'G', '', 'WEIGHT', 21, 'Y', '0', NOW()),
('000000', 'T', '', 'WEIGHT', 22, 'Y', '0', NOW()),
('000000', 'MG', '毫克', 'WEIGHT', 23, 'Y', '0', NOW()),
-- 长度单位
('000000', 'M', '', 'LENGTH', 30, 'Y', '0', NOW()),
('000000', 'CM', '厘米', 'LENGTH', 31, 'Y', '0', NOW()),
('000000', 'MM', '毫米', 'LENGTH', 32, 'Y', '0', NOW()),
('000000', 'KM', '千米', 'LENGTH', 33, 'Y', '0', NOW()),
-- 面积单位
('000000', 'M2', '平方米', 'AREA', 40, 'Y', '0', NOW()),
('000000', 'CM2', '平方厘米', 'AREA', 41, 'Y', '0', NOW()),
-- 体积单位
('000000', 'M3', '立方米', 'VOLUME', 50, 'Y', '0', NOW()),
('000000', 'L', '', 'VOLUME', 51, 'Y', '0', NOW()),
('000000', 'ML', '毫升', 'VOLUME', 52, 'Y', '0', NOW());
-- =====================================================
-- 3. 物料分类数据
-- =====================================================
INSERT INTO `erp_md_item_type` (`tenant_id`, `item_type_code`, `item_type_name`, `parent_type_id`, `ancestors`, `order_num`, `enable_flag`, `del_flag`, `create_time`) VALUES
-- 一级分类
('000000', 'RAW', '原材料', NULL, NULL, 1, 'Y', '0', NOW()),
('000000', 'PARTS', '零部件', NULL, NULL, 2, 'Y', '0', NOW()),
('000000', 'SEMI', '半成品', NULL, NULL, 3, 'Y', '0', NOW()),
('000000', 'FINISHED', '成品', NULL, NULL, 4, 'Y', '0', NOW()),
('000000', 'PACKAGING', '包装物', NULL, NULL, 5, 'Y', '0', NOW()),
('000000', 'CONSUMABLE', '辅料', NULL, NULL, 6, 'Y', '0', NOW());
-- 原材料子分类
INSERT INTO `erp_md_item_type` (`tenant_id`, `item_type_code`, `item_type_name`, `parent_type_id`, `ancestors`, `order_num`, `enable_flag`, `del_flag`, `create_time`)
SELECT '000000', 'RAW_STEEL', '钢材', item_type_id, CONCAT(item_type_id), 1, 'Y', '0', NOW() FROM erp_md_item_type WHERE item_type_code = 'RAW' AND tenant_id = '000000';
INSERT INTO `erp_md_item_type` (`tenant_id`, `item_type_code`, `item_type_name`, `parent_type_id`, `ancestors`, `order_num`, `enable_flag`, `del_flag`, `create_time`)
SELECT '000000', 'RAW_ALUMINUM', '铝材', item_type_id, CONCAT(item_type_id), 2, 'Y', '0', NOW() FROM erp_md_item_type WHERE item_type_code = 'RAW' AND tenant_id = '000000';
INSERT INTO `erp_md_item_type` (`tenant_id`, `item_type_code`, `item_type_name`, `parent_type_id`, `ancestors`, `order_num`, `enable_flag`, `del_flag`, `create_time`)
SELECT '000000', 'RAW_PLASTIC', '塑料', item_type_id, CONCAT(item_type_id), 3, 'Y', '0', NOW() FROM erp_md_item_type WHERE item_type_code = 'RAW' AND tenant_id = '000000';
INSERT INTO `erp_md_item_type` (`tenant_id`, `item_type_code`, `item_type_name`, `parent_type_id`, `ancestors`, `order_num`, `enable_flag`, `del_flag`, `create_time`)
SELECT '000000', 'RAW_RUBBER', '橡胶', item_type_id, CONCAT(item_type_id), 4, 'Y', '0', NOW() FROM erp_md_item_type WHERE item_type_code = 'RAW' AND tenant_id = '000000';
-- 零部件子分类
INSERT INTO `erp_md_item_type` (`tenant_id`, `item_type_code`, `item_type_name`, `parent_type_id`, `ancestors`, `order_num`, `enable_flag`, `del_flag`, `create_time`)
SELECT '000000', 'PARTS_ELEC', '电子元器件', item_type_id, CONCAT(item_type_id), 1, 'Y', '0', NOW() FROM erp_md_item_type WHERE item_type_code = 'PARTS' AND tenant_id = '000000';
INSERT INTO `erp_md_item_type` (`tenant_id`, `item_type_code`, `item_type_name`, `parent_type_id`, `ancestors`, `order_num`, `enable_flag`, `del_flag`, `create_time`)
SELECT '000000', 'PARTS_MECH', '机械部件', item_type_id, CONCAT(item_type_id), 2, 'Y', '0', NOW() FROM erp_md_item_type WHERE item_type_code = 'PARTS' AND tenant_id = '000000';
INSERT INTO `erp_md_item_type` (`tenant_id`, `item_type_code`, `item_type_name`, `parent_type_id`, `ancestors`, `order_num`, `enable_flag`, `del_flag`, `create_time`)
SELECT '000000', 'PARTS_HARDWARE', '五金件', item_type_id, CONCAT(item_type_id), 3, 'Y', '0', NOW() FROM erp_md_item_type WHERE item_type_code = 'PARTS' AND tenant_id = '000000';
-- =====================================================
-- 4. 默认仓库数据
-- =====================================================
INSERT INTO `erp_wm_warehouse` (`tenant_id`, `warehouse_code`, `warehouse_name`, `warehouse_type`, `location`, `charge`, `enable_flag`, `del_flag`, `create_time`) VALUES
('000000', 'WH_RAW', '原材料仓', 'RAW', 'A区', '张三', 'Y', '0', NOW()),
('000000', 'WH_SEMI', '半成品仓', 'SEMI', 'B区', '李四', 'Y', '0', NOW()),
('000000', 'WH_FINISHED', '成品仓', 'FINISHED', 'C区', '王五', 'Y', '0', NOW()),
('000000', 'WH_DEFECT', '不良品仓', 'DEFECT', 'D区', '赵六', 'Y', '0', NOW());
-- =====================================================
-- 5. 系统字典类型表 (如需要)
-- =====================================================
-- 如果系统有字典表,可以在此添加字典数据
-- 以下为示例结构
/*
-- 字典类型表
CREATE TABLE IF NOT EXISTS `erp_sys_dict_type` (
`dict_id` bigint NOT NULL AUTO_INCREMENT,
`dict_name` varchar(100) NOT NULL COMMENT '字典名称',
`dict_type` varchar(100) NOT NULL COMMENT '字典类型',
`status` char(1) DEFAULT '0' COMMENT '状态',
`create_time` datetime DEFAULT NULL,
PRIMARY KEY (`dict_id`),
UNIQUE KEY `dict_type` (`dict_type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='字典类型表';
-- 字典数据表
CREATE TABLE IF NOT EXISTS `erp_sys_dict_data` (
`dict_code` bigint NOT NULL AUTO_INCREMENT,
`dict_sort` int DEFAULT 0 COMMENT '排序',
`dict_label` varchar(100) NOT NULL COMMENT '字典标签',
`dict_value` varchar(100) NOT NULL COMMENT '字典值',
`dict_type` varchar(100) NOT NULL COMMENT '字典类型',
`css_class` varchar(100) DEFAULT NULL COMMENT '样式',
`list_class` varchar(100) DEFAULT NULL COMMENT '表格样式',
`is_default` char(1) DEFAULT 'N' COMMENT '默认',
`status` char(1) DEFAULT '0' COMMENT '状态',
`create_time` datetime DEFAULT NULL,
PRIMARY KEY (`dict_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='字典数据表';
-- 字典数据: 单据状态
INSERT INTO `erp_sys_dict_type` VALUES (1, '单据状态', 'doc_status', '0', NOW());
INSERT INTO `erp_sys_dict_data` VALUES (1, 1, '开立', 'DRAFT', 'doc_status', NULL, 'primary', 'Y', '0', NOW());
INSERT INTO `erp_sys_dict_data` VALUES (2, 2, '已提交', 'SUBMITTED', 'doc_status', NULL, 'warning', 'N', '0', NOW());
INSERT INTO `erp_sys_dict_data` VALUES (3, 3, '已审核', 'APPROVED', 'doc_status', NULL, 'success', 'N', '0', NOW());
INSERT INTO `erp_sys_dict_data` VALUES (4, 4, '已驳回', 'REJECTED', 'doc_status', NULL, 'danger', 'N', '0', NOW());
INSERT INTO `erp_sys_dict_data` VALUES (5, 5, '已关闭', 'CLOSED', 'doc_status', NULL, 'info', 'N', '0', NOW());
INSERT INTO `erp_sys_dict_data` VALUES (6, 6, '已取消', 'CANCELLED', 'doc_status', NULL, 'info', 'N', '0', NOW());
-- 字典数据: 业务状态
INSERT INTO `erp_sys_dict_type` VALUES (2, '业务状态', 'business_status', '0', NOW());
INSERT INTO `erp_sys_dict_data` VALUES (10, 1, '正常', 'NORMAL', 'business_status', NULL, 'success', 'Y', '0', NOW());
INSERT INTO `erp_sys_dict_data` VALUES (11, 2, '暂停', 'PAUSE', 'business_status', NULL, 'warning', 'N', '0', NOW());
INSERT INTO `erp_sys_dict_data` VALUES (12, 3, '取消', 'CANCEL', 'business_status', NULL, 'danger', 'N', '0', NOW());
-- 字典数据: 供应方式
INSERT INTO `erp_sys_dict_type` VALUES (3, '供应方式', 'supply_type', '0', NOW());
INSERT INTO `erp_sys_dict_data` VALUES (20, 1, '采购', 'PURCHASE', 'supply_type', NULL, 'primary', 'Y', '0', NOW());
INSERT INTO `erp_sys_dict_data` VALUES (21, 2, '自制', 'SELF_MADE', 'supply_type', NULL, 'success', 'N', '0', NOW());
INSERT INTO `erp_sys_dict_data` VALUES (22, 3, '委外', 'OUTSOURCE', 'supply_type', NULL, 'warning', 'N', '0', NOW());
-- 字典数据: 客户等级
INSERT INTO `erp_sys_dict_type` VALUES (4, '客户等级', 'client_level', '0', NOW());
INSERT INTO `erp_sys_dict_data` VALUES (30, 1, 'A级', 'A', 'client_level', NULL, 'danger', 'N', '0', NOW());
INSERT INTO `erp_sys_dict_data` VALUES (31, 2, 'B级', 'B', 'client_level', NULL, 'warning', 'Y', '0', NOW());
INSERT INTO `erp_sys_dict_data` VALUES (32, 3, 'C级', 'C', 'client_level', NULL, 'primary', 'N', '0', NOW());
INSERT INTO `erp_sys_dict_data` VALUES (33, 4, 'D级', 'D', 'client_level', NULL, 'info', 'N', '0', NOW());
-- 字典数据: 采购业务类型
INSERT INTO `erp_sys_dict_type` VALUES (5, '采购业务类型', 'po_business_type', '0', NOW());
INSERT INTO `erp_sys_dict_data` VALUES (40, 1, '原材料', 'RAW_MATERIAL', 'po_business_type', NULL, 'primary', 'Y', '0', NOW());
INSERT INTO `erp_sys_dict_data` VALUES (41, 2, '零部件', 'PARTS', 'po_business_type', NULL, 'success', 'N', '0', NOW());
INSERT INTO `erp_sys_dict_data` VALUES (42, 3, '装配件', 'ASSEMBLY', 'po_business_type', NULL, 'warning', 'N', '0', NOW());
INSERT INTO `erp_sys_dict_data` VALUES (43, 4, '成品', 'FINISHED', 'po_business_type', NULL, 'danger', 'N', '0', NOW());
INSERT INTO `erp_sys_dict_data` VALUES (44, 5, '五金件', 'HARDWARE', 'po_business_type', NULL, 'info', 'N', '0', NOW());
INSERT INTO `erp_sys_dict_data` VALUES (45, 6, '包装物', 'PACKAGING', 'po_business_type', NULL, 'info', 'N', '0', NOW());
*/
-- =====================================================
-- 6. 示例物料数据 (可选)
-- =====================================================
/*
-- 示例产品物料
INSERT INTO `erp_md_item` (`tenant_id`, `item_code`, `item_name`, `specification`, `unit_of_measure`, `item_type_code`, `item_type_name`, `item_or_product`, `enable_flag`, `del_flag`, `create_time`) VALUES
('000000', 'P001', '产品A', '100*100*50', '套', 'FINISHED', '成品', 'PRODUCT', 'Y', '0', NOW()),
('000000', 'P002', '产品B', '200*150*80', '套', 'FINISHED', '成品', 'PRODUCT', 'Y', '0', NOW());
-- 示例原材料
INSERT INTO `erp_md_item` (`tenant_id`, `item_code`, `item_name`, `specification`, `unit_of_measure`, `item_type_code`, `item_type_name`, `item_or_product`, `enable_flag`, `del_flag`, `create_time`) VALUES
('000000', 'M001', '钢板', '2mm厚', '张', 'RAW_STEEL', '钢材', 'ITEM', 'Y', '0', NOW()),
('000000', 'M002', '铝板', '3mm厚', '张', 'RAW_ALUMINUM', '铝材', 'ITEM', 'Y', '0', NOW()),
('000000', 'M003', '螺丝', 'M6*20', '个', 'PARTS_HARDWARE', '五金件', 'ITEM', 'Y', '0', NOW()),
('000000', 'M004', '螺母', 'M6', '个', 'PARTS_HARDWARE', '五金件', 'ITEM', 'Y', '0', NOW());
*/
-- =====================================================
-- 7. 示例客户数据 (可选)
-- =====================================================
/*
-- 客户数据已合并到 md_client 表,使用基础数据模块的客户管理功能
INSERT INTO `md_client` (`tenant_id`, `client_code`, `client_name`, `client_nick`, `client_level`, `address`, `tel`, `contact1`, `contact1_tel`, `enable_flag`, `del_flag`, `create_time`) VALUES
('000000', 'C001', '深圳科技有限公司', '深圳科技', 'A', '深圳市南山区科技园', '0755-12345678', '张经理', '13800001111', 'Y', '0', NOW()),
('000000', 'C002', '广州制造有限公司', '广州制造', 'B', '广州市天河区工业区', '020-87654321', '李总', '13900002222', 'Y', '0', NOW()),
('000000', 'C003', '东莞贸易有限公司', '东莞贸易', 'B', '东莞市虎门镇商业中心', '0769-55556666', '王总', '13700003333', 'Y', '0', NOW());
*/
-- =====================================================
-- 8. 示例供应商数据 (可选)
-- =====================================================
/*
INSERT INTO `erp_po_supplier` (`tenant_id`, `supplier_code`, `supplier_name`, `supplier_nick`, `supplier_level`, `address`, `tel`, `contact1`, `contact1_tel`, `enable_flag`, `del_flag`, `create_time`) VALUES
('000000', 'S001', '佛山钢材供应商', '佛山钢材', 'A', '佛山市顺德区钢材市场', '0757-11112222', '陈经理', '13600001111', 'Y', '0', NOW()),
('000000', 'S002', '中山五金供应商', '中山五金', 'B', '中山市小榄镇五金城', '0760-33334444', '林经理', '13500002222', 'Y', '0', NOW()),
('000000', 'S003', '惠州塑料供应商', '惠州塑料', 'B', '惠州市博罗县工业区', '0752-55556666', '黄经理', '13400003333', 'Y', '0', NOW());
*/
-- =====================================================
-- 完成
-- =====================================================

View File

@@ -0,0 +1,980 @@
# ERP系统数据库设计 - 数据字典
> 版本: 1.0.0
> 创建日期: 2026-01-25
> 数据库: MySQL 8.0+
> 字符集: utf8mb4
---
## 目录
1. [概述](#1-概述)
2. [命名规范](#2-命名规范)
3. [公共字段说明](#3-公共字段说明)
4. [基础数据模块](#4-基础数据模块)
5. [仓库管理模块](#5-仓库管理模块)
6. [销售管理模块](#6-销售管理模块)
7. [采购管理模块](#7-采购管理模块)
8. [生产计划模块](#8-生产计划模块)
9. [枚举值定义](#9-枚举值定义)
10. [索引设计规范](#10-索引设计规范)
11. [ER图](#11-er图)
---
## 1. 概述
### 1.1 文档目的
本文档定义ERP系统的数据库表结构、字段说明、枚举值和关联关系为后端API开发和系统维护提供数据模型支持。
### 1.2 涵盖模块
| 模块 | 表前缀 | API前缀 | 说明 | 本文档状态 |
|------|--------|---------|------|-----------|
| 系统管理 | erp_sys_ | /system | 租户、用户、部门等 | ✅ 已收录 |
| 基础数据 | erp_md_ | /md | 物料、BOM、单位等 | ✅ 已收录 |
| 仓库管理 | erp_wm_ | /wm | 仓库、库存、出入库等 | ✅ 已收录 |
| 销售管理 | erp_sl_ | /sl | 客户、订单、发货等 | ✅ 已收录 |
| 采购管理 | erp_po_ | /po | 供应商、采购订单等 | ✅ 已收录 |
| 生产计划 | erp_mp_ | /mp | 生产计划、物料清单等 | ✅ 已收录 |
| 生产管理 | erp_prs_ | /prs | 生产订单、领料、完工、入库等 | ⚠️ 见补充文档 |
| 研发管理 | erp_rd_ | /rd | EBOM、样品配方、孪生物料等 | ⚠️ 见补充文档 |
| 委外管理 | erp_pu_ | /pu | 委外订单、发料、入库等 | ⚠️ 见补充文档 |
| 财务管理 | erp_fd_ | /fd | 凭证、应收应付、成本核算等 | ⚠️ 见补充文档 |
> ⚠️ 标记的模块详见 `erp数据库设计-Swagger补充模块.md`
### 1.3 表清单总览
| 序号 | 表名 | 中文名 | 模块 |
|------|------|--------|------|
| 1 | sys_tenant | 租户表 | 系统管理 |
| 2 | erp_md_item_type | 物料分类表 | 基础数据 |
| 3 | erp_md_item | 物料档案表 | 基础数据 |
| 4 | erp_md_unit | 计量单位表 | 基础数据 |
| 5 | erp_md_bom | BOM表头 | 基础数据 |
| 6 | erp_md_bom_line | BOM明细表 | 基础数据 |
| 7 | erp_wm_warehouse | 仓库表 | 仓库管理 |
| 8 | erp_wm_location | 库区表 | 仓库管理 |
| 9 | erp_wm_area | 库位表 | 仓库管理 |
| 10 | erp_wm_stock | 库存表 | 仓库管理 |
| 11 | erp_wm_item_recpt | 入库单表头 | 仓库管理 |
| 12 | erp_wm_item_recpt_line | 入库单明细 | 仓库管理 |
| 13 | erp_wm_issue | 出库单表头 | 仓库管理 |
| 14 | erp_wm_issue_line | 出库单明细 | 仓库管理 |
| 15 | erp_sl_contract | 销售合同表头 | 销售管理 |
| 17 | erp_sl_contract_line | 销售合同明细 | 销售管理 |
| 18 | erp_sl_order | 销售订单表头 | 销售管理 |
| 19 | erp_sl_order_line | 销售订单明细 | 销售管理 |
| 20 | erp_sl_deliver | 发货单表头 | 销售管理 |
| 21 | erp_sl_deliver_line | 发货单明细 | 销售管理 |
| 22 | erp_sl_invoice | 销售发票表头 | 销售管理 |
| 23 | erp_sl_invoice_line | 销售发票明细 | 销售管理 |
| 24 | erp_sl_saleback | 销售退货单表头 | 销售管理 |
| 25 | erp_sl_saleback_line | 销售退货单明细 | 销售管理 |
| 26 | erp_po_supplier | 供应商档案表 | 采购管理 |
| 27 | erp_po_order | 采购订单表头 | 采购管理 |
| 28 | erp_po_order_line | 采购订单明细 | 采购管理 |
| 29 | erp_po_checkin | 采购到货单表头 | 采购管理 |
| 30 | erp_po_checkin_line | 采购到货单明细 | 采购管理 |
| 31 | erp_po_invoice | 采购发票表头 | 采购管理 |
| 32 | erp_po_invoice_line | 采购发票明细 | 采购管理 |
| 33 | erp_po_reject | 采购退货单表头 | 采购管理 |
| 34 | erp_po_reject_line | 采购退货单明细 | 采购管理 |
| 35 | erp_mp_plan | 生产计划单表头 | 生产计划 |
| 36 | erp_mp_plan_line | 生产计划单明细 | 生产计划 |
| 37 | erp_mp_mbom | 物料清单表头 | 生产计划 |
| 38 | erp_mp_mbom_line | 物料清单明细 | 生产计划 |
| 39 | erp_mp_purchase | 采购计划单表 | 生产计划 |
| 40 | erp_mp_parts | 零部件订单表 | 生产计划 |
| | **以下为Swagger API发现的待补充表** | | |
| 41 | erp_prs_order | 生产订单表头 | 生产管理 |
| 42 | erp_prs_order_line | 生产订单明细 | 生产管理 |
| 43 | erp_prs_pick | 生产领料单表头 | 生产管理 |
| 44 | erp_prs_product | 生产完工单表头 | 生产管理 |
| 45 | erp_prs_checkin | 生产入库单表头 | 生产管理 |
| 46 | erp_prs_instruct | 生产指令单表头 | 生产管理 |
| 47 | erp_prs_yield | 生产报工单表头 | 生产管理 |
| 48 | erp_prs_beltline | 生产线 | 生产管理 |
| 49 | erp_prs_team | 班组 | 生产管理 |
| 50 | erp_prs_worker | 工人 | 生产管理 |
| 51 | erp_prs_jobs | 工种 | 生产管理 |
| 52 | erp_prs_operate_section | 标准工序段 | 生产管理 |
| 53 | erp_prs_process_route | 工艺路线 | 生产管理 |
| 54 | erp_prs_equipment | 设备 | 生产管理 |
| 55 | erp_rd_ebom | EBOM表头 | 研发管理 |
| 56 | erp_rd_ebom_line | EBOM明细 | 研发管理 |
| 57 | erp_rd_sample | 样品配方表头 | 研发管理 |
| 58 | erp_rd_sample_line | 样品配方明细 | 研发管理 |
| 59 | erp_rd_twin | 孪生物料表头 | 研发管理 |
| 60 | erp_rd_twin_line | 孪生物料明细 | 研发管理 |
| 61 | erp_rd_tret | 放量表 | 研发管理 |
| 62 | erp_rd_setting | 研发设置 | 研发管理 |
| 63 | erp_pu_supplier | 委外商档案 | 委外管理 |
| 64 | erp_pu_order | 委外订单表头 | 委外管理 |
| 65 | erp_pu_order_line | 委外订单明细 | 委外管理 |
| 66 | erp_pu_product | 委外到货单表头 | 委外管理 |
| 67 | erp_pu_checkin | 委外入库单表头 | 委外管理 |
| 68 | erp_pu_pick | 委外发料单表头 | 委外管理 |
| 69 | erp_pu_unpick | 委外退料单表头 | 委外管理 |
| 70 | erp_pu_fapiao | 委外发票表头 | 委外管理 |
---
## 2. 命名规范
### 2.1 表命名规范
| 规则 | 说明 | 示例 |
|------|------|------|
| 前缀 | erp_模块缩写_业务名 | erp_sl_order (销售订单) |
| 主从表 | 主表不加后缀从表加_line | erp_sl_order, erp_sl_order_line |
| 小写 | 全部小写,下划线分隔 | erp_po_order_line |
### 2.2 字段命名规范
| 规则 | 说明 | 示例 |
|------|------|------|
| 主键 | 业务名_id | order_id, item_id |
| 编码 | 业务名_code | order_code, item_code |
| 名称 | 业务名_name | order_name, item_name |
| 外键 | 关联表业务名_id | client_id, supplier_id |
| 冗余字段 | 关联表业务名_code/name | client_code, client_name |
| 标志 | xxx_flag | del_flag, enable_flag |
| 数量 | quantity, xxx_qty | quantity, delivered_qty |
| 金额 | amount, xxx_amount | amount, total_amount |
### 2.3 数据类型规范
| 用途 | 数据类型 | 说明 |
|------|----------|------|
| 主键 | bigint | 自增长ID |
| 编码 | varchar(32) | 业务编码 |
| 名称 | varchar(100) | 短名称 |
| 描述 | varchar(500) | 长文本 |
| 日期 | date | 纯日期 |
| 时间 | datetime | 日期时间 |
| 数量 | decimal(18,4) | 数量类 |
| 金额 | decimal(18,2) | 金额类 |
| 单价 | decimal(18,4) | 单价类 |
| 比例 | decimal(5,2) | 百分比 |
| 标志 | char(1) | Y/N, 0/1 |
| 状态 | varchar(20) | 状态枚举 |
---
## 3. 公共字段说明
### 3.1 必备公共字段
所有业务表必须包含以下字段:
| 字段名 | 类型 | 说明 |
|--------|------|------|
| tenant_id | varchar(20) | 租户ID (多租户隔离) |
| del_flag | char(1) | 删除标志 (0存在 1删除) |
| create_by | varchar(64) | 创建者 |
| create_time | datetime | 创建时间 |
| update_by | varchar(64) | 更新者 |
| update_time | datetime | 更新时间 |
### 3.2 单据类公共字段
单据类表通常包含以下字段:
| 字段名 | 类型 | 说明 |
|--------|------|------|
| status | varchar(20) | 单据状态 |
| operator_id | bigint | 操作员ID |
| operator_name | varchar(50) | 操作员名称 |
| approver_id | bigint | 审核员ID |
| approver_name | varchar(50) | 审核员名称 |
| approve_date | datetime | 审核日期 |
| remark | varchar(500) | 备注 |
---
## 4. 基础数据模块
### 4.1 物料分类表 (erp_md_item_type)
> API路径: `/md/itemtype`
| 字段名 | 类型 | 长度 | 允许空 | 默认值 | 说明 |
|--------|------|------|--------|--------|------|
| item_type_id | bigint | - | N | AUTO | 分类ID (主键) |
| tenant_id | varchar | 20 | N | - | 租户ID |
| item_type_code | varchar | 32 | N | - | 分类编码 |
| item_type_name | varchar | 50 | N | - | 分类名称 |
| parent_type_id | bigint | - | Y | NULL | 父分类ID |
| ancestors | varchar | 500 | Y | NULL | 祖级列表 |
| order_num | int | - | Y | 0 | 排序号 |
| enable_flag | char | 1 | N | 'Y' | 启用状态 |
| del_flag | char | 1 | N | '0' | 删除标志 |
| create_by | varchar | 64 | Y | NULL | 创建者 |
| create_time | datetime | - | Y | NULL | 创建时间 |
| update_by | varchar | 64 | Y | NULL | 更新者 |
| update_time | datetime | - | Y | NULL | 更新时间 |
**索引设计:**
| 索引名 | 字段 | 类型 |
|--------|------|------|
| uk_item_type_code | item_type_code, tenant_id | UNIQUE |
| idx_item_type_parent | parent_type_id | INDEX |
| idx_item_type_tenant | tenant_id | INDEX |
---
### 4.2 物料档案表 (erp_md_item)
> API路径: `/md/item`
| 字段名 | 类型 | 长度 | 允许空 | 默认值 | 说明 |
|--------|------|------|--------|--------|------|
| item_id | bigint | - | N | AUTO | 物料ID (主键) |
| tenant_id | varchar | 20 | N | - | 租户ID |
| item_code | varchar | 32 | N | - | 物料编码 |
| item_name | varchar | 100 | N | - | 物料名称 |
| specification | varchar | 200 | Y | NULL | 规格型号 |
| unit_of_measure | varchar | 20 | Y | NULL | 主计量单位 |
| item_type_id | bigint | - | Y | NULL | 物料分类ID |
| item_type_code | varchar | 32 | Y | NULL | 物料分类编码 |
| item_type_name | varchar | 50 | Y | NULL | 物料分类名称 |
| item_sub_type_code | varchar | 32 | Y | NULL | 二级分类编码 |
| item_sub_type_name | varchar | 50 | Y | NULL | 二级分类名称 |
| item_or_product | varchar | 20 | Y | 'ITEM' | 物料/产品 |
| safe_stock_flag | char | 1 | Y | 'N' | 启用安全库存 |
| min_stock | decimal | 18,4 | Y | 0 | 最小库存 |
| max_stock | decimal | 18,4 | Y | 0 | 最大库存 |
| default_warehouse_id | bigint | - | Y | NULL | 默认仓库ID |
| default_warehouse_name | varchar | 50 | Y | NULL | 默认仓库名称 |
| weight | decimal | 18,6 | Y | NULL | 重量(kg) |
| volume | decimal | 18,6 | Y | NULL | 体积(m³) |
| enable_flag | char | 1 | N | 'Y' | 启用状态 |
| remark | varchar | 500 | Y | NULL | 备注 |
| del_flag | char | 1 | N | '0' | 删除标志 |
| create_by | varchar | 64 | Y | NULL | 创建者 |
| create_time | datetime | - | Y | NULL | 创建时间 |
| update_by | varchar | 64 | Y | NULL | 更新者 |
| update_time | datetime | - | Y | NULL | 更新时间 |
**索引设计:**
| 索引名 | 字段 | 类型 |
|--------|------|------|
| uk_item_code | item_code, tenant_id | UNIQUE |
| idx_item_type | item_type_id | INDEX |
| idx_item_name | item_name | INDEX |
| idx_item_tenant | tenant_id | INDEX |
---
### 4.3 BOM表头 (erp_md_bom)
> API路径: `/md/bom`
| 字段名 | 类型 | 长度 | 允许空 | 默认值 | 说明 |
|--------|------|------|--------|--------|------|
| bom_id | bigint | - | N | AUTO | BOM ID (主键) |
| tenant_id | varchar | 20 | N | - | 租户ID |
| bom_code | varchar | 32 | N | - | BOM编码 |
| bom_name | varchar | 100 | Y | NULL | BOM名称 |
| item_id | bigint | - | N | - | 产品物料ID |
| item_code | varchar | 32 | N | - | 产品物料编码 |
| item_name | varchar | 100 | N | - | 产品物料名称 |
| unit_name | varchar | 20 | Y | NULL | 计量单位 |
| base_qty | decimal | 18,4 | N | 1 | 基本数量 |
| version | varchar | 20 | Y | NULL | 版本号 |
| version_desc | varchar | 200 | Y | NULL | 版本说明 |
| status | varchar | 20 | N | 'DRAFT' | 状态 |
| enable_flag | char | 1 | N | 'Y' | 启用状态 |
| remark | varchar | 500 | Y | NULL | 备注 |
| del_flag | char | 1 | N | '0' | 删除标志 |
### 4.4 BOM明细表 (erp_md_bom_line)
| 字段名 | 类型 | 长度 | 允许空 | 默认值 | 说明 |
|--------|------|------|--------|--------|------|
| line_id | bigint | - | N | AUTO | 明细ID (主键) |
| bom_id | bigint | - | N | - | BOM ID (外键) |
| line_no | int | - | N | - | 行号 |
| item_id | bigint | - | N | - | 子件物料ID |
| item_code | varchar | 32 | N | - | 子件物料编码 |
| item_name | varchar | 100 | N | - | 子件物料名称 |
| specification | varchar | 200 | Y | NULL | 规格型号 |
| unit_name | varchar | 20 | Y | NULL | 计量单位 |
| base_qty | decimal | 18,6 | N | 1 | 基本用量 |
| loss_rate | decimal | 5,2 | Y | 0 | 损耗率(%) |
| supply_type | varchar | 20 | Y | 'PURCHASE' | 供应方式 |
| remark | varchar | 200 | Y | NULL | 备注 |
| del_flag | char | 1 | N | '0' | 删除标志 |
| tenant_id | varchar | 20 | N | - | 租户ID |
---
## 5. 仓库管理模块
### 5.1 仓库表 (erp_wm_warehouse)
> API路径: `/wm/warehouse`
| 字段名 | 类型 | 长度 | 允许空 | 默认值 | 说明 |
|--------|------|------|--------|--------|------|
| warehouse_id | bigint | - | N | AUTO | 仓库ID (主键) |
| tenant_id | varchar | 20 | N | - | 租户ID |
| warehouse_code | varchar | 32 | N | - | 仓库编码 |
| warehouse_name | varchar | 50 | N | - | 仓库名称 |
| warehouse_type | varchar | 20 | Y | NULL | 仓库类型 |
| location | varchar | 100 | Y | NULL | 位置 |
| area | decimal | 10,2 | Y | NULL | 面积(m²) |
| charge | varchar | 50 | Y | NULL | 负责人 |
| charge_tel | varchar | 20 | Y | NULL | 负责人电话 |
| enable_flag | char | 1 | N | 'Y' | 启用状态 |
| remark | varchar | 500 | Y | NULL | 备注 |
| del_flag | char | 1 | N | '0' | 删除标志 |
### 5.2 库存表 (erp_wm_stock)
> API路径: `/wm/stock`
| 字段名 | 类型 | 长度 | 允许空 | 默认值 | 说明 |
|--------|------|------|--------|--------|------|
| stock_id | bigint | - | N | AUTO | 库存ID (主键) |
| tenant_id | varchar | 20 | N | - | 租户ID |
| item_id | bigint | - | N | - | 物料ID |
| item_code | varchar | 32 | Y | NULL | 物料编码 |
| item_name | varchar | 100 | Y | NULL | 物料名称 |
| specification | varchar | 200 | Y | NULL | 规格型号 |
| unit_name | varchar | 20 | Y | NULL | 计量单位 |
| warehouse_id | bigint | - | N | - | 仓库ID |
| warehouse_code | varchar | 32 | Y | NULL | 仓库编码 |
| warehouse_name | varchar | 50 | Y | NULL | 仓库名称 |
| location_id | bigint | - | Y | NULL | 库区ID |
| area_id | bigint | - | Y | NULL | 库位ID |
| batch_no | varchar | 50 | Y | NULL | 批次号 |
| quantity_on_hand | decimal | 18,4 | N | 0 | 在库数量 |
| quantity_locked | decimal | 18,4 | N | 0 | 锁定数量 |
| quantity_available | decimal | 18,4 | N | 0 | 可用数量 |
| unit_cost | decimal | 18,4 | Y | 0 | 单位成本 |
| expire_date | date | - | Y | NULL | 有效期 |
| update_time | datetime | - | Y | NULL | 更新时间 |
**业务规则:**
- `quantity_available = quantity_on_hand - quantity_locked`
- 库存更新时自动计算可用数量
---
## 6. 销售管理模块
> 说明: 客户档案表使用 md_client基础数据模块已合并原 erp_sl_client 的所有字段
### 6.1 销售订单表头 (erp_sl_order)
> API路径: `/sl/order`
| 字段名 | 类型 | 长度 | 允许空 | 默认值 | 说明 |
|--------|------|------|--------|--------|------|
| order_id | bigint | - | N | AUTO | 订单ID (主键) |
| tenant_id | varchar | 20 | N | - | 租户ID |
| order_code | varchar | 32 | N | - | 订单编码 |
| order_name | varchar | 100 | Y | NULL | 订单名称 |
| order_date | date | - | N | - | 订单日期 |
| status | varchar | 20 | N | 'DRAFT' | 单据状态 |
| business_status | varchar | 20 | Y | 'NORMAL' | 业务状态 |
| order_type | varchar | 20 | Y | NULL | 订单类型 |
| contract_id | bigint | - | Y | NULL | 合同ID |
| contract_code | varchar | 32 | Y | NULL | 合同编码 |
| client_id | bigint | - | N | - | 客户ID |
| client_code | varchar | 32 | Y | NULL | 客户编码 |
| client_name | varchar | 100 | Y | NULL | 客户名称 |
| sales_user_id | bigint | - | Y | NULL | 销售员ID |
| sales_user_name | varchar | 50 | Y | NULL | 销售员名称 |
| dept_id | bigint | - | Y | NULL | 部门ID |
| dept_name | varchar | 50 | Y | NULL | 部门名称 |
| delivery_date | date | - | Y | NULL | 交货日期 |
| delivery_address | varchar | 200 | Y | NULL | 收货地址 |
| total_quantity | decimal | 18,4 | Y | 0 | 总数量 |
| total_amount | decimal | 18,2 | Y | 0 | 总金额 |
| delivered_quantity | decimal | 18,4 | Y | 0 | 已发货数量 |
| delivered_amount | decimal | 18,2 | Y | 0 | 已发货金额 |
| remark | varchar | 500 | Y | NULL | 备注 |
| operator_id | bigint | - | Y | NULL | 操作员ID |
| operator_name | varchar | 50 | Y | NULL | 操作员名称 |
| approver_id | bigint | - | Y | NULL | 审核员ID |
| approver_name | varchar | 50 | Y | NULL | 审核员名称 |
| approve_date | datetime | - | Y | NULL | 审核日期 |
| del_flag | char | 1 | N | '0' | 删除标志 |
### 6.2 销售订单明细 (erp_sl_order_line)
| 字段名 | 类型 | 长度 | 允许空 | 默认值 | 说明 |
|--------|------|------|--------|--------|------|
| line_id | bigint | - | N | AUTO | 明细ID (主键) |
| order_id | bigint | - | N | - | 订单ID (外键) |
| order_code | varchar | 32 | N | - | 订单编码 |
| line_no | int | - | N | - | 行号 |
| track_code | varchar | 32 | Y | NULL | 跟单编号 |
| contract_line_id | bigint | - | Y | NULL | 合同明细ID |
| item_id | bigint | - | N | - | 物料ID |
| item_code | varchar | 32 | N | - | 物料编码 |
| item_name | varchar | 100 | N | - | 物料名称 |
| specification | varchar | 200 | Y | NULL | 规格型号 |
| unit_id | bigint | - | Y | NULL | 计量单位ID |
| unit_name | varchar | 20 | Y | NULL | 计量单位 |
| quantity | decimal | 18,4 | N | 0 | 订单数量 |
| unit_price | decimal | 18,4 | Y | 0 | 单价 |
| amount | decimal | 18,2 | Y | 0 | 金额 |
| delivered_qty | decimal | 18,4 | Y | 0 | 已发货数量 |
| quality_req | varchar | 200 | Y | NULL | 质量要求 |
| remark | varchar | 200 | Y | NULL | 备注 |
| del_flag | char | 1 | N | '0' | 删除标志 |
| tenant_id | varchar | 20 | N | - | 租户ID |
### 6.4 发货单表头 (erp_sl_deliver)
> API路径: `/sl/deliver`
| 字段名 | 类型 | 长度 | 允许空 | 默认值 | 说明 |
|--------|------|------|--------|--------|------|
| deliver_id | bigint | - | N | AUTO | 发货单ID (主键) |
| tenant_id | varchar | 20 | N | - | 租户ID |
| deliver_code | varchar | 32 | N | - | 发货单编码 |
| deliver_name | varchar | 100 | Y | NULL | 发货单名称 |
| deliver_date | date | - | N | - | 发货日期 |
| status | varchar | 20 | N | 'DRAFT' | 状态 |
| order_id | bigint | - | Y | NULL | 销售订单ID |
| order_code | varchar | 32 | Y | NULL | 销售订单编码 |
| client_id | bigint | - | N | - | 客户ID |
| client_code | varchar | 32 | Y | NULL | 客户编码 |
| client_name | varchar | 100 | Y | NULL | 客户名称 |
| warehouse_id | bigint | - | Y | NULL | 发货仓库ID |
| warehouse_name | varchar | 50 | Y | NULL | 仓库名称 |
| delivery_address | varchar | 200 | Y | NULL | 收货地址 |
| total_quantity | decimal | 18,4 | Y | 0 | 总数量 |
| total_amount | decimal | 18,2 | Y | 0 | 总金额 |
| remark | varchar | 500 | Y | NULL | 备注 |
---
## 7. 采购管理模块
### 7.1 供应商档案表 (erp_po_supplier)
> API路径: `/po/supplier`
| 字段名 | 类型 | 长度 | 允许空 | 默认值 | 说明 |
|--------|------|------|--------|--------|------|
| supplier_id | bigint | - | N | AUTO | 供应商ID (主键) |
| tenant_id | varchar | 20 | N | - | 租户ID |
| supplier_code | varchar | 32 | N | - | 供应商编码 |
| supplier_name | varchar | 100 | N | - | 供应商名称 |
| supplier_alias | varchar | 100 | Y | NULL | 供应商别名 |
| supplier_nick | varchar | 50 | Y | NULL | 供应商简称 |
| supplier_type | varchar | 20 | Y | NULL | 供应商分类 |
| supplier_level | varchar | 10 | Y | 'B' | 供应商等级(A/B/C/D) |
| province | varchar | 50 | Y | NULL | 省份 |
| city | varchar | 50 | Y | NULL | 城市 |
| address | varchar | 200 | Y | NULL | 公司地址 |
| zip_code | varchar | 10 | Y | NULL | 邮编 |
| tel | varchar | 20 | Y | NULL | 电话 |
| fax | varchar | 20 | Y | NULL | 传真 |
| email | varchar | 100 | Y | NULL | 邮箱 |
| website | varchar | 200 | Y | NULL | 网址 |
| contact1 | varchar | 50 | Y | NULL | 业务联系人 |
| contact1_tel | varchar | 20 | Y | NULL | 业务联系人电话 |
| contact2 | varchar | 50 | Y | NULL | 财务联系人 |
| contact2_tel | varchar | 20 | Y | NULL | 财务联系人电话 |
| bank_name | varchar | 100 | Y | NULL | 开户银行 |
| bank_account | varchar | 30 | Y | NULL | 银行账号 |
| bank_address | varchar | 200 | Y | NULL | 开票地址电话 |
| tax_no | varchar | 30 | Y | NULL | 税号 |
| supply_items | varchar | 500 | Y | NULL | 供应料品 |
| enable_flag | char | 1 | N | 'Y' | 启用状态 |
| remark | varchar | 500 | Y | NULL | 备注 |
| del_flag | char | 1 | N | '0' | 删除标志 |
### 7.2 采购订单表头 (erp_po_order)
> API路径: `/po/order`
| 字段名 | 类型 | 长度 | 允许空 | 默认值 | 说明 |
|--------|------|------|--------|--------|------|
| order_id | bigint | - | N | AUTO | 订单ID (主键) |
| tenant_id | varchar | 20 | N | - | 租户ID |
| order_code | varchar | 32 | N | - | 订单编码 |
| order_date | date | - | N | - | 订单日期 |
| status | varchar | 20 | N | 'DRAFT' | 单据状态 |
| business_status | varchar | 20 | Y | 'NORMAL' | 业务状态 |
| business_type | varchar | 20 | Y | NULL | 业务类型 |
| order_type | varchar | 20 | Y | NULL | 单据类型 |
| material_need | varchar | 20 | Y | NULL | 用料需求 |
| supplier_id | bigint | - | Y | NULL | 供应商ID |
| supplier_code | varchar | 32 | Y | NULL | 供应商编码 |
| supplier_name | varchar | 100 | Y | NULL | 供应商名称 |
| dept_id | bigint | - | Y | NULL | 采购部门ID |
| dept_name | varchar | 50 | Y | NULL | 采购部门名称 |
| user_id | bigint | - | Y | NULL | 采购人员ID |
| user_name | varchar | 50 | Y | NULL | 采购人员名称 |
| delivery_date | date | - | Y | NULL | 到货日期 |
| contract_no | varchar | 50 | Y | NULL | 合同号 |
| contract_file | varchar | 500 | Y | NULL | 合同附件 |
| total_quantity | decimal | 18,4 | Y | 0 | 总数量 |
| total_amount | decimal | 18,2 | Y | 0 | 总金额 |
| arrived_quantity | decimal | 18,4 | Y | 0 | 已到货数量 |
| remark | varchar | 500 | Y | NULL | 备注 |
### 7.3 采购订单明细 (erp_po_order_line)
| 字段名 | 类型 | 长度 | 允许空 | 默认值 | 说明 |
|--------|------|------|--------|--------|------|
| line_id | bigint | - | N | AUTO | 明细ID (主键) |
| order_id | bigint | - | N | - | 订单ID (外键) |
| order_code | varchar | 32 | N | - | 订单编码 |
| line_no | int | - | N | - | 行号 |
| track_code | varchar | 32 | Y | NULL | 跟单编号 |
| plan_code | varchar | 32 | Y | NULL | 计划单号 |
| plan_line_id | bigint | - | Y | NULL | 计划明细ID |
| item_id | bigint | - | N | - | 物料ID |
| item_code | varchar | 32 | N | - | 物料编码 |
| item_name | varchar | 100 | N | - | 物料名称 |
| specification | varchar | 200 | Y | NULL | 型号规格 |
| unit_id | bigint | - | Y | NULL | 计量单位ID |
| unit_name | varchar | 20 | Y | NULL | 计量单位 |
| need_date | date | - | Y | NULL | 需求日期 |
| quantity | decimal | 18,4 | N | 0 | 采购数量 |
| unit_price | decimal | 18,4 | Y | 0 | 采购单价 |
| amount | decimal | 18,2 | Y | 0 | 金额 |
| arrived_quantity | decimal | 18,4 | Y | 0 | 已到货数量 |
| remark | varchar | 200 | Y | NULL | 采购说明 |
| del_flag | char | 1 | N | '0' | 删除标志 |
| tenant_id | varchar | 20 | N | - | 租户ID |
---
## 8. 生产计划模块
### 8.1 生产计划单表头 (erp_mp_plan)
> API路径: `/mp/plan/order`
| 字段名 | 类型 | 长度 | 允许空 | 默认值 | 说明 |
|--------|------|------|--------|--------|------|
| plan_id | bigint | - | N | AUTO | 计划ID (主键) |
| tenant_id | varchar | 20 | N | - | 租户ID |
| plan_code | varchar | 32 | N | - | 计划单编码 |
| plan_date | date | - | N | - | 计划日期 |
| status | varchar | 20 | N | 'DRAFT' | 单据状态 |
| business_status | varchar | 20 | Y | 'NORMAL' | 业务状态 |
| business_type | varchar | 20 | Y | NULL | 业务类型 |
| work_type | int | - | N | 0 | 工作类型 |
| sales_order_id | bigint | - | Y | NULL | 销售订单ID |
| sales_order_code | varchar | 32 | Y | NULL | 销售订单编码 |
| sales_user_id | bigint | - | Y | NULL | 销售员ID |
| sales_user_name | varchar | 50 | Y | NULL | 销售员名称 |
| delivery_date | date | - | Y | NULL | 订单交期 |
| bom_id | bigint | - | Y | NULL | BOM ID |
| bom_version | varchar | 20 | Y | NULL | BOM版本号 |
| bom_desc | varchar | 200 | Y | NULL | BOM版本说明 |
| total_quantity | decimal | 18,4 | Y | 0 | 生产总量 |
| remark | varchar | 500 | Y | NULL | 备注 |
### 8.2 物料清单表头 (erp_mp_mbom)
> API路径: `/mp/plan/mbom`
| 字段名 | 类型 | 长度 | 允许空 | 默认值 | 说明 |
|--------|------|------|--------|--------|------|
| mbom_id | bigint | - | N | AUTO | 物料清单ID (主键) |
| tenant_id | varchar | 20 | N | - | 租户ID |
| mbom_code | varchar | 32 | N | - | 物料清单编码 |
| mbom_date | date | - | N | - | 单据日期 |
| status | varchar | 20 | N | 'DRAFT' | 单据状态 |
| business_type | varchar | 20 | Y | NULL | 业务类型 |
| issue_status | varchar | 20 | Y | NULL | 下发状态 |
| plan_id | bigint | - | N | - | 生产计划ID |
| plan_code | varchar | 32 | N | - | 生产计划编码 |
| sales_order_id | bigint | - | Y | NULL | 销售订单ID |
| sales_order_code | varchar | 32 | Y | NULL | 销售订单编码 |
| delivery_date | date | - | Y | NULL | 订单交期 |
| item_id | bigint | - | N | - | 产品物料ID |
| item_code | varchar | 32 | N | - | 产品物料编码 |
| item_name | varchar | 100 | N | - | 产品物料名称 |
| unit_name | varchar | 20 | Y | NULL | 计量单位 |
| supply_type | varchar | 20 | Y | NULL | 供应方式 |
| quantity | decimal | 18,4 | N | 0 | 生产数量 |
| workshop_id | bigint | - | Y | NULL | 下发车间ID |
| workshop_name | varchar | 50 | Y | NULL | 下发车间名称 |
| remark | varchar | 500 | Y | NULL | 备注 |
### 8.3 采购计划单表 (erp_mp_purchase)
> API路径: `/mp/plan/purchase`
| 字段名 | 类型 | 长度 | 允许空 | 默认值 | 说明 |
|--------|------|------|--------|--------|------|
| purchase_id | bigint | - | N | AUTO | 采购计划ID (主键) |
| tenant_id | varchar | 20 | N | - | 租户ID |
| purchase_code | varchar | 32 | N | - | 采购计划编码 |
| purchase_date | date | - | N | - | 计划日期 |
| status | varchar | 20 | N | 'DRAFT' | 单据状态 |
| need_type | int | - | N | 0 | 需求方式 |
| plan_id | bigint | - | Y | NULL | 生产计划ID |
| plan_code | varchar | 32 | Y | NULL | 生产计划编码 |
| sales_order_id | bigint | - | Y | NULL | 销售订单ID |
| sales_order_code | varchar | 32 | Y | NULL | 销售订单编码 |
| delivery_date | date | - | Y | NULL | 订单交期 |
| item_id | bigint | - | N | - | 物料ID |
| item_code | varchar | 32 | N | - | 物料编码 |
| item_name | varchar | 100 | N | - | 物料名称 |
| specification | varchar | 200 | Y | NULL | 型号规格 |
| unit_name | varchar | 20 | Y | NULL | 计量单位 |
| purchase_qty | decimal | 18,4 | N | 0 | 采购数量 |
| ordered_qty | decimal | 18,4 | Y | 0 | 已订数量 |
| remark | varchar | 500 | Y | NULL | 备注 |
---
## 9. 枚举值定义
### 9.1 通用单据状态 (status)
| 枚举值 | 中文名 | 说明 |
|--------|--------|------|
| DRAFT | 开立/草稿 | 可编辑状态 |
| SUBMITTED | 已提交 | 等待审核 |
| APPROVED | 已审核 | 审核通过,不可编辑 |
| REJECTED | 已驳回 | 审核驳回 |
| CLOSED | 已关闭 | 业务完结 |
| CANCELLED | 已取消 | 取消作废 |
### 9.2 业务状态 (business_status)
| 枚举值 | 中文名 | 说明 |
|--------|--------|------|
| NORMAL | 正常 | 正常执行 |
| PAUSE | 暂停 | 暂停执行 |
| CANCEL | 取消 | 已取消 |
### 9.3 启用状态 (enable_flag)
| 枚举值 | 中文名 | 说明 |
|--------|--------|------|
| Y | 启用 | 正常使用 |
| N | 停用 | 禁止使用 |
### 9.4 删除标志 (del_flag)
| 枚举值 | 中文名 | 说明 |
|--------|--------|------|
| 0 | 存在 | 正常数据 |
| 1 | 删除 | 逻辑删除 |
### 9.5 物料类型 (item_or_product)
| 枚举值 | 中文名 | 说明 |
|--------|--------|------|
| ITEM | 物料 | 原材料/零部件 |
| PRODUCT | 产品 | 成品 |
### 9.6 供应方式 (supply_type)
| 枚举值 | 中文名 | 说明 |
|--------|--------|------|
| PURCHASE | 采购 | 外部采购 |
| SELF_MADE | 自制 | 自己生产 |
| OUTSOURCE | 委外 | 委外加工 |
### 9.7 采购业务类型 (business_type)
| 枚举值 | 中文名 | 说明 |
|--------|--------|------|
| RAW_MATERIAL | 原材料 | 原材料采购 |
| PARTS | 零部件 | 零部件采购 |
| ASSEMBLY | 装配件 | 装配件采购 |
| FINISHED | 成品 | 成品采购 |
| HARDWARE | 五金件 | 五金件采购 |
| PACKAGING | 包装物 | 包装物采购 |
### 9.8 用料需求 (material_need)
| 枚举值 | 中文名 | 说明 |
|--------|--------|------|
| ORDER_USE | 订单用料 | 按订单需求采购 |
| STOCK_USE | 备库用料 | 备库采购 |
### 9.9 工作类型 (work_type)
| 枚举值 | 中文名 | 说明 |
|--------|--------|------|
| 0 | 生产计划单 | 主生产计划 |
| 1 | 零部件计划单 | 零部件生产计划 |
| 2 | 零部件订单 | 零部件加工订单 |
### 9.10 需求方式 (need_type)
| 枚举值 | 中文名 | 说明 |
|--------|--------|------|
| 0 | 订单用料 | 按订单需求采购 |
| 1 | 库存备料 | 备库采购 |
### 9.11 下发状态 (issue_status)
| 枚举值 | 中文名 | 说明 |
|--------|--------|------|
| NOT_ISSUED | 未下发 | 未下发到车间 |
| ISSUED | 已下发 | 已下发到车间 |
| COMPLETED | 已完成 | 生产完成 |
### 9.12 财务状态 (finance_status)
| 枚举值 | 中文名 | 说明 |
|--------|--------|------|
| RECORDED | 录入 | 已录入 |
| ENTERED | 入账 | 已入账 |
### 9.13 客户/供应商等级 (client_level / supplier_level)
| 枚举值 | 中文名 | 说明 |
|--------|--------|------|
| A | A级 | 核心客户/供应商 |
| B | B级 | 重要客户/供应商 |
| C | C级 | 一般客户/供应商 |
| D | D级 | 潜在客户/供应商 |
---
## 10. 索引设计规范
### 10.1 索引命名规范
| 索引类型 | 命名格式 | 示例 |
|----------|----------|------|
| 主键 | pk_表名 | pk_sl_order |
| 唯一索引 | uk_表名_字段 | uk_sl_order_code |
| 普通索引 | idx_表名_字段 | idx_sl_order_date |
| 组合索引 | idx_表名_字段1_字段2 | idx_sl_order_client_date |
### 10.2 必建索引
| 场景 | 索引字段 | 说明 |
|------|----------|------|
| 主键 | xxx_id | 主键自动创建 |
| 租户 | tenant_id | 多租户隔离 |
| 编码 | xxx_code + tenant_id | 编码唯一 |
| 外键 | 关联字段ID | 关联查询 |
| 日期 | xxx_date | 范围查询 |
| 状态 | status | 条件筛选 |
### 10.3 索引设计原则
1. **主键索引**: 使用自增bigint避免UUID
2. **唯一索引**: 编码字段 + tenant_id 组合唯一
3. **外键索引**: 所有外键字段必须建立索引
4. **组合索引**: 遵循最左前缀原则
5. **避免冗余**: 不要在已有索引字段上重复建索引
---
## 11. ER图
### 11.1 销售模块ER图
```
┌──────────────────────┐ ┌──────────────────────┐ ┌──────────────────────┐
│ md_client │ │ erp_sl_contract │ │ erp_sl_order │
│ (客户档案) │<──│ (销售合同) │<──│ (销售订单) │
└──────────────────────┘ └──────────┬───────────┘ └──────────┬───────────┘
│ 1:N │ 1:N
▼ ▼
┌──────────────────────┐ ┌──────────────────────┐
│erp_sl_contract_line │ │ erp_sl_order_line │
│ (合同明细) │ │ (订单明细) │
└──────────────────────┘ └──────────────────────┘
┌──────────────────────────────────────────────────┤
│ │ │
▼ ▼ ▼
┌──────────────────────┐ ┌──────────────────────┐ ┌──────────────────────┐
│ erp_sl_deliver │ │ erp_sl_invoice │ │ erp_sl_saleback │
│ (发货单) │ │ (销售发票) │ │ (退货单) │
└──────────┬───────────┘ └──────────┬───────────┘ └──────────┬───────────┘
│ 1:N │ 1:N │ 1:N
▼ ▼ ▼
┌──────────────────────┐ ┌──────────────────────┐ ┌──────────────────────┐
│ erp_sl_deliver_line │ │erp_sl_invoice_line │ │erp_sl_saleback_line │
│ (发货明细) │ │ (发票明细) │ │ (退货明细) │
└──────────────────────┘ └──────────────────────┘ └──────────────────────┘
```
### 11.2 采购模块ER图
```
┌──────────────────────┐ 1:N ┌──────────────────────┐
│ erp_po_supplier │◄──────────────►│ erp_po_order │
│ (供应商) │ │ (采购订单) │
└──────────────────────┘ └──────────┬───────────┘
│ 1:N
┌──────────────────────┐
│ erp_po_order_line │
│ (采购明细) │
└──────────┬───────────┘
┌───────────────────────────────────────┼───────────────────────────────────────┐
│ │ │
▼ 1:N ▼ 1:N ▼ 1:N
┌──────────────────────┐ ┌──────────────────────┐ ┌──────────────────────┐
│ erp_po_checkin │ │ erp_po_invoice │ │ erp_po_reject │
│ (采购到货) │ │ (采购发票) │ │ (采购退货) │
└──────────┬───────────┘ └──────────┬───────────┘ └──────────┬───────────┘
│ 1:N │ 1:N │ 1:N
▼ ▼ ▼
┌──────────────────────┐ ┌──────────────────────┐ ┌──────────────────────┐
│erp_po_checkin_line │ │erp_po_invoice_line │ │ erp_po_reject_line │
│ (到货明细) │ │ (发票明细) │ │ (退货明细) │
└──────────────────────┘ └──────────────────────┘ └──────────────────────┘
```
### 11.3 生产计划模块ER图
```
┌──────────────────────┐ 1:N ┌──────────────────────┐
│ erp_sl_order │◄──────────────►│ erp_mp_plan │
│ (销售订单) │ │ (生产计划单) │
└──────────────────────┘ └──────────┬───────────┘
│ 1:N
┌──────────────────────┐
│ erp_mp_plan_line │
│ (生产计划明细) │
└──────────┬───────────┘
┌───────────────────────────────────────┼───────────────────────────────────────┐
│ │ │
▼ 1:N ▼ 1:N ▼ 1:N
┌──────────────────────┐ ┌──────────────────────┐ ┌──────────────────────┐
│ erp_mp_mbom │ │ erp_mp_purchase │ │ erp_mp_parts │
│ (物料清单) │ │ (采购计划单) │ │ (零部件订单) │
└──────────┬───────────┘ └──────────────────────┘ └──────────────────────┘
│ 1:N
┌──────────────────────┐
│ erp_mp_mbom_line │
│ (物料清单明细) │
└──────────────────────┘
```
### 11.4 基础数据关联
```
┌──────────────────────┐
│ erp_md_item_type │
│ (物料分类) │
└──────────┬───────────┘
│ 1:N
┌──────────────────────┐ ┌──────────────────────┐ ┌──────────────────────┐
│ erp_wm_warehouse │ │ erp_md_item │ │ erp_md_bom │
│ (仓库) │ │ (物料档案) │ │ (BOM档案) │
└──────────┬───────────┘ └──────────┬───────────┘ └──────────┬───────────┘
│ │ │
▼ │ ▼
┌──────────────────────┐ │ ┌──────────────────────┐
│ erp_wm_stock │◄────────────┘ │ erp_md_bom_line │
│ (库存) │ │ (BOM明细) │
└──────────────────────┘ └──────────────────────┘
```
---
## 附录A: API模块路径对照
| 模块 | API前缀 | 说明 |
|------|---------|------|
| 系统管理 | /system | 用户、角色、部门等 |
| 基础数据 | /md | 物料、BOM、单位等 |
| 仓库管理 | /wm | 仓库、库存、出入库等 |
| 销售管理 | /sl | 客户、订单、发货等 |
| 采购管理 | /po | 供应商、采购订单等 |
| 生产计划 | /mp | 生产计划、物料清单等 |
| 生产执行 | /pm | 工单、生产任务等 |
| 研发管理 | /rd | 研发BOM、样品等 |
| 委外管理 | /pu | 委外订单、委外加工等 |
| 财务管理 | /fd | 应收应付、凭证等 |
---
## 附录B: 数据权限说明
### B.1 租户隔离
所有业务表都包含 `tenant_id` 字段,用于多租户数据隔离。
**隔离规则:**
- 查询时自动追加租户条件
- 新增时自动填充租户ID
- 租户之间数据完全隔离
### B.2 数据权限范围
| 权限类型 | 说明 | 实现方式 |
|----------|------|----------|
| 全部数据 | 可查看所有数据 | 不追加条件 |
| 部门数据 | 只能查看本部门数据 | dept_id = 当前部门 |
| 部门及以下 | 可查看本部门及下级部门数据 | dept_id IN (部门树) |
| 仅本人数据 | 只能查看自己创建的数据 | create_by = 当前用户 |
---
## 附录C: 未覆盖模块说明
> 以下模块已通过Swagger API发现但尚未纳入本数据字典详见 `erp数据库设计-Swagger补充模块.md`
### C.1 未覆盖模块清单
| 模块 | API前缀 | Java包前缀 | 估计表数量 | 说明 |
|------|---------|-----------|-----------|------|
| 生产管理(车间) | /prs | Prs* | ~20 | 生产订单、领料、完工、入库、报工、指令单等 |
| 研发管理 | /rd | Rd* | ~10 | 产品BOM(EBOM)、样品配方、孪生物料、放量、设置 |
| 委外管理 | /pu | Pu* | ~14 | 委外商、委外订单、到货、入库、发料、退料、发票 |
| 财务管理 | /fd | Fd* | ~30+ | 期间、账套、科目、凭证、应收应付、收付款、成本核算等 |
| 车间设置 | /prs (基础) | Prs* | ~8 | 生产线、班组、工人、工种、工序段、工艺路线、设备 |
### C.2 Swagger API揭示的命名差异
目标ERP系统的实际API字段命名与本文档中基于行业惯例设计的字段命名存在差异
| 概念 | 本文档命名 | Swagger实际命名 | 差异说明 |
|------|-----------|---------------|---------|
| 主键 | xxx_id (如 order_id) | uniqueId | ERP统一使用uniqueId |
| 物料编码 | item_code | invCode | inv = Inventory |
| 物料名称 | item_name | invName | inv = Inventory |
| 物料分类ID | item_type_id | invSortId | sort = 分类 |
| 跟单编号 | track_code | ppNumber | 全局唯一 |
| 操作员 | operator_name | userOper | |
| 审核员 | approver_name | userCheck | |
| 审核日期 | approve_date | checkDate | |
| 业务状态 | business_status | workStatus | |
> **说明**: 本文档中的字段命名遵循行业通用规范便于理解和对接。实际集成时需根据API字段名进行映射转换。具体映射关系详见 `erp数据库设计-Swagger补充模块.md` 第1节。
### C.3 相关文档
| 文档 | 说明 |
|------|------|
| `erp数据库设计-Swagger补充模块.md` | Swagger API分析的完整报告含所有缺失模块的字段定义 |
| `目标erp系统接口文档Swagger-API.md` | 已整理的API接口文档含9个模块 |
| `ERP系统接口API文档.md` | API接口文档的引用版本 |
---
## 修订历史
| 版本 | 日期 | 修订内容 | 修订人 |
|------|------|----------|--------|
| 1.0.0 | 2026-01-25 | 初始版本 | System |
| 1.1.0 | 2026-02-06 | 增加附录C基于Swagger API分析的未覆盖模块说明和命名差异对照 | System |

7023
prd/db/mom-db-260206.sql Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,346 @@
-- ============================================================
-- MOM系统同步ERP字段 ALTER TABLE 脚本
-- 将ERP系统的以下表的字段同步到MOM系统对应表:
-- - erp_md_item -> md_item
-- - erp_md_item_type -> md_item_type
-- - erp_md_unit -> md_unit_measure
-- - erp_md_bom, erp_md_bom_line -> md_product_bom
-- 生成日期: 2026-01-26
-- 兼容 MySQL 5.7+
-- ============================================================
SET NAMES utf8mb4;
-- ============================================================
-- 辅助存储过程: 安全添加字段 (字段不存在时才添加)
-- ============================================================
DROP PROCEDURE IF EXISTS `proc_add_column_if_not_exists`;
DELIMITER //
CREATE PROCEDURE `proc_add_column_if_not_exists`(
IN p_table_name VARCHAR(64),
IN p_column_name VARCHAR(64),
IN p_column_definition VARCHAR(500)
)
BEGIN
DECLARE v_count INT DEFAULT 0;
SELECT COUNT(*) INTO v_count
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = p_table_name
AND COLUMN_NAME = p_column_name;
IF v_count = 0 THEN
SET @sql = CONCAT('ALTER TABLE `', p_table_name, '` ADD COLUMN `', p_column_name, '` ', p_column_definition);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SELECT CONCAT('Added column: ', p_table_name, '.', p_column_name) AS result;
ELSE
SELECT CONCAT('Column already exists: ', p_table_name, '.', p_column_name) AS result;
END IF;
END //
-- 辅助存储过程: 安全创建索引 (索引不存在时才创建)
CREATE PROCEDURE `proc_add_index_if_not_exists`(
IN p_table_name VARCHAR(64),
IN p_index_name VARCHAR(64),
IN p_column_name VARCHAR(64)
)
BEGIN
DECLARE v_count INT DEFAULT 0;
SELECT COUNT(*) INTO v_count
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = p_table_name
AND INDEX_NAME = p_index_name;
IF v_count = 0 THEN
SET @sql = CONCAT('CREATE INDEX `', p_index_name, '` ON `', p_table_name, '` (`', p_column_name, '`)');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SELECT CONCAT('Created index: ', p_index_name) AS result;
ELSE
SELECT CONCAT('Index already exists: ', p_index_name) AS result;
END IF;
END //
DELIMITER ;
-- ============================================================
-- 1. md_item 表新增字段 (物料产品表)
-- ============================================================
-- 新增租户ID字段
CALL proc_add_column_if_not_exists('md_item', 'tenant_id', 'varchar(20) DEFAULT NULL COMMENT ''租户ID''');
-- 新增二级分类编码
CALL proc_add_column_if_not_exists('md_item', 'item_sub_type_code', 'varchar(32) DEFAULT NULL COMMENT ''二级分类编码''');
-- 新增二级分类名称
CALL proc_add_column_if_not_exists('md_item', 'item_sub_type_name', 'varchar(50) DEFAULT NULL COMMENT ''二级分类名称''');
-- 新增默认仓库ID
CALL proc_add_column_if_not_exists('md_item', 'default_warehouse_id', 'bigint(20) DEFAULT NULL COMMENT ''默认仓库ID''');
-- 新增默认仓库名称
CALL proc_add_column_if_not_exists('md_item', 'default_warehouse_name', 'varchar(50) DEFAULT NULL COMMENT ''默认仓库名称''');
-- 新增重量
CALL proc_add_column_if_not_exists('md_item', 'weight', 'decimal(18,6) DEFAULT NULL COMMENT ''重量(kg)''');
-- 新增体积
CALL proc_add_column_if_not_exists('md_item', 'volume', 'decimal(18,6) DEFAULT NULL COMMENT ''体积(m³)''');
-- 新增删除标志
CALL proc_add_column_if_not_exists('md_item', 'del_flag', 'char(1) NOT NULL DEFAULT ''0'' COMMENT ''删除标志 (0存在 1删除)''');
-- 新增备注字段
CALL proc_add_column_if_not_exists('md_item', 'remark', 'varchar(500) DEFAULT NULL COMMENT ''备注''');
-- 创建索引
CALL proc_add_index_if_not_exists('md_item', 'idx_item_tenant', 'tenant_id');
-- ============================================================
-- 2. md_item_type 表新增字段 (物料分类表)
-- ============================================================
-- 新增租户ID字段
CALL proc_add_column_if_not_exists('md_item_type', 'tenant_id', 'varchar(20) DEFAULT NULL COMMENT ''租户ID''');
-- 新增删除标志
CALL proc_add_column_if_not_exists('md_item_type', 'del_flag', 'char(1) NOT NULL DEFAULT ''0'' COMMENT ''删除标志 (0存在 1删除)''');
-- 扩展ancestors字段长度 (从255扩展到500)
-- 注意: 这个操作是安全的,扩展长度不会丢失数据
ALTER TABLE `md_item_type`
MODIFY COLUMN `ancestors` varchar(500) DEFAULT NULL COMMENT '所有层级父节点';
-- 创建索引
CALL proc_add_index_if_not_exists('md_item_type', 'idx_item_type_tenant', 'tenant_id');
-- ============================================================
-- 3. md_unit_measure 表新增字段 (计量单位表)
-- ============================================================
-- 新增租户ID字段
CALL proc_add_column_if_not_exists('md_unit_measure', 'tenant_id', 'varchar(20) DEFAULT NULL COMMENT ''租户ID''');
-- 新增主单位ID
CALL proc_add_column_if_not_exists('md_unit_measure', 'primary_id', 'bigint(20) DEFAULT NULL COMMENT ''主单位ID''');
-- 新增是否主单位标志
CALL proc_add_column_if_not_exists('md_unit_measure', 'primary_flag', 'char(1) NOT NULL DEFAULT ''Y'' COMMENT ''是否主单位(Y/N)''');
-- 新增换算比例
CALL proc_add_column_if_not_exists('md_unit_measure', 'change_rate', 'decimal(18,6) DEFAULT 1.000000 COMMENT ''与主单位换算比例''');
-- 新增删除标志
CALL proc_add_column_if_not_exists('md_unit_measure', 'del_flag', 'char(1) NOT NULL DEFAULT ''0'' COMMENT ''删除标志 (0存在 1删除)''');
-- 创建索引
CALL proc_add_index_if_not_exists('md_unit_measure', 'idx_measure_tenant', 'tenant_id');
-- ============================================================
-- 清理: 删除辅助存储过程 (可选)
-- ============================================================
-- DROP PROCEDURE IF EXISTS `proc_add_column_if_not_exists`;
-- DROP PROCEDURE IF EXISTS `proc_add_index_if_not_exists`;
-- ============================================================
-- 4. md_product_bom 表新增字段 (产品BOM关系表)
-- 同步自ERP: erp_md_bom, erp_md_bom_line
-- ============================================================
-- 新增BOM编码 (来自 erp_md_bom.bom_code)
CALL proc_add_column_if_not_exists('md_product_bom', 'bom_code', 'varchar(32) DEFAULT NULL COMMENT ''BOM编码''');
-- 新增BOM名称 (来自 erp_md_bom.bom_name)
CALL proc_add_column_if_not_exists('md_product_bom', 'bom_name', 'varchar(100) DEFAULT NULL COMMENT ''BOM名称''');
-- 新增版本号 (来自 erp_md_bom.version)
CALL proc_add_column_if_not_exists('md_product_bom', 'version', 'varchar(20) DEFAULT NULL COMMENT ''版本号''');
-- 新增版本说明 (来自 erp_md_bom.version_desc)
CALL proc_add_column_if_not_exists('md_product_bom', 'version_desc', 'varchar(200) DEFAULT NULL COMMENT ''版本说明''');
-- 新增状态 (来自 erp_md_bom.status)
CALL proc_add_column_if_not_exists('md_product_bom', 'status', 'varchar(20) DEFAULT ''APPROVED'' COMMENT ''BOM状态(DRAFT/APPROVED/OBSOLETE)''');
-- 新增行号 (来自 erp_md_bom_line.line_no)
CALL proc_add_column_if_not_exists('md_product_bom', 'line_no', 'int(11) DEFAULT 0 COMMENT ''BOM行号''');
-- 新增损耗率 (来自 erp_md_bom_line.loss_rate)
CALL proc_add_column_if_not_exists('md_product_bom', 'loss_rate', 'decimal(5,2) DEFAULT 0.00 COMMENT ''损耗率(%)''');
-- 新增供应方式 (来自 erp_md_bom_line.supply_type)
CALL proc_add_column_if_not_exists('md_product_bom', 'supply_type', 'varchar(20) DEFAULT ''PURCHASE'' COMMENT ''供应方式(PURCHASE/PRODUCE/OUTSOURCE)''');
-- 新增租户ID
CALL proc_add_column_if_not_exists('md_product_bom', 'tenant_id', 'varchar(20) DEFAULT NULL COMMENT ''租户ID''');
-- 新增删除标志 (来自 erp_md_bom.del_flag)
CALL proc_add_column_if_not_exists('md_product_bom', 'del_flag', 'char(1) NOT NULL DEFAULT ''0'' COMMENT ''删除标志(0存在 1删除)''');
-- 创建索引
CALL proc_add_index_if_not_exists('md_product_bom', 'idx_bom_item', 'item_id');
CALL proc_add_index_if_not_exists('md_product_bom', 'idx_bom_tenant', 'tenant_id');
CALL proc_add_index_if_not_exists('md_product_bom', 'idx_bom_code', 'bom_code');
-- ============================================================
-- 5. md_item 表新增BOM相关字段 (来自 erp_md_bom)
-- 物料档案表关联默认BOM信息
-- ============================================================
-- 新增默认BOM ID (关联 erp_md_bom.bom_id)
CALL proc_add_column_if_not_exists('md_item', 'default_bom_id', 'bigint(20) DEFAULT NULL COMMENT ''默认BOM ID''');
-- 新增默认BOM编码 (关联 erp_md_bom.bom_code)
CALL proc_add_column_if_not_exists('md_item', 'default_bom_code', 'varchar(32) DEFAULT NULL COMMENT ''默认BOM编码''');
-- 新增默认BOM名称 (关联 erp_md_bom.bom_name)
CALL proc_add_column_if_not_exists('md_item', 'default_bom_name', 'varchar(100) DEFAULT NULL COMMENT ''默认BOM名称''');
-- 新增基本数量 (来自 erp_md_bom.base_qty)
CALL proc_add_column_if_not_exists('md_item', 'base_qty', 'decimal(18,4) DEFAULT 1.0000 COMMENT ''基本数量''');
-- 新增默认BOM版本号 (关联 erp_md_bom.version)
CALL proc_add_column_if_not_exists('md_item', 'default_bom_version', 'varchar(20) DEFAULT NULL COMMENT ''默认BOM版本号''');
-- 创建索引
CALL proc_add_index_if_not_exists('md_item', 'idx_item_default_bom', 'default_bom_id');
-- ============================================================
-- 6. md_product_bom 表补充字段 (来自 erp_md_bom_line)
-- ============================================================
-- 新增基本用量 (来自 erp_md_bom_line.base_qty)
-- 注: quantity字段已存在这里添加base_qty作为原始用量
CALL proc_add_column_if_not_exists('md_product_bom', 'base_qty', 'decimal(18,6) DEFAULT 1.000000 COMMENT ''基本用量(同步自ERP)''');
-- 新增产品物料编码 (来自 erp_md_bom.item_code)
CALL proc_add_column_if_not_exists('md_product_bom', 'item_code', 'varchar(32) DEFAULT NULL COMMENT ''产品物料编码''');
-- 新增产品物料名称 (来自 erp_md_bom.item_name)
CALL proc_add_column_if_not_exists('md_product_bom', 'item_name', 'varchar(100) DEFAULT NULL COMMENT ''产品物料名称''');
-- 新增产品物料规格 (关联查询)
CALL proc_add_column_if_not_exists('md_product_bom', 'item_spec', 'varchar(200) DEFAULT NULL COMMENT ''产品物料规格''');
-- 新增子件规格 (来自 erp_md_bom_line.specification)
CALL proc_add_column_if_not_exists('md_product_bom', 'specification', 'varchar(200) DEFAULT NULL COMMENT ''子件规格型号''');
-- 新增计量单位名称 (来自 erp_md_bom_line.unit_name)
CALL proc_add_column_if_not_exists('md_product_bom', 'unit_name', 'varchar(20) DEFAULT NULL COMMENT ''计量单位名称''');
-- 确保enable_flag字段存在
CALL proc_add_column_if_not_exists('md_product_bom', 'enable_flag', 'char(1) DEFAULT ''Y'' COMMENT ''是否启用(Y/N)''');
-- ============================================================
-- 字段变更汇总
-- ============================================================
--
-- md_item (物料产品表) 新增字段:
-- - tenant_id: 租户ID
-- - item_sub_type_code: 二级分类编码
-- - item_sub_type_name: 二级分类名称
-- - default_warehouse_id: 默认仓库ID
-- - default_warehouse_name: 默认仓库名称
-- - weight: 重量(kg)
-- - volume: 体积(m³)
-- - del_flag: 删除标志
-- - remark: 备注
--
-- md_item_type (物料分类表) 新增字段:
-- - tenant_id: 租户ID
-- - del_flag: 删除标志
-- - ancestors: 字段长度从255扩展到500
--
-- md_unit_measure (计量单位表) 新增字段:
-- - tenant_id: 租户ID
-- - primary_id: 主单位ID
-- - primary_flag: 是否主单位
-- - change_rate: 与主单位换算比例
-- - del_flag: 删除标志
--
-- md_product_bom (产品BOM关系表) 新增字段:
-- - bom_code: BOM编码 (来自 erp_md_bom)
-- - bom_name: BOM名称 (来自 erp_md_bom)
-- - version: 版本号 (来自 erp_md_bom)
-- - version_desc: 版本说明 (来自 erp_md_bom)
-- - status: BOM状态 (来自 erp_md_bom)
-- - line_no: 行号 (来自 erp_md_bom_line)
-- - loss_rate: 损耗率(%) (来自 erp_md_bom_line)
-- - supply_type: 供应方式 (来自 erp_md_bom_line)
-- - base_qty: 基本用量 (来自 erp_md_bom_line)
-- - item_code: 产品物料编码 (来自 erp_md_bom)
-- - item_name: 产品物料名称 (来自 erp_md_bom)
-- - item_spec: 产品物料规格
-- - specification: 子件规格型号 (来自 erp_md_bom_line)
-- - unit_name: 计量单位名称 (来自 erp_md_bom_line)
-- - enable_flag: 是否启用
-- - tenant_id: 租户ID
-- - del_flag: 删除标志
--
-- md_item (物料产品表) 新增BOM关联字段:
-- - default_bom_id: 默认BOM ID (来自 erp_md_bom)
-- - default_bom_code: 默认BOM编码 (来自 erp_md_bom)
-- - default_bom_name: 默认BOM名称 (来自 erp_md_bom)
-- - base_qty: 基本数量 (来自 erp_md_bom)
-- - default_bom_version: 默认BOM版本号 (来自 erp_md_bom)
--
-- ============================================================
-- ERP BOM字段映射说明:
-- ============================================================
--
-- erp_md_bom (BOM表头) -> md_item (关联字段) + md_product_bom (表头字段)
-- ┌─────────────────────┬───────────────────────┬──────────────────────────┐
-- │ ERP字段 │ MOM md_item字段 │ MOM md_product_bom字段 │
-- ├─────────────────────┼───────────────────────┼──────────────────────────┤
-- │ bom_id │ default_bom_id │ - │
-- │ bom_code │ default_bom_code │ bom_code │
-- │ bom_name │ default_bom_name │ bom_name │
-- │ item_id │ - │ item_id │
-- │ item_code │ - │ item_code │
-- │ item_name │ - │ item_name │
-- │ unit_name │ - │ - │
-- │ base_qty │ base_qty │ - │
-- │ version │ default_bom_version │ version │
-- │ version_desc │ - │ version_desc │
-- │ status │ - │ status │
-- │ enable_flag │ - │ enable_flag │
-- │ del_flag │ - │ del_flag │
-- └─────────────────────┴───────────────────────┴──────────────────────────┘
--
-- erp_md_bom_line (BOM明细) -> md_product_bom (明细字段)
-- ┌─────────────────────┬──────────────────────────┐
-- │ ERP字段 │ MOM md_product_bom字段 │
-- ├─────────────────────┼──────────────────────────┤
-- │ line_id │ bom_id │
-- │ bom_id │ (通过bom_code关联) │
-- │ line_no │ line_no │
-- │ item_id │ bom_item_id │
-- │ item_code │ bom_item_code │
-- │ item_name │ bom_item_name │
-- │ specification │ bom_item_spec │
-- │ unit_name │ unit_name │
-- │ base_qty │ base_qty / quantity │
-- │ loss_rate │ loss_rate │
-- │ supply_type │ supply_type │
-- │ remark │ remark │
-- │ del_flag │ del_flag │
-- │ tenant_id │ tenant_id │
-- └─────────────────────┴──────────────────────────┘
--
-- ============================================================

View File

@@ -0,0 +1,680 @@
# MOM系统数据升级方案 — 销售、采购、生产计划模块
> 版本: 1.1.0
> 创建日期: 2026-02-06
> 更新日期: 2026-02-07
> 基于: ERP数据字典 / erp数据库设计-DDL.sql / 映射对照表 v1.2.0
---
## 1. 升级背景
MOM系统当前定位为**生产执行层**不直接管理销售订单、采购订单和生产计划。但随着ERP系统集成深化MOM需要存储来自ERP的计划层数据以支撑
- 生产排程时查看销售订单交期
- 领料时关联采购订单溯源
- 工单下发时保留计划单完整信息
本方案对比两系统在三大模块的数据模型差异给出MOM侧的具体升级动作。
---
## 2. 现状对比总览
### 2.1 三模块表级覆盖率
| 模块 | ERP表数量 | MOM已有映射表 | MOM缺失 | 覆盖率 |
|------|----------|-------------|---------|--------|
| 销售管理 | 10 (含合同/发票) | 3 (间接: workorder+出库) | 销售订单独立存储、合同、发票 | 30% |
| 采购管理 | 9 (含发票) | 4 (到货通知+入库+退料) | 采购订单独立存储、发票 | 44% |
| 生产计划 | 6 | 2 (workorder+workorder_bom) | 计划单独立存储、物料清单、采购计划 | 33% |
### 2.2 关键差距
| 差距项 | 说明 | 影响 |
|--------|------|------|
| **无销售订单表** | 订单信息仅作为source_code存储在pro_workorder中 | 无法查看订单完整信息(客户/金额/交期/明细) |
| **无采购订单表** | 采购单号仅作为po_code存储在wm_arrival_notice中 | 无法追溯采购进度(下单/到货/入库链路) |
| **无生产计划单表** | 计划信息合并到pro_workorder | 丢失计划层的BOM版本/关联订单/齐套状态 |
| **无计划物料清单(MBOM)** | ERP的BOM计算结果无处存储 | 无法展示按供应方式拆解后的完整用料需求 |
| **无采购计划表** | ERP采购计划仅映射到wm_arrival_notice | 丢失计划采购量/已订量/缺口量等跟踪信息 |
| **pro_workorder缺字段** | 缺少ERP计划层的关键字段 | 缺少bom_version/bom_desc/sales_user/delivery_date等 |
---
## 3. 升级方案
### 3.1 方案总览
| 序号 | 升级动作 | 类型 | 优先级 | 说明 |
|------|----------|------|--------|------|
| A1 | 新建 `erp_sl_order` | 新建表 | P0 | 销售订单表头接收ERP数据 |
| A2 | 新建 `erp_sl_order_line` | 新建表 | P0 | 销售订单明细 |
| A3 | 新建 `erp_po_order` | 新建表 | P0 | 采购订单表头接收ERP数据 |
| A4 | 新建 `erp_po_order_line` | 新建表 | P0 | 采购订单明细 |
| A5 | 新建 `erp_mp_plan` | 新建表 | P0 | 生产计划单表头接收ERP数据 |
| A6 | 新建 `erp_mp_plan_line` | 新建表 | P0 | 生产计划单明细 |
| A7 | 新建 `erp_mp_mbom` | 新建表 | P1 | 计划物料清单表头 |
| A8 | 新建 `erp_mp_mbom_line` | 新建表 | P1 | 计划物料清单明细 |
| A9 | 新建 `erp_mp_purchase` | 新建表 | P1 | 采购计划单 |
| B1 | 修改 `pro_workorder` | ALTER | P0 | 新增ERP计划关联字段 |
| B2 | 修改 `wm_item_recpt` | ALTER | P1 | 新增采购订单关联字段 |
| B3 | 修改 `wm_arrival_notice` | ALTER | P1 | 增强采购单关联 |
### 3.2 命名规范
新建表统一采用 `erp_` 前缀与MOM已有的ERP同步表保持一致`erp_md_item``erp_md_bom_line`),便于识别数据来源:
| 表前缀 | 含义 | 举例 |
|--------|------|------|
| `erp_sl_` | 同步自ERP销售模块 | erp_sl_order |
| `erp_po_` | 同步自ERP采购模块 | erp_po_order |
| `erp_mp_` | 同步自ERP生产计划模块 | erp_mp_plan |
| `pro_` | MOM原生生产执行表 | pro_workorder (已有) |
| `wm_` | MOM原生仓库管理表 | wm_item_recpt (已有) |
---
## 4. 销售模块升级 (P0)
### 4.1 新建: 销售订单表头 (erp_sl_order)
> 用途: 接收ERP销售订单审核后的数据供生产排程和发货查询使用。只存储MOM关心的字段不含合同/发票等财务信息。
```sql
DROP TABLE IF EXISTS `erp_sl_order`;
CREATE TABLE `erp_sl_order` (
`order_id` bigint(20) NOT NULL COMMENT '订单ID (同步自ERP)',
`tenant_id` varchar(20) DEFAULT NULL COMMENT '租户ID',
`order_code` varchar(32) NOT NULL COMMENT '订单编码',
`order_name` varchar(100) DEFAULT NULL COMMENT '订单名称',
`order_date` date DEFAULT NULL COMMENT '订单日期',
`status` varchar(20) DEFAULT 'DRAFT' COMMENT '单据状态(DRAFT/APPROVED/CLOSED)',
`business_status` varchar(20) DEFAULT 'NORMAL' COMMENT '业务状态',
`order_type` varchar(20) DEFAULT NULL COMMENT '订单类型(销售/备货)',
`contract_id` bigint(20) DEFAULT NULL COMMENT '合同ID',
`contract_code` varchar(32) DEFAULT NULL COMMENT '合同编码',
`client_id` bigint(20) DEFAULT NULL COMMENT '客户ID',
`client_code` varchar(32) DEFAULT NULL COMMENT '客户编码',
`client_name` varchar(100) DEFAULT NULL COMMENT '客户名称',
`sales_user_id` bigint(20) DEFAULT NULL COMMENT '销售员ID',
`sales_user_name` varchar(50) DEFAULT NULL COMMENT '销售员名称',
`dept_id` bigint(20) DEFAULT NULL COMMENT '部门ID',
`dept_name` varchar(50) DEFAULT NULL COMMENT '部门名称',
`delivery_date` date DEFAULT NULL COMMENT '交货日期',
`delivery_address` varchar(200) DEFAULT NULL COMMENT '收货地址',
`total_quantity` decimal(18,4) DEFAULT 0 COMMENT '总数量',
`total_amount` decimal(18,2) DEFAULT 0 COMMENT '总金额',
`delivered_quantity` decimal(18,4) DEFAULT 0 COMMENT '已发货数量',
`delivered_amount` decimal(18,2) DEFAULT 0 COMMENT '已发货金额',
`pp_number` varchar(50) DEFAULT NULL COMMENT '跟单编号',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
`operator_id` bigint(20) DEFAULT NULL COMMENT '操作员ID',
`operator_name` varchar(50) DEFAULT NULL COMMENT '操作员名称',
`approver_id` bigint(20) DEFAULT NULL COMMENT '审核员ID',
`approver_name` varchar(50) DEFAULT NULL COMMENT '审核员名称',
`approve_date` datetime DEFAULT NULL COMMENT '审核日期',
`erp_sync_time` datetime DEFAULT NULL COMMENT 'ERP同步时间',
`del_flag` char(1) NOT NULL DEFAULT '0' COMMENT '删除标志',
`create_by` varchar(64) DEFAULT NULL COMMENT '创建者',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_by` varchar(64) DEFAULT NULL COMMENT '更新者',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`order_id`),
UNIQUE KEY `uk_sl_order_code` (`order_code`, `tenant_id`),
KEY `idx_sl_order_client` (`client_id`),
KEY `idx_sl_order_date` (`delivery_date`),
KEY `idx_sl_order_pp` (`pp_number`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='销售订单表头(同步自ERP)';
```
**与ERP字段对照:** 已按《erp数据库设计-数据字典》与 DDL 补齐与 ERP 同名字段,保证 1:1 同步时字段一致。pp_number、erp_sync_time 为 MOM 扩展字段。
### 4.2 新建: 销售订单明细 (erp_sl_order_line)
```sql
DROP TABLE IF EXISTS `erp_sl_order_line`;
CREATE TABLE `erp_sl_order_line` (
`line_id` bigint(20) NOT NULL COMMENT '明细ID (同步自ERP)',
`order_id` bigint(20) NOT NULL COMMENT '订单ID',
`order_code` varchar(32) NOT NULL COMMENT '订单编码',
`line_no` int DEFAULT NULL COMMENT '行号',
`track_code` varchar(32) DEFAULT NULL COMMENT '跟单编号',
`contract_line_id` bigint(20) DEFAULT NULL COMMENT '合同明细ID',
`item_id` bigint(20) NOT NULL COMMENT '物料ID',
`item_code` varchar(64) DEFAULT NULL COMMENT '物料编码',
`item_name` varchar(255) DEFAULT NULL COMMENT '物料名称',
`specification` varchar(500) DEFAULT NULL COMMENT '规格型号',
`unit_id` bigint(20) DEFAULT NULL COMMENT '计量单位ID',
`unit_of_measure` varchar(64) DEFAULT NULL COMMENT '计量单位',
`unit_name` varchar(64) DEFAULT NULL COMMENT '单位名称',
`quantity` decimal(18,4) NOT NULL DEFAULT 0 COMMENT '订单数量',
`unit_price` decimal(18,4) DEFAULT 0 COMMENT '单价',
`amount` decimal(18,2) DEFAULT 0 COMMENT '金额',
`delivered_qty` decimal(18,4) DEFAULT 0 COMMENT '已发货数量',
`quality_req` varchar(200) DEFAULT NULL COMMENT '质量要求',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
`del_flag` char(1) NOT NULL DEFAULT '0' COMMENT '删除标志',
`tenant_id` varchar(20) DEFAULT NULL COMMENT '租户ID',
`create_by` varchar(64) DEFAULT NULL COMMENT '创建者',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_by` varchar(64) DEFAULT NULL COMMENT '更新者',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`line_id`),
KEY `idx_sl_order_line_oid` (`order_id`),
KEY `idx_sl_order_line_item` (`item_id`),
KEY `idx_sl_order_line_track` (`track_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='销售订单明细(同步自ERP)';
```
---
## 5. 采购模块升级 (P0)
### 5.1 新建: 采购订单表头 (erp_po_order)
> 用途: 接收ERP采购订单数据用于入库时关联溯源、齐套检查时查看采购进度。
```sql
DROP TABLE IF EXISTS `erp_po_order`;
CREATE TABLE `erp_po_order` (
`order_id` bigint(20) NOT NULL COMMENT '订单ID (同步自ERP)',
`tenant_id` varchar(20) DEFAULT NULL COMMENT '租户ID',
`order_code` varchar(32) NOT NULL COMMENT '订单编码',
`order_date` date DEFAULT NULL COMMENT '订单日期',
`status` varchar(20) DEFAULT 'DRAFT' COMMENT '单据状态',
`business_status` varchar(20) DEFAULT 'NORMAL' COMMENT '业务状态',
`business_type` varchar(20) DEFAULT NULL COMMENT '业务类型',
`order_type` varchar(20) DEFAULT NULL COMMENT '单据类型',
`material_need` varchar(20) DEFAULT NULL COMMENT '用料需求',
`supplier_id` bigint(20) DEFAULT NULL COMMENT '供应商ID (与ERP一致)',
`supplier_code` varchar(32) DEFAULT NULL COMMENT '供应商编码',
`supplier_name` varchar(100) DEFAULT NULL COMMENT '供应商名称',
`dept_id` bigint(20) DEFAULT NULL COMMENT '采购部门ID',
`dept_name` varchar(50) DEFAULT NULL COMMENT '采购部门名称',
`user_id` bigint(20) DEFAULT NULL COMMENT '采购人员ID',
`user_name` varchar(50) DEFAULT NULL COMMENT '采购人员名称',
`delivery_date` date DEFAULT NULL COMMENT '到货日期',
`contract_no` varchar(50) DEFAULT NULL COMMENT '合同号',
`contract_file` varchar(500) DEFAULT NULL COMMENT '合同附件',
`total_quantity` decimal(18,4) DEFAULT 0 COMMENT '总数量',
`total_amount` decimal(18,2) DEFAULT 0 COMMENT '总金额',
`arrived_quantity` decimal(18,4) DEFAULT 0 COMMENT '已到货数量',
`plan_code` varchar(32) DEFAULT NULL COMMENT '关联计划单编码',
`pp_number` varchar(50) DEFAULT NULL COMMENT '跟单编号',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
`operator_id` bigint(20) DEFAULT NULL COMMENT '操作员ID',
`operator_name` varchar(50) DEFAULT NULL COMMENT '操作员名称',
`approver_id` bigint(20) DEFAULT NULL COMMENT '审核员ID',
`approver_name` varchar(50) DEFAULT NULL COMMENT '审核员名称',
`approve_date` datetime DEFAULT NULL COMMENT '审核日期',
`erp_sync_time` datetime DEFAULT NULL COMMENT 'ERP同步时间',
`del_flag` char(1) NOT NULL DEFAULT '0' COMMENT '删除标志',
`create_by` varchar(64) DEFAULT NULL COMMENT '创建者',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_by` varchar(64) DEFAULT NULL COMMENT '更新者',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`order_id`),
UNIQUE KEY `uk_po_order_code` (`order_code`, `tenant_id`),
KEY `idx_po_order_supplier` (`supplier_id`),
KEY `idx_po_order_date` (`delivery_date`),
KEY `idx_po_order_pp` (`pp_number`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='采购订单表头(同步自ERP)';
```
### 5.2 新建: 采购订单明细 (erp_po_order_line)
```sql
DROP TABLE IF EXISTS `erp_po_order_line`;
CREATE TABLE `erp_po_order_line` (
`line_id` bigint(20) NOT NULL COMMENT '明细ID (同步自ERP)',
`order_id` bigint(20) NOT NULL COMMENT '订单ID',
`order_code` varchar(32) NOT NULL COMMENT '订单编码',
`line_no` int DEFAULT NULL COMMENT '行号',
`track_code` varchar(32) DEFAULT NULL COMMENT '跟单编号',
`plan_code` varchar(32) DEFAULT NULL COMMENT '计划单号',
`plan_line_id` bigint(20) DEFAULT NULL COMMENT '计划明细ID',
`item_id` bigint(20) NOT NULL COMMENT '物料ID',
`item_code` varchar(64) DEFAULT NULL COMMENT '物料编码',
`item_name` varchar(255) DEFAULT NULL COMMENT '物料名称',
`specification` varchar(500) DEFAULT NULL COMMENT '型号规格',
`unit_id` bigint(20) DEFAULT NULL COMMENT '计量单位ID',
`unit_of_measure` varchar(64) DEFAULT NULL COMMENT '计量单位',
`unit_name` varchar(64) DEFAULT NULL COMMENT '单位名称',
`need_date` date DEFAULT NULL COMMENT '需求日期',
`quantity` decimal(18,4) NOT NULL DEFAULT 0 COMMENT '采购数量',
`unit_price` decimal(18,4) DEFAULT 0 COMMENT '采购单价',
`amount` decimal(18,2) DEFAULT 0 COMMENT '金额',
`arrived_quantity` decimal(18,4) DEFAULT 0 COMMENT '已到货数量',
`remark` varchar(500) DEFAULT NULL COMMENT '采购说明',
`del_flag` char(1) NOT NULL DEFAULT '0' COMMENT '删除标志',
`tenant_id` varchar(20) DEFAULT NULL COMMENT '租户ID',
`create_by` varchar(64) DEFAULT NULL COMMENT '创建者',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_by` varchar(64) DEFAULT NULL COMMENT '更新者',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`line_id`),
KEY `idx_po_order_line_oid` (`order_id`),
KEY `idx_po_order_line_item` (`item_id`),
KEY `idx_po_order_line_track` (`track_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='采购订单明细(同步自ERP)';
```
---
## 6. 生产计划模块升级 (P0)
### 6.1 新建: 生产计划单表头 (erp_mp_plan)
> 用途: 接收ERP生产计划单数据保留计划层的完整信息BOM版本、关联销售订单、计划数量等pro_workorder通过source_code关联。
```sql
DROP TABLE IF EXISTS `erp_mp_plan`;
CREATE TABLE `erp_mp_plan` (
`plan_id` bigint(20) NOT NULL COMMENT '计划ID (同步自ERP)',
`tenant_id` varchar(20) DEFAULT NULL COMMENT '租户ID',
`plan_code` varchar(32) NOT NULL COMMENT '计划单编码',
`plan_date` date DEFAULT NULL COMMENT '计划日期',
`status` varchar(20) DEFAULT 'DRAFT' COMMENT '单据状态',
`business_status` varchar(20) DEFAULT 'NORMAL' COMMENT '业务状态',
`business_type` varchar(20) DEFAULT NULL COMMENT '业务类型',
`work_type` int DEFAULT 0 COMMENT '工作类型(0计划单/1零部件计划/2零部件订单)',
`sales_order_id` bigint(20) DEFAULT NULL COMMENT '销售订单ID',
`sales_order_code` varchar(32) DEFAULT NULL COMMENT '销售订单编码',
`sales_user_id` bigint(20) DEFAULT NULL COMMENT '销售员ID',
`sales_user_name` varchar(50) DEFAULT NULL COMMENT '销售员名称',
`delivery_date` date DEFAULT NULL COMMENT '订单交期',
`bom_id` bigint(20) DEFAULT NULL COMMENT 'BOM ID',
`bom_version` varchar(20) DEFAULT NULL COMMENT 'BOM版本号',
`bom_desc` varchar(200) DEFAULT NULL COMMENT 'BOM版本说明',
`total_quantity` decimal(18,4) DEFAULT 0 COMMENT '生产总量',
`pp_number` varchar(50) DEFAULT NULL COMMENT '跟单编号',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
`operator_id` bigint(20) DEFAULT NULL COMMENT '操作员ID',
`operator_name` varchar(50) DEFAULT NULL COMMENT '操作员名称',
`approver_id` bigint(20) DEFAULT NULL COMMENT '审核员ID',
`approver_name` varchar(50) DEFAULT NULL COMMENT '审核员名称',
`approve_date` datetime DEFAULT NULL COMMENT '审核日期',
`erp_sync_time` datetime DEFAULT NULL COMMENT 'ERP同步时间',
`del_flag` char(1) NOT NULL DEFAULT '0' COMMENT '删除标志',
`create_by` varchar(64) DEFAULT NULL COMMENT '创建者',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_by` varchar(64) DEFAULT NULL COMMENT '更新者',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`plan_id`),
UNIQUE KEY `uk_mp_plan_code` (`plan_code`, `tenant_id`),
KEY `idx_mp_plan_sales` (`sales_order_code`),
KEY `idx_mp_plan_date` (`plan_date`),
KEY `idx_mp_plan_pp` (`pp_number`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='生产计划单表头(同步自ERP)';
```
### 6.2 新建: 生产计划单明细 (erp_mp_plan_line)
```sql
DROP TABLE IF EXISTS `erp_mp_plan_line`;
CREATE TABLE `erp_mp_plan_line` (
`line_id` bigint(20) NOT NULL COMMENT '明细ID (同步自ERP)',
`plan_id` bigint(20) NOT NULL COMMENT '计划ID',
`plan_code` varchar(32) NOT NULL COMMENT '计划单编码',
`line_no` int DEFAULT NULL COMMENT '行号',
`sales_line_id` bigint(20) DEFAULT NULL COMMENT '销售订单明细ID',
`track_code` varchar(32) DEFAULT NULL COMMENT '跟单编号',
`item_id` bigint(20) NOT NULL COMMENT '产品物料ID',
`item_code` varchar(64) DEFAULT NULL COMMENT '产品物料编码',
`item_name` varchar(255) DEFAULT NULL COMMENT '产品物料名称',
`specification` varchar(500) DEFAULT NULL COMMENT '规格型号',
`unit_id` bigint(20) DEFAULT NULL COMMENT '计量单位ID',
`unit_of_measure` varchar(64) DEFAULT NULL COMMENT '计量单位',
`unit_name` varchar(64) DEFAULT NULL COMMENT '单位名称',
`quantity` decimal(18,4) NOT NULL DEFAULT 0 COMMENT '计划数量',
`supply_type` varchar(20) DEFAULT NULL COMMENT '供应方式',
`quality_req` varchar(200) DEFAULT NULL COMMENT '质量要求',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
`del_flag` char(1) NOT NULL DEFAULT '0' COMMENT '删除标志',
`tenant_id` varchar(20) DEFAULT NULL COMMENT '租户ID',
`create_by` varchar(64) DEFAULT NULL COMMENT '创建者',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_by` varchar(64) DEFAULT NULL COMMENT '更新者',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`line_id`),
KEY `idx_mp_plan_line_pid` (`plan_id`),
KEY `idx_mp_plan_line_item` (`item_id`),
KEY `idx_mp_plan_line_sales` (`sales_line_id`),
KEY `idx_mp_plan_line_track` (`track_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='生产计划单明细(同步自ERP)';
```
---
## 7. 生产计划模块升级 (P1)
### 7.1 新建: 计划物料清单表头 (erp_mp_mbom)
> 用途: 接收ERP BOM计算后的物料需求清单按供应方式拆解生产/采购/委外),支撑齐套检查。
```sql
DROP TABLE IF EXISTS `erp_mp_mbom`;
CREATE TABLE `erp_mp_mbom` (
`mbom_id` bigint(20) NOT NULL COMMENT '物料清单ID (同步自ERP)',
`tenant_id` varchar(20) DEFAULT NULL COMMENT '租户ID',
`mbom_code` varchar(32) NOT NULL COMMENT '物料清单编码',
`mbom_date` date DEFAULT NULL COMMENT '单据日期',
`status` varchar(20) DEFAULT 'DRAFT' COMMENT '单据状态',
`business_type` varchar(20) DEFAULT NULL COMMENT '业务类型',
`issue_status` varchar(20) DEFAULT NULL COMMENT '下发状态',
`plan_id` bigint(20) NOT NULL COMMENT '生产计划ID',
`plan_code` varchar(32) NOT NULL COMMENT '生产计划编码',
`sales_order_id` bigint(20) DEFAULT NULL COMMENT '销售订单ID',
`sales_order_code` varchar(32) DEFAULT NULL COMMENT '销售订单编码',
`delivery_date` date DEFAULT NULL COMMENT '订单交期',
`item_id` bigint(20) NOT NULL COMMENT '产品物料ID',
`item_code` varchar(64) DEFAULT NULL COMMENT '产品物料编码',
`item_name` varchar(255) DEFAULT NULL COMMENT '产品物料名称',
`unit_name` varchar(64) DEFAULT NULL COMMENT '计量单位',
`supply_type` varchar(20) DEFAULT NULL COMMENT '供应方式(生产/加工/装配/委外/采购)',
`quantity` decimal(18,4) NOT NULL DEFAULT 0 COMMENT '生产数量',
`workshop_id` bigint(20) DEFAULT NULL COMMENT '下发车间ID',
`workshop_name` varchar(50) DEFAULT NULL COMMENT '下发车间名称',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
`operator_id` bigint(20) DEFAULT NULL COMMENT '操作员ID',
`operator_name` varchar(50) DEFAULT NULL COMMENT '操作员名称',
`approver_id` bigint(20) DEFAULT NULL COMMENT '审核员ID',
`approver_name` varchar(50) DEFAULT NULL COMMENT '审核员名称',
`approve_date` datetime DEFAULT NULL COMMENT '审核日期',
`completed_qty` decimal(18,4) DEFAULT 0 COMMENT '已完成数量(MOM回写)',
`workorder_id` bigint(20) DEFAULT NULL COMMENT '关联MOM工单ID(MOM扩展)',
`workorder_code` varchar(64) DEFAULT NULL COMMENT '关联MOM工单编码(MOM扩展)',
`pp_number` varchar(50) DEFAULT NULL COMMENT '跟单编号(MOM扩展)',
`erp_sync_time` datetime DEFAULT NULL COMMENT 'ERP同步时间',
`del_flag` char(1) NOT NULL DEFAULT '0' COMMENT '删除标志',
`create_by` varchar(64) DEFAULT NULL COMMENT '创建者',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_by` varchar(64) DEFAULT NULL COMMENT '更新者',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`mbom_id`),
KEY `idx_mp_mbom_plan` (`plan_id`),
KEY `idx_mp_mbom_item` (`item_id`),
KEY `idx_mp_mbom_wo` (`workorder_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='计划物料清单表头(同步自ERP)';
```
### 7.2 新建: 计划物料清单明细 (erp_mp_mbom_line)
> 与 ERP `erp_mp_mbom_line` 字段一致,保证 1:1 同步。
```sql
DROP TABLE IF EXISTS `erp_mp_mbom_line`;
CREATE TABLE `erp_mp_mbom_line` (
`line_id` bigint(20) NOT NULL COMMENT '明细ID (同步自ERP)',
`mbom_id` bigint(20) NOT NULL COMMENT '物料清单ID',
`mbom_code` varchar(32) NOT NULL COMMENT '物料清单编码',
`line_no` int DEFAULT NULL COMMENT '行号',
`parent_item_id` bigint(20) DEFAULT NULL COMMENT '父级物料ID',
`bom_level` int DEFAULT 1 COMMENT 'BOM层级',
`item_id` bigint(20) NOT NULL COMMENT '子件物料ID',
`item_code` varchar(64) DEFAULT NULL COMMENT '子件物料编码',
`item_name` varchar(255) DEFAULT NULL COMMENT '子件物料名称',
`specification` varchar(500) DEFAULT NULL COMMENT '型号规格',
`unit_name` varchar(64) DEFAULT NULL COMMENT '计量单位',
`base_qty` decimal(18,6) DEFAULT 1 COMMENT '基本用量',
`quantity` decimal(18,4) NOT NULL DEFAULT 0 COMMENT '需求数量',
`loss_rate` decimal(5,2) DEFAULT 0 COMMENT '损耗率(%)',
`supply_type` varchar(20) DEFAULT NULL COMMENT '供应方式',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
`del_flag` char(1) NOT NULL DEFAULT '0' COMMENT '删除标志',
`tenant_id` varchar(20) DEFAULT NULL COMMENT '租户ID',
`create_by` varchar(64) DEFAULT NULL COMMENT '创建者',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_by` varchar(64) DEFAULT NULL COMMENT '更新者',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`line_id`),
KEY `idx_mp_mbom_line_mbom` (`mbom_id`),
KEY `idx_mp_mbom_line_item` (`item_id`),
KEY `idx_mp_mbom_line_parent` (`parent_item_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='计划物料清单明细(同步自ERP)';
```
### 7.3 新建: 采购计划单 (erp_mp_purchase)
```sql
DROP TABLE IF EXISTS `erp_mp_purchase`;
CREATE TABLE `erp_mp_purchase` (
`purchase_id` bigint(20) NOT NULL COMMENT '采购计划ID (同步自ERP)',
`tenant_id` varchar(20) DEFAULT NULL COMMENT '租户ID',
`purchase_code` varchar(32) NOT NULL COMMENT '采购计划编码',
`purchase_date` date DEFAULT NULL COMMENT '计划日期',
`status` varchar(20) DEFAULT 'DRAFT' COMMENT '单据状态',
`need_type` int DEFAULT 0 COMMENT '需求方式(0订单用料/1库存备料)',
`plan_id` bigint(20) DEFAULT NULL COMMENT '生产计划ID',
`plan_code` varchar(32) DEFAULT NULL COMMENT '生产计划编码',
`sales_order_id` bigint(20) DEFAULT NULL COMMENT '销售订单ID',
`sales_order_code` varchar(32) DEFAULT NULL COMMENT '销售订单编码',
`delivery_date` date DEFAULT NULL COMMENT '订单交期',
`item_id` bigint(20) NOT NULL COMMENT '物料ID',
`item_code` varchar(64) DEFAULT NULL COMMENT '物料编码',
`item_name` varchar(255) DEFAULT NULL COMMENT '物料名称',
`specification` varchar(500) DEFAULT NULL COMMENT '型号规格',
`unit_name` varchar(64) DEFAULT NULL COMMENT '计量单位',
`purchase_qty` decimal(18,4) NOT NULL DEFAULT 0 COMMENT '采购数量',
`ordered_qty` decimal(18,4) DEFAULT 0 COMMENT '已下单数量',
`arrived_qty` decimal(18,4) DEFAULT 0 COMMENT '已到货数量(MOM扩展)',
`pp_number` varchar(50) DEFAULT NULL COMMENT '跟单编号(MOM扩展)',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
`operator_id` bigint(20) DEFAULT NULL COMMENT '操作员ID',
`operator_name` varchar(50) DEFAULT NULL COMMENT '操作员名称',
`approver_id` bigint(20) DEFAULT NULL COMMENT '审核员ID',
`approver_name` varchar(50) DEFAULT NULL COMMENT '审核员名称',
`approve_date` datetime DEFAULT NULL COMMENT '审核日期',
`erp_sync_time` datetime DEFAULT NULL COMMENT 'ERP同步时间',
`del_flag` char(1) NOT NULL DEFAULT '0' COMMENT '删除标志',
`create_by` varchar(64) DEFAULT NULL COMMENT '创建者',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_by` varchar(64) DEFAULT NULL COMMENT '更新者',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`purchase_id`),
KEY `idx_mp_purchase_plan` (`plan_id`),
KEY `idx_mp_purchase_item` (`item_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='采购计划单(同步自ERP)';
```
---
## 8. 现有表结构升级 (ALTER)
### 8.1 pro_workorder 新增ERP关联字段
```sql
-- ============================================================
-- pro_workorder 新增ERP计划层关联字段
-- ============================================================
-- 关联ERP计划单保留完整计划信息
CALL proc_add_column_if_not_exists('pro_workorder', 'plan_id', 'bigint(20) DEFAULT NULL COMMENT ''ERP生产计划ID''');
CALL proc_add_column_if_not_exists('pro_workorder', 'plan_code', 'varchar(32) DEFAULT NULL COMMENT ''ERP生产计划编码''');
-- BOM版本信息ERP选择的具体BOM版本
CALL proc_add_column_if_not_exists('pro_workorder', 'bom_id', 'bigint(20) DEFAULT NULL COMMENT ''BOM ID''');
CALL proc_add_column_if_not_exists('pro_workorder', 'bom_version', 'varchar(20) DEFAULT NULL COMMENT ''BOM版本号''');
-- 销售订单交期(排程核心参数)
CALL proc_add_column_if_not_exists('pro_workorder', 'delivery_date', 'date DEFAULT NULL COMMENT ''订单交货日期''');
-- 销售员(跟单查询)
CALL proc_add_column_if_not_exists('pro_workorder', 'sales_user_name', 'varchar(50) DEFAULT NULL COMMENT ''销售员''');
-- 跟单编号ERP全流程追溯
CALL proc_add_column_if_not_exists('pro_workorder', 'pp_number', 'varchar(50) DEFAULT NULL COMMENT ''跟单编号(ERP全流程追溯)''');
-- MBOM关联对应ERP物料清单哪一条
CALL proc_add_column_if_not_exists('pro_workorder', 'mbom_id', 'bigint(20) DEFAULT NULL COMMENT ''ERP物料清单ID''');
CALL proc_add_column_if_not_exists('pro_workorder', 'mbom_code', 'varchar(32) DEFAULT NULL COMMENT ''ERP物料清单编码''');
-- ERP同步标记
CALL proc_add_column_if_not_exists('pro_workorder', 'erp_sync_time', 'datetime DEFAULT NULL COMMENT ''ERP同步时间''');
-- 创建索引
CALL proc_add_index_if_not_exists('pro_workorder', 'idx_wo_plan', 'plan_code');
CALL proc_add_index_if_not_exists('pro_workorder', 'idx_wo_pp', 'pp_number');
CALL proc_add_index_if_not_exists('pro_workorder', 'idx_wo_delivery', 'delivery_date');
```
### 8.2 wm_item_recpt 新增采购关联字段
```sql
-- ============================================================
-- wm_item_recpt 增强采购订单关联
-- ============================================================
-- 采购订单关联已有po_code字段补充订单ID和行ID
CALL proc_add_column_if_not_exists('wm_item_recpt', 'po_order_id', 'bigint(20) DEFAULT NULL COMMENT ''采购订单ID''');
CALL proc_add_column_if_not_exists('wm_item_recpt', 'po_line_id', 'bigint(20) DEFAULT NULL COMMENT ''采购订单行ID''');
-- 跟单编号
CALL proc_add_column_if_not_exists('wm_item_recpt', 'pp_number', 'varchar(50) DEFAULT NULL COMMENT ''跟单编号''');
-- ERP同步标记
CALL proc_add_column_if_not_exists('wm_item_recpt', 'erp_sync_time', 'datetime DEFAULT NULL COMMENT ''ERP同步时间''');
```
### 8.3 wm_arrival_notice 增强关联
```sql
-- ============================================================
-- wm_arrival_notice 增强采购计划关联
-- ============================================================
-- 采购计划关联
CALL proc_add_column_if_not_exists('wm_arrival_notice', 'purchase_plan_id', 'bigint(20) DEFAULT NULL COMMENT ''采购计划ID''');
CALL proc_add_column_if_not_exists('wm_arrival_notice', 'purchase_plan_code', 'varchar(32) DEFAULT NULL COMMENT ''采购计划编码''');
-- 跟单编号
CALL proc_add_column_if_not_exists('wm_arrival_notice', 'pp_number', 'varchar(50) DEFAULT NULL COMMENT ''跟单编号''');
```
---
## 9. 数据同步策略
### 9.1 同步方向和时机
| 同步路径 | 方向 | 触发时机 | 说明 |
|---------|------|---------|------|
| erp_sl_order → erp_sl_order | ERP→MOM | 销售订单审核后 | 只同步已审核订单 |
| erp_po_order → erp_po_order | ERP→MOM | 采购订单审核后 | 只同步已审核订单 |
| erp_mp_plan → erp_mp_plan | ERP→MOM | 生产计划审核后 | 只同步已审核计划 |
| erp_mp_plan → pro_workorder | ERP→MOM | 计划下发时 | BOM计算后按供应方式拆解创建工单 |
| erp_mp_mbom → erp_mp_mbom | ERP→MOM | BOM计算完成后 | 保留计划层完整物料需求 |
| erp_mp_purchase → erp_mp_purchase | ERP→MOM | 采购计划审核后 | 同步采购需求 |
| pro_workorder.status → erp_mp_mbom | MOM→ERP | 工单完工时 | 回写已完成数量 |
| wm_item_recpt → erp_po_checkin | MOM→ERP | 入库审核时 | 回写已入库数量 |
### 9.2 主键策略
| 策略 | 说明 |
|------|------|
| **使用ERP主键** | erp_sl/po/mp 新表的主键直接使用ERP侧的ID值非自增确保一一对应 |
| **编码关联** | pro_workorder 通过 `source_code = plan_code` 关联不存储ERP主键 |
| **同步时间戳** | 所有同步表增加 `erp_sync_time` 字段,用于增量同步判断 |
### 9.3 状态值映射
| ERP状态 | MOM存储值 | 说明 |
|---------|----------|------|
| DRAFT(开立) | DRAFT | 直接存储,不转换 |
| APPROVED(审核) | APPROVED | 直接存储 |
| CLOSED(关闭) | CLOSED | 直接存储 |
| CANCELLED(取消) | CANCELLED | 直接存储 |
> **原则**: erp_sl/po/mp 表作为ERP数据的镜像状态值不做转换保持与ERP一致。仅pro_workorder的状态使用MOM自有体系(PREPARE/CONFIRMED/PRODUCING/FINISHED)。
---
## 10. 执行计划
### 10.1 执行顺序
```
阶段1 (P0 - 基础表创建):
├── 1.1 创建 erp_sl_order / erp_sl_order_line
├── 1.2 创建 erp_po_order / erp_po_order_line
├── 1.3 创建 erp_mp_plan / erp_mp_plan_line
└── 1.4 ALTER pro_workorder (新增关联字段)
阶段2 (P1 - 扩展表创建):
├── 2.1 创建 erp_mp_mbom / erp_mp_mbom_line (DDL见 7.1、7.2字段与ERP数据字典一致)
├── 2.2 创建 erp_mp_purchase (DDL见 7.3)
├── 2.3 ALTER wm_item_recpt
└── 2.4 ALTER wm_arrival_notice
阶段3 (同步接口开发):
├── 3.1 ERP→MOM 数据同步API
├── 3.2 MOM→ERP 回写API
└── 3.3 增量同步定时任务
```
### 10.2 回滚策略
所有新建表使用 `DROP TABLE IF EXISTS` 前缀可安全回滚。ALTER操作使用 `proc_add_column_if_not_exists` 存储过程,具有幂等性。
### 10.3 验证清单
| 检查项 | 验证SQL |
|--------|---------|
| 新表已创建 | `SHOW TABLES LIKE 'erp_%';` |
| pro_workorder字段已加 | `SHOW COLUMNS FROM pro_workorder LIKE 'plan_code';` |
| 索引已创建 | `SHOW INDEX FROM erp_sl_order;` |
| 数据同步测试 | `SELECT COUNT(*) FROM erp_sl_order WHERE erp_sync_time IS NOT NULL;` |
---
## 11. 升级前后对比
### 升级前
```
ERP MOM
┌──────────┐ ┌──────────────┐
│ sl_order │──(只传编码)──────►│ pro_workorder │
│ sl_line │ │ .source_code │
└──────────┘ └──────────────┘
┌──────────┐ ┌──────────────┐
│ po_order │──(只传编码)──────►│wm_arrival_ │
│ po_line │ │ notice.po_code│
└──────────┘ └──────────────┘
┌──────────┐ ┌──────────────┐
│ mp_plan │──(转成工单)──────►│ pro_workorder │
│ mp_mbom │ │ (丢失计划信息)│
└──────────┘ └──────────────┘
```
### 升级后
```
ERP MOM
┌──────────┐ ┌───────────┐ ┌──────────────┐
│ sl_order │──►│erp_sl_order│──►│ pro_workorder │
│ sl_line │ │erp_sl_line │ │ .plan_code │
└──────────┘ └───────────┘ │ .pp_number │
│ .delivery_date│
┌──────────┐ ┌───────────┐ └──────┬───────┘
│ po_order │──►│erp_po_order│──►│wm_item_recpt │
│ po_line │ │erp_po_line │ │.po_order_id │
└──────────┘ └───────────┘ └──────────────┘
┌──────────┐ ┌───────────┐ ┌──────────────┐
│ mp_plan │──►│erp_mp_plan │──►│ pro_workorder │
│ mp_mbom │ │erp_mp_mbom │ │ .plan_code │
│ mp_purch │ │erp_mp_purch│ │ .bom_version │
└──────────┘ └───────────┘ └──────────────┘
```
**升级收益**: MOM系统获得完整的计划层数据镜像可实现订单交期可视化、采购进度追踪、计划-执行全链路追溯同时不破坏MOM原有的生产执行数据结构。
---
## 修订历史
| 版本 | 日期 | 修订内容 | 修订人 |
|------|------|----------|--------|
| 1.0.0 | 2026-02-06 | 初始版本 | System |
| 1.0.1 | 2026-02-06 | 新表前缀由 mom_ 统一改为 erp_与已有ERP同步表命名一致 | System |
| 1.1.0 | 2026-02-07 | 与ERP同名字段补齐对照《erp数据库设计-数据字典》及 DDL对 erp_sl_order/line、erp_po_order/line、erp_mp_plan/line、erp_mp_mbom、erp_mp_mbom_line、erp_mp_purchase 补齐ERP中已有字段采购表统一为 supplier_id/code/name销售明细 track_code/contract_line_id/unit_id/unit_price/amount/quality_req补全 erp_mp_mbom_line 的 DDL | System |

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@@ -0,0 +1,275 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
从 mom系统数据库设计.xlsx 读取表与字段定义,更新 mom系统数据库设计-数据模型.md。
保留 md 的 1-3 节(概述、模块清单、公共字段)和 14 节及以后枚举、ER、附录等
用 Excel 内容更新 2.2 表清单总览 和 4-13 节各模块表结构。
"""
import re
from pathlib import Path
try:
import openpyxl
except ImportError:
raise SystemExit("请安装 openpyxl: pip install openpyxl")
# 路径
BASE = Path(__file__).resolve().parent
XLSX_PATH = BASE / "mom系统数据库设计.xlsx"
MD_PATH = BASE / "mom系统数据库设计-数据模型.md"
# Excel 表清单中的「模块」-> 文档中的 (节号, 模块标题, 表前缀)
# 节号与原文一致: 4基础数据 5生产 6质量 7设备 8仓库 9排班 10IOT 11工具 12系统 13打印
MODULE_DOC = {
"主数据管理": (4, "基础数据模块", "md_*"),
"生产管理": (5, "生产管理模块", "pro_*"),
"质量管理": (6, "质量管理模块", "qc_*"),
"设备管理": (7, "设备管理模块", "dv_*"),
"仓储管理": (8, "仓库管理模块", "wm_*"),
"排班管理": (9, "排班管理模块", "cal_*"),
"IoT数据采集": (10, "IoT数据采集模块", "iot_*"),
"工装夹具管理": (11, "工具管理模块", "tm_*"),
"系统管理": (12, "系统管理模块", "sys_*"),
"打印机配置": (13, "打印管理模块", "print_*"),
}
# Excel 工作表名 -> 表清单中的模块名
SHEET_TO_MODULE = {
"MD主数据": "主数据管理",
"PRO生产管理": "生产管理",
"CAL排班管理": "排班管理",
"QC质量管理": "质量管理",
"WM仓储管理": "仓储管理",
"DV设备管理": "设备管理",
"TM工装夹具管理": "工装夹具管理",
"MO模具管理": None,
"SYS系统管理": "系统管理",
"PRINT打印管理": "打印机配置",
"IOT数采": "IoT数据采集",
}
def load_table_list(wb):
"""从「表清单」sheet 加载 (表名, 模块, 表描述, 备注),并建 (模块, 表描述)->表名 映射"""
ws = wb["表清单"]
rows = list(ws.iter_rows(min_row=2, values_only=True))
table_list = []
desc_to_name = {}
for row in rows:
if not row or not row[1]:
continue
name = (row[1] or "").strip()
module = (row[2] or "").strip()
desc = (row[3] or "").strip()
remark = (row[4] or "").strip() if len(row) > 4 else ""
if not name:
continue
table_list.append((name, module, desc, remark))
if module and desc:
key = (module, desc)
if key not in desc_to_name:
desc_to_name[key] = name
return table_list, desc_to_name
def parse_sheet_tables(ws, module_name, desc_to_name):
"""
解析一个 sheet 中所有表块。
每个表块:一行 表名称 + 一行 中文名称 + 一行 列序号|列名|列中文名|列类型|列设置|备注 + 数据行。
返回 [(table_name, cn_name, remark, columns), ...]
"""
rows = list(ws.iter_rows(values_only=True))
result = []
i = 0
while i < len(rows):
row = list(rows[i]) if rows[i] else []
# 找「表名称」在第二列
if len(row) >= 3 and row[1] == "表名称" and row[2]:
excel_table_name = (row[2] or "").strip()
cn_name = ""
if i + 1 < len(rows):
next_row = list(rows[i + 1]) if rows[i + 1] else []
if len(next_row) >= 3 and next_row[1] == "中文名称":
cn_name = (next_row[2] or "").strip()
# 表名解析:优先用 表清单 中 (模块, 中文名称) 对应的表名
if module_name and cn_name and (module_name, cn_name) in desc_to_name:
table_name = desc_to_name[(module_name, cn_name)]
else:
table_name = excel_table_name if excel_table_name and len(excel_table_name) > 2 else (cn_name or excel_table_name)
# 列头在 i+2
col_start = i + 2
if col_start >= len(rows):
i += 1
continue
header = list(rows[col_start]) if rows[col_start] else []
if len(header) < 5 or header[1] != "列序号":
i += 1
continue
columns = []
for j in range(col_start + 1, len(rows)):
r = list(rows[j]) if rows[j] else []
if len(r) < 4:
break
col_no, col_name, col_cn, col_type, col_setting, col_remark = (
r[1], r[2] if len(r) > 2 else "", r[3] if len(r) > 3 else "",
r[4] if len(r) > 4 else "", r[5] if len(r) > 5 else "", r[6] if len(r) > 6 else ""
)
if col_name is None or not str(col_name).strip():
break
col_name = str(col_name).strip()
col_type = (col_type or "").strip()
nullable = "N" if col_setting and "not null" in str(col_setting).lower() else "Y"
desc = (col_cn or "").strip()
if col_remark and str(col_remark).strip():
desc = desc + " " + str(col_remark).strip()
columns.append({
"name": col_name.lower(),
"type": col_type or "-",
"nullable": nullable,
"desc": desc or "-",
})
result.append((table_name, cn_name, "", columns))
i = col_start + len(columns) + 1
continue
i += 1
return result
def collect_all_tables(wb, table_list, desc_to_name):
"""从各数据 sheet 收集表,按模块归类。返回 { 模块名: [(表名, 中文名, 备注, columns), ...] }"""
by_module = {}
for sheet_name in wb.sheetnames:
if sheet_name == "表清单":
continue
module_name = SHEET_TO_MODULE.get(sheet_name)
if not module_name or module_name not in MODULE_DOC:
continue
ws = wb[sheet_name]
tables = parse_sheet_tables(ws, module_name, desc_to_name)
for t in tables:
by_module.setdefault(module_name, []).append(t)
return by_module
def table_name_to_lower(name):
"""将 Excel 表名转为小写(如 WM_WAREHOUSE -> wm_warehouse"""
if not name:
return name
return name.strip().lower()
def gen_table_list_md(table_list):
"""生成 2.2 表清单总览 markdown"""
module_order = list(MODULE_DOC.keys())
# 模块简写(用于表格第三列)
module_short = {
"主数据管理": "基础数据",
"生产管理": "生产管理",
"质量管理": "质量管理",
"设备管理": "设备管理",
"仓储管理": "仓库管理",
"排班管理": "排班管理",
"IoT数据采集": "IoT数据采集",
"工装夹具管理": "工具管理",
"系统管理": "系统管理",
"打印机配置": "打印管理",
}
lines = [
"### 2.2 表清单总览",
"",
"| 序号 | 表名 | 中文名 | 模块 |",
"|------|------|--------|------|",
]
for idx, (name, module, desc, _) in enumerate(table_list, 1):
short = module_short.get(module, module)
cn_display = (desc or "").strip() or name # 表描述为空时用表名
lines.append(f"| {idx} | {table_name_to_lower(name)} | {cn_display} | {short} |")
lines.append("")
return "\n".join(lines)
def gen_module_section(module_name, tables, section_num):
"""生成一个模块的 markdown## 4. 基础数据模块 及下属 ### 4.x 表)"""
if not tables:
return ""
title = MODULE_DOC[module_name][1]
lines = [
f"## {section_num}. {title}",
"",
]
for idx, (table_name, cn_name, remark, columns) in enumerate(tables, 1):
tname_lower = table_name_to_lower(table_name)
lines.append(f"### {section_num}.{idx} {cn_name or table_name} ({tname_lower})")
lines.append("")
if remark:
lines.append(f"> {remark}")
lines.append("")
lines.append("| 字段名 | 类型 | 允许空 | 说明 |")
lines.append("|--------|------|--------|------|")
for col in columns:
lines.append(f"| {col['name']} | {col['type']} | {col['nullable']} | {col['desc']} |")
lines.append("")
lines.append("---")
lines.append("")
return "\n".join(lines)
def main():
if not XLSX_PATH.exists():
raise SystemExit(f"Excel 文件不存在: {XLSX_PATH}")
if not MD_PATH.exists():
raise SystemExit(f"Markdown 文件不存在: {MD_PATH}")
wb = openpyxl.load_workbook(XLSX_PATH, read_only=True, data_only=True)
table_list, desc_to_name = load_table_list(wb)
by_module = collect_all_tables(wb, table_list, desc_to_name)
wb.close()
# 生成 2.2 表清单
table_list_md = gen_table_list_md(table_list)
# 生成 4-12 节(按 MODULE_DOC 顺序)
module_sections = []
for mod_name in MODULE_DOC:
if mod_name not in by_module:
continue
num, _, _ = MODULE_DOC[mod_name]
module_sections.append(gen_module_section(mod_name, by_module[mod_name], num))
new_content_4_13 = "\n".join(module_sections)
# 读取现有 md
md_text = MD_PATH.read_text(encoding="utf-8")
# 替换 2.2 表清单总览:从 ### 2.2 表清单总览 到下一个 ## 之前
def replace_2_2(content):
start = content.find("### 2.2 表清单总览")
if start == -1:
return content
end = content.find("\n## ", start + 1)
if end == -1:
end = len(content)
return content[:start] + table_list_md.rstrip() + "\n\n" + content[end:]
md_text = replace_2_2(md_text)
# 替换 ## 4. ... 到 ## 14. 之前
start_marker = "## 4. 基础数据模块"
end_marker = "\n## 14. 枚举值定义"
start = md_text.find(start_marker)
end = md_text.find(end_marker)
if start == -1:
raise SystemExit("未找到「## 4. 基础数据模块」")
if end == -1:
end = len(md_text)
md_text = md_text[:start] + new_content_4_13.rstrip() + "\n\n" + md_text[end:]
MD_PATH.write_text(md_text, encoding="utf-8")
print(f"已更新: {MD_PATH}")
print(f" - 表清单: {len(table_list)} 张表")
for mod_name, tbls in by_module.items():
print(f" - {mod_name}: {len(tbls)} 张表")
if __name__ == "__main__":
main()

View File

@@ -0,0 +1,200 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
从 mom-db-260206.sql 解析 CREATE TABLE 定义,更新 mom系统数据库设计-数据模型.md。
用实际 DDL 中的表、字段、类型、允许空、注释 覆盖文档中的 2.2 表清单 和 4-13 节表结构。
"""
import re
from pathlib import Path
from collections import OrderedDict
BASE = Path(__file__).resolve().parent
SQL_PATH = BASE / "mom-db-260206.sql"
MD_PATH = BASE / "mom系统数据库设计-数据模型.md"
# 表前缀 -> (节号, 模块标题),仅 4-13 与文档一致erp_/mo_ 等归入“其他”不单独成节
PREFIX_TO_MODULE = [
("md_", 4, "基础数据模块"),
("pro_", 5, "生产管理模块"),
("qc_", 6, "质量管理模块"),
("dv_", 7, "设备管理模块"),
("wm_", 8, "仓库管理模块"),
("cal_", 9, "排班管理模块"),
("iot_", 10, "IoT数据采集模块"),
("tm_", 11, "工具管理模块"),
("sys_", 12, "系统管理模块"),
("print_", 13, "打印管理模块"),
("erp_", None, None),
("mo_", None, None),
("gen_", None, None),
("report_", None, None),
]
def table_module(table_name):
"""返回 (节号, 模块标题) 或 (None, None)"""
t = table_name.lower()
for prefix, num, title in PREFIX_TO_MODULE:
if num is not None and t.startswith(prefix):
return (num, title)
return (None, None)
def parse_sql(path):
"""解析 SQL 文件,返回 [(table_name, table_comment, columns), ...]."""
text = path.read_text(encoding="utf-8")
tables = []
i = 0
while True:
i = text.find("CREATE TABLE ", i)
if i == -1:
break
# 表名: CREATE TABLE `name` (
name_m = re.match(r"CREATE\s+TABLE\s+`([^`]+)`\s*\(", text[i:], re.IGNORECASE)
if not name_m:
i += 1
continue
name = name_m.group(1).strip()
paren_start = i + name_m.end() - 1 # position of '('
# 找匹配的 ')'
depth = 1
pos = paren_start + 1
while pos < len(text) and depth > 0:
if text[pos] == "(":
depth += 1
elif text[pos] == ")":
depth -= 1
pos += 1
body = text[paren_start + 1 : pos - 1]
# 表注释: ) ENGINE=... COMMENT='...'
rest = text[pos - 1 : pos + 200]
comment_m = re.search(r"COMMENT\s*=\s*'([^']*)'", rest)
table_comment = comment_m.group(1).strip() if comment_m else ""
columns = parse_columns(body)
tables.append((name, table_comment, columns))
i = pos
return tables
def parse_columns(body):
"""从 CREATE TABLE 体解析列: `name` type NOT NULL ... COMMENT '...', 跳过 PRIMARY KEY/KEY/UNIQUE."""
lines = [ln.strip() for ln in body.split("\n") if ln.strip()]
cols = []
for line in lines:
if line.startswith("PRIMARY KEY") or line.startswith("KEY ") or line.startswith("UNIQUE KEY"):
continue
if not line.startswith("`"):
continue
# 列行: `col_name` type [NOT NULL] [NULL] [AUTO_INCREMENT] [DEFAULT ...] [COMMENT '...'],
match = re.match(r"`([^`]+)`\s+([a-z]+(?:\([^)]+\))?)\s*(NOT NULL|NULL)?", line, re.IGNORECASE)
if not match:
continue
col_name = match.group(1)
col_type = match.group(2)
not_null = match.group(3)
nullable = "N" if (not_null and not_null.upper() == "NOT NULL") else "Y"
# COMMENT: 找 COMMENT '...',注意可能 '' 转义
comment_match = re.search(r"COMMENT\s+'((?:[^']|'')*)'", line)
comment = comment_match.group(1).replace("''", "'").strip() if comment_match else "-"
cols.append({"name": col_name, "type": col_type, "nullable": nullable, "comment": comment or "-"})
return cols
def build_table_list_and_sections(tables):
"""按模块分组,生成 2.2 表清单和 4-13 节内容。仅包含 4-13 模块表其他表erp_/mo_/gen_ 等)仍入表清单模块「其他」."""
by_module = OrderedDict()
table_list = []
for name, comment, columns in tables:
num, title = table_module(name)
if num is not None:
by_module.setdefault((num, title), []).append((name, comment, columns))
table_list.append((name, comment, num, title))
else:
if name.startswith(("gen_", "report_", "ureport_", "test_", "db_test")):
continue
table_list.append((name, comment, 99, "其他"))
table_list.sort(key=lambda x: (x[2], x[0]))
return table_list, by_module
def gen_table_list_md(table_list):
"""生成 2.2 表清单总览 markdown."""
module_short = {
4: "基础数据", 5: "生产管理", 6: "质量管理", 7: "设备管理", 8: "仓库管理",
9: "排班管理", 10: "IoT数据采集", 11: "工具管理", 12: "系统管理", 13: "打印管理",
99: "其他",
}
lines = ["### 2.2 表清单总览", "", "| 序号 | 表名 | 中文名 | 模块 |", "|------|------|--------|------|"]
for idx, (name, comment, num, title) in enumerate(table_list, 1):
short = module_short.get(num, title or "其他")
cn = comment or name
lines.append(f"| {idx} | {name} | {cn} | {short} |")
lines.append("")
return "\n".join(lines)
def gen_module_section(module_num, title, tables):
"""生成一个模块的 markdown."""
lines = [f"## {module_num}. {title}", ""]
for idx, (name, comment, columns) in enumerate(tables, 1):
lines.append(f"### {module_num}.{idx} {comment or name} ({name})")
lines.append("")
lines.append("| 字段名 | 类型 | 允许空 | 说明 |")
lines.append("|--------|------|--------|------|")
for col in columns:
lines.append(f"| {col['name']} | {col['type']} | {col['nullable']} | {col['comment']} |")
lines.append("")
lines.append("---")
lines.append("")
return "\n".join(lines)
def main():
if not SQL_PATH.exists():
raise SystemExit(f"SQL 文件不存在: {SQL_PATH}")
if not MD_PATH.exists():
raise SystemExit(f"Markdown 文件不存在: {MD_PATH}")
tables = parse_sql(SQL_PATH)
table_list, by_module = build_table_list_and_sections(tables)
table_list_md = gen_table_list_md(table_list)
section_parts = []
for (num, title), tbls in sorted(by_module.items(), key=lambda x: x[0][0]):
section_parts.append(gen_module_section(num, title, tbls))
new_content_4_13 = "\n".join(section_parts)
md_text = MD_PATH.read_text(encoding="utf-8")
# 替换 2.2 表清单总览
start_22 = md_text.find("### 2.2 表清单总览")
if start_22 != -1:
end_22 = md_text.find("\n## ", start_22 + 1)
if end_22 == -1:
end_22 = len(md_text)
md_text = md_text[:start_22] + table_list_md.rstrip() + "\n\n" + md_text[end_22:]
# 替换 ## 4. 基础数据模块 到 ## 14. 枚举值定义 之间的内容
# 若新增了 14 ERP、15 模具,则替换到 “## 15. 枚举值定义” 或原 “## 14. 枚举值定义” 前
start_marker = "## 4. 基础数据模块"
end_marker = "\n## 14. 枚举值定义"
start = md_text.find(start_marker)
end = md_text.find(end_marker)
if start == -1:
raise SystemExit("未找到「## 4. 基础数据模块」")
if end == -1:
end = len(md_text)
md_text = md_text[:start] + new_content_4_13.rstrip() + "\n\n" + md_text[end:]
MD_PATH.write_text(md_text, encoding="utf-8")
print(f"已更新: {MD_PATH}")
print(f" - 解析表数: {len(tables)}")
print(f" - 表清单: {len(table_list)}")
for (num, title), tbls in sorted(by_module.items(), key=lambda x: x[0][0]):
print(f" - {num}. {title}: {len(tbls)} 张表")
if __name__ == "__main__":
main()