using Masuit.Tools; using NewPdaSqlServer.DB; using NewPdaSqlServer.Dto.service; using NewPdaSqlServer.entity; using NewPdaSqlServer.entity.Base; using NewPdaSqlServer.util; using SqlSugar; using System.Data; using System.Data.SqlClient; using System.Security.Cryptography; namespace NewPdaSqlServer.service.Warehouse; /// /// MES物料表管理类 /// public class MesItemTblManager : Repository { /// /// 获取生产退料单号列表 /// /// 退料单号列表 public dynamic GetSCTLBillNo(WarehouseQuery query, dynamic RequestInfo) { var orgId = RequestInfo.OrgId; if (orgId == null) throw new Exception("组织不存在!"); // 获取未完成的退料单号列表 var parameters = new[] { new SugarParameter("@pi_orgId", orgId), new SugarParameter("@type", query.Type), new SugarParameter("@inP1", null), new SugarParameter("@inP2", null), new SugarParameter("@inP3", null), new SugarParameter("@inP4", null) }; try { // 返回单号字符串列表 var blDetails = Db.Ado.SqlQuery( "EXEC prc_pda_sctl_list @pi_orgId,@type,@inP1,@inP2,@inP3,@inP4", parameters); return blDetails; } catch (Exception ex) { throw new Exception($"{ex.Message}"); } } /// /// 根据单号获取MES物料表明细 /// /// 仓库查询参数 /// 物料明细列表 public dynamic GetMesItemTblDetailByBillNo(dynamic query, dynamic RequestInfo) { if (string.IsNullOrEmpty(query.billNo)) throw new Exception("请选单据号!"); if (query == null) throw new ArgumentNullException(nameof(query), "参数对象不能为null"); if (string.IsNullOrEmpty(query.billNo?.ToString())) throw new ArgumentException("单据号不能为空", nameof(query.billNo)); var orgId = RequestInfo.OrgId; if (orgId == null) throw new Exception("组织不存在!"); // 获取未完成的销售退货明细 var parameters = new[] { new SugarParameter("@billNo", query.billNo), new SugarParameter("@pi_orgId",orgId), new SugarParameter("@inP1", null), new SugarParameter("@inP2", null), new SugarParameter("@inP3", null), new SugarParameter("@inP4", null) }; try { List? blDetails = Db.Ado.SqlQuery( "EXEC prc_pda_sctl_detailList @billNo,@pi_orgId,@inP1,@inP2,@inP3,@inP4", parameters); var items = blDetails.Where(x => x.DSQty > 0).ToList(); // 待扫物料 var ysitems = blDetails.Where(x => x.SQty > 0).ToList(); // 已扫物料 return new { items = items, ysitems = ysitems, Count = items.Count + ysitems.Count }; } catch (Exception ex) { // 保异常处理逻辑 throw new Exception($"{ex.Message}"); } } /// /// 生产退料扫描库位 /// /// 仓库查询参数 /// 库位信息 public WarehouseQuery SctlScanDepots(WarehouseQuery query) { if (query.DepotCode.IsNullOrEmpty()) throw new NullReferenceException("请扫库位条码"); // 关联查询库位分区和库位信息 var warehouseQuery = Db.Queryable((a, b) => new JoinQueryInfos(JoinType.Inner, a.DepotGuid == b.Guid)) .Where((a, b) => a.DepotSectionCode == query.DepotCode) .Select((a, b) => new WarehouseQuery { DepotSectionName = a.DepotSectionName, DepotName = b.DepotName, DepotCode = b.DepotCode }).First(); if (warehouseQuery == null) throw new Exception("库位编码" + query.DepotCode + " 不存在,请确认!"); return warehouseQuery; } /// /// 生产退料扫描条码 /// /// 仓库查询参数 /// 处理结果 public dynamic SctlScanBarcode(WarehouseQuery query,dynamic RequestInfo) { // 验证条码信息 var barcode = Db.Queryable() .Where(x => x.ItemBarcode == query.barcode) .First(); if (barcode == null) throw new Exception($"无此条码,请核对!{query.barcode}"); // 验证物料信息 var item = Db.Queryable() .Where(x => x.Id == barcode.ItemId) .First(); if (item == null) throw new Exception($"无此物料,请核对!{query.barcode}"); // 验证退料单信息 var returnOrder = Db.Queryable() .Where(x => x.BillNo == query.billNo && (x.Tbl013 ?? 0) == 1) .First(); if (returnOrder == null) throw new Exception("申请单已撤回,无法扫码!"); if (returnOrder.Tbl020 == 1) throw new Exception("扫码完成,申请单已完结!"); // 验证组织是否存在 var orgId = RequestInfo.OrgId; if (orgId == null) throw new Exception("组织不存在!"); // 生产退料 using (var conn = new SqlConnection(DbHelperSQL.strConn)) using (var cmd = new SqlCommand("PRC_PDA_SCTL", conn)) { try { conn.Open(); cmd.CommandType = CommandType.StoredProcedure; var parameters = new[] { new SqlParameter("@PI_USER", query.userName), new SqlParameter("@PI_BARCODE", query.barcode), new SqlParameter("@PI_BILL_NO", query.billNo), new SqlParameter("@PI_SECTION_CODE", query.DepotCode), new SqlParameter("@pi_orgId", orgId), new SqlParameter("@PI_INP1", DBNull.Value), new SqlParameter("@PI_INP2", DBNull.Value), new SqlParameter("@PO_OUT_MSG", SqlDbType.NVarChar) { Direction = ParameterDirection.Output, Size = 2000 }, new SqlParameter("@PO_OUT_SUM", SqlDbType.Int) { Direction = ParameterDirection.Output }, new SqlParameter("@PO_ITEM_NO", SqlDbType.NVarChar) { Direction = ParameterDirection.Output, Size = 100 }, new SqlParameter("@PO_QUANTITY", SqlDbType.Decimal) { Direction = ParameterDirection.Output, Precision = 18, // 根据实际数据库精度调整 Scale = 10 // 根据实际数据库小数位调整 } }; cmd.Parameters.AddRange(parameters); cmd.ExecuteNonQuery(); var outMsg = parameters[7].Value?.ToString() ?? string.Empty; var outSum = parameters[8].Value != DBNull.Value ? Convert.ToInt32(parameters[8].Value) : -1; var itemNo = parameters[9].Value?.ToString() ?? string.Empty; var quantity = parameters[10].Value != DBNull.Value ? Convert.ToDecimal(parameters[10].Value) : 0m; if (outSum == -1) throw new Exception(outMsg); query.itemNo = itemNo; query.Num = quantity; query.message = outMsg; return query; } catch (Exception ex) { throw new Exception(ex.Message); } finally { conn.Close(); } } } }