Просмотр исходного кода

生成交货单添加异常记录

heteng 2 лет назад
Родитель
Сommit
5f28c846e7

+ 106 - 14
MicroServices/Business/Business.Application/ReplenishmentManagement/ReplenishmentAppService.cs

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

+ 60 - 0
MicroServices/Business/Business.Domain/StructuredDB/Production/DeliveryExceptionMaster.cs

@@ -0,0 +1,60 @@
+using Microsoft.EntityFrameworkCore;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Business.StructuredDB.Production
+{
+    /// <summary>
+    /// 交货单异常记录表
+    /// </summary>
+    [Comment("交货单异常记录表")]
+    public class DeliveryExceptionMaster
+    {
+        /// <summary>
+        /// 主键
+        /// </summary>
+        [Comment("主键")]
+        [Key]
+        public long RecID { get; set; }
+
+        /// <summary>
+        /// 工厂编码
+        /// </summary>
+        [Comment("工厂编码")]
+        public string Domain { get; set; }
+
+        /// <summary>
+        /// 交货计划ID
+        /// </summary>
+        [Comment("交货计划ID")]
+        public long Icdsid { get; set; }
+
+        /// <summary>
+        /// 物料编码
+        /// </summary>
+        [Comment("物料编码")]
+        public string ItemNum { get; set; }
+
+        /// <summary>
+        /// 创建时间
+        /// </summary>
+        [Comment("创建时间")]
+        public DateTime CreateTime { get; set; }
+
+        /// <summary>
+        /// 异常原因
+        /// </summary>
+        [Comment("异常原因")]
+        public string Remark { get; set; }
+
+        /// <summary>
+        /// 操作时间
+        /// </summary>
+        [Comment("操作时间")]
+        public string OptTime { get; set; }
+    }
+}

+ 5 - 0
MicroServices/Business/Business.EntityFrameworkCore/EntityFrameworkCore/DOP/BusinessDbContext.cs

@@ -38,6 +38,11 @@ namespace Business.EntityFrameworkCore
         /// </summary>
         public DbSet<srm_polist_ds> srm_polist_ds { get; set; }
 
+        /// <summary>
+        /// ½»»õµ¥Òì³£¼Ç¼
+        /// </summary>
+        public DbSet<DeliveryExceptionMaster> DeliveryExceptionMaster { get; set; }
+
         #endregion
         #region MES
         public DbSet<mes_producedailyplan> mes_Producedailyplans { get; set; }