|
@@ -3186,6 +3186,161 @@ namespace Business.Replenishment
|
|
|
return "OK";
|
|
return "OK";
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /// <summary>
|
|
|
|
|
+ /// 根据月度计划生成周计划
|
|
|
|
|
+ /// </summary>
|
|
|
|
|
+ /// <param name="input"></param>
|
|
|
|
|
+ /// <returns></returns>
|
|
|
|
|
+ public async Task<string> CalcTestWeekPlan(InputDto input)
|
|
|
|
|
+ {
|
|
|
|
|
+ routingOps = _routingOpDetail.Select(p => p.Domain == input.factory_id.ToString()).ToList();
|
|
|
|
|
+ long bang_id = help.NextId();
|
|
|
|
|
+ var weekplans=_replenishmentWeekPlan.GetListAsync(a=>a.IsReplenishmentModel=="N" && string.IsNullOrEmpty(a.ProductionStatus)).Result;
|
|
|
|
|
+ var itemIds = weekplans.Select(a => a.ItemNumber).Distinct().ToList();
|
|
|
|
|
+ var items = _itemMaster.Select(a => itemIds.Contains(a.ItemNum));
|
|
|
|
|
+; List<mes_morder> moList = new List<mes_morder>();
|
|
|
|
|
+ List<mes_moentry> moentryList = new List<mes_moentry>();
|
|
|
|
|
+ var morder_noList = _serialNumberAppService.GetBillNo(input.factory_id.ToString(), "M5", weekplans.Count, "", 1);
|
|
|
|
|
+
|
|
|
|
|
+ foreach (var item in weekplans)
|
|
|
|
|
+ {
|
|
|
|
|
+ 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 =item.ItemNumber;
|
|
|
|
|
+ mes_Morder.fmodel = item.Model;
|
|
|
|
|
+ mes_Morder.moentry_startup_status = 0;
|
|
|
|
|
+ mes_Morder.tenant_id = input.tenant_id;
|
|
|
|
|
+ mes_Morder.factory_id = input.factory_id;
|
|
|
|
|
+ mes_Morder.company_id = input.company_id;
|
|
|
|
|
+ mes_Morder.org_id = input.org_id;
|
|
|
|
|
+ mes_Morder.product_code = item.ItemNumber;
|
|
|
|
|
+ mes_Morder.product_name = item.ItemNumber;
|
|
|
|
|
+ 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 = items.Find(a=>a.ItemNum==item.ItemNumber).UM;
|
|
|
|
|
+ mes_Morder.morder_production_number = item.Qty;
|
|
|
|
|
+ mes_Morder.need_number = item.Qty;
|
|
|
|
|
+ //成品半成品取周一为入库时间开始往前推
|
|
|
|
|
+ mes_Morder.moentry_sys_stime =item.PlanStartDate;
|
|
|
|
|
+ mes_Morder.moentry_sys_etime =item.InStockDate;
|
|
|
|
|
+ mes_Morder.remaining_number = 0;
|
|
|
|
|
+ mes_Morder.create_time = DateTime.Now;
|
|
|
|
|
+ mes_Morder.bang_id = bang_id;
|
|
|
|
|
+ //生成工单子表数据
|
|
|
|
|
+ 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 = items.Find(a => a.ItemNum == item.ItemNumber).UM;
|
|
|
|
|
+ mes_Moentry.morder_production_number = item.Qty;
|
|
|
|
|
+ mes_Moentry.need_number = item.Qty;
|
|
|
|
|
+ mes_Moentry.remaining_number = 0;
|
|
|
|
|
+ mes_Moentry.tenant_id = input.tenant_id;
|
|
|
|
|
+ mes_Moentry.factory_id = input.factory_id;
|
|
|
|
|
+ mes_Moentry.company_id = input.company_id;
|
|
|
|
|
+ mes_Moentry.org_id = input.org_id;
|
|
|
|
|
+ mes_Moentry.create_time = DateTime.Now;
|
|
|
|
|
+ mes_Moentry.bang_id = bang_id;
|
|
|
|
|
+ moList.Add(mes_Morder);
|
|
|
|
|
+ moentryList.Add(mes_Moentry);
|
|
|
|
|
+ }
|
|
|
|
|
+ for (int i = 0; i < moList.Count; i++)
|
|
|
|
|
+ {
|
|
|
|
|
+ moList[i].morder_no = morder_noList[i].NbrResult;
|
|
|
|
|
+ moentryList[i].moentry_mono = morder_noList[i].NbrResult;
|
|
|
|
|
+ weekplans[i].ProductionOrder = morder_noList[i].NbrResult;
|
|
|
|
|
+ }
|
|
|
|
|
+ await PlanOrderResourceCheck(moList.OrderBy(a => a.moentry_sys_stime).ToList(), moentryList, bang_id, "", input);
|
|
|
|
|
+
|
|
|
|
|
+ var examine_resultList = _mysql_examine_result.GetListAsync(a => a.bangid == bang_id).Result;
|
|
|
|
|
+ await _businessDbContext.BulkInsertAsync(moList);
|
|
|
|
|
+ await _businessDbContext.BulkInsertAsync(moentryList);
|
|
|
|
|
+
|
|
|
|
|
+ //批量保存 后期考虑子工单
|
|
|
|
|
+ List<WorkOrdMaster> workOrdSave = new List<WorkOrdMaster>();
|
|
|
|
|
+ List<WorkOrdRouting> workOrdRoutingSave = new List<WorkOrdRouting>();
|
|
|
|
|
+ List<WorkOrdDetail> workOrdDetails = new List<WorkOrdDetail>();
|
|
|
|
|
+ if (moList.Any())
|
|
|
|
|
+ {
|
|
|
|
|
+ moList.ForEach(s => { s.create_time = DateTime.Now; });
|
|
|
|
|
+ List<b_bom_child_examine> childExamineList = _mysql_bom_child_examine.GetListAsync(c => examine_resultList.Select(x => x.Id).Contains(c.examine_id.GetValueOrDefault())).Result;
|
|
|
|
|
+ //同步工单
|
|
|
|
|
+ CreateWorkOrdDates(moList, routingOps, workOrdSave, workOrdRoutingSave, workOrdDetails, examine_resultList, childExamineList);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (workOrdSave.Any())
|
|
|
|
|
+ {
|
|
|
|
|
+ workOrdSave = CalcPriority(workOrdSave, input.factory_id.ToString());
|
|
|
|
|
+ _businessDbContext.BulkInsert(workOrdSave);
|
|
|
|
|
+ }
|
|
|
|
|
+ var DBworkOrdList = _workOrdMaster.Select(a => workOrdSave.Count > 0 && a.Domain == workOrdSave[0].Domain && workOrdSave.Select(c => c.WorkOrd).Contains(a.WorkOrd));
|
|
|
|
|
+ if (workOrdRoutingSave.Any())
|
|
|
|
|
+ {
|
|
|
|
|
+ workOrdRoutingSave.ForEach(c =>
|
|
|
|
|
+ {
|
|
|
|
|
+ c.WorkOrdMasterRecID = DBworkOrdList.Where(a => a.WorkOrd == c.WorkOrd).First().RecID;
|
|
|
|
|
+ });
|
|
|
|
|
+ _businessDbContext.BulkInsert(workOrdRoutingSave);
|
|
|
|
|
+ }
|
|
|
|
|
+ if (workOrdDetails.Any())
|
|
|
|
|
+ {
|
|
|
|
|
+ workOrdDetails.ForEach(c =>
|
|
|
|
|
+ {
|
|
|
|
|
+ c.WorkOrdMasterRecID = DBworkOrdList.Where(a => a.WorkOrd == c.WorkOrd).First().RecID;
|
|
|
|
|
+ });
|
|
|
|
|
+ _businessDbContext.BulkInsert(workOrdDetails);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ weekplans.ForEach(a =>
|
|
|
|
|
+ {
|
|
|
|
|
+ if (a.IsReplenishmentModel == "N")
|
|
|
|
|
+ {
|
|
|
|
|
+ var moItem = examine_resultList.Find(b => b.morder_no == a.ProductionOrder);
|
|
|
|
|
+ List<RoutingOpDetail> routingOp = routingOps.Where(x => x.RoutingCode == a.ItemNumber).ToList();
|
|
|
|
|
+ //组装标准工时
|
|
|
|
|
+ var Assembly = routingOp.Where(x => x.Ufld1 == "组装" && x.MilestoneOp).FirstOrDefault();
|
|
|
|
|
+ //热封标准工时
|
|
|
|
|
+ var HeatSealing = routingOp.Where(x => x.Ufld1 == "热封" && x.MilestoneOp).FirstOrDefault();
|
|
|
|
|
+ //包装标准工时
|
|
|
|
|
+ var Packaging = routingOp.Where(x => x.Descr == "包装" && x.MilestoneOp).FirstOrDefault();
|
|
|
|
|
+ if (moItem != null && moItem.kitting_times < a.PlanStartDate)
|
|
|
|
|
+ {
|
|
|
|
|
+ a.ItemStatus = "齐套";
|
|
|
|
|
+ a.PlanKittingDate = moItem.kitting_times;
|
|
|
|
|
+ a.AssembleHours = Assembly == null ? 0 : Assembly.RunTime * a.Qty;
|
|
|
|
|
+ a.HeatSealHours = HeatSealing == null ? 0 : HeatSealing.RunTime * a.Qty;
|
|
|
|
|
+ a.PackageHours = Packaging == null ? 0 : Packaging.RunTime * a.Qty;
|
|
|
|
|
+ a.TotalHours = a.AssembleHours + a.HeatSealHours + a.PackageHours;
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ a.ItemStatus = "欠料";
|
|
|
|
|
+ a.PlanKittingDate = moItem.kitting_times;
|
|
|
|
|
+ a.AssembleHours = Assembly == null ? 0 : Assembly.RunTime * a.Qty;
|
|
|
|
|
+ a.HeatSealHours = HeatSealing == null ? 0 : HeatSealing.RunTime * a.Qty;
|
|
|
|
|
+ a.PackageHours = Packaging == null ? 0 : Packaging.RunTime * a.Qty;
|
|
|
|
|
+ a.TotalHours = a.AssembleHours + a.HeatSealHours + a.PackageHours;
|
|
|
|
|
+ }
|
|
|
|
|
+ var workOrd = workOrdSave.Find(b => b.WorkOrd == a.ProductionOrder);
|
|
|
|
|
+ if (workOrd != null)
|
|
|
|
|
+ {
|
|
|
|
|
+ a.Priority = workOrd.Priority;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+ await _businessDbContext.BulkUpdateAsync(weekplans);
|
|
|
|
|
+ return "OK";
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
private DateTime GetNextMonday()
|
|
private DateTime GetNextMonday()
|
|
|
{
|
|
{
|
|
|
var preSunday = DateTime.Now.AddDays(0 - (int)DateTime.Now.DayOfWeek);//上周日
|
|
var preSunday = DateTime.Now.AddDays(0 - (int)DateTime.Now.DayOfWeek);//上周日
|