ソースを参照

Merge branch 'dev' of http://123.60.180.165:4647/ZZYDOP/DOPCore into dev

tangdi 2 年 前
コミット
67667adaab

+ 26 - 170
MicroServices/Business/Business.Application/ReplenishmentManagement/ReplenishmentAppService.cs

@@ -69,6 +69,12 @@ namespace Business.Replenishment
 
         private ISqlRepository<NbrMaster> _nbrMaster;
         private ISqlRepository<NbrDetail> _nbrDetail;
+
+        /// <summary>
+        /// 送货单子表
+        /// </summary>
+        private readonly ISqlRepository<scm_shdzb> _scm_shdzb;
+
         /// <summary>
         /// 交货单异常记录表
         /// </summary>
@@ -347,6 +353,7 @@ namespace Business.Replenishment
             ISqlRepository<PurOrdDetail> PurOrdDetail,
             ISqlRepository<PurOrdMaster> PurOrdMaster,
             ISqlRepository<DeliveryExceptionMaster> DeliveryExceptionMaster,
+            ISqlRepository<scm_shdzb> scm_shdzb,
             IUnitOfWorkManager unitOfWorkManager)
         {
             _replenishmentROPWeekPlan = replenishmentROPWeekPlan;
@@ -445,6 +452,7 @@ namespace Business.Replenishment
             _PurOrdDetail = PurOrdDetail;
             _PurOrdMaster = PurOrdMaster;
             _DeliveryExceptionMaster = DeliveryExceptionMaster;
+            _scm_shdzb = scm_shdzb;
         }
         #endregion
 
@@ -6688,17 +6696,19 @@ namespace Business.Replenishment
                 return Msg;
             }
             //获取采购明细数据:未关闭,且未交货数量(需求数量-已收数量)>0
-            //DateTime endTime = Convert.ToDateTime("2024-01-01 00:00:00.000");
             List<PurOrdDetail> purOrdDetails = _PurOrdDetail.Select(p => p.Domain == domain && itemnums.Contains(p.ItemNum) && p.Status.ToUpper() != "C" && (p.QtyOrded - p.RctQty) > 0).OrderBy(p => p.DueDate).ToList();
             if (!purOrdDetails.Any())
             {
                 Msg = "NO|没有可用的采购单";
                 return Msg;
             }
+            List<string> purOrds = purOrdDetails.Select(p => p.PurOrd).Distinct().ToList();
+            //获取送货单子表数据
+            List<scm_shdzb> shdzbs = _scm_shdzb.Select(p=> purOrds.Contains(p.po_bill) && itemnums.Contains(p.sh_material_code) && string.IsNullOrEmpty(p.jhdbh)).ToList();
             //获取采购单数据
-            List<PurOrdMaster> purOrdMasters = _PurOrdMaster.Select(p => p.Domain == domain && purOrdDetails.Select(m => m.PurOrd).Distinct().Contains(p.PurOrd)).ToList();
+            List<PurOrdMaster> purOrdMasters = _PurOrdMaster.Select(p => p.Domain == domain && purOrds.Contains(p.PurOrd)).ToList();
             //获取占用可用PO明细的交货单
-            List<srm_polist_ds> dbPolistds = _srmpolistds.Select(p => purOrdDetails.Select(m => m.PurOrd).Contains(p.ponumber) && p.status.ToUpper() !="C" && p.isactive == 1).ToList();
+            List<srm_polist_ds> dbPolistds = _srmpolistds.Select(p => purOrds.Contains(p.ponumber) && p.isactive == 1).ToList();
 
             //生成交货单
             srm_polist_ds entity;
@@ -6767,15 +6777,17 @@ namespace Business.Replenishment
                 }
                 //当前采购明细对应的采购单
                 var curPurMsts = purOrdMasters.Where(p => curPurDtls.Select(m => m.PurOrd).Distinct().Contains(p.PurOrd)).ToList();
+                //当前采购明细对应的送货单
+                var curShds = shdzbs.Where(p => p.sh_material_code == demandplans[i].itemnum && curPurDtls.Select(m => m.PurOrd).Contains(p.sh_material_code)).ToList();
                 //数据库中当前采购单明细被交货单占用情况
                 var curDbOccupys = dbPolistds.Where(p => curPurDtls.Select(m => m.PurOrd).Contains(p.ponumber) && p.itemnum == demandplans[i].itemnum).ToList();
                 //本次计算中采购单明细被交货单占用情况
                 var curCalcOccupys = inserts.Where(p => curPurDtls.Select(m => m.PurOrd).Contains(p.ponumber) && p.itemnum == demandplans[i].itemnum).ToList();
                 //校验4:如果当前物料对应的采购明细可用数量不满足,则跳过
