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

PR合并和PR转PO实现开发。

tangdi 2 лет назад
Родитель
Сommit
1bcc43f10d

+ 2 - 7
MicroServices/Business/Business.Application.Contracts/ResourceExamineManagement/Dto/POGroupDto.cs

@@ -10,14 +10,9 @@ namespace Business.ResourceExamineManagement.Dto
     public class POGroupDto
     {
         /// <summary>
-        /// 0销售 1计划
+        /// 供应商ID
         /// </summary>
-        public int Type { get; set; }
-
-        /// <summary>
-        /// 外购  委外
-        /// </summary>
-        public int erp_cls { get; set; }
+        public long supplier_id { get; set; }
 
         /// <summary>
         /// 供应类别

+ 23 - 1
MicroServices/Business/Business.Application.Contracts/ResourceExamineManagement/IResourceExamineAppService.cs

@@ -4,6 +4,7 @@ using System.Threading.Tasks;
 using Volo.Abp.Application.Dtos;
 using Volo.Abp.Application.Services;
 using Business.ResourceExamineManagement.Dto;
+using Business.Dto;
 
 namespace Business.ResourceExamineManagement
 {
@@ -69,10 +70,31 @@ namespace Business.ResourceExamineManagement
         void AutoCreateBomBillInterface();
 
         /// <summary>
-        /// 下达领料
+        /// Pr自动合并
         /// </summary>
         /// <param name="workOrds"></param>
         /// <returns></returns>
         void PrAutoMerge();
+
+        /// <summary>
+        /// Pr手动合并
+        /// </summary>
+        /// <param name="ids"></param>
+        /// <returns></returns>
+        Task<string> PrMerge(string ids);
+
+        /// <summary>
+        /// Pr自动审核
+        /// </summary>
+        /// <param name="ids"></param>
+        /// <returns></returns>
+        Task<string> PrAutoApprove();
+
+        /// <summary>
+        /// Pr手动审核
+        /// </summary>
+        /// <param name="ids"></param>
+        /// <returns></returns>
+        Task<string> PrApprove(string ids);
     }
 }

+ 4 - 11
MicroServices/Business/Business.Application/ResourceExamineManagement/CalcBomViewAppService.cs

