using Business.Business.Dto; using Bussiness.Model.MES.IC; using Bussiness.Model.Production; using Bussiness.Model.SRM; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Volo.Abp.Application.Services; using Volo.Abp.Domain.Repositories; using Volo.Abp.Validation.Localization; namespace Business.Quartz { /// /// 生产排产服务 /// public class ProductionScheduleAppService : ApplicationService { /// /// 物料 /// private IRepository _itemMaster; /// /// 工单 /// private IRepository _workOrdMaster; /// /// 工单物料明细 /// private IRepository _workOrdDetail; /// /// 工单工艺路线明细 /// private IRepository _workOrdRouting; /// /// 库存主数据 /// private IRepository _invMaster; /// /// 生产线明细 /// private IRepository _prodLineDetail; /// /// 生产周期明细 /// private IRepository _periodSequenceDet; /// /// 排产结果明细 /// private IRepository _scheduleResultOpMaster; /// /// 构造函数 /// public ProductionScheduleAppService( IRepository itemMaster, IRepository workOrdMaster, IRepository workOrdDetail, IRepository workOrdRouting, IRepository prodLineDetail, IRepository periodSequenceDet, IRepository scheduleResultOpMaster, IRepository invMaster ) { _itemMaster= itemMaster; _workOrdMaster= workOrdMaster; _workOrdDetail= workOrdDetail; _workOrdRouting= workOrdRouting; _prodLineDetail = prodLineDetail; _periodSequenceDet = periodSequenceDet; _scheduleResultOpMaster= scheduleResultOpMaster; _invMaster= invMaster; } /// /// 执行生产排产 /// public async void DoExt() { await DoProductShcedule(); } /// /// 生产排产 /// public async Task DoProductShcedule() { //1、获取需要排产的工单:Status为空且IsActive==1 List workOrds = _workOrdMaster.GetListAsync(p => string.IsNullOrEmpty(p.Status) && p.IsActive ==1).Result; if (workOrds.Count == 0) { return; } //2、获取数据 //获取工单工艺路径数据 List workOrdRoutings = _workOrdRouting.GetListAsync(p => workOrds.Select(m=>m.WorkOrd).Contains(p.WorkOrd) && p.Domain == "1001" && p.Status != "C" && p.IsActive == 1).Result; //获取物料对应的生产线信息:物料、工序对应的生产线 List prodLineDetails = _prodLineDetail.GetListAsync(p => workOrds.Select(m => m.ItemNum).Contains(p.Part) && p.Domain == "1001" && p.Status != "C" && p.IsActive == 1).Result; //获取当前日期往后的排产记录数据 List schedules = _scheduleResultOpMaster.GetListAsync(p=>workOrds.Select(m=>m.ItemNum).Contains(p.ItemNum) && p.Domain == "1001").Result; //3、工序预处理 List routingDtos = ProcPretreatment(workOrdRoutings); //3、排产 //排产结果(记录所有工序的排产情况) List scheduleResults = new List(); //生产周期(记录最后一个工序的排产情况) List periodsDet = new List(); foreach (var item in workOrds) { } } /// /// 工单工艺路线预处理 /// /// /// public List ProcPretreatment(List woRuntings) { List routingDtos = new List(); //取主工序(第一层级工序) var firsts = woRuntings.Where(p=>p.ParentOp == 0).ToList(); if (firsts.Count == 0) { return routingDtos; } WorkOrdRoutingDto dto; foreach (var item in firsts) { dto = new WorkOrdRoutingDto(); dto.Op = item.OP; dto.ParentOp= item.ParentOp; dto.level = 1; dto.RunTime = item.RunTime; routingDtos.Add(dto); } //递归处理其他层级工序 RecursionProc(woRuntings, firsts, 1, routingDtos); return routingDtos; } /// /// 递归处理工序 /// /// 工单工序 /// 上-层级工序 /// 层级 /// 返回结果 public void RecursionProc(List woRuntings, List preLevels, int level, List routingDtos) { //获取当前层级工序 var curLevels = woRuntings.Where(p => preLevels.Select(m=>m.OP).Contains(p.ParentOp)).ToList(); if (curLevels.Count() == 0) { return; } foreach (var item in curLevels) { var dto = new WorkOrdRoutingDto(); dto.Op = item.OP; dto.ParentOp = item.ParentOp; dto.level = level + 1; dto.RunTime = item.RunTime; routingDtos.Add(dto); } RecursionProc(woRuntings, curLevels, level + 1, routingDtos); } } }