namespace Admin.NET.Plugin.AiDOP.WorkOrder;
/// 工单齐套检查动作。
public class WorkOrderKittingCheckService : ITransient
{
private readonly ISqlSugarClient _db;
public WorkOrderKittingCheckService(ISqlSugarClient db)
{
_db = db;
}
public async Task CheckTenantWorkOrdersAsync(long tenantId, string account)
{
var workOrds = await _db.Ado.SqlQueryAsync(
"""
SELECT WorkOrd FROM WorkOrdMaster
WHERE tenant_id = @TenantId
AND LOWER(TRIM(IFNULL(Status,''))) IN ('p', 'r')
ORDER BY WorkOrd
""",
new SugarParameter("@TenantId", tenantId));
var result = new KittingCheckResult();
foreach (var wo in workOrds)
{
var one = await CheckSingleAsync(tenantId, wo, account);
result.CheckedCount++;
if (one.IsKitted) result.KittedCount++;
else result.ShortageCount++;
}
return result;
}
public async Task CheckSingleAsync(long tenantId, string workOrd, string account)
{
var now = DateTime.Now;
var shortage = await _db.Ado.GetIntAsync(
"""
SELECT COUNT(*)
FROM b_examine_result ber
INNER JOIN b_bom_child_examine bce ON ber.Id = bce.examine_id AND bce.is_use = 1
WHERE ber.tenant_id = @TenantId
AND ber.IsDeleted = 0
AND ber.morder_no = @WorkOrd
AND IFNULL(bce.lack_qty, 0) > 0
""",
new SugarParameter("@TenantId", tenantId),
new SugarParameter("@WorkOrd", workOrd.Trim()));
var isKitted = shortage == 0;
var situation = isKitted ? "齐套" : "缺料";
await _db.Ado.ExecuteCommandAsync(
"""
UPDATE mes_morder
SET MaterialSituation = @Situation,
update_by_name = @User,
update_time = @Now
WHERE tenant_id = @TenantId AND morder_no = @WorkOrd AND IsDeleted = 0
""",
new SugarParameter("@Situation", situation),
new SugarParameter("@User", account),
new SugarParameter("@Now", now),
new SugarParameter("@TenantId", tenantId),
new SugarParameter("@WorkOrd", workOrd.Trim()));
return new SingleKittingCheckResult
{
WorkOrd = workOrd,
IsKitted = isKitted,
ShortageLineCount = shortage,
MaterialSituation = situation
};
}
public sealed class KittingCheckResult
{
public int CheckedCount { get; set; }
public int KittedCount { get; set; }
public int ShortageCount { get; set; }
}
public sealed class SingleKittingCheckResult
{
public string WorkOrd { get; set; } = string.Empty;
public bool IsKitted { get; set; }
public int ShortageLineCount { get; set; }
public string MaterialSituation { get; set; } = string.Empty;
}
}