using NewPdaSqlServer.DB;
|
using NewPdaSqlServer.Dto.service;
|
using NewPdaSqlServer.entity;
|
using NewPdaSqlServer.util;
|
using SqlSugar;
|
|
namespace NewPdaSqlServer.service.Warehouse;
|
|
public class MesItemBlManager : Repository<MesItemBl>
|
{
|
#region 生产补料
|
|
/// <summary>
|
/// 获取生产补料单号列表
|
/// </summary>
|
/// <returns>补料单号列表</returns>
|
public List<string> GetSCBLBillNo()
|
{
|
var list = Db.Queryable<MesItemBl>()
|
.Where(s => (s.Bl018 ?? false) == true
|
&& (s.Bl019 ?? false) == false
|
&& s.Bl008 == "生产补料")
|
.Select(s => s.BlNo)
|
.ToList();
|
return list;
|
}
|
|
/// <summary>
|
/// 根据单号获取生产补料单明细 prc_rf_pda_scan_zout_showbl
|
/// </summary>
|
/// <param name="billNo">补料单号</param>
|
/// <returns>补料单明细列表</returns>
|
public (string bl001, List<MesItemBlDetail> item)
|
GetMesItemBlDetailByBillNo(
|
WarehouseQuery query)
|
{
|
if (string.IsNullOrEmpty(query.billNo))
|
throw new Exception("请选单据号!");
|
|
// 检查补料单是否存在且为生产补料类型
|
var mesItemBl = Db.Queryable<MesItemBl>()
|
.Where(a => a.BlNo == query.billNo && a.Bl008 == "生产补料")
|
.First();
|
|
if (mesItemBl == null)
|
throw new Exception("单据号不正确!");
|
|
if (mesItemBl.Bl019 == true)
|
throw new Exception("单据号已完成!");
|
|
// 获取未完成的补料单明细
|
var blDetails = Db.Queryable<MesItemBl, MesItemBlDetail>((a, b) =>
|
new JoinQueryInfos(JoinType.Left, a.Id == b.Mid))
|
.Where((a, b) => a.BlNo == query.billNo
|
&& (b.Bld007 ?? 0) - (b.Bld008 ?? 0) > 0)
|
.Select((a, b) => new MesItemBlDetail
|
{
|
Bld012 = b.Bld012,
|
Bld002 = b.Bld002,
|
Bld003 = b.Bld003,
|
Bld004 = b.Bld004,
|
Bld007 = b.Bld007,
|
Bld008 = b.Bld008
|
})
|
.ToList();
|
|
return (mesItemBl.Bl001, blDetails);
|
}
|
|
/// <summary>
|
/// 扫描条码 prc_rf_pda_scan_zout_barcode3
|
/// </summary>
|
/// <param name="query">查询参数</param>
|
/// <returns>扫描结果</returns>
|
/// <remarks>
|
/// 参数说明:
|
/// - billNo: 单据号(必填)
|
/// - barcode: 条码(必填)
|
/// - userName: 用户名
|
/// - blNo: 补料单号(必填)
|
/// </remarks>
|
public (WarehouseQuery item, List<MesItemBlDetail> pendingList)
|
SctlScanBarcode(
|
WarehouseQuery query)
|
{
|
if (string.IsNullOrEmpty(query.billNo))
|
throw new Exception("请选取单据号!");
|
|
if (string.IsNullOrEmpty(query.barcode))
|
throw new Exception("请扫描条码!");
|
|
if (string.IsNullOrEmpty(query.userName))
|
throw new Exception("用户名不能为空!");
|
|
if (string.IsNullOrEmpty(query.blNo))
|
throw new Exception("补料单号不能为空!");
|
|
|
// 检验是否重复扫描
|
var exists = Db.Queryable<MesInvItemOutCDetails>()
|
.Where(b => b.ItemBarcode == query.barcode)
|
.Any();
|
|
if (exists)
|
throw new Exception("此条码已扫描,勿重复扫码!");
|
|
// 查询条码库存信息
|
var stockBarcode = Db.Queryable<MesInvItemStocks>()
|
.Where(t => t.ItemBarcode == query.barcode && t.Quantity > 0)
|
.First();
|
|
if (stockBarcode == null)
|
throw new Exception($"库存中无此条码,请核对!{query.barcode}");
|
|
// 检查补料单状态
|
var mesItemBl = Db.Queryable<MesItemBl>()
|
.Where(a => a.BlNo == query.blNo && (a.Bl018 ?? false) == false)
|
.First();
|
|
if (mesItemBl == null)
|
throw new Exception($"申请单 {query.blNo} 已撤回!");
|
|
if (mesItemBl.Bl018 != true)
|
throw new Exception($"申请单 {query.blNo} 未审核!");
|
|
if (mesItemBl.Bl019 == true)
|
throw new Exception($"申请单 {query.blNo} 已完结!");
|
|
// 获取补料单明细并校验
|
var blDetail = Db.Queryable<MesItemBlDetail>()
|
.Where(b =>
|
b.Mid == mesItemBl.Id && b.Bld012 == stockBarcode.ItemId)
|
.First();
|
|
if (blDetail == null)
|
throw new Exception($"申请单不存在此物料 {stockBarcode.ItemNo} 请确认!");
|
|
// 检查待补数量
|
var quantity = (blDetail.Bld007 ?? 0) - (blDetail.Bld008 ?? 0);
|
if (quantity == 0)
|
throw new Exception("物料已扫码完成,请核对!");
|
|
// 检查工单信息
|
var womdaa = Db.Queryable<Womdaa>()
|
.Where(a => a.Daa001 == query.billNo)
|
.First();
|
|
if (womdaa == null)
|
throw new Exception($"工单 {query.billNo} 不存在,请确认!");
|
|
// 检查备料明细
|
var womdab = Db.Queryable<Womdab>()
|
.Where(b => b.Dab001 == query.billNo && b.Erpid == blDetail.Bld014)
|
.First();
|
|
if (womdab == null)
|
throw new Exception($"备料明细不存在此物料 {stockBarcode.ItemNo} 请确认!");
|
|
if (stockBarcode.Quantity > quantity)
|
{
|
// 获取待发料明细列表
|
var pendingList = Db.Queryable<MesItemBl, MesItemBlDetail>((a, b) =>
|
new JoinQueryInfos(JoinType.Left, a.Id == b.Mid))
|
.Where((a, b) => a.BlNo == query.blNo
|
&& (b.Bld007 ?? 0) - (b.Bld008 ?? 0) > 0)
|
.Select((a, b) => new MesItemBlDetail
|
{
|
Bld012 = b.Bld012,
|
Bld002 = b.Bld002,
|
Bld003 = b.Bld003,
|
Bld004 = b.Bld004,
|
Bld007 = b.Bld007,
|
Bld008 = b.Bld008
|
})
|
.ToList();
|
|
|
query.Num = stockBarcode.Quantity;
|
query.Fum = quantity;
|
|
return (query, pendingList);
|
}
|
|
// 开启事务处理
|
var success = UseTransaction(db =>
|
{
|
// 获取或创建出库单
|
var outId = Guid.NewGuid();
|
var outNo = BillNo.GetBillNo("BL(工单补料)");
|
|
var existingOut = db.Queryable<MesInvItemOuts>()
|
.Where(a => a.BbillNo == query.blNo
|
&& a.DepotCode == womdab.Dab017
|
&& a.OutDate.Value.Date.ToString("yyyy-MM-dd") ==
|
DateTime.Now.Date.ToString("yyyy-MM-dd")
|
&& a.BillTypeId == 200
|
&& a.TransactionNo == 209
|
&& a.Status == 0)
|
.First();
|
|
if (existingOut != null)
|
{
|
outId = existingOut.Guid;
|
outNo = existingOut.ItemOutNo;
|
}
|
else
|
{
|
// 插入出库单主表
|
db.Insertable(new MesInvItemOuts
|
{
|
Guid = outId,
|
ItemOutNo = outNo,
|
TaskNo = query.blNo,
|
CreateBy = query.userName,
|
CreateDate = DateTime.Now,
|
LastupdateBy = query.userName,
|
LastupdateDate = DateTime.Now,
|
BillTypeId = 200,
|
TransactionNo = 209,
|
Remark = mesItemBl.Bl007,
|
DepotCode = womdab.Dab017,
|
OutPart = womdaa.Daa013,
|
FType = 0,
|
Factory = stockBarcode.Factory,
|
Company = stockBarcode.Company,
|
WorkNo = womdaa.Daa021,
|
BoardItem = womdaa.Daa002,
|
PbillNo = womdaa.Daa001,
|
OutDate = DateTime.Now,
|
Status = 0,
|
BbillNo = query.blNo
|
}).IgnoreColumns(true).ExecuteCommand();
|
}
|
|
// 检查并更新出库单物料明细
|
var itemCount = db.Queryable<MesInvItemOutItems>()
|
.Where(i =>
|
i.ItemOutId == outId && i.ItemId == stockBarcode.ItemId)
|
.Count();
|
|
if (itemCount > 0)
|
// 更新已存在的物料明细数量
|
db.Updateable<MesInvItemOutItems>()
|
.SetColumns(i =>
|
i.Quantity == i.Quantity + stockBarcode.Quantity)
|
.Where(i =>
|
i.ItemOutId == outId && i.ItemId == stockBarcode.ItemId)
|
.ExecuteCommand();
|
else
|
// 插入新的物料明细记录
|
db.Insertable(new MesInvItemOutItems
|
{
|
Guid = Guid.NewGuid(),
|
ItemOutId = outId,
|
ItemNo = blDetail.Bld002,
|
Quantity = stockBarcode.Quantity,
|
CreateBy = query.userName,
|
CreateDate = DateTime.Now,
|
LastupdateBy = query.userName,
|
LastupdateDate = DateTime.Now,
|
Factory = stockBarcode.Factory,
|
Company = stockBarcode.Company,
|
DepotCode = womdab.Dab017,
|
TaskNo = query.blNo,
|
WorkNo = womdaa.Daa021,
|
WorkLine = blDetail.Bld013,
|
ErpItemNo = womdab.Dab003,
|
ErpId = womdab.Eid,
|
ErpAutoid = womdab.Erpid,
|
PbillNo = query.billNo,
|
ItemId = blDetail.Bld012
|
// Unit = blDetail.Bld009,
|
// DepotId = (int)stockBarcode.DepotsId
|
}).IgnoreColumns(true).ExecuteCommand();
|
|
// 插入出库单条码明细
|
db.Insertable(new MesInvItemOutCDetails
|
{
|
Guid = Guid.NewGuid(),
|
ItemOutId = outId,
|
ItemBarcode = stockBarcode.ItemBarcode,
|
ItemNo = stockBarcode.ItemNo,
|
LotNo = stockBarcode.LotNo,
|
Quantity = stockBarcode.Quantity,
|
ForceOutFlag = 0,
|
CreateBy = query.userName,
|
CreateDate = DateTime.Now,
|
LastupdateBy = query.userName,
|
LastupdateDate = DateTime.Now,
|
DepotCode = stockBarcode.DepotsCode,
|
DepotSectionCode = stockBarcode.DepotSectionsCode,
|
Remark = blDetail.Bld010,
|
Factory = stockBarcode.Factory,
|
Company = stockBarcode.Company,
|
TaskNoy = mesItemBl.Bl013,
|
BoardStyle = mesItemBl.Bl002,
|
TaskNo = query.blNo,
|
WorkNo = blDetail.Bld001,
|
WorkLine = blDetail.Bld013,
|
SuppNo = stockBarcode.SuppNo,
|
PbillNo = query.billNo,
|
ItemId = blDetail.Bld012,
|
Unit = blDetail.Bld009,
|
DepotId = (int)stockBarcode.DepotsId,
|
EbelnK3id = womdab.Eid,
|
LineK3id = womdab.Erpid
|
}).IgnoreColumns(true).ExecuteCommand();
|
|
// 插入业务交易记录
|
db.Insertable(new MesInvBusiness2
|
{
|
Guid = Guid.NewGuid(),
|
Status = 1,
|
BillTypeId = 200, // p_bill_type_id
|
TransactionCode = "210", // p_transaction_no
|
BusinessType = -1,
|
ItemBarcode = stockBarcode.ItemBarcode,
|
ItemNo = stockBarcode.ItemNo,
|
LotNo = stockBarcode.LotNo,
|
EpFlag = true,
|
Quantity = stockBarcode.Quantity,
|
FromInvDepotsCode = stockBarcode.DepotsCode,
|
FromInvDepotSectionsCode = stockBarcode.DepotSectionsCode,
|
CreateBy = query.userName,
|
CreateDate = DateTime.Now,
|
LastupdateBy = query.userName,
|
LastupdateDate = DateTime.Now,
|
Factory = stockBarcode.Factory,
|
Company = stockBarcode.Company,
|
TaskNo = mesItemBl.Bl012, // Matches C_QTCK.Bl012
|
BillNo = query.blNo,
|
WorkNo = blDetail.Bld001, // Matches C_QTCK_D.Bld001
|
WorkLine = blDetail.Bld013, // Matches C_QTCK_D.Bld013
|
SuppNo = stockBarcode.SuppNo,
|
ItemId = stockBarcode.ItemId
|
// CkDepot = stockBarcode.DepotsId
|
}).IgnoreColumns(true).ExecuteCommand();
|
|
|
// 更新工单表数量
|
db.Updateable<Womdab>()
|
.SetColumns(it => new Womdab
|
{
|
Dab007 = (it.Dab007 ?? 0) + stockBarcode.Quantity,
|
Dab020 = (it.Dab020 ?? 0) + stockBarcode.Quantity,
|
Dab021 = (it.Dab021 ?? 0) + stockBarcode.Quantity
|
})
|
.Where(it => it.Id == womdab.Id && it.Dab003 == womdab.Dab003)
|
.ExecuteCommand();
|
|
// 更新补料单明细已补数量
|
db.Updateable<MesItemBlDetail>()
|
.SetColumns(it => new MesItemBlDetail
|
{
|
Bld008 = (it.Bld008 ?? 0) + (int)stockBarcode.Quantity
|
})
|
.Where(it => it.Id == blDetail.Id)
|
.ExecuteCommand();
|
|
// 检查补料单明细是否完成
|
var blDetail1 = db.Queryable<MesItemBlDetail>()
|
.Where(it => it.Id == blDetail.Id)
|
.First();
|
|
if ((blDetail1.Bld007 ?? 0) <= (blDetail1.Bld008 ?? 0))
|
// 更新明细完成状态
|
db.Updateable<MesItemBlDetail>()
|
.SetColumns(it => it.Bld011 == 1)
|
.Where(it => it.Id == blDetail1.Id)
|
.ExecuteCommand();
|
|
// 更新库存数量为0
|
db.Updateable<MesInvItemStocks>()
|
.SetColumns(it => it.Quantity == 0)
|
.Where(it => it.Guid == stockBarcode.Guid)
|
.ExecuteCommand();
|
|
|
// 检查是否所有明细都已完成
|
var unfinishedDetail = db.Queryable<MesItemBlDetail>()
|
.LeftJoin<MesItemBl>((b, a) => a.Id == b.Mid)
|
.Where((b, a) => a.BlNo == query.blNo && (b.Bld011 ?? 0) == 0)
|
.Select((b, a) => b)
|
.First();
|
|
if (unfinishedDetail == null)
|
// 如果没有未完成的明细,更新补料单状态为已完成
|
db.Updateable<MesItemBl>()
|
.SetColumns(it => new MesItemBl
|
{
|
Bl019 = true,
|
WcUser = query.userName,
|
WcTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
|
})
|
.Where(it => it.Id == mesItemBl.Id)
|
.ExecuteCommand();
|
|
return 1;
|
});
|
|
// 获取最终的待发料明细列表
|
var finalPendingList = Db.Queryable<MesItemBl, MesItemBlDetail>(
|
(a, b) =>
|
new JoinQueryInfos(JoinType.Left, a.Id == b.Mid))
|
.Where((a, b) => a.BlNo == query.blNo
|
&& (b.Bld007 ?? 0) - (b.Bld008 ?? 0) > 0)
|
.Select((a, b) => new MesItemBlDetail
|
{
|
Bld012 = b.Bld012,
|
Bld002 = b.Bld002,
|
Bld003 = b.Bld003,
|
Bld004 = b.Bld004,
|
Bld007 = b.Bld007,
|
Bld008 = b.Bld008
|
})
|
.ToList();
|
|
return (query, finalPendingList);
|
}
|
|
/// <summary>
|
/// 生产补料单条码拆分 prc_rf_pda_prnt_zout_barcode2
|
/// </summary>
|
/// <param name="query">查询参数</param>
|
/// <returns>(成功标志, 待处理列表)</returns>
|
/// <remarks>
|
/// 前台需要传入的参数:
|
/// - userName: 用户名(必填)
|
/// - billNo: 工单号(必填)
|
/// - barcode: 物料条码(必填)
|
/// - Num: 发料数量(必填,必须大于0)
|
/// - blNo: 补料单号(必填)
|
/// </remarks>
|
public (bool success, List<MesItemBlDetail> pendingList) SplitBarcode(
|
WarehouseQuery query)
|
{
|
if (string.IsNullOrEmpty(query.userName))
|
throw new Exception("用户名不能为空!");
|
|
if (string.IsNullOrEmpty(query.billNo))
|
throw new Exception("请选取单据号!");
|
|
if (string.IsNullOrEmpty(query.barcode))
|
throw new Exception("请扫描条码!");
|
|
if (query.Num <= 0)
|
throw new Exception("请输入正确的发料数量!");
|
|
if (string.IsNullOrEmpty(query.blNo))
|
throw new Exception("补料单号不能为空!");
|
|
|
// 检验是否重复扫描
|
var exists = Db.Queryable<MesInvItemOutCDetails>()
|
.Where(b => b.ItemBarcode == query.barcode)
|
.Any();
|
|
if (exists)
|
throw new Exception("此条码已扫描,勿重复扫码!");
|
|
// 查询条码库存信息
|
var stockBarcode = Db.Queryable<MesInvItemStocks>()
|
.Where(t => t.ItemBarcode == query.barcode && t.Quantity > 0)
|
.First();
|
|
if (stockBarcode == null)
|
throw new Exception($"库存中无此条码,请核对!{query.barcode}");
|
|
var totalQty = stockBarcode.Quantity;
|
string newBarcode = null;
|
|
// 开启事务处理
|
var success = UseTransaction(db =>
|
{
|
var executeCommand = 0;
|
|
// 拆分条码
|
if (totalQty > query.Num)
|
{
|
var mesItems = db.Queryable<MesItems>()
|
.Where(s => s.Id == stockBarcode.ItemId).First();
|
|
// 生成新条码号
|
newBarcode = BillNo.GetBillNo("TMBH(条码编号)", mesItems.ItemNo);
|
|
// 写入新条码
|
executeCommand += db.Insertable(new MesInvItemBarcodes
|
{
|
Guid = Guid.NewGuid(),
|
ItemBarcode = newBarcode,
|
CustNo = stockBarcode.CustomerNo,
|
// ProductCode = stockBarcode.ProductCode,
|
// ItemBarcode2 = stockBarcode.ItemBarcode2,
|
// ItemCode = stockBarcode.ItemCode,
|
ItemNo = stockBarcode.ItemNo,
|
LotNo = stockBarcode.LotNo,
|
Quantity = query.Num,
|
EpFlag = true,
|
TaskNo = stockBarcode.TaskNo,
|
CreateBy = query.userName,
|
CreateDate = DateTime.Now,
|
LastupdateBy = query.userName,
|
LastupdateDate = DateTime.Now,
|
OldItemBarcode = query.barcode,
|
// Mblnr = stockBarcode.Mblnr,
|
// Zeile = stockBarcode.Zeile,
|
// RohInId = stockBarcode.RohInId,
|
// BarcodeStatus = 0,
|
// OldQty = query.Num,
|
// Unit = stockBarcode.Unit,
|
// WeightUnit = stockBarcode.WeightUnit,
|
Factory = stockBarcode.Factory,
|
Company = stockBarcode.Company,
|
BillNo = stockBarcode.BillNo,
|
BoardStyle = stockBarcode.BoardStyle,
|
// ColorName = stockBarcode.ColorName,
|
WorkNo = stockBarcode.WorkNo,
|
WorkLine = stockBarcode.WorkLine,
|
// MemoBad = stockBarcode.MemoBad,
|
ComeFlg = 5,
|
// Memo = stockBarcode.Memo,
|
SuppNo = stockBarcode.SuppNo,
|
// InsDate = stockBarcode.InsDate, // Added InsDate
|
ItemId = stockBarcode.ItemId
|
// ItemUnit = stockBarcode.ItemUnit // Added ItemUnit
|
}).IgnoreColumns(true).ExecuteCommand();
|
|
// 更新原条码数量
|
executeCommand += db.Updateable<MesInvItemBarcodes>()
|
.SetColumns(it => it.Quantity == totalQty - query.Num)
|
.Where(it => it.ItemBarcode == query.barcode)
|
.ExecuteCommand();
|
|
// 删除原条码库存记录
|
executeCommand += db.Deleteable<MesInvItemStocks>()
|
.Where(it => it.ItemBarcode == query.barcode)
|
.ExecuteCommand();
|
|
// 插入剩余条码数量的新库存记录
|
executeCommand += db.Insertable(new MesInvItemStocks
|
{
|
Guid = Guid.NewGuid(),
|
TaskNo = stockBarcode.TaskNo,
|
ItemBarcode = stockBarcode.ItemBarcode,
|
ItemNo = stockBarcode.ItemNo,
|
LotNo = stockBarcode.LotNo,
|
Quantity = totalQty - query.Num,
|
EpFlag = stockBarcode.EpFlag,
|
CustomerNo = stockBarcode.CustomerNo,
|
ItemWt = stockBarcode.ItemWt,
|
DepotsCode = stockBarcode.DepotsCode,
|
DepotsId = stockBarcode.DepotsId,
|
DepotSectionsCode = stockBarcode.DepotSectionsCode,
|
CheckDate = stockBarcode.CheckDate,
|
ItemType = stockBarcode.ItemType,
|
IndepDate = stockBarcode.IndepDate,
|
Factory = stockBarcode.Factory,
|
Company = stockBarcode.Company,
|
IqcStatus = stockBarcode.IqcStatus,
|
BoardStyle = stockBarcode.BoardStyle,
|
WorkNo = stockBarcode.WorkNo,
|
WorkLine = stockBarcode.WorkLine,
|
SuppNo = stockBarcode.SuppNo,
|
ItemId = stockBarcode.ItemId
|
// UnitId = stockBarcode.ItemUnit
|
}).IgnoreColumns(true).ExecuteCommand();
|
|
// 写入新条码的交易记录
|
executeCommand += db.Insertable(new MesInvBusiness2
|
{
|
Guid = Guid.NewGuid(),
|
Status = 1,
|
BillTypeId = 200, // p_bill_type_id
|
TransactionCode = "209", // p_transaction_no
|
BusinessType = -1,
|
ItemBarcode = newBarcode,
|
ItemNo = stockBarcode.ItemNo,
|
LotNo = stockBarcode.LotNo,
|
EpFlag = true,
|
Quantity = query.Num,
|
FromInvDepotsCode = null,
|
FromInvDepotSectionsCode = null,
|
ToInvDepotsCode = stockBarcode.DepotsCode,
|
ToInvDepotSectionsCode = stockBarcode.DepotSectionsCode,
|
Description = null,
|
CreateBy = query.userName,
|
CreateDate = DateTime.Now,
|
LastupdateBy = query.userName,
|
LastupdateDate = DateTime.Now,
|
Factory = stockBarcode.Factory,
|
Company = stockBarcode.Company,
|
TaskNo = stockBarcode.TaskNo,
|
BillNo = stockBarcode.BillNo,
|
WorkNo = stockBarcode.WorkNo,
|
WorkLine = stockBarcode.WorkLine,
|
SuppNo = stockBarcode.SuppNo,
|
SuppId = stockBarcode.SuppId,
|
ItemId = stockBarcode.ItemId
|
// CkDepot = stockBarcode.DepotsId
|
}).IgnoreColumns(true).ExecuteCommand();
|
}
|
else if (totalQty < query.Num)
|
{
|
throw new Exception("发料数量大于条码数,请核对!");
|
}
|
|
if (string.IsNullOrEmpty(newBarcode)) newBarcode = query.barcode;
|
|
// 检查补料单状态
|
var mesItemBl = Db.Queryable<MesItemBl>()
|
.Where(a => a.BlNo == query.blNo && (a.Bl018 ?? false) == false)
|
.First();
|
|
if (mesItemBl == null)
|
throw new Exception($"申请单 {query.blNo} 已撤回!");
|
|
if (mesItemBl.Bl018 != true)
|
throw new Exception($"申请单 {query.blNo} 未审核!");
|
|
if (mesItemBl.Bl019 == true)
|
throw new Exception($"申请单 {query.blNo} 已完结!");
|
|
// 获取补料单明细并校验
|
var blDetail = Db.Queryable<MesItemBlDetail>()
|
.Where(b =>
|
b.Mid == mesItemBl.Id && b.Bld012 == stockBarcode.ItemId)
|
.First();
|
|
if (blDetail == null)
|
throw new Exception($"申请单不存在此物料 {stockBarcode.ItemNo} 请确认!");
|
|
var remainingQty = (blDetail.Bld007 ?? 0) - (blDetail.Bld008 ?? 0);
|
if (remainingQty == 0)
|
throw new Exception("物料已扫码完成,请核对!");
|
|
if (query.Num > remainingQty)
|
throw new Exception(
|
$"拆分数量:{query.Num} 大于待发料数量:{remainingQty},请核对!");
|
|
// 检查工单信息
|
var womdaa = Db.Queryable<Womdaa>()
|
.Where(a => a.Daa001 == query.billNo)
|
.First();
|
|
if (womdaa == null)
|
throw new Exception($"工单 {query.billNo} 不存在,请确认!");
|
|
var womdab = Db.Queryable<Womdab>()
|
.Where(b =>
|
b.Dab001 == query.billNo && b.Erpid == blDetail.Bld014)
|
.First();
|
|
if (womdab == null)
|
throw new Exception($"备料明细不存在此物料 {stockBarcode.ItemNo} 请确认!");
|
|
// 检查已发料数量是否超过待发料数量
|
var sumQty = db.Queryable<MesInvItemOutCDetails>()
|
.Where(it =>
|
it.TaskNo == query.blNo && it.ItemId == stockBarcode.ItemId)
|
.Sum(it => it.Quantity);
|
|
if (sumQty > remainingQty)
|
throw new Exception(
|
$"拆分数量:{sumQty} 大于待发料数量:{remainingQty},请核对!");
|
|
// 获取或创建出库单
|
var itemOut = db.Queryable<MesInvItemOuts>()
|
.Where(a => a.BbillNo == query.blNo
|
&& a.DepotCode == womdab.Dab017
|
&& a.OutDate.Value.Date.ToString("yyyy-MM-dd") ==
|
DateTime.Now.Date.ToString("yyyy-MM-dd")
|
&& a.BillTypeId == 200
|
&& a.TransactionNo == 209
|
&& a.Status == 0)
|
.First();
|
|
if (itemOut == null)
|
{
|
// 创建新的出库单
|
var outId = Guid.NewGuid();
|
var outNo = BillNo.GetBillNo("BL(工单补料)");
|
|
// 插入出库单主表
|
executeCommand += db.Insertable(new MesInvItemOuts
|
{
|
Guid = outId,
|
ItemOutNo = outNo,
|
TaskNo = query.blNo,
|
CreateBy = query.userName,
|
CreateDate = DateTime.Now,
|
LastupdateBy = query.userName,
|
LastupdateDate = DateTime.Now,
|
BillTypeId = 200,
|
TransactionNo = 209,
|
Remark = mesItemBl.Bl007,
|
DepotCode = womdab.Dab017,
|
OutPart = womdaa.Daa013,
|
FType = 0,
|
Factory = stockBarcode.Factory,
|
Company = stockBarcode.Company,
|
WorkNo = womdaa.Daa021,
|
BoardItem = womdaa.Daa002,
|
PbillNo = womdaa.Daa001,
|
OutDate = DateTime.Now,
|
Status = 0,
|
BbillNo = query.blNo
|
}).IgnoreColumns(true).ExecuteCommand();
|
}
|
|
// 检查是否已存在出库单明细
|
var itemOutItemCount = db.Queryable<MesInvItemOutItems>()
|
.Where(it =>
|
it.ItemOutId == itemOut.Guid &&
|
it.ItemId == stockBarcode.ItemId)
|
.Count();
|
|
if (itemOutItemCount == 0)
|
// 插入新的出库单明细
|
executeCommand += db.Insertable(new MesInvItemOutItems
|
{
|
Guid = Guid.NewGuid(),
|
ItemOutId = itemOut.Guid,
|
ItemNo = blDetail.Bld002,
|
Quantity = query.Num,
|
CreateBy = query.userName,
|
CreateDate = DateTime.Now,
|
LastupdateBy = query.userName,
|
LastupdateDate = DateTime.Now,
|
Factory = stockBarcode.Factory,
|
Company = stockBarcode.Company,
|
DepotCode = womdab.Dab017,
|
TaskNo = query.blNo,
|
WorkNo = womdaa.Daa021,
|
WorkLine = blDetail.Bld013,
|
ErpItemNo = womdab.Dab003,
|
ErpId = womdab.Eid,
|
ErpAutoid = womdab.Erpid,
|
PbillNo = query.billNo,
|
ItemId = blDetail.Bld012
|
// Unit = blDetail.Bld009,
|
// DepotId = (int)stockBarcode.DepotsId
|
}).IgnoreColumns(true).ExecuteCommand();
|
else
|
// 更新已有出库单明细数量
|
executeCommand += db.Updateable<MesInvItemOutItems>()
|
.SetColumns(it => it.Quantity == it.Quantity + query.Num)
|
.Where(it =>
|
it.ItemOutId == itemOut.Guid &&
|
it.ItemId == stockBarcode.ItemId)
|
.ExecuteCommand();
|
|
// 插入出库条码明细
|
executeCommand += db.Insertable(new MesInvItemOutCDetails
|
{
|
Guid = Guid.NewGuid(),
|
ItemOutId = itemOut.Guid,
|
ItemBarcode = newBarcode ?? query.barcode,
|
ItemNo = stockBarcode.ItemNo,
|
LotNo = stockBarcode.LotNo,
|
Quantity = query.Num,
|
ForceOutFlag = 0,
|
CreateBy = query.userName,
|
CreateDate = DateTime.Now,
|
LastupdateBy = query.userName,
|
LastupdateDate = DateTime.Now,
|
DepotCode = stockBarcode.DepotsCode,
|
DepotSectionCode = stockBarcode.DepotSectionsCode,
|
Remark = blDetail.Bld010,
|
Factory = stockBarcode.Factory,
|
Company = stockBarcode.Company,
|
TaskNoy = mesItemBl.Bl013,
|
BoardStyle = mesItemBl.Bl002,
|
TaskNo = query.blNo,
|
WorkNo = blDetail.Bld001,
|
WorkLine = blDetail.Bld013,
|
SuppNo = stockBarcode.SuppNo,
|
PbillNo = query.billNo,
|
ItemId = blDetail.Bld012,
|
Unit = blDetail.Bld009,
|
DepotId = (int)stockBarcode.DepotsId
|
}).IgnoreColumns(true).ExecuteCommand();
|
|
// 插入业务流水
|
executeCommand += db.Insertable(new MesInvBusiness2
|
{
|
Guid = Guid.NewGuid(),
|
Status = 1,
|
BillTypeId = 200, // p_bill_type_id
|
TransactionCode = "210", // p_transaction_no
|
BusinessType = 1,
|
ItemBarcode = newBarcode ?? query.barcode,
|
ItemNo = stockBarcode.ItemNo,
|
LotNo = stockBarcode.LotNo,
|
EpFlag = true,
|
Quantity = query.Num,
|
FromInvDepotsCode = stockBarcode.DepotsCode,
|
FromInvDepotSectionsCode = stockBarcode.DepotSectionsCode,
|
Description = null,
|
CreateBy = query.userName,
|
CreateDate = DateTime.Now,
|
LastupdateBy = query.userName,
|
LastupdateDate = DateTime.Now,
|
Factory = stockBarcode.Factory,
|
Company = stockBarcode.Company,
|
TaskNo = mesItemBl.Bl012,
|
BillNo = query.blNo,
|
WorkNo = blDetail.Bld001,
|
WorkLine = blDetail.Bld013,
|
SuppNo = stockBarcode.SuppNo,
|
ItemId = stockBarcode.ItemId
|
// CkDepot = stockBarcode.DepotsId
|
}).IgnoreColumns(true).ExecuteCommand();
|
|
// 更新工单表数量
|
executeCommand += db.Updateable<Womdab>()
|
.SetColumns(it => new Womdab
|
{
|
Dab007 = (it.Dab007 ?? 0) + query.Num, // 工单数量
|
Dab020 = (it.Dab020 ?? 0) + query.Num, // 已发料数量
|
Dab021 = (it.Dab021 ?? 0) + query.Num // 已发料数量
|
})
|
.Where(it => it.Id == womdab.Id && it.Dab003 == womdab.Dab003)
|
.IgnoreColumns(true)
|
.ExecuteCommand();
|
|
// 更新补料单明细已补数量
|
executeCommand += db.Updateable<MesItemBlDetail>()
|
.SetColumns(it => new MesItemBlDetail
|
{
|
Bld008 = (it.Bld008 ?? 0) + (int)query.Num
|
})
|
.Where(it => it.Id == blDetail.Id)
|
.ExecuteCommand();
|
|
// 获取更新后的补料单明细数量
|
var updatedDetail = db.Queryable<MesItemBlDetail>()
|
.Where(it => it.Id == blDetail.Id)
|
.Select(it => new { it.Bld007, it.Bld008 })
|
.First();
|
|
if ((updatedDetail.Bld007 ?? 0) <= (updatedDetail.Bld008 ?? 0))
|
// 更新明细完成状态
|
executeCommand += db.Updateable<MesItemBlDetail>()
|
.SetColumns(it => new MesItemBlDetail { Bld011 = 1 })
|
.Where(it => it.Id == blDetail.Id)
|
.ExecuteCommand();
|
|
// 检查是否还有未完成的明细
|
|
var unfinishedDetail = db.Queryable<MesItemBlDetail>()
|
.Where(it => it.Mid == mesItemBl.Id && (it.Bld011 ?? 0) == 0)
|
.First();
|
|
if (unfinishedDetail == null)
|
// 如果没有找到未完成明细,则更新补料单状态为已完成
|
executeCommand += db.Updateable<MesItemBl>()
|
.SetColumns(it => new MesItemBl
|
{
|
Bl019 = true,
|
WcUser = query.userName,
|
WcTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
|
})
|
.Where(it => it.Id == mesItemBl.Id)
|
.ExecuteCommand();
|
|
if (executeCommand <= 1) throw new Exception("更新失败");
|
|
return executeCommand;
|
}) > 0;
|
|
// 获取最终的待发料明细列表
|
var pendingList = Db.Queryable<MesItemBl, MesItemBlDetail>((a, b) =>
|
new JoinQueryInfos(JoinType.Left, a.Id == b.Mid))
|
.Where((a, b) => a.BlNo == query.blNo
|
&& (b.Bld007 ?? 0) - (b.Bld008 ?? 0) > 0)
|
.Select((a, b) => new MesItemBlDetail
|
{
|
Bld012 = b.Bld012,
|
Bld002 = b.Bld002,
|
Bld003 = b.Bld003,
|
Bld004 = b.Bld004,
|
Bld007 = b.Bld007,
|
Bld008 = b.Bld008
|
})
|
.ToList();
|
|
return (success, pendingList);
|
}
|
|
#endregion
|
|
#region 生产超领
|
|
public List<string> GetSccList()
|
{
|
var list = Db.Queryable<MesItemBl>()
|
.Where(s => (s.Bl018 ?? false) == true
|
&& (s.Bl019 ?? false) == false
|
&& s.Bl008 == "生产超领")
|
.Select(s => s.BlNo)
|
.ToList();
|
return list;
|
}
|
|
/// <summary>
|
/// 获取生产超领单明细
|
/// </summary>
|
/// <param name="query">查询参数</param>
|
/// <returns>生产超领单明细列表</returns>
|
public (string bl001, List<MesItemBlDetail> item)
|
GetMesItemBlDetailBySccBillNo(
|
WarehouseQuery query)
|
{
|
if (string.IsNullOrEmpty(query.billNo))
|
throw new Exception("请选单据号!");
|
|
// 检查超领单是否存在且为生产超领类型
|
var mesItemBl = Db.Queryable<MesItemBl>()
|
.Where(a => a.BlNo == query.billNo && a.Bl008 == "生产超领")
|
.First();
|
|
if (mesItemBl == null)
|
throw new Exception("单据号不正确!");
|
|
// 检查工单明细状态
|
var blDetails = Db.Queryable<MesItemBlDetail>()
|
.Where(it => it.Mid == mesItemBl.Id)
|
.ToList();
|
|
foreach (var womdab in blDetails.Select(detail => Db.Queryable<Womdab>()
|
.Where(it => it.Erpid == detail.Bld014)
|
.First()))
|
{
|
if (womdab == null)
|
throw new Exception("未找到工单明细!");
|
|
if ((womdab.Dab006 ?? 0) != (womdab.Dab007 ?? 0) ||
|
(womdab.Dab021 ?? 0) != (womdab.Dab022 ?? 0))
|
throw new Exception("物料未领完料或存在待补物料!");
|
}
|
|
// 获取未完成的超领单明细
|
var pendingDetails = Db.Queryable<MesItemBl, MesItemBlDetail>((a, b) =>
|
new JoinQueryInfos(JoinType.Left, a.Id == b.Mid))
|
.Where((a, b) => a.BlNo == query.billNo
|
&& (b.Bld007 ?? 0) - (b.Bld008 ?? 0) > 0)
|
.OrderBy((a, b) => b.Bld002)
|
.Select((a, b) => new MesItemBlDetail
|
{
|
Bld012 = b.Bld012,
|
Bld002 = b.Bld002,
|
Bld003 = b.Bld003,
|
Bld004 = b.Bld004,
|
Bld007 = b.Bld007,
|
Bld008 = b.Bld008
|
})
|
.ToList();
|
|
return (mesItemBl.Bl001, pendingDetails);
|
}
|
|
/// <summary>
|
/// 生产超领扫描条码 prc_rf_pda_scan_zout_barcodeCL
|
/// </summary>
|
/// <param name="query">查询参数</param>
|
/// <returns>扫描结果</returns>
|
/// <remarks>
|
/// 参数说明:
|
/// - billNo: 工单号(必填)
|
/// - barcode: 条码(必填)
|
/// - userName: 用户名(必填)
|
/// - blNo: 超领单号(必填)
|
/// </remarks>
|
public (WarehouseQuery item, List<MesItemBlDetail> pendingList)
|
ScanBarcodeForOverPicking(
|
WarehouseQuery query)
|
{
|
#region 参数校验
|
|
if (string.IsNullOrEmpty(query.billNo))
|
throw new Exception("请选取单据号!");
|
|
if (string.IsNullOrEmpty(query.barcode))
|
throw new Exception("请扫描条码!");
|
|
if (string.IsNullOrEmpty(query.userName))
|
throw new Exception("用户名不能为空!");
|
|
if (string.IsNullOrEmpty(query.blNo))
|
throw new Exception("超领单号不能为空!");
|
|
#endregion
|
|
// 检验是否重复扫描
|
var exists = Db.Queryable<MesInvItemOutCDetails>()
|
.Where(b => b.ItemBarcode == query.barcode)
|
.Any();
|
|
if (exists)
|
throw new Exception("此条码已扫描,勿重复扫码!");
|
|
// 查询条码库存信息
|
var stockBarcode = Db.Queryable<MesInvItemStocks>()
|
.Where(t => t.ItemBarcode == query.barcode && t.Quantity > 0)
|
.First();
|
|
if (stockBarcode == null)
|
throw new Exception($"库存中无此条码,请核对!{query.barcode}");
|
|
// 检查超领单状态
|
var mesItemBl = Db.Queryable<MesItemBl>()
|
.Where(a => a.BlNo == query.blNo && (a.Bl018 ?? false) == false)
|
.First();
|
|
if (mesItemBl == null)
|
throw new Exception($"申请单 {query.blNo} 已撤回!");
|
|
if (mesItemBl.Bl018 != true)
|
throw new Exception($"申请单 {query.blNo} 未审核!");
|
|
if (mesItemBl.Bl019 == true)
|
throw new Exception($"申请单 {query.blNo} 已完结!");
|
|
// 检查工单明细状态
|
var blDetails = Db.Queryable<MesItemBlDetail>()
|
.Where(it => it.Mid == mesItemBl.Id)
|
.ToList();
|
|
foreach (var womdab1 in blDetails.Select(detail => Db
|
.Queryable<Womdab>()
|
.Where(it => it.Erpid == detail.Bld014)
|
.First()))
|
{
|
if (womdab1 == null)
|
throw new Exception("未找到工单明细!");
|
|
if ((womdab1.Dab006 ?? 0) != (womdab1.Dab007 ?? 0) ||
|
(womdab1.Dab021 ?? 0) != (womdab1.Dab022 ?? 0))
|
throw new Exception("物料未领完料或存在待补物料!");
|
}
|
|
// 获取超领单明细并校验
|
var blDetail = Db.Queryable<MesItemBlDetail>()
|
.Where(b =>
|
b.Mid == mesItemBl.Id && b.Bld012 == stockBarcode.ItemId)
|
.First();
|
|
if (blDetail == null)
|
throw new Exception($"申请单不存在此物料 {stockBarcode.ItemNo} 请确认!");
|
|
// 检查待超领数量
|
var quantity = (blDetail.Bld007 ?? 0) - (blDetail.Bld008 ?? 0);
|
if (quantity == 0)
|
throw new Exception("物料已扫码完成,请核对!");
|
|
// 检查工单信息
|
var womdaa = Db.Queryable<Womdaa>()
|
.Where(a => a.Daa001 == query.billNo)
|
.First();
|
|
if (womdaa == null)
|
throw new Exception($"工单 {query.billNo} 不存在,请确认!");
|
|
var womdab = Db.Queryable<Womdab>()
|
.Where(b => b.Dab001 == query.billNo && b.Erpid == blDetail.Bld014)
|
.First();
|
|
if (womdab == null)
|
throw new Exception($"备料明细不存在此物料 {stockBarcode.ItemNo} 请确认!");
|
|
// 如果条码数量大于待超领数量,返回待处理列表供确认
|
if (stockBarcode.Quantity > quantity)
|
{
|
var pendingList = Db.Queryable<MesItemBl, MesItemBlDetail>((a, b) =>
|
new JoinQueryInfos(JoinType.Left, a.Id == b.Mid))
|
.Where((a, b) => a.BlNo == query.blNo
|
&& (b.Bld007 ?? 0) - (b.Bld008 ?? 0) > 0)
|
.Select((a, b) => new MesItemBlDetail
|
{
|
Bld012 = b.Bld012,
|
Bld002 = b.Bld002,
|
Bld003 = b.Bld003,
|
Bld004 = b.Bld004,
|
Bld007 = b.Bld007,
|
Bld008 = b.Bld008
|
})
|
.ToList();
|
|
query.Num = stockBarcode.Quantity;
|
query.Fum = quantity;
|
|
return (query, pendingList);
|
}
|
|
// 执行数据库事务
|
UseTransaction(db =>
|
{
|
// 生成或获取出库单
|
var outId = Guid.Empty;
|
var outNo = "";
|
var outRecord = db.Queryable<MesInvItemOuts>()
|
.Where(a => a.BbillNo == query.blNo
|
&& a.DepotCode == womdab.Dab017
|
&& a.OutDate.Value.Date == DateTime.Now.Date
|
&& a.BillTypeId == 200
|
&& a.TransactionNo == 210
|
&& a.Status == 0)
|
.First();
|
|
if (outRecord == null)
|
{
|
outId = Guid.NewGuid();
|
outNo = BillNo.GetBillNo("BL(工单补料)"); // 需要实现生成单号的方法
|
|
// 插入出库单主表
|
db.Insertable(new MesInvItemOuts
|
{
|
Guid = outId,
|
ItemOutNo = outNo,
|
TaskNo = query.blNo,
|
CreateBy = query.userName,
|
CreateDate = DateTime.Now,
|
LastupdateBy = query.userName,
|
LastupdateDate = DateTime.Now,
|
BillTypeId = 200,
|
TransactionNo = 210,
|
Remark = mesItemBl.Bl007,
|
DepotCode = womdab.Dab017,
|
OutPart = womdaa.Daa013,
|
FType = 0,
|
WorkNo = womdaa.Daa021,
|
OutType = "生产超领单",
|
BoardItem = womdaa.Daa002,
|
PbillNo = womdaa.Daa001,
|
OutDate = DateTime.Now,
|
Status = 0,
|
BbillNo = query.blNo
|
}).IgnoreColumns(true).ExecuteCommand();
|
}
|
else
|
{
|
outId = outRecord.Guid;
|
outNo = outRecord.ItemOutNo;
|
}
|
|
// 更新或插入出库单明细
|
var outItem = db.Queryable<MesInvItemOutItems>()
|
.Where(it =>
|
it.ItemOutId == outId && it.ItemId == stockBarcode.ItemId)
|
.First();
|
|
if (outItem == null)
|
// 插入出库单明细
|
db.Insertable(new MesInvItemOutItems
|
{
|
Guid = Guid.NewGuid(),
|
ItemOutId = outId,
|
ItemNo = blDetail.Bld002,
|
Quantity = stockBarcode.Quantity,
|
CreateBy = query.userName,
|
CreateDate = DateTime.Now,
|
LastupdateBy = query.userName,
|
LastupdateDate = DateTime.Now,
|
DepotCode = womdab.Dab017,
|
TaskNo = query.blNo,
|
WorkNo = womdaa.Daa021,
|
WorkLine = blDetail.Bld013,
|
ErpItemNo = womdab.Dab003,
|
ErpId = womdab.Eid,
|
ErpAutoid = womdab.Erpid,
|
PbillNo = query.billNo,
|
ItemId = blDetail.Bld012
|
// Unit = blDetail.Bld009,
|
// DepotId = stockBarcode.DepotsId
|
}).IgnoreColumns(true).ExecuteCommand();
|
else
|
// 更新出库单明细数量
|
db.Updateable<MesInvItemOutItems>()
|
.SetColumns(it => new MesInvItemOutItems
|
{
|
Quantity = it.Quantity + stockBarcode.Quantity
|
})
|
.Where(it =>
|
it.ItemOutId == outId &&
|
it.ItemId == stockBarcode.ItemId)
|
.ExecuteCommand();
|
|
// 插入出库条码明细
|
db.Insertable(new MesInvItemOutCDetails
|
{
|
Guid = Guid.NewGuid(),
|
ItemOutId = outId,
|
ItemBarcode = stockBarcode.ItemBarcode,
|
ItemNo = stockBarcode.ItemNo,
|
LotNo = stockBarcode.LotNo,
|
Quantity = stockBarcode.Quantity,
|
CreateBy = query.userName,
|
CreateDate = DateTime.Now,
|
LastupdateBy = query.userName,
|
LastupdateDate = DateTime.Now,
|
DepotCode = stockBarcode.DepotsCode,
|
DepotSectionCode = stockBarcode.DepotSectionsCode,
|
Remark = blDetail.Bld010,
|
TaskNo = query.blNo,
|
WorkNo = blDetail.Bld001,
|
WorkLine = blDetail.Bld013,
|
SuppNo = stockBarcode.SuppNo,
|
PbillNo = query.billNo,
|
ItemId = blDetail.Bld012,
|
Unit = blDetail.Bld009,
|
DepotId = (int)stockBarcode.DepotsId
|
}).IgnoreColumns(true).ExecuteCommand();
|
|
// 插入业务流水
|
db.Insertable(new MesInvBusiness2
|
{
|
Guid = Guid.NewGuid(),
|
Status = 1,
|
BillTypeId = 200,
|
TransactionCode = "210",
|
BusinessType = -1,
|
ItemBarcode = query.barcode,
|
ItemNo = stockBarcode.ItemNo,
|
LotNo = stockBarcode.LotNo,
|
EpFlag = true,
|
Quantity = stockBarcode.Quantity,
|
FromInvDepotsCode = stockBarcode.DepotsCode,
|
FromInvDepotSectionsCode = stockBarcode.DepotSectionsCode,
|
CreateBy = query.userName,
|
CreateDate = DateTime.Now,
|
LastupdateBy = query.userName,
|
LastupdateDate = DateTime.Now,
|
TaskNo = mesItemBl.Bl012,
|
BillNo = query.blNo,
|
WorkNo = blDetail.Bld001,
|
WorkLine = blDetail.Bld013,
|
SuppNo = stockBarcode.SuppNo,
|
SuppId = stockBarcode.SuppId,
|
ItemId = stockBarcode.ItemId
|
// CkDepot = stockBarcode.DepotsId
|
}).IgnoreColumns(true).ExecuteCommand();
|
|
// 更新工单备料明细
|
db.Updateable<Womdab>()
|
.SetColumns(it => new Womdab
|
{
|
Dab020 = (it.Dab020 ?? 0) + stockBarcode.Quantity,
|
Dab023 = (it.Dab023 ?? 0) + stockBarcode.Quantity
|
})
|
.Where(it => it.Id == womdab.Id)
|
.ExecuteCommand();
|
|
// 更新超领单明细
|
db.Updateable<MesItemBlDetail>()
|
.SetColumns(it => new MesItemBlDetail
|
{
|
Bld008 = (it.Bld008 ?? 0) + (int)stockBarcode.Quantity,
|
Bld011 = (it.Bld007 ?? 0) <=
|
(it.Bld008 ?? 0) + stockBarcode.Quantity
|
? 1
|
: 0
|
})
|
.Where(it => it.Id == blDetail.Id)
|
.ExecuteCommand();
|
|
// 更新库存数量为0
|
db.Updateable<MesInvItemStocks>()
|
.SetColumns(it => it.Quantity == 0)
|
.Where(it => it.Guid == stockBarcode.Guid)
|
.ExecuteCommand();
|
|
// 检查是否所有明细都已完成
|
var hasUnfinished = db.Queryable<MesItemBlDetail>()
|
.Where(it => it.Mid == mesItemBl.Id && (it.Bld011 ?? 0) == 0)
|
.Any();
|
|
// 如果所有明细完成,更新超领单状态为已完成
|
if (!hasUnfinished)
|
db.Updateable<MesItemBl>()
|
.SetColumns(it => it.Bl019 == true)
|
.Where(it => it.Id == mesItemBl.Id)
|
.ExecuteCommand();
|
|
return 1;
|
});
|
|
// 获取最终的待处理列表
|
var finalPendingList = Db.Queryable<MesItemBl, MesItemBlDetail>(
|
(a, b) =>
|
new JoinQueryInfos(JoinType.Left, a.Id == b.Mid))
|
.Where((a, b) => a.BlNo == query.blNo
|
&& (b.Bld007 ?? 0) - (b.Bld008 ?? 0) > 0)
|
.Select((a, b) => new MesItemBlDetail
|
{
|
Bld012 = b.Bld012,
|
Bld002 = b.Bld002,
|
Bld003 = b.Bld003,
|
Bld004 = b.Bld004,
|
Bld007 = b.Bld007,
|
Bld008 = b.Bld008
|
})
|
.ToList();
|
|
return (query, finalPendingList);
|
}
|
|
/// <summary>
|
/// 生产超领打印条码
|
/// </summary>
|
/// <param name="query">查询参数</param>
|
/// <returns>处理结果</returns>
|
public (bool success, List<MesItemBlDetail> pendingList)
|
PrintBarcodeForOverPicking(WarehouseQuery query)
|
{
|
UseTransaction(db =>
|
{
|
#region 参数校验
|
|
if (string.IsNullOrEmpty(query.billNo))
|
throw new Exception("请选取单据号!");
|
|
if (string.IsNullOrEmpty(query.barcode))
|
throw new Exception("请扫描条码!");
|
|
if (string.IsNullOrEmpty(query.userName))
|
throw new Exception("用户名不能为空!");
|
|
if (string.IsNullOrEmpty(query.blNo))
|
throw new Exception("超领单号不能为空!");
|
|
if (query.Num <= 0)
|
throw new Exception("请输入正确的发料数量!");
|
|
#endregion
|
|
// 查询库存条码信息
|
var stockBarcode = db.Queryable<MesInvItemStocks>()
|
.Where(t => t.ItemBarcode == query.barcode && t.Quantity > 0)
|
.First();
|
|
if (stockBarcode == null)
|
throw new Exception($"库存中无此条码,请核对!{query.barcode}");
|
|
var totalQty = stockBarcode.Quantity;
|
string newBarcode = null;
|
|
// 拆分条码
|
if (totalQty > query.Num)
|
{
|
var mesItems = db.Queryable<MesItems>()
|
.Where(s => s.Id == stockBarcode.ItemId).First();
|
// 生成新条码号
|
newBarcode = BillNo.GetBillNo("TMBH(条码编号)", mesItems.ItemNo);
|
|
// 写入新条码记录
|
db.Insertable(new MesInvItemBarcodes
|
{
|
Guid = Guid.NewGuid(),
|
ItemBarcode = newBarcode,
|
ItemNo = stockBarcode.ItemNo,
|
LotNo = stockBarcode.LotNo,
|
Quantity = query.Num,
|
EpFlag = true,
|
CreateBy = query.userName,
|
CreateDate = DateTime.Now,
|
LastupdateBy = query.userName,
|
LastupdateDate = DateTime.Now,
|
OldItemBarcode = query.barcode,
|
Factory = stockBarcode.Factory,
|
Company = stockBarcode.Company,
|
WorkNo = stockBarcode.WorkNo,
|
WorkLine = stockBarcode.WorkLine,
|
SuppId = stockBarcode.SuppId,
|
SuppNo = stockBarcode.SuppNo,
|
ItemId = stockBarcode.ItemId
|
}).IgnoreColumns(true).ExecuteCommand();
|
|
// 更新原条码数量
|
db.Updateable<MesInvItemBarcodes>()
|
.SetColumns(it => new MesInvItemBarcodes
|
{ Quantity = totalQty - query.Num })
|
.Where(it => it.ItemBarcode == query.barcode)
|
.ExecuteCommand();
|
|
// 删除原条码库存记录
|
db.Deleteable<MesInvItemStocks>()
|
.Where(it => it.ItemBarcode == query.barcode)
|
.ExecuteCommand();
|
|
// 插入剩余条码数量的新库存记录
|
db.Insertable(new MesInvItemStocks
|
{
|
Guid = Guid.NewGuid(),
|
ItemBarcode = stockBarcode.ItemBarcode,
|
ItemNo = stockBarcode.ItemNo,
|
LotNo = stockBarcode.LotNo,
|
Quantity = totalQty - query.Num,
|
EpFlag = stockBarcode.EpFlag,
|
CustomerNo = stockBarcode.CustomerNo,
|
DepotsCode = stockBarcode.DepotsCode,
|
DepotsId = stockBarcode.DepotsId,
|
DepotSectionsCode = stockBarcode.DepotSectionsCode,
|
CheckDate = stockBarcode.CheckDate,
|
ItemType = stockBarcode.ItemType,
|
IndepDate = stockBarcode.IndepDate,
|
Factory = stockBarcode.Factory,
|
Company = stockBarcode.Company,
|
IqcStatus = stockBarcode.IqcStatus,
|
BoardStyle = stockBarcode.BoardStyle,
|
WorkNo = stockBarcode.WorkNo,
|
WorkLine = stockBarcode.WorkLine,
|
SuppNo = stockBarcode.SuppNo,
|
SuppId = stockBarcode.SuppId,
|
ItemId = stockBarcode.ItemId
|
}).IgnoreColumns(true).ExecuteCommand();
|
|
// 写新条码的交易表,新条码不入库直接出
|
db.Insertable(new MesInvBusiness2
|
{
|
Guid = Guid.NewGuid(),
|
Status = 1,
|
BillTypeId = 200,
|
TransactionCode = "210",
|
BusinessType = -1,
|
ItemBarcode = newBarcode,
|
ItemNo = stockBarcode.ItemNo,
|
LotNo = stockBarcode.LotNo,
|
EpFlag = true,
|
Quantity = query.Num,
|
ToInvDepotsCode = stockBarcode.DepotsCode,
|
ToInvDepotSectionsCode = stockBarcode.DepotSectionsCode,
|
Description = "生产超领",
|
CreateBy = query.userName,
|
CreateDate = DateTime.Now,
|
LastupdateBy = query.userName,
|
LastupdateDate = DateTime.Now,
|
TaskNo = stockBarcode.TaskNo,
|
WorkNo = stockBarcode.WorkNo,
|
WorkLine = stockBarcode.WorkLine,
|
SuppNo = stockBarcode.SuppNo,
|
SuppId = stockBarcode.SuppId,
|
ItemId = stockBarcode.ItemId
|
}).IgnoreColumns(true).ExecuteCommand();
|
}
|
else if (totalQty < query.Num)
|
{
|
throw new Exception("发料数量大于条码数,请核对!");
|
}
|
|
if (string.IsNullOrEmpty(newBarcode))
|
newBarcode = query.barcode;
|
|
// 检查超领单状态
|
var mesItemBl = db.Queryable<MesItemBl>()
|
.Where(a => a.BlNo == query.blNo && a.Bl008 == "生产超领")
|
.First();
|
|
if (mesItemBl == null)
|
throw new Exception("申请单不存在!");
|
|
if (!(mesItemBl.Bl018 ?? false))
|
throw new Exception($"申请单 {query.blNo} 未审核!");
|
|
if (mesItemBl.Bl019 ?? false)
|
throw new Exception($"申请单 {query.blNo} 已完结!");
|
|
// 检查超领单明细
|
var blDetail = db.Queryable<MesItemBlDetail>()
|
.Where(b =>
|
b.Mid == mesItemBl.Id && b.Bld012 == stockBarcode.ItemId)
|
.First();
|
|
if (blDetail == null)
|
throw new Exception($"申请单不存在此物料 {stockBarcode.ItemNo} 请确认!");
|
|
var pendingQty = (blDetail.Bld007 ?? 0) - (blDetail.Bld008 ?? 0);
|
if (pendingQty == 0)
|
throw new Exception("物料已扫码完成,请核对!");
|
|
// 检查工单
|
var workOrder = db.Queryable<Womdaa>()
|
.Where(a => a.Daa001 == query.billNo)
|
.First();
|
|
if (workOrder == null)
|
throw new Exception($"工单 {query.billNo} 不存在,请确认!");
|
|
var workOrderDetail = db.Queryable<Womdab>()
|
.Where(b =>
|
b.Dab001 == query.billNo && b.Erpid == blDetail.Bld014)
|
.First();
|
|
if (workOrderDetail == null)
|
throw new Exception($"备料明细不存在此物料 {stockBarcode.ItemNo} 请确认!");
|
|
if (query.Num > pendingQty)
|
throw new Exception(
|
$"拆分数量:{query.Num} 大于待发料数量:{pendingQty},请核对!");
|
|
// 获取或创建出库单
|
var itemOut = db.Queryable<MesInvItemOuts>()
|
.Where(a => a.BbillNo == query.blNo
|
&& a.DepotCode == workOrderDetail.Dab017
|
&& a.OutDate.Value.Date.ToString("yyyy-MM-dd") ==
|
DateTime.Now.Date.ToString("yyyy-MM-dd")
|
&& a.BillTypeId == 200
|
&& a.TransactionNo == 210
|
&& a.Status == 0)
|
.First();
|
|
if (itemOut == null)
|
{
|
// 创建新的出库单
|
itemOut = new MesInvItemOuts
|
{
|
Guid = Guid.NewGuid(),
|
ItemOutNo = BillNo.GetBillNo("BL(工单补料)"), // 需要实现生成单号的方法
|
TaskNo = query.blNo,
|
CreateBy = query.userName,
|
CreateDate = DateTime.Now,
|
LastupdateBy = query.userName,
|
LastupdateDate = DateTime.Now,
|
BillTypeId = 200,
|
TransactionNo = 210,
|
Remark = mesItemBl.Bl007,
|
DepotCode = workOrderDetail.Dab017,
|
OutPart = workOrder.Daa013,
|
FType = 0,
|
Factory = stockBarcode.Factory,
|
Company = stockBarcode.Company,
|
WorkNo = workOrder.Daa021,
|
OutType = "生产超领单",
|
BoardItem = workOrder.Daa002,
|
PbillNo = workOrder.Daa001,
|
OutDate = DateTime.Now,
|
Status = 0,
|
BbillNo = query.blNo
|
};
|
|
db.Insertable(itemOut).IgnoreColumns(true).ExecuteCommand();
|
}
|
|
// 检查是否已存在出库单明细
|
var itemOutItemCount = db.Queryable<MesInvItemOutItems>()
|
.Where(it =>
|
it.ItemOutId == itemOut.Guid &&
|
it.ItemId == stockBarcode.ItemId)
|
.Count();
|
|
if (itemOutItemCount == 0)
|
// 插入新的出库单明细
|
db.Insertable(new MesInvItemOutItems
|
{
|
Guid = Guid.NewGuid(),
|
ItemOutId = itemOut.Guid,
|
ItemNo = blDetail.Bld002,
|
Quantity = query.Num,
|
CreateBy = query.userName,
|
CreateDate = DateTime.Now,
|
LastupdateBy = query.userName,
|
LastupdateDate = DateTime.Now,
|
Factory = stockBarcode.Factory,
|
Company = stockBarcode.Company,
|
DepotCode = workOrderDetail.Dab017,
|
TaskNo = query.blNo,
|
WorkNo = workOrder.Daa021,
|
WorkLine = blDetail.Bld013,
|
ErpItemNo = workOrderDetail.Dab003,
|
ErpId = workOrderDetail.Eid,
|
ErpAutoid = workOrderDetail.Erpid,
|
PbillNo = query.billNo,
|
ItemId = blDetail.Bld012
|
// Unit = blDetail.Bld009,
|
// DepotId = stockBarcode.DepotsId
|
}).IgnoreColumns(true).ExecuteCommand();
|
else
|
// 更新已有出库单明细数量
|
db.Updateable<MesInvItemOutItems>()
|
.SetColumns(it => it.Quantity == it.Quantity + query.Num)
|
.Where(it =>
|
it.ItemOutId == itemOut.Guid &&
|
it.ItemId == stockBarcode.ItemId)
|
.ExecuteCommand();
|
|
// 插入出库明细记录
|
db.Insertable(new MesInvItemOutCDetails
|
{
|
Guid = Guid.NewGuid(),
|
ItemOutId = itemOut.Guid,
|
ItemBarcode = newBarcode,
|
ItemNo = stockBarcode.ItemNo,
|
LotNo = stockBarcode.LotNo,
|
Quantity = query.Num,
|
ForceOutFlag = 0,
|
CreateBy = query.userName,
|
CreateDate = DateTime.Now,
|
LastupdateBy = query.userName,
|
LastupdateDate = DateTime.Now,
|
DepotCode = stockBarcode.DepotsCode,
|
DepotSectionCode = stockBarcode.DepotSectionsCode,
|
Remark = blDetail.Bld010,
|
Factory = stockBarcode.Factory,
|
Company = stockBarcode.Company,
|
TaskNoy = mesItemBl.Bl013,
|
BoardStyle = mesItemBl.Bl002,
|
TaskNo = query.blNo,
|
WorkNo = blDetail.Bld001,
|
WorkLine = blDetail.Bld013,
|
SuppNo = stockBarcode.SuppNo,
|
PbillNo = query.billNo,
|
ItemId = blDetail.Bld012,
|
Unit = blDetail.Bld009,
|
DepotId = (int)stockBarcode.DepotsId,
|
LineK3id = workOrderDetail.Erpid,
|
EbelnK3id = workOrderDetail.Eid
|
}).IgnoreColumns(true).ExecuteCommand();
|
|
// 插入业务交易记录
|
db.Insertable(new MesInvBusiness2
|
{
|
Guid = Guid.NewGuid(),
|
Status = 1,
|
BillTypeId = 200, // p_bill_type_id
|
TransactionCode = "210", // p_transaction_no
|
BusinessType = 1,
|
ItemBarcode = newBarcode,
|
ItemNo = stockBarcode.ItemNo,
|
LotNo = stockBarcode.LotNo,
|
EpFlag = true,
|
Quantity = query.Num,
|
FromInvDepotsCode = stockBarcode.DepotsCode,
|
FromInvDepotSectionsCode = stockBarcode.DepotSectionsCode,
|
CreateBy = query.userName,
|
CreateDate = DateTime.Now,
|
LastupdateBy = query.userName,
|
LastupdateDate = DateTime.Now,
|
Factory = stockBarcode.Factory,
|
Company = stockBarcode.Company,
|
TaskNo = mesItemBl.Bl012, // Matches C_QTCK.Bl012
|
BillNo = query.blNo,
|
WorkNo = blDetail.Bld001, // Matches C_QTCK_D.Bld001
|
WorkLine = blDetail.Bld013, // Matches C_QTCK_D.Bld013
|
SuppNo = stockBarcode.SuppNo,
|
ItemId = stockBarcode.ItemId
|
}).IgnoreColumns(true).ExecuteCommand();
|
|
// 更新工单表数量
|
db.Updateable<Womdab>()
|
.SetColumns(it => new Womdab
|
{
|
Dab020 = (it.Dab020 ?? 0) + stockBarcode.Quantity,
|
Dab023 = (it.Dab023 ?? 0) + stockBarcode.Quantity
|
})
|
.Where(it => it.Id == workOrderDetail.Id)
|
.ExecuteCommand();
|
|
// 更新补料单明细已补数量
|
db.Updateable<MesItemBlDetail>()
|
.SetColumns(it => new MesItemBlDetail
|
{
|
Bld008 = (it.Bld008 ?? 0) + (int)stockBarcode.Quantity
|
})
|
.Where(it => it.Id == blDetail.Id)
|
.ExecuteCommand();
|
|
// 检查补料单明细是否完成
|
var blDetail1 = db.Queryable<MesItemBlDetail>()
|
.Where(it => it.Id == blDetail.Id)
|
.First();
|
|
if ((blDetail1.Bld007 ?? 0) <= (blDetail1.Bld008 ?? 0))
|
// 更新明细完成状态
|
db.Updateable<MesItemBlDetail>()
|
.SetColumns(it => it.Bld011 == 1)
|
.Where(it => it.Id == blDetail1.Id)
|
.ExecuteCommand();
|
|
// 检查是否所有明细都已完成
|
var hasUnfinished = db.Queryable<MesItemBlDetail>()
|
.Where(it => it.Mid == mesItemBl.Id && (it.Bld011 ?? 0) == 0)
|
.Any();
|
|
// 如果所有明细完成,更新补料单状态为已完成
|
if (!hasUnfinished)
|
db.Updateable<MesItemBl>()
|
.SetColumns(it => it.Bl019 == true)
|
.Where(it => it.Id == mesItemBl.Id)
|
.ExecuteCommand();
|
|
return 1;
|
});
|
|
|
// 获取最终的待处理列表
|
// 获取补料单明细中未完成的记录
|
// 通过左连接查询补料单(MesItemBl)和补料单明细(MesItemBlDetail)表
|
// 条件: 1.补料单号匹配 2.计划数量(Bld007)减去已补数量(Bld008)大于0(即未完成的)
|
var pendingList = Db.Queryable<MesItemBl, MesItemBlDetail>((a, b) =>
|
new JoinQueryInfos(JoinType.Left, a.Id == b.Mid))
|
.Where((a, b) => a.BlNo == query.blNo
|
&& (b.Bld007 ?? 0) - (b.Bld008 ?? 0) > 0)
|
.Select((a, b) => new MesItemBlDetail
|
{
|
Bld012 = b.Bld012, // 物料ID
|
Bld002 = b.Bld002, // 物料编号
|
Bld003 = b.Bld003, // 物料名称
|
Bld004 = b.Bld004, // 物料规格
|
Bld007 = b.Bld007, // 计划数量
|
Bld008 = b.Bld008 // 已补数量
|
})
|
.ToList();
|
|
return (true, pendingList);
|
}
|
|
#endregion
|
}
|