1.0.408.sql 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498
  1. -- ===========================================================================
  2. -- S0-FULL-DEMO-COVERAGE-CLOSURE-1 / STEP 2B — MFG / WAREHOUSE / MASTER DATA
  3. --
  4. -- 目标租户:UATTEST_CHL
  5. -- 目标页面:20 页(0 行 → 有数据)
  6. -- 行数:110 = COPY 53 + CONSTRUCT 57
  7. --
  8. -- 数据源(只读,绝不写):
  9. -- @src AIDOP 797…229 主源
  10. -- @src_crc AIDOP-Demo 797…230 仅合同评审周期(唯一存在该数据的租户,且只取完整工厂 …002)
  11. -- 默认租户 1300000000001 全程不作为 seed 源,不读不写
  12. --
  13. -- 幂等:每条 INSERT 均带 NOT EXISTS 业务键 guard,重跑影响行数为 0
  14. --
  15. -- PK 策略(逐表实证 information_schema.COLUMNS.EXTRA):
  16. -- 18 张表为 auto_increment → 不给主键
  17. -- ic_substitute / ado_kitting_exclude_rule → 固定 ID 块 3200000000000xxxxx
  18. -- PriorityCode.RecID varchar(36) → 固定 GUID 字面量(schema 要求 GUID 形态)
  19. --
  20. -- 不含 tenant 的 UK(全表级碰撞风险):
  21. -- uk_ItemPackMaster_domain_itemnum (Domain+ItemNum)
  22. -- → 10 行全部取自实测「目标 Domain 下无占用」的物料集,见 §10
  23. -- IX_LineSkillMaster / IX_LineSkillDetail
  24. -- → 本批不涉及;LineSkill 已整体排除(Site 语义无出处),
  25. -- 另立 S0-LINESKILL-TENANT-UK-CLOSURE-1
  26. -- ===========================================================================
  27. SET @src := (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id = t.OrgId WHERE o.Code = 'AIDOP' AND t.Status = 1 LIMIT 1);
  28. SET @src_crc := (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id = t.OrgId WHERE o.Code = 'AIDOP-Demo' AND t.Status = 1 LIMIT 1);
  29. SET @dst := (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id = t.OrgId WHERE o.Code = 'UATTEST_CHL' AND t.Status = 1 LIMIT 1);
  30. SET @org_dst := (SELECT t.OrgId FROM SysTenant t WHERE t.Id = @dst LIMIT 1);
  31. -- ===========================================================================
  32. -- 01 · PersonSkill COPY 5 (人员技能)
  33. -- 业务键 Code = 101/102/301/501/602
  34. -- rekey:CompanyRefId/FactoryRefId 1000 → 目标租户组织
  35. -- hygiene:Name 去掉 seed 标记 "[DEMO] ",业务名(纵割/工中核心/…)不变
  36. -- ===========================================================================
  37. INSERT INTO PersonSkill (tenant_id, CompanyRefId, FactoryRefId, Code, Name, SkillLevel, Remark, IsEnabled, CreatedAt, UpdatedAt)
  38. SELECT @dst, @org_dst, @org_dst, s.Code,
  39. TRIM(REPLACE(s.Name, '[DEMO]', '')),
  40. s.SkillLevel, s.Remark, 1, NOW(), NOW()
  41. FROM PersonSkill s
  42. WHERE s.tenant_id = @src
  43. AND @src IS NOT NULL AND @dst IS NOT NULL AND @org_dst IS NOT NULL
  44. AND NOT EXISTS (SELECT 1 FROM PersonSkill x
  45. WHERE x.tenant_id = @dst AND x.CompanyRefId = @org_dst
  46. AND x.FactoryRefId = @org_dst AND x.Code = s.Code);
  47. -- ===========================================================================
  48. -- 02 · EmpSkills CONSTRUCT 10 (人员技能维护)
  49. -- 5 名 UAT 真实生产员工 × 各 2 项技能(1 主 4 级 + 1 备 3 级),每技能恰好 2 人
  50. -- Site(工作组)留 NULL —— 源值 "[DEMO]数控组" 不适用于 UAT,且不发明
  51. -- JOIN 保证 Employee / SkillNo 双向 FK 闭合
  52. -- ===========================================================================
  53. INSERT INTO EmpSkills (tenant_id, Employee, EmployeeID, EmployeeName, Site, SkillNo, SkillDescription, SkillLevel, Domain, CreateTime, UpdateTime)
  54. SELECT @dst, c.emp, c.emp, e.Name, NULL, c.skill, p.Name, c.lvl, '8010', NOW(), NOW()
  55. FROM (
  56. SELECT 'RQTJ022' AS emp, '101' AS skill, 4 AS lvl
  57. UNION ALL SELECT 'RQTJ022', '102', 3
  58. UNION ALL SELECT 'RQTJ033', '102', 4
  59. UNION ALL SELECT 'RQTJ033', '301', 3
  60. UNION ALL SELECT 'RQTJ939', '301', 4
  61. UNION ALL SELECT 'RQTJ939', '501', 3
  62. UNION ALL SELECT 'RQTJ940', '501', 4
  63. UNION ALL SELECT 'RQTJ940', '602', 3
  64. UNION ALL SELECT 'RQTJ987', '602', 4
  65. UNION ALL SELECT 'RQTJ987', '101', 3
  66. ) c
  67. JOIN EmployeeMaster e ON e.tenant_id = @dst AND e.Employee = c.emp
  68. JOIN PersonSkill p ON p.tenant_id = @dst AND p.Code = c.skill
  69. WHERE @dst IS NOT NULL
  70. AND NOT EXISTS (SELECT 1 FROM EmpSkills x
  71. WHERE x.tenant_id = @dst AND x.Domain = '8010'
  72. AND x.Employee = c.emp AND x.SkillNo = c.skill);
  73. -- ===========================================================================
  74. -- 03 · ImageType COPY 4 (SOP 文件类型)
  75. -- ★ DEMO-hygiene:image_type_id 是页面「文件类型编码」列直接展示给用户的业务码
  76. -- (SopFileTypeList.vue:15),故 rekey DEMO-SOP-* → UATD-SOP-*
  77. -- 实测 UATD-SOP-* 全库碰撞 = 0
  78. -- ★ 源 domain 存的是 797 组织 Id(字段被误用),rekey 为 '8010'
  79. -- ===========================================================================
  80. INSERT INTO ImageType (tenant_id, image_type_id, descr, domain)
  81. SELECT @dst,
  82. REPLACE(s.image_type_id, 'DEMO-', 'UATD-'),
  83. TRIM(REPLACE(s.descr, '[DEMO]', '')),
  84. '8010'
  85. FROM ImageType s
  86. WHERE s.tenant_id = @src
  87. AND @src IS NOT NULL AND @dst IS NOT NULL
  88. AND NOT EXISTS (SELECT 1 FROM ImageType x
  89. WHERE x.tenant_id = @dst AND x.domain = '8010'
  90. AND x.image_type_id = REPLACE(s.image_type_id, 'DEMO-', 'UATD-'));
  91. -- ===========================================================================
  92. -- 04 · QualitySegmentImage CONSTRUCT 3 (SOP 维护)
  93. -- ★ image_type_id 是 varchar 业务码,按【目标】业务码回绑,
  94. -- 绝不复制源码值;JOIN ImageType 强制目标侧存在
  95. -- item/op 均取自 UAT 真实 Routing
  96. -- ===========================================================================
  97. INSERT INTO QualitySegmentImage (tenant_id, line, item_num, op, image_type_id, descr, rev, sort_id, domain)
  98. SELECT @dst, c.line, c.item, c.op, it.image_type_id, c.descr, 'A.0', c.sort, c.dom
  99. FROM (
  100. SELECT 'M01' AS line, '91HC0497' AS item, '101' AS op, 'UATD-SOP-WI' AS itype, '作业指导书-底板组件安装脚垫' AS descr, 1 AS sort, '8010' AS dom
  101. UNION ALL SELECT 'DD01', '91HC0497', '704', 'UATD-SOP-EQ', '设备操作规程-主机包装', 2, '8010'
  102. UNION ALL SELECT NULL, '3221C0031', '50', 'UATD-SOP-QC', '检验规范-声波清洗', 3, '2410'
  103. ) c
  104. JOIN ImageType it ON it.tenant_id = @dst AND it.image_type_id = c.itype
  105. JOIN ItemMaster i ON i.tenant_id = @dst AND i.ItemNum = c.item
  106. WHERE @dst IS NOT NULL
  107. AND NOT EXISTS (SELECT 1 FROM QualitySegmentImage x
  108. WHERE x.tenant_id = @dst AND x.domain = c.dom
  109. AND x.item_num = c.item AND x.op = c.op
  110. AND x.image_type_id = c.itype);
  111. -- ===========================================================================
  112. -- 05 · PreprocessElementParam COPY 5 (前处理要素参数)
  113. -- 无外部 FK;device_number / message_code 为业务键
  114. -- ★ DEMO-hygiene:device_number(要素编码) 与 message_code(参数编码) 均为
  115. -- PreprocessElementParamList.vue:15/17 直接展示给用户的业务码,
  116. -- 故一并 rekey DEMO-* → UATD-*(源侧字面量仅出现在 SELECT 表达式,
  117. -- 不会成为目标投影值):
  118. -- DEMO-PRE-ELEM-01/02/03 → UATD-PRE-ELEM-01/02/03
  119. -- DEMO-PRE-TEMP/TIME/DRYT/PRESS/SPEED → UATD-PRE-TEMP/TIME/DRYT/PRESS/SPEED
  120. -- 实测 UATD-* 全表碰撞 = 0;两列均无跨表 code 引用(controller 只做关键字检索)
  121. -- descr 去 seed 标记
  122. -- ===========================================================================
  123. INSERT INTO PreprocessElementParam (tenant_id, device_number, device_descr, message_code, code_descr, value_type, std_value, top_limit, low_limit, ufld1, um, domain, create_time, update_time)
  124. SELECT @dst,
  125. REPLACE(s.device_number, 'DEMO-', 'UATD-'),
  126. TRIM(REPLACE(s.device_descr, '[DEMO]', '')),
  127. REPLACE(s.message_code, 'DEMO-', 'UATD-'),
  128. TRIM(REPLACE(s.code_descr, '[DEMO]', '')),
  129. s.value_type, s.std_value, s.top_limit, s.low_limit, s.ufld1, s.um,
  130. '8010', NOW(), NOW()
  131. FROM PreprocessElementParam s
  132. WHERE s.tenant_id = @src
  133. AND @src IS NOT NULL AND @dst IS NOT NULL
  134. AND NOT EXISTS (SELECT 1 FROM PreprocessElementParam x
  135. WHERE x.tenant_id = @dst AND x.domain = '8010'
  136. AND x.device_number = REPLACE(s.device_number, 'DEMO-', 'UATD-')
  137. AND x.message_code = REPLACE(s.message_code, 'DEMO-', 'UATD-'));
  138. -- ===========================================================================
  139. -- 06 · PreprocessElement CONSTRUCT 4 (前处理要素)
  140. -- ★ 已修正:源候选 91HC0497@Op101 = "底板组件安装脚垫",与「前处理/清洗」矛盾,已剔除
  141. -- 改用 UAT Routing 中真实的清洗类工序:
  142. -- 3221C0031@50 声波清洗 / 3124C0015@40 光清洗 / 322AD001@30 洗吹干 / 312CD008@60 清洗
  143. -- 四者 ItemMaster.Domain 与 Routing.Domain 同为 2410,无域歧义
  144. -- line 留 NULL —— UAT 20 条产线均为 8010 装配/包装线,与这些 2410 机加工序不匹配,不发明
  145. -- ===========================================================================
  146. INSERT INTO PreprocessElement (tenant_id, item_num, op, line, typed, item_code, descr, is_main, domain, create_time, update_time)
  147. SELECT @dst, c.item, c.op, NULL, c.typed, c.code, c.descr, 1, '2410', NOW(), NOW()
  148. FROM (
  149. SELECT '3221C0031' AS item, '50' AS op, 'CLEAN' AS typed, 'UATD-PRE-01' AS code, '前处理-声波清洗' AS descr
  150. UNION ALL SELECT '3124C0015', '40', 'CLEAN', 'UATD-PRE-02', '前处理-光清洗'
  151. UNION ALL SELECT '322AD001', '30', 'CLEAN', 'UATD-PRE-03', '前处理-洗吹干'
  152. UNION ALL SELECT '312CD008', '60', 'CLEAN', 'UATD-PRE-04', '前处理-清洗'
  153. ) c
  154. JOIN ItemMaster i ON i.tenant_id = @dst AND i.ItemNum = c.item
  155. WHERE @dst IS NOT NULL
  156. AND NOT EXISTS (SELECT 1 FROM PreprocessElement x
  157. WHERE x.tenant_id = @dst AND x.domain = '2410'
  158. AND x.item_num = c.item AND x.is_main = 1);
  159. -- ===========================================================================
  160. -- 07 · DevMonitor COPY 5 (生产要素参数)
  161. -- ★ 页面 element-param-production 实际读的是 DevMonitor(非 ElementParam 孤儿表)
  162. -- 无外部 FK
  163. -- ★ DEMO-hygiene:DeviceNumber(要素编码) 与 MessageCode(参数编码) 均为
  164. -- ProductionElementParamList.vue:15/17 直接展示给用户的业务码,故一并 rekey:
  165. -- DEMO-ELEM-01/02/03 → UATD-ELEM-01/02/03
  166. -- DEMO-TEMP/PRESS/SPEED/CURR/HUMI → UATD-TEMP/PRESS/SPEED/CURR/HUMI
  167. -- 实测 UATD-* 全表碰撞 = 0;两列均无跨表 code 引用
  168. -- ===========================================================================
  169. INSERT INTO DevMonitor (tenant_id, DeviceNumber, DeviceDescr, MessageCode, CodeDescr, ValueType, StdValue, TopLimit, LowLimit, Ufld1, UM, CodeType, Domain, CreateTime, UpdateTime)
  170. SELECT @dst,
  171. REPLACE(s.DeviceNumber, 'DEMO-', 'UATD-'),
  172. TRIM(REPLACE(s.DeviceDescr, '[DEMO]', '')),
  173. REPLACE(s.MessageCode, 'DEMO-', 'UATD-'),
  174. TRIM(REPLACE(s.CodeDescr, '[DEMO]', '')),
  175. s.ValueType, s.StdValue, s.TopLimit, s.LowLimit, s.Ufld1, s.UM,
  176. s.CodeType, '8010', NOW(), NOW()
  177. FROM DevMonitor s
  178. WHERE s.tenant_id = @src
  179. AND @src IS NOT NULL AND @dst IS NOT NULL
  180. AND NOT EXISTS (SELECT 1 FROM DevMonitor x
  181. WHERE x.tenant_id = @dst AND x.Domain = '8010'
  182. AND x.DeviceNumber = REPLACE(s.DeviceNumber, 'DEMO-', 'UATD-')
  183. AND x.MessageCode = REPLACE(s.MessageCode, 'DEMO-', 'UATD-')
  184. AND x.CodeType = s.CodeType);
  185. -- ===========================================================================
  186. -- 08 · ProdLineDetail CONSTRUCT 6 (生产线物料)
  187. -- ★ 上一轮 12 行已作废:那 4 个物料的工序是冲压/数控/机加工,
  188. -- 而 UAT 20 条产线全是组装/包装/热封线,属不同生产域,语义不成立
  189. -- 改用 UAT 唯一整机装配件 91HC0497(36 道真实装配工序,Item/Routing 同为 Domain 8010)
  190. -- 仅保留 HIGH/MEDIUM 可解释行;601 拷机→能量线 等 LOW 行已删除
  191. -- ===========================================================================
  192. INSERT INTO ProdLineDetail (tenant_id, Part, Op, Site, Line, Rate, SetupTime, OverlapTime, Sequence, StandardStaffCount, IsActive, IsConfirm, Domain, CreateTime, UpdateTime)
  193. SELECT @dst, c.part, c.op, NULL, c.line, NULL, NULL, 0, c.seq, 1, 1, 0, '8010', NOW(), NOW()
  194. FROM (
  195. SELECT '91HC0497' AS part, 101 AS op, 'M01' AS line, 1 AS seq
  196. UNION ALL SELECT '91HC0497', 201, 'P01', 2
  197. UNION ALL SELECT '91HC0497', 301, 'BD01', 3
  198. UNION ALL SELECT '91HC0497', 401, 'BN01', 4
  199. UNION ALL SELECT '91HC0497', 501, 'BD02', 5
  200. UNION ALL SELECT '91HC0497', 704, 'DD01', 6
  201. ) c
  202. JOIN ItemMaster i ON i.tenant_id = @dst AND i.ItemNum = c.part
  203. JOIN LineMaster l ON l.tenant_id = @dst AND l.Line = c.line
  204. WHERE @dst IS NOT NULL
  205. AND NOT EXISTS (SELECT 1 FROM ProdLineDetail x
  206. WHERE x.tenant_id = @dst AND x.Domain = '8010'
  207. AND x.Part = c.part AND x.Op = c.op AND x.Line = c.line);
  208. -- ===========================================================================
  209. -- 09 · ItemOpCondition CONSTRUCT 5 (物料工艺要素)
  210. -- ★ 页面 material-process-element 实际读 ItemOpCondition(非 MaterialProcessElement 孤儿表)
  211. -- UK = tenant+Domain+ItemNum+IsMain+CodeType → 每物料一行
  212. -- Op 全部取自各物料真实 Routing;仅 91HC0497 有可解释产线,其余 Line 留 NULL 不发明
  213. -- ===========================================================================
  214. INSERT INTO ItemOpCondition (tenant_id, ItemNum, Op, Line, Typed, ItemCode, Descr, IsMain, CodeType, Domain, CreateTime, UpdateTime)
  215. SELECT @dst, c.item, c.op, c.line, c.typed, c.code, c.descr, 1, 'Prod', c.dom, NOW(), NOW()
  216. FROM (
  217. SELECT '91HC0497' AS item, '101' AS op, 'M01' AS line, 'ASSY' AS typed, 'UATD-OPC-01' AS code, '底板组件安装脚垫工序生产要素' AS descr, '8010' AS dom
  218. UNION ALL SELECT '3124C0015', '10', NULL, 'PRESS', 'UATD-OPC-02', '压铆苞工序生产要素', '2410'
  219. UNION ALL SELECT '3123C0013', '10', NULL, 'MACH', 'UATD-OPC-03', '胀管工序生产要素', '2410'
  220. UNION ALL SELECT '3221C0031', '10', NULL, 'PRESS', 'UATD-OPC-04', '落片工序生产要素', '2410'
  221. UNION ALL SELECT '3521C0015', '10', NULL, 'GRIND', 'UATD-OPC-05', '磨六面工序生产要素', '2410'
  222. ) c
  223. JOIN ItemMaster i ON i.tenant_id = @dst AND i.ItemNum = c.item
  224. WHERE @dst IS NOT NULL
  225. AND NOT EXISTS (SELECT 1 FROM ItemOpCondition x
  226. WHERE x.tenant_id = @dst AND x.Domain = c.dom
  227. AND x.ItemNum = c.item AND x.IsMain = 1 AND x.CodeType = 'Prod');
  228. -- ===========================================================================
  229. -- 10 · ItemPackMaster CONSTRUCT 10 (零件包装规格)
  230. -- ★ Provenance = UAT_DEMO_SEED,不是真实包装规格:
  231. -- AIDOPB 574 行虽与 UAT 交集 17,但 PackingQty=999999999、净重/长宽高全 0、
  232. -- 类型全 NULL,属占位垃圾;AIDOP 797 交集仅 1 行且同样为占位值 → 拒绝 COPY
  233. -- 包装数量依 ItemType 类别单调分级(RS11 耗材 > RS12 零件 > RS13 附件 > RS30 整机)
  234. -- ★ uk_ItemPackMaster_domain_itemnum 不含 tenant:
  235. -- 10 个物料全部取自实测「Domain 8010 下无占用」的 16 个物料集
  236. -- ===========================================================================
  237. INSERT INTO ItemPackMaster (tenant_id, company_ref_id, factory_ref_id, Domain, ItemNum, PackingType, PackingQty, WeightUM, DimUM, IsActive, IsConfirm, Descr, CreateTime, UpdateTime)
  238. SELECT @dst, @org_dst, @org_dst, '8010', c.item, c.ptype, c.qty, 'KG', 'MM', 1, 0, c.descr, NOW(), NOW()
  239. FROM (
  240. SELECT '91C0D2C' AS item, '中包装' AS ptype, 50 AS qty, '管组件中包装' AS descr
  241. UNION ALL SELECT '91CC0231', '中包装', 50, '管组件中包装'
  242. UNION ALL SELECT '1A03B22', '中包装', 100, '零件中包装'
  243. UNION ALL SELECT '1A0C885', '小包装', 200, '小零件包装'
  244. UNION ALL SELECT '1AB9275', '小包装', 200, '小零件包装'
  245. UNION ALL SELECT '91A0DC9', '中包装', 100, '零件中包装'
  246. UNION ALL SELECT '81HC0497', '整机包装', 10, '主机小批包装'
  247. UNION ALL SELECT '81HC0568', '附件包装', 20, '附件包装'
  248. UNION ALL SELECT '91FC0295', '整机包装', 5, '整机最小包装'
  249. UNION ALL SELECT 'A2C3115', '耗材包装', 1000, '标签耗材大批量包装'
  250. ) c
  251. JOIN ItemMaster i ON i.tenant_id = @dst AND i.ItemNum = c.item
  252. WHERE @dst IS NOT NULL AND @org_dst IS NOT NULL
  253. AND NOT EXISTS (SELECT 1 FROM ItemPackMaster x
  254. WHERE x.Domain = '8010' AND x.ItemNum = c.item);
  255. -- ===========================================================================
  256. -- 11 · ItemSubstituteDetail CONSTRUCT 6 (物料替代)
  257. -- 源 797 的 10 行三个 Item 列与 UAT 交集全部为 0 → 不可 COPY
  258. -- 6 条全部由 UAT 真实 BOM(9 个父件)推导,替代双方均为 UAT 已存在物料
  259. -- 无自替代 / 无 A↔B 反向对 / 无循环
  260. -- ===========================================================================
  261. INSERT INTO ItemSubstituteDetail (tenant_id, ParentItem, ItemNum, SubstituteItem, SubstituteQty, SubstituteType, Remark, Domain, CreateTime, UpdateTime)
  262. SELECT @dst, c.parent, c.orig, c.sub, c.qty, c.stype, c.remark, c.dom, NOW(), NOW()
  263. FROM (
  264. SELECT '91C0D2C' AS parent, '3123C0013' AS orig, '312CD0A' AS sub, 1.000000 AS qty, '替代' AS stype, '同属91C0D2C BOM,描述同为「工(2305H原材料改善后)」,等量替代' AS remark, '8010' AS dom
  265. UNION ALL SELECT '91CC0231', '3123C0014', '3223C0011', 1.000000, '替代', '同属91CC0231 BOM,1405H同规格互换', '8010'
  266. UNION ALL SELECT '3124C0015', '3152C0C7', '3152C0C8', 1.000000, '替代', '同属3124C0015 BOM,4*B0.1*5*D6*50L-4F ↔ 3*B0.1*4*D6*50L-4F 同系列', '2410'
  267. UNION ALL SELECT '3124C0015', '3152B0273', '3152B0274', 1.000000, '替代', '同属3124C0015 BOM,3.0*4D*50L-4T ↔ 2.0*4D*50L-4T 同系列降规格', '2410'
  268. UNION ALL SELECT '3124C0015', '3521C0015', '3521C0016', 1.000000, '替代', '同属3124C0015 BOM,60/45 两款共用件互换', '2410'
  269. UNION ALL SELECT '91C0D2C', '312CD008', '3145C0047', 1.000000, '取代', '同属91C0D2C BOM,F3605H-M ↔ EF3605P 同位取代', '8010'
  270. ) c
  271. JOIN ItemMaster p ON p.tenant_id = @dst AND p.ItemNum = c.parent
  272. JOIN ItemMaster o ON o.tenant_id = @dst AND o.ItemNum = c.orig
  273. JOIN ItemMaster b ON b.tenant_id = @dst AND b.ItemNum = c.sub
  274. WHERE @dst IS NOT NULL
  275. AND NOT EXISTS (SELECT 1 FROM ItemSubstituteDetail x
  276. WHERE x.tenant_id = @dst AND x.Domain = c.dom
  277. AND x.ParentItem = c.parent AND x.ItemNum = c.orig
  278. AND x.SubstituteItem = c.sub);
  279. -- ===========================================================================
  280. -- 12 · ic_substitute CONSTRUCT 5 (选择替代方案)
  281. -- 源 797 的 796 行 substitute_code 为 1003779A 类不可读码、strategy/mode 全 0,
  282. -- 无 demo 价值且与 UAT 物料零交集 → 不 COPY
  283. -- 构造 5 个方案头 = §11 六条替代关系去重后的原物料
  284. -- ★ 该表 PK 非 auto_increment → 固定 ID 块 3200000000000012001..12005
  285. -- ===========================================================================
  286. INSERT INTO ic_substitute (Id, tenant_id, substitute_code, substitute_strategy, substitute_mode, substitute_type, company_id, factory_id, IsDeleted, org_id, create_time, update_time)
  287. SELECT c.new_id, @dst, c.code, 0, 0, 0, @org_dst, @org_dst, 0, @org_dst, NOW(), NOW()
  288. FROM (
  289. SELECT 3200000000000012001 AS new_id, '3123C0013' AS code
  290. UNION ALL SELECT 3200000000000012002, '3123C0014'
  291. UNION ALL SELECT 3200000000000012003, '3152C0C7'
  292. UNION ALL SELECT 3200000000000012004, '3152B0273'
  293. UNION ALL SELECT 3200000000000012005, '3521C0015'
  294. ) c
  295. JOIN ItemMaster i ON i.tenant_id = @dst AND i.ItemNum = c.code
  296. WHERE @dst IS NOT NULL AND @org_dst IS NOT NULL
  297. AND NOT EXISTS (SELECT 1 FROM ic_substitute x
  298. WHERE x.tenant_id = @dst AND x.substitute_code = c.code
  299. AND x.substitute_strategy = 0 AND x.substitute_mode = 0);
  300. -- ===========================================================================
  301. -- 13 · S0ProcessFlowCard CONSTRUCT 4 (工序流转卡)
  302. -- 源 4 行 item_num 与 UAT 交集为 0 → 不可 COPY
  303. -- routing_code 取物料号(实测该表 RoutingCode 即 MaterialCode)
  304. -- ===========================================================================
  305. INSERT INTO S0ProcessFlowCard (tenant_id, company_ref_id, factory_ref_id, domain_code, work_order_no, work_order_batch_no, flow_card_no, nature, item_num, item_name, routing_code, is_active, create_time, update_time)
  306. SELECT @dst, @org_dst, @org_dst, i.Domain, c.wo, '01', c.fc, '正常', c.item, i.Descr, c.item, 1, NOW(), NOW()
  307. FROM (
  308. SELECT 'FC-UATD-0001' AS fc, 'WO-UATD-0001' AS wo, '91HC0497' AS item
  309. UNION ALL SELECT 'FC-UATD-0002', 'WO-UATD-0002', '91C0D2C'
  310. UNION ALL SELECT 'FC-UATD-0003', 'WO-UATD-0003', '91CC0231'
  311. UNION ALL SELECT 'FC-UATD-0004', 'WO-UATD-0004', '3124C0015'
  312. ) c
  313. JOIN ItemMaster i ON i.tenant_id = @dst AND i.ItemNum = c.item
  314. WHERE @dst IS NOT NULL AND @org_dst IS NOT NULL
  315. AND NOT EXISTS (SELECT 1 FROM S0ProcessFlowCard x
  316. WHERE x.tenant_id = @dst AND x.factory_ref_id = @org_dst
  317. AND x.flow_card_no = c.fc);
  318. -- ===========================================================================
  319. -- 14 · wms_rwzp CONSTRUCT 4 (物料状态任务指派)
  320. -- ★ 源 4 行的库位 yskw/mdkw(1000–1005) 实测在 UAT 100% 闭合 → 库位沿用源真实值
  321. -- 但 wlbm(物料)与 sqr(申请人)在 UAT 不存在 → 换 UAT 真实物料与真实生产员工
  322. -- 库位流向业务合理:待检→合格 / 合格→材料 / 材料→辅料 / 不合格→料不良品
  323. -- ===========================================================================
  324. INSERT INTO wms_rwzp (tenant_id, company_ref_id, factory_ref_id, domain_code, tcrq, sqr, rwlx, wlbm, sl, rqpc, yskw, mdkw, xqsj, zt, create_time, update_time)
  325. SELECT @dst, @org_dst, @org_dst, '8010', NOW(), e.Name, c.rwlx, c.wlbm, c.sl, c.rqpc, c.ys, c.md, NOW(), c.zt, NOW(), NOW()
  326. FROM (
  327. SELECT '移库' AS rwlx, '91HC0497' AS wlbm, 10 AS sl, 'UATD-20260828-01' AS rqpc, '1000' AS ys, '1001' AS md, '待处理' AS zt, 'RQTJ022' AS emp
  328. UNION ALL SELECT '上架', '91C0D2C', 50, 'UATD-20260828-02', '1001', '1003', '处理中', 'RQTJ033'
  329. UNION ALL SELECT '领料', '91CC0231', 30, 'UATD-20260828-03', '1003', '1005', '已完成', 'RQTJ939'
  330. UNION ALL SELECT '移库', '1A0C885', 20, 'UATD-20260828-04', '1002', '1004', '待处理', 'RQTJ940'
  331. ) c
  332. JOIN ItemMaster i ON i.tenant_id = @dst AND i.ItemNum = c.wlbm
  333. JOIN EmployeeMaster e ON e.tenant_id = @dst AND e.Employee = c.emp
  334. JOIN LocationMaster ls ON ls.tenant_id = @dst AND ls.location = c.ys
  335. JOIN LocationMaster ld ON ld.tenant_id = @dst AND ld.location = c.md
  336. WHERE @dst IS NOT NULL AND @org_dst IS NOT NULL
  337. AND NOT EXISTS (SELECT 1 FROM wms_rwzp x
  338. WHERE x.tenant_id = @dst AND x.company_ref_id = @org_dst
  339. AND x.factory_ref_id = @org_dst AND x.domain_code = '8010'
  340. AND x.rwlx = c.rwlx AND x.wlbm = c.wlbm AND x.rqpc = c.rqpc
  341. AND x.yskw = c.ys AND x.mdkw = c.md);
  342. -- ===========================================================================
  343. -- 15 · PriorityCode COPY 4 (订单优先级配置)
  344. -- 真实配置:客户优先级/工单加急/工单优先级/工单完工日期
  345. -- ★ RecID 为 varchar(36) GUID 且非 auto_increment → 固定 GUID 字面量(可预先稳定确定)
  346. -- ===========================================================================
  347. INSERT INTO PriorityCode (RecID, tenant_id, Descr, Value, Priority, SourceTable, SourceColumn, OrderBy, IsActive, Domain, CreateTime, UpdateTime)
  348. SELECT c.new_id, @dst, s.Descr, s.Value, s.Priority, s.SourceTable, s.SourceColumn, s.OrderBy, 1, '8010', NOW(), NOW()
  349. FROM PriorityCode s
  350. JOIN (
  351. SELECT '客户优先级' AS d, 'A0000000-0000-4000-8000-000000002B01' AS new_id
  352. UNION ALL SELECT '工单加急', 'A0000000-0000-4000-8000-000000002B02'
  353. UNION ALL SELECT '工单优先级', 'A0000000-0000-4000-8000-000000002B03'
  354. UNION ALL SELECT '工单完工日期', 'A0000000-0000-4000-8000-000000002B04'
  355. ) c ON c.d = s.Descr
  356. WHERE s.tenant_id = @src
  357. AND @src IS NOT NULL AND @dst IS NOT NULL
  358. AND NOT EXISTS (SELECT 1 FROM PriorityCode x
  359. WHERE x.tenant_id = @dst AND x.Descr = s.Descr);
  360. -- ===========================================================================
  361. -- 16 · BarCodeType COPY 6 (标签格式)
  362. -- 无外部 FK;(domain_code, bar_type) 为业务键
  363. -- 必须先于 BarCodeNbr(条码规则的 Type 引用这里)
  364. -- ===========================================================================
  365. INSERT INTO BarCodeType (tenant_id, company_ref_id, factory_ref_id, domain_code, bar_type, class, input_string, create_time, update_time)
  366. SELECT @dst, @org_dst, @org_dst, s.domain_code, s.bar_type, s.class, s.input_string, NOW(), NOW()
  367. FROM BarCodeType s
  368. WHERE s.tenant_id = @src
  369. AND @src IS NOT NULL AND @dst IS NOT NULL AND @org_dst IS NOT NULL
  370. AND NOT EXISTS (SELECT 1 FROM BarCodeType x
  371. WHERE x.tenant_id = @dst AND x.domain_code = s.domain_code
  372. AND x.bar_type = s.bar_type);
  373. -- ===========================================================================
  374. -- 17 · BarCodeNbr COPY 2 (条码规则)
  375. -- ★ 源 3 行中 Customer=10000001 在 UAT 不存在;
  376. -- 把条码构成规则改挂到其它客户等于断言两家客户条码格式相同 —— 无依据 → DROP
  377. -- 仅 COPY 客户 10000000(瑞贝德) / 10000002(通广) 两条,FK 由 JOIN CustMaster 强制
  378. -- FirmString*Note 去 seed 标记
  379. -- ===========================================================================
  380. INSERT INTO BarCodeNbr (tenant_id, company_ref_id, factory_ref_id, Domain, Type, Customer, WaterRules, WaterLen, `Separator`, FirmLength, FirmString1, FirmStringLen1, FirmString1Note, FirmString2, FirmStringLen2, FirmString2Note, ItemNum, CreateTime, UpdateTime)
  381. SELECT @dst, @org_dst, @org_dst, s.Domain, s.Type, s.Customer, s.WaterRules, s.WaterLen, s.`Separator`, s.FirmLength,
  382. s.FirmString1, s.FirmStringLen1, TRIM(REPLACE(IFNULL(s.FirmString1Note, ''), '[DEMO]', '')),
  383. s.FirmString2, s.FirmStringLen2, TRIM(REPLACE(IFNULL(s.FirmString2Note, ''), '[DEMO]', '')),
  384. s.ItemNum, NOW(), NOW()
  385. FROM BarCodeNbr s
  386. JOIN CustMaster cu ON cu.tenant_id = @dst AND cu.Cust = s.Customer
  387. JOIN BarCodeType bt ON bt.tenant_id = @dst AND bt.bar_type = s.Type AND bt.domain_code = s.Domain
  388. WHERE s.tenant_id = @src
  389. AND @src IS NOT NULL AND @dst IS NOT NULL AND @org_dst IS NOT NULL
  390. AND NOT EXISTS (SELECT 1 FROM BarCodeNbr x
  391. WHERE x.tenant_id = @dst AND x.Domain = s.Domain
  392. AND x.Customer = s.Customer AND x.Type = s.Type);
  393. -- ===========================================================================
  394. -- 18 · WorkOrdControl COPY 1 (工单控制参数)
  395. -- ★ 页面 work-order-control 实际读 WorkOrdControl(非 WorkOrderControl 孤儿模型)
  396. -- 单例配置(UK = tenant_id + Domain);全部参数取源真实值,不发明
  397. -- Domain 保持源真实兼容语义(源为空串,DTO 明确其已降级为历史兼容字段)
  398. -- ===========================================================================
  399. INSERT INTO WorkOrdControl (tenant_id, EnteringPer, PaintingPer, IssuedInterval, PostVarsatSFC, IsIssued, IsPrintRejectBarcode, IsPrintScrapBarcode, IsQualityConfirm, Domain, IsActive, IsConfirm, CreateTime, UpdateTime)
  400. SELECT @dst, s.EnteringPer, s.PaintingPer, s.IssuedInterval, s.PostVarsatSFC, s.IsIssued,
  401. s.IsPrintRejectBarcode, s.IsPrintScrapBarcode, s.IsQualityConfirm,
  402. s.Domain, s.IsActive, s.IsConfirm, NOW(), NOW()
  403. FROM WorkOrdControl s
  404. WHERE s.tenant_id = @src
  405. AND @src IS NOT NULL AND @dst IS NOT NULL
  406. AND NOT EXISTS (SELECT 1 FROM WorkOrdControl x
  407. WHERE x.tenant_id = @dst AND x.Domain = s.Domain);
  408. -- ===========================================================================
  409. -- 19 · ado_kitting_exclude_rule COPY 1 (齐套检查排除规则)
  410. -- 排除物料类型 ["RS11"] —— UAT 存在 RS11 物料(A2C3115),配置有效
  411. -- ★ 该表 PK 非 auto_increment → 固定 ID 3200000000000019001
  412. -- 该表无业务 UK → 用逻辑幂等键 (tenant_id, excluded_item_types, excluded_owner_apps)
  413. -- ===========================================================================
  414. INSERT INTO ado_kitting_exclude_rule (id, tenant_id, excluded_item_types, excluded_owner_apps, is_active, remark, create_time, update_time)
  415. SELECT 3200000000000019001, @dst, s.excluded_item_types, s.excluded_owner_apps, s.is_active, s.remark, NOW(), NOW()
  416. FROM ado_kitting_exclude_rule s
  417. WHERE s.tenant_id = @src
  418. AND @src IS NOT NULL AND @dst IS NOT NULL
  419. AND NOT EXISTS (SELECT 1 FROM ado_kitting_exclude_rule x
  420. WHERE x.tenant_id = @dst
  421. AND x.excluded_item_types <=> s.excluded_item_types
  422. AND x.excluded_owner_apps <=> s.excluded_owner_apps);
  423. -- ===========================================================================
  424. -- 20 · S0ContractReviewCycle COPY 5 (合同评审周期 · 主表)
  425. -- ★ 唯一数据源在兄弟租户 AIDOP-Demo(797…230),且为【双工厂重复】:
  426. -- factory 1329900200002 = 5 main + 15 breakdown(完整)
  427. -- factory 1329900200003 = 5 main + 3 breakdown(残缺)
  428. -- UK = tenant+factory_ref_id+stage_code,两工厂 10 行 rekey 到同一目标工厂必然冲突
  429. -- → 只取完整的 …002 一套
  430. -- ===========================================================================
  431. INSERT INTO S0ContractReviewCycle (tenant_id, company_ref_id, factory_ref_id, domain_code, stage_code, stage_name, std_hours, order_no, is_active, create_time, update_time)
  432. SELECT @dst, @org_dst, @org_dst, '8010', s.stage_code, s.stage_name, s.std_hours, s.order_no, 1, NOW(), NOW()
  433. FROM S0ContractReviewCycle s
  434. WHERE s.tenant_id = @src_crc AND s.factory_ref_id = 1329900200002
  435. AND @src_crc IS NOT NULL AND @dst IS NOT NULL AND @org_dst IS NOT NULL
  436. AND NOT EXISTS (SELECT 1 FROM S0ContractReviewCycle x
  437. WHERE x.tenant_id = @dst AND x.factory_ref_id = @org_dst
  438. AND x.stage_code = s.stage_code);
  439. -- ===========================================================================
  440. -- 21 · S0ContractReviewCycleBreakdown COPY 15 (合同评审周期 · 分解从表)
  441. -- 主从链完整:15 条 parent_stage_code 全部命中上一条插入的 5 条主表阶段
  442. -- 实证一致性:分解工时按阶段求和 = 8/12/8/10/2,与主表 std_hours 精确相等
  443. -- JOIN 主表强制父子闭合,杜绝「只补 main 不补 breakdown」或父键悬空
  444. -- ===========================================================================
  445. INSERT INTO S0ContractReviewCycleBreakdown (tenant_id, company_ref_id, factory_ref_id, domain_code, parent_stage_code, group_code, group_name, std_hours, order_no, is_active, create_time, update_time)
  446. SELECT @dst, @org_dst, @org_dst, '8010', s.parent_stage_code, s.group_code, s.group_name, s.std_hours, s.order_no, 1, NOW(), NOW()
  447. FROM S0ContractReviewCycleBreakdown s
  448. JOIN S0ContractReviewCycle m
  449. ON m.tenant_id = @dst AND m.factory_ref_id = @org_dst AND m.stage_code = s.parent_stage_code
  450. WHERE s.tenant_id = @src_crc AND s.factory_ref_id = 1329900200002
  451. AND @src_crc IS NOT NULL AND @dst IS NOT NULL AND @org_dst IS NOT NULL
  452. AND NOT EXISTS (SELECT 1 FROM S0ContractReviewCycleBreakdown x
  453. WHERE x.tenant_id = @dst AND x.factory_ref_id = @org_dst
  454. AND x.parent_stage_code = s.parent_stage_code
  455. AND x.group_code = s.group_code);