namespace Admin.NET.Plugin.AiDOP.WorkOrder;
/// 从标准工艺路线同步工单工序明细(WorkOrdRouting)。
public class WorkOrderRoutingSyncService : ITransient
{
private readonly ISqlSugarClient _db;
public WorkOrderRoutingSyncService(ISqlSugarClient db)
{
_db = db;
}
///
/// 确保工单有工艺路线数据;若已有活跃行则跳过。
/// 返回插入行数。
///
public async Task EnsureFromRoutingAsync(long tenantId, string workOrd, string account)
{
var existing = await _db.Ado.GetIntAsync(
"""
SELECT COUNT(*) FROM WorkOrdRouting
WHERE tenant_id = @TenantId AND WorkOrd = @WorkOrd AND IFNULL(IsActive, 0) = 1
""",
new SugarParameter("@TenantId", tenantId),
new SugarParameter("@WorkOrd", workOrd));
if (existing > 0)
return 0;
var createUser = account.Length > 24 ? account[..24] : account;
var affected = await _db.Ado.ExecuteCommandAsync(
"""
INSERT INTO WorkOrdRouting (
`Descr`, `Domain`, `ChargeCode`, `Machine`, `RunCrew`, `MilestoneOp`, `OP`, `StdOp`, `ItemNum`, `WorkCtr`,
`Ufld1`, `Ufld3`, `Setup`, `MachinesperOp`, `Labor`, `RunTime`, `MachBdnRate`, `WorkCode`, `StdSetupTime`, `Engineer`,
`WorkOrd`, `WorkOrdMasterRecID`, `ERPfld1`, `QtyOrded`, `ProcessOut`, `ProcessOutDay`, `ProcessOutSupp`,
`IsActive`, `Status`, `ProdLine`, `CreateTime`, `CreateUser`, `tenant_id`, `CommentIndex`, `WaitTime`, `QtyComplete`, `ParentOp`
)
SELECT
a.`Descr`,
LEFT(TRIM(COALESCE(NULLIF(TRIM(IFNULL(w.`Domain`, '')), ''), NULLIF(TRIM(IFNULL(a.`Domain`, '')), ''), ' ')), 8),
'',
b.`InternalEquipmentCode`,
IFNULL(b.`StandardStaffCount`, 0),
CAST(IFNULL(a.`MilestoneOp`, 0) AS UNSIGNED),
IFNULL(a.`Op`, 0),
a.`StdOp`,
a.`RoutingCode`,
LEFT(IFNULL(b.`Site`, ''), 8),
'',
'',
IFNULL(a.`UDeci1`, 0),
IFNULL(a.`UDeci2`, 0),
IFNULL(a.`UDeci3`, 0),
IFNULL(a.`UDeci3`, 0) / 3600.0,
IFNULL(b.`Rate`, 0),
b.`OpType`,
IFNULL(b.`SetupTime`, 0),
b.`SkillNo`,
w.`WorkOrd`,
w.`RecID`,
w.`ERPfld1`,
IFNULL(w.`QtyOrded`, 0),
CAST(IFNULL(a.`UDeci5`, 0) AS SIGNED),
IFNULL(a.`ProcessOutDay`, 0),
a.`ProcessOutSupp`,
b'1',
'r',
LEFT(IFNULL(b.`Line`, ''), 8),
NOW(3),
@CreateUser,
w.`tenant_id`,
CAST(IFNULL(a.`MilestoneOp`, 0) AS UNSIGNED),
0, 0, 0
FROM WorkOrdMaster w
LEFT JOIN RoutingOpDetail a ON w.`ItemNum` = a.`RoutingCode`
LEFT JOIN ProdLineDetail b ON a.`RoutingCode` = b.`Part` AND a.`Op` = b.`Op`
WHERE w.`WorkOrd` = @WorkOrd
AND w.`tenant_id` = @TenantId
AND IFNULL(a.`IsActive`, 0) = 1
AND a.`MilestoneOp` IS NOT NULL
""",
new SugarParameter("@WorkOrd", workOrd),
new SugarParameter("@TenantId", tenantId),
new SugarParameter("@CreateUser", createUser));
return affected;
}
}