|
|
@@ -69,6 +69,12 @@ namespace Business.Replenishment
|
|
|
|
|
|
private ISqlRepository<NbrMaster> _nbrMaster;
|
|
|
private ISqlRepository<NbrDetail> _nbrDetail;
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 送货单子表
|
|
|
+ /// </summary>
|
|
|
+ private readonly ISqlRepository<scm_shdzb> _scm_shdzb;
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// 交货单异常记录表
|
|
|
/// </summary>
|
|
|
@@ -347,6 +353,7 @@ namespace Business.Replenishment
|
|
|
ISqlRepository<PurOrdDetail> PurOrdDetail,
|
|
|
ISqlRepository<PurOrdMaster> PurOrdMaster,
|
|
|
ISqlRepository<DeliveryExceptionMaster> DeliveryExceptionMaster,
|
|
|
+ ISqlRepository<scm_shdzb> scm_shdzb,
|
|
|
IUnitOfWorkManager unitOfWorkManager)
|
|
|
{
|
|
|
_replenishmentROPWeekPlan = replenishmentROPWeekPlan;
|
|
|
@@ -445,6 +452,7 @@ namespace Business.Replenishment
|
|
|
_PurOrdDetail = PurOrdDetail;
|
|
|
_PurOrdMaster = PurOrdMaster;
|
|
|
_DeliveryExceptionMaster = DeliveryExceptionMaster;
|
|
|
+ _scm_shdzb = scm_shdzb;
|
|
|
}
|
|
|
#endregion
|
|
|
|
|
|
@@ -6688,17 +6696,19 @@ namespace Business.Replenishment
|
|
|
return Msg;
|
|
|
}
|
|
|
//获取采购明细数据:未关闭,且未交货数量(需求数量-已收数量)>0
|
|
|
- //DateTime endTime = Convert.ToDateTime("2024-01-01 00:00:00.000");
|
|
|
List<PurOrdDetail> purOrdDetails = _PurOrdDetail.Select(p => p.Domain == domain && itemnums.Contains(p.ItemNum) && p.Status.ToUpper() != "C" && (p.QtyOrded - p.RctQty) > 0).OrderBy(p => p.DueDate).ToList();
|
|
|
if (!purOrdDetails.Any())
|
|
|
{
|
|
|
Msg = "NO|没有可用的采购单";
|
|
|
return Msg;
|
|
|
}
|
|
|
+ List<string> purOrds = purOrdDetails.Select(p => p.PurOrd).Distinct().ToList();
|
|
|
+ //获取送货单子表数据
|
|
|
+ List<scm_shdzb> shdzbs = _scm_shdzb.Select(p=> purOrds.Contains(p.po_bill) && itemnums.Contains(p.sh_material_code) && string.IsNullOrEmpty(p.jhdbh)).ToList();
|
|
|
//获取采购单数据
|
|
|
- List<PurOrdMaster> purOrdMasters = _PurOrdMaster.Select(p => p.Domain == domain && purOrdDetails.Select(m => m.PurOrd).Distinct().Contains(p.PurOrd)).ToList();
|
|
|
+ List<PurOrdMaster> purOrdMasters = _PurOrdMaster.Select(p => p.Domain == domain && purOrds.Contains(p.PurOrd)).ToList();
|
|
|
//获取占用可用PO明细的交货单
|
|
|
- List<srm_polist_ds> dbPolistds = _srmpolistds.Select(p => purOrdDetails.Select(m => m.PurOrd).Contains(p.ponumber) && p.status.ToUpper() !="C" && p.isactive == 1).ToList();
|
|
|
+ List<srm_polist_ds> dbPolistds = _srmpolistds.Select(p => purOrds.Contains(p.ponumber) && p.isactive == 1).ToList();
|
|
|
|
|
|
//生成交货单
|
|
|
srm_polist_ds entity;
|
|
|
@@ -6767,15 +6777,17 @@ namespace Business.Replenishment
|
|
|
}
|
|
|
//当前采购明细对应的采购单
|
|
|
var curPurMsts = purOrdMasters.Where(p => curPurDtls.Select(m => m.PurOrd).Distinct().Contains(p.PurOrd)).ToList();
|
|
|
+ //当前采购明细对应的送货单
|
|
|
+ var curShds = shdzbs.Where(p => p.sh_material_code == demandplans[i].itemnum && curPurDtls.Select(m => m.PurOrd).Contains(p.sh_material_code)).ToList();
|
|
|
//数据库中当前采购单明细被交货单占用情况
|
|
|
var curDbOccupys = dbPolistds.Where(p => curPurDtls.Select(m => m.PurOrd).Contains(p.ponumber) && p.itemnum == demandplans[i].itemnum).ToList();
|
|
|
//本次计算中采购单明细被交货单占用情况
|
|
|
var curCalcOccupys = inserts.Where(p => curPurDtls.Select(m => m.PurOrd).Contains(p.ponumber) && p.itemnum == demandplans[i].itemnum).ToList();
|
|
|
//校验4:如果当前物料对应的采购明细可用数量不满足,则跳过
|
|
|
- //采购单明细的剩余未交数量:采购明细的需求数量-已交数量
|
|
|
- sumRestQty = curPurDtls.Sum(p => p.QtyOrded - p.RctQty);
|
|
|
- //交货单占用数量:交货单的剩余需要采购数量
|
|
|
- sumDbOccupy = curDbOccupys.Sum(p => p.restqty);
|
|
|
+ //采购单明细的剩余未交数量:采购明细的需求数量-送货单需求数量(不是交货单转的送货单)
|
|
|
+ sumRestQty = curPurDtls.Sum(p => p.QtyOrded) - curShds.Sum(p=>p.sh_delivery_quantity);
|
|
|
+ //交货单占用数量:交货单的需求数量
|
|
|
+ sumDbOccupy = curDbOccupys.Sum(p => p.schedqty);
|
|
|
//本次计算交货单占用数量:本次计算交货单的需求数量
|
|
|
sumCurOccupy = curCalcOccupys.Sum(p => p.schedqty);
|
|
|
//剩余可用数量
|
|
|
@@ -6858,11 +6870,13 @@ namespace Business.Replenishment
|
|
|
flag = true;
|
|
|
break;
|
|
|
}
|
|
|
+ //送货单占用数量
|
|
|
+ var pchShds = curShds.Where(p => pchPurMsts.Select(m => m.PurOrd).Contains(p.po_bill)).ToList();
|
|
|
//校验当前供应商的采购明细剩余可用数量是否满足供应商的配额
|
|
|
//采购单明细剩余可用数量
|
|
|
- sumRestQty = pchPurDtls.Sum(p => p.QtyOrded - p.RctQty);
|
|
|
+ sumRestQty = pchPurDtls.Sum(p => p.QtyOrded) - pchShds.Sum(p=>p.sh_delivery_quantity);
|
|
|
//交货单占用数量:交货单的剩余需要采购数量
|
|
|
- sumDbOccupy = curDbOccupys.Where(p => pchPurDtls.Select(m => m.PurOrd).Contains(p.ponumber)).Sum(p => p.restqty);
|
|
|
+ sumDbOccupy = curDbOccupys.Where(p => pchPurDtls.Select(m => m.PurOrd).Contains(p.ponumber)).Sum(p => p.schedqty);
|
|
|
//本次计算交货单占用数量:本次计算交货单的需求数量
|
|
|
sumCurOccupy = curCalcOccupys.Where(p => pchPurDtls.Select(m => m.PurOrd).Contains(p.ponumber)).Sum(p => p.schedqty);
|
|
|
//剩余可用数量
|
|
|
@@ -6892,11 +6906,11 @@ namespace Business.Replenishment
|
|
|
//当前供应商配额以满足,循环下一个供应商
|
|
|
break;
|
|
|
}
|
|
|
- //当前采购明细剩余数量=订单数量-已收数量
|
|
|
- decimal syQty = pchPurDtls[k].QtyOrded - pchPurDtls[k].RctQty;
|
|
|
+ //当前采购明细剩余数量=订单数量-送货单数量(不是由交货单转的送货单)
|
|
|
+ decimal syQty = pchPurDtls[k].QtyOrded - pchShds.Where(p => p.po_billline == pchPurDtls[k].Line).Sum(p=>p.sh_delivery_quantity);
|
|
|
//当前采购明细被占用数量(已占用数量)
|
|
|
var occupy = curDbOccupys.Where(p => p.ponumber == pchPurDtls[k].PurOrd && p.itemnum == pchPurDtls[k].ItemNum && p.poline == pchPurDtls[k].Line).ToList();
|
|
|
- decimal yzyQty = occupy.Sum(p => p.restqty);
|
|
|
+ decimal yzyQty = occupy.Sum(p => p.schedqty);
|
|
|
//当前计算中采购明细被占用数量(本次计算占用数量)
|
|
|
var calcs = inserts.Where(p => p.ponumber == pchPurDtls[k].PurOrd && p.itemnum == pchPurDtls[k].ItemNum && p.poline == pchPurDtls[k].Line).ToList();
|
|
|
decimal bzyQty = calcs.Sum(p => p.schedqty);
|
|
|
@@ -6961,162 +6975,6 @@ namespace Business.Replenishment
|
|
|
sumNeedQty += xqQty;
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- foreach (var pch in curChaes)
|
|
|
- {
|
|
|
- if (pch.quota_rate.GetValueOrDefault() == 0)
|
|
|
- {
|
|
|
- continue;
|
|
|
- }
|
|
|
- //如果交货计划已分配数量>=交货计划净需求数量,则终止
|
|
|
- if (allQty >= demandplans[i].tosechedqty)
|
|
|
- {
|
|
|
- break;
|
|
|
- }
|
|
|
- //供应商占用数量置0
|
|
|
- sumNeedQty = 0m;
|
|
|
- //计算当前供应商分配数量
|
|
|
- needQty = Math.Ceiling(demandplans[i].tosechedqty * pch.quota_rate.GetValueOrDefault() / 100.00m);
|
|
|
- //如果交货计划剩余数量小于按照供应商配额计算的数量,则当前供应商需分配数量为交货计划剩余数量
|
|
|
- if (demandplans[i].tosechedqty - allQty < needQty)
|
|
|
- {
|
|
|
- needQty = demandplans[i].tosechedqty - allQty;
|
|
|
- }
|
|
|
- //以下为供应商是采购申请场景
|
|
|
- //获取当前供应商对应的采购单明细数据,按照交货日期从小到大开始占用
|
|
|
- var pchPurMsts = curPurMsts.Where(p => p.Supp == pch.supplier_number).ToList();
|
|
|
- if (!pchPurMsts.Any())
|
|
|
- {
|
|
|
- //当前供应商没有可用采购单,则当前交货计划无法转交货单
|
|
|
- info = new DeliveryExceptionMaster();
|
|
|
- info.Domain = domain;
|
|
|
- info.Icdsid = demandplans[i].Id;
|
|
|
- info.ItemNum = demandplans[i].itemnum;
|
|
|
- info.CreateTime = DateTime.Now;
|
|
|
- info.Remark = "交货计划[" + demandplans[i].itemnum + ":" + demandplans[i].requestdate.ToString("yyyy-MM-dd") + "]对应供应商[" + pch.supplier_name + "]没有可用采购明细,无法转交货单";
|
|
|
- info.OptTime = optime;
|
|
|
- exceptions.Add(info);
|
|
|
-
|
|
|
- flag = true;
|
|
|
- break;
|
|
|
- }
|
|
|
- var pchPurDtls = curPurDtls.Where(p => pchPurMsts.Select(m => m.PurOrd).Contains(p.PurOrd)).ToList();
|
|
|
- if (!pchPurDtls.Any())
|
|
|
- {
|
|
|
- //当前供应商没有可用采购单明细,则当前交货计划无法转交货单
|
|
|
- info = new DeliveryExceptionMaster();
|
|
|
- info.Domain = domain;
|
|
|
- info.Icdsid = demandplans[i].Id;
|
|
|
- info.ItemNum = demandplans[i].itemnum;
|
|
|
- info.CreateTime = DateTime.Now;
|
|
|
- info.Remark = "物料[" + demandplans[i].itemnum + "]对应供应商[" + pch.supplier_name + "]没有可用采购明细,无法转交货单";
|
|
|
- info.OptTime = optime;
|
|
|
- exceptions.Add(info);
|
|
|
-
|
|
|
- flag = true;
|
|
|
- break;
|
|
|
- }
|
|
|
- //校验当前供应商的采购明细剩余可用数量是否满足供应商的配额
|
|
|
- //采购单明细剩余可用数量
|
|
|
- sumRestQty = pchPurDtls.Sum(p => p.QtyOrded - p.RctQty);
|
|
|
- //交货单占用数量:交货单的剩余需要采购数量
|
|
|
- sumDbOccupy = curDbOccupys.Where(p => pchPurDtls.Select(m => m.PurOrd).Contains(p.ponumber)).Sum(p => p.restqty);
|
|
|
- //本次计算交货单占用数量:本次计算交货单的需求数量
|
|
|
- sumCurOccupy = curCalcOccupys.Where(p => pchPurDtls.Select(m => m.PurOrd).Contains(p.ponumber)).Sum(p => p.schedqty);
|
|
|
- //剩余可用数量
|
|
|
- restQty = sumRestQty - sumDbOccupy - sumCurOccupy;
|
|
|
- if (restQty < needQty)
|
|
|
- {
|
|
|
- //当前供应商可用采购单明细不足,则当前交货计划无法转交货单
|
|
|
- info = new DeliveryExceptionMaster();
|
|
|
- info.Domain = domain;
|
|
|
- info.Icdsid = demandplans[i].Id;
|
|
|
- info.ItemNum = demandplans[i].itemnum;
|
|
|
- info.CreateTime = DateTime.Now;
|
|
|
- info.Remark = "交货计划[" + demandplans[i].itemnum + ":" + demandplans[i].requestdate.ToString("yyyy-MM-dd") + "]对应供应商[" + pch.supplier_name + "]采购明细可用数量不足,无法转交货单";
|
|
|
- info.OptTime = optime;
|
|
|
- exceptions.Add(info);
|
|
|
-
|
|
|
- flag = true;
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- foreach (var pud in pchPurDtls)
|
|
|
- {
|
|
|
- if (sumNeedQty >= needQty)
|
|
|
- {
|
|
|
- //当前供应商配额以满足,循环下一个供应商
|
|
|
- break;
|
|
|
- }
|
|
|
- //当前采购明细剩余数量=订单数量-已收数量
|
|
|
- decimal syQty = pud.QtyOrded - pud.RctQty;
|
|
|
- //当前采购明细被占用数量(已占用数量)
|
|
|
- var occupy = curDbOccupys.Where(p => p.ponumber == pud.PurOrd && p.itemnum == pud.ItemNum && p.poline == pud.Line).ToList();
|
|
|
- decimal yzyQty = occupy.Sum(p => p.restqty);
|
|
|
- //当前计算中采购明细被占用数量(本次计算占用数量)
|
|
|
- var calcs = inserts.Where(p => p.ponumber == pud.PurOrd && p.itemnum == pud.ItemNum && p.poline == pud.Line).ToList();
|
|
|
- decimal bzyQty = calcs.Sum(p => p.schedqty);
|
|
|
-
|
|
|
- //当前采购明细可用数量
|
|
|
- decimal kyQty = syQty - yzyQty - bzyQty;
|
|
|
- //剩余需要分配数量
|
|
|
- remainQty = needQty - sumNeedQty;
|
|
|
- //当前采购明细已被全部占用,循环下一条采购明细
|
|
|
- if (kyQty == 0)
|
|
|
- {
|
|
|
- continue;
|
|
|
- }
|
|
|
- decimal xqQty = 0m;
|
|
|
- //当前采购明细的可用数量不满足交货单剩余需要分配数量
|
|
|
- if (kyQty < remainQty)
|
|
|
- {
|
|
|
- //占用当前采购明细剩余可用数量
|
|
|
- xqQty = kyQty;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- xqQty = remainQty;
|
|
|
- //按照最小包装量圆整:最小包装量为0,则不需要圆整
|
|
|
- decimal yzQty = pch.packaging_qty.GetValueOrDefault() == 0 ? remainQty : Math.Ceiling(remainQty / pch.packaging_qty.GetValueOrDefault()) * pch.packaging_qty.GetValueOrDefault();
|
|
|
- //如果可用数量大于圆整数量
|
|
|
- if (kyQty >= yzQty)
|
|
|
- {
|
|
|
- xqQty = yzQty;
|
|
|
- }
|
|
|
- }
|
|
|
- //生成实体
|
|
|
- entity = new srm_polist_ds();
|
|
|
- entity.Id = help.NextId();
|
|
|
- entity.domain = domain;
|
|
|
- entity.icdsid = demandplans[i].Id;
|
|
|
- //交货单号最后一次性生成
|
|
|
- entity.dsnum = "";
|
|
|
- entity.status = "N";
|
|
|
- entity.itemnum = demandplans[i].itemnum;
|
|
|
- entity.um = "";
|
|
|
- entity.purgroup = "";
|
|
|
- entity.suppliercode = pch.supplier_number;
|
|
|
- entity.supplier = string.IsNullOrEmpty(pch.supplier_name) ? "" : pch.supplier_name;
|
|
|
- entity.requestdate = demandplans[i].arrivaldate;
|
|
|
- entity.needdate = demandplans[i].requestdate;
|
|
|
- entity.ponumber = pud.PurOrd;
|
|
|
- entity.poline = pud.Line;
|
|
|
- entity.schedqty = xqQty;
|
|
|
- entity.lastsentqty = 0m;
|
|
|
- entity.sentqty = 0m;
|
|
|
- entity.restqty = xqQty;
|
|
|
- entity.createtime = DateTime.Now;
|
|
|
- entity.createuser = user;
|
|
|
- entity.remarks = "";
|
|
|
- entity.isactive = 1;
|
|
|
- curInserts.Add(entity);
|
|
|
-
|
|
|
- //当前交货计划已分配数量累加
|
|
|
- allQty += xqQty;
|
|
|
- //当前供应商已分配数量累加
|
|
|
- sumNeedQty += xqQty;
|
|
|
- }
|
|
|
- }
|
|
|
//标志位为true,则当前交货计划无法转交货单
|
|
|
if (flag)
|
|
|
{
|
|
|
@@ -7124,8 +6982,6 @@ namespace Business.Replenishment
|
|
|
}
|
|
|
inserts.AddRange(curInserts);
|
|
|
}
|
|
|
-
|
|
|
-
|
|
|
if (inserts.Any())
|
|
|
{
|
|
|
//获取交货单号
|