|
|
@@ -128,6 +128,11 @@ namespace Business.SystemJobManagement
|
|
|
private IRepository<srm_po_main, long> _srm_po_main;
|
|
|
private IRepository<srm_po_list, long> _srm_po_list;
|
|
|
|
|
|
+ private IRepository<ic_item_stockoccupy, long> _ic_item_stockoccupy;
|
|
|
+ private ISqlRepository<NbrMaster> _nbrMaster;
|
|
|
+ private ISqlRepository<NbrDetail> _nbrDetail;
|
|
|
+ private readonly ISqlRepository<ASNBOLShipperDetail> _ASNBOLShipperDetail;
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// 生产排产
|
|
|
/// </summary>
|
|
|
@@ -164,6 +169,10 @@ namespace Business.SystemJobManagement
|
|
|
ISqlRepository<PurOrdDetail> purOrdDetail,
|
|
|
IRepository<srm_po_main, long> srm_po_main,
|
|
|
IRepository<srm_po_list, long> srm_po_list,
|
|
|
+ ISqlRepository<NbrMaster> nbrMaster,
|
|
|
+ ISqlRepository<NbrDetail> nbrDetail,
|
|
|
+ IRepository<ic_item_stockoccupy, long> ic_item_stockoccupy,
|
|
|
+ ISqlRepository<ASNBOLShipperDetail> ASNBOLShipperDetail,
|
|
|
BusinessDbContext businessDbContext
|
|
|
)
|
|
|
{
|
|
|
@@ -199,6 +208,10 @@ namespace Business.SystemJobManagement
|
|
|
_purOrdDetail = purOrdDetail;
|
|
|
_srm_po_main = srm_po_main;
|
|
|
_srm_po_list = srm_po_list;
|
|
|
+ _nbrMaster = nbrMaster;
|
|
|
+ _nbrDetail = nbrDetail;
|
|
|
+ _ic_item_stockoccupy = ic_item_stockoccupy;
|
|
|
+ _ASNBOLShipperDetail = ASNBOLShipperDetail;
|
|
|
}
|
|
|
|
|
|
public string SyncWMSDataToMySQLJob()
|
|
|
@@ -1181,5 +1194,99 @@ namespace Business.SystemJobManagement
|
|
|
}
|
|
|
return poStatu;
|
|
|
}
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 同步清除库存占用记录(工单针对原材料,销售订单针对成品库存占用)
|
|
|
+ /// </summary>
|
|
|
+ /// <returns></returns>
|
|
|
+ public async Task<string> SyncItemStockOccupyClear()
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ IConfiguration configuration = new ConfigurationBuilder().AddJsonFile("appsettings.json", optional: true, reloadOnChange: true).Build();
|
|
|
+ string domain = configuration.GetConnectionString("Factory_id");
|
|
|
+ string companyid = configuration.GetConnectionString("Company_id");
|
|
|
+ if (string.IsNullOrEmpty(domain) || string.IsNullOrEmpty(companyid))
|
|
|
+ {
|
|
|
+ return "请检查配置文件中公司和工厂编码是否维护。";
|
|
|
+ }
|
|
|
+ DateTime start = DateTime.Now.Date.AddDays(-1);
|
|
|
+
|
|
|
+ //销售订单取过去两天和当天的记录,已发出的数据,进行清理库存占用表记录
|
|
|
+ var ASNBOLdtls = _ASNBOLShipperDetail.Select(x => x.Domain == domain && x.IsActive && x.shtype == "SH" && x.Typed != "S" && x.RealQty > 0 && x.UpdateTime >= start).ToList();
|
|
|
+ var ordnbr = ASNBOLdtls.Select(x => x.OrdNbr).ToList();
|
|
|
+ var alldtls = ASNBOLdtls.Where(x => ordnbr.Contains(x.OrdNbr)).ToList();
|
|
|
+
|
|
|
+ List<ic_item_stockoccupy> dellist = new List<ic_item_stockoccupy>();
|
|
|
+ List<ic_item_stockoccupy> updtelist = new List<ic_item_stockoccupy>();
|
|
|
+
|
|
|
+ var seorderentrys = _mysql_crm_seorderentry.GetListAsync(x => x.factory_id.ToString() == domain && ordnbr.Contains(x.bill_no)).Result;
|
|
|
+ var occupys = _ic_item_stockoccupy.GetListAsync(x => x.factory_id.ToString() == domain && seorderentrys.Select(c => c.Id).Contains(x.orderentry_id.GetValueOrDefault())).Result;
|
|
|
+ foreach (var se in seorderentrys)
|
|
|
+ {
|
|
|
+ var seASNBOLdtl = alldtls.Where(x => x.OrdNbr == se.bill_no && x.ContainerItem == se.item_number).ToList();
|
|
|
+ if (seASNBOLdtl.Any())
|
|
|
+ {
|
|
|
+ var oup = occupys.Find(x => x.icitem_number == se.item_number);
|
|
|
+ if (oup != null)
|
|
|
+ {
|
|
|
+ //先按订单数量更新占用数量,然后通过占用数量-发货数量,计算更新占用数量。
|
|
|
+ oup.quantity = se.qty.GetValueOrDefault();
|
|
|
+ decimal cale = oup.quantity - seASNBOLdtl.Sum(x => x.QtyToShip.GetValueOrDefault());
|
|
|
+ if (cale > 0)
|
|
|
+ {
|
|
|
+ oup.quantity = cale;
|
|
|
+ updtelist.Add(oup);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ dellist.Add(oup);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //工单按领料单已出库完成记录,清理掉库存占用记录
|
|
|
+ List<NbrMaster> nbrlist = _nbrMaster.Select(x => x.Domain == domain && x.Type.ToUpper() == "SM" && x.UpdateTime >= start).ToList();
|
|
|
+
|
|
|
+ var workords = nbrlist.Select(x => x.WorkOrd).Distinct();
|
|
|
+ var occupy = _ic_item_stockoccupy.GetListAsync(x => workords.Contains(x.morder_mo)).Result;
|
|
|
+ var nbrDtls = _nbrDetail.Select(x => x.Domain == domain && nbrlist.Select(c => c.RecID).Contains(x.NbrRecID)).ToList();
|
|
|
+ foreach (var nbr in nbrlist)
|
|
|
+ {
|
|
|
+ var dtls = nbrDtls.Where(x => x.NbrRecID == nbr.RecID).ToList();
|
|
|
+ foreach (var dtl in dtls)
|
|
|
+ {
|
|
|
+ var occ = occupy.Find(x => x.icitem_number == dtl.ItemNum);
|
|
|
+ if (occ != null)
|
|
|
+ {
|
|
|
+ occ.quantity = dtl.QtyOrd.GetValueOrDefault();
|
|
|
+ decimal differ = occ.quantity - dtl.QtyFrom.GetValueOrDefault();
|
|
|
+ if (differ > 0)
|
|
|
+ {
|
|
|
+ occ.quantity = differ;
|
|
|
+ updtelist.Add(occ);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ dellist.Add(occ);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (updtelist.Any())
|
|
|
+ {
|
|
|
+ _businessDbContext.BulkUpdate(updtelist);
|
|
|
+ }
|
|
|
+ if (dellist.Any())
|
|
|
+ {
|
|
|
+ await _ic_item_stockoccupy.HardDeleteAsync(dellist);
|
|
|
+ }
|
|
|
+ return "ok";
|
|
|
+ }
|
|
|
+ catch (Exception ex)
|
|
|
+ {
|
|
|
+ return ex.Message;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|