using Admin.NET.Plugin.AiDOP.MaterialWarehouse.Dto; namespace Admin.NET.Plugin.AiDOP.MaterialWarehouse; /// /// S5 盘点结果查询 只读 list 服务。 /// /// 数据源:aidopdev.MissedPrint(盘点标签 IsTag=1),忠实复刻证据 sql.txt: /// LEFT JOIN ItemMaster(名称/规格/单位),过滤 m.Domain=@Domain AND m.IsTag=1。 /// 盘点口径由 SQL 内定义(非脑补): /// 账面(标签数量)=Qty;实盘数量=CompQty;差异数量=CompQty-Qty; /// 盘点状态=CompQty≠Qty?'有差异':'正常';状态=Status='Q'?'冻结':'';实际库位=FirmString2;实际货架=FirmString4。 /// Domain 由 GeneralizedCodeMaster(SystemConfig/CompanyCode) 解析,默认 8010。排序 UpdateTime DESC, RecID DESC。 /// /// 本服务仅 SELECT:无新增/编辑/删除/库存事务/状态流转;MissedPrint 无 tenant_id,不做租户过滤。 /// [ApiDescriptionSettings(Order = 304, Description = "盘点结果查询")] [Route("api/S5StocktakeResult")] [AllowAnonymous] [NonUnify] public class StocktakeResultService : IDynamicApiController, ITransient { private readonly ISqlSugarClient _db; public StocktakeResultService(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] StocktakeResultListInput 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 { "m.Domain = @Domain", "m.IsTag = 1" }; var pars = new List { new("@Domain", domain) }; if (!string.IsNullOrWhiteSpace(input.MaterialCode)) { where.Add("m.ItemNum LIKE @MaterialCode"); pars.Add(new SugarParameter("@MaterialCode", $"%{input.MaterialCode.Trim()}%")); } if (!string.IsNullOrWhiteSpace(input.InvStatus)) { var s = input.InvStatus.Trim(); if (s == "有差异") where.Add("m.CompQty <> m.Qty"); else if (s == "正常") where.Add("m.CompQty = m.Qty"); } var whereSql = string.Join(" AND ", where); var total = await _db.Ado.GetIntAsync($"SELECT COUNT(1) FROM MissedPrint m WHERE {whereSql}", pars); var list = await _db.Ado.SqlQueryAsync( $""" SELECT m.ItemNum AS MaterialCode, i.Descr AS MaterialName, i.Descr1 AS Spec, m.Location AS Location, m.Shelf AS Shelf, m.FirmString2 AS ActLocation, m.FirmString4 AS ActShelf, m.LotSerial AS BatchNo, i.UM AS Unit, m.Qty AS TagQty, m.CompQty AS CountQty, (m.CompQty - m.Qty) AS QtyDiff, (CASE WHEN m.Status = 'Q' THEN '冻结' ELSE '' END) AS Status, (CASE WHEN m.CompQty <> m.Qty THEN '有差异' ELSE '正常' END) AS InvStatus, m.UpdateUser AS CountUser, m.UpdateTime AS CountTime FROM MissedPrint m LEFT JOIN ItemMaster i ON m.Domain = i.Domain AND m.ItemNum = i.ItemNum WHERE {whereSql} ORDER BY m.UpdateTime DESC, m.RecID DESC LIMIT {pageSize} OFFSET {offset} """, pars); return new { total, page, pageSize, list }; } }