| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- namespace Admin.NET.Plugin.AiDOP.Order;
- /// <summary>订单评审资源检查编排。</summary>
- public class OrderResourceCheckService : ITransient
- {
- private readonly ISqlSugarClient _db;
- private readonly MaterialRequirementCalculator _calculator;
- private readonly ResourceCheckResultWriter _writer;
- public OrderResourceCheckService(
- ISqlSugarClient db,
- MaterialRequirementCalculator calculator,
- ResourceCheckResultWriter writer)
- {
- _db = db;
- _calculator = calculator;
- _writer = writer;
- }
- public async Task<OrderResourceCheckResult> RunForEntryAsync(
- OrderWorkOrderGenerationService.OrderHeader order,
- OrderWorkOrderGenerationService.OrderEntryLine entry,
- string workOrd,
- string account,
- List<string> warnings,
- long bangId = 0)
- {
- var lines = await _calculator.BuildLinesAsync(order, entry, warnings, bangId);
- var morderId = await ResolveMorderIdAsync(workOrd, entry.TenantId);
- return await _writer.WriteAsync(order, entry, workOrd, morderId, lines, account, DateTime.Now);
- }
- /// <summary>仅运行资源检查计算,不写库、不依赖工单。返回计算结果与 BOM 展开明细。</summary>
- public async Task<(OrderResourceCheckResult Result, List<ResourceCheckBomLine> Lines)> CheckOnlyAsync(
- OrderWorkOrderGenerationService.OrderHeader order,
- OrderWorkOrderGenerationService.OrderEntryLine entry,
- List<string> warnings,
- long bangId = 0)
- {
- var lines = await _calculator.BuildLinesAsync(order, entry, warnings, bangId);
- var activeLines = lines.Where(x => x.IsUse == 1).ToList();
- var needTime = entry.SysCapacityDate ?? entry.PlanDate ?? DateTime.Today;
- var hasShortage = activeLines.Any(x => x.LackQty > 0);
- var kittingTime = activeLines
- .Where(x => x.LackQty > 0)
- .Select(x => x.KittingTime)
- .DefaultIfEmpty(needTime)
- .Max();
- var result = new OrderResourceCheckResult
- {
- LineCount = activeLines.Count,
- HasShortage = hasShortage,
- KittingTime = kittingTime,
- };
- return (result, lines);
- }
- /// <summary>将已有计算结果写入 b_examine_result / b_bom_child_examine(需先创建工单)。</summary>
- public async Task<OrderResourceCheckResult> WriteResultAsync(
- OrderWorkOrderGenerationService.OrderHeader order,
- OrderWorkOrderGenerationService.OrderEntryLine entry,
- string workOrd,
- List<ResourceCheckBomLine> lines,
- string account)
- {
- var morderId = await ResolveMorderIdAsync(workOrd, entry.TenantId);
- return await _writer.WriteAsync(order, entry, workOrd, morderId, lines, account, DateTime.Now);
- }
- private async Task<long?> ResolveMorderIdAsync(string workOrd, long tenantId)
- {
- var id = await _db.Ado.GetLongAsync(
- """
- SELECT Id FROM mes_morder
- WHERE morder_no = @WorkOrd AND tenant_id = @TenantId AND IsDeleted = 0
- ORDER BY Id DESC LIMIT 1
- """,
- new List<SugarParameter>
- {
- new("@WorkOrd", workOrd),
- new("@TenantId", tenantId)
- });
- return id > 0 ? id : null;
- }
- }
|