using System.Data;
using System.Data.SqlClient;
using NewPdaSqlServer.DB;
using NewPdaSqlServer.Dto.service;
using NewPdaSqlServer.entity;
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.ShNum), // 申请数量合计
ys = g.Sum(x => x.YsNum) // 已扫数量合计
})
.Where(x => (x.sq ?? 0) != (x.ys ?? 0))
.Select(x => x.pid)
.ToList();
// 根据pid查询对应的出库单号
var billNos = Db.Queryable()
.Where(x => result.Contains(x.Guid))
.Select(x => x.BillNo)
.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.Guid,
JoinType.Left, b.ItemId == s.Id))
.Where((b, a, s) =>
(b.ShNum ?? 0) - (b.YsNum ?? 0) > 0 // 未完成数量大于0
&& a.BillNo == p_bill_no // 匹配单据号
&& a.Status == 1) // 单据已审核
.OrderBy((b, a, s) => s.ItemNo)
.Select((b, a, s) => new TransferOutDetail
{
ItemNo = s.ItemNo,
ItemModel = s.ItemModel,
ShNum = b.ShNum, // 申请数量
YsNum = b.YsNum, // 已扫数量
// 保留其他必要字段...
Pid = b.Pid,
ItemId = b.ItemId,
Guid = b.Guid
})
.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.BillNo == p_bill_no && x.Status == 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, GetTransferOutDetailListByBillNo(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;
// 验证单据号
if (string.IsNullOrEmpty(p_bill_no)) throw new Exception("请选取单据号!");
// 查询出库单并验证状态
var transferOut = Db.Queryable()
.Where(x => x.BillNo == p_bill_no && x.Status == 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_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, GetTransferOutDetailListByBillNo(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();
}
}
}
}
}