using Admin.NET.Plugin.AiDOP.FinishedWarehouse.Dto; namespace Admin.NET.Plugin.AiDOP.FinishedWarehouse; /// /// 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,不做租户过滤。 /// [ApiDescriptionSettings(Order = 310, Description = "生产入库单列表")] [Route("api/S7ProductionInbound")] [AllowAnonymous] [NonUnify] public class ProductionInboundService : IDynamicApiController, ITransient { private readonly ISqlSugarClient _db; public ProductionInboundService(ISqlSugarClient db) { _db = db; } /// 解析公司域(GeneralizedCodeMaster SystemConfig/CompanyCode,默认 8010)。 private async Task ResolveDomainAsync() { var list = await _db.Ado.SqlQueryAsync( "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; } /// /// 生产入库单列表(只读分页查询)。 /// [DisplayName("生产入库单列表")] [HttpGet("list")] public async Task 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 { "n.Domain = @Domain", "n.Type = 'WOI'", "n.IsActive = 1" }; var pars = new List { 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( $""" 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 }; } }