1.0.402.sql 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397
  1. -- ============================================================================
  2. -- S0-UAT-DEMO-MASTER-DATA-CLOSURE-1
  3. -- 为 UATTEST_CHL 租户补齐 S0 演示主数据(DATA ONLY)
  4. --
  5. -- 批次边界(经 CTO 三轮评审确认):
  6. -- SCHEMA CHANGE = 0 / BACKEND CODE = 0 / FRONTEND CHANGE = 0
  7. -- SYSORG CHANGE = 0(另开 S0-ORG-SCOPE-UI-DECOUPLE-1)
  8. -- DELETE = 0 / 源租户写入 = 0
  9. --
  10. -- 预期影响:INSERT 151 行 · UPDATE 9 行 · DELETE 0
  11. --
  12. -- 不纳入:ContractReviewCycle · default tenant cleanup · Routing legacy 36
  13. -- Location scope normalization · 2410/8010 全局统一 · Skill 族
  14. --
  15. -- 幂等:全部 INSERT 带 NOT EXISTS(按各表真实 UK);全部 UPDATE 带脏值集合限定。
  16. -- 第二次执行 INSERT=0 / UPDATE=0。
  17. --
  18. -- ⚠️ 本文件为 WIP,不占正式版本号,AutoVersionUpdate 不会自动应用。
  19. -- 提交时 rename 为 UpdateScripts/1.0.<next>.sql 并登记 csproj Copy 条目。
  20. -- ============================================================================
  21. -- ---------------------------------------------------------------------------
  22. -- 0. 作用域解析(一律按 SysOrg.Code 解析,禁止硬编码租户/组织 ID)
  23. -- ---------------------------------------------------------------------------
  24. SET @src := (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id = t.OrgId
  25. WHERE o.Code = 'AIDOP' AND t.Status = 1 LIMIT 1);
  26. SET @dst := (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id = t.OrgId
  27. WHERE o.Code = 'UATTEST_CHL' AND t.Status = 1 LIMIT 1);
  28. -- 作用域锚:取目标租户 DepartmentMaster 既有口径(838257186320453 / 838257186320453 / '8010')
  29. -- 刻意不从 LocationMaster(1000/1000) 或 srm_purchase(0/0) 取锚——那是 legacy 脏值,不可传播。
  30. SET @cid := (SELECT company_ref_id FROM DepartmentMaster WHERE tenant_id = @dst LIMIT 1);
  31. SET @fid := (SELECT factory_ref_id FROM DepartmentMaster WHERE tenant_id = @dst LIMIT 1);
  32. SET @dom := (SELECT Domain FROM DepartmentMaster WHERE tenant_id = @dst LIMIT 1);
  33. -- NbrTypeMaster 域口径:D3 修正 8011 → 8010(EVIDENCE-DRIVEN)
  34. -- NbrTypeReferencesAsync 只按 NbrType 匹配、不使用 Domain;
  35. -- ApplyDeptDescrAsync 需 NbrType.Domain 与 DepartmentMaster.Domain 对齐(= '8010')。
  36. SET @dom_nbr := @dom;
  37. -- 任一变量为 NULL 时,下方每条语句的 guard 条件使全脚本降为空操作。
  38. -- ===========================================================================
  39. -- P0-1 EmployeeMaster ← AIDOP 797:显式枚举 19 人 预计 INSERT 19
  40. -- 仓储6 / 生产6 / 质量4 / 采购部2 / 工程1(后二者为源池真实上限)
  41. -- login-bound:lj08→UATPurchaseA,G00308→UATWarehouseA(随 INSERT 写入)
  42. -- ===========================================================================
  43. INSERT INTO EmployeeMaster
  44. (company_ref_id, factory_ref_id, tenant_id, Domain, Employee, Name, Sex, Phone, Email,
  45. BirthDate, Department, DateEmployed, EmploymentStatus, MaritalStatus, JobTitle,
  46. WorkCtr, CarId, DefaultWorkLocation, IsActive, sys_user_id, CreateUser, CreateTime)
  47. SELECT @cid, @fid, @dst, @dom,
  48. s.Employee, s.Name, s.Sex, s.Phone, s.Email,
  49. s.BirthDate, s.Department, s.DateEmployed, s.EmploymentStatus, s.MaritalStatus, s.JobTitle,
  50. s.WorkCtr, s.CarId, s.DefaultWorkLocation, 1,
  51. CASE s.Employee
  52. WHEN 'lj08' THEN (SELECT u.Id FROM SysUser u
  53. WHERE u.TenantId = @dst AND u.Account = 'UATPurchaseA' AND u.Status = 1 LIMIT 1)
  54. WHEN 'G00308' THEN (SELECT u.Id FROM SysUser u
  55. WHERE u.TenantId = @dst AND u.Account = 'UATWarehouseA' AND u.Status = 1 LIMIT 1)
  56. ELSE NULL
  57. END,
  58. s.CreateUser, NOW()
  59. FROM EmployeeMaster s
  60. WHERE s.tenant_id = @src
  61. AND s.Employee IN ('G00308','G00305','G00309','G00310','G00302','G00304',
  62. 'RQTJ993','RQTJ987','RQTJ940','RQTJ939','RQTJ033','RQTJ022',
  63. 'G00397','G00517','G00518','G00520',
  64. 'lj08','qm2',
  65. 'ZHR01')
  66. AND @src IS NOT NULL AND @dst IS NOT NULL
  67. AND @cid IS NOT NULL AND @fid IS NOT NULL AND @dom IS NOT NULL
  68. -- 逻辑 FK 自守:目标租户必须已有同名部门,否则不插(防止造出悬空 Department)
  69. AND EXISTS (SELECT 1 FROM DepartmentMaster d
  70. WHERE d.tenant_id = @dst AND d.Domain = @dom AND d.Department = s.Department)
  71. -- 幂等:UK(tenant_id, Domain, Employee)
  72. AND NOT EXISTS (SELECT 1 FROM EmployeeMaster x
  73. WHERE x.tenant_id = @dst AND x.Domain = @dom AND x.Employee = s.Employee);
  74. -- ===========================================================================
  75. -- P0-2 EmployeeMaster ← UAT_DEMO_SEED:PMC / 研发 补位 4 人 预计 INSERT 4
  76. -- 所有候选源租户(797 / 824 / AIDOP-Demo)这两个部门均为 0 人,
  77. -- 故按「真实模板不存在 → 最小明确 Demo Seed」原则补位,provenance 显式标记。
  78. -- 业务键前缀 UATD- 与源体系(G00xxx / RQTJxxx)刻意不同形,可一眼辨来源。
  79. -- login-bound:UATD-PMC01 → UATPlanA
  80. -- ===========================================================================
  81. INSERT INTO EmployeeMaster
  82. (company_ref_id, factory_ref_id, tenant_id, Domain, Employee, Name, Department,
  83. JobTitle, EmploymentStatus, IsActive, sys_user_id, CreateUser, CreateTime)
  84. SELECT @cid, @fid, @dst, @dom,
  85. s.Employee, s.Name, s.Department, s.JobTitle, 'AC', 1,
  86. CASE s.Employee
  87. WHEN 'UATD-PMC01' THEN (SELECT u.Id FROM SysUser u
  88. WHERE u.TenantId = @dst AND u.Account = 'UATPlanA' AND u.Status = 1 LIMIT 1)
  89. ELSE NULL
  90. END,
  91. 'UAT_DEMO_SEED', NOW()
  92. FROM (
  93. SELECT 'UATD-PMC01' AS Employee, 'PMC计划专员01' AS Name, 'PMC' AS Department, '计划专员' AS JobTitle
  94. UNION ALL SELECT 'UATD-PMC02', 'PMC计划专员02', 'PMC', '计划专员'
  95. UNION ALL SELECT 'UATD-RD01', '研发工程师01', '研发', '研发工程师'
  96. UNION ALL SELECT 'UATD-RD02', '研发工程师02', '研发', '研发工程师'
  97. ) s
  98. WHERE @dst IS NOT NULL AND @cid IS NOT NULL AND @fid IS NOT NULL AND @dom IS NOT NULL
  99. AND EXISTS (SELECT 1 FROM DepartmentMaster d
  100. WHERE d.tenant_id = @dst AND d.Domain = @dom AND d.Department = s.Department)
  101. AND NOT EXISTS (SELECT 1 FROM EmployeeMaster x
  102. WHERE x.tenant_id = @dst AND x.Domain = @dom AND x.Employee = s.Employee);
  103. -- ===========================================================================
  104. -- P0-3 WB8 fixture 部门补正 预计 UPDATE 1 + 1
  105. -- 只改 Department;禁止触碰 sys_user_id / SysUser / Role / Org / 其它字段。
  106. -- WB8-UNB 不动(其 sys_user_id IS NULL 是 WP-WB8「未绑定应仅告警」用例的刻意 fixture)。
  107. -- WP-WB8 回归安全:run_wp_wb8_api_loop.py 仅用 RecID 作 assigneeId、断言 sys_user_id 绑定态,
  108. -- 从不读写 Department。
  109. -- ===========================================================================
  110. -- WB8-QLA → 质量:绑定 UATQualityA,其 10 个角色全部为质量检验角色(ROLE_QC / S5-IQC / S6-IPQC / S7-FQC)
  111. UPDATE EmployeeMaster
  112. SET Department = '质量', UpdateUser = 'UAT_DEMO_SEED', UpdateTime = NOW()
  113. WHERE tenant_id = @dst AND Employee = 'WB8-QLA'
  114. AND (Department IS NULL OR Department = '')
  115. AND @dst IS NOT NULL
  116. AND EXISTS (SELECT 1 FROM DepartmentMaster d
  117. WHERE d.tenant_id = @dst AND d.Department = '质量');
  118. -- WB8-EXA → 工程:绑定 UATExceptionA,角色 ROLE_EQUIP_MAINT(设备维修员);
  119. -- UAT A 七部门中无「设备部」,工程(艺工程)为唯一合理归属。
  120. UPDATE EmployeeMaster
  121. SET Department = '工程', UpdateUser = 'UAT_DEMO_SEED', UpdateTime = NOW()
  122. WHERE tenant_id = @dst AND Employee = 'WB8-EXA'
  123. AND (Department IS NULL OR Department = '')
  124. AND @dst IS NOT NULL
  125. AND EXISTS (SELECT 1 FROM DepartmentMaster d
  126. WHERE d.tenant_id = @dst AND d.Department = '工程');
  127. -- ===========================================================================
  128. -- P0-4 SuppMaster ← AIDOP 797:显式枚举 12 家 预计 INSERT 12
  129. -- 前 3 家是 UAT A 现有 srm_purchase 实际引用但本租户缺失的供应商(闭合 0/3 → 3/3),
  130. -- 后 9 家按源租户采购单量 Top 且中文名可读。
  131. -- ===========================================================================
  132. INSERT INTO SuppMaster
  133. (company_ref_id, factory_ref_id, tenant_id, Domain, Supp, SortName, PurContact,
  134. CrTerms, Curr, Type, TaxIn, TaxClass, APStartDay1, APEndDay1, APStartDay2, APEndDay2,
  135. Remark, IsActive, address, contact, position, contact_info, certification_level,
  136. CreateUser, CreateTime)
  137. SELECT @cid, @fid, @dst, @dom,
  138. s.Supp, s.SortName, s.PurContact,
  139. s.CrTerms, s.Curr, s.Type, s.TaxIn, s.TaxClass, s.APStartDay1, s.APEndDay1, s.APStartDay2, s.APEndDay2,
  140. s.Remark, 1, s.address, s.contact, s.position, s.contact_info, s.certification_level,
  141. s.CreateUser, NOW()
  142. FROM SuppMaster s
  143. WHERE s.tenant_id = @src
  144. AND s.Supp IN ('10003232','10000015','10001597',
  145. '10000094','10000047','10001001','10000018','10000090',
  146. '10001351','10001468','10000131','10004594')
  147. AND @src IS NOT NULL AND @dst IS NOT NULL
  148. AND @cid IS NOT NULL AND @fid IS NOT NULL AND @dom IS NOT NULL
  149. -- 幂等:UK(tenant_id, factory_ref_id, Supp)
  150. AND NOT EXISTS (SELECT 1 FROM SuppMaster x
  151. WHERE x.tenant_id = @dst AND x.factory_ref_id = @fid AND x.Supp = s.Supp);
  152. -- ===========================================================================
  153. -- P0-5 WorkCtrMaster 悬空部门修正 预计 UPDATE 7
  154. -- UAT A 现有 7 条工作中心复制自 AIDOPB 824,Department 沿用其不可读部门码
  155. -- RQRB50xx,在本租户 DepartmentMaster 中 7/7 悬空。
  156. -- 双重显式限定(业务键集合 ∩ 已审计脏值集合),不使用「凡悬空即改」的宽条件,
  157. -- 不误伤未来新增的其它 WorkCenter。Domain 保持 '2410' 原样,本批不做域统一。
  158. -- ===========================================================================
  159. UPDATE WorkCtrMaster
  160. SET Department = '生产', UpdateUser = 'UAT_DEMO_SEED', UpdateTime = NOW()
  161. WHERE tenant_id = @dst
  162. AND @dst IS NOT NULL
  163. AND WorkCtr IN ('WC000005','WC000006','WC000007','WC000008','WC000009','WC000010','WC000011')
  164. AND Department IN ('RQRB5009','RQRB5010','RQRB5011','RQRB5012','RQRB5013','RQRB5014','RQRB5015')
  165. AND EXISTS (SELECT 1 FROM DepartmentMaster d
  166. WHERE d.tenant_id = @dst AND d.Department = '生产');
  167. -- ===========================================================================
  168. -- P0-6 EmpWorkDutyMaster 构造 预计 INSERT 15
  169. -- 源侧 797 的 10 条全部属同一员工 G00308 且 ItemNum1 闭合 0/10(悬空),
  170. -- 故不复制源行,改为按源 Duty 词表构造:5 名仓储员工 × 3 个真实库位。
  171. -- Duty 取值全部来自 797 真实数据,非杜撰。
  172. -- ===========================================================================
  173. INSERT INTO EmpWorkDutyMaster
  174. (company_ref_id, factory_ref_id, tenant_id, Domain, Employee, ItemNum1, Location,
  175. Duty, EmpType, CreateUser, CreateTime)
  176. SELECT @cid, @fid, @dst, @dom, e.Employee, l.item_num, l.loc, l.duty, 'loc', 'UAT_DEMO_SEED', NOW()
  177. FROM (
  178. SELECT 'G00302' AS Employee
  179. UNION ALL SELECT 'G00304'
  180. UNION ALL SELECT 'G00305'
  181. UNION ALL SELECT 'G00308'
  182. UNION ALL SELECT 'G00309'
  183. ) e
  184. CROSS JOIN (
  185. SELECT '1000' AS loc, 'rct-unp;IQC' AS duty, '91C0D2C' AS item_num -- 待检库
  186. UNION ALL SELECT '1001', 'iss-po;iss-wo;Up-Shelf', '91C0D2C' -- 合格库
  187. UNION ALL SELECT '8001', 'rct-wo;packing;Up-Shelf', '91HC0497' -- 成品合格库
  188. ) l
  189. WHERE @dst IS NOT NULL AND @cid IS NOT NULL AND @fid IS NOT NULL AND @dom IS NOT NULL
  190. -- 逻辑 FK 自守:员工 / 库位 / 物料必须已存在于本租户
  191. AND EXISTS (SELECT 1 FROM EmployeeMaster x
  192. WHERE x.tenant_id = @dst AND x.Domain = @dom AND x.Employee = e.Employee)
  193. AND EXISTS (SELECT 1 FROM LocationMaster m
  194. WHERE m.tenant_id = @dst AND m.location = l.loc)
  195. AND EXISTS (SELECT 1 FROM ItemMaster i
  196. WHERE i.tenant_id = @dst AND i.ItemNum = l.item_num)
  197. -- 幂等:UK(tenant_id, Domain, Employee, Duty, Location)
  198. AND NOT EXISTS (SELECT 1 FROM EmpWorkDutyMaster d
  199. WHERE d.tenant_id = @dst AND d.Domain = @dom
  200. AND d.Employee = e.Employee AND d.Duty = l.duty AND d.Location = l.loc);
  201. -- ===========================================================================
  202. -- P0-7 S0OrderReviewCycle ← AIDOP 797 预计 INSERT 3
  203. -- eto=24h / mto=8h / mts=4h,真实 ETO/MTO/MTS 业务口径。
  204. -- AIDOP-Demo 侧同表为 AI-S0-CYCLE-00x(create_user='AI_SEED')合成占位,已拒收。
  205. -- ===========================================================================
  206. INSERT INTO S0OrderReviewCycle
  207. (company_ref_id, factory_ref_id, tenant_id, domain_code, order_type, std_hours,
  208. remarks, is_active, create_user, create_time)
  209. SELECT @cid, @fid, @dst, @dom, s.order_type, s.std_hours,
  210. s.remarks, s.is_active, 'UAT_DEMO_SEED', NOW()
  211. FROM S0OrderReviewCycle s
  212. WHERE s.tenant_id = @src
  213. AND @src IS NOT NULL AND @dst IS NOT NULL
  214. AND @cid IS NOT NULL AND @fid IS NOT NULL AND @dom IS NOT NULL
  215. AND NOT EXISTS (SELECT 1 FROM S0OrderReviewCycle x
  216. WHERE x.tenant_id = @dst AND x.factory_ref_id = @fid AND x.order_type = s.order_type);
  217. -- ===========================================================================
  218. -- P1-8 NbrTypeMaster ← AIDOP 797 预计 INSERT 57
  219. -- 仅复制 UAT A 的 NbrControl 实际使用、且源侧有定义的单号类型。
  220. -- 57 行 / 49 个 distinct NbrType(UK 含 NbrClass,同 NbrType 可挂多个 NbrClass)。
  221. -- 覆盖 UAT A 现有 91 个 NbrControl 类型中的 49 个;其余 42 个全库无定义(NO_SOURCE_AVAILABLE)。
  222. -- Domain = '8010'(D3 修正,见文件头 @dom_nbr)。
  223. -- ===========================================================================
  224. INSERT INTO NbrTypeMaster
  225. (company_ref_id, factory_ref_id, tenant_id, Domain, NbrClass, NbrType,
  226. Descr1, Descr2, Acct, SubAcct, Dept, Name, Start, Nbr, UserID, Confirm,
  227. Tran1, Tran2, Tran3, Tran4, Tran5, Page1, Page2, Page3, Page4, Page5,
  228. IsActive, IsConfirm, CreateUser, CreateTime)
  229. SELECT @cid, @fid, @dst, @dom_nbr, s.NbrClass, s.NbrType,
  230. s.Descr1, s.Descr2, s.Acct, s.SubAcct, s.Dept, s.Name, s.Start, s.Nbr, s.UserID, s.Confirm,
  231. s.Tran1, s.Tran2, s.Tran3, s.Tran4, s.Tran5, s.Page1, s.Page2, s.Page3, s.Page4, s.Page5,
  232. s.IsActive, s.IsConfirm, 'UAT_DEMO_SEED', NOW()
  233. FROM NbrTypeMaster s
  234. WHERE s.tenant_id = @src
  235. AND s.NbrType IN (SELECT DISTINCT n.NbrType FROM NbrControl n WHERE n.tenant_id = @dst)
  236. AND @src IS NOT NULL AND @dst IS NOT NULL
  237. AND @cid IS NOT NULL AND @fid IS NOT NULL AND @dom_nbr IS NOT NULL
  238. -- 幂等:UK(tenant_id, Domain, NbrClass, NbrType);<=> 容 NULL 比较
  239. AND NOT EXISTS (SELECT 1 FROM NbrTypeMaster x
  240. WHERE x.tenant_id = @dst AND x.Domain = @dom_nbr
  241. AND x.NbrClass <=> s.NbrClass AND x.NbrType = s.NbrType);
  242. -- ===========================================================================
  243. -- P1-9 LocationShelfMaster 构造 预计 INSERT 20
  244. -- 沿用 797 的 S0DEMO_BATCH1 货架命名模式(A01/A02),套用到 UAT A 自有 10 个库位。
  245. -- 797 源表另有 2 条 LOC_TEST_* / INVALID_LOC_* 测试行,已拒收。
  246. -- ⚠️ domain_code 必须 = LocationMaster.Domain('8010')——
  247. -- AdoS0LocationShelvesController.ApplyLocationDescrAsync 按
  248. -- l.DomainCode(=LocationMaster.Domain) == shelf.DomainCode && l.Location == shelf.Location 关联,
  249. -- 写错则库位说明与「库位:货架」拼接全空。
  250. -- ===========================================================================
  251. INSERT INTO LocationShelfMaster
  252. (company_ref_id, factory_ref_id, tenant_id, domain_code, location, inv_shelf,
  253. descr, create_user, create_time)
  254. SELECT @cid, @fid, @dst, @dom, l.loc, s.shelf, 'S0DEMO_UAT_A', 'UAT_DEMO_SEED', NOW()
  255. FROM (
  256. SELECT '1000' AS loc -- 材料待检库
  257. UNION ALL SELECT '1001' -- 材料合格库
  258. UNION ALL SELECT '1002' -- 材料不合格库
  259. UNION ALL SELECT '1005' -- 辅料库
  260. UNION ALL SELECT '5007' -- 线边库
  261. UNION ALL SELECT '5008' -- 成品线边库
  262. UNION ALL SELECT '8000' -- 成品待检库
  263. UNION ALL SELECT '8001' -- 成品合格库
  264. UNION ALL SELECT '8002' -- 成品不合格库
  265. UNION ALL SELECT '8005' -- 研发成品库
  266. ) l
  267. CROSS JOIN (SELECT 'A01' AS shelf UNION ALL SELECT 'A02') s
  268. WHERE @dst IS NOT NULL AND @cid IS NOT NULL AND @fid IS NOT NULL AND @dom IS NOT NULL
  269. AND EXISTS (SELECT 1 FROM LocationMaster m
  270. WHERE m.tenant_id = @dst AND m.Domain = @dom AND m.location = l.loc)
  271. -- 幂等:UK(tenant_id, domain_code, location, inv_shelf)
  272. AND NOT EXISTS (SELECT 1 FROM LocationShelfMaster x
  273. WHERE x.tenant_id = @dst AND x.domain_code = @dom
  274. AND x.location = l.loc AND x.inv_shelf = s.shelf);
  275. -- ===========================================================================
  276. -- P1-10 CostCtrMaster ← AIDOP 797:显式枚举 8 个业务键 预计 INSERT 8
  277. -- 源表 143 行中 56 行 Descr 为 NULL、部分为英文 HQ-* 串,演示无价值;
  278. -- 本批固定 8 个中文可读成本中心,保证 Golden Dataset 长期确定性
  279. -- (不使用 ORDER BY ... LIMIT 8 这类会随数据漂移的选法)。
  280. -- CostCenter 经代码审计确认仅被自身页面引用,无跨表业务引用。
  281. -- ===========================================================================
  282. INSERT INTO CostCtrMaster
  283. (company_ref_id, factory_ref_id, tenant_id, Domain, CostCtr, Descr, Ufld1, EffTime,
  284. CreateUser, CreateTime)
  285. SELECT @cid, @fid, @dst, @dom, s.CostCtr, s.Descr, s.Ufld1, s.EffTime, 'UAT_DEMO_SEED', NOW()
  286. FROM CostCtrMaster s
  287. WHERE s.tenant_id = @src
  288. AND s.CostCtr IN ('0000001001', -- 调整成本中心-无业务范围
  289. '8010102010', -- 厂务
  290. '8010301020', -- IT 部门
  291. '8010401012', -- 战略发展部
  292. '8010401060', -- 合规部
  293. '8010501067', -- 质量部-质量检验
  294. '8010602021', -- 生产一部
  295. '8010602022') -- 生产二部
  296. AND @src IS NOT NULL AND @dst IS NOT NULL
  297. AND @cid IS NOT NULL AND @fid IS NOT NULL AND @dom IS NOT NULL
  298. -- 幂等:UK(tenant_id, Domain, CostCtr)
  299. AND NOT EXISTS (SELECT 1 FROM CostCtrMaster x
  300. WHERE x.tenant_id = @dst AND x.Domain = @dom AND x.CostCtr = s.CostCtr);
  301. -- ===========================================================================
  302. -- P1-11 S0ProductDesignCycle ← AIDOP 797 预计 INSERT 3
  303. -- RS12/standard=72h · RS30/non_standard=120h · RS50/standard=240h
  304. -- 三个 item_type 在 UAT A 的 ItemMaster 中均真实存在,天然 FK 闭合。
  305. -- ===========================================================================
  306. INSERT INTO S0ProductDesignCycle
  307. (company_ref_id, factory_ref_id, tenant_id, domain_code, item_type, owner_application,
  308. std_hours, is_active, create_user, create_time)
  309. SELECT @cid, @fid, @dst, @dom, s.item_type, s.owner_application,
  310. s.std_hours, s.is_active, 'UAT_DEMO_SEED', NOW()
  311. FROM S0ProductDesignCycle s
  312. WHERE s.tenant_id = @src
  313. AND @src IS NOT NULL AND @dst IS NOT NULL
  314. AND @cid IS NOT NULL AND @fid IS NOT NULL AND @dom IS NOT NULL
  315. AND NOT EXISTS (SELECT 1 FROM S0ProductDesignCycle x
  316. WHERE x.tenant_id = @dst AND x.factory_ref_id = @fid
  317. AND x.item_type = s.item_type AND x.owner_application = s.owner_application);
  318. -- ===========================================================================
  319. -- P1-12 S0MaterialPlanCycle ← AIDOP 797 预计 INSERT 3
  320. -- mto=48h · mts=24h · plan=72h
  321. -- ===========================================================================
  322. INSERT INTO S0MaterialPlanCycle
  323. (company_ref_id, factory_ref_id, tenant_id, domain_code, order_type, std_hours,
  324. remarks, is_active, create_user, create_time)
  325. SELECT @cid, @fid, @dst, @dom, s.order_type, s.std_hours,
  326. s.remarks, s.is_active, 'UAT_DEMO_SEED', NOW()
  327. FROM S0MaterialPlanCycle s
  328. WHERE s.tenant_id = @src
  329. AND @src IS NOT NULL AND @dst IS NOT NULL
  330. AND @cid IS NOT NULL AND @fid IS NOT NULL AND @dom IS NOT NULL
  331. AND NOT EXISTS (SELECT 1 FROM S0MaterialPlanCycle x
  332. WHERE x.tenant_id = @dst AND x.factory_ref_id = @fid AND x.order_type = s.order_type);
  333. -- ===========================================================================
  334. -- P1-13 S0OrderScheduleCycle ← AIDOP 797 预计 INSERT 3
  335. -- mto=16h · mts=8h · non_mass=24h
  336. -- ===========================================================================
  337. INSERT INTO S0OrderScheduleCycle
  338. (company_ref_id, factory_ref_id, tenant_id, domain_code, order_type, std_hours,
  339. remarks, is_active, create_user, create_time)
  340. SELECT @cid, @fid, @dst, @dom, s.order_type, s.std_hours,
  341. s.remarks, s.is_active, 'UAT_DEMO_SEED', NOW()
  342. FROM S0OrderScheduleCycle s
  343. WHERE s.tenant_id = @src
  344. AND @src IS NOT NULL AND @dst IS NOT NULL
  345. AND @cid IS NOT NULL AND @fid IS NOT NULL AND @dom IS NOT NULL
  346. AND NOT EXISTS (SELECT 1 FROM S0OrderScheduleCycle x
  347. WHERE x.tenant_id = @dst AND x.factory_ref_id = @fid AND x.order_type = s.order_type);
  348. -- ===========================================================================
  349. -- P1-14 S0CategoryLeadTime ← AIDOP 797 预计 INSERT 4
  350. -- CAT-CHIP/芯片=60d · CAT-SEMI/半导体=45d · CAT-SHEET/钣金件=21d · CAT-WIRE/线材=14d
  351. -- ===========================================================================
  352. INSERT INTO S0CategoryLeadTime
  353. (company_ref_id, factory_ref_id, tenant_id, domain_code, category_code, category_name,
  354. owner_application, lead_time_days, remarks, is_active, create_user, create_time)
  355. SELECT @cid, @fid, @dst, @dom, s.category_code, s.category_name,
  356. s.owner_application, s.lead_time_days, s.remarks, s.is_active, 'UAT_DEMO_SEED', NOW()
  357. FROM S0CategoryLeadTime s
  358. WHERE s.tenant_id = @src
  359. AND @src IS NOT NULL AND @dst IS NOT NULL
  360. AND @cid IS NOT NULL AND @fid IS NOT NULL AND @dom IS NOT NULL
  361. AND NOT EXISTS (SELECT 1 FROM S0CategoryLeadTime x
  362. WHERE x.tenant_id = @dst AND x.factory_ref_id = @fid
  363. AND x.category_code = s.category_code
  364. AND x.owner_application = s.owner_application);