@@ -1165,11 +1165,10 @@ namespace Business.ResourceExamineManagement
         private SRMPRDto CreateSRMPR(BomChildExamineDto returnlist, long tenantId, long factoryid, long bangId, int orderType, List<ICItemLeadTimeDto> iCItemLeadTimes, List<mo_srm_purchase> supplierList, List<mo_ic_item> planList, DateTime deliveryDate, crm_seorderentry sentrys)
         {
             SRMPRDto sRMPR = new SRMPRDto();
-            var leadTime = iCItemLeadTimes.Find(x => x.item_id == returnlist.item_id);
             var supplier = supplierList.Where(x => x.icitem_id == returnlist.item_id).ToList();//默认取第一个供应商
             var plan = planList.Find(x => x.mysql_id == returnlist.item_id);
             sRMPR.srm_Pr_Main = new List<mo_srm_pr_main>();
-            if (leadTime == null || !supplier.Any() || plan == null)
+            if (!supplier.Any() || plan == null)
             {
                 sRMPR.lastStartTmie = DateTime.Now.AddDays(7);//减去提前期
                 return sRMPR;
@@ -1178,12 +1177,6 @@ namespace Business.ResourceExamineManagement
 
             supplier.ForEach(x =>
             {
-                //提前期随机数,金额随机数
-                leadTime.order_leadtime = plan.order_leadtime;
-                leadTime.transportation_leadtime = plan.transportation_leadtime;
-                leadTime.stock_leadtime = plan.stock_leadtime;
-                leadTime.production_leadtime = plan.production_leadtime;
-
                 x.netpurchase_price = rnd.Next(1, 100);
                 x.taxrate = 0.13m;//固定13%增值税
                 mo_srm_pr_main srm_Pr = new mo_srm_pr_main();
@@ -1209,8 +1202,8 @@ namespace Business.ResourceExamineManagement
                 srm_Pr.pr_ssend_date = DateTime.Now;//系统建议下单日期
                 srm_Pr.pr_sarrive_date = DateTime.Now.AddDays((double)plan.order_leadtime).AddDays((double)plan.transportation_leadtime);//系统建议到达日期(建议到货日期)
                 srm_Pr.pr_psend_date = DateTime.Now;//计划下单日期
-                srm_Pr.pr_parrive_date = DateTime.Now.AddDays((double)leadTime.order_leadtime).AddDays((double)leadTime.transportation_leadtime);//计划到达日期
-                srm_Pr.pr_rarrive_date = DateTime.Now.AddDays((double)leadTime.order_leadtime).AddDays((double)leadTime.transportation_leadtime);//需求到货日期
+                srm_Pr.pr_parrive_date = DateTime.Now.AddDays((double)plan.order_leadtime).AddDays((double)plan.transportation_leadtime);//计划到达日期
+                srm_Pr.pr_rarrive_date = DateTime.Now.AddDays((double)plan.order_leadtime).AddDays((double)plan.transportation_leadtime);//需求到货日期
                 srm_Pr.pr_sysprice = returnlist.lack_qty * x.netpurchase_price * (1 + x.taxrate);//系统价格(含税)
                 srm_Pr.pr_orderprice = returnlist.lack_qty * x.netpurchase_price * (1 + x.taxrate);//订单价格(含税)
                 srm_Pr.pr_price = x.netpurchase_price;//采购净价(不含税)
@@ -1229,7 +1222,7 @@ namespace Business.ResourceExamineManagement
                     srm_Pr.sentry_id = sentrys.Id;
                 }
                 //_srm_pr_main.InsertOne(srm_Pr);
-                decimal? totalLeadTime = leadTime.transportation_leadtime + leadTime.stock_leadtime + leadTime.production_leadtime + leadTime.order_leadtime;
+                decimal? totalLeadTime = plan.transportation_leadtime + plan.stock_leadtime + plan.production_leadtime + plan.order_leadtime;
                 srm_Pr.totalLeadTime= totalLeadTime;
                 srm_Pr.create_time = DateTime.Now;
                 srm_Pr.create_by_name = "admin";

+ 123 - 25
MicroServices/Business/Business.Application/ResourceExamineManagement/ResourceExamineAppService.cs

@@ -934,33 +934,33 @@ namespace Business.ResourceExamineManagement
         }
 
         //PR手动合并
-        public string PrMerge(string ids)
+        public async Task<string> PrMerge(string ids)
         {
             //物料、供应商为相同才允许合并。
             var idList = AnalysisIdList(ids);
             List<srm_pr_main> prlist = _mysql_srm_pr_main.GetListAsync(s => idList.Contains(s.Id)).Result;
             if (prlist.Where(s => s.state == 0).Count() > 0)
             {
-                return "所选包含已关闭采购申请,请重新选择。";
+                return JsonConvert.SerializeObject("所选包含已关闭采购申请,请重新选择。");
             }
             if (prlist.Where(s => s.state == 2).Count() > 0)
             {
-                return "所选包含已提交评审采购申请,请重新选择。";
+                return JsonConvert.SerializeObject("所选包含已提交评审采购申请,请重新选择。");
             }
             if (prlist.Where(s => s.state == 4).Count() > 0)
             {
-                return "所选包含已评审通过采购申请,请重新选择。";
+                return JsonConvert.SerializeObject("所选包含已评审通过采购申请,请重新选择。");
             }
             if (prlist.Any())
             {
                 var list = prlist.GroupBy(s => new { s.icitem_id, s.pr_purchaseid });
                 if (list.Count() > 1)
                 {
-                    return "所选行的物料编码,供应商名称必须相同";
+                    return JsonConvert.SerializeObject("所选行的物料编码,供应商名称必须相同");
                 }
             }
             else {
-                return "所选采购申请单未找到,请刷新界面重新操作。";
+                return JsonConvert.SerializeObject("所选采购申请单未找到,请刷新界面重新操作。");
             }
 
             srm_pr_main srm_Pr = help.DeepCopy(prlist[0]);
@@ -972,11 +972,11 @@ namespace Business.ResourceExamineManagement
                 srm_Pr.pr_mono = mes_morder.morder_no;//关联工单号
                 srm_Pr.entity_id = 1;//工单行号
             }*/
-            /*srm_Pr.pr_purchaseid = prlist[0].pr_purchaseid;//供应商id  
+            srm_Pr.pr_purchaseid = prlist[0].pr_purchaseid;//供应商id  
             srm_Pr.pr_purchasenumber = prlist[0].pr_purchasenumber;//供应商编码
             srm_Pr.pr_purchasename = prlist[0].pr_purchasename;//供应商名称
             srm_Pr.pr_purchaser = prlist[0].pr_purchaser;//采购员
-            srm_Pr.pr_purchaser_num = "";//采购员工号(采购信息表)*/
+            srm_Pr.pr_purchaser_num = "";//采购员工号(采购信息表)*//*
             srm_Pr.pr_rqty = prlist.Sum(s => s.pr_rqty);//需求数量
             srm_Pr.pr_aqty = prlist.Sum(s => s.pr_aqty);//申请数量
             srm_Pr.pr_sqty = prlist.Sum(s => s.pr_sqty);//建议数量
@@ -1007,16 +1007,16 @@ namespace Business.ResourceExamineManagement
                 {
                     _businessDbContext.BulkUpdate(prlist);
                     _businessDbContext.BulkInsert(new List<srm_pr_main> { srm_Pr });
-                    unitOfWork.CompleteAsync();
+                    await unitOfWork.CompleteAsync();
                 }
                 catch (Exception e)
                 {
                     new NLogHelper("ResourceExamineAppService").WriteLog("PrMerge", "采购申请单合并数据更新失败:" + e.Message, _currentTenant.Id.ToString());
                     unitOfWork.Dispose();
-                    return e.Message;
+                    return JsonConvert.SerializeObject(e.Message);
                 }
             }
-            return "ok";
+            return JsonConvert.SerializeObject("ok");
         }
 
         //PR自动合并
