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();
}
}
}
}