|
|
@@ -1064,26 +1064,26 @@ namespace Business.ResourceExamineManagement
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- //PR手动合并
|
|
|
+ //PR手动合并--排除委外
|
|
|
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) && s.IsRequireGoods == 1).Result;
|
|
|
+ List<srm_pr_main> prlist = _mysql_srm_pr_main.GetListAsync(s => idList.Contains(s.Id)).Result;
|
|
|
if (prlist.Any())
|
|
|
{
|
|
|
if (prlist.Where(s => s.state == 0).Count() > 0)
|
|
|
{
|
|
|
return JsonConvert.SerializeObject("所选包含已关闭采购申请,请重新选择。");
|
|
|
}
|
|
|
- /*if (prlist.Where(s => s.state == 2).Count() > 0)
|
|
|
+ if (prlist.Where(s => s.state == 2).Count() > 0)
|
|
|
{
|
|
|
return JsonConvert.SerializeObject("所选包含已提交评审采购申请,请重新选择。");
|
|
|
}
|
|
|
if (prlist.Where(s => s.state == 4).Count() > 0)
|
|
|
{
|
|
|
return JsonConvert.SerializeObject("所选包含已评审通过采购申请,请重新选择。");
|
|
|
- }*/
|
|
|
+ }
|
|
|
var list = prlist.GroupBy(s => new { s.icitem_id, s.pr_purchaseid, s.IsRequireGoods, s.supplier_type });
|
|
|
if (list.Count() > 1)
|
|
|
{
|
|
|
@@ -1160,11 +1160,11 @@ namespace Business.ResourceExamineManagement
|
|
|
return JsonConvert.SerializeObject("ok");
|
|
|
}
|
|
|
|
|
|
- //PR自动合并
|
|
|
+ //PR自动合并--只取外购不取委外
|
|
|
public void PrAutoMerge(string companyid)
|
|
|
{
|
|
|
//直接按间隔多少天一次来处理数据,定时任务按周四来考虑。
|
|
|
- DateTime toTime = DateTime.Now; //new DateTime(2023, 7, 6);
|
|
|
+ DateTime toTime = DateTime.Now;//new DateTime(2023, 12, 3);
|
|
|
DateTime starttime = toTime.Date.AddDays(1);
|
|
|
DateTime endtime = toTime.Date.AddDays(28);
|
|
|
//只合并要货令
|
|
|
@@ -1221,7 +1221,7 @@ namespace Business.ResourceExamineManagement
|
|
|
newPr.pr_sqty = ilist.Sum(s => s.pr_sqty);//建议数量
|
|
|
|
|
|
decimal qty = newPr.pr_rqty.GetValueOrDefault();
|
|
|
- if (pur != null && pur.quota_rate.GetValueOrDefault() == 100)
|
|
|
+ if (pur != null && newPr.pr_type == 2 && pur.quota_rate.GetValueOrDefault() == 100)//委外的采购申请通过委外圆整逻辑处理
|
|
|
{
|
|
|
//数量圆整 按最小包装量向上圆整
|
|
|
if (pur.packaging_qty.GetValueOrDefault() != 0)
|
|
|
@@ -3265,7 +3265,7 @@ namespace Business.ResourceExamineManagement
|
|
|
/// 工单检查物料齐套
|
|
|
/// </summary>
|
|
|
/// <param name="input"></param>
|
|
|
- public async Task<PschedDto> OrderKittingCheck(List<mes_morder> mo_Mes_Morders, bool planCheck = false)
|
|
|
+ public async Task<PschedDto> OrderKittingCheck(List<mes_morder> mo_Mes_Morders, bool planCheck = false,List<mes_moentry> moentryList = null)
|
|
|
{
|
|
|
//资源检查结果
|
|
|
PschedDto rtn = new PschedDto();
|
|
|
@@ -3292,8 +3292,15 @@ namespace Business.ResourceExamineManagement
|
|
|
|
|
|
var morderIdList = mo_Mes_Morders.Select(s => s.Id).ToList();
|
|
|
|
|
|
- List<mes_moentry> mo_Mes_Moentries = _mysql_mes_moentry.GetListAsync(x => morderIdList.Contains(x.moentry_moid.Value)).Result;
|
|
|
-
|
|
|
+ List<mes_moentry> mo_Mes_Moentries = new List<mes_moentry>();
|
|
|
+ if (moentryList != null)
|
|
|
+ {
|
|
|
+ mo_Mes_Moentries = moentryList;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ mo_Mes_Moentries = _mysql_mes_moentry.GetListAsync(x => morderIdList.Contains(x.moentry_moid.Value)).Result;
|
|
|
+ }
|
|
|
+
|
|
|
//获取订单行数据
|
|
|
List<crm_seorderentry> sentrys = _mysql_crm_seorderentry.GetListAsync(p => p.company_id == param.company_id && p.factory_id == param.factoryId && !p.IsDeleted && mo_Mes_Moentries.Select(x => x.soentry_id).Contains(p.Id)).Result;
|
|
|
|
|
|
@@ -3358,6 +3365,10 @@ namespace Business.ResourceExamineManagement
|
|
|
priorityMorderList.Add(mo);
|
|
|
}
|
|
|
}
|
|
|
+ if (!priorityMorderList.Any())
|
|
|
+ {
|
|
|
+ priorityMorderList = mo_Mes_Morders;
|
|
|
+ }
|
|
|
if (!planCheck)
|
|
|
{
|
|
|
//如果是齐套检查,则不考虑其他数据的占用,只看原材料库存
|
|
|
@@ -3546,7 +3557,7 @@ namespace Business.ResourceExamineManagement
|
|
|
}
|
|
|
|
|
|
//获取工单数据
|
|
|
- var workOrdMasters = _workOrdMaster.Select(p => mo_Mes_Morders.Select(c => c.morder_no).Contains(p.WorkOrd) && p.Domain == param.factoryId.ToString());
|
|
|
+ /*var workOrdMasters = _workOrdMaster.Select(p => mo_Mes_Morders.Select(c => c.morder_no).Contains(p.WorkOrd) && p.Domain == param.factoryId.ToString());
|
|
|
workOrdMasters.ForEach(s => {
|
|
|
var mo = mo_Mes_Morders.Find(m => m.morder_no == s.WorkOrd);
|
|
|
if (mo != null)
|
|
|
@@ -3554,16 +3565,16 @@ namespace Business.ResourceExamineManagement
|
|
|
s.OrdDate = mo.moentry_sys_stime;
|
|
|
s.DueDate = mo.moentry_sys_stime;
|
|
|
}
|
|
|
- });
|
|
|
+ });*/
|
|
|
using (var unitOfWork = _unitOfWorkManager.Begin(false, true))
|
|
|
{
|
|
|
try
|
|
|
{
|
|
|
_businessDbContext.BulkUpdate(mo_Mes_Morders);
|
|
|
- if (workOrdMasters.Any())
|
|
|
+ /*if (workOrdMasters.Any())
|
|
|
{
|
|
|
_workOrdMaster.Update(workOrdMasters);
|
|
|
- }
|
|
|
+ }*/
|
|
|
if (prmainlist.Any())
|
|
|
{
|
|
|
var pr_mainlist = ObjectMapper.Map<List<mo_srm_pr_main>, List<srm_pr_main>>(prmainlist);
|
|
|
@@ -5347,6 +5358,208 @@ namespace Business.ResourceExamineManagement
|
|
|
}
|
|
|
|
|
|
}
|
|
|
+
|
|
|
+ //自动合并委外PR,按周频次
|
|
|
+ public async Task<string> AutoMergeWWPR(string domain)
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ //合并委外数据
|
|
|
+ List<srm_pr_main> alllist = _mysql_srm_pr_main.GetListAsync(s => s.factory_id.ToString() == domain && s.pr_type == 2 && s.pr_ssend_date >= DateTime.Now.Date && s.state == 1).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 >= DateTime.Now.Date && 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 purList = _mysql_srm_purchase.GetListAsync(x => x.factory_id.ToString() == domain).Result;
|
|
|
+ //占用不清除,只按照圆整的数量,来买料。
|
|
|
+ List<WWPRDto> wwprList = new List<WWPRDto>();
|
|
|
+ var itemIds = alllist.Select(x => x.icitem_id).Distinct().ToList();
|
|
|
+ foreach (var id in itemIds)
|
|
|
+ {
|
|
|
+ var itemPrList = alllist.Where(x => x.icitem_id == id).ToList();
|
|
|
+ var purIdList = itemPrList.Select(x => x.pr_purchaseid).Distinct().ToList();
|
|
|
+ var icitem = ic_Items.Find(x => x.Id == id);
|
|
|
+ foreach (var purid in purIdList)
|
|
|
+ {
|
|
|
+ var purItemList = itemPrList.Where(x => x.pr_purchaseid == purid).ToList();
|
|
|
+ var pur = purList.Find(x => x.icitem_id == id && x.supplier_id == purid);
|
|
|
+
|
|
|
+ var minTime = purItemList.Min(x => x.pr_ssend_date).GetValueOrDefault();
|
|
|
+ var maxTime = purItemList.Max(x => x.pr_ssend_date).GetValueOrDefault();
|
|
|
+ int diff = 7 - Convert.ToInt16(minTime.DayOfWeek);
|
|
|
+ bool flag = true;
|
|
|
+ DateTime endTime = minTime.AddDays(diff);
|
|
|
+ while (flag)
|
|
|
+ {
|
|
|
+ WWPRDto dto = new WWPRDto();
|
|
|
+ var weekList = purItemList.Where(x => x.pr_ssend_date >= minTime && x.pr_ssend_date <= endTime).ToList();
|
|
|
+ if (weekList.Any())
|
|
|
+ {
|
|
|
+ dto.prList = weekList;
|
|
|
+ dto.itemId = id.Value;
|
|
|
+ dto.SumQty = weekList.Sum(x => x.pr_aqty.GetValueOrDefault());
|
|
|
+ dto.MinQty = 0;
|
|
|
+ dto.icitem = icitem;
|
|
|
+ if (pur != null)
|
|
|
+ {
|
|
|
+ dto.MinQty = pur.qty_min.GetValueOrDefault();
|
|
|
+ dto.diffQty = dto.MinQty > dto.SumQty ? dto.MinQty - dto.SumQty : 0;
|
|
|
+ }
|
|
|
+ wwprList.Add(dto);
|
|
|
+ }
|
|
|
+ minTime = endTime.AddDays(1);
|
|
|
+ endTime = endTime.AddDays(7);
|
|
|
+ if (endTime >= maxTime)
|
|
|
+ {
|
|
|
+ flag = false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ List<srm_pr_main> insetList = new List<srm_pr_main>();
|
|
|
+ List<srm_pr_main> updateList = new List<srm_pr_main>();
|
|
|
+ List<srm_po_occupy> occupyUptList = new List<srm_po_occupy>();
|
|
|
+ List<mes_morder> moList = new List<mes_morder>();
|
|
|
+ List<mes_moentry> moentryList = new List<mes_moentry>();
|
|
|
+ //委外数据合并加圆整
|
|
|
+ if (wwprList.Any())
|
|
|
+ {
|
|
|
+ List<string> GenerateMoList = new List<string>();
|
|
|
+ var moNbrlistDto = _serialNumberAppService.GetBillNo(domain, "PR", wwprList.Count(), "admin", 1);
|
|
|
+ long bang_id = help.NextId();
|
|
|
+ if (moNbrlistDto.Any())
|
|
|
+ {
|
|
|
+ foreach (var nbr in moNbrlistDto)
|
|
|
+ {
|
|
|
+ GenerateMoList.Add(nbr.NbrResult);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ foreach (var wwDto in wwprList)
|
|
|
+ {
|
|
|
+ //如果需要圆整,圆整数量生成虚拟工单
|
|
|
+ if (wwDto.diffQty > 0)
|
|
|
+ {
|
|
|
+ if (wwDto.icitem != null)
|
|
|
+ {
|
|
|
+ mes_morder mes_Morder = new mes_morder();
|
|
|
+ mes_Morder.GenerateNewId(help.NextId());
|
|
|
+ mes_Morder.morder_type = MorderEnum.JhMorder;
|
|
|
+ mes_Morder.work_order_type = MorderEnum.CgMorder;
|
|
|
+ mes_Morder.morder_state = "";
|
|
|
+ mes_Morder.morder_no = Guid.NewGuid().ToString();
|
|
|
+ mes_Morder.fms_number = "";
|
|
|
+ mes_Morder.bom_number = wwDto.icitem.number;
|
|
|
+ mes_Morder.fmodel = wwDto.icitem.model;
|
|
|
+ mes_Morder.moentry_startup_status = 0;
|
|
|
+ mes_Morder.tenant_id = wwDto.icitem.tenant_id;
|
|
|
+ mes_Morder.factory_id = wwDto.icitem.factory_id;
|
|
|
+ mes_Morder.company_id = wwDto.icitem.company_id;
|
|
|
+ mes_Morder.org_id = wwDto.icitem.org_id;
|
|
|
+ mes_Morder.product_code = wwDto.icitem.number;
|
|
|
+ mes_Morder.product_name = wwDto.icitem.name;
|
|
|
+ mes_Morder.morder_date = DateTime.Now.Date.AddDays(1);
|
|
|
+ mes_Morder.moentry_prd = null;
|
|
|
+ mes_Morder.moentry_prdname = null;
|
|
|
+ mes_Morder.moentry_wrkc = null;
|
|
|
+ mes_Morder.moentry_wrkcname = null;
|
|
|
+ mes_Morder.picking_qty = 0;
|
|
|
+ mes_Morder.unit = wwDto.icitem.unit;
|
|
|
+ mes_Morder.morder_production_number = wwDto.diffQty;
|
|
|
+ mes_Morder.need_number = wwDto.diffQty;
|
|
|
+ //成品半成品取周一为入库时间开始往前推
|
|
|
+ mes_Morder.moentry_sys_stime = wwDto.prList.OrderBy(x => x.pr_ssend_date).FirstOrDefault().pr_ssend_date;
|
|
|
+ //mes_Morder.moentry_sys_etime = weekTime;
|
|
|
+ mes_Morder.remaining_number = 0;
|
|
|
+ mes_Morder.create_time = DateTime.Now;
|
|
|
+ mes_Morder.bang_id = bang_id;
|
|
|
+ moList.Add(mes_Morder);
|
|
|
+ //生成工单子表数据
|
|
|
+ mes_moentry mes_Moentry = new mes_moentry();
|
|
|
+ mes_Moentry.GenerateNewId(help.NextId());
|
|
|
+ mes_Moentry.moentry_moid = mes_Morder.Id;
|
|
|
+ mes_Moentry.moentry_mono = mes_Morder.morder_no;
|
|
|
+ mes_Moentry.unit = wwDto.icitem.unit;
|
|
|
+ mes_Moentry.morder_production_number = wwDto.diffQty;
|
|
|
+ mes_Moentry.need_number = wwDto.diffQty;
|
|
|
+ mes_Moentry.remaining_number = 0;
|
|
|
+ mes_Moentry.tenant_id = wwDto.icitem.tenant_id;
|
|
|
+ mes_Moentry.factory_id = wwDto.icitem.factory_id;
|
|
|
+ mes_Moentry.company_id = wwDto.icitem.company_id;
|
|
|
+ mes_Moentry.org_id = wwDto.icitem.org_id;
|
|
|
+ mes_Moentry.create_time = DateTime.Now;
|
|
|
+ mes_Moentry.bang_id = bang_id;
|
|
|
+ moentryList.Add(mes_Moentry);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /*//如果有多条,需要合并
|
|
|
+ if (wwDto.prList.Count() > 1)
|
|
|
+ {
|
|
|
+ var first = wwDto.prList.OrderBy(x => x.pr_ssend_date).FirstOrDefault();
|
|
|
+ srm_pr_main pr = help.DeepCopy(first);
|
|
|
+ pr.GenerateNewId(help.NextId());
|
|
|
+ if (GenerateMoList.Any())
|
|
|
+ {
|
|
|
+ pr.pr_billno = GenerateMoList[0];
|
|
|
+ GenerateMoList.Remove(pr.pr_billno);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ var nbrDto = _serialNumberAppService.GetBillNo(domain, "PR", 1, "admin", 1);
|
|
|
+ if (nbrDto.Any())
|
|
|
+ {
|
|
|
+ pr.pr_billno = nbrDto[0].NbrResult;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (string.IsNullOrEmpty(pr.pr_billno))
|
|
|
+ {
|
|
|
+ pr.pr_billno = help.NextId().ToString();
|
|
|
+ }
|
|
|
+ pr.pr_sqty = wwDto.SumQty;
|
|
|
+ pr.pr_aqty = wwDto.SumQty;
|
|
|
+ pr.pr_rqty = wwDto.prList.Sum(x => x.pr_rqty.GetValueOrDefault());
|
|
|
+ pr.pr_orderprice = pr.pr_rqty * pr.pr_sysprice;//订单价格(含税)
|
|
|
+ insetList.Add(pr);
|
|
|
+ wwDto.prList.ForEach(x => { x.state = 0; });
|
|
|
+ updateList.AddRange(wwDto.prList);
|
|
|
+ var wwoccupy = occupylist.Where(x => wwDto.prList.Select(c => c.Id).Contains(x.polist_id.GetValueOrDefault())).ToList();
|
|
|
+ wwoccupy.ForEach(x => { x.polist_id = pr.Id; });
|
|
|
+ occupyUptList.AddRange(wwoccupy);
|
|
|
+ }*/
|
|
|
+ /*else
|
|
|
+ {
|
|
|
+ wwDto.prList.ForEach(x => { x.pr_sqty = wwDto.SumQty; x.pr_aqty = wwDto.SumQty; });
|
|
|
+ updateList.AddRange(wwDto.prList);
|
|
|
+ }*/
|
|
|
+ }
|
|
|
+ /*if (insetList.Any())
|
|
|
+ {
|
|
|
+ _businessDbContext.BulkInsert(insetList);
|
|
|
+ }
|
|
|
+ if (updateList.Any())
|
|
|
+ {
|
|
|
+ _businessDbContext.BulkUpdate(updateList);
|
|
|
+ }
|
|
|
+ if (occupyUptList.Any())
|
|
|
+ {
|
|
|
+ _businessDbContext.BulkUpdate(occupyUptList);
|
|
|
+ }*/
|
|
|
+ if (moList.Any())
|
|
|
+ {
|
|
|
+ var rtn = await OrderKittingCheck(moList, true, moentryList);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return "ok";
|
|
|
+ }
|
|
|
+ catch (Exception e)
|
|
|
+ {
|
|
|
+ new NLogHelper("ResourceExamineAppService").WriteLog("AutoMergeMo", "自动合并工单任务失败:" + e.Message, _currentTenant.Id.ToString());
|
|
|
+ return "保存失败,请联系管理员。";
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
public class WorkOrdDto
|
|
|
@@ -5363,4 +5576,19 @@ namespace Business.ResourceExamineManagement
|
|
|
|
|
|
public decimal SumQty { get; set; }
|
|
|
}
|
|
|
+
|
|
|
+ public class WWPRDto
|
|
|
+ {
|
|
|
+ public long itemId { get; set; }
|
|
|
+
|
|
|
+ public List<srm_pr_main> prList { get; set; } = new List<srm_pr_main>();
|
|
|
+
|
|
|
+ public ic_item icitem { get; set; }
|
|
|
+
|
|
|
+ public decimal MinQty { get; set; }
|
|
|
+
|
|
|
+ public decimal SumQty { get; set; }
|
|
|
+
|
|
|
+ public decimal diffQty { get; set; }
|
|
|
+ }
|
|
|
}
|