| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- using Admin.NET.Plugin.AiDOP.MaterialWarehouse.Dto;
- namespace Admin.NET.Plugin.AiDOP.MaterialWarehouse;
- /// <summary>
- /// 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,不做租户过滤。
- /// </summary>
- [ApiDescriptionSettings(Order = 304, Description = "盘点结果查询")]
- [Route("api/S5StocktakeResult")]
- [AllowAnonymous]
- [NonUnify]
- public class StocktakeResultService : IDynamicApiController, ITransient
- {
- private readonly ISqlSugarClient _db;
- public StocktakeResultService(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] 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<string> { "m.Domain = @Domain", "m.IsTag = 1" };
- var pars = new List<SugarParameter> { 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<StocktakeResultListRow>(
- $"""
- 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 };
- }
- }
|