-                //采购单明细的剩余未交数量:采购明细的需求数量-已交数量
-                sumRestQty = curPurDtls.Sum(p => p.QtyOrded - p.RctQty);
-                //交货单占用数量:交货单的剩余需要采购数量
-                sumDbOccupy = curDbOccupys.Sum(p => p.restqty);
+                //采购单明细的剩余未交数量:采购明细的需求数量-送货单需求数量(不是交货单转的送货单)
+                sumRestQty = curPurDtls.Sum(p => p.QtyOrded) - curShds.Sum(p=>p.sh_delivery_quantity);
+                //交货单占用数量:交货单的需求数量
+                sumDbOccupy = curDbOccupys.Sum(p => p.schedqty);
                 //本次计算交货单占用数量:本次计算交货单的需求数量
                 sumCurOccupy = curCalcOccupys.Sum(p => p.schedqty);
                 //剩余可用数量
@@ -6858,11 +6870,13 @@ namespace Business.Replenishment
                         flag = true;
                         break;
                     }
+                    //送货单占用数量
+                    var pchShds = curShds.Where(p => pchPurMsts.Select(m => m.PurOrd).Contains(p.po_bill)).ToList();
                     //校验当前供应商的采购明细剩余可用数量是否满足供应商的配额
                     //采购单明细剩余可用数量
-                    sumRestQty = pchPurDtls.Sum(p => p.QtyOrded - p.RctQty);
+                    sumRestQty = pchPurDtls.Sum(p => p.QtyOrded) - pchShds.Sum(p=>p.sh_delivery_quantity);
                     //交货单占用数量:交货单的剩余需要采购数量
-                    sumDbOccupy = curDbOccupys.Where(p => pchPurDtls.Select(m => m.PurOrd).Contains(p.ponumber)).Sum(p => p.restqty);
+                    sumDbOccupy = curDbOccupys.Where(p => pchPurDtls.Select(m => m.PurOrd).Contains(p.ponumber)).Sum(p => p.schedqty);
                     //本次计算交货单占用数量:本次计算交货单的需求数量
                     sumCurOccupy = curCalcOccupys.Where(p => pchPurDtls.Select(m => m.PurOrd).Contains(p.ponumber)).Sum(p => p.schedqty);
                     //剩余可用数量
@@ -6892,11 +6906,11 @@ namespace Business.Replenishment
                             //当前供应商配额以满足,循环下一个供应商
                             break;
                         }
-                        //当前采购明细剩余数量=订单数量-已收数量
-                        decimal syQty = pchPurDtls[k].QtyOrded - pchPurDtls[k].RctQty;
+                        //当前采购明细剩余数量=订单数量-送货单数量(不是由交货单转的送货单)
+                        decimal syQty = pchPurDtls[k].QtyOrded - pchShds.Where(p => p.po_billline == pchPurDtls[k].Line).Sum(p=>p.sh_delivery_quantity);
                         //当前采购明细被占用数量(已占用数量)
                         var occupy = curDbOccupys.Where(p => p.ponumber == pchPurDtls[k].PurOrd && p.itemnum == pchPurDtls[k].ItemNum && p.poline == pchPurDtls[k].Line).ToList();
-                        decimal yzyQty = occupy.Sum(p => p.restqty);
+                        decimal yzyQty = occupy.Sum(p => p.schedqty);
                         //当前计算中采购明细被占用数量(本次计算占用数量)
                         var calcs = inserts.Where(p => p.ponumber == pchPurDtls[k].PurOrd && p.itemnum == pchPurDtls[k].ItemNum && p.poline == pchPurDtls[k].Line).ToList();
                         decimal bzyQty = calcs.Sum(p => p.schedqty);
@@ -6961,162 +6975,6 @@ namespace Business.Replenishment
                         sumNeedQty += xqQty;
                     }
                 }
