Explorar el Código

库存占用记录释放。

tangdi hace 2 años
padre
commit
29b03be58e

+ 2 - 0
MicroServices/Business/Business.Application.Contracts/SystemJob/ISystemJobAppService.cs

@@ -45,6 +45,8 @@ namespace Business.SystemJob
 
         string DoProductScheduleJob();
 
+        Task<string> SyncItemStockOccupyClear();
+
         string TestTimeOut();
     }
 }

+ 1 - 1
MicroServices/Business/Business.Application/ReplenishmentManagement/ReplenishmentAppService.cs

@@ -1055,7 +1055,7 @@ namespace Business.Replenishment
             var dateEnd = DateTime.Now;
             //获取瑞奇发往国科海王的记录
             var gkhwList = _ASNBOLShipperMaster.Select(a => a.Domain == input.factory_id.ToString() && (a.SoldTo == "10002080" || a.SoldTo == "10001981"));
-            var recidList = gkhwList.Select(a => a.RecID).ToList();
+            var recidList = gkhwList.Select(a => Convert.ToInt64(a.RecID)).ToList();
             //获取瑞奇发货记录
             var shipList = _ASNBOLShipperDetail.Select(a => a.Domain == input.factory_id.ToString() && a.IsActive && a.shtype == "SH" && a.Typed != "S" && a.RealQty > 0
             && itemList.Contains(a.ContainerItem) && a.ShipDate >= dateBegin && a.ShipDate <= dateEnd && !recidList.Contains(a.ASNBOLShipperRecID));//瑞奇只算瑞奇排除国科海王

+ 2 - 3
MicroServices/Business/Business.Application/ResourceExamineManagement/ResourceExamineAppService.cs

@@ -1727,7 +1727,7 @@ namespace Business.ResourceExamineManagement
                 }
             }
             
-            List<mo_ic_item_stockoccupy> item_stockoccupy = await _ic_item_stockoccupy.GetListAsync(s => seIds.Contains(s.orderentry_id.Value) && bangidList.Contains(s.bang_id));
+            List<mo_ic_item_stockoccupy> item_stockoccupy = await _ic_item_stockoccupy.GetListAsync(s => seIds.Contains(s.orderentry_id.GetValueOrDefault()) && bangidList.Contains(s.bang_id));
 
             using (var unitOfWork = _unitOfWorkManager.Begin(false, true))
             {
@@ -2702,7 +2702,6 @@ namespace Business.ResourceExamineManagement
                 }
                 if (checkMo.Any())
                 {
-
                     var rtn = await OrderKittingCheck(checkMo);
                     if (rtn != null && rtn.examines != null)
                     {
@@ -3883,7 +3882,7 @@ namespace Business.ResourceExamineManagement
             };
             nbrMasterList.Add(newNbr);
             List<string> headAccount = new List<string>();
-            int i = 1;
+            short i = 1;
             bool typed = !string.IsNullOrEmpty(workord.Typed);
             detail.ForEach(a =>
             {

+ 107 - 0
MicroServices/Business/Business.Application/SystemJobManagement/SystemJobAppService.cs

@@ -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;
+            }
+        }
     }
 }

+ 6 - 1
MicroServices/Business/Business.Domain/StructuredDB/MES/IC/ASNBOLShipperDetail.cs

@@ -70,6 +70,11 @@ namespace Business.Domain
         [Comment("物料编码")]
         public string ContainerItem { get; set; }
 
+        /// <summary>
+        /// OrdNbr
+        /// </summary>
+        [Comment("OrdNbr")]
+        public string OrdNbr { get; set; }
 
         /// <summary>
         /// 行号
@@ -100,7 +105,7 @@ namespace Business.Domain
         /// 主表ID
         /// </summary>
         [Comment("主表ID")]
-        public int ASNBOLShipperRecID { get; set; }
+        public long ASNBOLShipperRecID { get; set; }
 
         /// <summary>
         /// 创建时间

+ 1 - 1
MicroServices/Business/Business.Domain/StructuredDB/MES/IC/NbrDetail.cs

@@ -90,7 +90,7 @@ namespace Business.Domain
         /// 行号
         /// </summary>
         [Comment("行号")]
-        public int Line { get; set; }
+        public short Line { get; set; }
 
         /// <summary>
         /// 主表主键

+ 11 - 0
MicroServices/Business/Business.HttpApi/Controllers/SystemJobController.cs

@@ -76,6 +76,17 @@ namespace Business.Controllers
             return _SystemJobAppService.DoProductScheduleJob();
         }
 
+        /// <summary>
+        /// 定时同步WMS物料订单等基础数据到MySQL
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        [Route("SyncItemStockOccupyClear")]
+        public Task<string> SyncItemStockOccupyClear()
+        {
+            return _SystemJobAppService.SyncItemStockOccupyClear();
+        }
+
         /// <summary>
         /// 测试接口超时
         /// </summary>