migration_20260719_pl_inbound_outbound_order.sql 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. -- PL 入库单 / 出库单(主从表)+ 菜单「运输管理 → 库存管理 → 入库单/出库单」
  2. -- Spec: docs/superpowers/specs/2026-07-19-pl-inbound-outbound-order-design.md
  3. -- ── 1. 入库主表 ──
  4. CREATE TABLE IF NOT EXISTS `pl_inbound_order` (
  5. `id` varchar(64) NOT NULL COMMENT '主键ID',
  6. `order_no` varchar(32) NOT NULL COMMENT '入库单号',
  7. `plan_id` varchar(64) NOT NULL COMMENT '运输计划ID',
  8. `transport_id` varchar(64) NOT NULL COMMENT '运输单ID',
  9. `status` varchar(20) NOT NULL DEFAULT 'in_progress' COMMENT 'in_progress/completed/voided',
  10. `partner_company` varchar(200) DEFAULT NULL COMMENT '往来单位快照',
  11. `vehicle_no` varchar(32) DEFAULT NULL COMMENT '车牌快照',
  12. `plan_no` varchar(64) DEFAULT NULL COMMENT '计划号快照',
  13. `plan_date` date DEFAULT NULL COMMENT '计划日期快照',
  14. `site_access_token` varchar(64) NOT NULL COMMENT '现场免登录令牌',
  15. `site_feedback_remark` varchar(500) DEFAULT NULL COMMENT '现场备注',
  16. `site_feedback_images` text COMMENT '现场附件URLs(JSON数组)',
  17. `site_feedback_time` datetime DEFAULT NULL COMMENT '最近现场提交时间',
  18. `site_first_submitted_at` datetime DEFAULT NULL COMMENT '首次现场提交时间',
  19. `tenant_no` varchar(64) NOT NULL DEFAULT 'shanxia2.0' COMMENT '租户编号',
  20. `order_num` int(11) DEFAULT NULL COMMENT '排序号',
  21. `remark` varchar(512) DEFAULT NULL COMMENT '备注',
  22. `create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
  23. `create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
  24. `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  25. `update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
  26. `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  27. `del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
  28. PRIMARY KEY (`id`),
  29. UNIQUE KEY `uk_pl_inbound_order_no` (`tenant_no`,`order_no`),
  30. UNIQUE KEY `uk_pl_inbound_site_token` (`site_access_token`),
  31. KEY `idx_pl_inbound_plan` (`tenant_no`,`plan_id`),
  32. KEY `idx_pl_inbound_transport` (`tenant_no`,`transport_id`),
  33. KEY `idx_pl_inbound_status` (`tenant_no`,`status`)
  34. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='运输计划-入库单';
  35. CREATE TABLE IF NOT EXISTS `pl_inbound_order_item` (
  36. `id` varchar(64) NOT NULL COMMENT '主键ID',
  37. `order_id` varchar(64) NOT NULL COMMENT '入库单ID',
  38. `plan_product_id` varchar(64) NOT NULL COMMENT '计划产品行ID',
  39. `product_id` varchar(64) DEFAULT NULL COMMENT 'CRM产品ID',
  40. `product_name` varchar(200) DEFAULT NULL COMMENT '产品名称快照',
  41. `specification` varchar(200) DEFAULT NULL COMMENT '规格快照',
  42. `unit` varchar(32) DEFAULT NULL COMMENT '单位',
  43. `plan_qty` decimal(15,3) DEFAULT NULL COMMENT '计划数量',
  44. `actual_qty` decimal(15,3) DEFAULT NULL COMMENT '实际数量',
  45. `qty_source` varchar(20) DEFAULT 'plan' COMMENT 'plan/dibang/manual',
  46. `tenant_no` varchar(64) NOT NULL DEFAULT 'shanxia2.0' COMMENT '租户编号',
  47. `order_num` int(11) DEFAULT NULL COMMENT '排序号',
  48. `remark` varchar(512) DEFAULT NULL COMMENT '备注',
  49. `create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
  50. `create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
  51. `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  52. `update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
  53. `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  54. `del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
  55. PRIMARY KEY (`id`),
  56. KEY `idx_pl_inbound_item_order` (`order_id`),
  57. KEY `idx_pl_inbound_item_plan_prod` (`plan_product_id`)
  58. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='运输计划-入库单明细';
  59. -- ── 2. 出库主从表(对称)──
  60. CREATE TABLE IF NOT EXISTS `pl_outbound_order` (
  61. `id` varchar(64) NOT NULL COMMENT '主键ID',
  62. `order_no` varchar(32) NOT NULL COMMENT '出库单号',
  63. `plan_id` varchar(64) NOT NULL COMMENT '运输计划ID',
  64. `transport_id` varchar(64) NOT NULL COMMENT '运输单ID',
  65. `status` varchar(20) NOT NULL DEFAULT 'in_progress' COMMENT 'in_progress/completed/voided',
  66. `partner_company` varchar(200) DEFAULT NULL COMMENT '往来单位快照',
  67. `vehicle_no` varchar(32) DEFAULT NULL COMMENT '车牌快照',
  68. `plan_no` varchar(64) DEFAULT NULL COMMENT '计划号快照',
  69. `plan_date` date DEFAULT NULL COMMENT '计划日期快照',
  70. `site_access_token` varchar(64) NOT NULL COMMENT '现场免登录令牌',
  71. `site_feedback_remark` varchar(500) DEFAULT NULL COMMENT '现场备注',
  72. `site_feedback_images` text COMMENT '现场附件URLs(JSON数组)',
  73. `site_feedback_time` datetime DEFAULT NULL COMMENT '最近现场提交时间',
  74. `site_first_submitted_at` datetime DEFAULT NULL COMMENT '首次现场提交时间',
  75. `tenant_no` varchar(64) NOT NULL DEFAULT 'shanxia2.0' COMMENT '租户编号',
  76. `order_num` int(11) DEFAULT NULL COMMENT '排序号',
  77. `remark` varchar(512) DEFAULT NULL COMMENT '备注',
  78. `create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
  79. `create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
  80. `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  81. `update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
  82. `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  83. `del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
  84. PRIMARY KEY (`id`),
  85. UNIQUE KEY `uk_pl_outbound_order_no` (`tenant_no`,`order_no`),
  86. UNIQUE KEY `uk_pl_outbound_site_token` (`site_access_token`),
  87. KEY `idx_pl_outbound_plan` (`tenant_no`,`plan_id`),
  88. KEY `idx_pl_outbound_transport` (`tenant_no`,`transport_id`),
  89. KEY `idx_pl_outbound_status` (`tenant_no`,`status`)
  90. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='运输计划-出库单';
  91. CREATE TABLE IF NOT EXISTS `pl_outbound_order_item` (
  92. `id` varchar(64) NOT NULL COMMENT '主键ID',
  93. `order_id` varchar(64) NOT NULL COMMENT '出库单ID',
  94. `plan_product_id` varchar(64) NOT NULL COMMENT '计划产品行ID',
  95. `product_id` varchar(64) DEFAULT NULL COMMENT 'CRM产品ID',
  96. `product_name` varchar(200) DEFAULT NULL COMMENT '产品名称快照',
  97. `specification` varchar(200) DEFAULT NULL COMMENT '规格快照',
  98. `unit` varchar(32) DEFAULT NULL COMMENT '单位',
  99. `plan_qty` decimal(15,3) DEFAULT NULL COMMENT '计划数量',
  100. `actual_qty` decimal(15,3) DEFAULT NULL COMMENT '实际数量',
  101. `qty_source` varchar(20) DEFAULT 'plan' COMMENT 'plan/dibang/manual',
  102. `tenant_no` varchar(64) NOT NULL DEFAULT 'shanxia2.0' COMMENT '租户编号',
  103. `order_num` int(11) DEFAULT NULL COMMENT '排序号',
  104. `remark` varchar(512) DEFAULT NULL COMMENT '备注',
  105. `create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
  106. `create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
  107. `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  108. `update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
  109. `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  110. `del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
  111. PRIMARY KEY (`id`),
  112. KEY `idx_pl_outbound_item_order` (`order_id`),
  113. KEY `idx_pl_outbound_item_plan_prod` (`plan_product_id`)
  114. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='运输计划-出库单明细';
  115. -- ── 3. 菜单:库存管理分组 + 入库单/出库单 ──
  116. INSERT INTO sys_menu (
  117. id, menu_name, parent_id, menu_type, path, component, perms,
  118. is_frame, visible, status, tenant_no, order_num, remark,
  119. create_by, create_dept_id, create_time, update_by, update_time, del_flag
  120. ) VALUES
  121. ('PL_GROUP_STOCK', '库存管理', 'PL_MENU_ROOT', 'M', 'stock-module', NULL, NULL, 1, '1', '1', 'shanxia2.0', 2, '入库/出库单', 'system', '', NOW(), NULL, NOW(), 0),
  122. ('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),
  123. ('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),
  124. ('PL_INBOUND_Q', '查询', 'PL_INBOUND', 'F', '', '', 'pl:inbound:query', 1, '1', '1', 'shanxia2.0', 1, NULL, 'system', '', NOW(), NULL, NOW(), 0),
  125. ('PL_INBOUND_E', '编辑', 'PL_INBOUND', 'F', '', '', 'pl:inbound:edit', 1, '1', '1', 'shanxia2.0', 2, NULL, 'system', '', NOW(), NULL, NOW(), 0),
  126. ('PL_OUTBOUND_Q', '查询', 'PL_OUTBOUND', 'F', '', '', 'pl:outbound:query', 1, '1', '1', 'shanxia2.0', 1, NULL, 'system', '', NOW(), NULL, NOW(), 0),
  127. ('PL_OUTBOUND_E', '编辑', 'PL_OUTBOUND', 'F', '', '', 'pl:outbound:edit', 1, '1', '1', 'shanxia2.0', 2, NULL, 'system', '', NOW(), NULL, NOW(), 0)
  128. ON DUPLICATE KEY UPDATE
  129. menu_name = VALUES(menu_name),
  130. parent_id = VALUES(parent_id),
  131. path = VALUES(path),
  132. component = VALUES(component),
  133. perms = VALUES(perms),
  134. order_num = VALUES(order_num),
  135. update_time = NOW();
  136. -- 购买证分组排序后移,给库存管理让出 order_num=2
  137. UPDATE sys_menu SET order_num = 3, update_time = NOW() WHERE id = 'PL_GROUP_CERT' AND del_flag = 0;
  138. UPDATE sys_menu SET order_num = 4, update_time = NOW() WHERE id = 'PL_GROUP_FREIGHT' AND del_flag = 0;
  139. UPDATE sys_menu SET order_num = 5, update_time = NOW() WHERE id = 'PL_GROUP_VEHICLE' AND del_flag = 0;
  140. UPDATE sys_menu SET order_num = 6, update_time = NOW() WHERE id = 'PL_GROUP_DOC' AND del_flag = 0;
  141. UPDATE sys_menu SET order_num = 7, update_time = NOW() WHERE id = 'PL_GROUP_BASE' AND del_flag = 0;
  142. -- 拥有运输计划权限的角色,补全库存管理菜单
  143. INSERT INTO sys_role_menu (
  144. id, role_id, menu_id, tenant_no, order_num, remark,
  145. create_by, create_dept_id, create_time, update_by, update_time, del_flag
  146. )
  147. SELECT DISTINCT
  148. CONCAT('PLSTM_', SUBSTRING(MD5(CONCAT(rm.role_id, '-', m.id)), 1, 24)),
  149. rm.role_id,
  150. m.id,
  151. COALESCE(rm.tenant_no, 'shanxia2.0'),
  152. 0,
  153. 'pl stock menu auto grant',
  154. 'system',
  155. '',
  156. NOW(),
  157. NULL,
  158. NOW(),
  159. 0
  160. FROM sys_role_menu rm
  161. CROSS JOIN (
  162. SELECT 'PL_GROUP_STOCK' AS id
  163. UNION ALL SELECT 'PL_INBOUND'
  164. UNION ALL SELECT 'PL_OUTBOUND'
  165. UNION ALL SELECT 'PL_INBOUND_Q'
  166. UNION ALL SELECT 'PL_INBOUND_E'
  167. UNION ALL SELECT 'PL_OUTBOUND_Q'
  168. UNION ALL SELECT 'PL_OUTBOUND_E'
  169. ) m
  170. WHERE rm.del_flag = 0
  171. AND rm.menu_id IN ('PL_PLAN', 'PL_PLAN_ARCHIVE', 'PL_MENU_ROOT', 'PL_GROUP_PLAN')
  172. AND NOT EXISTS (
  173. SELECT 1 FROM sys_role_menu x
  174. WHERE x.role_id = rm.role_id AND x.menu_id = m.id AND x.del_flag = 0
  175. );