@@ -1043,11 +1043,13 @@ namespace Business.ResourceExamineManagement
             {
                 bool bl = pr.sentry_id == null ? true : false;
                 //找到是否生成了新的PR
-                var newPr = insetPrList.Find(s => s.pr_purchaseid == pr.pr_purchaseid && s.icitem_id == pr.icitem_id && (s.sentry_id == null) == bl);
+                //var newPr = insetPrList.Find(s => s.pr_purchaseid == pr.pr_purchaseid && s.icitem_id == pr.icitem_id && (s.sentry_id == null) == bl);
+                var newPr = insetPrList.Find(s => s.pr_purchaseid == pr.pr_purchaseid && s.icitem_id == pr.icitem_id);
                 if (newPr == null)
                 {
                     //有多条才进行合并
-                    var ilist = prlist.Where(s => s.pr_purchaseid == pr.pr_purchaseid && s.icitem_id == pr.icitem_id && (s.sentry_id == null) == bl).ToList();
+                    //var ilist = prlist.Where(s => s.pr_purchaseid == pr.pr_purchaseid && s.icitem_id == pr.icitem_id && (s.sentry_id == null) == bl).ToList();
+                    var ilist = prlist.Where(s => s.pr_purchaseid == pr.pr_purchaseid && s.icitem_id == pr.icitem_id).ToList();
                     if (ilist.Count > 1)
                     {
                         var icitem = ic_Items.Find(s => s.Id == pr.icitem_id);
@@ -1063,6 +1065,7 @@ namespace Business.ResourceExamineManagement
                         decimal day = 0;
                         if (icitem != null)
                         {
+                            //目前只加入了下单前置(天)
                             day += icitem.order_leadtime.GetValueOrDefault();
                         }
                         newPr.pr_rarrive_date = starttime;//需求到货日期
@@ -1075,11 +1078,12 @@ namespace Business.ResourceExamineManagement
                         newPr.pr_orderprice = newPr.pr_rqty * pr.pr_price * (1 + pr.pr_rate);//订单价格(含税)
                         ilist.ForEach(s => { s.refer_pr_billno = newPr.pr_billno; });
                         insetPrList.Add(newPr);
+                        ilist.ForEach(s => { s.state = 0; });
                         updatePrList.AddRange(ilist);
                     }
                 }
             }