-
-                foreach (var pch in curChaes)
-                {
-                    if (pch.quota_rate.GetValueOrDefault() == 0)
-                    {
-                        continue;
-                    }
-                    //如果交货计划已分配数量>=交货计划净需求数量,则终止
-                    if (allQty >= demandplans[i].tosechedqty)
-                    {
-                        break;
-                    }
-                    //供应商占用数量置0
-                    sumNeedQty = 0m;
-                    //计算当前供应商分配数量
-                    needQty = Math.Ceiling(demandplans[i].tosechedqty * pch.quota_rate.GetValueOrDefault() / 100.00m);
-                    //如果交货计划剩余数量小于按照供应商配额计算的数量,则当前供应商需分配数量为交货计划剩余数量
-                    if (demandplans[i].tosechedqty - allQty < needQty)
-                    {
-                        needQty = demandplans[i].tosechedqty - allQty;
-                    }
-                    //以下为供应商是采购申请场景
-                    //获取当前供应商对应的采购单明细数据,按照交货日期从小到大开始占用
-                    var pchPurMsts = curPurMsts.Where(p => p.Supp == pch.supplier_number).ToList();
-                    if (!pchPurMsts.Any())
-                    {
-                        //当前供应商没有可用采购单,则当前交货计划无法转交货单
-                        info = new DeliveryExceptionMaster();
-                        info.Domain = domain;
-                        info.Icdsid = demandplans[i].Id;
-                        info.ItemNum = demandplans[i].itemnum;
-                        info.CreateTime = DateTime.Now;
-                        info.Remark = "交货计划[" + demandplans[i].itemnum + ":" + demandplans[i].requestdate.ToString("yyyy-MM-dd") + "]对应供应商[" + pch.supplier_name + "]没有可用采购明细,无法转交货单";
-                        info.OptTime = optime;
-                        exceptions.Add(info);
-
-                        flag = true;
-                        break;
-                    }
-                    var pchPurDtls = curPurDtls.Where(p => pchPurMsts.Select(m => m.PurOrd).Contains(p.PurOrd)).ToList();
-                    if (!pchPurDtls.Any())
-                    {
-                        //当前供应商没有可用采购单明细,则当前交货计划无法转交货单
-                        info = new DeliveryExceptionMaster();
-                        info.Domain = domain;
-                        info.Icdsid = demandplans[i].Id;
-                        info.ItemNum = demandplans[i].itemnum;
-                        info.CreateTime = DateTime.Now;
-                        info.Remark = "物料[" + demandplans[i].itemnum + "]对应供应商[" + pch.supplier_name + "]没有可用采购明细,无法转交货单";
-                        info.OptTime = optime;
-                        exceptions.Add(info);
-
-                        flag = true;
-                        break;
-                    }
-                    //校验当前供应商的采购明细剩余可用数量是否满足供应商的配额
-                    //采购单明细剩余可用数量
-                    sumRestQty = pchPurDtls.Sum(p => p.QtyOrded - p.RctQty);
-                    //交货单占用数量:交货单的剩余需要采购数量
-                    sumDbOccupy = curDbOccupys.Where(p => pchPurDtls.Select(m => m.PurOrd).Contains(p.ponumber)).Sum(p => p.restqty);
-                    //本次计算交货单占用数量:本次计算交货单的需求数量
-                    sumCurOccupy = curCalcOccupys.Where(p => pchPurDtls.Select(m => m.PurOrd).Contains(p.ponumber)).Sum(p => p.schedqty);
-                    //剩余可用数量
-                    restQty = sumRestQty - sumDbOccupy - sumCurOccupy;
-                    if (restQty < needQty)
-                    {
-                        //当前供应商可用采购单明细不足,则当前交货计划无法转交货单
-                        info = new DeliveryExceptionMaster();
-                        info.Domain = domain;
-                        info.Icdsid = demandplans[i].Id;
-                        info.ItemNum = demandplans[i].itemnum;
-                        info.CreateTime = DateTime.Now;
-                        info.Remark = "交货计划[" + demandplans[i].itemnum + ":" + demandplans[i].requestdate.ToString("yyyy-MM-dd") + "]对应供应商[" + pch.supplier_name + "]采购明细可用数量不足,无法转交货单";
-                        info.OptTime = optime;
-                        exceptions.Add(info);
-
-                        flag = true;
-                        break;
-                    }
-
-                    foreach (var pud in pchPurDtls)
-                    {
-                        if (sumNeedQty >= needQty)
-                        {
-                            //当前供应商配额以满足,循环下一个供应商
-                            break;
-                        }
-                        //当前采购明细剩余数量=订单数量-已收数量
-                        decimal syQty = pud.QtyOrded - pud.RctQty;
-                        //当前采购明细被占用数量(已占用数量)
-                        var occupy = curDbOccupys.Where(p => p.ponumber == pud.PurOrd && p.itemnum == pud.ItemNum && p.poline == pud.Line).ToList();
-                        decimal yzyQty = occupy.Sum(p => p.restqty);
-                        //当前计算中采购明细被占用数量(本次计算占用数量)
-                        var calcs = inserts.Where(p => p.ponumber == pud.PurOrd && p.itemnum == pud.ItemNum && p.poline == pud.Line).ToList();
-                        decimal bzyQty = calcs.Sum(p => p.schedqty);
-
-                        //当前采购明细可用数量
-                        decimal kyQty = syQty - yzyQty - bzyQty;
-                        //剩余需要分配数量
-                        remainQty = needQty - sumNeedQty;
-                        //当前采购明细已被全部占用,循环下一条采购明细
-                        if (kyQty == 0)
-                        {
-                            continue;
-                        }
-                        decimal xqQty = 0m;
-                        //当前采购明细的可用数量不满足交货单剩余需要分配数量
-                        if (kyQty < remainQty)
-                        {
-                            //占用当前采购明细剩余可用数量
-                            xqQty = kyQty;
-                        }
-                        else
-                        {
-                            xqQty = remainQty;
-                            //按照最小包装量圆整:最小包装量为0,则不需要圆整
-                            decimal yzQty = pch.packaging_qty.GetValueOrDefault() == 0 ? remainQty : Math.Ceiling(remainQty / pch.packaging_qty.GetValueOrDefault()) * pch.packaging_qty.GetValueOrDefault();
-                            //如果可用数量大于圆整数量
-                            if (kyQty >= yzQty)
-                            {
-                                xqQty = yzQty;
-                            }
-                        }
-                        //生成实体
-                        entity = new srm_polist_ds();
-                        entity.Id = help.NextId();
-                        entity.domain = domain;
-                        entity.icdsid = demandplans[i].Id;
-                        //交货单号最后一次性生成
-                        entity.dsnum = "";
-                        entity.status = "N";
-                        entity.itemnum = demandplans[i].itemnum;
-                        entity.um = "";
-                        entity.purgroup = "";
-                        entity.suppliercode = pch.supplier_number;
-                        entity.supplier = string.IsNullOrEmpty(pch.supplier_name) ? "" : pch.supplier_name;
-                        entity.requestdate = demandplans[i].arrivaldate;
-                        entity.needdate = demandplans[i].requestdate;
-                        entity.ponumber = pud.PurOrd;
-                        entity.poline = pud.Line;
-                        entity.schedqty = xqQty;
-                        entity.lastsentqty = 0m;
-                        entity.sentqty = 0m;
-                        entity.restqty = xqQty;
-                        entity.createtime = DateTime.Now;
-                        entity.createuser = user;
-                        entity.remarks = "";
-                        entity.isactive = 1;
-                        curInserts.Add(entity);
-
-                        //当前交货计划已分配数量累加
-                        allQty += xqQty;
-                        //当前供应商已分配数量累加
-                        sumNeedQty += xqQty;
-                    }
-                }
                 //标志位为true,则当前交货计划无法转交货单
                 if (flag)
                 {
@@ -7124,8 +6982,6 @@ namespace Business.Replenishment
                 }
                 inserts.AddRange(curInserts);
             }
