using NewPdaSqlServer.DB; using NewPdaSqlServer.Dto.service; using NewPdaSqlServer.entity; using NewPdaSqlServer.service.@base; using NewPdaSqlServer.util; using SqlSugar; using System.Text; using System.Data; using System.Data.SqlClient; using System.Dynamic; using static Microsoft.EntityFrameworkCore.DbLoggerCategory; namespace NewPdaSqlServer.service.Warehouse; // 期初条码入库 public class InventoryManager : RepositoryNoEntity { // 这个方法用于扫描库位条码 public string ScanDepotNo(WarehouseQuery query) { var p_section_code = query.DepotCode; // 检查库位代码是否为空 if (string.IsNullOrEmpty(p_section_code)) throw new Exception("002[请扫库位条码!"); // 查询库区库位信息 var depotSection = Db.Queryable((a, b) => new JoinQueryInfos( JoinType.Inner, a.DepotGuid == b.Guid )) .Where((a, b) => a.DepotSectionCode == p_section_code) .Select((a, b) => new { a.DepotSectionName, b.DepotCode, b.DepotName }) .Single(); // 如果库位代码不存在,则返回错误信息 if (depotSection == null) throw new Exception("库位编码 " + p_section_code + " 不存在,请确认!"); // 返回成功信息 return "仓库:" + depotSection.DepotName + " 库位:" + depotSection.DepotSectionName; } // 这个方法用于扫描条码 public WarehouseQuery ScanBarcode(WarehouseQuery query) { var p_item_barcode = query.barcode; var p_section_code = query.DepotCode; var c_user = query.userName; var p_bill_type_id = 100; var p_transction_no = 601; // 检查库位代码是否为空 // if (string.IsNullOrEmpty(p_section_code)) // throw new Exception("002[请扫库位条码!"); // 查询库区库位信息 var depotSection = Db.Queryable((a, b) => new JoinQueryInfos( JoinType.Inner, a.DepotGuid == b.Guid )) .Where((a, b) => a.DepotSectionCode == p_section_code) .Select((a, b) => new { a.DepotSectionName, b.DepotCode, b.DepotName, b.DepotId,b.FSubsidiary }) .Single(); // 如果库位代码不存在,则返回错误信息 // if (depotSection == null) // throw new Exception("库位编码 " + p_section_code + " 不存在,请确认!"); // 检查是否已经收货 // var c_num = Db.Queryable((a, b) => // new JoinQueryInfos( // JoinType.Inner, a.Guid == b.ItemInId // )) // .Where((a, b) => b.ItemBarcode == p_item_barcode) // .Count(); // if (c_num > 0) throw new Exception("002[条码重复扫描,请核对!"); // 查询条码信息 // c_num = Db.Queryable() // .Where(t => t.ItemBarcode == p_item_barcode) // .Count(); // if (c_num > 0) throw new Exception("002[条码已在库存中,请核对!"); // 查询条码详细信息 var c_mes_inv_item_barcodes = Db.Queryable() .Where(t => t.ItemBarcode == p_item_barcode) .Single(); // if (c_mes_inv_item_barcodes == null) // throw new Exception("002[条码不存在,请核对!"); if (c_mes_inv_item_barcodes.Memo != "初期物料") throw new Exception("002[条码不是期初条码,无法用期初入库!"); var wmsManager = new WmsBaseMangeer(); // 新增入库校验(调用存储过程) var checkResult = wmsManager.pdaInvJY( db: Db, edtUserNo: query.userName, barcode: p_item_barcode, sectionCode: p_section_code, stockId: depotSection.DepotId.ToString(), stockOrgId: depotSection.FSubsidiary, billNo: "", // 根据实际单据号传值 transactionNo: "601" // 事务类型与存储过程匹配 ); if ( Convert.ToInt32(checkResult.result) < 1) throw new Exception($"入库校验失败:{checkResult.strMsg}"); UseTransaction(db => { // 自动生成入库单 var c_id = db.Queryable() .Where(d => d.Sapstatus == 0 && d.InsDate.Value.ToString("yyyy-MM-dd") == DateTime.Now.ToString("yyyy-MM-dd") && d.Status == 0 && d.TransctionNo == p_transction_no.ToString() && d.CbillNo == c_mes_inv_item_barcodes.BillNo && (d.SuppId ?? "0") == (c_mes_inv_item_barcodes.SuppId ?? "0") && d.DepotsCode == depotSection.DepotCode) .Single(); if (c_id == null) { var billNo = BillNo.GetBillNo("IN(入库单)"); // 生成入库单号 var newMesInvItemIns = new MesInvItemIns { Guid = Guid.NewGuid(), TransctionNo = p_transction_no.ToString(), DepotsCode = depotSection.DepotCode, DepotsId = depotSection.DepotId, BillTypeId = p_bill_type_id, CreateBy = c_user, CreateDate = DateTime.Now, LastupdateBy = c_user, LastupdateDate = DateTime.Now, BillNo = billNo, SuppId = c_mes_inv_item_barcodes.SuppId, SuppNo = c_mes_inv_item_barcodes.SuppNo, UrgentFlag = c_mes_inv_item_barcodes.UrgentFlag == null ? null : c_mes_inv_item_barcodes.UrgentFlag.Value ? "1" : "0", CbillNo = c_mes_inv_item_barcodes.BillNo, Fstatus = 0, ReceiveOrgId = depotSection.FSubsidiary, InType = "期初入库", }; db.Insertable(newMesInvItemIns) .IgnoreColumns(true) .ExecuteCommand(); c_id = newMesInvItemIns; } // 插入入库单明细 db.Insertable(new MesInvItemInCDetails { Guid = Guid.NewGuid(), ItemInId = c_id.Guid, BillNo = c_id.BillNo, ItemBarcode = p_item_barcode, Quantity = c_mes_inv_item_barcodes.Quantity, BarcodeFlag = true, EpFlag = true, WorkType = 1, ItemNo = c_mes_inv_item_barcodes.ItemNo, LotNo = c_mes_inv_item_barcodes.LotNo, SuppNo = c_mes_inv_item_barcodes.SuppNo, DepotId = depotSection.DepotId, DepotCode = depotSection.DepotCode, DepotSectionCode = p_section_code, ItemSname = c_mes_inv_item_barcodes.ItemSname, Unit = c_mes_inv_item_barcodes.Unit, CreateBy = c_user, CreateDate = DateTime.Now, LastupdateBy = c_user, LastupdateDate = DateTime.Now, Remark = c_mes_inv_item_barcodes.Memo, Ebeln = c_mes_inv_item_barcodes.Mblnr, EbelnLineNo = c_mes_inv_item_barcodes.Zeile, WorkNo = c_mes_inv_item_barcodes.WorkNo, WorkLine = c_mes_inv_item_barcodes.WorkLine, CbillNo = c_mes_inv_item_barcodes.BillNo, UrgentFlag = c_mes_inv_item_barcodes.UrgentFlag, BoardStyle = c_mes_inv_item_barcodes.BoardStyle, TaskNo = c_mes_inv_item_barcodes.TaskNo, ItemId = c_mes_inv_item_barcodes.ItemId, ReceiveOrgId = depotSection.FSubsidiary, }).IgnoreColumns(true).ExecuteCommand(); db.Insertable(new MesInvBusiness2 { Guid = Guid.NewGuid(), Status = 1, BillTypeId = p_bill_type_id, TransactionCode = p_transction_no.ToString(), BusinessType = 1, ItemBarcode = p_item_barcode, ItemNo = c_mes_inv_item_barcodes.ItemNo, LotNo = c_mes_inv_item_barcodes.LotNo, EpFlag = true, Quantity = c_mes_inv_item_barcodes.Quantity, InvDepotId = depotSection.DepotId, ToInvDepotsCode = depotSection.DepotCode, ToInvDepotSectionsCode = p_section_code, CreateBy = c_user, CreateDate = DateTime.Now, LastupdateBy = c_user, LastupdateDate = DateTime.Now, TaskNo = c_mes_inv_item_barcodes.TaskNo, BillNo = c_id.BillNo, WorkNo = c_mes_inv_item_barcodes.WorkNo, WorkLine = c_mes_inv_item_barcodes.WorkLine, SuppNo = c_mes_inv_item_barcodes.SuppNo, ItemId = c_mes_inv_item_barcodes.ItemId }).IgnoreColumns(true).ExecuteCommand(); // 插入库存信息 db.Insertable(new MesInvItemStocks { Guid = Guid.NewGuid(), TaskNo = c_mes_inv_item_barcodes.TaskNo, ItemBarcode = p_item_barcode, ItemNo = c_mes_inv_item_barcodes.ItemNo, LotNo = c_mes_inv_item_barcodes.LotNo, Quantity = c_mes_inv_item_barcodes.Quantity, EpFlag = c_mes_inv_item_barcodes.EpFlag == null ? null : (byte)(c_mes_inv_item_barcodes.EpFlag.Value ? 1 : 0), DepotsCode = depotSection.DepotCode, DepotId = depotSection.DepotId, DepotsId = depotSection.DepotId, DepotSectionsCode = p_section_code, CheckDate = c_mes_inv_item_barcodes.CreateDate, IndepDate = c_mes_inv_item_barcodes.CreateDate, BoardStyle = c_mes_inv_item_barcodes.BoardStyle, WorkNo = c_mes_inv_item_barcodes.WorkNo, WorkLine = c_mes_inv_item_barcodes.WorkLine, // ItemUnit = c_mes_inv_item_barcodes.Unit, SuppNo = c_mes_inv_item_barcodes.SuppNo, ItemId = c_mes_inv_item_barcodes.ItemId, IndepUserCode = c_user, StockOrgId = depotSection.FSubsidiary, // Fsubsidiary = c_organize }).IgnoreColumns(true).ExecuteCommand(); return 1; }); var mesItems = Db.Queryable() .Where(s => s.Id == c_mes_inv_item_barcodes.ItemId) .First(); query.itemNo = mesItems.ItemNo; query.Num = c_mes_inv_item_barcodes.Quantity; query.message = "物料 " + c_mes_inv_item_barcodes.ItemNo + " 本次收货总数: " + c_mes_inv_item_barcodes.Quantity; // 返回成功信息 return query; } public dynamic GetDepoptsInfo(dynamic unity) { //// 使用参数化查询防止SQL注入 var sqlParams = new List { new("@sectionCode", unity.sectionCode) }; var sql2 = @" SELECT TOP 1 B.depot_code + '('+B.depot_name+')' depotsInfo, B.FSubsidiary, C.FNumber + '('+C.NAME+')' orgInfo FROM MES_DEPOT_SECTIONS A LEFT JOIN MES_DEPOTS B ON A.depot_guid = B.Guid LEFT JOIN SYS_ORGANIZATION C ON C.FID = B.FSubsidiary WHERE a.depot_section_code = @sectionCode;"; var XcslItem = Db.Ado.SqlQuery(sql2, sqlParams).FirstOrDefault(); // 检查结果有效性 if (XcslItem == null) { throw new Exception($"库位 [{unity.sectionCode}] 不存在,或所属仓库状态异常(可能被禁用或删除)。"); } return XcslItem; // 返回第一行数据,如果没有则返回 null } public dynamic GetItemsList(dynamic unity) { var sqlParams = new List { new("@orgId", unity.orgId) }; var sql2 = new StringBuilder(@" SELECT TOP 20 item_id, item_no, item_name, item_model,item_no+'---'+item_name AS wlInfo FROM MES_ITEMS WHERE FSubsidiary = @orgId"); if (!string.IsNullOrWhiteSpace(unity.selectKey?.ToString())) { sqlParams.Add(new("@selectKey", unity.selectKey)); sql2.Append(@" AND (item_no LIKE '%' + @selectKey + '%' OR item_name LIKE '%' + @selectKey + '%' OR item_model LIKE '%' + @selectKey + '%')"); } var XcslItem = Db.Ado.SqlQuery(sql2.ToString(), sqlParams); if (XcslItem == null) { throw new Exception("该条件下无对应物料信息,请重新输入!"); } return XcslItem; } public List ExecuteBeginBar(dynamic query) { if (query == null) throw new ArgumentNullException(nameof(query), "参数对象不能为null"); // 增强参数校验 if (string.IsNullOrEmpty(query.userName?.ToString())) throw new ArgumentException("用户账号不能为空", nameof(query.userName)); if (string.IsNullOrEmpty(query.itemid?.ToString())) throw new ArgumentException("物料ID不能为空", nameof(query.itemid)); var resultList = new List(); using (var conn = new SqlConnection(DbHelperSQL.strConn)) using (var cmd = new SqlCommand("rpt_BeginBar", conn)) { cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.AddRange(new[] { new SqlParameter("@inUser", SqlDbType.NVarChar, 50) { Value = query.userName }, new SqlParameter("@inItemId", SqlDbType.NVarChar, 50) { Value = query.itemid }, new SqlParameter("@isDesign", SqlDbType.Int) { Value = 0 }, new SqlParameter("@in4", SqlDbType.NVarChar, 20) { Value = query.in4 ?? DBNull.Value }, new SqlParameter("@in5", SqlDbType.NVarChar, 20) { Value = query.num ?? DBNull.Value } }); try { conn.Open(); using (var reader = cmd.ExecuteReader()) { while (reader.Read()) { var barcode = reader.GetString(0); // 构建符合方法签名的参数对象 var scanQuery = new WarehouseQuery { barcode = barcode, DepotCode = query.sectionCode, // 从原始query获取库位编码 userName = query.userName // 从原始query获取用户账号 }; try { // 调用正式签名方法 ScanBarcode(scanQuery); var printData = GetPrintBar(barcode); resultList.Add(printData); } catch (Exception ex) { throw new Exception($"期初条码打印入库存在异常{ex.Message},请重新打印!"); } } } return resultList; } catch (Exception ex) { throw new Exception($"生成期初条码失败:{ex.Message}"); } } } public dynamic GetPrintBar(string barcode) { var sqlParams = new List { new("@barcode", barcode) }; var sql1 = @" 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 B.ITEM_BARCODE = @barcode"; var XcslItem = Db.Ado.SqlQuery(sql1, sqlParams).First(); return XcslItem; } }