|
|
@@ -168,47 +168,34 @@ public class OrderDeliveryService : IDynamicApiController, ITransient
|
|
|
[HttpGet("delivery/flow/{entryId}")]
|
|
|
public async Task<object> GetDeliveryFlow(long entryId)
|
|
|
{
|
|
|
- // ── 先取工单号 ──
|
|
|
- const string monoSql = """
|
|
|
- SELECT a.moentry_mono
|
|
|
- FROM mes_moentry a
|
|
|
- JOIN mes_morder b ON a.moentry_mono = b.morder_no
|
|
|
- WHERE a.soentry_id = @Id
|
|
|
- """;
|
|
|
- var mono = await _db.Ado.GetStringAsync(monoSql, new { Id = entryId });
|
|
|
-
|
|
|
- // ── 并发查询各 Tab ──
|
|
|
- var basicTask = QueryBasic(entryId);
|
|
|
- var orderInfoTask = QueryOrderInfo(entryId);
|
|
|
- var reviewTask = QueryReview(entryId, mono);
|
|
|
- var changesTask = QueryChanges(entryId);
|
|
|
- var scheduleTask = QuerySchedule(mono);
|
|
|
- var materialTask = QueryMaterials(entryId, mono);
|
|
|
- var poTask = QueryPo(mono);
|
|
|
- var prTask = QueryPr(mono);
|
|
|
- var deliveryScheduleTask = QueryDeliverySchedule(mono);
|
|
|
- var nbrTask = QueryNbr(mono);
|
|
|
- var prodReportTask = QueryProdReport(mono);
|
|
|
- var iqcTask = QueryIqc(mono);
|
|
|
- var fqcTask = QueryFqc(mono);
|
|
|
- var receiptTask = QueryReceipt(mono);
|
|
|
- var shipmentTask = QueryShipment(entryId);
|
|
|
-
|
|
|
- await Task.WhenAll(basicTask, orderInfoTask, reviewTask, changesTask,
|
|
|
- scheduleTask, materialTask, poTask, prTask, deliveryScheduleTask,
|
|
|
- nbrTask, prodReportTask, iqcTask, fqcTask, receiptTask, shipmentTask);
|
|
|
+ // 同一 ISqlSugarClient 底层共用一条连接,不能对 _db.Ado 并发执行多查询(MySqlConnector 会报 Cannot Open when State is Connecting)
|
|
|
+ var basic = await QueryBasic(entryId);
|
|
|
+ var orderInfo = await QueryOrderInfo(entryId);
|
|
|
+ var review = await QueryReview(entryId);
|
|
|
+ var changes = await QueryChanges(entryId);
|
|
|
+ var schedule = await QuerySchedule(entryId);
|
|
|
+ var material = await QueryMaterials(entryId);
|
|
|
+ var po = await QueryPo(entryId);
|
|
|
+ var pr = await QueryPr(entryId);
|
|
|
+ var deliverySchedule = await QueryDeliverySchedule(entryId);
|
|
|
+ var nbr = await QueryNbr(entryId);
|
|
|
+ var prodReport = await QueryProdReport(entryId);
|
|
|
+ var iqc = await QueryIqc(entryId);
|
|
|
+ var fqc = await QueryFqc(entryId);
|
|
|
+ var receipt = await QueryReceipt(entryId);
|
|
|
+ var shipment = await QueryShipment(entryId);
|
|
|
|
|
|
return new
|
|
|
{
|
|
|
- basic = basicTask.Result,
|
|
|
- tab1 = orderInfoTask.Result,
|
|
|
- tab2 = new { review = reviewTask.Result, changes = changesTask.Result },
|
|
|
- tab3 = scheduleTask.Result,
|
|
|
- tab4 = materialTask.Result,
|
|
|
- tab5 = new { po = poTask.Result, pr = prTask.Result, deliverySchedule = deliveryScheduleTask.Result },
|
|
|
- tab6 = nbrTask.Result,
|
|
|
- tab7 = new { prodReport = prodReportTask.Result, iqc = iqcTask.Result },
|
|
|
- tab8 = new { fqc = fqcTask.Result, receipt = receiptTask.Result, shipment = shipmentTask.Result },
|
|
|
+ basic,
|
|
|
+ tab1 = orderInfo,
|
|
|
+ tab2 = new { review, changes },
|
|
|
+ tab3 = schedule,
|
|
|
+ tab4 = material,
|
|
|
+ tab5 = new { po, pr, deliverySchedule },
|
|
|
+ tab6 = nbr,
|
|
|
+ tab7 = new { prodReport, iqc },
|
|
|
+ tab8 = new { fqc, receipt, shipment },
|
|
|
};
|
|
|
}
|
|
|
|
|
|
@@ -257,284 +244,445 @@ public class OrderDeliveryService : IDynamicApiController, ITransient
|
|
|
}
|
|
|
|
|
|
// ── Tab2 订单评审 ──
|
|
|
- private async Task<FlowReviewRow?> QueryReview(long entryId, string? mono)
|
|
|
+ /// <remarks>
|
|
|
+ /// 查询最新评审记录(num=1 的首行物料)的预计交期评估信息。
|
|
|
+ /// </remarks>
|
|
|
+ private async Task<FlowReviewRow?> QueryReview(long entryId)
|
|
|
{
|
|
|
+ //测试提交
|
|
|
const string sql = """
|
|
|
SELECT
|
|
|
- entry.sys_capacity_date AS SysCapacityDate,
|
|
|
- mo.moentry_mono AS MorderNo,
|
|
|
- entry.create_time AS CreateTime,
|
|
|
- mo.make_qty AS MakeQty,
|
|
|
- mo.use_qty AS UseQty,
|
|
|
- mo.mo_qty AS MoQty
|
|
|
- FROM crm_seorderentry entry
|
|
|
- LEFT JOIN (
|
|
|
- SELECT a.soentry_id, a.moentry_mono,
|
|
|
- b.make_qty, b.use_qty, b.mo_qty
|
|
|
- FROM mes_moentry a
|
|
|
- LEFT JOIN mes_morder b ON a.moentry_mono = b.morder_no
|
|
|
- ) mo ON entry.id = mo.soentry_id
|
|
|
- WHERE entry.Id = @Id AND entry.IsDeleted = 0
|
|
|
+ b.satisfy_time AS SysCapacityDate,
|
|
|
+ c.moentry_mono AS MorderNo,
|
|
|
+ c.create_time AS CreateTime,
|
|
|
+ IF(b.make_qty = 0 AND b.erp_cls = 1, b.lack_qty, b.make_qty) AS MakeQty,
|
|
|
+ b.use_qty AS UseQty,
|
|
|
+ b.mo_qty AS MoQty
|
|
|
+ FROM b_examine_result a
|
|
|
+ LEFT JOIN b_bom_child_examine b ON a.id = b.examine_id
|
|
|
+ LEFT JOIN mes_moentry c ON a.sentry_id = c.soentry_id
|
|
|
+ LEFT JOIN mes_morder d ON c.moentry_mono = d.morder_no
|
|
|
+ WHERE a.create_time = (
|
|
|
+ SELECT MAX(create_time)
|
|
|
+ FROM b_examine_result
|
|
|
+ WHERE sentry_id = @EntryId
|
|
|
+ )
|
|
|
+ AND b.num = 1
|
|
|
+ AND a.sentry_id = @EntryId
|
|
|
+ LIMIT 1
|
|
|
""";
|
|
|
- return (await _db.Ado.SqlQueryAsync<FlowReviewRow>(sql, new { Id = entryId })).FirstOrDefault();
|
|
|
+ return (await _db.Ado.SqlQueryAsync<FlowReviewRow>(sql, new { EntryId = entryId })).FirstOrDefault();
|
|
|
}
|
|
|
|
|
|
- // ── Tab2 变更记录 ──
|
|
|
+ // ── Tab2 变更记录(MySQL:按订单行关联变更单)──
|
|
|
private async Task<List<FlowChangeRow>> QueryChanges(long entryId)
|
|
|
{
|
|
|
const string sql = """
|
|
|
SELECT
|
|
|
- ROW_NUMBER() OVER (ORDER BY c.update_time) AS Sno,
|
|
|
- c.bill_no AS BillNo,
|
|
|
- c.change_Type AS ChangeType,
|
|
|
- c.change_Reason AS ChangeReason,
|
|
|
- c.change_content AS ChangeContent,
|
|
|
- c.update_time AS UpdateTime
|
|
|
- FROM crm_seorder_change c
|
|
|
- JOIN crm_seorderentry entry ON c.bill_no = (
|
|
|
- SELECT s.bill_no FROM crm_seorder s WHERE s.Id = entry.seorder_id
|
|
|
- )
|
|
|
- WHERE entry.Id = @Id
|
|
|
- ORDER BY c.update_time
|
|
|
+ ROW_NUMBER() OVER (ORDER BY a.id) AS Sno,
|
|
|
+ a.bill_no AS BillNo,
|
|
|
+ a.change_Type AS ChangeType,
|
|
|
+ a.change_Reason AS ChangeReason,
|
|
|
+ a.change_content AS ChangeContent,
|
|
|
+ a.update_time AS UpdateTime
|
|
|
+ FROM crm_seorder_change a
|
|
|
+ LEFT JOIN crm_seorderentry b ON a.bill_no = b.bill_no
|
|
|
+ WHERE a.bill_no IS NOT NULL AND b.id = @Id
|
|
|
+ ORDER BY a.id
|
|
|
""";
|
|
|
return await _db.Ado.SqlQueryAsync<FlowChangeRow>(sql, new { Id = entryId });
|
|
|
}
|
|
|
|
|
|
- // ── Tab3 计划排程 ──
|
|
|
- private async Task<List<FlowScheduleRow>> QuerySchedule(string? mono)
|
|
|
+ // ── Tab3 计划排程1(MySQL:按分录 Id 关联工单排程 + 物料主档)──
|
|
|
+ private async Task<List<FlowScheduleRow>> QuerySchedule(long entryId)
|
|
|
{
|
|
|
- if (string.IsNullOrWhiteSpace(mono)) return new();
|
|
|
const string sql = """
|
|
|
SELECT
|
|
|
- ROW_NUMBER() OVER (ORDER BY WorkDate) AS Sno,
|
|
|
- WorkOrds, WorkDate, Line, Op, WorkQty,
|
|
|
- ItemNum, Descr, Descr1, CreateTime
|
|
|
- FROM PeriodSequenceDet
|
|
|
- WHERE WorkOrds = @Mono
|
|
|
- ORDER BY WorkDate
|
|
|
+ ROW_NUMBER() OVER (ORDER BY sch.PlanDate) AS Sno,
|
|
|
+ sch.WorkOrds,
|
|
|
+ DATE(sch.PlanDate) AS WorkDate,
|
|
|
+ sch.Line,
|
|
|
+ sch.Op,
|
|
|
+ CAST(sch.OrdQty AS DECIMAL(18, 2)) AS WorkQty,
|
|
|
+ sch.ItemNum,
|
|
|
+ im.Descr,
|
|
|
+ im.Descr1,
|
|
|
+ sch.CreateTime
|
|
|
+ FROM PeriodSequenceDet sch
|
|
|
+ LEFT JOIN ItemMaster im ON sch.ItemNum = im.ItemNum
|
|
|
+ LEFT JOIN mes_morder mo ON mo.morder_no = sch.WorkOrds
|
|
|
+ INNER JOIN mes_moentry me ON mo.Id = me.moentry_moid
|
|
|
+ LEFT JOIN crm_seorderentry se ON se.Id = me.soentry_id
|
|
|
+ WHERE se.id = @EntryId AND mo.IsDeleted = 0
|
|
|
+ ORDER BY sch.PlanDate
|
|
|
""";
|
|
|
- return await _db.Ado.SqlQueryAsync<FlowScheduleRow>(sql, new SugarParameter("@Mono", mono));
|
|
|
+ return await _db.Ado.SqlQueryAsync<FlowScheduleRow>(sql, new { EntryId = entryId });
|
|
|
}
|
|
|
|
|
|
- // ── Tab4 物料需求 ──
|
|
|
- private async Task<List<FlowMaterialRow>> QueryMaterials(long entryId, string? mono)
|
|
|
+ // ── Tab4 物料需求(MySQL:最新评审结果 + BOM 子件明细,同需求明细核验口径)──
|
|
|
+ private async Task<List<FlowMaterialRow>> QueryMaterials(long entryId)
|
|
|
{
|
|
|
- if (string.IsNullOrWhiteSpace(mono)) return new();
|
|
|
const string sql = """
|
|
|
SELECT
|
|
|
- ROW_NUMBER() OVER (ORDER BY num) AS Sno,
|
|
|
- num, item_number AS ItemNumber, item_name AS ItemName,
|
|
|
- model AS Model, unit AS Unit, bom_number AS BomNumber,
|
|
|
- kitting_time AS KittingTime, erp_cls_name AS ErpClsName,
|
|
|
- backflush AS Backflush, qty AS Qty, scrap AS Scrap,
|
|
|
- wastage AS Wastage, needCount AS NeedCount,
|
|
|
- self_lack_qty AS SelfLackQty, sqty AS Sqty,
|
|
|
- use_qty AS UseQty, lack_qty AS LackQty,
|
|
|
- mo_qty AS MoQty, make_qty AS MakeQty,
|
|
|
- purchase_qty AS PurchaseQty,
|
|
|
- purchase_occupy_qty AS PurchaseOccupyQty,
|
|
|
- subcontracting_qty AS SubcontractingQty,
|
|
|
- satisfy_time AS SatisfyTime,
|
|
|
- type AS Type, haveicsubs AS HaveIcSubs,
|
|
|
- substitute_code AS SubstituteCode
|
|
|
- FROM b_kitting_detail
|
|
|
- WHERE mono = @Mono
|
|
|
- ORDER BY num
|
|
|
+ ROW_NUMBER() OVER (ORDER BY bce.id) AS Sno,
|
|
|
+ CAST(bce.num AS CHAR) AS Num,
|
|
|
+ bce.item_number AS ItemNumber,
|
|
|
+ bce.item_name AS ItemName,
|
|
|
+ bce.bom_number AS BomNumber,
|
|
|
+ bce.model AS Model,
|
|
|
+ DATE_FORMAT(bce.kitting_time, '%Y-%m-%d') AS KittingTime,
|
|
|
+ CASE WHEN bce.type = 1 THEN '替代件' ELSE '标准件' END AS Type,
|
|
|
+ bce.unit AS Unit,
|
|
|
+ CASE bce.erp_cls
|
|
|
+ WHEN 0 THEN '配置类'
|
|
|
+ WHEN 1 THEN '自制'
|
|
|
+ WHEN 2 THEN '委外加工'
|
|
|
+ WHEN 3 THEN '外购'
|
|
|
+ WHEN 4 THEN '虚拟件'
|
|
|
+ END AS ErpClsName,
|
|
|
+ CAST(bce.qty AS DECIMAL(18, 2)) AS Qty,
|
|
|
+ CAST(bce.needCount AS DECIMAL(18, 2)) AS NeedCount,
|
|
|
+ CAST(bce.sqty AS DECIMAL(18, 2)) AS Sqty,
|
|
|
+ CAST(bce.use_qty AS DECIMAL(18, 2)) AS UseQty,
|
|
|
+ CAST(bce.self_lack_qty AS DECIMAL(18, 2)) AS SelfLackQty,
|
|
|
+ CAST(bce.lack_qty AS DECIMAL(18, 2)) AS LackQty,
|
|
|
+ CAST(bce.mo_qty AS DECIMAL(18, 2)) AS MoQty,
|
|
|
+ CAST(IF(bce.make_qty = 0 AND bce.erp_cls = 1, bce.lack_qty, bce.make_qty) AS DECIMAL(18, 2)) AS MakeQty,
|
|
|
+ CAST(bce.purchase_qty AS DECIMAL(18, 2)) AS PurchaseQty,
|
|
|
+ CAST(bce.purchase_occupy_qty AS DECIMAL(18, 2)) AS PurchaseOccupyQty,
|
|
|
+ CAST(bce.subcontracting_qty AS DECIMAL(18, 2)) AS SubcontractingQty,
|
|
|
+ CASE WHEN bce.backflush = 1 THEN '是' ELSE '否' END AS Backflush,
|
|
|
+ DATE_FORMAT(bce.satisfy_time, '%Y-%m-%d') AS SatisfyTime,
|
|
|
+ CASE WHEN bce.haveicsubs = 1 THEN '是' ELSE '否' END AS HaveIcSubs,
|
|
|
+ bce.substitute_code AS SubstituteCode
|
|
|
+ FROM crm_seorder se
|
|
|
+ INNER JOIN crm_seorderentry sen ON se.id = sen.seorder_id
|
|
|
+ LEFT JOIN b_examine_result ber ON ber.Id = (
|
|
|
+ SELECT br.Id
|
|
|
+ FROM b_examine_result br
|
|
|
+ WHERE br.sorderid = se.id AND br.sentry_id = sen.id
|
|
|
+ ORDER BY br.create_time DESC
|
|
|
+ LIMIT 1
|
|
|
+ )
|
|
|
+ INNER JOIN b_bom_child_examine bce ON ber.Id = bce.examine_id AND bce.is_use = 1
|
|
|
+ WHERE sen.id = @EntryId
|
|
|
+ ORDER BY bce.id ASC
|
|
|
""";
|
|
|
- return await _db.Ado.SqlQueryAsync<FlowMaterialRow>(sql, new SugarParameter("@Mono", mono));
|
|
|
+ return await _db.Ado.SqlQueryAsync<FlowMaterialRow>(sql, new { EntryId = entryId });
|
|
|
}
|
|
|
|
|
|
- // ── Tab5 采购订单 ──
|
|
|
- private async Task<List<FlowPoRow>> QueryPo(string? mono)
|
|
|
+ // ── Tab5 采购订单(MySQL:经占用/工单关联到订单分录)──
|
|
|
+ private async Task<List<FlowPoRow>> QueryPo(long entryId)
|
|
|
{
|
|
|
- if (string.IsNullOrWhiteSpace(mono)) return new();
|
|
|
const string sql = """
|
|
|
SELECT
|
|
|
- ROW_NUMBER() OVER (ORDER BY po.create_time) AS Sno,
|
|
|
- po.po_billno AS PoBillNo,
|
|
|
- po.supplier_no AS SupplierNo,
|
|
|
- po.supplier_name AS SupplierName,
|
|
|
- po.po_total AS PoTotal,
|
|
|
- po.po_purchaser AS PoPurchaser,
|
|
|
- po.state AS State,
|
|
|
- po.po_ssend_date AS PoSsendDate,
|
|
|
- po.create_time AS CreateTime
|
|
|
- FROM srm_po_main po
|
|
|
- WHERE po.pr_mono = @Mono
|
|
|
- ORDER BY po.create_time
|
|
|
+ ROW_NUMBER() OVER (ORDER BY t.PoBillNo) AS Sno,
|
|
|
+ t.PoBillNo,
|
|
|
+ t.SupplierNo,
|
|
|
+ t.SupplierName,
|
|
|
+ t.PoTotal,
|
|
|
+ t.PoPurchaser,
|
|
|
+ t.State,
|
|
|
+ t.PoSsendDate,
|
|
|
+ t.CreateTime
|
|
|
+ FROM (
|
|
|
+ SELECT DISTINCT
|
|
|
+ pm.po_billno AS PoBillNo,
|
|
|
+ pm.supplier_no AS SupplierNo,
|
|
|
+ pm.supplier_name AS SupplierName,
|
|
|
+ CAST(pm.po_total AS DECIMAL(18, 2)) AS PoTotal,
|
|
|
+ pm.po_purchaser AS PoPurchaser,
|
|
|
+ pm.create_time AS CreateTime,
|
|
|
+ pm.po_ssend_date AS PoSsendDate,
|
|
|
+ CASE pm.state
|
|
|
+ WHEN 0 THEN '新增'
|
|
|
+ WHEN 1 THEN '审核中'
|
|
|
+ WHEN 2 THEN '同意'
|
|
|
+ WHEN 3 THEN '关闭'
|
|
|
+ END AS State
|
|
|
+ FROM srm_po_main pm
|
|
|
+ LEFT JOIN srm_po_list pl ON pm.id = pl.po_id
|
|
|
+ LEFT JOIN srm_po_occupy occ ON pl.Id = occ.polist_id AND pm.factory_id = occ.factory_id
|
|
|
+ LEFT JOIN mes_morder mo ON mo.id = occ.morder_id
|
|
|
+ LEFT JOIN mes_moentry me ON mo.id = me.moentry_moid
|
|
|
+ LEFT JOIN crm_seorderentry se ON me.soentry_id = se.id
|
|
|
+ WHERE se.id = @EntryId AND pm.IsDeleted = 0
|
|
|
+ ) AS t
|
|
|
+ ORDER BY t.PoBillNo
|
|
|
""";
|
|
|
- return await _db.Ado.SqlQueryAsync<FlowPoRow>(sql, new SugarParameter("@Mono", mono));
|
|
|
+ return await _db.Ado.SqlQueryAsync<FlowPoRow>(sql, new { EntryId = entryId });
|
|
|
}
|
|
|
|
|
|
- // ── Tab5 采购申请 ──
|
|
|
- private async Task<List<FlowPrRow>> QueryPr(string? mono)
|
|
|
+ // ── Tab5 采购申请(MySQL)──
|
|
|
+ private async Task<List<FlowPrRow>> QueryPr(long entryId)
|
|
|
{
|
|
|
- if (string.IsNullOrWhiteSpace(mono)) return new();
|
|
|
const string sql = """
|
|
|
SELECT
|
|
|
- ROW_NUMBER() OVER (ORDER BY pr.create_time) AS Sno,
|
|
|
- pr.pr_billno AS PrBillNo,
|
|
|
- pr.number AS Number,
|
|
|
- pr.icitem_name AS IcItemName,
|
|
|
- pr.model AS Model,
|
|
|
- pr.pr_purchasenumber AS PrPurchaseNumber,
|
|
|
- pr.pr_purchasename AS PrPurchaseName,
|
|
|
- pr.pr_aqty AS PrAQty,
|
|
|
- pr.pr_ssend_date AS PrSsendDate,
|
|
|
- pr.pr_sarrive_date AS PrSarriveDate,
|
|
|
- pr.pr_unit AS PrUnit,
|
|
|
- pr.pr_purchaser AS PrPurchaser
|
|
|
- FROM srm_pr_main pr
|
|
|
- WHERE pr.pr_mono = @Mono AND pr.state > 1
|
|
|
- ORDER BY pr.create_time
|
|
|
+ ROW_NUMBER() OVER (ORDER BY pm.pr_billno) AS Sno,
|
|
|
+ pm.pr_billno AS PrBillNo,
|
|
|
+ ic.number AS Number,
|
|
|
+ pm.icitem_name AS IcItemName,
|
|
|
+ ic.model AS Model,
|
|
|
+ pm.pr_purchasenumber AS PrPurchaseNumber,
|
|
|
+ pm.pr_purchasename AS PrPurchaseName,
|
|
|
+ CAST(pm.pr_aqty AS DECIMAL(18, 2)) AS PrAQty,
|
|
|
+ pm.pr_ssend_date AS PrSsendDate,
|
|
|
+ pm.pr_sarrive_date AS PrSarriveDate,
|
|
|
+ pm.pr_unit AS PrUnit,
|
|
|
+ pm.pr_purchaser AS PrPurchaser
|
|
|
+ FROM srm_pr_main pm
|
|
|
+ LEFT JOIN srm_po_occupy occ ON pm.Id = occ.polist_id AND pm.factory_id = occ.factory_id
|
|
|
+ LEFT JOIN ic_item ic ON pm.icitem_id = ic.Id
|
|
|
+ LEFT JOIN mes_morder mo ON mo.id = occ.morder_id
|
|
|
+ LEFT JOIN mes_moentry me ON mo.id = me.moentry_moid
|
|
|
+ LEFT JOIN crm_seorderentry se ON me.soentry_id = se.id
|
|
|
+ WHERE se.id = @EntryId AND pm.state <> 0 AND pm.IsDeleted = 0
|
|
|
+ ORDER BY pm.pr_billno
|
|
|
""";
|
|
|
- return await _db.Ado.SqlQueryAsync<FlowPrRow>(sql, new SugarParameter("@Mono", mono));
|
|
|
+ return await _db.Ado.SqlQueryAsync<FlowPrRow>(sql, new { EntryId = entryId });
|
|
|
}
|
|
|
|
|
|
- // ── Tab5 物料交货单 ──
|
|
|
- private async Task<List<FlowDeliveryScheduleRow>> QueryDeliverySchedule(string? mono)
|
|
|
+ // ── Tab5 物料交货单(MySQL:srm_polist_ds)──
|
|
|
+ private async Task<List<FlowDeliveryScheduleRow>> QueryDeliverySchedule(long entryId)
|
|
|
{
|
|
|
- if (string.IsNullOrWhiteSpace(mono)) return new();
|
|
|
const string sql = """
|
|
|
SELECT
|
|
|
- ROW_NUMBER() OVER (ORDER BY d.requestdate) AS Sno,
|
|
|
- d.ponumber AS PoNumber,
|
|
|
- d.dsnum AS DsNum,
|
|
|
- d.itemnum AS ItemNum,
|
|
|
- d.Descr AS Descr,
|
|
|
- d.suppliercode AS SupplierCode,
|
|
|
- d.supplier AS Supplier,
|
|
|
- d.requestdate AS RequestDate,
|
|
|
- d.needdate AS NeedDate,
|
|
|
- d.schedqty AS SchedQty,
|
|
|
- d.sentqty AS SentQty,
|
|
|
- d.restqty AS RestQty
|
|
|
- FROM srm_delivery_det d
|
|
|
- WHERE d.mono = @Mono
|
|
|
- ORDER BY d.requestdate
|
|
|
+ ROW_NUMBER() OVER (ORDER BY t.DsNum) AS Sno,
|
|
|
+ t.PoNumber,
|
|
|
+ t.DsNum,
|
|
|
+ t.ItemNum,
|
|
|
+ t.Descr,
|
|
|
+ t.SupplierCode,
|
|
|
+ t.Supplier,
|
|
|
+ t.RequestDate,
|
|
|
+ t.NeedDate,
|
|
|
+ t.SchedQty,
|
|
|
+ t.SentQty,
|
|
|
+ t.RestQty
|
|
|
+ FROM (
|
|
|
+ SELECT
|
|
|
+ ds.dsnum AS DsNum,
|
|
|
+ ds.ponumber AS PoNumber,
|
|
|
+ ds.itemnum AS ItemNum,
|
|
|
+ im.Descr AS Descr,
|
|
|
+ ds.suppliercode AS SupplierCode,
|
|
|
+ ds.supplier AS Supplier,
|
|
|
+ ds.requestdate AS RequestDate,
|
|
|
+ ds.needdate AS NeedDate,
|
|
|
+ ds.schedqty AS SchedQty,
|
|
|
+ ds.sentqty AS SentQty,
|
|
|
+ ds.restqty AS RestQty
|
|
|
+ FROM srm_po_main pm
|
|
|
+ LEFT JOIN srm_po_list pl ON pm.id = pl.po_id
|
|
|
+ LEFT JOIN srm_po_occupy occ ON pl.Id = occ.polist_id AND pm.factory_id = occ.factory_id
|
|
|
+ LEFT JOIN mes_morder mo ON mo.id = occ.morder_id
|
|
|
+ LEFT JOIN mes_moentry me ON mo.id = me.moentry_moid
|
|
|
+ LEFT JOIN crm_seorderentry se ON me.soentry_id = se.id
|
|
|
+ LEFT JOIN srm_polist_ds ds ON pl.po_billno = ds.ponumber AND pl.ItemNum = ds.itemnum
|
|
|
+ LEFT JOIN ItemMaster im ON ds.itemnum = im.ItemNum
|
|
|
+ WHERE se.id = @EntryId AND pm.IsDeleted = 0
|
|
|
+ ) AS t
|
|
|
+ ORDER BY t.DsNum
|
|
|
""";
|
|
|
- return await _db.Ado.SqlQueryAsync<FlowDeliveryScheduleRow>(sql, new SugarParameter("@Mono", mono));
|
|
|
+ return await _db.Ado.SqlQueryAsync<FlowDeliveryScheduleRow>(sql, new { EntryId = entryId });
|
|
|
}
|
|
|
|
|
|
- // ── Tab6 生产备料 ──
|
|
|
- private async Task<List<FlowNbrRow>> QueryNbr(string? mono)
|
|
|
+ // ── Tab6 生产备料(MySQL:备料明细经工单关联分录)──
|
|
|
+ private async Task<List<FlowNbrRow>> QueryNbr(long entryId)
|
|
|
{
|
|
|
- if (string.IsNullOrWhiteSpace(mono)) return new();
|
|
|
const string sql = """
|
|
|
SELECT
|
|
|
- CAST(d.Line AS CHAR) AS Line,
|
|
|
- n.Nbr, d.ItemNum, d.Descr, d.Descr1,
|
|
|
- d.LocationFrom, d.LocationTo,
|
|
|
- d.CurrQtyOpened, d.QtyOrd, d.QtyFrom, d.QtyRec,
|
|
|
- d.unit, d.UpdateTime
|
|
|
- FROM NbrMaster n
|
|
|
- JOIN NbrDetail d ON n.Nbr = d.Nbr
|
|
|
- WHERE n.WorkOrd = @Mono AND n.type = 'SM'
|
|
|
- ORDER BY d.Line
|
|
|
+ CAST(nd.Line AS CHAR) AS Line,
|
|
|
+ nm.Nbr AS Nbr,
|
|
|
+ nd.ItemNum,
|
|
|
+ im.Descr AS Descr,
|
|
|
+ im.Descr1 AS Descr1,
|
|
|
+ CAST(nd.QtyFrom AS DECIMAL(18, 2)) AS QtyFrom,
|
|
|
+ CAST(nd.QtyOrd AS DECIMAL(18, 2)) AS QtyOrd,
|
|
|
+ CAST(nd.CurrQtyOpened AS DECIMAL(18, 2)) AS CurrQtyOpened,
|
|
|
+ CAST(nd.QtyRec AS DECIMAL(18, 2)) AS QtyRec,
|
|
|
+ nd.UM AS Unit,
|
|
|
+ nd.LocationFrom,
|
|
|
+ nd.LocationTo,
|
|
|
+ nd.UpdateTime AS UpdateTime,
|
|
|
+ nd.WorkOrd AS WorkOrd
|
|
|
+ FROM NbrDetail nd
|
|
|
+ LEFT JOIN NbrMaster nm ON nd.nbr = nm.nbr
|
|
|
+ LEFT JOIN mes_morder mo ON mo.morder_no = nm.WorkOrd
|
|
|
+ INNER JOIN mes_moentry me ON mo.Id = me.moentry_moid
|
|
|
+ LEFT JOIN crm_seorderentry se ON se.Id = me.soentry_id AND mo.product_code = se.item_number
|
|
|
+ LEFT JOIN ItemMaster im ON nd.ItemNum = im.ItemNum
|
|
|
+ WHERE se.id = @EntryId AND mo.IsDeleted = 0 AND nm.Type = 'SM'
|
|
|
+ ORDER BY nm.Nbr
|
|
|
""";
|
|
|
- return await _db.Ado.SqlQueryAsync<FlowNbrRow>(sql, new SugarParameter("@Mono", mono));
|
|
|
+ return await _db.Ado.SqlQueryAsync<FlowNbrRow>(sql, new { EntryId = entryId });
|
|
|
}
|
|
|
|
|
|
- // ── Tab7 生产报工 ──
|
|
|
- private async Task<List<FlowProdReportRow>> QueryProdReport(string? mono)
|
|
|
+ // ── Tab7 生产报工(OpTransEmployee + 销售订单行)──
|
|
|
+ private async Task<List<FlowProdReportRow>> QueryProdReport(long entryId)
|
|
|
{
|
|
|
- if (string.IsNullOrWhiteSpace(mono)) return new();
|
|
|
const string sql = """
|
|
|
SELECT
|
|
|
- ROW_NUMBER() OVER (ORDER BY r.ProdDate) AS Sno,
|
|
|
- r.WorkOrd, r.ItemNum, r.Descr, r.Descr1, r.Um,
|
|
|
- r.QtyCompleted, r.QtyReject, r.QtyScrapped,
|
|
|
- r.ProdDate, r.Op, r.Name
|
|
|
- FROM mes_production_report r
|
|
|
- WHERE r.WorkOrd = @Mono
|
|
|
- ORDER BY r.ProdDate
|
|
|
+ ROW_NUMBER() OVER (ORDER BY ote.ProdDate DESC) AS Sno,
|
|
|
+ ote.WorkOrd,
|
|
|
+ us.Name AS Name,
|
|
|
+ ote.Op,
|
|
|
+ ote.ProdDate,
|
|
|
+ im.ItemNum,
|
|
|
+ im.Descr,
|
|
|
+ im.Descr1,
|
|
|
+ im.Um,
|
|
|
+ CAST(ote.QtyCompleted AS DECIMAL(18,2)) AS QtyCompleted,
|
|
|
+ CAST(ote.QtyReject AS DECIMAL(18,2)) AS QtyReject,
|
|
|
+ CAST(ote.QtyScrapped AS DECIMAL(18,2)) AS QtyScrapped
|
|
|
+ FROM OpTransEmployee ote
|
|
|
+ LEFT JOIN mes_morder mo ON mo.morder_no = ote.WorkOrd
|
|
|
+ INNER JOIN mes_moentry me ON mo.Id = me.moentry_moid
|
|
|
+ LEFT JOIN crm_seorderentry se ON se.Id = me.soentry_id
|
|
|
+ LEFT JOIN ItemMaster im ON ote.ItemNum = im.ItemNum
|
|
|
+ LEFT JOIN rf_user us ON ote.Name = us.account
|
|
|
+ WHERE se.id = @EntryId AND mo.IsDeleted = 0
|
|
|
+ ORDER BY ote.ProdDate DESC
|
|
|
""";
|
|
|
- return await _db.Ado.SqlQueryAsync<FlowProdReportRow>(sql, new SugarParameter("@Mono", mono));
|
|
|
+ return await _db.Ado.SqlQueryAsync<FlowProdReportRow>(sql, new { EntryId = entryId });
|
|
|
}
|
|
|
|
|
|
- // ── Tab7 IQC信息 ──
|
|
|
- private async Task<List<FlowIqcRow>> QueryIqc(string? mono)
|
|
|
+ // ── Tab7 IQC信息(请购/采购/检验链路)──
|
|
|
+ private async Task<List<FlowIqcRow>> QueryIqc(long entryId)
|
|
|
{
|
|
|
- if (string.IsNullOrWhiteSpace(mono)) return new();
|
|
|
const string sql = """
|
|
|
SELECT
|
|
|
- ROW_NUMBER() OVER (ORDER BY i.FAPPLYTIME) AS Line,
|
|
|
- i.po_bill AS PoBill,
|
|
|
- i.po_billline AS PoBillLine,
|
|
|
- i.FBILLNO AS FBillNo,
|
|
|
- i.FMATERIALCFG AS FMaterialCfg,
|
|
|
- i.wlmc AS Wlmc,
|
|
|
- i.ggxh AS Ggxh,
|
|
|
- i.FRINSQTY AS FRinsQty,
|
|
|
- i.FAPPLYTIME AS FApplyTime,
|
|
|
- i.FINSPESTARTDATE AS FInspeStartDate,
|
|
|
- i.FINSPECTSTATUS AS FInspecStatus
|
|
|
- FROM mes_iqc_bill i
|
|
|
- WHERE i.mono = @Mono
|
|
|
- ORDER BY i.FAPPLYTIME
|
|
|
+ ROW_NUMBER() OVER (ORDER BY iqcjy.FAPPLYTIME DESC) AS Line,
|
|
|
+ iqcjy.po_bill AS PoBill,
|
|
|
+ iqcjy.po_billline AS PoBillLine,
|
|
|
+ iqcjy.FBILLNO AS FBillNo,
|
|
|
+ iqcjy.FMATERIALCFG AS FMaterialCfg,
|
|
|
+ iqcjy.wlmc AS Wlmc,
|
|
|
+ iqcjy.ggxh AS Ggxh,
|
|
|
+ CAST(iqcjy.FRINSQTY AS DECIMAL(18,2)) AS FRinsQty,
|
|
|
+ iqcjy.FAPPLYTIME AS FApplyTime,
|
|
|
+ iqcjy.FINSPESTARTDATE AS FInspeStartDate,
|
|
|
+ iqcjy.FINSPECTSTATUS AS FInspecStatus
|
|
|
+ FROM srm_pr_main pr
|
|
|
+ LEFT JOIN PurOrdDetail pod ON pr.pr_billno = pod.Req
|
|
|
+ LEFT JOIN vscm_cgshrk sh ON pod.PurOrd = sh.OrdNbr AND pod.Line = sh.OrdLine
|
|
|
+ LEFT JOIN scm_jhjh_jq jq ON pod.PurOrd = jq.cgdd AND pod.Line = jq.ddhh
|
|
|
+ LEFT JOIN (
|
|
|
+ SELECT
|
|
|
+ f.po_bill,
|
|
|
+ f.po_billline,
|
|
|
+ a.FINSPESTARTDATE,
|
|
|
+ b.FAPPLYTIME,
|
|
|
+ b.FBILLNO,
|
|
|
+ a.FMATERIALCFG,
|
|
|
+ a.wlmc,
|
|
|
+ a.ggxh,
|
|
|
+ a.FRINSQTY,
|
|
|
+ c.FINSPECTSTATUS
|
|
|
+ FROM qms_qcp_inspbill a
|
|
|
+ LEFT JOIN qms_qcp_inspecapplyn b ON a.lydjbh = b.FBILLNO
|
|
|
+ LEFT JOIN qms_qcp_insappnentry c ON b.id = c.glid
|
|
|
+ LEFT JOIN scm_shd cd ON c.shdh = cd.shddh
|
|
|
+ LEFT JOIN scm_shdzb f ON f.shpc = c.FLOTNUMBER AND f.sh_material_code = c.FMATERIALCFG AND f.glid = cd.id
|
|
|
+ ) iqcjy ON pod.PurOrd = iqcjy.po_bill AND pod.Line = iqcjy.po_billline
|
|
|
+ WHERE jq.flag = '1'
|
|
|
+ AND pr.sentry_id IS NOT NULL
|
|
|
+ AND pr.sentry_id = @EntryId
|
|
|
+ ORDER BY iqcjy.FAPPLYTIME DESC
|
|
|
""";
|
|
|
- return await _db.Ado.SqlQueryAsync<FlowIqcRow>(sql, new SugarParameter("@Mono", mono));
|
|
|
+ return await _db.Ado.SqlQueryAsync<FlowIqcRow>(sql, new { EntryId = entryId });
|
|
|
}
|
|
|
|
|
|
// ── Tab8 FQC信息 ──
|
|
|
- private async Task<List<FlowFqcRow>> QueryFqc(string? mono)
|
|
|
+ private async Task<List<FlowFqcRow>> QueryFqc(long entryId)
|
|
|
{
|
|
|
- if (string.IsNullOrWhiteSpace(mono)) return new();
|
|
|
const string sql = """
|
|
|
SELECT
|
|
|
- ROW_NUMBER() OVER (ORDER BY f.FINSPEENDDATE) AS Sno,
|
|
|
- f.WorkOrd, f.sczld, f.FBILLNO,
|
|
|
- f.FMATERIALCFG AS FMaterialCfg,
|
|
|
- f.wlmc AS Wlmc,
|
|
|
- f.ggxh AS Ggxh,
|
|
|
- f.scph AS Scph,
|
|
|
- f.FRINSQTY AS FRinsQty,
|
|
|
- f.FINSPEENDDATE AS FInspeEndDate
|
|
|
- FROM mes_fqc_bill f
|
|
|
- WHERE f.WorkOrd = @Mono
|
|
|
- ORDER BY f.FINSPEENDDATE
|
|
|
+ ROW_NUMBER() OVER (ORDER BY a.FBILLNO ASC) AS Sno,
|
|
|
+ b.WorkOrd,
|
|
|
+ a.sczld,
|
|
|
+ a.FBILLNO,
|
|
|
+ a.FMATERIALCFG AS FMaterialCfg,
|
|
|
+ a.wlmc,
|
|
|
+ a.ggxh,
|
|
|
+ a.scph,
|
|
|
+ CAST(a.FRINSQTY AS DECIMAL(18,2)) AS FRinsQty,
|
|
|
+ a.FINSPEENDDATE AS FInspeEndDate
|
|
|
+ FROM qms_qcpp_inspbill a
|
|
|
+ LEFT JOIN WorkOrdMaster b ON a.sczld = b.Batch
|
|
|
+ LEFT JOIN mes_moentry c ON b.WorkOrd = c.moentry_mono
|
|
|
+ WHERE c.soentry_id = @EntryId
|
|
|
+ ORDER BY a.FBILLNO
|
|
|
""";
|
|
|
- return await _db.Ado.SqlQueryAsync<FlowFqcRow>(sql, new SugarParameter("@Mono", mono));
|
|
|
+ return await _db.Ado.SqlQueryAsync<FlowFqcRow>(sql, new { EntryId = entryId });
|
|
|
}
|
|
|
|
|
|
// ── Tab8 生产入库 ──
|
|
|
- private async Task<List<FlowReceiptRow>> QueryReceipt(string? mono)
|
|
|
+ private async Task<List<FlowReceiptRow>> QueryReceipt(long entryId)
|
|
|
{
|
|
|
- if (string.IsNullOrWhiteSpace(mono)) return new();
|
|
|
const string sql = """
|
|
|
SELECT
|
|
|
- ROW_NUMBER() OVER (ORDER BY r.CreateTime) AS Sno,
|
|
|
- r.Status, r.WorkOrd, r.itemnum AS ItemNum, r.descr AS Descr,
|
|
|
- r.UM, r.QtyOrded, r.CompQty,
|
|
|
- r.inspection_number AS InspectionNumber,
|
|
|
- r.qualified_number AS QualifiedNumber,
|
|
|
- r.QtyChangeAdvance,
|
|
|
- r.moentry_prdname AS MoentryPrdName,
|
|
|
- r.moentry_wrkcname AS MoentryWrkcName,
|
|
|
- r.OrdDate, r.DueDate, r.CreateTime
|
|
|
- FROM mes_production_receipt r
|
|
|
- WHERE r.WorkOrd = @Mono
|
|
|
- ORDER BY r.CreateTime
|
|
|
+ ROW_NUMBER() OVER (ORDER BY mo.morder_no) AS Sno,
|
|
|
+ CASE
|
|
|
+ WHEN c.Status = 'r' THEN '下达'
|
|
|
+ WHEN c.Status = 'c' THEN '关闭'
|
|
|
+ WHEN c.Status = 'w' THEN '投产'
|
|
|
+ ELSE '初始'
|
|
|
+ END AS Status,
|
|
|
+ c.WorkOrd,
|
|
|
+ im.Um,
|
|
|
+ c.QtyOrded,
|
|
|
+ IFNULL(compp.CompQty, 0) AS CompQty,
|
|
|
+ NULL AS InspectionNumber,
|
|
|
+ NULL AS QualifiedNumber,
|
|
|
+ CASE WHEN a.QtyChange > 0 THEN a.QtyChange ELSE 0 END AS QtyChangeAdvance,
|
|
|
+ mo.moentry_prdname,
|
|
|
+ mo.moentry_wrkcname,
|
|
|
+ c.OrdDate,
|
|
|
+ c.DueDate,
|
|
|
+ a.CreateTime,
|
|
|
+ c.itemnum AS ItemNum,
|
|
|
+ im.descr AS Descr
|
|
|
+ FROM WorkOrdMaster c
|
|
|
+ LEFT JOIN InvTransHist a ON a.WorkOrd = c.WorkOrd AND a.TransType = 'rct-wo' AND a.QtyChange > 0
|
|
|
+ LEFT JOIN GeneralizedCodeMaster b ON a.TransType = b.Val AND b.FldName = 'TransType' AND b.`Domain` = c.`Domain`
|
|
|
+ LEFT JOIN ItemMaster im ON c.ItemNum = im.ItemNum AND im.`Domain` = c.`Domain`
|
|
|
+ LEFT JOIN PeriodSequenceDet det ON det.ItemNum = im.ItemNum AND det.WorkOrds = c.WorkOrd AND det.`Domain` = c.`Domain`
|
|
|
+ LEFT JOIN (
|
|
|
+ SELECT WorkOrds, SUM(IFNULL(CompQty, 0)) AS CompQty
|
|
|
+ FROM PeriodSequenceDet
|
|
|
+ GROUP BY WorkOrds
|
|
|
+ ) compp ON c.WorkOrd = compp.WorkOrds
|
|
|
+ LEFT JOIN mes_morder mo ON mo.morder_no = c.WorkOrd AND mo.IsDeleted = 0
|
|
|
+ LEFT JOIN mes_moentry motry ON motry.moentry_moid = mo.Id AND motry.IsDeleted = 0
|
|
|
+ WHERE motry.soentry_id = @EntryId
|
|
|
+ ORDER BY mo.morder_no
|
|
|
""";
|
|
|
- return await _db.Ado.SqlQueryAsync<FlowReceiptRow>(sql, new SugarParameter("@Mono", mono));
|
|
|
+ return await _db.Ado.SqlQueryAsync<FlowReceiptRow>(sql, new { EntryId = entryId });
|
|
|
}
|
|
|
|
|
|
- // ── Tab8 成品发运 ──
|
|
|
+ // ── Tab8 成品发运(与订单行 OrdNbr + 行物料一致)──
|
|
|
private async Task<List<FlowShipmentRow>> QueryShipment(long entryId)
|
|
|
{
|
|
|
const string sql = """
|
|
|
SELECT
|
|
|
- ROW_NUMBER() OVER (ORDER BY d.ShipDate) AS Sno,
|
|
|
- d.Id, d.Location, d.ShipDate,
|
|
|
- d.QtyToShip, d.RealQty,
|
|
|
- d.Location AS LocationCode
|
|
|
- FROM ASNBOLShipperDetail d
|
|
|
- JOIN crm_seorderentry entry ON d.ContainerItem = entry.item_number
|
|
|
- JOIN crm_seorder sorder ON d.OrdNbr = sorder.bill_no
|
|
|
- AND sorder.Id = entry.seorder_id
|
|
|
- WHERE entry.Id = @Id AND d.IsActive = 1
|
|
|
- ORDER BY d.ShipDate
|
|
|
+ ROW_NUMBER() OVER (ORDER BY ad.Id) AS Sno,
|
|
|
+ ad.Id,
|
|
|
+ ad.location AS Location,
|
|
|
+ ad.UpdateTime AS ShipDate,
|
|
|
+ CAST(ad.QtyToShip AS DECIMAL(18,2)) AS QtyToShip,
|
|
|
+ lm.LocationCode,
|
|
|
+ ad.RealQty
|
|
|
+ FROM ASNBOLShipperDetail ad
|
|
|
+ INNER JOIN ASNBOLShipperMaster am ON ad.ASNBOLShipperRecID = am.RecID
|
|
|
+ LEFT JOIN LocationMaster lm ON ad.location = lm.Location
|
|
|
+ INNER JOIN crm_seorderentry se ON se.id = @EntryId
|
|
|
+ AND ad.ContainerItem = se.item_number
|
|
|
+ INNER JOIN crm_seorder so ON so.Id = se.seorder_id AND ad.OrdNbr = so.bill_no
|
|
|
+ WHERE am.shtype = 'SH'
|
|
|
+ AND am.typed <> 'S'
|
|
|
+ ORDER BY ad.Id
|
|
|
""";
|
|
|
- return await _db.Ado.SqlQueryAsync<FlowShipmentRow>(sql, new { Id = entryId });
|
|
|
+ return await _db.Ado.SqlQueryAsync<FlowShipmentRow>(sql, new { EntryId = entryId });
|
|
|
}
|
|
|
}
|