using Business.Core.Utilities;
using Business.EntityFrameworkCore.SqlRepositories;
using Business.Model.MES.IC;
using Business.Model.Production;
using Business.MongoModel.Production;
using Business.Quartz;
using Newtonsoft.Json;
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.TenantManagement;
namespace Business.ResourceExamineManagement
{
///
/// 生产排产接口实现类
///
public class ProdScheduleAppService : ApplicationService, IProductionScheduleAppService
{
///
/// 雪花算法帮助类
///
SnowFlake help = new SnowFlake();
///
/// 生产工单主表
///
private readonly IRepository _mysql_mes_morder;
///
/// 工艺路线表
///
private readonly ISqlRepository _routingOpDetail;
///
/// 标准BOM表
///
private readonly ISqlRepository _productStructureMaster;
///
/// 工单工序表
///
private readonly ISqlRepository _workOrdRouting;
///
/// 工单主表
///
private readonly ISqlRepository _workOrdMaster;
///
/// 工单物料明细表
///
private readonly ISqlRepository _workOrdDetail;
///
/// 生产排产
///
private readonly ProductionScheduleAppService _productionScheduleAppService;
///
/// 构造函数
///
///
public ProdScheduleAppService(
ProductionScheduleAppService productionScheduleAppService,
IRepository mysql_mes_morder,
ISqlRepository routingOpDetail,
ISqlRepository productStructureMaster,
ISqlRepository workOrdRouting,
ISqlRepository workOrdMaster,
ISqlRepository workOrdDetail
)
{
_productionScheduleAppService= productionScheduleAppService;
_mysql_mes_morder= mysql_mes_morder;
_routingOpDetail= routingOpDetail;
_productStructureMaster= productStructureMaster;
_workOrdRouting= workOrdRouting;
_workOrdMaster= workOrdMaster;
_workOrdDetail= workOrdDetail;
}
///
/// 生产排产
///
/// 工单编号
///
public async Task ProductionSchedule(List workOrds)
{
if (workOrds.Count() == 0)
{
return "";
}
//获取工单数据
var mes_morders = _mysql_mes_morder.GetListAsync(p => workOrds.Contains(p.morder_no)).Result;
CreateWorkOrdDates(mes_morders);
return JsonConvert.SerializeObject("ok");
}
///
/// 同步工单等相关数据
///
///
public void CreateWorkOrdDates(List morders)
{
//获取工艺路线数据:product_code=物料编码
List allRoutings = _routingOpDetail.Select(p => morders.Select(m => m.product_code).Contains(p.RoutingCode));
//获取标准BOM数据
List productStructures = GetProductStructure(morders.Select(p => p.product_code).ToList());
//工单主表
List workOrds = new List();
WorkOrdMaster workOrd;
//工单工艺路线表
List workOrdRoutings = new List();
WorkOrdRouting woRouting;
//工单物料表
List workOrdDetails = new List();
WorkOrdDetail woDetail;
foreach (var item in morders)
{
//添加工单数据
workOrd = new WorkOrdMaster();
workOrd.Domain = "1001";
workOrd.OrdDate = item.moentry_sys_stime;
workOrd.ReleaseDate = Convert.ToDateTime(item.moentry_sys_stime.GetValueOrDefault().ToString("u"));
workOrd.WorkOrd = item.morder_no;
workOrd.ItemNum = item.product_code;//物料编码
workOrd.QtyOrded = item.need_number.GetValueOrDefault();
workOrd.RoutingCode = item.product_code;
workOrd.Period = 1;
workOrd.Priority = item.urgent;
workOrd.Status = "";
workOrd.IsActive = true;
workOrd.IsConfirm = true;
workOrds.Add(workOrd);
//添加工单工艺路线数据
var curRoutings = allRoutings.Where(p => p.RoutingCode == item.product_code).ToList();
foreach (var dtl in curRoutings)
{
woRouting = new WorkOrdRouting();
woRouting.Domain = "1001";
woRouting.Descr = dtl.Descr;
woRouting.MilestoneOp = dtl.MilestoneOp;
woRouting.WorkOrd = item.morder_no;
woRouting.OP = dtl.Op;
woRouting.ParentOp = dtl.ParentOp;
woRouting.RunTime = dtl.RunTime;
woRouting.ItemNum = item.product_code;
woRouting.QtyOrded = item.need_number.GetValueOrDefault();
woRouting.OverlapUnits = dtl.OverlapUnits;
woRouting.Status = "";
woRouting.IsActive = true;
workOrdRoutings.Add(woRouting);
}
//添加工单物料数据
var curStructures = productStructures.Where(p => p.ParentItem == item.product_code).ToList();
foreach (var structure in curStructures)
{
//添加工单的物料信息
woDetail = new WorkOrdDetail();
woDetail.Domain = "1001";
woDetail.WorkOrd = item.morder_no;
woDetail.Op = structure.Op;
woDetail.ItemNum = structure.ComponentItem;
woDetail.QtyRequired = item.need_number.GetValueOrDefault() * structure.Qty;
woDetail.QtyPosted = 0m;
woDetail.QtyReturned = 0m;
woDetail.Status = "";
woDetail.IsActive = true;
workOrdDetails.Add(woDetail);
}
}
//await _businessDbContext.BulkInsertAsync(workOrds);
//await _businessDbContext.BulkInsertAsync(workOrdRoutings);
//await _businessDbContext.BulkInsertAsync(workOrdDetails);
_workOrdMaster.Insert(workOrds);
_workOrdRouting.Insert(workOrdRoutings);
_workOrdDetail.Insert(workOrdDetails);
//排产
_productionScheduleAppService.DoProductShcedule(workOrds);
}
///
/// 获取标准Bom数据--TODO:存在循环查询数据库问题,后续调整
///
/// 产品物料编码
///
public List GetProductStructure(List itenNums)
{
List rtnStructures = new List();
//根据itemNum获取bom数据
var productStructures = _productStructureMaster.Select(p => itenNums.Contains(p.ParentItem) && p.Domain == "1001" && p.IsActive);
//添加非虚拟件
rtnStructures.AddRange(productStructures.Where(p => p.StructureType.ToUpper() != "X").ToList());
foreach (var item in itenNums)
{
//获取当前产品的虚拟件
var curPhantoms = productStructures.Where(p => p.ParentItem == item && p.StructureType.ToUpper() == "X").ToList();
if (curPhantoms.Count() == 0)
{
continue;
}
//递归获取所有虚拟件对应的子物料
RecursionProductStructure(item, curPhantoms, rtnStructures);
}
return rtnStructures;
}
///
/// 递归获取虚拟件的子物料
///
/// 产品的物料编码
/// 当前产品的虚拟件
///
public void RecursionProductStructure(string parentItem, List structures, List rtnStructures)
{
//获取虚拟件的子物料
var chdStructures = _productStructureMaster.Select(p => structures.Select(m => m.ComponentItem).Contains(p.ParentItem) && p.Domain == "1001" && p.IsActive);
//非虚拟件
var notPhantoms = chdStructures.Where(p => p.StructureType.ToUpper() != "X").ToList();
//存在非虚拟件
if (notPhantoms.Count() > 0)
{
notPhantoms.ForEach(p =>
{
p.ParentItem = parentItem;
});
rtnStructures.AddRange(notPhantoms);
}
//虚拟件
var phantoms = chdStructures.Where(p => p.StructureType.ToUpper() == "X").ToList();
if (phantoms.Count() > 0)
{
//递归
RecursionProductStructure(parentItem, phantoms, rtnStructures);
}
}
}
}