生产管理系统详解:生产管理系统设计与实施文档
生产管理系统设计与实施文档
一、数据库设计
1.1 建表 SQL 脚本
本系统采用 MySQL 数据库,以下是核心表的建表语句。
产品主表 product
CREATE TABLE product (id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,item_code VARCHAR(50) NOT NULL UNIQUE COMMENT '料号',item_name VARCHAR(100) NOT NULL COMMENT '名称',item_type ENUM('raw', 'semi', 'finished') NOT NULL COMMENT '类型:原料/半成品/成品',default_bom_id BIGINT UNSIGNED COMMENT '默认BOM ID',unit VARCHAR(10) NOT NULL COMMENT '单位',enable_flag TINYINT(1) DEFAULT 1 NOT NULL COMMENT '启用标记:1=启用,0=禁用',created_at DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL,updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,INDEX idx_item_code (item_code),CONSTRAINT fk_product_bom FOREIGN KEY (default_bom_id) REFERENCES bom_header(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='产品主表';
工序主数据表 process
-
CREATE TABLE process (id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,process_code VARCHAR(30) NOT NULL UNIQUE COMMENT '工序编码',name VARCHAR(50) NOT NULL COMMENT '工序名称',description VARCHAR(200) COMMENT '描述',default_std_time DECIMAL(8,2) NOT NULL DEFAULT 0.00 COMMENT '默认标准工时(分钟)',enable_flag TINYINT(1) DEFAULT 1 NOT NULL COMMENT '启用标记:1=启用',created_at DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL,INDEX idx_process_code (process_code) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='工序主数据表';
BOM 主表 bom_header
CREATE TABLE bom_header (id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,product_id BIGINT UNSIGNED NOT NULL COMMENT '产品ID',bom_code VARCHAR(50) NOT NULL UNIQUE COMMENT 'BOM编码',version VARCHAR(10) NOT NULL COMMENT '版本号',effect_date DATE NOT NULL COMMENT '生效日期',expire_date DATE COMMENT '失效日期,为空表示长期有效',is_default TINYINT(1) DEFAULT 0 NOT NULL COMMENT '是否默认BOM:1=是,0=否',status ENUM('draft', 'active', 'expired') DEFAULT 'draft' NOT NULL COMMENT '状态',created_at DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL,INDEX idx_product_id (product_id),INDEX idx_bom_code (bom_code),INDEX idx_effect_expire (effect_date, expire_date),CONSTRAINT fk_bom_product FOREIGN KEY (product_id) REFERENCES product(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='BOM主表';
BOM 子件表 bom_item
CREATE TABLE bom_item (id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,bom_header_id BIGINT UNSIGNED NOT NULL COMMENT 'BOM头ID',parent_item_id BIGINT UNSIGNED COMMENT '父项料号,可为空(顶层)',child_item_id BIGINT UNSIGNED NOT NULL COMMENT '子项料号',qty DECIMAL(12,4) NOT NULL COMMENT '用量',loss_rate DECIMAL(5,2) DEFAULT 0.00 NOT NULL COMMENT '损耗率(%)',op_seq_start INT COMMENT '起始工序序号',op_seq_end INT COMMENT '结束工序序号',INDEX idx_bom_header (bom_header_id),INDEX idx_child_item (child_item_id),CONSTRAINT fk_bomitem_header FOREIGN KEY (bom_header_id) REFERENCES bom_header(id),CONSTRAINT fk_bomitem_parent FOREIGN KEY (parent_item_id) REFERENCES product(id),CONSTRAINT fk_bomitem_child FOREIGN KEY (child_item_id) REFERENCES product(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='BOM子件表';
生产线表 prod_line
CREATE TABLE prod_line (id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,line_code VARCHAR(20) NOT NULL UNIQUE COMMENT '线体代码',line_name VARCHAR(50) NOT NULL COMMENT '线体名称',dept VARCHAR(50) COMMENT '所属车间',enable_flag TINYINT(1) DEFAULT 1 NOT NULL COMMENT '启用标记:1=启用',created_at DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL,INDEX idx_line_code (line_code)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='生产线/工艺路线表';
工序 - 生产线关系表 process_line_rel
CREATE TABLE process_line_rel (id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,process_id BIGINT UNSIGNED NOT NULL COMMENT '工序ID',line_id BIGINT UNSIGNED NOT NULL COMMENT '生产线ID',seq SMALLINT NOT NULL COMMENT '在线内顺序',enable_flag TINYINT(1) DEFAULT 1 NOT NULL COMMENT '启用标记',UNIQUE KEY uk_line_seq (line_id, seq),UNIQUE KEY uk_process_line (process_id, line_id),INDEX idx_line_id (line_id),INDEX idx_process_id (process_id),CONSTRAINT fk_plr_process FOREIGN KEY (process_id) REFERENCES process(id),CONSTRAINT fk_plr_line FOREIGN KEY (line_id) REFERENCES prod_line(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='工序-生产线关系表(N:N解耦)';
BOM 绑定工艺路线表 bom_routing
CREATE TABLE bom_routing (id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,bom_header_id BIGINT UNSIGNED NOT NULL COMMENT 'BOM头ID',routing_line_id BIGINT UNSIGNED NOT NULL COMMENT '工艺路线ID(即prod_line.id)',sort_order SMALLINT NOT NULL DEFAULT 1 COMMENT '在BOM中的顺序',enable_flag TINYINT(1) DEFAULT 1 NOT NULL COMMENT '启用标记',UNIQUE KEY uk_bom_line (bom_header_id, routing_line_id),INDEX idx_bom_header (bom_header_id),INDEX idx_routing_line (routing_line_id),CONSTRAINT fk_bomrouting_bom FOREIGN KEY (bom_header_id) REFERENCES bom_header(id),CONSTRAINT fk_bomrouting_line FOREIGN KEY (routing_line_id) REFERENCES prod_line(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='BOM绑定的工艺路线';
生产订单表 prod_order
CREATE TABLE prod_order (id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,order_no VARCHAR(30) NOT NULL UNIQUE COMMENT '内部订单号',source_quote_id BIGINT UNSIGNED COMMENT '来源报价ID',customer VARCHAR(100) NOT NULL COMMENT '客户名称',product_id BIGINT UNSIGNED NOT NULL COMMENT '产品ID',qty_total DECIMAL(12,2) NOT NULL COMMENT '订单数量',delivery_date DATE NOT NULL COMMENT '交货日期',bom_header_id BIGINT UNSIGNED COMMENT '使用的BOM ID(优先于version)',status ENUM('draft', 'released', 'completed', 'cancelled') DEFAULT 'draft' NOT NULL,created_at DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL,created_by BIGINT UNSIGNED COMMENT '创建人ID',INDEX idx_order_no (order_no),INDEX idx_product_id (product_id),INDEX idx_delivery_date (delivery_date),CONSTRAINT fk_order_product FOREIGN KEY (product_id) REFERENCES product(id),CONSTRAINT fk_order_bom FOREIGN KEY (bom_header_id) REFERENCES bom_header(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='生产订单表';
生产任务单表 prod_task
CREATE TABLE prod_task (id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,prod_order_id BIGINT UNSIGNED NOT NULL COMMENT '所属订单ID',task_no VARCHAR(30) NOT NULL UNIQUE COMMENT '任务单号',product_id BIGINT UNSIGNED NOT NULL COMMENT '产品ID',qty DECIMAL(12,2) NOT NULL COMMENT '任务数量',plan_start DATE COMMENT '计划开工',plan_end DATE COMMENT '计划完工',status ENUM('pending', 'planned', 'in_progress', 'completed', 'cancelled') DEFAULT 'pending' NOT NULL,created_at DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL,INDEX idx_task_no (task_no),INDEX idx_order_id (prod_order_id),CONSTRAINT fk_task_order FOREIGN KEY (prod_order_id) REFERENCES prod_order(id),CONSTRAINT fk_task_product FOREIGN KEY (product_id) REFERENCES product(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='生产任务单表';
任务 - 生产线关系表 task_line
CREATE TABLE task_line (id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,task_id BIGINT UNSIGNED NOT NULL COMMENT '任务ID',line_id BIGINT UNSIGNED NOT NULL COMMENT '生产线ID',seq INT NOT NULL COMMENT '生产顺序',qty_line DECIMAL(12,2) NOT NULL COMMENT '本线数量',status ENUM('pending', 'assigned', 'in_progress', 'completed') DEFAULT 'pending' NOT NULL,UNIQUE KEY uk_task_line (task_id, line_id),INDEX idx_task_id (task_id),INDEX idx_line_id (line_id),CONSTRAINT fk_taskline_task FOREIGN KEY (task_id) REFERENCES prod_task(id),CONSTRAINT fk_taskline_line FOREIGN KEY (line_id) REFERENCES prod_line(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='生产任务与生产线关系表';
任务工序实例表 task_process
CREATE TABLE task_process (id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,task_id BIGINT UNSIGNED NOT NULL COMMENT '任务单ID',task_line_id BIGINT UNSIGNED NOT NULL COMMENT '任务线ID',process_id BIGINT UNSIGNED NOT NULL COMMENT '工序ID',seq SMALLINT NOT NULL COMMENT '工序顺序',plan_start DATETIME NOT NULL COMMENT '计划开始',plan_end DATETIME NOT NULL COMMENT '计划结束',actual_start DATETIME COMMENT '实际开始',actual_end DATETIME COMMENT '实际结束',status ENUM('pending', 'in_progress', 'completed', 'paused') DEFAULT 'pending' NOT NULL,std_time DECIMAL(8,2) NOT NULL COMMENT '标准工时(分钟)',owner_user_id BIGINT UNSIGNED COMMENT '工序负责人',INDEX idx_task_line (task_line_id),INDEX idx_process_id (process_id),INDEX idx_status (status),CONSTRAINT fk_taskproc_task FOREIGN KEY (task_id) REFERENCES prod_task(id),CONSTRAINT fk_taskproc_linetask FOREIGN KEY (task_line_id) REFERENCES task_line(id),CONSTRAINT fk_taskproc_process FOREIGN KEY (process_id) REFERENCES process(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='生产任务工序实例表';
CREATE TABLE prod_part (id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,task_line_id BIGINT UNSIGNED NOT NULL COMMENT '任务线ID',part_name VARCHAR(100) NOT NULL COMMENT '部件名称',material VARCHAR(50) COMMENT '材质',length DECIMAL(8,2) COMMENT '长度(mm)',width DECIMAL(8,2) COMMENT '宽度(mm)',thick DECIMAL(8,2) COMMENT '厚度(mm)',qty DECIMAL(10,2) NOT NULL COMMENT '数量',unit VARCHAR(10) NOT NULL COMMENT '单位',INDEX idx_task_line (task_line_id),CONSTRAINT fk_prodp_taskline FOREIGN KEY (task_line_id) REFERENCES task_line(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='生产任务部件表';
物料需求表 material_requirement
CREATE TABLE material_requirement (id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,prod_order_id BIGINT UNSIGNED COMMENT '订单ID',task_id BIGINT UNSIGNED COMMENT '任务ID',line_id BIGINT UNSIGNED COMMENT '生产线ID',material_id BIGINT UNSIGNED NOT NULL COMMENT '物料ID',spec VARCHAR(100) COMMENT '规格描述',qty_required DECIMAL(12,2) NOT NULL COMMENT '需求数量',qty_on_hand DECIMAL(12,2) DEFAULT 0.00 NOT NULL COMMENT '库存数量',qty_ordered DECIMAL(12,2) DEFAULT 0.00 NOT NULL COMMENT '已采数量',status ENUM('open', 'partial', 'fulfilled', 'cancelled') DEFAULT 'open' NOT NULL,INDEX idx_material (material_id),INDEX idx_order_task (prod_order_id, task_id),CONSTRAINT fk_mr_order FOREIGN KEY (prod_order_id) REFERENCES prod_order(id),CONSTRAINT fk_mr_task FOREIGN KEY (task_id) REFERENCES prod_task(id),CONSTRAINT fk_mr_line FOREIGN KEY (line_id) REFERENCES prod_line(id),CONSTRAINT fk_mr_material FOREIGN KEY (material_id) REFERENCES product(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='物料需求表';
生产报工表 prod_report
CREATE TABLE prod_report (id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,task_line_id BIGINT UNSIGNED NOT NULL COMMENT '任务线ID',process_id BIGINT UNSIGNED NOT NULL COMMENT '工序ID',worker_id BIGINT UNSIGNED NOT NULL COMMENT '员工ID',qty_good DECIMAL(12,2) NOT NULL COMMENT '合格数',qty_scrap DECIMAL(12,2) NOT NULL DEFAULT 0.00 COMMENT '废品数',start_time DATETIME NOT NULL COMMENT '开始时间',end_time DATETIME NOT NULL COMMENT '结束时间',wage_flag TINYINT(1) DEFAULT 0 NOT NULL COMMENT '已结算标记:0=未结算,1=已结算',INDEX idx_task_process (task_line_id, process_id),INDEX idx_worker (worker_id),INDEX idx_wage_flag (wage_flag),CONSTRAINT fk_report_taskline FOREIGN KEY (task_line_id) REFERENCES task_line(id),CONSTRAINT fk_report_process FOREIGN KEY (process_id) REFERENCES process(id)-- worker_id 外键需关联 worker 表(假设存在)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='生产报工表';
工资计算结果表 wage_calc
CREATE TABLE wage_calc (id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,worker_id BIGINT UNSIGNED NOT NULL COMMENT '员工ID',task_line_id BIGINT UNSIGNED COMMENT '任务线ID',process_id BIGINT UNSIGNED COMMENT '工序ID',qty_basis DECIMAL(12,2) NOT NULL COMMENT '计薪数量(通常为合格数)',unit_price DECIMAL(10,4) NOT NULL COMMENT '单价(元/单位)',amount DECIMAL(12,2) NOT NULL COMMENT '金额',calc_date DATE NOT NULL COMMENT '计算日期',report_id BIGINT UNSIGNED NOT NULL COMMENT '关联的报工记录ID',UNIQUE KEY uk_report_id (report_id), -- 防止重复结算INDEX idx_worker_date (worker_id, calc_date),INDEX idx_calc_date (calc_date),CONSTRAINT fk_wage_worker FOREIGN KEY (worker_id) REFERENCES worker(id),CONSTRAINT fk_wage_taskline FOREIGN KEY (task_line_id) REFERENCES task_line(id),CONSTRAINT fk_wage_process FOREIGN KEY (process_id) REFERENCES process(id),CONSTRAINT fk_wage_report FOREIGN KEY (report_id) REFERENCES prod_report(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='工资计算结果表';
员工表 worker
CREATE TABLE worker (id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,emp_code VARCHAR(20) NOT NULL UNIQUE,name VARCHAR(50) NOT NULL,dept VARCHAR(50),position VARCHAR(50),enable_flag TINYINT(1) DEFAULT 1,created_at DATETIME DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
枚举字典表 dict
CREATE TABLE dict (id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,type VARCHAR(50) NOT NULL COMMENT '类型,如 order_status, task_status',code VARCHAR(50) NOT NULL COMMENT '编码',value VARCHAR(100) NOT NULL COMMENT '显示值',sort_order INT DEFAULT 0,UNIQUE KEY uk_type_code (type, code)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
效果演示:
http://dms.demo.07fly.xyz
开源地址:
https://gitee.com/07fly/07flyadmin
如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!
