| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- 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
- {
- /// <summary>
- /// 生产排产服务
- /// </summary>
- public class ProductionScheduleAppService : ApplicationService
- {
- /// <summary>
- /// 物料
- /// </summary>
- private IRepository<ItemMaster, long> _itemMaster;
- /// <summary>
- /// 工单
- /// </summary>
- private IRepository<WorkOrdMaster, long> _workOrdMaster;
- /// <summary>
- /// 工单物料明细
- /// </summary>
- private IRepository<WorkOrdDetail, long> _workOrdDetail;
- /// <summary>
- /// 工单工艺路线明细
- /// </summary>
- private IRepository<WorkOrdRouting, long> _workOrdRouting;
- /// <summary>
- /// 库存主数据
- /// </summary>
- private IRepository<InvMaster, long> _invMaster;
- /// <summary>
- /// 生产线明细
- /// </summary>
- private IRepository<ProdLineDetail, long> _prodLineDetail;
- /// <summary>
- /// 生产周期明细
- /// </summary>
- private IRepository<PeriodSequenceDet, long> _periodSequenceDet;
- /// <summary>
- /// 排产结果明细
- /// </summary>
- private IRepository<ScheduleResultOpMaster, long> _scheduleResultOpMaster;
- /// <summary>
- /// 构造函数
- /// </summary>
- public ProductionScheduleAppService(
- IRepository<ItemMaster, long> itemMaster,
- IRepository<WorkOrdMaster, long> workOrdMaster,
- IRepository<WorkOrdDetail, long> workOrdDetail,
- IRepository<WorkOrdRouting, long> workOrdRouting,
- IRepository<ProdLineDetail, long> prodLineDetail,
- IRepository<PeriodSequenceDet, long> periodSequenceDet,
- IRepository<ScheduleResultOpMaster, long> scheduleResultOpMaster,
- IRepository<InvMaster, long> invMaster
- )
- {
- _itemMaster= itemMaster;
- _workOrdMaster= workOrdMaster;
- _workOrdDetail= workOrdDetail;
- _workOrdRouting= workOrdRouting;
- _prodLineDetail = prodLineDetail;
- _periodSequenceDet = periodSequenceDet;
- _scheduleResultOpMaster= scheduleResultOpMaster;
- _invMaster= invMaster;
- }
- /// <summary>
- /// 执行生产排产
- /// </summary>
- public async void DoExt()
- {
- await DoProductShcedule();
- }
- /// <summary>
- /// 生产排产
- /// </summary>
- public async Task DoProductShcedule()
- {
- //1、获取需要排产的工单:Status为空且IsActive==1
- List<WorkOrdMaster> workOrds = _workOrdMaster.GetListAsync(p => string.IsNullOrEmpty(p.Status) && p.IsActive ==1).Result;
- if (workOrds.Count == 0)
- {
- return;
- }
- //2、获取数据
- //获取工单工艺路径数据
- List<WorkOrdRouting> workOrdRoutings = _workOrdRouting.GetListAsync(p => workOrds.Select(m=>m.WorkOrd).Contains(p.WorkOrd) && p.Domain == "1001" && p.Status != "C" && p.IsActive == 1).Result;
- //获取物料对应的生产线信息:物料、工序对应的生产线
- List<ProdLineDetail> prodLineDetails = _prodLineDetail.GetListAsync(p => workOrds.Select(m => m.ItemNum).Contains(p.Part) && p.Domain == "1001" && p.Status != "C" && p.IsActive == 1).Result;
- //获取当前日期往后的排产记录数据
- List<ScheduleResultOpMaster> schedules = _scheduleResultOpMaster.GetListAsync(p=>workOrds.Select(m=>m.ItemNum).Contains(p.ItemNum) && p.Domain == "1001").Result;
- //3、工序预处理
- List<WorkOrdRoutingDto> routingDtos = ProcPretreatment(workOrdRoutings);
- //3、排产
- //排产结果(记录所有工序的排产情况)
- List<ScheduleResultOpMaster> scheduleResults = new List<ScheduleResultOpMaster>();
- //生产周期(记录最后一个工序的排产情况)
- List<PeriodSequenceDet> periodsDet = new List<PeriodSequenceDet>();
- foreach (var item in workOrds)
- {
- }
-
- }
- /// <summary>
- /// 工单工艺路线预处理
- /// </summary>
- /// <param name="WoRuntings"></param>
- /// <returns></returns>
- public List<WorkOrdRoutingDto> ProcPretreatment(List<WorkOrdRouting> woRuntings)
- {
- List<WorkOrdRoutingDto> routingDtos = new List<WorkOrdRoutingDto>();
- //取主工序(第一层级工序)
- 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;
- }
- /// <summary>
- /// 递归处理工序
- /// </summary>
- /// <param name="woRuntings">工单工序</param>
- /// <param name="curLevels">上-层级工序</param>
- /// <param name="level">层级</param>
- /// <param name="routingDtos">返回结果</param>
- public void RecursionProc(List<WorkOrdRouting> woRuntings, List<WorkOrdRouting> preLevels, int level, List<WorkOrdRoutingDto> 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);
- }
- }
- }
|