-
-
             if (inserts.Any())
             {
                 //获取交货单号

+ 58 - 0
MicroServices/Business/Business.Domain/StructuredDB/MES/IC/scm_shdzb.cs

@@ -0,0 +1,58 @@
+using Business.Core.Attributes;
+using Microsoft.EntityFrameworkCore;
+using System;
+using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations.Schema;
+
+namespace Business.Domain
+{
+    /// <summary>
+    /// 收货单子表
+    /// </summary>
+    [Comment("收货单子表")]
+    public class scm_shdzb
+    {
+        /// <summary>
+        /// 主键
+        /// </summary>
+        [Comment("主键")]
+        [Key]
+        public long id { get; set; }
+
+        /// <summary>
+        /// 物料编码
+        /// </summary>
+        [Comment("物料编码")]
+        public string sh_material_code { get; set; }
+
+        /// <summary>
+        /// 采购单号
+        /// </summary>
+        [Comment("采购单号")]
+        public string po_bill { get; set; }
+
+        /// <summary>
+        /// 采购单行号
+        /// </summary>
+        [Comment("采购单行号")]
+        public int po_billline { get; set; }
+
+        /// <summary>
+        /// 送货数量
+        /// </summary>
+        [Comment("送货数量")]
+        public decimal sh_delivery_quantity { get; set; }
+
+        /// <summary>
+        /// 交货单号
+        /// </summary>
+        [Comment("交货单号")]
+        public string jhdbh { get; set; }
+
+        /// <summary>
+        /// 交货单行号
+        /// </summary>
+        [Comment("交货单行号")]
+        public string jhdhh { 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<scm_shdzb> scm_shdzb { get; set; }
+
         /// <summary>
         /// 蝠億等祑都暮翹
         /// </summary>