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