Procházet zdrojové kódy

交货单生成PR后,添加pr自动合并,转DO,转PO逻辑

heteng před 2 roky
rodič
revize
096bd9ca0f

+ 7 - 0
MicroServices/Business/Business.Application.Contracts/ResourceExamineManagement/IResourceExamineAppService.cs

@@ -182,5 +182,12 @@ namespace Business.ResourceExamineManagement
         /// <param name="domain"></param>
         /// <param name="domain"></param>
         /// <returns></returns>
         /// <returns></returns>
         Task<string> AutomaticPrAdjustDate(string domain);
         Task<string> AutomaticPrAdjustDate(string domain);
+
+        /// <summary>
+        /// 交货单生成PR后,自动合并,转DO或者推送SAP
+        /// </summary>
+        /// <param name="domain"></param>
+        /// <returns></returns>
+        Task<string> AutoTransferDoOrPo(string domain);
     }
     }
 }
 }

+ 238 - 0
MicroServices/Business/Business.Application/ResourceExamineManagement/ResourceExamineAppService.cs

@@ -6259,6 +6259,244 @@ namespace Business.ResourceExamineManagement
                 return "更新失败,请联系管理员。";
                 return "更新失败,请联系管理员。";
             }
             }
         }
         }
+
+        /// <summary>
+        /// 交货单生成PR后,自动合并,转DO或者推送SAP
+        /// </summary>
+        /// <param name="domain"></param>
+        /// <returns></returns>
+        public async Task<string> AutoTransferDoOrPo(string domain)
+        {
+            try
+            {
+                string result = await PrAutoMerge2(domain);
+                if (result != "ok")
+                {
+                    return result;
+                }
+                result = await PrAutoApprove(domain);
+                if (result != "ok")
+                {
+                    return result;
+                }
+                result = await PrSendSAP(domain);
+                if (result != "ok")
+                {
+                    return result;
+                }
+                return result;
+            }
+            catch (Exception e)
+            {
+                new NLogHelper("ResourceExamineAppService").WriteLog("AutoTransferDoOrPo", "PR推送失败失败:" + e.Message, _currentTenant.Id.ToString());
+                return "PR推送失败失败,请联系管理员。";
+            }
+        }
+
+        /// <summary>
+        /// PR自动合并,不生成
+        /// </summary>
+        /// <param name="domain"></param>
+        /// <returns></returns>
+        public async Task<string> PrAutoMerge2(string domain)
+        {
+            try
+            {
+                DateTime tomorrow = DateTime.Now.AddDays(1).Date;
+                var formerlylist = _mysql_srm_pr_main.GetListAsync(x => x.pr_ssend_date < tomorrow && x.state == 1 && x.factory_id.ToString() == domain).Result;
+                if (formerlylist.Any())
+                {
+                    formerlylist.ForEach(x =>
+                    {
+                        TimeSpan difference = tomorrow.Subtract(x.pr_ssend_date.GetValueOrDefault());
+                        int daysDifference = difference.Days;
+                        x.pr_ssend_date = tomorrow;
+                        x.pr_sarrive_date = x.pr_sarrive_date.GetValueOrDefault().AddDays(daysDifference);
+                    });
+                    _businessDbContext.BulkUpdate(formerlylist);
+                }
+
+                DateTime toTime = DateTime.Now.Date;
+                int dayOfWeek = (int)toTime.DayOfWeek; // 获取今天是星期几(0-6)
+                switch (dayOfWeek)
+                {
+                    case 0:
+                        toTime = toTime.AddDays(-7);
+                        break;
+                    default:
+                        toTime = toTime.AddDays(-dayOfWeek);
+                        break;
+                }
+                DateTime starttime = toTime.Date.AddDays(1);
+                DateTime endtime = toTime.Date.AddDays(35);
+
+                //只合并要货令
+                List<srm_pr_main> alllist = _mysql_srm_pr_main.GetListAsync(s => s.factory_id.ToString() == domain && s.pr_ssend_date >= starttime && s.pr_ssend_date <= endtime && s.state == 1 && string.IsNullOrEmpty(s.analogcalcversion) == true).Result;
+                List<ic_item> ic_Items = _mysql_ic_item.GetListAsync(s => s.factory_id.ToString() == domain && alllist.Select(c => c.icitem_id).Distinct().Contains(s.Id)).Result;
+
+
+                var occupyListLINQ = _businessDbContext.srm_po_occupy.Where(x => x.factory_id.ToString() == domain && !x.IsDeleted).Join(_businessDbContext.srm_pr_main.Where(s => s.factory_id.ToString() == domain && s.pr_ssend_date >= starttime && s.pr_ssend_date <= endtime && s.state == 1), p => p.polist_id, pr => pr.Id, (p, pr) => new { p, pr }).ToList();
+                List<srm_po_occupy> occupylist = new List<srm_po_occupy>();
+                for (int i = 0; i < occupyListLINQ.Count; i++)
+                {
+                    occupylist.Add(occupyListLINQ[i].p);
+                }
+
+                //var occupylist = _mysql_srm_po_occupy.GetListAsync(s => alllist.Select(c => c.Id).Contains(s.polist_id.GetValueOrDefault()) && s.company_id.ToString() == companyid && s.IsDeleted == false).Result;
+                var purList = _mysql_srm_purchase.GetListAsync(x => x.factory_id.ToString() == domain).Result;
+                List<srm_pr_main> insetAllList = new List<srm_pr_main>();
+                List<srm_pr_main> updateAllList = new List<srm_pr_main>();
+
+                //每次发布四周的数据
+                for (int i = 0; i < 5; i++)
+                {
+                    starttime = toTime.Date.AddDays(i * 7 + 1);
+                    endtime = toTime.Date.AddDays((i + 1) * 7);
+                    List<srm_pr_main> prlist = alllist.Where(s => s.pr_ssend_date >= starttime && s.pr_ssend_date <= endtime).ToList();
+                    List<srm_pr_main> insetPrList = new List<srm_pr_main>();
+                    List<srm_pr_main> updatePrList = new List<srm_pr_main>();
+                    long Nbr = help.NextId();
+                    foreach (var pr in prlist)
+                    {
+                        bool bl = pr.sentry_id == null;//区分是销售订单和非销售订单的合并。
+                                                       //找到是否生成了新的PR  当前数据是否已经产生合并,则不再合并。
+                        var newPr = insetPrList.Find(s => s.pr_purchaseid == pr.pr_purchaseid && s.icitem_id == pr.icitem_id && s.IsRequireGoods == pr.IsRequireGoods && s.supplier_type == pr.supplier_type && (s.sentry_id == null) == bl);
+                        if (newPr == null)
+                        {
+                            //有多条才进行合并
+                            var ilist = prlist.Where(s => s.pr_purchaseid == pr.pr_purchaseid && s.icitem_id == pr.icitem_id && s.IsRequireGoods == pr.IsRequireGoods && s.supplier_type == pr.supplier_type && (s.sentry_id == null) == bl).ToList();
+                            //var ilist = prlist.Where(s => s.pr_purchaseid == pr.pr_purchaseid && s.icitem_id == pr.icitem_id).ToList();
+                            var pur = purList.Find(x => x.icitem_id == pr.icitem_id && x.supplier_id == pr.pr_purchaseid);
+                            if (ilist.Count > 1)
+                            {
+                                var icitem = ic_Items.Find(s => s.Id == pr.icitem_id);
+                                var prRefoccupy = occupylist.Where(s => ilist.Select(c => c.Id).ToList().Contains(s.polist_id.GetValueOrDefault())).ToList();
+                                newPr = help.DeepCopy(pr);
+                                newPr.GenerateNewId(help.NextId());
+                                prRefoccupy.ForEach(a =>
+                                {
+                                    a.polist_id = newPr.Id;
+                                });
+                                newPr.pr_billno = Nbr.ToString();//pr单号
+                                newPr.state = pr.state;
+                                newPr.pr_rqty = ilist.Sum(s => s.pr_rqty);//需求数量
+                                newPr.pr_aqty = ilist.Sum(s => s.pr_aqty);//申请数量
+                                newPr.pr_sqty = ilist.Sum(s => s.pr_sqty);//建议数量
+
+                                decimal qty = newPr.pr_rqty.GetValueOrDefault();
+                                if (pur != null && newPr.pr_type == 2 && pur.quota_rate.GetValueOrDefault() == 100)//委外的采购申请通过委外圆整逻辑处理
+                                {
+                                    //数量圆整 按最小包装量向上圆整
+                                    if (pur.packaging_qty.GetValueOrDefault() != 0)
+                                    {
+                                        decimal count = Math.Ceiling(qty / pur.packaging_qty.GetValueOrDefault());
+                                        qty = count * pur.packaging_qty.GetValueOrDefault();
+                                    }
+                                    //判断最小起订量
+                                    qty = qty > pur.qty_min.GetValueOrDefault() ? qty : pur.qty_min.GetValueOrDefault();
+                                    newPr.pr_aqty = qty;//申请数量
+                                    newPr.pr_sqty = qty;//建议数量
+                                }
+                                newPr.pr_ssend_date = ilist.Min(s => s.pr_ssend_date);//系统建议下单日期
+                                newPr.pr_sarrive_date = ilist.Min(s => s.pr_sarrive_date);//系统建议到达日期(建议到货日期)
+                                /*            newPr.pr_psend_date = ilist.Min(s => s.pr_psend_date);//计划下单日期
+                                            newPr.pr_parrive_date = ilist.Min(s => s.pr_parrive_date);//计划到达日期
+                                            newPr.pr_rarrive_date = ilist.Min(s => s.pr_rarrive_date);//需求到货日期*/
+
+                                //newPr.pr_sysprice = newPr.pr_rqty * pr.pr_price * (1 + pr.pr_rate);//系统价格(含税)
+                                newPr.pr_orderprice = newPr.pr_aqty * pr.pr_sysprice;//订单价格(含税)
+                                ilist.ForEach(s => { s.refer_pr_billno = newPr.pr_billno; });
+                                insetPrList.Add(newPr);
+                                ilist.ForEach(s => { s.state = 0; });
+                                updatePrList.AddRange(ilist);
+                                Nbr++;
+                            }
+                            else
+                            {
+                                decimal qty = pr.pr_rqty.GetValueOrDefault();
+                                if (pur != null && pur.quota_rate.GetValueOrDefault() == 100)
+                                {
+                                    //数量圆整 按最小包装量向上圆整
+                                    if (pur.packaging_qty.GetValueOrDefault() != 0)
+                                    {
+                                        decimal count = Math.Ceiling(qty / pur.packaging_qty.GetValueOrDefault());
+                                        qty = count * pur.packaging_qty.GetValueOrDefault();
+                                    }
+                                    //判断最小起订量
+                                    qty = qty > pur.qty_min.GetValueOrDefault() ? qty : pur.qty_min.GetValueOrDefault();
+                                    pr.pr_aqty = qty;//申请数量
+                                    pr.pr_sqty = qty;//建议数量
+                                }
+
+                            }
+                        }
+                    }
+                    insetAllList.AddRange(insetPrList);
+                    updateAllList.AddRange(updatePrList);
+                }
+
+                if (insetAllList.Any())
+                {
+                    var nbrlistDto = _serialNumberAppService.GetBillNo(insetAllList[0].factory_id.ToString(), "PR", insetAllList.Count, "admin", 1);
+                    int index = 0;
+                    foreach (var p in insetAllList)
+                    {
+                        if (nbrlistDto[index] != null)
+                        {
+                            updateAllList.Where(x => x.refer_pr_billno == p.pr_billno).ToList().ForEach(c =>
+                            {
+                                c.refer_pr_billno = nbrlistDto[index].NbrResult.ToString();
+                            });
+                            p.pr_billno = nbrlistDto[index].NbrResult.ToString();
+                        }
+                        index++;
+                        if (p.pr_purchaseid.GetValueOrDefault() == 0)
+                        {
+                            //数据丢失
+                            var list = _mysql_srm_purchase.GetListAsync(s => s.icitem_id == p.icitem_id).Result;
+                            if (list.Any())
+                            {
+                                var purchase = list.OrderBy(s => s.quota_priority).FirstOrDefault();
+                                p.pr_purchaseid = purchase.supplier_id;
+                                p.pr_purchasename = purchase.supplier_name;
+                                p.pr_purchasenumber = purchase.supplier_number;
+                            }
+                        }
+                    }
+                }
+                using (var unitOfWork = _unitOfWorkManager.Begin(false, true))
+                {
+                    try
+                    {
+
+                        if (insetAllList.Any())
+                        {
+                            _businessDbContext.BulkInsert(insetAllList);
+                        }
+                        if (updateAllList.Any())
+                        {
+                            _businessDbContext.BulkUpdate(updateAllList);
+                        }
+                        if (occupylist.Any())
+                        {
+                            _businessDbContext.BulkUpdate(occupylist);
+                        }
+                        unitOfWork.CompleteAsync();
+                    }
+                    catch (Exception e)
+                    {
+                        unitOfWork.Dispose();
+                        new NLogHelper("ResourceExamineAppService").WriteLog("PrAutoMerge", "采购申请单自动合并更新失败:" + e.Message, _currentTenant.Id.ToString());
+                    };
+                }
+                return "ok";
+            }
+            catch (Exception e)
+            {
+                new NLogHelper("ResourceExamineAppService").WriteLog("PrAutoMerge", "PR自动合并:" + e.Message, _currentTenant.Id.ToString());
+                return "PR自动合并失败,请联系管理员。";
+            }
+        }
     }
     }
 
 
     public class WorkOrdDto
     public class WorkOrdDto

+ 12 - 0
MicroServices/Business/Business.HttpApi/Controllers/ResourceExamineController.cs

@@ -322,5 +322,17 @@ namespace Business.Controllers
         {
         {
             return _ResourceExamineAppService.AutomaticPrAdjustDate(domain);
             return _ResourceExamineAppService.AutomaticPrAdjustDate(domain);
         }
         }
+
+        /// <summary>
+        /// 交货单生成PR后,自动合并,转DO或者推送SAP
+        /// </summary>
+        /// <param name="domain"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [Route("AutoTransferDoOrPo")]
+        public Task<string> AutoTransferDoOrPo(string domain)
+        {
+            return _ResourceExamineAppService.AutoTransferDoOrPo(domain);
+        }
     }
     }
 }
 }