|
@@ -13,6 +13,8 @@ using Business.StructuredDB.Production;
|
|
|
using Business.StructuredDB.Replenishment;
|
|
using Business.StructuredDB.Replenishment;
|
|
|
using Business.StructuredDB.SaleFcst;
|
|
using Business.StructuredDB.SaleFcst;
|
|
|
using Business.StructuredDB.WMS;
|
|
using Business.StructuredDB.WMS;
|
|
|
|
|
+using Business.SystemJob;
|
|
|
|
|
+using Business.SystemJobManagement;
|
|
|
using EFCore.BulkExtensions;
|
|
using EFCore.BulkExtensions;
|
|
|
using Microsoft.EntityFrameworkCore;
|
|
using Microsoft.EntityFrameworkCore;
|
|
|
using MongoDB.Driver;
|
|
using MongoDB.Driver;
|
|
@@ -254,6 +256,7 @@ namespace Business.Replenishment
|
|
|
private readonly BusinessDbContext _businessDbContext;
|
|
private readonly BusinessDbContext _businessDbContext;
|
|
|
private readonly ICurrentTenant _currentTenant;
|
|
private readonly ICurrentTenant _currentTenant;
|
|
|
private readonly IUnitOfWorkManager _unitOfWorkManager;
|
|
private readonly IUnitOfWorkManager _unitOfWorkManager;
|
|
|
|
|
+ private readonly SystemJobAppService _systemJobAppService;
|
|
|
#endregion
|
|
#endregion
|
|
|
|
|
|
|
|
#region 构造函数
|
|
#region 构造函数
|
|
@@ -355,7 +358,8 @@ namespace Business.Replenishment
|
|
|
ISqlRepository<PurOrdMaster> PurOrdMaster,
|
|
ISqlRepository<PurOrdMaster> PurOrdMaster,
|
|
|
ISqlRepository<DeliveryExceptionMaster> DeliveryExceptionMaster,
|
|
ISqlRepository<DeliveryExceptionMaster> DeliveryExceptionMaster,
|
|
|
ISqlRepository<scm_shdzb> scm_shdzb,
|
|
ISqlRepository<scm_shdzb> scm_shdzb,
|
|
|
- IUnitOfWorkManager unitOfWorkManager)
|
|
|
|
|
|
|
+ IUnitOfWorkManager unitOfWorkManager,
|
|
|
|
|
+ SystemJobAppService systemJobAppService)
|
|
|
{
|
|
{
|
|
|
_replenishmentROPWeekPlan = replenishmentROPWeekPlan;
|
|
_replenishmentROPWeekPlan = replenishmentROPWeekPlan;
|
|
|
_ASNBOLShipperDetail = ASNBOLShipperDetail;
|
|
_ASNBOLShipperDetail = ASNBOLShipperDetail;
|
|
@@ -454,6 +458,7 @@ namespace Business.Replenishment
|
|
|
_PurOrdMaster = PurOrdMaster;
|
|
_PurOrdMaster = PurOrdMaster;
|
|
|
_DeliveryExceptionMaster = DeliveryExceptionMaster;
|
|
_DeliveryExceptionMaster = DeliveryExceptionMaster;
|
|
|
_scm_shdzb = scm_shdzb;
|
|
_scm_shdzb = scm_shdzb;
|
|
|
|
|
+ _systemJobAppService = systemJobAppService;
|
|
|
}
|
|
}
|
|
|
#endregion
|
|
#endregion
|
|
|
|
|
|
|
@@ -3262,7 +3267,7 @@ namespace Business.Replenishment
|
|
|
; List<mes_morder> moList = new List<mes_morder>();
|
|
; List<mes_morder> moList = new List<mes_morder>();
|
|
|
List<mes_moentry> moentryList = new List<mes_moentry>();
|
|
List<mes_moentry> moentryList = new List<mes_moentry>();
|
|
|
var morder_noList = _serialNumberAppService.GetBillNo(input.factory_id.ToString(), "M5", weekplans.Count, "", 1);
|
|
var morder_noList = _serialNumberAppService.GetBillNo(input.factory_id.ToString(), "M5", weekplans.Count, "", 1);
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
foreach (var item in weekplans)
|
|
foreach (var item in weekplans)
|
|
|
{
|
|
{
|
|
|
mes_morder mes_Morder = new mes_morder();
|
|
mes_morder mes_Morder = new mes_morder();
|
|
@@ -3357,8 +3362,8 @@ namespace Business.Replenishment
|
|
|
_businessDbContext.BulkInsert(workOrdDetails);
|
|
_businessDbContext.BulkInsert(workOrdDetails);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- //2024/01/10:卫亮工单需求对齐采购需求,取所有未下达的工单做资源检查
|
|
|
|
|
- var moListCheck=_mysql_mes_morder.GetListAsync(a=>(a.morder_state==MorderEnum.Initial_state|| string.IsNullOrEmpty(a.morder_state)) && a.factory_id == input.factory_id).Result;
|
|
|
|
|
|
|
+ //2024/01/10:卫亮工单需求对齐采购需求,取所有未下达的工单做资源检查(排除年度中间件工单)
|
|
|
|
|
+ var moListCheck=_mysql_mes_morder.GetListAsync(a=>(a.morder_state==MorderEnum.Initial_state|| string.IsNullOrEmpty(a.morder_state)) && a.factory_id == input.factory_id && string.IsNullOrEmpty(a.analogcalcversion)).Result;
|
|
|
var moEntryListCheck = _mysql_mes_moentry.GetListAsync(a => moListCheck.Select(b=>b.morder_no).ToList().Contains(a.moentry_mono) && a.factory_id == input.factory_id).Result;
|
|
var moEntryListCheck = _mysql_mes_moentry.GetListAsync(a => moListCheck.Select(b=>b.morder_no).ToList().Contains(a.moentry_mono) && a.factory_id == input.factory_id).Result;
|
|
|
|
|
|
|
|
await PlanOrderResourceCheck(moListCheck.OrderBy(a => a.moentry_sys_stime).ToList(), moEntryListCheck, bang_id, "",false,true);
|
|
await PlanOrderResourceCheck(moListCheck.OrderBy(a => a.moentry_sys_stime).ToList(), moEntryListCheck, bang_id, "",false,true);
|
|
@@ -3377,23 +3382,26 @@ namespace Business.Replenishment
|
|
|
var HeatSealing = routingOp.Where(x => x.Ufld1 == "热封" && x.MilestoneOp).FirstOrDefault();
|
|
var HeatSealing = routingOp.Where(x => x.Ufld1 == "热封" && x.MilestoneOp).FirstOrDefault();
|
|
|
//包装标准工时
|
|
//包装标准工时
|
|
|
var Packaging = routingOp.Where(x => x.Descr == "包装" && x.MilestoneOp).FirstOrDefault();
|
|
var Packaging = routingOp.Where(x => x.Descr == "包装" && x.MilestoneOp).FirstOrDefault();
|
|
|
- if (moItem != null && moItem.kitting_times < a.PlanStartDate)
|
|
|
|
|
- {
|
|
|
|
|
- a.ItemStatus = "齐套";
|
|
|
|
|
- a.PlanKittingDate = moItem.kitting_times;
|
|
|
|
|
- a.AssembleHours = Assembly == null ? 0 : Assembly.RunTime * a.Qty;
|
|
|
|
|
- a.HeatSealHours = HeatSealing == null ? 0 : HeatSealing.RunTime * a.Qty;
|
|
|
|
|
- a.PackageHours = Packaging == null ? 0 : Packaging.RunTime * a.Qty;
|
|
|
|
|
- a.TotalHours = a.AssembleHours + a.HeatSealHours + a.PackageHours;
|
|
|
|
|
- }
|
|
|
|
|
- else
|
|
|
|
|
|
|
+ if (moItem != null)
|
|
|
{
|
|
{
|
|
|
- a.ItemStatus = "欠料";
|
|
|
|
|
- a.PlanKittingDate = moItem.kitting_times;
|
|
|
|
|
- a.AssembleHours = Assembly == null ? 0 : Assembly.RunTime * a.Qty;
|
|
|
|
|
- a.HeatSealHours = HeatSealing == null ? 0 : HeatSealing.RunTime * a.Qty;
|
|
|
|
|
- a.PackageHours = Packaging == null ? 0 : Packaging.RunTime * a.Qty;
|
|
|
|
|
- a.TotalHours = a.AssembleHours + a.HeatSealHours + a.PackageHours;
|
|
|
|
|
|
|
+ if (moItem.kitting_times < a.PlanStartDate)
|
|
|
|
|
+ {
|
|
|
|
|
+ a.ItemStatus = "齐套";
|
|
|
|
|
+ a.PlanKittingDate = moItem.kitting_times;
|
|
|
|
|
+ a.AssembleHours = Assembly == null ? 0 : Assembly.RunTime * a.Qty;
|
|
|
|
|
+ a.HeatSealHours = HeatSealing == null ? 0 : HeatSealing.RunTime * a.Qty;
|
|
|
|
|
+ a.PackageHours = Packaging == null ? 0 : Packaging.RunTime * a.Qty;
|
|
|
|
|
+ a.TotalHours = a.AssembleHours + a.HeatSealHours + a.PackageHours;
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ a.ItemStatus = "欠料";
|
|
|
|
|
+ a.PlanKittingDate = moItem.kitting_times;
|
|
|
|
|
+ a.AssembleHours = Assembly == null ? 0 : Assembly.RunTime * a.Qty;
|
|
|
|
|
+ a.HeatSealHours = HeatSealing == null ? 0 : HeatSealing.RunTime * a.Qty;
|
|
|
|
|
+ a.PackageHours = Packaging == null ? 0 : Packaging.RunTime * a.Qty;
|
|
|
|
|
+ a.TotalHours = a.AssembleHours + a.HeatSealHours + a.PackageHours;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
});
|
|
});
|
|
|
await _businessDbContext.BulkUpdateAsync(weekplanList);
|
|
await _businessDbContext.BulkUpdateAsync(weekplanList);
|
|
@@ -4839,7 +4847,7 @@ namespace Business.Replenishment
|
|
|
}
|
|
}
|
|
|
var pretreatList = pretreatments.Select(x => x.item_number).Distinct().ToList();
|
|
var pretreatList = pretreatments.Select(x => x.item_number).Distinct().ToList();
|
|
|
itemNums.AddRange(pretreatList);
|
|
itemNums.AddRange(pretreatList);
|
|
|
- AsyncItemStockFromWMS(itemNums, analogCalcVersion);
|
|
|
|
|
|
|
+ await AsyncItemStockFromWMS(itemNums, analogCalcVersion);
|
|
|
|
|
|
|
|
//数据库快照-同步mysql库数据到mongoDB中
|
|
//数据库快照-同步mysql库数据到mongoDB中
|
|
|
await DbSnapShot(input.company_id, input.factoryId, bangid, pretreatments, analogCalcVersion);
|
|
await DbSnapShot(input.company_id, input.factoryId, bangid, pretreatments, analogCalcVersion);
|
|
@@ -4877,9 +4885,24 @@ namespace Business.Replenishment
|
|
|
dtl.need_qty = item.need_number.GetValueOrDefault();
|
|
dtl.need_qty = item.need_number.GetValueOrDefault();
|
|
|
|
|
|
|
|
//获取当前物料bom数据
|
|
//获取当前物料bom数据
|
|
|
- var childBom = boms.Where(p => p.bom_number == item.bom_number).FirstOrDefault();
|
|
|
|
|
|
|
+ //var childBom = boms.Where(p => p.bom_number == item.bom_number).FirstOrDefault();
|
|
|
|
|
|
|
|
- var itemPrelist = pretreatments.Where(s => s.sourceid == childBom.mysql_id).ToList();
|
|
|
|
|
|
|
+ //获取当前物料bom数据
|
|
|
|
|
+ List<b_bom_pretreatment> itemPrelist = new List<b_bom_pretreatment>();
|
|
|
|
|
+ //通过工单ID读取,考虑特殊工单的预处理
|
|
|
|
|
+ itemPrelist = pretreatments.Where(s => s.sourceid == item.Id).ToList();
|
|
|
|
|
+ if (!itemPrelist.Any())
|
|
|
|
|
+ {
|
|
|
|
|
+ var childBom = boms.Where(p => p.bom_number == item.bom_number).FirstOrDefault();
|
|
|
|
|
+ if (childBom != null)
|
|
|
|
|
+ {
|
|
|
|
|
+ itemPrelist = pretreatments.Where(s => s.sourceid == childBom.mysql_id).ToList();
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
if (!itemPrelist.Any())
|
|
if (!itemPrelist.Any())
|
|
|
{
|
|
{
|
|
|
continue;
|
|
continue;
|
|
@@ -4902,7 +4925,7 @@ namespace Business.Replenishment
|
|
|
_CalcBomViewAppService.CalcView(getBomList, bangid, item.need_number.GetValueOrDefault(), item.moentry_sys_stime, sklist, sentry, icitemlist);
|
|
_CalcBomViewAppService.CalcView(getBomList, bangid, item.need_number.GetValueOrDefault(), item.moentry_sys_stime, sklist, sentry, icitemlist);
|
|
|
|
|
|
|
|
//TODO:最晚开始时间
|
|
//TODO:最晚开始时间
|
|
|
- var curFacDtl = leadTimeList.FirstOrDefault(p => p.item_id == childBom.icitem_id);
|
|
|
|
|
|
|
+ //var curFacDtl = leadTimeList.FirstOrDefault(p => p.item_id == childBom.icitem_id);
|
|
|
//物料齐套时间
|
|
//物料齐套时间
|
|
|
dtl.kitting_times = getBomList.Where(p => p.is_use && p.kitting_time != null).OrderByDescending(m => m.kitting_time).First().kitting_time.GetValueOrDefault();
|
|
dtl.kitting_times = getBomList.Where(p => p.is_use && p.kitting_time != null).OrderByDescending(m => m.kitting_time).First().kitting_time.GetValueOrDefault();
|
|
|
//替代关系展开list
|
|
//替代关系展开list
|
|
@@ -6027,66 +6050,67 @@ namespace Business.Replenishment
|
|
|
/// </summary>
|
|
/// </summary>
|
|
|
public void AutoCreateBomBill(string companyid, List<mo_ic_bom> ic_Boms = null)
|
|
public void AutoCreateBomBill(string companyid, List<mo_ic_bom> ic_Boms = null)
|
|
|
{
|
|
{
|
|
|
- bool flag = false;
|
|
|
|
|
- if (ic_Boms == null)
|
|
|
|
|
- {
|
|
|
|
|
- flag = true;
|
|
|
|
|
- ic_Boms = _ic_bom.GetListAsync(p => p.company_id.ToString() == companyid && !p.IsDeleted).Result.ToList();
|
|
|
|
|
- }
|
|
|
|
|
- var pretreatment = _mysql_b_bom_pretreatment.GetListAsync(s => ic_Boms.Select(c => c.mysql_id).ToList().Contains(s.sourceid)).Result;
|
|
|
|
|
-
|
|
|
|
|
- param.company_id = long.Parse(companyid);
|
|
|
|
|
-
|
|
|
|
|
- //物料bom
|
|
|
|
|
- List<mo_ic_bom> bomlist = new List<mo_ic_bom>();
|
|
|
|
|
- List<mo_ic_bom_child> bomchildlist = new List<mo_ic_bom_child>();
|
|
|
|
|
- //物料信息
|
|
|
|
|
- List<mo_ic_item> icitemlist = new List<mo_ic_item>();
|
|
|
|
|
- //替代关系
|
|
|
|
|
- List<mo_ic_substitute> sublist = new List<mo_ic_substitute>();
|
|
|
|
|
- List<mo_ic_substitute_group> suballlist = new List<mo_ic_substitute_group>();
|
|
|
|
|
- List<mo_ic_substitute_group_detail> subdtllist = new List<mo_ic_substitute_group_detail>();
|
|
|
|
|
- IcItemPretreatment(flag, ic_Boms, bomlist, bomchildlist, icitemlist, sublist, suballlist, subdtllist);
|
|
|
|
|
-
|
|
|
|
|
- List<b_bom_pretreatment> deleteList = new List<b_bom_pretreatment>();
|
|
|
|
|
- List<b_bom_pretreatment> addList = new List<b_bom_pretreatment>();
|
|
|
|
|
- foreach (var bom in ic_Boms)
|
|
|
|
|
|
|
+ try
|
|
|
{
|
|
{
|
|
|
- /*var pret = pretreatment.Find(s => s.sourceid == bom.mysql_id && s.bom_id == bom.mysql_id);
|
|
|
|
|
- if (pret != null)
|
|
|
|
|
|
|
+ bool flag = false;
|
|
|
|
|
+ if (ic_Boms == null)
|
|
|
{
|
|
{
|
|
|
- if (pret.version == bom.version)
|
|
|
|
|
|
|
+ flag = true;
|
|
|
|
|
+ ic_Boms = _ic_bom.GetListAsync(p => p.company_id.ToString() == companyid && !p.IsDeleted).Result.ToList();
|
|
|
|
|
+ }
|
|
|
|
|
+ var pretreatment = _mysql_b_bom_pretreatment.GetListAsync(s => ic_Boms.Select(c => c.mysql_id).ToList().Contains(s.sourceid)).Result;
|
|
|
|
|
+
|
|
|
|
|
+ param.company_id = long.Parse(companyid);
|
|
|
|
|
+
|
|
|
|
|
+ //物料bom
|
|
|
|
|
+ List<mo_ic_bom> bomlist = new List<mo_ic_bom>();
|
|
|
|
|
+ List<mo_ic_bom_child> bomchildlist = new List<mo_ic_bom_child>();
|
|
|
|
|
+ //物料信息
|
|
|
|
|
+ List<mo_ic_item> icitemlist = new List<mo_ic_item>();
|
|
|
|
|
+ //替代关系
|
|
|
|
|
+ List<mo_ic_substitute> sublist = new List<mo_ic_substitute>();
|
|
|
|
|
+ List<mo_ic_substitute_group> suballlist = new List<mo_ic_substitute_group>();
|
|
|
|
|
+ List<mo_ic_substitute_group_detail> subdtllist = new List<mo_ic_substitute_group_detail>();
|
|
|
|
|
+ IcItemPretreatment(flag, ic_Boms, bomlist, bomchildlist, icitemlist, sublist, suballlist, subdtllist);
|
|
|
|
|
+
|
|
|
|
|
+ List<b_bom_pretreatment> deleteList = new List<b_bom_pretreatment>();
|
|
|
|
|
+ List<b_bom_pretreatment> addList = new List<b_bom_pretreatment>();
|
|
|
|
|
+ foreach (var bom in ic_Boms)
|
|
|
|
|
+ {
|
|
|
|
|
+ var pret = pretreatment.Where(s => s.sourceid == bom.mysql_id).ToList();
|
|
|
|
|
+ if (pret.Any())
|
|
|
{
|
|
{
|
|
|
- //如果存在,且版本相同,则不需要处理
|
|
|
|
|
- continue;
|
|
|
|
|
|
|
+ //版本不同则重新生成
|
|
|
|
|
+ deleteList.AddRange(pret);
|
|
|
}
|
|
}
|
|
|
- //版本不同则重新生成
|
|
|
|
|
- deleteList.Add(pret);
|
|
|
|
|
- }*/
|
|
|
|
|
- deleteList.AddRange(pretreatment);
|
|
|
|
|
- //bom层级组装
|
|
|
|
|
- var getBomList = _pretreatmentAppService.BomPretreatment(bom.mysql_id, bomlist, bomchildlist, icitemlist);
|
|
|
|
|
- //bom替代关系组装
|
|
|
|
|
- _pretreatmentAppService.BomSubstitute(getBomList, bomlist, bomchildlist, icitemlist, sublist, suballlist, subdtllist);
|
|
|
|
|
-
|
|
|
|
|
- //GenerateSort(getBomList);
|
|
|
|
|
- var list = ObjectMapper.Map<List<BomChildExamineDto>, List<b_bom_pretreatment>>(getBomList);
|
|
|
|
|
- list.ForEach(s =>
|
|
|
|
|
- {
|
|
|
|
|
- s.sourceid = bom.mysql_id;
|
|
|
|
|
- s.company_id = bom.company_id;
|
|
|
|
|
- s.tenant_id = bom.tenant_id;
|
|
|
|
|
- s.factory_id = bom.factory_id;
|
|
|
|
|
- });
|
|
|
|
|
- addList.AddRange(list);
|
|
|
|
|
- }
|
|
|
|
|
- if (deleteList.Any())
|
|
|
|
|
- {
|
|
|
|
|
- _businessDbContext.BulkDelete(deleteList);
|
|
|
|
|
|
|
+ //bom层级组装
|
|
|
|
|
+ var getBomList = _pretreatmentAppService.BomPretreatment(bom.mysql_id, bomlist, bomchildlist, icitemlist);
|
|
|
|
|
+ //bom替代关系组装
|
|
|
|
|
+ _pretreatmentAppService.BomSubstitute(getBomList, bomlist, bomchildlist, icitemlist, sublist, suballlist, subdtllist);
|
|
|
|
|
+
|
|
|
|
|
+ //GenerateSort(getBomList);
|
|
|
|
|
+ var list = ObjectMapper.Map<List<BomChildExamineDto>, List<b_bom_pretreatment>>(getBomList);
|
|
|
|
|
+ list.ForEach(s =>
|
|
|
|
|
+ {
|
|
|
|
|
+ s.sourceid = bom.mysql_id;
|
|
|
|
|
+ s.company_id = bom.company_id;
|
|
|
|
|
+ s.tenant_id = bom.tenant_id;
|
|
|
|
|
+ s.factory_id = bom.factory_id;
|
|
|
|
|
+ });
|
|
|
|
|
+ addList.AddRange(list);
|
|
|
|
|
+ }
|
|
|
|
|
+ if (deleteList.Any())
|
|
|
|
|
+ {
|
|
|
|
|
+ _businessDbContext.BulkDelete(deleteList);
|
|
|
|
|
+ }
|
|
|
|
|
+ if (addList.Any())
|
|
|
|
|
+ {
|
|
|
|
|
+ _businessDbContext.BulkInsert(addList);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
- if (addList.Any())
|
|
|
|
|
|
|
+ catch (Exception e)
|
|
|
{
|
|
{
|
|
|
- _businessDbContext.BulkInsert(addList);
|
|
|
|
|
|
|
+ new NLogHelper("ResourceExamineAppService").WriteLog("AutoCreateBomBill", "自动生成BOM预处理清单:" + e.Message, _currentTenant.Id.ToString());
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -6577,8 +6601,10 @@ namespace Business.Replenishment
|
|
|
return result;
|
|
return result;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- public void AsyncItemStockFromWMS(List<string> itemList,string analogCalcVersion)
|
|
|
|
|
|
|
+ public async Task AsyncItemStockFromWMS(List<string> itemList,string analogCalcVersion)
|
|
|
{
|
|
{
|
|
|
|
|
+ //释放库存占用记录
|
|
|
|
|
+ await _systemJobAppService.SyncItemStockOccupyClear();
|
|
|
//产品编码
|
|
//产品编码
|
|
|
//var itemList = bom_Pretreatments.Select(a => a.item_number).Distinct().ToList();
|
|
//var itemList = bom_Pretreatments.Select(a => a.item_number).Distinct().ToList();
|
|
|
List<string> itemChildList = new List<string>();
|
|
List<string> itemChildList = new List<string>();
|