WorkOrderRoutingSyncService.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. namespace Admin.NET.Plugin.AiDOP.WorkOrder;
  2. /// <summary>从标准工艺路线同步工单工序明细(WorkOrdRouting)。</summary>
  3. public class WorkOrderRoutingSyncService : ITransient
  4. {
  5. private readonly ISqlSugarClient _db;
  6. public WorkOrderRoutingSyncService(ISqlSugarClient db)
  7. {
  8. _db = db;
  9. }
  10. /// <summary>
  11. /// 确保工单有工艺路线数据;若已有活跃行则跳过。
  12. /// 返回插入行数。
  13. /// </summary>
  14. public async Task<int> EnsureFromRoutingAsync(long tenantId, string workOrd, string account)
  15. {
  16. var existing = await _db.Ado.GetIntAsync(
  17. """
  18. SELECT COUNT(*) FROM WorkOrdRouting
  19. WHERE tenant_id = @TenantId AND WorkOrd = @WorkOrd AND IFNULL(IsActive, 0) = 1
  20. """,
  21. new SugarParameter("@TenantId", tenantId),
  22. new SugarParameter("@WorkOrd", workOrd));
  23. if (existing > 0)
  24. return 0;
  25. var createUser = account.Length > 24 ? account[..24] : account;
  26. // 映射口径(G2):
  27. // StdRunTime = 1/Rate(小时/件);RunCrew ← ProdLineDetail.RunCrew;
  28. // Line/ProdLine ← TRIM(Line);MachBdnRate 恢复成本语义(不再承载 Rate)
  29. var affected = await _db.Ado.ExecuteCommandAsync(
  30. """
  31. INSERT INTO WorkOrdRouting (
  32. `Descr`, `Domain`, `ChargeCode`, `Machine`, `RunCrew`, `MilestoneOp`, `OP`, `StdOp`, `ItemNum`, `WorkCtr`,
  33. `Ufld1`, `Ufld3`, `Setup`, `MachinesperOp`, `Labor`, `RunTime`, `MachBdnRate`, `WorkCode`, `StdSetupTime`, `Engineer`,
  34. `WorkOrd`, `WorkOrdMasterRecID`, `ERPfld1`, `QtyOrded`, `ProcessOut`, `ProcessOutDay`, `ProcessOutSupp`,
  35. `IsActive`, `Status`, `ProdLine`, `Line`, `StdRunTime`,
  36. `CreateTime`, `CreateUser`, `tenant_id`, `CommentIndex`, `WaitTime`, `QtyComplete`, `ParentOp`
  37. )
  38. SELECT
  39. a.`Descr`,
  40. LEFT(TRIM(COALESCE(NULLIF(TRIM(IFNULL(w.`Domain`, '')), ''), NULLIF(TRIM(IFNULL(a.`Domain`, '')), ''), ' ')), 8),
  41. '',
  42. b.`InternalEquipmentCode`,
  43. CAST(IFNULL(NULLIF(TRIM(IFNULL(b.`RunCrew`, '')), ''), '0') AS DECIMAL(18, 4)),
  44. CAST(IFNULL(a.`MilestoneOp`, 0) AS UNSIGNED),
  45. IFNULL(a.`Op`, 0),
  46. a.`StdOp`,
  47. a.`RoutingCode`,
  48. LEFT(IFNULL(b.`Site`, ''), 8),
  49. '',
  50. '',
  51. IFNULL(a.`UDeci1`, 0),
  52. IFNULL(a.`UDeci2`, 0),
  53. IFNULL(a.`UDeci3`, 0),
  54. IFNULL(a.`UDeci3`, 0) / 3600.0,
  55. 0,
  56. b.`OpType`,
  57. IFNULL(b.`SetupTime`, 0),
  58. b.`SkillNo`,
  59. w.`WorkOrd`,
  60. w.`RecID`,
  61. w.`ERPfld1`,
  62. IFNULL(w.`QtyOrded`, 0),
  63. CAST(IFNULL(a.`UDeci5`, 0) AS SIGNED),
  64. IFNULL(a.`ProcessOutDay`, 0),
  65. a.`ProcessOutSupp`,
  66. b'1',
  67. 'r',
  68. LEFT(TRIM(IFNULL(b.`Line`, '')), 8),
  69. LEFT(TRIM(IFNULL(b.`Line`, '')), 8),
  70. CASE WHEN IFNULL(b.`Rate`, 0) > 0 THEN 1.0 / b.`Rate` ELSE NULL END,
  71. NOW(3),
  72. @CreateUser,
  73. w.`tenant_id`,
  74. CAST(IFNULL(a.`MilestoneOp`, 0) AS UNSIGNED),
  75. 0, 0, 0
  76. FROM WorkOrdMaster w
  77. LEFT JOIN RoutingOpDetail a ON w.`ItemNum` = a.`RoutingCode`
  78. LEFT JOIN ProdLineDetail b ON a.`RoutingCode` = b.`Part` AND a.`Op` = b.`Op`
  79. WHERE w.`WorkOrd` = @WorkOrd
  80. AND w.`tenant_id` = @TenantId
  81. AND IFNULL(a.`IsActive`, 0) = 1
  82. AND a.`MilestoneOp` IS NOT NULL
  83. """,
  84. new SugarParameter("@WorkOrd", workOrd),
  85. new SugarParameter("@TenantId", tenantId),
  86. new SugarParameter("@CreateUser", createUser));
  87. return affected;
  88. }
  89. }