|
|
@@ -0,0 +1,122 @@
|
|
|
+using Admin.NET.Plugin.AiDOP.FinishedWarehouse.Dto;
|
|
|
+
|
|
|
+namespace Admin.NET.Plugin.AiDOP.FinishedWarehouse;
|
|
|
+
|
|
|
+/// <summary>
|
|
|
+/// S7 生产入库单列表 只读 list 服务。
|
|
|
+///
|
|
|
+/// 数据源:aidopdev.NbrMaster ⋈ NbrDetail(Type='WOI' 生产入库、IsActive=1),忠实复刻证据 sql.txt:
|
|
|
+/// LEFT JOIN DepartmentMaster(部门)、ItemMaster(名称/规格/单位),明细粒度(一行一 NbrDetail)。
|
|
|
+/// 口径由 SQL 内定义:单据号=Nbr;入库日期=Date;状态=Status;入库类型=Remark;入库数量=QtyRec;
|
|
|
+/// ERP工单号=Address;相关单号=OrdNbr。排序 Nbr DESC, Line。
|
|
|
+/// Domain 由 GeneralizedCodeMaster(SystemConfig/CompanyCode) 解析,默认 8010。
|
|
|
+///
|
|
|
+/// 本服务仅 SELECT:无新增/编辑/删除/入库写入/库存事务/状态流转;NbrMaster 无 tenant_id,不做租户过滤。
|
|
|
+/// </summary>
|
|
|
+[ApiDescriptionSettings(Order = 310, Description = "生产入库单列表")]
|
|
|
+[Route("api/S7ProductionInbound")]
|
|
|
+[AllowAnonymous]
|
|
|
+[NonUnify]
|
|
|
+public class ProductionInboundService : IDynamicApiController, ITransient
|
|
|
+{
|
|
|
+ private readonly ISqlSugarClient _db;
|
|
|
+
|
|
|
+ public ProductionInboundService(ISqlSugarClient db)
|
|
|
+ {
|
|
|
+ _db = db;
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>解析公司域(GeneralizedCodeMaster SystemConfig/CompanyCode,默认 8010)。</summary>
|
|
|
+ private async Task<string> ResolveDomainAsync()
|
|
|
+ {
|
|
|
+ var list = await _db.Ado.SqlQueryAsync<string>(
|
|
|
+ "SELECT Domain FROM GeneralizedCodeMaster WHERE FldName='SystemConfig' AND Val='CompanyCode' ORDER BY RecID LIMIT 1");
|
|
|
+ var domain = list.FirstOrDefault();
|
|
|
+ return string.IsNullOrWhiteSpace(domain) ? "8010" : domain;
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 生产入库单列表(只读分页查询)。
|
|
|
+ /// </summary>
|
|
|
+ [DisplayName("生产入库单列表")]
|
|
|
+ [HttpGet("list")]
|
|
|
+ public async Task<object> GetList([FromQuery] ProductionInboundListInput input)
|
|
|
+ {
|
|
|
+ var page = input.Page <= 0 ? 1 : input.Page;
|
|
|
+ var pageSize = input.PageSize <= 0 ? 10 : input.PageSize;
|
|
|
+ var offset = (page - 1) * pageSize;
|
|
|
+
|
|
|
+ var domain = await ResolveDomainAsync();
|
|
|
+
|
|
|
+ var where = new List<string> { "n.Domain = @Domain", "n.Type = 'WOI'", "n.IsActive = 1" };
|
|
|
+ var pars = new List<SugarParameter> { new("@Domain", domain) };
|
|
|
+
|
|
|
+ if (!string.IsNullOrWhiteSpace(input.InboundNo))
|
|
|
+ {
|
|
|
+ where.Add("n.Nbr LIKE @InboundNo");
|
|
|
+ pars.Add(new SugarParameter("@InboundNo", $"%{input.InboundNo.Trim()}%"));
|
|
|
+ }
|
|
|
+ if (!string.IsNullOrWhiteSpace(input.WorkOrderNo))
|
|
|
+ {
|
|
|
+ where.Add("d.WorkOrd LIKE @WorkOrderNo");
|
|
|
+ pars.Add(new SugarParameter("@WorkOrderNo", $"%{input.WorkOrderNo.Trim()}%"));
|
|
|
+ }
|
|
|
+ if (!string.IsNullOrWhiteSpace(input.ErpWorkOrderNo))
|
|
|
+ {
|
|
|
+ where.Add("d.Address LIKE @ErpWorkOrderNo");
|
|
|
+ pars.Add(new SugarParameter("@ErpWorkOrderNo", $"%{input.ErpWorkOrderNo.Trim()}%"));
|
|
|
+ }
|
|
|
+ if (!string.IsNullOrWhiteSpace(input.Batch))
|
|
|
+ {
|
|
|
+ where.Add("d.LotSerial LIKE @Batch");
|
|
|
+ pars.Add(new SugarParameter("@Batch", $"%{input.Batch.Trim()}%"));
|
|
|
+ }
|
|
|
+ if (!string.IsNullOrWhiteSpace(input.InboundDateStart))
|
|
|
+ {
|
|
|
+ where.Add("n.Date >= @InboundDateStart");
|
|
|
+ pars.Add(new SugarParameter("@InboundDateStart", $"{input.InboundDateStart.Trim()} 00:00:00"));
|
|
|
+ }
|
|
|
+ if (!string.IsNullOrWhiteSpace(input.InboundDateEnd))
|
|
|
+ {
|
|
|
+ where.Add("n.Date <= @InboundDateEnd");
|
|
|
+ pars.Add(new SugarParameter("@InboundDateEnd", $"{input.InboundDateEnd.Trim()} 23:59:59"));
|
|
|
+ }
|
|
|
+
|
|
|
+ var whereSql = string.Join(" AND ", where);
|
|
|
+
|
|
|
+ var total = await _db.Ado.GetIntAsync(
|
|
|
+ $"SELECT COUNT(1) FROM NbrMaster n LEFT JOIN NbrDetail d ON n.Domain = d.Domain AND n.Nbr = d.Nbr WHERE {whereSql}",
|
|
|
+ pars);
|
|
|
+
|
|
|
+ var list = await _db.Ado.SqlQueryAsync<ProductionInboundListRow>(
|
|
|
+ $"""
|
|
|
+ SELECT
|
|
|
+ n.Nbr AS InboundNo,
|
|
|
+ d.Line AS LineNo,
|
|
|
+ n.Date AS InboundDate,
|
|
|
+ n.Status AS Status,
|
|
|
+ n.Remark AS InboundType,
|
|
|
+ d.ProdLine AS ProductionLine,
|
|
|
+ d.WorkOrd AS WorkOrderNo,
|
|
|
+ d.Address AS ErpWorkOrderNo,
|
|
|
+ d.ItemNum AS MaterialCode,
|
|
|
+ i.Descr AS MaterialName,
|
|
|
+ i.Descr1 AS Spec,
|
|
|
+ d.LocationTo AS InboundLocation,
|
|
|
+ d.LotSerial AS Batch,
|
|
|
+ d.QtyRec AS Qty,
|
|
|
+ i.UM AS Unit,
|
|
|
+ d.OrdNbr AS RelatedBillNo,
|
|
|
+ d.CreateTime AS CreateTime
|
|
|
+ FROM NbrMaster n
|
|
|
+ LEFT JOIN NbrDetail d ON n.Domain = d.Domain AND n.Nbr = d.Nbr
|
|
|
+ LEFT JOIN ItemMaster i ON d.Domain = i.Domain AND d.ItemNum = i.ItemNum
|
|
|
+ WHERE {whereSql}
|
|
|
+ ORDER BY n.Nbr DESC, d.Line
|
|
|
+ LIMIT {pageSize} OFFSET {offset}
|
|
|
+ """,
|
|
|
+ pars);
|
|
|
+
|
|
|
+ return new { total, page, pageSize, list };
|
|
|
+ }
|
|
|
+}
|