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(WarehouseQuery query, dynamic RequestInfo)
{
var orgId = RequestInfo.OrgId;
if (orgId == null)
throw new Exception("组织不存在!");
// 获取未完成的退料单号列表
var parameters = new[]
{
new SugarParameter("@pi_orgId", orgId),
new SugarParameter("@inP1", null),
new SugarParameter("@inP2", null),
new SugarParameter("@inP3", null),
new SugarParameter("@inP4", null)
};
try
{
// 返回单号字符串列表Get_Qt_ck_List
var list = Db.Ado.SqlQuery(
"EXEC prc_pda_dbck_list @pi_orgId,@inP1,@inP2,@inP3,@inP4", parameters);
return list;
}
catch (Exception ex)
{
throw new Exception($"{ex.Message}");
}
}
///
/// 根据单据号获取待处理的调拨出库明细列表
///
/// 查询参数,包含单据号
/// 待处理的调拨出库明细列表
public dynamic GetTransferOutDetailListByBillNo(WarehouseQuery 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_dbck_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
{
//tbBillList = result,
blDetails = blDetails.Where(x => x.DSQty > 0).ToList(),
ysDetails = blDetails.Where(x => x.SQty > 0).ToList(),
Count = items.Count + ysitems.Count
};
}
catch (Exception ex)
{
// 保留原有异常处理逻辑
throw new Exception($"{ex.Message}");
}
}
///
/// 根据单据号获取待处理的调拨出库明细列表
///
/// 查询参数,包含单据号
/// 待处理的调拨出库明细列表
public ProductionPickDto GetTransferInDetailListByBillNo(
WarehouseQuery query)
{
if (string.IsNullOrEmpty(query.billNo)) throw new Exception("调拨单号为空");
var sql1 = string.Format(@"SELECT * FROM MES_DBCK WHERE FDocumentStatus = 'C' AND FBillNo = '{0}'", query.billNo);
var dbck = Db.Ado.SqlQuery(sql1);
if (dbck.Count < 1) throw new Exception("调拨单号不存在或未审核!");
var sql2 = string.Format(@"SELECT c.item_no ItemNo,c.item_name ItemName,c.item_model ItemModel,b.FQty FQty,b.SQty SQty,b.RQty RQty,b.SQty - b.RQty DSQty ,
dbo.F_QX_GETRECODEPOTSE(B.FMATERIALID,'','','') as RecoKw
FROM MES_DBCK_DETAIL B
LEFT JOIN MES_DBCK A ON A.ID = B.pid
LEFT JOIN MES_ITEMS C ON B.FMATERIALID = C.item_id
LEFT JOIN WOMCAB D ON B.erpid = D.ERPID
WHERE A.FBillNo = '{0}' ORDER BY FSEQ", query.billNo);
var womdabs = Db.Ado.SqlQuery(sql2);
var DS_list = womdabs.Where(s => s.DSQty > 0).ToList();
var YS_list = womdabs.Where(s => s.RQty > 0).ToList();
//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("该调拨单不存在或已扫完,请重新扫描");
var dto = new ProductionPickDto
{
items = DS_list,
Ysitems = YS_list
// yisao = mesInvItemOutCDetailsList
};
return dto;
}
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 ProductionPickDto
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)
.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));
var dto = new ProductionPickDto
{
itemNo = item.ItemNo,
barcodeNum = barcodeNum,
splitNum = splitNum,
barcode = query.barcode,
strMsg = _strMsg,
result = _intSum
};
return dto;
}
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("@outBillNo", 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 outBillNo = 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);
query.billNo = outBillNo;
// 返回更新后的表单和待处理明细
return (query, GetDBCKDetal(query));
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
finally
{
conn.Close();
}
}
}
}
public ProductionPickDto ScanCodeCF(WarehouseQuery query)
{
var p_bill_no = query.daa001;
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 = "";
var _cfBar = "";
using (var conn = new SqlConnection(DbHelperSQL.strConn))
{
using (var cmd = new SqlCommand("[prc_pda_DBCK_CF]", conn))
{
try
{
conn.Open();
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter[] parameters =
{
new("@outMsg", SqlDbType.NVarChar, 2000),
new("@outSum", SqlDbType.NVarChar, 300),
new("@outCfBar", SqlDbType.NVarChar, 300),
new("@c_User", query.userName),
new("@p_biLL_no", query.daa001),
new("@p_item_barcode", query.barcode),
new("@num", query.Num)
};
parameters[0].Direction = ParameterDirection.Output;
parameters[1].Direction = ParameterDirection.Output;
parameters[2].Direction = ParameterDirection.Output;
foreach (var parameter in parameters)
cmd.Parameters.Add(parameter);
cmd.ExecuteNonQuery();
_strMsg = parameters[0].Value.ToString();
_intSum = parameters[1].Value.ToString();
_cfBar = parameters[2].Value.ToString();
var result = Convert.ToInt32(_intSum);
if (result <= 0) throw new Exception(_strMsg);
var dto = new ProductionPickDto
{
daa001 = query.daa001,
barcode = query.barcode,//原条码
cfBarcode = _cfBar//拆分后条码
};
return dto;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
finally
{
conn.Close();
}
}
}
}
}