using System.Data; using System.Data.SqlClient; using MES.Service.Modes; using NewPdaSqlServer.DB; using NewPdaSqlServer.Dto.service; using NewPdaSqlServer.entity; using NewPdaSqlServer.entity.Base; using SqlSugar; namespace NewPdaSqlServer.service.Warehouse; /// /// 调拨出入库管理类 /// 负责处理调拨出库相关的业务逻辑 /// public class TransferOutManager : Repository { /// /// 获取未完成的调拨出库单号列表 /// /// 未完成的调拨出库单号列表 public List GetTransferOutNoList() { // 先从数据库获取Transfer_Out_ETAIL表的数据 var transferOutDetails = Db.Queryable().ToList(); // 使用LINQ对获取的数据进行分组和筛选 // 筛选条件:申请数量(sq)不等于已扫数量(ys)的记录 var result = transferOutDetails .GroupBy(x => x.Pid) .Select(g => new { pid = g.Key, sq = g.Sum(x => x.FQty), // 申请数量合计 ys = g.Sum(x => x.SQty), // 调出已扫数量合计 rs = g.Sum(x => x.RQty), // 调入已扫数量合计 }) .Where(x => !((x.sq ?? 0) == (x.ys ?? 0) && (x.sq ?? 0) == (x.rs ?? 0))) .Select(x => x.pid) .ToList(); // 根据pid查询对应的出库单号 var billNos = Db.Queryable() .Where(x => result.Contains(x.Id) && x.FApproveStatus == 1) .Select(x => x.FBillNo) .ToList(); return billNos; } /// /// 根据单据号获取待处理的调拨出库明细列表 /// /// 查询参数,包含单据号 /// 待处理的调拨出库明细列表 public List GetTransferOutDetailListByBillNo( WarehouseQuery query) { var p_bill_no = query.billNo; // 根据SQL查询条件获取待处理的出库明细 // 关联查询TransferOutDetail、TransferOut和MesItems三张表 // 筛选条件:未完成数量大于0且单据已审核 var result = Db.Queryable( (b, a, s) => new JoinQueryInfos( JoinType.Left, b.Pid == a.Id, JoinType.Left, b.FMaterialId == s.Id.ToString())) .Where((b, a, s) => !((b.FQty ?? 0) == (b.SQty ?? 0) && (b.FQty ?? 0) == (b.RQty ?? 0)) && a.FBillNo == p_bill_no // 匹配单据号 && a.FApproveStatus == 1) // 单据已审核 .OrderBy((b, a, s) => s.ItemNo) .Select((b, a, s) => new ItemDetailModel { ItemNo = s.ItemNo, ItemName = s.ItemName, ItemModel = s.ItemModel, FQty = b.FQty, // 申请数量 SQty = b.SQty, // 已扫数量 RQty = b.RQty, // 已扫数量 // 保留其他必要字段... Pid = b.Pid.ToString(), FMaterialId = b.FMaterialId, Id = b.Id.ToString() }) .ToList(); if(result.Count < 1) throw new Exception("该调拨单不存在或已扫完,请重新扫描"); return result; } public List GetDBCKDetal( WarehouseQuery query) { var p_bill_no = query.billNo; // 根据SQL查询条件获取待处理的出库明细 // 关联查询TransferOutDetail、TransferOut和MesItems三张表 // 筛选条件:未完成数量大于0且单据已审核 var result = Db.Queryable( (b, a, s) => new JoinQueryInfos( JoinType.Left, b.Pid == a.Id, JoinType.Left, b.FMaterialId == s.Id.ToString())) .Where((b, a, s) => !((b.FQty ?? 0) == (b.SQty ?? 0) && (b.FQty ?? 0) == (b.RQty ?? 0)) // 未完成数量大于0 && a.FBillNo == p_bill_no // 匹配单据号 && a.FApproveStatus == 1) // 单据已审核 .OrderBy((b, a, s) => s.ItemNo) .Select((b, a, s) => new ItemDetailModel { ItemNo = s.ItemNo, ItemName = s.ItemName, ItemModel = s.ItemModel, FQty = b.FQty, // 申请数量 SQty = b.SQty, // 已扫数量 RQty = b.RQty, // 保留其他必要字段... Pid = b.Pid.ToString(), FMaterialId = b.FMaterialId, Id = b.Id.ToString() }) .ToList(); return result; } /// /// 扫描条码进行调拨出库处理 /// /// 包含单据号、用户名和条码信息的查询参数 /// 处理后的表单和待处理明细列表 public (WarehouseQuery form, List items) ScanMoveBarcode(WarehouseQuery query) { var p_bill_no = query.billNo; var p_item_barcode = query.barcode; // 验证单据号 if (string.IsNullOrEmpty(p_bill_no)) throw new Exception("请选取单据号!"); // 查询出库单并验证状态 var transferOut = Db.Queryable() .Where(x => x.FBillNo == p_bill_no && x.FApproveStatus == 1) .First(); if (transferOut == null) throw new Exception("未找到调拨申请单或者调拨申请单没审核"); // 查询条码库存信息并验证 var stock = Db.Queryable() .Where(x => x.ItemBarcode == p_item_barcode && x.Quantity > 0 && !string.IsNullOrEmpty(x.DepotsCode)) .First(); if (stock == null) throw new Exception($"库存中无此条码,请核对!{p_item_barcode}"); // 查询物料信息 var item = Db.Queryable() .Where(x => x.Id == stock.ItemId) .First(); if (item == null) throw new Exception("未找到物料"); var _strMsg = ""; var _intSum = ""; using (var conn = new SqlConnection(DbHelperSQL.strConn)) { using (var cmd = new SqlCommand("[prc_pda_DBCK]", conn)) { try { conn.Open(); cmd.CommandType = CommandType.StoredProcedure; SqlParameter[] parameters = { new("@outMsg", SqlDbType.NVarChar, 300), new("@outSum", SqlDbType.NVarChar, 300), new("@barcode_num", SqlDbType.NVarChar, 300), new("@split_num", SqlDbType.NVarChar, 300), new("@c_user", query.userName), new("@p_bill_no", p_bill_no), new("@p_item_barcode", p_item_barcode), }; parameters[0].Direction = ParameterDirection.Output; parameters[1].Direction = ParameterDirection.Output; parameters[2].Direction = ParameterDirection.Output; parameters[3].Direction = ParameterDirection.Output; foreach (var parameter in parameters) cmd.Parameters.Add(parameter); cmd.ExecuteNonQuery(); _strMsg = parameters[0].Value.ToString(); _intSum = parameters[1].Value.ToString(); var barcodeNum = parameters[2].Value.ToString(); var splitNum = parameters[3].Value.ToString(); var result = Convert.ToInt32(_intSum); if (result <= 0) throw new Exception(_strMsg); query.itemNo = item.ItemNo; query.Num = Convert.ToDecimal(barcodeNum); query.Fum = Convert.ToDecimal(splitNum); // 返回更新后的表单和待处理明细 return (query, GetDBCKDetal(query)); } catch (Exception ex) { throw new Exception(ex.Message); } finally { conn.Close(); } } } } /// /// 扫描条码进行调拨入库处理 /// /// 包含单据号、用户名和条码信息的查询参数 /// 处理后的表单和待处理明细列表 public (WarehouseQuery form, List items) ScanReceiveBarcode(WarehouseQuery query) { var p_bill_no = query.billNo; var p_item_barcode = query.barcode; var barinfo = Db.Queryable() .Where(x => x.ItemBarcode == p_item_barcode) .First(); // 验证单据号 if (string.IsNullOrEmpty(p_bill_no)) throw new Exception("请选取单据号!"); // 查询出库单并验证状态 var transferOut = Db.Queryable() .Where(x => x.FBillNo == p_bill_no && x.FApproveStatus == 1) .First(); if (transferOut == null) throw new Exception("未找到调拨申请单或者调拨申请单没审核"); // 查询条码库存信息并验证 var stock = Db.Queryable() .Where(x => x.FMaterialId == barinfo.ItemId.ToString() && x.FQty > 0 && !string.IsNullOrEmpty(x.FStockInId) && !string.IsNullOrEmpty(x.FOwnerInId)) .First(); if (stock == null) throw new Exception($"调拨明细中 【物料】或 【调入仓库】或【调入货主】信息不存在,请核对!{p_item_barcode}"); // 查询物料信息 var item = Db.Queryable() .Where(x => x.Id.ToString() == stock.FMaterialId) .First(); if (item == null) throw new Exception("未找到物料"); var _strMsg = ""; var _intSum = ""; using (var conn = new SqlConnection(DbHelperSQL.strConn)) { using (var cmd = new SqlCommand("[prc_pda_DBRK]", conn)) { try { conn.Open(); cmd.CommandType = CommandType.StoredProcedure; SqlParameter[] parameters = { new("@outMsg", SqlDbType.NVarChar, 300), new("@outSum", SqlDbType.NVarChar, 300), new("@barcode_num", SqlDbType.NVarChar, 300), new("@split_num", SqlDbType.NVarChar, 300), new("@c_user", query.userName), new("@p_bill_no", p_bill_no), new("@p_item_barcode", p_item_barcode), new("@p_depot_section_code", query.sectionCode), }; parameters[0].Direction = ParameterDirection.Output; parameters[1].Direction = ParameterDirection.Output; parameters[2].Direction = ParameterDirection.Output; parameters[3].Direction = ParameterDirection.Output; foreach (var parameter in parameters) cmd.Parameters.Add(parameter); cmd.ExecuteNonQuery(); _strMsg = parameters[0].Value.ToString(); _intSum = parameters[1].Value.ToString(); var barcodeNum = parameters[2].Value.ToString(); var splitNum = parameters[3].Value.ToString(); var result = Convert.ToInt32(_intSum); if (result <= 0) throw new Exception(_strMsg); query.itemNo = item.ItemNo; query.Num = Convert.ToDecimal(barcodeNum); query.Fum = Convert.ToDecimal(splitNum); // 返回更新后的表单和待处理明细 return (query, GetDBCKDetal(query)); } catch (Exception ex) { throw new Exception(ex.Message); } finally { conn.Close(); } } } } //调拨出库拆分 prc_pda_DBCK_CF public string SplitBarcode(WarehouseQuery query) { var _strMsg = ""; var _intSum = ""; using (var conn = new SqlConnection(DbHelperSQL.strConn)) { using (var cmd = new SqlCommand("[prc_pda_DBRK]", conn)) { try { conn.Open(); cmd.CommandType = CommandType.StoredProcedure; SqlParameter[] parameters = { new("@outMsg", SqlDbType.NVarChar, 300), new("@outSum", SqlDbType.NVarChar, 300), new("@c_user", query.userName), new("@p_bill_no", query.billNo), new("@p_item_barcode", query.barcode), new("@NUM", query.Fum), }; parameters[0].Direction = ParameterDirection.Output; parameters[1].Direction = ParameterDirection.Output; foreach (var parameter in parameters) cmd.Parameters.Add(parameter); cmd.ExecuteNonQuery(); _strMsg = parameters[0].Value.ToString(); _intSum = parameters[1].Value.ToString(); var result = Convert.ToInt32(_intSum); if (result <= 0) throw new Exception(_strMsg); return _strMsg; } catch (Exception ex) { throw new Exception(ex.Message); } finally { conn.Close(); } } } } }