using Masuit.Tools.Models;
|
using NewPdaSqlServer.DB;
|
using NewPdaSqlServer.Dto.service;
|
using NewPdaSqlServer.entity;
|
using NewPdaSqlServer.entity.Base;
|
using NewPdaSqlServer.service.@base;
|
using NewPdaSqlServer.util;
|
using Newtonsoft.Json;
|
using SqlSugar;
|
using static Microsoft.EntityFrameworkCore.DbLoggerCategory;
|
|
namespace NewPdaSqlServer.service.Warehouse;
|
|
public class MesInvItemInCDetailsManager : Repository<MesInvItemInCDetails>
|
{
|
//当前类已经继承了 Repository 增、删、查、改的方法
|
|
public ItemInBaseModel SaveBarCodes(WarehouseQuery entity)
|
{
|
string functionName = "采购入库", fieldName = null, inFieldVal = null;
|
string user = entity.userName,
|
sectionCode = entity.sectionCode,
|
itemBarcode = entity.barcode;
|
var transactionNo = "101";
|
int? billTypeId = 100, num = 0, num2 = 0;
|
var freeze = 0;
|
decimal cSyQty = 0;
|
|
if (string.IsNullOrEmpty(sectionCode))
|
throw new Exception("请扫库位条码!");
|
|
var itemBarcodeDetails = Db.Queryable<MesInvItemBarcodes>()
|
.Where(it => it.ItemBarcode == itemBarcode)
|
.First();
|
|
if (itemBarcodeDetails == null)
|
throw new Exception("条码不存在,请核对!");
|
|
if (string.IsNullOrEmpty(itemBarcodeDetails.Memo) || itemBarcodeDetails.Memo != "采购入库")
|
throw new Exception("此条码不属于到货条码,无法用采购入库!");
|
|
var inventory = Db.Queryable<MesInvItemArn>()
|
.Where(it => it.BillNo == itemBarcodeDetails.BillNo && it.Fstatus == true )
|
.First();
|
|
if (inventory == null)
|
throw new Exception("此条码找不到对应收货单或未审核!");
|
|
// var inventoryDetails = Db.Queryable<MesInvItemArnDetail>()
|
// .Where(it => it.ParentGuid == inventory.Guid
|
// && it.ItemId == itemBarcodeDetails.ItemId
|
// && it.EbelnLine == itemBarcodeDetails.WorkLine
|
// && it.Ebeln == itemBarcodeDetails.WorkNo)
|
// .First();
|
|
var inventoryDetails = Db.Queryable<MesInvItemArnDetail>()
|
.Where(it => it.Guid == itemBarcodeDetails.AboutGuid)
|
.First();
|
|
var cgddDetails = Db.Queryable<MesRohInData>()
|
.Where(it => it.EbelnK3id == inventoryDetails.LineK3id)
|
.First();
|
|
if (inventoryDetails == null)
|
throw new Exception("此条码找不到对应收货单明细!");
|
|
//获取到货检验明细
|
var sqlParams = new List<SugarParameter> { new("@dhmxGuid", itemBarcodeDetails.AboutGuid) };
|
var sql1 = @"SELECT *FROM v_dhmx WHERE dhmxGuid = @dhmxGuid ";
|
var dhjymx = Db.Ado.SqlQuery<vDhmx>(sql1, sqlParams).First();
|
//判定检验能否入库
|
if (dhjymx.CanStore!= 1)
|
{
|
throw new Exception($"该条码对应的收料单检验结果:【{dhjymx.InspectionResult}】,判定结果:【{dhjymx.JudgmentResult}】,处理意见:【{dhjymx.HandlingSuggestion}】,无法入库");
|
}
|
|
var depotCode = Db.Queryable<MesDepotSections>()
|
.Where(it => it.DepotSectionCode == sectionCode)
|
.Select(it => it.DepotGuid)
|
.First();
|
|
var depotCode2 = Db.Queryable<MesInvItemArn>()
|
.Where(it => it.BillNo == itemBarcodeDetails.BillNo)
|
.Select(it => it.DepotsId)
|
.First();
|
|
MesDepots mesDepost = null;
|
|
var checkGuid = UtilityHelper.CheckGuid(depotCode);
|
if (checkGuid && depotCode != null)
|
{
|
mesDepost = Db.Queryable<MesDepots>()
|
.Where(s => s.DepotId.ToString() == depotCode).First();
|
|
// if (depotCode != mesDepost.Guid)
|
// throw new Exception("扫描库位与采购入库库位不一致!");
|
}
|
else
|
{
|
throw new Exception("库位编码 " + sectionCode + " 不存在,请确认!");
|
}
|
|
|
//num = Db.Queryable<MesInvItemInCDetails>()
|
// .Where(it => it.ItemBarcode == itemBarcode)
|
// .Count();
|
|
//if (num > 0)
|
// throw new Exception("此条码已扫码入库完成,请核对!");
|
|
//num = Db.Queryable<MesInvItemStocks>()
|
// .Where(it => it.ItemBarcode == itemBarcode)
|
// .Count();
|
|
//if (num > 0)
|
// throw new Exception("此条码已扫码入库,请核对!");
|
|
var wmsManager = new WmsBaseMangeer();
|
// 新增入库校验(调用存储过程)
|
var checkResult = wmsManager.pdaInvJY(
|
db: Db,
|
edtUserNo: entity.userName,
|
barcode: entity.barcode,
|
sectionCode: sectionCode,
|
stockId: mesDepost.DepotId.ToString(),
|
stockOrgId: mesDepost.FSubsidiary,
|
billNo: "", // 根据实际单据号传值
|
transactionNo: "101" // 事务类型与存储过程匹配
|
);
|
|
if (Convert.ToInt32(checkResult.result) < 1)
|
throw new Exception($"入库校验失败:{checkResult.strMsg}");
|
|
|
|
//num = Db.Queryable<MesInvItemArn>()
|
// .Where(a => a.BillNo == itemBarcodeDetails.BillNo)
|
// .InnerJoin<MesInvItemArnDetail>((a, b) =>
|
// b.ParentGuid == a.Guid &&
|
// b.ItemId == itemBarcodeDetails.ItemId && b.Ischeck == 1)
|
// .Count();
|
|
//num2 = Db.Queryable<MesInvItemArn>()
|
// .Where(a => a.BillNo == itemBarcodeDetails.BillNo)
|
// .InnerJoin<MesInvItemArnDetail>((a, b) => b.ParentGuid == a.Guid
|
// && b.ItemId == itemBarcodeDetails.ItemId
|
// && (b.CheckRes == "合格" || b.CheckStates == "特采直接使用"))
|
// .Count();
|
|
//switch (num)
|
//{
|
// case 0 when num2 == 0:
|
// case > 0 when num2 == 0:
|
// freeze = 1;
|
// break;
|
// case 0 when num2 > 0:
|
// throw new Exception("入库失败,到货单据有问题!");
|
//}
|
|
|
// 判断货主类型
|
var owner_type = wmsManager.GetOwnerType(cgddDetails.DemandOrg);
|
// if (Db.Queryable<SysOrganization>().Any(x => x.Fid == cgddDetails.DemandOrg))
|
// {
|
// owner_type = "BD_OwnerOrg";
|
// }
|
// else
|
// {
|
// // 第二层判断:检查 MES_CUSTOMER
|
// if (Db.Queryable<MesCustomer>().Any(x => x.Id == Convert.ToInt32(cgddDetails.DemandOrg)))
|
// {
|
// owner_type = "BD_Customer";
|
// }
|
// else
|
// {
|
// // 第三层判断:检查 MES_SUPPLIER
|
// if (Db.Queryable<MesSupplier>().Any(x => x.Id == Convert.ToInt32(cgddDetails.DemandOrg)))
|
// {
|
// owner_type = "BD_Supplier";
|
// }
|
// else
|
// {
|
|
// // 第四层判断:再次检查 SYS_ORGANIZATION
|
// if (Db.Queryable<SysOrganization>().Any(x => x.Fid == cgddDetails.ReceivingOrg))
|
// {
|
// owner_type = "BD_OwnerOrg";
|
// }
|
// else
|
// {
|
// throw new Exception("入库失败,到货单据对应的需求组织有问题!");
|
// }
|
// }
|
// }
|
//}
|
|
var result = new ItemInBaseModel();
|
|
UseTransaction(db =>
|
{
|
var existingRecord = db.Queryable<MesInvItemIns>()
|
.Where(it => it.InsDate.Value.ToString("yyyy-MM-dd") == DateTime.Now.ToString("yyyy-MM-dd")
|
&& it.TaskNo == itemBarcodeDetails.BillNo
|
&& it.Status == 0
|
&& it.TransctionNo == transactionNo
|
&& it.CreateBy == entity.userName
|
&& it.BillTypeId == billTypeId
|
&& it.DepotsId == mesDepost.DepotId)
|
.Select(it => new
|
{
|
it.Guid,
|
it.BillNo
|
})
|
.First();
|
|
var cId = Guid.Empty;
|
string cBillNo = null;
|
|
if (existingRecord != null)
|
{
|
// If record exists, assign values
|
cId = existingRecord.Guid;
|
cBillNo = existingRecord.BillNo;
|
}
|
else
|
{
|
cId = Guid.NewGuid();
|
cBillNo = BillNo.GetBillNo("CGRK(采购入库)");
|
|
var suppNo = db.Queryable<MesSupplier>()
|
.Where(s => s.Id.ToString() == inventory.SuppId).First();
|
|
db.Insertable(new MesInvItemIns
|
{
|
Guid = cId,
|
BillNo = cBillNo,
|
BillTypeId = billTypeId,
|
InsDate = DateTime.Now,
|
DepotsId = mesDepost.DepotId,
|
DepotsCode = mesDepost.DepotCode,
|
TransctionNo = transactionNo,
|
SuppId = suppNo.Id.ToString(),
|
SuppNo = suppNo.SuppNo,
|
CreateBy = user,
|
CreateDate = DateTime.Now,
|
LastupdateBy = user,
|
LastupdateDate = DateTime.Now,
|
UrgentFlag = itemBarcodeDetails.UrgentFlag.Value
|
? "1"
|
: "0",
|
CbillNo = itemBarcodeDetails.BillNo,
|
Fstatus = 0,
|
Status = 0,
|
ReceiveOrgId = inventory.ReceiveOrgId,
|
InType = "采购入库",
|
TaskNo = itemBarcodeDetails.BillNo
|
//WorkNo = itemBarcodeDetails.WorkNo
|
}).IgnoreColumns(true).ExecuteCommand();
|
}
|
|
cSyQty = itemBarcodeDetails.Quantity.Value;
|
|
entity.id = cId.ToString();
|
entity.PageIndex = 1;
|
entity.Limit = 1;
|
|
itemBarcodeDetails.Hbdy ??= 0;
|
if (itemBarcodeDetails.Hbdy == 1)
|
{
|
var details = db.Queryable<MesInvItemArnDetail>()
|
.Where(d =>
|
d.CbillNo == itemBarcodeDetails.BillNo &&
|
d.Quantity != d.OkRkqty &&
|
d.ItemId == itemBarcodeDetails.ItemId)
|
.ToList();
|
|
|
foreach (var detail in details)
|
{
|
if (cSyQty == 0) break;
|
|
var remainingQty = detail.Quantity - (detail.OkRkqty ?? 0);
|
if (remainingQty <= cSyQty)
|
{
|
// Update detail
|
db.Updateable<MesInvItemArnDetail>()
|
.SetColumns(d => new MesInvItemArnDetail
|
{
|
OkRkqty = (int)d.Quantity,
|
IsdepsIn = true
|
})
|
.Where(d => d.Guid == detail.Guid)
|
.IgnoreColumns(true)
|
.ExecuteCommand();
|
|
// Check if already inserted
|
var count = db.Queryable<MesInvItemInCItems>()
|
.Where(it =>
|
it.ItemInId == cId &&
|
it.ItemId == detail.ItemId &&
|
it.DepotId == mesDepost.DepotId.ToString() &&
|
it.EbelnK3id == detail.EbelnK3id &&
|
it.LineK3id == detail.LineK3id)
|
.Count();
|
|
cSyQty -= remainingQty.Value;
|
|
if (count == 0)
|
// Insert new item into MES_INV_ITEM_IN_C_ITEMS
|
db.Insertable(new MesInvItemInCItems
|
{
|
ItemInId = cId,
|
Quantity = remainingQty,
|
CreateBy = user,
|
CreateDate = DateTime.Now,
|
ItemId = detail.ItemId,
|
DepotCode = mesDepost.DepotCode,
|
ItemSname = itemBarcodeDetails.ItemSname,
|
Unit = itemBarcodeDetails.Unit,
|
Ebeln = detail.Ebeln,
|
BillNo = cBillNo,
|
WorkNo = detail.WorkNo,
|
CbillNo = detail.CbillNo,
|
WorkLine = detail.WorkLine,
|
SuppId = itemBarcodeDetails.SuppId,
|
SuppNo = itemBarcodeDetails.SuppNo,
|
Remark = itemBarcodeDetails.Memo,
|
EbelnK3id = detail.EbelnK3id,
|
LineK3id = detail.LineK3id,
|
DepotId = mesDepost.DepotId.ToString(),
|
itemDabid = itemBarcodeDetails.AboutGuid.ToString()
|
}).IgnoreColumns(true).ExecuteCommand();
|
else
|
db.Updateable<MesInvItemInCItems>()
|
.SetColumns(it =>
|
it.Quantity == it.Quantity + remainingQty)
|
.Where(it =>
|
it.ItemInId == cId &&
|
it.ItemId == detail.ItemId &&
|
it.DepotId == mesDepost.DepotId.ToString() &&
|
it.EbelnK3id == detail.EbelnK3id &&
|
it.LineK3id == detail.LineK3id)
|
.IgnoreColumns(true)
|
.ExecuteCommand();
|
|
// Insert new detail into MES_INV_ITEM_IN_C_DETAILS
|
db.Insertable(new MesInvItemInCDetails
|
{
|
ItemInId = cId,
|
BillNo = cBillNo,
|
ItemBarcode = itemBarcode,
|
Quantity = remainingQty,
|
BarcodeFlag = true,
|
EpFlag = true,
|
WorkType = 1,
|
ItemNo = detail.ItemNo,
|
SuppId = itemBarcodeDetails.SuppId,
|
SuppNo = itemBarcodeDetails.SuppNo,
|
DepotCode = mesDepost.DepotCode,
|
DepotSectionCode = sectionCode,
|
ItemSname = itemBarcodeDetails.ItemSname,
|
Unit = itemBarcodeDetails.Unit,
|
CreateBy = user,
|
CreateDate = DateTime.Now,
|
LastupdateBy = user,
|
LastupdateDate = DateTime.Now,
|
Remark = itemBarcodeDetails.Memo,
|
Ebeln = detail.WorkNo,
|
WorkNo = detail.WorkNo,
|
WorkLine = detail.WorkLine,
|
CbillNo = itemBarcodeDetails.BillNo,
|
UrgentFlag = detail.UrgentFlag,
|
BoardStyle = detail.BoardStyle,
|
TaskNo = detail.WorkNo,
|
EbelnK3id = detail.EbelnK3id,
|
LineK3id = detail.LineK3id,
|
ItemId = detail.ItemId,
|
ReceiveOrgId = inventory.ReceiveOrgId,
|
LotNo = cgddDetails.BatchNumber
|
}).IgnoreColumns(true).ExecuteCommand();
|
}
|
else
|
{
|
// Partially fulfill remaining quantity
|
db.Updateable<MesInvItemArnDetail>()
|
.SetColumns(d => new MesInvItemArnDetail
|
{
|
OkRkqty = (int)((d.OkRkqty ?? 0) + cSyQty)
|
})
|
.Where(d => d.Guid == detail.Guid)
|
.IgnoreColumns(true)
|
.ExecuteCommand();
|
|
var count = db.Queryable<MesInvItemInCItems>()
|
.Where(it =>
|
it.ItemInId == cId &&
|
it.ItemId == detail.ItemId &&
|
it.DepotId == mesDepost.DepotId.ToString() &&
|
it.EbelnK3id == detail.EbelnK3id &&
|
it.LineK3id == detail.LineK3id)
|
.Count();
|
|
if (count == 0)
|
db.Insertable(new MesInvItemInCItems
|
{
|
ItemInId = cId,
|
Quantity = cSyQty,
|
CreateBy = user,
|
CreateDate = DateTime.Now,
|
ItemNo = detail.ItemNo,
|
DepotCode = mesDepost.DepotCode,
|
ItemSname = itemBarcodeDetails.ItemSname,
|
Unit = itemBarcodeDetails.Unit,
|
Ebeln = detail.WorkNo,
|
BillNo = cBillNo,
|
WorkNo = detail.WorkNo,
|
EbelnLineNo = detail.EbelnLine,
|
CbillNo = detail.CbillNo,
|
WorkLine = detail.WorkLine,
|
SuppId = itemBarcodeDetails.SuppId,
|
SuppNo = itemBarcodeDetails.SuppNo,
|
Remark = itemBarcodeDetails.Memo,
|
EbelnK3id = detail.EbelnK3id,
|
LineK3id = detail.LineK3id,
|
ItemId = detail.ItemId,
|
DepotId = mesDepost.DepotId.ToString()
|
}).IgnoreColumns(true).ExecuteCommand();
|
else
|
db.Updateable<MesInvItemInCItems>()
|
.SetColumns(it =>
|
it.Quantity == it.Quantity + cSyQty)
|
.Where(it =>
|
it.ItemInId == cId &&
|
it.ItemId == detail.ItemId &&
|
it.DepotId == mesDepost.DepotId.ToString() &&
|
it.EbelnK3id == detail.EbelnK3id &&
|
it.LineK3id == detail.LineK3id)
|
.IgnoreColumns(true)
|
.ExecuteCommand();
|
|
db.Insertable(new MesInvItemInCDetails
|
{
|
ItemInId = cId,
|
BillNo = cBillNo,
|
ItemBarcode = itemBarcode,
|
Quantity = cSyQty,
|
BarcodeFlag = true,
|
EpFlag = true,
|
WorkType = 1,
|
ItemNo = detail.ItemNo,
|
SuppId = itemBarcodeDetails.SuppId,
|
SuppNo = itemBarcodeDetails.SuppNo,
|
DepotCode = mesDepost.DepotCode,
|
DepotSectionCode = sectionCode,
|
ItemSname = itemBarcodeDetails.ItemSname,
|
Unit = itemBarcodeDetails.Unit,
|
CreateBy = user,
|
CreateDate = DateTime.Now,
|
LastupdateBy = user,
|
LastupdateDate = DateTime.Now,
|
Remark = itemBarcodeDetails.Memo,
|
Ebeln = detail.WorkNo,
|
EbelnLineNo = detail.EbelnLine,
|
WorkNo = detail.WorkNo,
|
WorkLine = detail.WorkLine,
|
CbillNo = itemBarcodeDetails.BillNo,
|
UrgentFlag = detail.UrgentFlag,
|
BoardStyle = detail.BoardStyle,
|
TaskNo = detail.WorkNo,
|
EbelnK3id = detail.EbelnK3id,
|
LineK3id = detail.LineK3id,
|
ItemId = detail.ItemId,
|
ReceiveOrgId = inventory.ReceiveOrgId,
|
LotNo = cgddDetails.BatchNumber
|
}).IgnoreColumns(true).ExecuteCommand();
|
|
cSyQty = 0; // Remaining quantity fulfilled
|
}
|
}
|
|
db.Insertable(new MesInvBusiness2
|
{
|
Status = 1,
|
BillTypeId = billTypeId,
|
TransactionCode = transactionNo,
|
BusinessType = 1,
|
ItemBarcode = itemBarcode,
|
ItemNo = itemBarcodeDetails.ItemNo,
|
LotNo = cgddDetails.BatchNumber,
|
EpFlag = true,
|
Quantity = itemBarcodeDetails.Quantity,
|
ToInvDepotsCode = mesDepost.DepotCode,
|
ToInvDepotSectionsCode = sectionCode,
|
Description = "采购入库",
|
CreateBy = user,
|
CreateDate = DateTime.Now,
|
LastupdateBy = user,
|
LastupdateDate = DateTime.Now,
|
TaskNo = itemBarcodeDetails.BillNo,
|
BillNo = cBillNo,
|
WorkNo = itemBarcodeDetails.WorkNo,
|
WorkLine = itemBarcodeDetails.WorkLine,
|
SuppId = itemBarcodeDetails.SuppId,
|
SuppNo = itemBarcodeDetails.SuppNo,
|
EbelnK3id = itemBarcodeDetails.EbelnK3id,
|
LineK3id = itemBarcodeDetails.LineK3id,
|
ItemId = itemBarcodeDetails.ItemId
|
}).IgnoreColumns(true).ExecuteCommand();
|
|
// Insert into mes_inv_item_stocks
|
}
|
else
|
{
|
var detailone = db.Queryable<MesInvItemArnDetail>()
|
.Where(d =>
|
d.Guid == itemBarcodeDetails.AboutGuid)
|
.First();
|
|
// 检查是否存在于 MES_INV_ITEM_IN_C_ITEMS 表
|
var existingCount = db.Queryable<MesInvItemInCItems>()
|
.Where(it =>
|
it.ItemInId == cId &&
|
it.ItemId == detailone.ItemId &&
|
it.DepotId == mesDepost.DepotId.ToString() &&
|
it.itemDabid == itemBarcodeDetails.AboutGuid.ToString())
|
.Count();
|
|
if (existingCount == 0)
|
// 不存在时插入新记录
|
db.Insertable(new MesInvItemInCItems
|
{
|
ItemInId = cId,
|
Quantity = itemBarcodeDetails.Quantity,
|
CreateBy = user,
|
CreateDate = DateTime.Now,
|
ItemNo = itemBarcodeDetails.ItemNo,
|
DepotCode = mesDepost.DepotCode,
|
ItemSname = itemBarcodeDetails.ItemSname,
|
Unit = itemBarcodeDetails.Unit,
|
Ebeln = itemBarcodeDetails.WorkNo,
|
BillNo = cBillNo,
|
WorkNo = itemBarcodeDetails.WorkNo,
|
EbelnLineNo = itemBarcodeDetails.WorkLine,
|
CbillNo = itemBarcodeDetails.BillNo,
|
WorkLine = itemBarcodeDetails.WorkLine,
|
SuppId = itemBarcodeDetails.SuppId,
|
SuppNo = itemBarcodeDetails.SuppNo,
|
Remark = itemBarcodeDetails.Memo,
|
EbelnK3id = itemBarcodeDetails.EbelnK3id,
|
LineK3id = itemBarcodeDetails.LineK3id,
|
ItemId = itemBarcodeDetails.ItemId,
|
DepotId = mesDepost.DepotId.ToString(),
|
itemDabid = itemBarcodeDetails.AboutGuid.ToString()
|
}).IgnoreColumns(true).ExecuteCommand();
|
else
|
// 存在时更新数量
|
db.Updateable<MesInvItemInCItems>()
|
.SetColumns(it => new MesInvItemInCItems
|
{
|
Quantity = SqlFunc.IsNull(it.Quantity, 0) + itemBarcodeDetails.Quantity // 确保 Quantity 不为 null
|
})
|
.Where(it =>
|
it.ItemInId == cId &&
|
it.ItemId == detailone.ItemId &&
|
it.DepotId == mesDepost.DepotId.ToString() &&
|
it.itemDabid == itemBarcodeDetails.AboutGuid.ToString())
|
//.IgnoreColumns(true) // 保留 IgnoreColumns
|
.ExecuteCommand();
|
|
// 插入 mes_inv_item_in_c_details 表
|
db.Insertable(new MesInvItemInCDetails
|
{
|
ItemInId = cId,
|
BillNo = cBillNo,
|
ItemBarcode = itemBarcode,
|
Quantity = itemBarcodeDetails.Quantity,
|
BarcodeFlag = true,
|
EpFlag = true,
|
WorkType = 1,
|
ItemNo = itemBarcodeDetails.ItemNo,
|
LotNo = cgddDetails.BatchNumber,
|
SuppId = itemBarcodeDetails.SuppId,
|
SuppNo = itemBarcodeDetails.SuppNo,
|
DepotCode = mesDepost.DepotCode,
|
DepotSectionCode = sectionCode,
|
ItemSname = itemBarcodeDetails.ItemSname,
|
Unit = itemBarcodeDetails.Unit,
|
CreateBy = user,
|
CreateDate = DateTime.Now,
|
LastupdateBy = user,
|
LastupdateDate = DateTime.Now,
|
Remark = itemBarcodeDetails.Memo,
|
Ebeln = itemBarcodeDetails.Mblnr,
|
EbelnLineNo = itemBarcodeDetails.Zeile,
|
WorkNo = itemBarcodeDetails.WorkNo,
|
WorkLine = itemBarcodeDetails.WorkLine,
|
CbillNo = itemBarcodeDetails.BillNo,
|
UrgentFlag = itemBarcodeDetails.UrgentFlag,
|
BoardStyle = itemBarcodeDetails.BoardStyle,
|
TaskNo = itemBarcodeDetails.TaskNo,
|
EbelnK3id = itemBarcodeDetails.EbelnK3id,
|
LineK3id = itemBarcodeDetails.LineK3id,
|
ItemId = itemBarcodeDetails.ItemId,
|
Ischeck = true,
|
CheckDate = inventoryDetails.CheckDate,
|
CheckRes = inventoryDetails.CheckRes,
|
CheckStates = inventoryDetails.CheckStates,
|
ReceiveOrgId = inventory.ReceiveOrgId,
|
DepotId = Convert.ToInt64(mesDepost.DepotId.ToString())
|
}).IgnoreColumns(true).ExecuteCommand();
|
|
// 插入 mes_inv_business2 表
|
db.Insertable(new MesInvBusiness2
|
{
|
Status = 1,
|
BillTypeId = billTypeId,
|
TransactionCode = transactionNo,
|
BusinessType = 1,
|
ItemBarcode = itemBarcode,
|
ItemNo = itemBarcodeDetails.ItemNo,
|
LotNo = itemBarcodeDetails.LotNo,
|
EpFlag = true,
|
Quantity = itemBarcodeDetails.Quantity,
|
FromInvDepotsCode = null,
|
FromInvDepotSectionsCode = null,
|
ToInvDepotsCode = mesDepost.DepotCode,
|
ToInvDepotSectionsCode = sectionCode,
|
Description = "采购入库",
|
CreateBy = user,
|
CreateDate = DateTime.Now,
|
LastupdateBy = user,
|
LastupdateDate = DateTime.Now,
|
TaskNo = itemBarcodeDetails.TaskNo,
|
BillNo = cBillNo,
|
WorkNo = itemBarcodeDetails.WorkNo,
|
WorkLine = itemBarcodeDetails.WorkLine,
|
SuppId = itemBarcodeDetails.SuppId,
|
SuppNo = itemBarcodeDetails.SuppNo,
|
EbelnK3id = itemBarcodeDetails.EbelnK3id,
|
LineK3id = itemBarcodeDetails.LineK3id,
|
ItemId = itemBarcodeDetails.ItemId
|
}).IgnoreColumns(true).ExecuteCommand();
|
|
// 插入 mes_inv_item_stocks 表
|
}
|
|
|
|
db.Insertable(new MesInvItemStocks
|
{
|
TaskNo = itemBarcodeDetails.TaskNo,
|
ItemBarcode = itemBarcode,
|
ItemNo = cgddDetails.BatchNumber,
|
LotNo = itemBarcodeDetails.LotNo,
|
Quantity = itemBarcodeDetails.Quantity,
|
DepotsCode = mesDepost.DepotCode,
|
DepotSectionsCode = sectionCode,
|
CheckDate = inventoryDetails.CheckDate,
|
IndepDate = DateTime.Now,
|
IqcStatus = inventoryDetails.CheckStates,
|
BoardStyle = itemBarcodeDetails.BoardStyle,
|
WorkNo = itemBarcodeDetails.WorkNo,
|
WorkLine = itemBarcodeDetails.WorkLine,
|
SuppId = itemBarcodeDetails.SuppId,
|
SuppNo = itemBarcodeDetails.SuppNo,
|
EbelnK3id = itemBarcodeDetails.EbelnK3id,
|
LineK3id = itemBarcodeDetails.LineK3id,
|
ItemId = itemBarcodeDetails.ItemId,
|
BillNo = itemBarcodeDetails.BillNo,
|
DepotId = Convert.ToInt32(mesDepost.DepotId),
|
OwnerId = cgddDetails.DemandOrg,
|
OwnerType = owner_type,
|
StockOrgId = mesDepost.FSubsidiary,
|
IndepUserCode = user
|
}).IgnoreColumns(true).ExecuteCommand();
|
|
itemBarcodeDetails.Hbdy ??= 0;
|
|
if (itemBarcodeDetails.Hbdy != 1)
|
{
|
//更新收料单明细
|
db.Updateable<MesInvItemArnDetail>()
|
.SetColumns(d => new MesInvItemArnDetail
|
{
|
OkRkqty = (int)((d.OkRkqty ?? 0) + cSyQty)
|
})
|
.Where(d => d.Guid == itemBarcodeDetails.AboutGuid)
|
.ExecuteCommand();
|
|
var first = db
|
.Queryable<MesInvItemArnDetail>()
|
.Where(b =>
|
b.Guid == itemBarcodeDetails.AboutGuid)
|
.Select(b => new
|
{
|
TotalQuantity =
|
SqlFunc.AggregateSum(b.Quantity),
|
TotalOkRkQty = SqlFunc.AggregateSum(b.OkRkqty)
|
})
|
.First();
|
|
var TotalQuantity = first.TotalQuantity ?? 0;
|
var TotalOkRkQty = first.TotalOkRkQty ?? 0;
|
|
if (TotalQuantity == TotalOkRkQty)
|
db.Updateable<MesInvItemArnDetail>()
|
.SetColumns(s => s.IsdepsIn == true)
|
.Where(s => s.Guid == itemBarcodeDetails.AboutGuid)
|
.ExecuteCommand();
|
|
|
var totalSummary = db.Queryable<MesInvItemArnDetail>()
|
.InnerJoin<MesInvItemArn>((b, a) => a.Guid == b.ParentGuid)
|
.Where((b, a) =>
|
a.BillNo == inventory.BillNo && b.ReturnFlag == 0)
|
.Select((b, a) => new
|
{
|
TotalQuantity = SqlFunc.AggregateSum(b.Quantity),
|
TotalOkRkQty = SqlFunc.AggregateSum(b.OkRkqty)
|
})
|
.First();
|
|
if ((totalSummary.TotalQuantity ?? 0) ==
|
(totalSummary.TotalOkRkQty ?? 0))
|
db.Updateable<MesInvItemArn>()
|
.SetColumns(it => it.Status == 1)
|
.Where(it => it.BillNo == itemBarcodeDetails.BillNo)
|
.ExecuteCommand();
|
|
var totalCDetailsQuantity = db.Queryable<MesInvItemInCDetails>()
|
.Where(it => it.ItemId == itemBarcodeDetails.ItemId &&
|
it.WorkNo == itemBarcodeDetails.WorkNo &&
|
it.ItemInId == cId)
|
.Sum(it => it.Quantity);
|
|
var detailSummary = db.Queryable<MesInvItemArnDetail>()
|
.Where(it => it.Guid == inventoryDetails.Guid)
|
.Select(it => new
|
{
|
TotalComeQty = SqlFunc.AggregateSum(it.Quantity),
|
TotalInvQty = SqlFunc.AggregateSum(it.OkRkqty)
|
})
|
.First();
|
|
var comeQty = detailSummary.TotalComeQty ?? 0;
|
var invQty = detailSummary.TotalInvQty ?? 0;
|
var diffQty = comeQty - invQty;
|
|
if (detailSummary == null)
|
throw new Exception("此条码找不到对应收货单明细!");
|
|
var mesItems = db.Queryable<MesItems>()
|
.Where(s => s.Id == itemBarcodeDetails.ItemId).First();
|
|
//result.Message =
|
// $"条码数量 {itemBarcodeDetails.Quantity},采购订单 {itemBarcodeDetails.WorkNo} 项次 {itemBarcodeDetails.WorkLine} 物料 {mesItems.ItemNo} 本次入库总数:{totalCDetailsQuantity} 总到 {comeQty} 已入 {invQty} 欠 {diffQty}";
|
result.Message = $"物料{mesItems.ItemNo}入库成功数量{itemBarcodeDetails.Quantity.ToString()}";
|
|
result.itemDetail = mesItems;
|
|
result.ItemInDetails = db.Queryable<MesInvItemInCItems,MesItems>(
|
(a, b) => new JoinQueryInfos(
|
JoinType.Left,
|
a.ItemId == b.ItemId)
|
)
|
.Where(a => a.ItemInId == cId && a.ItemId == itemBarcodeDetails.ItemId)
|
.Select<dynamic>((a, b) => new
|
{
|
ItemNo = b.ItemNo,
|
ItemName = b.ItemName,
|
ItemModel = b.ItemModel,
|
FQty = a.Quantity, // 申请数量
|
FMaterialId = b.ItemId,
|
Id = b.Guid.ToString()
|
})
|
.ToList();
|
|
result.ItemBarCDetails = db.Queryable<MesInvItemInCDetails, MesItems>(
|
(a, b) => new JoinQueryInfos(
|
JoinType.Left,
|
a.ItemId == b.ItemId)
|
)
|
.Where(a => a.ItemInId == cId && a.ItemId == itemBarcodeDetails.ItemId)
|
.Select<dynamic>((a, b) => new
|
{
|
ItemNo = b.ItemNo,
|
ItemName = b.ItemName,
|
ItemModel = b.ItemModel,
|
FQty = a.Quantity, // 申请数量
|
FMaterialId = b.ItemId,
|
Id = a.Guid.ToString(),
|
kw = a.DepotSectionCode,
|
barcode = a.ItemBarcode
|
})
|
.ToList();
|
|
|
//result.ItemNo = mesItems.ItemNo;
|
result.SumQuantity = Convert.ToDecimal(invQty);
|
|
return 1;
|
}
|
else
|
{
|
// Step 1: Check if bill needs to be closed (status update)
|
var totalSummary = db.Queryable<MesInvItemArnDetail>()
|
.LeftJoin<MesInvItemArn>((b, a) => a.Guid == b.ParentGuid)
|
.Where((b, a) =>
|
a.BillNo == inventory.BillNo && b.ReturnFlag == 0)
|
.Select((b, a) => new
|
{
|
TotalQuantity = SqlFunc.AggregateSum(b.Quantity),
|
TotalOkRkQty = SqlFunc.AggregateSum(b.OkRkqty)
|
})
|
.First();
|
|
if ((totalSummary.TotalQuantity ?? 0) ==
|
(totalSummary.TotalOkRkQty ?? 0))
|
db.Updateable<MesInvItemArn>()
|
.SetColumns(it => it.Status == 1)
|
.Where(it => it.BillNo == itemBarcodeDetails.BillNo)
|
.ExecuteCommand();
|
|
// Step 2: Calculate total sum from `mes_inv_item_in_c_details`
|
var totalCDetailsQuantity = db.Queryable<MesInvItemInCDetails>()
|
.Where(it => it.Guid == itemBarcodeDetails.AboutGuid)
|
.Sum(it => it.Quantity);
|
|
// Step 3: Calculate comeQty and invQty from `mes_inv_item_arn_detail`
|
var detailSummary = db.Queryable<MesInvItemArnDetail>()
|
.Where(it => it.Guid == itemBarcodeDetails.AboutGuid)
|
.Select(it => new
|
{
|
TotalComeQty = SqlFunc.AggregateSum(it.Quantity),
|
TotalInvQty = SqlFunc.AggregateSum(it.OkRkqty)
|
})
|
.First();
|
|
if (detailSummary == null)
|
throw new Exception("此条码找不到对应收货单明细!");
|
|
var comeQty = detailSummary.TotalComeQty ?? 0;
|
var invQty = detailSummary.TotalInvQty ?? 0;
|
var diffQty = comeQty - invQty;
|
|
var mesItems = db.Queryable<MesItems>()
|
.Where(s => s.Id == itemBarcodeDetails.ItemId).First();
|
|
// Step 5: Combine final result
|
result.Message =
|
$" 条码数量:{itemBarcodeDetails.Quantity},物料 {mesItems.ItemNo} 本次入库总数:{totalCDetailsQuantity} 总到 {comeQty} 已入 {invQty} 欠 {diffQty}";
|
|
|
//result.ItemNo = mesItems.ItemNo;
|
result.SumQuantity = Convert.ToDecimal(totalCDetailsQuantity);
|
}
|
|
var mesInvItemInCDetails =
|
base.GetSingle(it => it.ItemBarcode == entity.barcode);
|
|
if (mesInvItemInCDetails == null)
|
throw new Exception("物料入库条码明细不存在"); // 抛出异常以供前台处理
|
|
// 创建 插入日志
|
var logService = new LogService();
|
var LogMsg = "【PDA】采购入库。条码【" + entity.barcode + "】 入库单号【" + cBillNo + "】";
|
logService.CreateLog(db, entity.userName, inventory.Guid.ToString(), "MES_INV_ITEM_ARN", LogMsg, inventory.BillNo);
|
|
return 1;
|
});
|
|
var purchaseInventory = getPurchaseInventory(entity);
|
|
|
//result.ItemInDetails = purchaseInventory.ItemInDetails;
|
//result.InvItemInCDetails = purchaseInventory.InvItemInCDetails;
|
|
return result;
|
}
|
|
public ItemInBaseModel getPurchaseInventory(WarehouseQuery query)
|
{
|
return new ItemInBaseModel
|
{
|
//ItemIns = GetInvItemInsList(query).Items[0],
|
//ItemInDetails = GetItemInDetails(query.id),
|
//InvItemInCDetails = GetInvItemInCDetails(query.id)
|
};
|
}
|
|
public (List<MesInvItemIns> Items, int TotalCount) GetInvItemInsList(
|
WarehouseQuery query)
|
{
|
var parsedGuid = Guid.Empty;
|
if (!string.IsNullOrEmpty(query.id))
|
{
|
var isValid = Guid.TryParse(query.id, out parsedGuid);
|
if (!isValid)
|
throw new ApplicationException("GUID转换错误");
|
}
|
|
var totalCount = 0;
|
var result = Db.Queryable<MesInvItemIns, MesDepots, MesSupplier>(
|
(a, b, c) =>
|
new JoinQueryInfos(JoinType.Left,
|
a.DepotsId == b.DepotId,
|
JoinType.Left, a.SuppId == c.Id.ToString()))
|
.WhereIF(UtilityHelper.CheckGuid(parsedGuid),
|
(a, b, c) => a.Guid == parsedGuid)
|
.Select((a, b, c) => new MesInvItemIns
|
{
|
Guid = a.Guid,
|
SuppNo = a.SuppNo,
|
InsDate = a.InsDate,
|
PaperBillNo = a.PaperBillNo,
|
Remark = a.Remark,
|
DepotsCode = a.DepotsCode,
|
CbillNo = a.CbillNo,
|
Status = a.Status,
|
BillNo = a.BillNo,
|
CreateDate = a.CreateDate,
|
CreateBy = a.CreateBy,
|
DepotName = b.DepotName,
|
SuppName = c.SuppName
|
}).ToPageList(query.PageIndex, query.Limit, ref totalCount);
|
return (result, totalCount);
|
}
|
|
public List<MesInvItemInCItems> GetItemInDetails(string? pid)
|
{
|
//string转guid
|
var parsedGuid = Guid.Empty;
|
if (string.IsNullOrEmpty(pid)) return [];
|
|
var isValid = Guid.TryParse(pid, out parsedGuid);
|
if (!isValid)
|
throw new ApplicationException("GUID转换错误");
|
|
var result = Db.Queryable<MesInvItemInCDetails, MesItems, MesUnit>(
|
(g, c, d) => new JoinQueryInfos(
|
JoinType.Left, g.ItemId == c.Id,
|
JoinType.Inner, d.Id == Convert.ToDecimal(g.Unit)
|
)
|
).WhereIF(UtilityHelper.CheckGuid(parsedGuid),
|
(g, c, d) => g.ItemInId == parsedGuid)
|
.Select((g, c, d) => new MesInvItemInCItems
|
{
|
Guid = g.Guid,
|
WorkNo = g.WorkNo,
|
ItemNo = c.ItemNo,
|
ItemSname = g.ItemSname,
|
Quantity = g.Quantity,
|
Unit = d.Fname
|
})
|
.ToList();
|
|
return result;
|
}
|
|
public List<MesInvItemInCDetails> GetInvItemInCDetails(string? pid)
|
{
|
//string转guid
|
var parsedGuid = Guid.Empty;
|
if (string.IsNullOrEmpty(pid)) return [];
|
|
var isValid = Guid.TryParse(pid, out parsedGuid);
|
if (!isValid)
|
throw new ApplicationException("GUID转换错误");
|
|
var result = Db.Queryable<MesInvItemInCDetails, MesItems, MesUnit>(
|
(g, c, d) => new JoinQueryInfos(
|
JoinType.Left,
|
g.ItemId == c.Id, JoinType.Inner,
|
d.Id.ToString() == c.Fpurchaseunitid
|
)
|
).WhereIF(UtilityHelper.CheckGuid(parsedGuid),
|
(g, c, d) => g.ItemInId == parsedGuid)
|
.Select((g, c, d) => new MesInvItemInCDetails
|
{
|
Guid = g.Guid,
|
ItemName = c.ItemName,
|
ItemModel = c.ItemModel,
|
ItemUnit = d.Fname,
|
DepotSectionCode = g.DepotSectionCode,
|
CbillNo = g.CbillNo,
|
ItemBarcode = g.ItemBarcode,
|
UrgentFlag = g.UrgentFlag,
|
ItemNo = c.ItemNo,
|
WorkNo = g.WorkNo,
|
Quantity = g.Quantity
|
})
|
.ToList();
|
|
return result;
|
}
|
|
|
public MessageCenter MesToErpParam(WarehouseQuery query)
|
{
|
var erpParameters = "";
|
var title = "";
|
var tableName = "MES_INV_ITEM_INS_" + query.Type;
|
if ("A".Equals(query.Type))
|
{
|
erpParameters = GetErpParameters(query.billNo);
|
title = "采购入库单" + query.billNo + "审核";
|
}
|
else if ("B".Equals(query.Type))
|
{
|
erpParameters = GetDeApprovePam(query.id);
|
title = "采购入库单" + query.billNo + "反审核";
|
}
|
|
var ErpUrl = AppsettingsUtility.Settings.ProductionErpUrl;
|
|
var newGuid = Guid.NewGuid();
|
var message = new MessageCenter
|
{
|
Guid = newGuid,
|
//Pid = newGuid,
|
TableName = tableName,
|
Url = ErpUrl,
|
Status = 1,
|
CreateBy = query.userName,
|
Route = query.billNo,
|
Title = title,
|
PageName = "Warehouse/PurchaseInventory/Add?id=" + query.id +
|
"&billNo=" + query.billNo,
|
CreateDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
|
Method = "POST",
|
Seq = 1,
|
Data = erpParameters,
|
IsMessage = 0,
|
ContentType = "application/x-www-form-urlencoded"
|
};
|
return message;
|
}
|
|
public MessageCenter SaveMessageCenter(WarehouseQuery query)
|
{
|
var message = MesToErpParam(query);
|
|
var executeReturnIdentity =
|
Db.Insertable(message).ExecuteCommand();
|
if (executeReturnIdentity > 0)
|
{
|
message.Pid = message.Guid;
|
return message;
|
}
|
|
throw new Exception("获取数据失败");
|
}
|
|
//audit
|
public bool audit(WarehouseQuery entity)
|
{
|
entity.date = DateTime.Now;
|
entity.status = 1;
|
return Update(entity);
|
}
|
|
public bool deApprove(WarehouseQuery entity)
|
{
|
entity.date = null;
|
entity.status = 0;
|
return Update(entity);
|
}
|
|
private bool Update(WarehouseQuery entity)
|
{
|
return Db.Updateable<MesInvItemIns>()
|
.SetColumns(x => x.Status == entity.status)
|
.SetColumns(x => x.InsDate == entity.date)
|
.Where(x => x.BillNo == entity.billNo)
|
.IgnoreColumns(true).ExecuteCommand() > 0;
|
}
|
|
private string GetErpParameters(string? billNo)
|
{
|
var invItemIns = Db.Queryable<MesInvItemIns>()
|
.Single(x => x.BillNo == billNo);
|
|
if (invItemIns == null) throw new Exception("入库单号不存在");
|
|
if (invItemIns.Status == 1) throw new Exception("入库单已审核,不能重复推送");
|
|
var materials = Db.Queryable<MesInvItemInCItems, MesItems, MesUnit,
|
MesInvItemArnDetail>(
|
(g, c, d, a) => new JoinQueryInfos(
|
JoinType.Left,
|
g.ItemId == c.Id, JoinType.Inner,
|
d.Id.ToString() == c.Fpurchaseunitid,
|
JoinType.Inner, a.Ebeln == g.WorkNo && g.CbillNo == a.CbillNo
|
)
|
).Where((g, c, d, a) => g.BillNo == billNo).Select<Material>(
|
(g, c, d, a) => new Material
|
{
|
FMaterialId = c.ItemNo,
|
FRealQty = g.Quantity.ToString(),
|
FStockId = g.DepotCode,
|
FLot = a.CbillNo,
|
FUnitID = d.Fnumber,
|
FsrcEntryId = a.Guid.ToString(),
|
FMesEntryid = g.Guid.ToString()
|
}).ToList();
|
|
|
if (materials == null || materials.Count == 0)
|
throw new Exception("没有找到相关数据"); // 抛出异常以供前台处理
|
// 构造 JSON
|
|
var jsonEntries = materials.Select(d => new
|
{
|
d.FMaterialId,
|
d.FRealQty,
|
d.FStockId,
|
d.FLot,
|
FUintId = d.FUnitID,
|
FSRCENTRYID = d.FsrcEntryId,
|
F_MES_ENTRYID = d.FMesEntryid
|
}).ToList();
|
|
var fdate = DateTime.Now.ToString("yyyy-MM-dd");
|
|
var jsonString = JsonConvert.SerializeObject(jsonEntries);
|
var encodedUrl = "taskname=CGRK&mesid=" + invItemIns.Guid +
|
"&optype=create&datajson={\"F_MES_ID\":\"" +
|
invItemIns.Guid + "\",\"FDate\":\"" + fdate +
|
"\",\"cgrkentry\":" + jsonString + "}";
|
|
return encodedUrl;
|
}
|
|
|
private string GetDeApprovePam(string? id)
|
{
|
var encodedUrl = "taskname=CGRK&mesid=" + id +
|
"&optype=delete&datajson={}";
|
|
return encodedUrl;
|
}
|
}
|