|
|
@@ -8,6 +8,7 @@ using Business.ReplenishmentManagement;
|
|
|
using Business.ResourceExamineManagement;
|
|
|
using Business.ResourceExamineManagement.Dto;
|
|
|
using Business.StructuredDB.MES.IC;
|
|
|
+using Business.StructuredDB.Production;
|
|
|
using Business.StructuredDB.Replenishment;
|
|
|
using Business.StructuredDB.SaleFcst;
|
|
|
using Business.StructuredDB.WMS;
|
|
|
@@ -63,6 +64,10 @@ namespace Business.Replenishment
|
|
|
/// 采购单表
|
|
|
/// </summary>
|
|
|
private readonly ISqlRepository<PurOrdMaster> _PurOrdMaster;
|
|
|
+ /// <summary>
|
|
|
+ /// 交货单异常记录表
|
|
|
+ /// </summary>
|
|
|
+ private readonly ISqlRepository<DeliveryExceptionMaster> _DeliveryExceptionMaster;
|
|
|
private readonly ISqlRepository<MonthlyShipmentPlan> _monthlyShipmentPlan;
|
|
|
private readonly ISqlRepository<MonthlyShipmentPlanHistory> _monthlyShipmentPlanHistory;
|
|
|
private readonly ISqlRepository<GeneralizedCodeMaster> _generalizedCodeMaster;
|
|
|
@@ -335,6 +340,7 @@ namespace Business.Replenishment
|
|
|
ISqlRepository<srm_polist_ds> srmpolistds,
|
|
|
ISqlRepository<PurOrdDetail> PurOrdDetail,
|
|
|
ISqlRepository<PurOrdMaster> PurOrdMaster,
|
|
|
+ ISqlRepository<DeliveryExceptionMaster> DeliveryExceptionMaster,
|
|
|
IUnitOfWorkManager unitOfWorkManager)
|
|
|
{
|
|
|
_replenishmentROPWeekPlan = replenishmentROPWeekPlan;
|
|
|
@@ -430,6 +436,7 @@ namespace Business.Replenishment
|
|
|
_srmpolistds = srmpolistds;
|
|
|
_PurOrdDetail = PurOrdDetail;
|
|
|
_PurOrdMaster = PurOrdMaster;
|
|
|
+ _DeliveryExceptionMaster = DeliveryExceptionMaster;
|
|
|
}
|
|
|
#endregion
|
|
|
|
|
|
@@ -6223,12 +6230,24 @@ namespace Business.Replenishment
|
|
|
public async Task<string> CreateDeliverySchedule(string domain,string user)
|
|
|
{
|
|
|
string Msg = "OK|交货单生成成功";
|
|
|
- //获取已发布的交货计划数据
|
|
|
- var demandplans = _icdemandschedule.GetListAsync(p=>p.factory_id.ToString() == domain && p.status == "P" && p.tosechedqty > 0 && !p.IsDeleted).Result;
|
|
|
- //获取以生成交货单的交货计划
|
|
|
+ //获取已发布且净需求数量大于0的交货计划数据
|
|
|
+ var demandplans = _icdemandschedule.GetListAsync(p=>p.factory_id.ToString() == domain && p.status.ToUpper() == "P" && p.tosechedqty > 0 && !p.IsDeleted).Result;
|
|
|
+ //获取已以生成交货单的交货计划
|
|
|
var alreadys = _srmpolistds.Select(p => p.domain == domain && demandplans.Select(m => m.Id).Contains(p.icdsid)).ToList();
|
|
|
- //过滤掉已生成交货单的交货计划
|
|
|
- demandplans = demandplans.Where(p => !alreadys.Select(m => m.icdsid).Contains(p.Id)).ToList();
|
|
|
+ if (alreadys.Any())
|
|
|
+ {
|
|
|
+ //交货计划存在已发布或者已关闭状态的交货单
|
|
|
+ List<long> yfbIds = alreadys.Where(p => p.status.ToUpper() == "P" || p.status.ToUpper() == "C").Select(p => p.icdsid).Distinct().ToList();
|
|
|
+ //交货计划生成过交货单,但都是未发布状态
|
|
|
+ var wfbDs = alreadys.Where(p => !yfbIds.Contains(p.icdsid)).ToList();
|
|
|
+ if (wfbDs.Any())
|
|
|
+ {
|
|
|
+ //删除未发布的交货单
|
|
|
+ _srmpolistds.Delete(wfbDs);
|
|
|
+ }
|
|
|
+ //过滤掉存在已发布或者已关闭交货单的交货计划
|
|
|
+ demandplans = demandplans.Where(p => !yfbIds.Contains(p.Id)).ToList();
|
|
|
+ }
|
|
|
if (!demandplans.Any())
|
|
|
{
|
|
|
Msg = "OK|没有需要生成的交货单";
|
|
|
@@ -6259,6 +6278,11 @@ namespace Business.Replenishment
|
|
|
List<srm_polist_ds> inserts = new List<srm_polist_ds>();
|
|
|
//当前交货计划转交货单数据
|
|
|
List<srm_polist_ds> curInserts = new List<srm_polist_ds>();
|
|
|
+ //交货单异常记录
|
|
|
+ List<DeliveryExceptionMaster> exceptions = new List<DeliveryExceptionMaster>();
|
|
|
+ DeliveryExceptionMaster info = new DeliveryExceptionMaster();
|
|
|
+ //操作时间
|
|
|
+ string optime = DateTime.Now.ToString("yyyyMMddHHmmss");
|
|
|
//采购明细剩余未交数量
|
|
|
decimal sumRestQty = 0m;
|
|
|
//交货单占用数量
|
|
|
@@ -6275,11 +6299,27 @@ namespace Business.Replenishment
|
|
|
//校验1:如果当前物料没有维护货源清单,则跳过
|
|
|
if (!curChaes.Any())
|
|
|
{
|
|
|
+ info = new DeliveryExceptionMaster();
|
|
|
+ info.Domain = domain;
|
|
|
+ info.Icdsid = item.Id;
|
|
|
+ info.ItemNum = item.itemnum;
|
|
|
+ info.CreateTime = DateTime.Now;
|
|
|
+ info.Remark = "物料[" + item.itemnum + "]没有维护货源清单,无法转交货单";
|
|
|
+ info.OptTime = optime;
|
|
|
+ exceptions.Add(info);
|
|
|
continue;
|
|
|
}
|
|
|
//校验2:如果当前物料对应货源清单的供应商配额之和不为100%,则跳过
|
|
|
if (curChaes.Sum(p => p.quota_rate.GetValueOrDefault()) != 100)
|
|
|
{
|
|
|
+ info = new DeliveryExceptionMaster();
|
|
|
+ info.Domain = domain;
|
|
|
+ info.Icdsid = item.Id;
|
|
|
+ info.ItemNum = item.itemnum;
|
|
|
+ info.CreateTime = DateTime.Now;
|
|
|
+ info.Remark = "物料[" + item.itemnum + "]的货源清单供应商配额之和不为100%,无法转交货单";
|
|
|
+ info.OptTime = optime;
|
|
|
+ exceptions.Add(info);
|
|
|
continue;
|
|
|
}
|
|
|
//获取当前交货计划物料对应的可用采购单明细数据
|
|
|
@@ -6287,6 +6327,14 @@ namespace Business.Replenishment
|
|
|
//校验3:如果当前物料没有可用的采购明细,则跳过
|
|
|
if (!curPurDtls.Any())
|
|
|
{
|
|
|
+ info = new DeliveryExceptionMaster();
|
|
|
+ info.Domain = domain;
|
|
|
+ info.Icdsid = item.Id;
|
|
|
+ info.ItemNum = item.itemnum;
|
|
|
+ info.CreateTime = DateTime.Now;
|
|
|
+ info.Remark = "物料[" + item.itemnum + "]没有可占用的采购明细,无法转交货单";
|
|
|
+ info.OptTime = optime;
|
|
|
+ exceptions.Add(info);
|
|
|
continue;
|
|
|
}
|
|
|
//当前采购明细对应的采购单
|
|
|
@@ -6306,6 +6354,14 @@ namespace Business.Replenishment
|
|
|
restQty = sumRestQty - sumDbOccupy - sumCurOccupy;
|
|
|
if (restQty < item.tosechedqty)
|
|
|
{
|
|
|
+ info = new DeliveryExceptionMaster();
|
|
|
+ info.Domain = domain;
|
|
|
+ info.Icdsid = item.Id;
|
|
|
+ info.ItemNum = item.itemnum;
|
|
|
+ info.CreateTime = DateTime.Now;
|
|
|
+ info.Remark = "物料[" + item.itemnum + "]的采购明细可用数量不足,无法转交货单";
|
|
|
+ info.OptTime = optime;
|
|
|
+ exceptions.Add(info);
|
|
|
continue;
|
|
|
}
|
|
|
//标志位
|
|
|
@@ -6340,6 +6396,15 @@ namespace Business.Replenishment
|
|
|
if (!pchPurMsts.Any())
|
|
|
{
|
|
|
//当前供应商没有可用采购单,则当前交货计划无法转交货单
|
|
|
+ info = new DeliveryExceptionMaster();
|
|
|
+ info.Domain = domain;
|
|
|
+ info.Icdsid = item.Id;
|
|
|
+ info.ItemNum = item.itemnum;
|
|
|
+ info.CreateTime = DateTime.Now;
|
|
|
+ info.Remark = "物料[" + item.itemnum + "]对应供应商["+ pch.supplier_name + "]没有可用采购明细,无法转交货单";
|
|
|
+ info.OptTime = optime;
|
|
|
+ exceptions.Add(info);
|
|
|
+
|
|
|
flag = true;
|
|
|
break;
|
|
|
}
|
|
|
@@ -6347,6 +6412,15 @@ namespace Business.Replenishment
|
|
|
if (!pchPurDtls.Any())
|
|
|
{
|
|
|
//当前供应商没有可用采购单明细,则当前交货计划无法转交货单
|
|
|
+ info = new DeliveryExceptionMaster();
|
|
|
+ info.Domain = domain;
|
|
|
+ info.Icdsid = item.Id;
|
|
|
+ info.ItemNum = item.itemnum;
|
|
|
+ info.CreateTime = DateTime.Now;
|
|
|
+ info.Remark = "物料[" + item.itemnum + "]对应供应商[" + pch.supplier_name + "]没有可用采购明细,无法转交货单";
|
|
|
+ info.OptTime = optime;
|
|
|
+ exceptions.Add(info);
|
|
|
+
|
|
|
flag = true;
|
|
|
break;
|
|
|
}
|
|
|
@@ -6362,6 +6436,15 @@ namespace Business.Replenishment
|
|
|
if (restQty < sumNeedQty)
|
|
|
{
|
|
|
//当前供应商可用采购单明细不足,则当前交货计划无法转交货单
|
|
|
+ info = new DeliveryExceptionMaster();
|
|
|
+ info.Domain = domain;
|
|
|
+ info.Icdsid = item.Id;
|
|
|
+ info.ItemNum = item.itemnum;
|
|
|
+ info.CreateTime = DateTime.Now;
|
|
|
+ info.Remark = "物料[" + item.itemnum + "]对应供应商[" + pch.supplier_name + "]采购明细可用数量不足,无法转交货单";
|
|
|
+ info.OptTime = optime;
|
|
|
+ exceptions.Add(info);
|
|
|
+
|
|
|
flag = true;
|
|
|
break;
|
|
|
}
|
|
|
@@ -6463,21 +6546,30 @@ namespace Business.Replenishment
|
|
|
{
|
|
|
inserts[i].dsnum = nbrlist[i].NbrResult;
|
|
|
}
|
|
|
- //数据插入
|
|
|
- using (var unitOfWork = _unitOfWorkManager.Begin(false, true))
|
|
|
+ }
|
|
|
+ //数据插入
|
|
|
+ using (var unitOfWork = _unitOfWorkManager.Begin(false, true))
|
|
|
+ {
|
|
|
+ try
|
|
|
{
|
|
|
- try
|
|
|
+ //插入交货单数据
|
|
|
+ if (inserts.Any())
|
|
|
{
|
|
|
_srmpolistds.Insert(inserts);
|
|
|
- await unitOfWork.CompleteAsync();
|
|
|
}
|
|
|
- catch (Exception e)
|
|
|
+ //插入异常记录
|
|
|
+ if (exceptions.Any())
|
|
|
{
|
|
|
- unitOfWork.Dispose();
|
|
|
- new NLogHelper("ReplenishmentAppService").WriteLog("CreateDeliverySchedule", "交货计划生成交货单失败:" + e.Message, _currentTenant.Id.ToString());
|
|
|
- Msg = "NO|交货单保存失败:" + e.Message;
|
|
|
- };
|
|
|
+ _DeliveryExceptionMaster.Insert(exceptions);
|
|
|
+ }
|
|
|
+ await unitOfWork.CompleteAsync();
|
|
|
}
|
|
|
+ catch (Exception e)
|
|
|
+ {
|
|
|
+ unitOfWork.Dispose();
|
|
|
+ new NLogHelper("ReplenishmentAppService").WriteLog("CreateDeliverySchedule", "交货计划生成交货单失败:" + e.Message, _currentTenant.Id.ToString());
|
|
|
+ Msg = "NO|交货单保存失败:" + e.Message;
|
|
|
+ };
|
|
|
}
|
|
|
return Msg;
|
|
|
}
|