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);
}
}
}