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;
|
|
/// <summary>
|
/// 调拨出入库管理类
|
/// 负责处理调拨出库相关的业务逻辑
|
/// </summary>
|
public class TransferOutManager : Repository<MesDbck>
|
{
|
/// <summary>
|
/// 获取未完成的调拨出库单号列表
|
/// </summary>
|
/// <returns>未完成的调拨出库单号列表</returns>
|
public List<string> GetTransferOutNoList()
|
{
|
// 先从数据库获取Transfer_Out_ETAIL表的数据
|
var transferOutDetails = Db.Queryable<MesDbckDetail>().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<MesDbck>()
|
.Where(x => result.Contains(x.Id) && x.FApproveStatus == 1)
|
.OrderBy(x => x.FCreateDate)
|
.Select(x => x.FBillNo)
|
.ToList();
|
|
return billNos;
|
}
|
|
/// <summary>
|
/// 根据单据号获取待处理的调拨出库明细列表
|
/// </summary>
|
/// <param name="query">查询参数,包含单据号</param>
|
/// <returns>待处理的调拨出库明细列表</returns>
|
public ProductionPickDto GetTransferOutDetailListByBillNo(
|
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<ItemDetailModel>(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.FQty - b.SQty 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<ItemDetailModel>(sql2);
|
|
|
var DS_list = womdabs.Where(s => s.DSQty > 0).ToList();
|
|
var YS_list = womdabs.Where(s => s.SQty > 0).ToList();
|
|
//var p_bill_no = query.billNo;
|
|
//// 根据SQL查询条件获取待处理的出库明细
|
//// 关联查询TransferOutDetail、TransferOut和MesItems三张表
|
//// 筛选条件:未完成数量大于0且单据已审核
|
//var result = Db.Queryable<MesDbckDetail, MesDbck, MesItems>(
|
// (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<ItemDetailModel> GetDBCKDetal(
|
WarehouseQuery query)
|
{
|
var p_bill_no = query.billNo;
|
|
// 根据SQL查询条件获取待处理的出库明细
|
// 关联查询TransferOutDetail、TransferOut和MesItems三张表
|
// 筛选条件:未完成数量大于0且单据已审核
|
var result = Db.Queryable<MesDbckDetail, MesDbck, MesItems>(
|
(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;
|
}
|
|
/// <summary>
|
/// 扫描条码进行调拨出库处理
|
/// </summary>
|
/// <param name="query">包含单据号、用户名和条码信息的查询参数</param>
|
/// <returns>处理后的表单和待处理明细列表</returns>
|
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<MesDbck>()
|
.Where(x => x.FBillNo == p_bill_no && x.FApproveStatus == 1)
|
.First();
|
if (transferOut == null) throw new Exception("未找到调拨申请单或者调拨申请单没审核");
|
|
// 查询条码库存信息并验证
|
var stock = Db.Queryable<MesInvItemStocks>()
|
.Where(x => x.ItemBarcode == p_item_barcode
|
&& x.Quantity > 0)
|
.First();
|
if (stock == null) throw new Exception($"库存中无此条码,请核对!{p_item_barcode}");
|
|
// 查询物料信息
|
var item = Db.Queryable<MesItems>()
|
.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();
|
}
|
}
|
}
|
}
|
|
/// <summary>
|
/// 扫描条码进行调拨入库处理
|
/// </summary>
|
/// <param name="query">包含单据号、用户名和条码信息的查询参数</param>
|
/// <returns>处理后的表单和待处理明细列表</returns>
|
public (WarehouseQuery form, List<ItemDetailModel> items)
|
ScanReceiveBarcode(WarehouseQuery query)
|
{
|
var p_bill_no = query.billNo;
|
var p_item_barcode = query.barcode;
|
|
var barinfo = Db.Queryable<MesInvItemStocks>()
|
.Where(x => x.ItemBarcode == p_item_barcode)
|
.First();
|
|
// 验证单据号
|
if (string.IsNullOrEmpty(p_bill_no)) throw new Exception("请选取单据号!");
|
|
// 查询出库单并验证状态
|
var transferOut = Db.Queryable<MesDbck>()
|
.Where(x => x.FBillNo == p_bill_no && x.FApproveStatus == 1)
|
.First();
|
if (transferOut == null) throw new Exception("未找到调拨申请单或者调拨申请单没审核");
|
|
// 查询条码库存信息并验证
|
var stock = Db.Queryable<MesDbckDetail>()
|
.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<MesItems>()
|
.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();
|
}
|
}
|
}
|
}
|
|
public ProductionPickDto ScanCodeCF(WarehouseQuery query)
|
{
|
var p_bill_no = query.daa001;
|
var p_item_barcode = query.barcode;
|
|
var barinfo = Db.Queryable<MesInvItemStocks>()
|
.Where(x => x.ItemBarcode == p_item_barcode)
|
.First();
|
|
// 验证单据号
|
if (string.IsNullOrEmpty(p_bill_no)) throw new Exception("请选取单据号!");
|
|
// 查询出库单并验证状态
|
var transferOut = Db.Queryable<MesDbck>()
|
.Where(x => x.FBillNo == p_bill_no && x.FApproveStatus == 1)
|
.First();
|
if (transferOut == null) throw new Exception("未找到调拨申请单或者调拨申请单没审核");
|
|
// 查询条码库存信息并验证
|
var stock = Db.Queryable<MesDbckDetail>()
|
.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<MesItems>()
|
.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();
|
}
|
}
|
}
|
}
|
|
}
|