-            updatePrList.ForEach(s => { s.state = 0; });
+            
             #region 此逻辑是处理按每周几送货实现,先屏蔽
             /*foreach (var pr in moPrlist)
             {
@@ -1153,6 +1157,7 @@ namespace Business.ResourceExamineManagement
             }
         }
 
+
         /// <summary>
         /// 解析按周频率送货方式
         /// </summary>
@@ -1224,29 +1229,31 @@ namespace Business.ResourceExamineManagement
             return weekOfYear;
         }*/
 
-        //PR动审核
-        public async void PrApprove()
+        //PR动审核
+        public async Task<string> PrAutoApprove()
         {
             //直接按间隔多少天一次来处理数据,定时任务按周四来考虑。
             DateTime toTime = new DateTime(2023, 7, 6);
             DateTime starttime = toTime.AddDays(1);
             DateTime endtime = toTime.AddDays(8);
-            List<srm_pr_main> prlist = _mysql_srm_pr_main.GetListAsync(s => s.pr_rarrive_date >= starttime && s.pr_rarrive_date <= endtime && (s.state == 1 || s.state == 3)).Result;
-            
+            List<srm_pr_main> prlist = _mysql_srm_pr_main.GetListAsync(s => s.pr_rarrive_date >= starttime && s.pr_rarrive_date <= endtime && (s.state == 1|| s.state == 2 || s.state == 3)).Result;
+
             if (prlist.Any())
             {
-                List<srm_supplier> itemsupplierList = new List<srm_supplier>();
                 List<srm_purchase> purchaselist = _mysql_srm_purchase.GetListAsync(s => prlist.Select(c => c.icitem_id).Contains(s.icitem_id) && prlist.Select(c => c.pr_purchaseid).Contains(s.supplier_id)).Result;
+                List<srm_supplier> itemsupplierList = _mysql_srm_supplier.GetListAsync(s => prlist.Select(c => c.pr_purchaseid).Contains(s.Id)).Result;
                 List<ic_item> ic_Items = _mysql_ic_item.GetListAsync(s => prlist.Select(c => c.icitem_id).Contains(s.Id)).Result;
                 PoActionListDto poaction = new PoActionListDto();
+                param.tenantId = prlist[0].tenant_id;
+                param.factoryId = prlist[0].factory_id.GetValueOrDefault();
                 AutoCreatePOFromPR(prlist, ic_Items, itemsupplierList, purchaselist, poaction);
-
                 using (var unitOfWork = _unitOfWorkManager.Begin(false, true))
                 {
                     try
                     {
                         if (poaction.poMain.Any())
                         {
+                            _businessDbContext.BulkUpdate(prlist);
                             _businessDbContext.BulkInsert(poaction.poMain);
                         }
                         if (poaction.polist.Any())
@@ -1275,12 +1282,95 @@ namespace Business.ResourceExamineManagement
                     catch (Exception e)
                     {
                         unitOfWork.Dispose();
-                        new NLogHelper("ResourceExamineAppService").WriteLog("OrderKittingCheck", "工单检查数据更新失败:" + e.Message, _currentTenant.Id.ToString());
+                        new NLogHelper("ResourceExamineAppService").WriteLog("PrApprove", "采购申请单合并失败:" + e.Message, _currentTenant.Id.ToString());
+                        return JsonConvert.SerializeObject("合并失败,请联系管理员。");
+                    }
+                }
+                return JsonConvert.SerializeObject("ok");
+            }
+            else
+            {
+                return JsonConvert.SerializeObject("没有需要审核的采购申请单。");
+            }
+        }
+
+        /// <summary>
+        /// //PR手动审核
+        /// </summary>
+        /// <param name="ids"></param>
+        /// <returns></returns>
+        public async Task<string> PrApprove(string ids)
+        {
+            //物料、供应商为相同才允许合并。
+            var idList = AnalysisIdList(ids);
+            List<srm_pr_main> prlist = _mysql_srm_pr_main.GetListAsync(s => idList.Contains(s.Id)).Result;
+            if (!prlist.Any())
+            {
+                return JsonConvert.SerializeObject("所选采购申请单未找到,请刷新界面重新操作。");
+            }
+            if (prlist.Where(s => s.state == 0).Count() > 0)
+            {
+                return JsonConvert.SerializeObject("所选包含已关闭采购申请,请重新选择。");
+            }
+            if (prlist.Where(s => s.state == 3).Count() > 0)
+            {
+                return JsonConvert.SerializeObject("所选包含评审未通过采购申请,请重新选择。");
+            }
+            List<srm_purchase> purchaselist = _mysql_srm_purchase.GetListAsync(s => prlist.Select(c => c.icitem_id).Contains(s.icitem_id) && prlist.Select(c => c.pr_purchaseid).Contains(s.supplier_id)).Result;
+            List<srm_supplier> itemsupplierList = _mysql_srm_supplier.GetListAsync(s => prlist.Select(c => c.pr_purchaseid).Contains(s.Id)).Result;
+            var purclist = purchaselist.GroupBy(s => new { s.supplier_type, s.supplier_id });
+            if (purclist.Count() > 1)
+            {
+                return JsonConvert.SerializeObject("采购申请单的采购类别必须相同。");
+            }
+            List<ic_item> ic_Items = _mysql_ic_item.GetListAsync(s => prlist.Select(c => c.icitem_id).Contains(s.Id)).Result;
+            PoActionListDto poaction = new PoActionListDto();
+            param.tenantId = prlist[0].tenant_id;
+            param.factoryId = prlist[0].factory_id.GetValueOrDefault();
+            AutoCreatePOFromPR(prlist, ic_Items, itemsupplierList, purchaselist, poaction);
+            using (var unitOfWork = _unitOfWorkManager.Begin(false, true))
+            {
+                try
+                {
+                    if (poaction.poMain.Any())
+                    {
+                        _businessDbContext.BulkUpdate(prlist);
+                        _businessDbContext.BulkInsert(poaction.poMain);
+                    }
+                    if (poaction.polist.Any())
+                    {
+                        _businessDbContext.BulkInsert(poaction.polist);
+                    }
+                    if (poaction.poOccupiesList.Any())
+                    {
+                        _businessDbContext.BulkInsert(poaction.poOccupiesList);
+                    }
+
+                    if (poaction.poMasterList.Any())
+                    {
+                        _purOrdMaster.Insert(poaction.poMasterList);
+                        //快开平台用自增列RecId关联,所以需要插入后再查给明细表赋相应的值
+                        List<string> nbrs = poaction.poMasterList.Select(a => a.PurOrd).ToList();
+                        var nbrList = _purOrdMaster.Select(a => a.Domain == "1001" && nbrs.Contains(a.PurOrd));
+                        poaction.poDetailList.ForEach(c =>
+                        {
+                            c.PurOrdRecID = nbrList.Where(a => a.PurOrd == c.PurOrd).First().RecID;
+                        });
+                        _purOrdDetail.Insert(poaction.poDetailList);
                     }
+                    await unitOfWork.CompleteAsync();
+                }
+                catch (Exception e)
+                {
+                    unitOfWork.Dispose();
+                    new NLogHelper("ResourceExamineAppService").WriteLog("PrApprove", "采购申请单合并失败:" + e.Message, _currentTenant.Id.ToString());
+                    return JsonConvert.SerializeObject("合并失败,请联系管理员。");
                 }
             }
+            return JsonConvert.SerializeObject("ok");
         }
 
+
         private List<long> AnalysisIdList(string ids)
         {
             if (string.IsNullOrEmpty(ids))
@@ -1615,6 +1705,8 @@ namespace Business.ResourceExamineManagement
         /// <returns></returns>
         public async Task DbSnapShot(long tenantId, long factoryId, long bangid,List<b_bom_pretreatment> pretreatments)
         {
+            //TODO:申老师明确后续需要调整 根据需要使用的字段,来同步表数据。
+            
             //同步物料库存数据  根据预处理,来只找出部分数据同步。
             List<long> itemIds = pretreatments.Select(s => s.item_id.GetValueOrDefault()).ToList();
             //var icitemStokc = _mysql_ic_item_stock.GetListAsync(p => p.tenant_id == tenantId && p.factory_id == factoryId).Result;
@@ -1847,18 +1939,23 @@ namespace Business.ResourceExamineManagement
             //此逻辑已经在PR按周合并了。这一块直接转PO_list,然后根据此类型,再生成PO
             foreach (var item in list)
             {
-                int type = item.sentry_id == null ? 1 : 0;
                 var pur = purchaselist.Find(s => s.supplier_id == item.pr_purchaseid && s.icitem_id == item.icitem_id);
-                POGroupDto poDto = pOGroupDtos.Find(s => s.supplier_type == pur.supplier_type && s.Type == type && s.erp_cls == item.pr_type.GetValueOrDefault());
+                if (pur == null)
+                {
+                    //无货源清单的PR不处理
+                    continue;
+                }
+                POGroupDto poDto = pOGroupDtos.Find(s => s.supplier_type == pur.supplier_type && s.supplier_id == item.pr_purchaseid);
                 if (poDto == null)
                 {
                     poDto = new POGroupDto();
-                    poDto.Type = type;
-                    poDto.erp_cls = item.pr_type.GetValueOrDefault();//委外  外购
+                    poDto.supplier_id = item.pr_purchaseid.GetValueOrDefault();
                     poDto.supplier_type = pur.supplier_type;
                     poDto.polist = new List<srm_po_list>();
                     pOGroupDtos.Add(poDto);
                 }
+                item.state = 0;
+
                 srm_po_list podetail = new srm_po_list();
                 podetail.GenerateNewId(help.NextId());
                 podetail.pr_id = item.Id;
@@ -1902,6 +1999,7 @@ namespace Business.ResourceExamineManagement
                 po_Main.state = 0;
                 po_Main.po_note = "";
                 po_Main.po_order_type = 1;
+                po_Main.po_total = 0;
                 po_Main.currency = pr.currencytype;
                 po_Main.bill_type = poType;
                 po_Main.supplier_id = pr.pr_purchaseid;

+ 44 - 4
MicroServices/Business/Business.HttpApi/Controllers/ResourceExamineController.cs

@@ -1,6 +1,10 @@
-using Business.ResourceExamineManagement;
+using Business.Dto;
+using Business.ResourceExamineManagement;
 using Business.ResourceExamineManagement.Dto;
 using Microsoft.AspNetCore.Mvc;
+using MongoDB.Bson.IO;
+using Newtonsoft.Json;
+using Org.BouncyCastle.Asn1.Ocsp;
 using System;
 using System.Collections.Generic;
 using System.Linq;
@@ -55,7 +59,7 @@ namespace Business.Controllers
         /// </summary>
         /// <param name="input"></param>
         /// <returns></returns>
-        [HttpGet]
+        [HttpPost]
         [Route("receiveresult")]
         public Task<string> ReceiveResult(string ids, int type)
         {
@@ -122,15 +126,51 @@ namespace Business.Controllers
         }
 
         /// <summary>
-        /// 资源检查结果评审
+        /// Pr自动合并
         /// </summary>
         /// <param name="input"></param>
         /// <returns></returns>
-        [HttpGet]
+        [HttpPost]
         [Route("PrAutoMerge")]
         public void PrAutoMerge()
         {
             _ResourceExamineAppService.PrAutoMerge();
         }
+
+        /// <summary>
+        /// Pr手动合并
+        /// </summary>
+        /// <param name="input"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [Route("PrMerge")]
+        public Task<string> PrMerge(string ids)
+        {
+            return _ResourceExamineAppService.PrMerge(ids);
+        }
+
+        /// <summary>
+        /// Pr自动审核
+        /// </summary>
+        /// <param name="input"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [Route("PrAutoApprove")]
+        public Task<string> PrAutoApprove()
+        {
+            return _ResourceExamineAppService.PrAutoApprove();
+        }
+
+        /// <summary>
+        /// Pr手动审核
+        /// </summary>
+        /// <param name="input"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [Route("PrApprove")]
+        public Task<string> PrApprove(string ids)
+        {
+            return _ResourceExamineAppService.PrApprove(ids);
+        }
     }
 }