ProductionInboundService.cs 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. using Admin.NET.Plugin.AiDOP.FinishedWarehouse.Dto;
  2. namespace Admin.NET.Plugin.AiDOP.FinishedWarehouse;
  3. /// <summary>
  4. /// S7 生产入库单列表 只读 list 服务。
  5. ///
  6. /// 数据源(2026-07-30 起):DOP 数据中台标准层 mdp_std_production_receipt(扁平,一行=一条 NbrDetail 明细)。
  7. /// 该 std 由 ProductionReceiptMdpSyncService 从 aidopdev.NbrMaster/NbrDetail Type='WOI'(生产入库)同步标准化而来,且已双源(dopdemorq)。
  8. /// S7 成品入库与 S5 生产收货读同一批 WOI 数据(过滤逐字相同)→ CTO 拍板复用该 std、不另建管线/实体(S5-list 与 S7-list 展示同一 WOI 单据的两个视角)。
  9. ///
  10. /// 口径映射(std 列 → 列表列):入库单号=nbr;行号=line;入库日期=receipt_date;状态=status;入库类型=remark;
  11. /// 生产线=prod_line;工单号=work_ord;ERP工单号=erp_work_ord;物料编码=item_num;名称=item_name;规格=item_spec;
  12. /// 入库库位=location_to;批次=lot_serial;入库数量=qty_rec;单位=um;相关单号=ord_nbr。
  13. ///
  14. /// 本服务仅 SELECT:无新增/编辑/删除/入库写入/库存事务/状态流转。租户口径对齐 ProductionReceiptService:
  15. /// 仅当 input.TenantId>0 才按 m.tenant_id 过滤(receipt std tenant 由同步入站上下文赋值,默认租户可能空态)。
  16. /// </summary>
  17. [ApiDescriptionSettings(Order = 310, Description = "生产入库单列表")]
  18. [Route("api/S7ProductionInbound")]
  19. [AllowAnonymous]
  20. [NonUnify]
  21. public class ProductionInboundService : IDynamicApiController, ITransient
  22. {
  23. private readonly ISqlSugarClient _db;
  24. public ProductionInboundService(ISqlSugarClient db)
  25. {
  26. _db = db;
  27. }
  28. /// <summary>
  29. /// 生产入库单列表(只读分页查询,扁平:一行=一条明细;读数据中台标准层 mdp_std_production_receipt)。
  30. /// </summary>
  31. [DisplayName("生产入库单列表")]
  32. [HttpGet("list")]
  33. public async Task<object> GetList([FromQuery] ProductionInboundListInput input)
  34. {
  35. var page = input.Page <= 0 ? 1 : input.Page;
  36. var pageSize = input.PageSize <= 0 ? 10 : input.PageSize;
  37. var offset = (page - 1) * pageSize;
  38. var where = new List<string> { "1=1" };
  39. var pars = new List<SugarParameter>();
  40. if (input.TenantId is > 0)
  41. {
  42. where.Add("m.tenant_id = @TenantId");
  43. pars.Add(new SugarParameter("@TenantId", input.TenantId));
  44. }
  45. if (!string.IsNullOrWhiteSpace(input.InboundNo))
  46. {
  47. where.Add("m.nbr LIKE @InboundNo");
  48. pars.Add(new SugarParameter("@InboundNo", $"%{input.InboundNo.Trim()}%"));
  49. }
  50. if (!string.IsNullOrWhiteSpace(input.WorkOrderNo))
  51. {
  52. where.Add("m.work_ord LIKE @WorkOrderNo");
  53. pars.Add(new SugarParameter("@WorkOrderNo", $"%{input.WorkOrderNo.Trim()}%"));
  54. }
  55. if (!string.IsNullOrWhiteSpace(input.ErpWorkOrderNo))
  56. {
  57. where.Add("m.erp_work_ord LIKE @ErpWorkOrderNo");
  58. pars.Add(new SugarParameter("@ErpWorkOrderNo", $"%{input.ErpWorkOrderNo.Trim()}%"));
  59. }
  60. if (!string.IsNullOrWhiteSpace(input.Batch))
  61. {
  62. where.Add("m.lot_serial LIKE @Batch");
  63. pars.Add(new SugarParameter("@Batch", $"%{input.Batch.Trim()}%"));
  64. }
  65. if (!string.IsNullOrWhiteSpace(input.InboundDateStart))
  66. {
  67. where.Add("m.receipt_date >= @InboundDateStart");
  68. pars.Add(new SugarParameter("@InboundDateStart", $"{input.InboundDateStart.Trim()} 00:00:00"));
  69. }
  70. if (!string.IsNullOrWhiteSpace(input.InboundDateEnd))
  71. {
  72. where.Add("m.receipt_date <= @InboundDateEnd");
  73. pars.Add(new SugarParameter("@InboundDateEnd", $"{input.InboundDateEnd.Trim()} 23:59:59"));
  74. }
  75. var whereSql = string.Join(" AND ", where);
  76. var total = await _db.Ado.GetIntAsync(
  77. $"SELECT COUNT(1) FROM mdp_std_production_receipt m WHERE {whereSql}", pars);
  78. var list = await _db.Ado.SqlQueryAsync<ProductionInboundListRow>(
  79. $"""
  80. SELECT
  81. m.nbr AS InboundNo,
  82. m.line AS LineNo,
  83. m.receipt_date AS InboundDate,
  84. m.status AS Status,
  85. m.remark AS InboundType,
  86. m.prod_line AS ProductionLine,
  87. m.work_ord AS WorkOrderNo,
  88. m.erp_work_ord AS ErpWorkOrderNo,
  89. m.item_num AS MaterialCode,
  90. m.item_name AS MaterialName,
  91. m.item_spec AS Spec,
  92. m.location_to AS InboundLocation,
  93. m.lot_serial AS Batch,
  94. m.qty_rec AS Qty,
  95. m.um AS Unit,
  96. m.ord_nbr AS RelatedBillNo,
  97. m.create_time AS CreateTime
  98. FROM mdp_std_production_receipt m
  99. WHERE {whereSql}
  100. ORDER BY m.nbr DESC, m.line
  101. LIMIT {pageSize} OFFSET {offset}
  102. """,
  103. pars);
  104. return new { total, page, pageSize, list };
  105. }
  106. }