|
|
@@ -7667,6 +7667,281 @@ namespace Business.ResourceExamineManagement
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ public async Task<string> WorkOrdUpdateByNo(string workord, string qty, string instockdate, string priority, string domain, string userAccount, string LotSerial = null)
|
|
|
+ {
|
|
|
+ if (string.IsNullOrEmpty(qty))
|
|
|
+ return "数量不正确,请检查";
|
|
|
+ if (string.IsNullOrEmpty(instockdate))
|
|
|
+ return "工单开工日期不正确,请检查";
|
|
|
+ if (string.IsNullOrEmpty(priority))
|
|
|
+ return "优先级不正确,请检查";
|
|
|
+ if (string.IsNullOrEmpty(workord))
|
|
|
+ return "工单号为空,请检查";
|
|
|
+ try
|
|
|
+ {
|
|
|
+ //先执行工单数量、优先级、开工日期、完工日期的修改
|
|
|
+ decimal newpriority = Convert.ToDecimal(priority);
|
|
|
+ DateTime newinstockdate = Convert.ToDateTime(instockdate);
|
|
|
+ decimal newqty = Convert.ToDecimal(qty);
|
|
|
+ WorkOrdMaster work = null;
|
|
|
+ var workords = _workOrdMaster.Select(x => x.WorkOrd == workord && x.tenant_id.ToString() == domain).ToList();
|
|
|
+ if (workords.Any())
|
|
|
+ {
|
|
|
+ work = workords[0];
|
|
|
+ }
|
|
|
+ if (work == null)
|
|
|
+ return "未查找到对应工单,请刷新界面重试。";
|
|
|
+
|
|
|
+ TimeSpan difference = newinstockdate.Subtract(work.OrdDate.GetValueOrDefault());
|
|
|
+ int daysDifference = difference.Days;
|
|
|
+ work.OrdDate = newinstockdate;
|
|
|
+ work.QtyOrded = newqty;
|
|
|
+ work.Priority = newpriority;
|
|
|
+ if (!string.IsNullOrEmpty(LotSerial))
|
|
|
+ {
|
|
|
+ work.LotSerial = LotSerial;
|
|
|
+ }
|
|
|
+ work.DueDate = work.DueDate.GetValueOrDefault().AddDays(daysDifference);
|
|
|
+ var molist = _mysql_mes_morder.GetListAsync(x => x.morder_no == work.WorkOrd && x.tenant_id.ToString() == domain).Result;
|
|
|
+ var moentryList = _mysql_mes_moentry.GetListAsync(x => x.moentry_mono == work.WorkOrd && x.tenant_id.ToString() == domain).Result;
|
|
|
+ var workRoutings = _workOrdRouting.Select(a => a.WorkOrd == work.WorkOrd && a.tenant_id.ToString() == domain);
|
|
|
+ var workDetails = _workOrdDetail.Select(a => a.WorkOrd == work.WorkOrd && a.tenant_id.ToString() == domain);
|
|
|
+ var weekplans = _replenishmentWeekPlan.GetListAsync(w => w.ProductionOrder == work.WorkOrd && w.tenant_id.ToString() == domain).Result;
|
|
|
+ if (molist.Any())
|
|
|
+ {
|
|
|
+ molist.ForEach(x =>
|
|
|
+ {
|
|
|
+ x.morder_production_number = newqty;
|
|
|
+ x.need_number = newqty;
|
|
|
+ x.moentry_sys_stime = work.OrdDate;
|
|
|
+ x.moentry_sys_etime = work.DueDate;
|
|
|
+ x.update_time = DateTime.Now;
|
|
|
+ x.update_by_name = userAccount;
|
|
|
+ });
|
|
|
+ //_businessDbContext.BulkUpdate(molist);
|
|
|
+ moentryList.ForEach(x =>
|
|
|
+ {
|
|
|
+ x.morder_production_number = newqty;
|
|
|
+ x.need_number = newqty;
|
|
|
+ x.update_time = DateTime.Now;
|
|
|
+ x.update_by_name = userAccount;
|
|
|
+ });
|
|
|
+ }
|
|
|
+ if (!molist.Any())
|
|
|
+ return "未查找到对应工单,请刷新界面重试。";
|
|
|
+ if (weekplans.Any())
|
|
|
+ {
|
|
|
+ weekplans.ForEach(x =>
|
|
|
+ {
|
|
|
+ x.Qty = newqty;
|
|
|
+ x.InStockDate = work.DueDate;
|
|
|
+ x.PlanStartDate = work.OrdDate;
|
|
|
+ if (!string.IsNullOrEmpty(LotSerial))
|
|
|
+ {
|
|
|
+ x.ProductionBatch = work.LotSerial;
|
|
|
+ }
|
|
|
+ x.update_time = DateTime.Now;
|
|
|
+ x.update_by_name = userAccount;
|
|
|
+ });
|
|
|
+ }
|
|
|
+ //再执行工单的MRP,更新工单物料明细
|
|
|
+ //_workOrdMaster.Update(work);
|
|
|
+ if (workRoutings.Any())
|
|
|
+ {
|
|
|
+ workRoutings.ForEach(a =>
|
|
|
+ {
|
|
|
+ a.QtyOrded = newqty;
|
|
|
+ a.UpdateTime = DateTime.Now;
|
|
|
+ a.UpdateUser = userAccount;
|
|
|
+ });
|
|
|
+ //_workOrdRouting.Update(workRoutings);
|
|
|
+ }
|
|
|
+
|
|
|
+ //获取BOM用于分解到原材料
|
|
|
+ var boms = _mysql_ic_bom.GetListAsync(a => work.ItemNum == a.item_number && a.tenant_id.ToString() == domain).Result;
|
|
|
+ var pretreatments = _mysql_b_bom_pretreatment.GetListAsync(s => boms.Select(c => c.Id).ToList().Contains(s.sourceid)).Result;
|
|
|
+ if (boms == null || !boms.Any())
|
|
|
+ {
|
|
|
+ return "未查询到bom";
|
|
|
+ }
|
|
|
+ var pretreament = pretreatments.Where(c => c.sourceid == boms[0].Id).ToList();
|
|
|
+ var returnlist = ObjectMapper.Map<List<b_bom_pretreatment>, List<BomChildExamineDto>>(pretreament);
|
|
|
+ returnlist = returnlist.OrderBy(s => s.num_order).ToList();
|
|
|
+ returnlist[0].needCount = newqty;
|
|
|
+ CaclMaterialShortageNew(returnlist);
|
|
|
+ returnlist = returnlist.Where(x => x.erp_cls != 4 && x.level != 1).ToList();
|
|
|
+ List<WorkOrdDetail> workOrdDetails = new List<WorkOrdDetail>();
|
|
|
+ if (returnlist.Any())
|
|
|
+ {
|
|
|
+ for (int i = 0; i < workDetails.Count; i++)
|
|
|
+ {
|
|
|
+ var curitem = returnlist.Where(x => x.item_number == workDetails[i].ItemNum).ToList();
|
|
|
+ if (curitem.Any())
|
|
|
+ {
|
|
|
+ workDetails[i].QtyRequired = curitem.Sum(x => x.needCount);
|
|
|
+ workDetails[i].UpdateTime = DateTime.Now;
|
|
|
+ workDetails[i].UpdateUser = userAccount;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //补充物料明细信息
|
|
|
+ //WorkOrdDetail woDetail = null;
|
|
|
+ //var calereturnList = returnlist.OrderBy(c => c.item_number).Select(x => x.item_number).Distinct().ToList();
|
|
|
+ ////获取物料主数据
|
|
|
+ //List<ItemMaster> itemMasters = _itemMaster.Select(p => p.Domain == param.factoryId.ToString()).ToList();
|
|
|
+
|
|
|
+ //short num = 1;
|
|
|
+ //foreach (var caleNumber in calereturnList)
|
|
|
+ //{
|
|
|
+ // var caleList = returnlist.Where(x => x.item_number == caleNumber).ToList();
|
|
|
+ // var curitem = workDetails.Where(x => x.ItemNum == caleNumber).ToList();
|
|
|
+ // if (curitem.Any())
|
|
|
+ // {
|
|
|
+ // curitem[0].Line = num;
|
|
|
+ // curitem[0].QtyRequired = caleList.Sum(x => x.needCount);
|
|
|
+ // curitem[0].UpdateTime = DateTime.Now;
|
|
|
+ // curitem[0].UpdateUser = userAccount;
|
|
|
+ // num++;
|
|
|
+ // }
|
|
|
+ // else
|
|
|
+ // {
|
|
|
+ // var itemMst = itemMasters.Find(x => x.ItemNum == caleNumber);
|
|
|
+ // //添加工单的物料信息
|
|
|
+ // woDetail = new WorkOrdDetail();
|
|
|
+ // woDetail.Domain = work.Domain;
|
|
|
+ // woDetail.WorkOrd = work.WorkOrd;
|
|
|
+ // var oplist = caleList.Where(x => x.Op > 0).ToList();
|
|
|
+ // woDetail.Op = 0;
|
|
|
+ // if (oplist.Any())
|
|
|
+ // {
|
|
|
+ // woDetail.Op = oplist.Min(f => f.Op);
|
|
|
+ // }
|
|
|
+ // woDetail.ItemNum = caleNumber;
|
|
|
+ // woDetail.QtyPosted = 0m;
|
|
|
+ // woDetail.QtyReturned = 0m;
|
|
|
+ // woDetail.Status = "";
|
|
|
+ // woDetail.IsActive = true;
|
|
|
+ // woDetail.CreateTime = DateTime.Now;
|
|
|
+ // woDetail.Line = num;
|
|
|
+ // woDetail.QtyRequired = caleList.Sum(c => c.needCount);
|
|
|
+ // woDetail.Location = itemMst == null ? "" : itemMst.Location;
|
|
|
+ // woDetail.UM = itemMst == null ? "" : itemMst.UM;
|
|
|
+ // if (work.QtyOrded != 0)
|
|
|
+ // {
|
|
|
+ // woDetail.FrozenBOMQty = Math.Round(woDetail.QtyRequired / work.QtyOrded, 10);
|
|
|
+ // }
|
|
|
+ // workOrdDetails.Add(woDetail);
|
|
|
+ // num++;
|
|
|
+ // }
|
|
|
+ //}
|
|
|
+ }
|
|
|
+ var nbrList = _nbrMaster.Select(x => x.tenant_id.ToString() == domain && x.WorkOrd == workord && x.Type == "SM").ToList();
|
|
|
+ var nbrDtlList = _nbrDetail.Select(x => nbrList.Select(c => c.RecID).Contains(x.NbrRecID) && x.IsActive).ToList();
|
|
|
+ if (nbrList.Any())
|
|
|
+ {
|
|
|
+ nbrList.ForEach(x =>
|
|
|
+ {
|
|
|
+ x.Status = "";
|
|
|
+ });
|
|
|
+
|
|
|
+ if (nbrDtlList.Any())
|
|
|
+ {
|
|
|
+ nbrDtlList.ForEach(x =>
|
|
|
+ {
|
|
|
+ var itemnum = workDetails.Find(w => w.ItemNum == x.ItemNum);
|
|
|
+ //仅修改大于已发数的领料明细
|
|
|
+ x.Status = itemnum == null ? x.Status : (itemnum.QtyRequired > x.QtyRec ? "" : x.Status);
|
|
|
+ x.QtyOrd = itemnum == null ? x.QtyOrd : (itemnum.QtyRequired > x.QtyRec ? itemnum.QtyRequired : x.QtyOrd);
|
|
|
+ x.CurrQtyOpened = itemnum == null ? x.QtyOrd : (itemnum.QtyRequired > x.QtyRec ? itemnum.QtyRequired : x.QtyOrd);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ using (var unitOfWork = _unitOfWorkManager.Begin(false, true))
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ //批量保存 后期考虑子工单
|
|
|
+ if (molist.Any())
|
|
|
+ {
|
|
|
+ _businessDbContext.UpdateRange(molist);
|
|
|
+ if (workords.Any())
|
|
|
+ {
|
|
|
+ _workOrdMaster.Update(work);
|
|
|
+ }
|
|
|
+ if (workRoutings.Any())
|
|
|
+ {
|
|
|
+ _workOrdRouting.Update(workRoutings);
|
|
|
+ }
|
|
|
+ if (workDetails.Any())
|
|
|
+ {
|
|
|
+ _workOrdDetail.Update(workDetails);
|
|
|
+ }
|
|
|
+ if (workOrdDetails.Any())
|
|
|
+ {
|
|
|
+ _workOrdDetail.Insert(workOrdDetails);
|
|
|
+ }
|
|
|
+ if (moentryList.Any())
|
|
|
+ {
|
|
|
+ _businessDbContext.UpdateRange(moentryList);
|
|
|
+ }
|
|
|
+ if (nbrList.Any())
|
|
|
+ {
|
|
|
+ _businessDbContext.UpdateRange(nbrList);
|
|
|
+ }
|
|
|
+ if (nbrDtlList.Any())
|
|
|
+ {
|
|
|
+ _businessDbContext.UpdateRange(nbrDtlList);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (weekplans.Any())
|
|
|
+ {
|
|
|
+ _businessDbContext.UpdateRange(weekplans);
|
|
|
+ }
|
|
|
+ await _businessDbContext.SaveChangesAsync();
|
|
|
+ await unitOfWork.CompleteAsync();
|
|
|
+ }
|
|
|
+ catch (Exception e)
|
|
|
+ {
|
|
|
+ unitOfWork.Dispose();
|
|
|
+ new NLogHelper("ResourceExamineAppService").WriteLog("WorkOrdUpdateByNo", "修改计划工单失败:" + e.Message, _currentTenant.Id.ToString());
|
|
|
+ return e.Message;
|
|
|
+ }
|
|
|
+ ;
|
|
|
+ }
|
|
|
+ return "ok";
|
|
|
+ }
|
|
|
+ catch (Exception e)
|
|
|
+ {
|
|
|
+ new NLogHelper("ResourceExamineAppService").WriteLog("WorkOrdUpdateByNo", "修改计划工单失败:" + e.Message, _currentTenant.Id.ToString());
|
|
|
+ return e.Message;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 平铺计算物料情况
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="returnlist"></param>
|
|
|
+ /// <param name="item"></param>
|
|
|
+ /// <param name="count"></param>
|
|
|
+ public void CaclMaterialShortageNew(List<BomChildExamineDto> returnlist)
|
|
|
+ {
|
|
|
+ foreach (var item in returnlist)
|
|
|
+ {
|
|
|
+ if (item.level == 1)
|
|
|
+ {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ //循环平铺整个资源检查的物料库存情况、缺料情况,子集缺料需要用父级缺料*子集使用数量-
|
|
|
+ var parent = returnlist.Find(s => s.fid == item.parent_id);
|
|
|
+ if (parent.erp_cls == 1 && parent.level != 1)
|
|
|
+ {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ //当前物料总共需要数量
|
|
|
+ item.needCount = Math.Ceiling(parent.needCount * item.qty * (1 + (item.scrap.GetValueOrDefault() / 100)) + item.wastage.GetValueOrDefault());
|
|
|
+ item.needCountNoloss = parent.needCount * item.qty;
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
|
|
|
/// <summary>
|