namespace NewPdaSqlServer.service.@base { using NewPdaSqlServer.Dto.service; using NewPdaSqlServer.entity; using SqlSugar; using System; using static Microsoft.EntityFrameworkCore.DbLoggerCategory; using System.Data; using NewPdaSqlServer.DB; using System.Data.SqlClient; using Microsoft.EntityFrameworkCore.Metadata.Internal; public class MesPrintMangeer : Repository { public dynamic getPrintInfo(dynamic query) { // 使用参数化查询防止SQL注入 var sqlParams = new List { new("@userAccount", query.userName) }; var sql1 = @"SELECT TOP 1 ip,port fROM print_info A left join SYS_USER_BIND B on A.guid = B.aboutGuid left join SYS_USER C ON C.GUID = B.userGuid WHERE C.ACCOUNT = @userAccount AND B.fType = '打印机'"; var printInfo = Db.Ado.SqlQuery(sql1, sqlParams); if (printInfo.Count < 1 ) throw new Exception("当前用户未绑定打印机,请维护后使用拆分功能!"); return printInfo; } public dynamic getCfInfo(dynamic query) // 使用具体类型替代dynamic { // 参数校验 if (string.IsNullOrEmpty(query?.cfBarcode)) throw new ArgumentException("拆分条码不能为空"); if (string.IsNullOrEmpty(query?.barcode)) throw new ArgumentException("原始条码不能为空"); // 使用强类型参数 var sqlParams = new List { new("@cfBar", query.cfBarcode.Trim()), new("@oldBar", query.barcode.Trim()) }; var sql = @"SELECT TOP 1 C.ITEM_NO,C.item_name,C.item_model,B.OLDQTY as QUANTITY,B.CREATE_DATE, '拆分条码' AS BarType,A.ITEM_BARCODE,GETDATE() as print_date FROM MES_INV_ITEM_STOCKS A LEFT JOIN MES_INV_ITEM_BARCODES B ON A.ITEM_BARCODE = B.ITEM_BARCODE LEFT JOIN MES_ITEMS C ON C.item_id = B.ITEM_ID WHERE A.ITEM_BARCODE = @cfBar UNION ALL SELECT TOP 1 C.ITEM_NO,C.item_name,C.item_model,A.QUANTITY as QUANTITY,B.CREATE_DATE, '原始条码' AS BarType,A.ITEM_BARCODE,GETDATE() as print_date FROM MES_INV_ITEM_STOCKS A LEFT JOIN MES_INV_ITEM_BARCODES B ON A.ITEM_BARCODE = B.ITEM_BARCODE LEFT JOIN MES_ITEMS C ON C.item_id = B.ITEM_ID WHERE A.ITEM_BARCODE = @oldBar"; var mergedData = Db.Ado.SqlQuery(sql, sqlParams); if (mergedData.Count < 2) throw new Exception("条码信息存在异常,请联系管理员!"); return mergedData; } // // 现场收料展示列表 // public class PrintBarInfo // { // public List cfBarInfo { get; set; } // public List oldBarInfo { get; set; } // } public dynamic getCfBeforeInfo(dynamic query) // 使用具体类型替代dynamic { // 参数校验 if (string.IsNullOrEmpty(query?.cfBarcode)) throw new ArgumentException("拆分条码不能为空"); if (string.IsNullOrEmpty(query?.barcode)) throw new ArgumentException("原始条码不能为空"); // 使用强类型参数 var sqlParams = new List { new("@cfBar", query.cfBarcode.Trim()), new("@oldBar", query.barcode.Trim()) }; var sql = @"SELECT TOP 1 C.ITEM_NO,C.item_name,C.item_model,B.OLDQTY as QUANTITY,B.CREATE_DATE, '拆分条码' AS BarType,B.ITEM_BARCODE,GETDATE() as print_date FROM MES_INV_ITEM_BARCODES B LEFT JOIN MES_ITEMS C ON C.item_id = B.ITEM_ID WHERE B.ITEM_BARCODE = @cfBar UNION ALL SELECT TOP 1 C.ITEM_NO,C.item_name,C.item_model,B.QUANTITY as QUANTITY,B.CREATE_DATE, '原始条码' AS BarType,B.ITEM_BARCODE,GETDATE() as print_date FROM MES_INV_ITEM_BARCODES B LEFT JOIN MES_ITEMS C ON C.item_id = B.ITEM_ID WHERE B.ITEM_BARCODE = @oldBar"; var mergedData = Db.Ado.SqlQuery(sql, sqlParams); if (mergedData.Count < 2) throw new Exception("条码信息存在异常,请联系管理员!"); return mergedData; } /*-------------------------------2025-10-25 重写拆分条码返回信息新增打印人信息返回----------------------------------*/ public dynamic getCfInfo(dynamic query, dynamic unity) // 使用具体类型替代dynamic { // 参数校验 if (string.IsNullOrEmpty(query?.cfBarcode)) throw new ArgumentException("拆分条码不能为空"); if (string.IsNullOrEmpty(query?.barcode)) throw new ArgumentException("原始条码不能为空"); var printUser = GetPrinterUserNameByAccount(unity.userName.Trim()); // 使用强类型参数 var sqlParams = new List { new("@cfBar", query.cfBarcode.Trim()), new("@oldBar", query.barcode.Trim()), new("@printBy", printUser) }; // 3. 执行SQL查询(通过UNION ALL合并原始条码与拆分后条码的信息) var sql = @"SELECT TOP 1 C.ITEM_NO, C.item_name, C.item_model, @printBy AS printBy, B.OLDQTY AS QUANTITY, B.CREATE_DATE, '拆分条码' AS barType, B.ITEM_BARCODE, u.fname AS unit, GETDATE() AS print_date FROM MES_INV_ITEM_BARCODES B LEFT JOIN MES_ITEMS C ON C.item_id = B.ITEM_ID LEFT JOIN MES_UNIT u ON u.id = C.storeunit WHERE B.ITEM_BARCODE = @cfBar UNION ALL SELECT TOP 1 C.ITEM_NO, C.item_name, C.item_model, @printBy AS printBy, B.QUANTITY AS QUANTITY, B.CREATE_DATE, '原始条码' AS barType, B.ITEM_BARCODE, u.fname AS unit, GETDATE() AS print_date FROM MES_INV_ITEM_BARCODES B LEFT JOIN MES_ITEMS C ON C.item_id = B.ITEM_ID LEFT JOIN MES_UNIT u ON u.id = C.storeunit WHERE B.ITEM_BARCODE = @oldBar"; var mergedData = Db.Ado.SqlQuery(sql, sqlParams); if (mergedData.Count < 2) throw new Exception("条码信息存在异常,请联系管理员!"); return mergedData; } /// /// 获取入库前拆分的条码信息(含原始条码与拆分后条码的物料、打印相关数据) /// /// 拆分结果对象(需包含原始条码barcode、拆分后条码cfBarcode) /// 查询参数对象(需包含打印人userName) /// 合并后的条码信息列表(原始条码+拆分后条码,共2条数据) /// 参数为空时抛出 /// 条码信息异常时抛出 public dynamic getCfBeforeInfo(dynamic query, dynamic unity) // 注:建议后续替换为具体实体类型(如BarSplitResult、WarehouseQuery) { // 1. 参数合法性校验(确保核心条码和打印人信息不为空) if (string.IsNullOrEmpty(query?.cfBarcode?.Trim())) throw new ArgumentException("拆分后条码不能为空"); if (string.IsNullOrEmpty(query?.barcode?.Trim())) throw new ArgumentException("原始条码不能为空"); if (string.IsNullOrEmpty(unity?.userName?.Trim())) throw new ArgumentException("打印人(userName)不能为空"); var printUser = GetPrinterUserNameByAccount(unity.userName.Trim()); // 2. 构建SQL参数(避免SQL注入,统一处理参数空格) var sqlParams = new List { new("@cfBar", query.cfBarcode.Trim()), // 拆分后的新条码 new("@oldBar", query.barcode.Trim()), // 拆分前的原始条码 new("@printBy", printUser) // 执行打印操作的用户 }; // 3. 执行SQL查询(通过UNION ALL合并原始条码与拆分后条码的信息) var sql = @"SELECT TOP 1 C.ITEM_NO, C.item_name, C.item_model, @printBy AS printBy, B.OLDQTY AS QUANTITY, B.CREATE_DATE, '拆分条码' AS barType, B.ITEM_BARCODE, u.fname AS unit, GETDATE() AS print_date FROM MES_INV_ITEM_BARCODES B LEFT JOIN MES_ITEMS C ON C.item_id = B.ITEM_ID LEFT JOIN MES_UNIT u ON u.id = C.storeunit WHERE B.ITEM_BARCODE = @cfBar UNION ALL SELECT TOP 1 C.ITEM_NO, C.item_name, C.item_model, @printBy AS printBy, B.QUANTITY AS QUANTITY, B.CREATE_DATE, '原始条码' AS barType, B.ITEM_BARCODE, u.fname AS unit, GETDATE() AS print_date FROM MES_INV_ITEM_BARCODES B LEFT JOIN MES_ITEMS C ON C.item_id = B.ITEM_ID LEFT JOIN MES_UNIT u ON u.id = C.storeunit WHERE B.ITEM_BARCODE = @oldBar"; // 4. 执行查询并处理结果 var mergedData = Db.Ado.SqlQuery(sql, sqlParams); // 校验结果:需同时获取到原始条码和拆分后条码的信息(共2条数据) if (mergedData?.Count != 2) throw new Exception("条码信息存在异常(未查询到完整的原始/拆分条码数据),请联系管理员!"); return mergedData; } /// /// 公共方法:根据用户账号查询对应的打印机用户名 /// /// 用户账号(即原unity.userName) /// 用户-打印机关联表名(默认值可根据实际表名配置) /// 匹配的打印机用户名 /// 入参为空时抛出 /// 未查询到数据或结果为空时抛出 public string GetPrinterUserNameByAccount(string userAccount) { // 1. 入参校验 if (string.IsNullOrEmpty(userAccount?.Trim())) throw new ArgumentException("查询打印机用户的入参【userAccount】不能为空"); // 2. 构建参数化查询(防SQL注入) var userParams = new List { new("@userAccount", userAccount.Trim()) }; // 3. 动态表名的SQL(适配不同表名场景) var userSql = @"SELECT C.USER_NAME FROM SYS_USER C WHERE C.ACCOUNT = @userAccount "; // 4. 执行查询 var printUsers = Db.Ado.SqlQuery(userSql, userParams); if (printUsers == null || printUsers.Count == 0) throw new Exception($"未查询到账号【{userAccount}】对应的打印机用户信息"); // 5. 提取并校验结果(取第一个匹配值,可根据业务调整为多值处理) var printUser = printUsers.First()?.USER_NAME?.Trim(); if (string.IsNullOrEmpty(printUser)) throw new Exception($"账号【{userAccount}】查询到的打印机用户名为空"); return printUser; } } }