This commit is contained in:
zlwu committed 2026-07-20 10:50:26 +08:00
1 parent 6d9354a194
commit aff71d296b
2759 files changed
+860425 -13211

No files matched your search

@@ -0,0 +1,182 @@
-- PL 入库单 / 出库单(主从表)+ 菜单「运输管理 → 库存管理 → 入库单/出库单」
-- Spec: docs/superpowers/specs/2026-07-19-pl-inbound-outbound-order-design.md
-- ── 1. 入库主表 ──
CREATE TABLE IF NOT EXISTS `pl_inbound_order` (
`id` varchar(64) NOT NULL COMMENT '主键ID',
`order_no` varchar(32) NOT NULL COMMENT '入库单号',
`plan_id` varchar(64) NOT NULL COMMENT '运输计划ID',
`transport_id` varchar(64) NOT NULL COMMENT '运输单ID',
`status` varchar(20) NOT NULL DEFAULT 'in_progress' COMMENT 'in_progress/completed/voided',
`partner_company` varchar(200) DEFAULT NULL COMMENT '往来单位快照',
`vehicle_no` varchar(32) DEFAULT NULL COMMENT '车牌快照',
`plan_no` varchar(64) DEFAULT NULL COMMENT '计划号快照',
`plan_date` date DEFAULT NULL COMMENT '计划日期快照',
`site_access_token` varchar(64) NOT NULL COMMENT '现场免登录令牌',
`site_feedback_remark` varchar(500) DEFAULT NULL COMMENT '现场备注',
`site_feedback_images` text COMMENT '现场附件URLs(JSON数组)',
`site_feedback_time` datetime DEFAULT NULL COMMENT '最近现场提交时间',
`site_first_submitted_at` datetime DEFAULT NULL COMMENT '首次现场提交时间',
`tenant_no` varchar(64) NOT NULL DEFAULT 'shanxia2.0' COMMENT '租户编号',
`order_num` int(11) DEFAULT NULL COMMENT '排序号',
`remark` varchar(512) DEFAULT NULL COMMENT '备注',
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
`create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_pl_inbound_order_no` (`tenant_no`,`order_no`),
UNIQUE KEY `uk_pl_inbound_site_token` (`site_access_token`),
KEY `idx_pl_inbound_plan` (`tenant_no`,`plan_id`),
KEY `idx_pl_inbound_transport` (`tenant_no`,`transport_id`),
KEY `idx_pl_inbound_status` (`tenant_no`,`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='运输计划-入库单';
CREATE TABLE IF NOT EXISTS `pl_inbound_order_item` (
`id` varchar(64) NOT NULL COMMENT '主键ID',
`order_id` varchar(64) NOT NULL COMMENT '入库单ID',
`plan_product_id` varchar(64) NOT NULL COMMENT '计划产品行ID',
`product_id` varchar(64) DEFAULT NULL COMMENT 'CRM产品ID',
`product_name` varchar(200) DEFAULT NULL COMMENT '产品名称快照',
`specification` varchar(200) DEFAULT NULL COMMENT '规格快照',
`unit` varchar(32) DEFAULT NULL COMMENT '单位',
`plan_qty` decimal(15,3) DEFAULT NULL COMMENT '计划数量',
`actual_qty` decimal(15,3) DEFAULT NULL COMMENT '实际数量',
`qty_source` varchar(20) DEFAULT 'plan' COMMENT 'plan/dibang/manual',
`tenant_no` varchar(64) NOT NULL DEFAULT 'shanxia2.0' COMMENT '租户编号',
`order_num` int(11) DEFAULT NULL COMMENT '排序号',
`remark` varchar(512) DEFAULT NULL COMMENT '备注',
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
`create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
PRIMARY KEY (`id`),
KEY `idx_pl_inbound_item_order` (`order_id`),
KEY `idx_pl_inbound_item_plan_prod` (`plan_product_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='运输计划-入库单明细';
-- ── 2. 出库主从表(对称)──
CREATE TABLE IF NOT EXISTS `pl_outbound_order` (
`id` varchar(64) NOT NULL COMMENT '主键ID',
`order_no` varchar(32) NOT NULL COMMENT '出库单号',
`plan_id` varchar(64) NOT NULL COMMENT '运输计划ID',
`transport_id` varchar(64) NOT NULL COMMENT '运输单ID',
`status` varchar(20) NOT NULL DEFAULT 'in_progress' COMMENT 'in_progress/completed/voided',
`partner_company` varchar(200) DEFAULT NULL COMMENT '往来单位快照',
`vehicle_no` varchar(32) DEFAULT NULL COMMENT '车牌快照',
`plan_no` varchar(64) DEFAULT NULL COMMENT '计划号快照',
`plan_date` date DEFAULT NULL COMMENT '计划日期快照',
`site_access_token` varchar(64) NOT NULL COMMENT '现场免登录令牌',
`site_feedback_remark` varchar(500) DEFAULT NULL COMMENT '现场备注',
`site_feedback_images` text COMMENT '现场附件URLs(JSON数组)',
`site_feedback_time` datetime DEFAULT NULL COMMENT '最近现场提交时间',
`site_first_submitted_at` datetime DEFAULT NULL COMMENT '首次现场提交时间',
`tenant_no` varchar(64) NOT NULL DEFAULT 'shanxia2.0' COMMENT '租户编号',
`order_num` int(11) DEFAULT NULL COMMENT '排序号',
`remark` varchar(512) DEFAULT NULL COMMENT '备注',
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
`create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_pl_outbound_order_no` (`tenant_no`,`order_no`),
UNIQUE KEY `uk_pl_outbound_site_token` (`site_access_token`),
KEY `idx_pl_outbound_plan` (`tenant_no`,`plan_id`),
KEY `idx_pl_outbound_transport` (`tenant_no`,`transport_id`),
KEY `idx_pl_outbound_status` (`tenant_no`,`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='运输计划-出库单';
CREATE TABLE IF NOT EXISTS `pl_outbound_order_item` (
`id` varchar(64) NOT NULL COMMENT '主键ID',
`order_id` varchar(64) NOT NULL COMMENT '出库单ID',
`plan_product_id` varchar(64) NOT NULL COMMENT '计划产品行ID',
`product_id` varchar(64) DEFAULT NULL COMMENT 'CRM产品ID',
`product_name` varchar(200) DEFAULT NULL COMMENT '产品名称快照',
`specification` varchar(200) DEFAULT NULL COMMENT '规格快照',
`unit` varchar(32) DEFAULT NULL COMMENT '单位',
`plan_qty` decimal(15,3) DEFAULT NULL COMMENT '计划数量',
`actual_qty` decimal(15,3) DEFAULT NULL COMMENT '实际数量',
`qty_source` varchar(20) DEFAULT 'plan' COMMENT 'plan/dibang/manual',
`tenant_no` varchar(64) NOT NULL DEFAULT 'shanxia2.0' COMMENT '租户编号',
`order_num` int(11) DEFAULT NULL COMMENT '排序号',
`remark` varchar(512) DEFAULT NULL COMMENT '备注',
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
`create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
PRIMARY KEY (`id`),
KEY `idx_pl_outbound_item_order` (`order_id`),
KEY `idx_pl_outbound_item_plan_prod` (`plan_product_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='运输计划-出库单明细';
-- ── 3. 菜单:库存管理分组 + 入库单/出库单 ──
INSERT INTO sys_menu (
id, menu_name, parent_id, menu_type, path, component, perms,
is_frame, visible, status, tenant_no, order_num, remark,
create_by, create_dept_id, create_time, update_by, update_time, del_flag
) VALUES
('PL_GROUP_STOCK', '库存管理', 'PL_MENU_ROOT', 'M', 'stock-module', NULL, NULL, 1, '1', '1', 'shanxia2.0', 2, '入库/出库单', 'system', '', NOW(), NULL, NOW(), 0),
('PL_INBOUND', '入库单', 'PL_GROUP_STOCK', 'C', 'inbound', 'pl/inbound/index', 'pl:inbound:list', 1, '1', '1', 'shanxia2.0', 1, NULL, 'system', '', NOW(), NULL, NOW(), 0),
('PL_OUTBOUND', '出库单', 'PL_GROUP_STOCK', 'C', 'outbound', 'pl/outbound/index', 'pl:outbound:list', 1, '1', '1', 'shanxia2.0', 2, NULL, 'system', '', NOW(), NULL, NOW(), 0),
('PL_INBOUND_Q', '查询', 'PL_INBOUND', 'F', '', '', 'pl:inbound:query', 1, '1', '1', 'shanxia2.0', 1, NULL, 'system', '', NOW(), NULL, NOW(), 0),
('PL_INBOUND_E', '编辑', 'PL_INBOUND', 'F', '', '', 'pl:inbound:edit', 1, '1', '1', 'shanxia2.0', 2, NULL, 'system', '', NOW(), NULL, NOW(), 0),
('PL_OUTBOUND_Q', '查询', 'PL_OUTBOUND', 'F', '', '', 'pl:outbound:query', 1, '1', '1', 'shanxia2.0', 1, NULL, 'system', '', NOW(), NULL, NOW(), 0),
('PL_OUTBOUND_E', '编辑', 'PL_OUTBOUND', 'F', '', '', 'pl:outbound:edit', 1, '1', '1', 'shanxia2.0', 2, NULL, 'system', '', NOW(), NULL, NOW(), 0)
ON DUPLICATE KEY UPDATE
menu_name = VALUES(menu_name),
parent_id = VALUES(parent_id),
path = VALUES(path),
component = VALUES(component),
perms = VALUES(perms),
order_num = VALUES(order_num),
update_time = NOW();
-- 购买证分组排序后移,给库存管理让出 order_num=2
UPDATE sys_menu SET order_num = 3, update_time = NOW() WHERE id = 'PL_GROUP_CERT' AND del_flag = 0;
UPDATE sys_menu SET order_num = 4, update_time = NOW() WHERE id = 'PL_GROUP_FREIGHT' AND del_flag = 0;
UPDATE sys_menu SET order_num = 5, update_time = NOW() WHERE id = 'PL_GROUP_VEHICLE' AND del_flag = 0;
UPDATE sys_menu SET order_num = 6, update_time = NOW() WHERE id = 'PL_GROUP_DOC' AND del_flag = 0;
UPDATE sys_menu SET order_num = 7, update_time = NOW() WHERE id = 'PL_GROUP_BASE' AND del_flag = 0;
-- 拥有运输计划权限的角色,补全库存管理菜单
INSERT INTO sys_role_menu (
id, role_id, menu_id, tenant_no, order_num, remark,
create_by, create_dept_id, create_time, update_by, update_time, del_flag
)
SELECT DISTINCT
CONCAT('PLSTM_', SUBSTRING(MD5(CONCAT(rm.role_id, '-', m.id)), 1, 24)),
rm.role_id,
m.id,
COALESCE(rm.tenant_no, 'shanxia2.0'),
0,
'pl stock menu auto grant',
'system',
'',
NOW(),
NULL,
NOW(),
0
FROM sys_role_menu rm
CROSS JOIN (
SELECT 'PL_GROUP_STOCK' AS id
UNION ALL SELECT 'PL_INBOUND'
UNION ALL SELECT 'PL_OUTBOUND'
UNION ALL SELECT 'PL_INBOUND_Q'
UNION ALL SELECT 'PL_INBOUND_E'
UNION ALL SELECT 'PL_OUTBOUND_Q'
UNION ALL SELECT 'PL_OUTBOUND_E'
) m
WHERE rm.del_flag = 0
AND rm.menu_id IN ('PL_PLAN', 'PL_PLAN_ARCHIVE', 'PL_MENU_ROOT', 'PL_GROUP_PLAN')
AND NOT EXISTS (
SELECT 1 FROM sys_role_menu x
WHERE x.role_id = rm.role_id AND x.menu_id = m.id AND x.del_flag = 0
);