|
@@ -1,5 +1,6 @@
|
|
|
using Business.Core.Enum;
|
|
using Business.Core.Enum;
|
|
|
using Business.Core.MongoDBHelper;
|
|
using Business.Core.MongoDBHelper;
|
|
|
|
|
+using Business.Core.Utilities;
|
|
|
using Business.ResourceExamineManagement.Dto;
|
|
using Business.ResourceExamineManagement.Dto;
|
|
|
using Bussiness.Model.MES.IC;
|
|
using Bussiness.Model.MES.IC;
|
|
|
using Bussiness.Model.Production;
|
|
using Bussiness.Model.Production;
|
|
@@ -26,16 +27,16 @@ namespace Business.ResourceExamineManagement
|
|
|
/// <summary>
|
|
/// <summary>
|
|
|
/// 生产工单主表
|
|
/// 生产工单主表
|
|
|
/// </summary>
|
|
/// </summary>
|
|
|
- private readonly IMongoDB<mes_morder> _mes_morder;
|
|
|
|
|
|
|
+ private readonly IMongoDB<mo_mes_morder> _mo_mes_morder;
|
|
|
/// <summary>
|
|
/// <summary>
|
|
|
/// 生产工单子表
|
|
/// 生产工单子表
|
|
|
/// </summary>
|
|
/// </summary>
|
|
|
- private readonly IMongoDB<mes_moentry> _mes_moentry;
|
|
|
|
|
|
|
+ private readonly IMongoDB<mo_mes_moentry> _mo_mes_moentry;
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// <summary>
|
|
|
/// 在制工单占用记录表
|
|
/// 在制工单占用记录表
|
|
|
/// </summary>
|
|
/// </summary>
|
|
|
- private readonly IMongoDB<mes_mooccupy> _mes_mooccupy;
|
|
|
|
|
|
|
+ private readonly IMongoDB<mo_mes_mooccupy> _mo_mes_mooccupy;
|
|
|
/// <summary>
|
|
/// <summary>
|
|
|
/// 销售订单
|
|
/// 销售订单
|
|
|
/// </summary>
|
|
/// </summary>
|
|
@@ -48,6 +49,10 @@ namespace Business.ResourceExamineManagement
|
|
|
/// 产能检查
|
|
/// 产能检查
|
|
|
/// </summary>
|
|
/// </summary>
|
|
|
private readonly ProductExamineAppService _productExamineAppService;
|
|
private readonly ProductExamineAppService _productExamineAppService;
|
|
|
|
|
+ /// <summary>
|
|
|
|
|
+ /// 雪花算法
|
|
|
|
|
+ /// </summary>
|
|
|
|
|
+ SnowFlake snowFlake = new SnowFlake();
|
|
|
|
|
|
|
|
#endregion
|
|
#endregion
|
|
|
#region 构造函数
|
|
#region 构造函数
|
|
@@ -57,18 +62,18 @@ namespace Business.ResourceExamineManagement
|
|
|
/// <param name="icitem"></param>
|
|
/// <param name="icitem"></param>
|
|
|
/// <param name="icbom"></param>
|
|
/// <param name="icbom"></param>
|
|
|
public MorderAppService(
|
|
public MorderAppService(
|
|
|
- IMongoDB<mes_morder> mes_morder,
|
|
|
|
|
- IMongoDB<mes_moentry> mes_moentry,
|
|
|
|
|
- IMongoDB<mes_mooccupy> mes_mooccupy,
|
|
|
|
|
|
|
+ IMongoDB<mo_mes_morder> mo_mes_morder,
|
|
|
|
|
+ IMongoDB<mo_mes_moentry> mo_mes_moentry,
|
|
|
|
|
+ IMongoDB<mo_mes_mooccupy> mo_mes_mooccupy,
|
|
|
IRepository<crm_seorder, long> mysql_crm_seorder,
|
|
IRepository<crm_seorder, long> mysql_crm_seorder,
|
|
|
IRepository<crm_seorderentry, long> mysql_crm_seorderentry,
|
|
IRepository<crm_seorderentry, long> mysql_crm_seorderentry,
|
|
|
ProductExamineAppService productExamineAppService
|
|
ProductExamineAppService productExamineAppService
|
|
|
)
|
|
)
|
|
|
{
|
|
{
|
|
|
|
|
|
|
|
- _mes_morder = mes_morder;
|
|
|
|
|
- _mes_moentry = mes_moentry;
|
|
|
|
|
- _mes_mooccupy = mes_mooccupy;
|
|
|
|
|
|
|
+ _mo_mes_morder = mo_mes_morder;
|
|
|
|
|
+ _mo_mes_moentry = mo_mes_moentry;
|
|
|
|
|
+ _mo_mes_mooccupy = mo_mes_mooccupy;
|
|
|
_mysql_crm_seorder = mysql_crm_seorder;
|
|
_mysql_crm_seorder = mysql_crm_seorder;
|
|
|
_mysql_crm_seorderentry = mysql_crm_seorderentry;
|
|
_mysql_crm_seorderentry = mysql_crm_seorderentry;
|
|
|
_productExamineAppService = productExamineAppService;
|
|
_productExamineAppService = productExamineAppService;
|
|
@@ -95,7 +100,8 @@ namespace Business.ResourceExamineManagement
|
|
|
var seorder = _mysql_crm_seorder.FindAsync(x => x.Id == generateMorderDto.seorderentry.seorder_id).Result;
|
|
var seorder = _mysql_crm_seorder.FindAsync(x => x.Id == generateMorderDto.seorderentry.seorder_id).Result;
|
|
|
|
|
|
|
|
mo_mes_morder mes_Morder = new mo_mes_morder();
|
|
mo_mes_morder mes_Morder = new mo_mes_morder();
|
|
|
- mes_Morder.GenerateNewId();
|
|
|
|
|
|
|
+ mes_Morder.mysql_id = snowFlake.NextId();
|
|
|
|
|
+ mes_Morder.bang_id = generateMorderDto.bang_id;
|
|
|
mes_Morder.morder_type = generateMorderDto.morder_type;
|
|
mes_Morder.morder_type = generateMorderDto.morder_type;
|
|
|
mes_Morder.parent_id = generateMorderDto.ParentId;
|
|
mes_Morder.parent_id = generateMorderDto.ParentId;
|
|
|
//mes_Morder.morder_icitem_type
|
|
//mes_Morder.morder_icitem_type
|
|
@@ -150,9 +156,10 @@ namespace Business.ResourceExamineManagement
|
|
|
mes_Morder.need_number = generateMorderDto.Quantity;
|
|
mes_Morder.need_number = generateMorderDto.Quantity;
|
|
|
mes_Morder.remaining_number = 0;
|
|
mes_Morder.remaining_number = 0;
|
|
|
//生成工单子表数据
|
|
//生成工单子表数据
|
|
|
- mes_moentry mes_Moentry = new mes_moentry();
|
|
|
|
|
- mes_Moentry.GenerateNewId();
|
|
|
|
|
- mes_Moentry.moentry_moid = mes_Morder.Id;
|
|
|
|
|
|
|
+ mo_mes_moentry mes_Moentry = new mo_mes_moentry();
|
|
|
|
|
+ mes_Moentry.mysql_id = snowFlake.NextId();
|
|
|
|
|
+ mes_Moentry.bang_id = generateMorderDto.bang_id;
|
|
|
|
|
+ mes_Moentry.moentry_moid = mes_Morder.mysql_id;
|
|
|
mes_Moentry.moentry_mono = mes_Morder.morder_no;
|
|
mes_Moentry.moentry_mono = mes_Morder.morder_no;
|
|
|
mes_Moentry.soentry_id = generateMorderDto.seorderentry.Id;
|
|
mes_Moentry.soentry_id = generateMorderDto.seorderentry.Id;
|
|
|
mes_Moentry.fbill_no = generateMorderDto.seorderentry.bill_no;
|
|
mes_Moentry.fbill_no = generateMorderDto.seorderentry.bill_no;
|
|
@@ -187,7 +194,7 @@ namespace Business.ResourceExamineManagement
|
|
|
/// <param name="DeliverDate">交付日期</param>
|
|
/// <param name="DeliverDate">交付日期</param>
|
|
|
/// <param name="seorderentry_id">销售订单子表ID</param>
|
|
/// <param name="seorderentry_id">销售订单子表ID</param>
|
|
|
/// <returns></returns>
|
|
/// <returns></returns>
|
|
|
- public async Task<List<mo_mes_mooccupy>> CheckMorder(string bomNumber, decimal Quantity, DateTime DeliverDate, mo_crm_seorderentry seorderentry, mo_ic_item ic_Item, bool flag = true)
|
|
|
|
|
|
|
+ public async Task<List<mo_mes_mooccupy>> CheckMorder(string bomNumber, decimal Quantity, DateTime DeliverDate, crm_seorderentry seorderentry, mo_ic_item ic_Item, long bang_id, bool flag = true)
|
|
|
{
|
|
{
|
|
|
if (string.IsNullOrEmpty(bomNumber))
|
|
if (string.IsNullOrEmpty(bomNumber))
|
|
|
{
|
|
{
|
|
@@ -199,21 +206,21 @@ namespace Business.ResourceExamineManagement
|
|
|
//var seorderentry = await _mysql_crm_seorderentry.FindAsync(x => x.Id == seorderentry_id);
|
|
//var seorderentry = await _mysql_crm_seorderentry.FindAsync(x => x.Id == seorderentry_id);
|
|
|
//根据Bom编码查询出对应工单并且状态不为完成、关闭,非委外工单。
|
|
//根据Bom编码查询出对应工单并且状态不为完成、关闭,非委外工单。
|
|
|
//TODO:工单类型;
|
|
//TODO:工单类型;
|
|
|
- var morderList = await _mes_morder.GetManyByCondition(x => x.bom_number == bomNumber && (x.morder_state != MorderEnum.Accomplish_state || x.morder_state != MorderEnum.Close_state
|
|
|
|
|
|
|
+ var morderList = await _mo_mes_morder.GetManyByCondition(x => x.bom_number == bomNumber && (x.morder_state != MorderEnum.Accomplish_state || x.morder_state != MorderEnum.Close_state
|
|
|
&& x.morder_icitem_type != MorderEnum.XgwyMorder) && !x.IsDeleted && x.tenant_id == seorderentry.tenant_id);
|
|
&& x.morder_icitem_type != MorderEnum.XgwyMorder) && !x.IsDeleted && x.tenant_id == seorderentry.tenant_id);
|
|
|
|
|
|
|
|
//获取物料详情
|
|
//获取物料详情
|
|
|
//var ic_item = _ic_item.GetManyByCondition(x => x.number == seorderentry.item_number && x.tenant_id == seorderentry.tenant_id).Result.FirstOrDefault();
|
|
//var ic_item = _ic_item.GetManyByCondition(x => x.number == seorderentry.item_number && x.tenant_id == seorderentry.tenant_id).Result.FirstOrDefault();
|
|
|
|
|
|
|
|
//工单已被占用后要与占用表关联查询...减去占用量后 剩下生产数量可供下个销售工单使用。
|
|
//工单已被占用后要与占用表关联查询...减去占用量后 剩下生产数量可供下个销售工单使用。
|
|
|
- var mes_mooccupyList = await _mes_mooccupy.GetManyByCondition(x => x.moo_state == 1 && !x.IsDeleted && x.tenant_id == seorderentry.tenant_id
|
|
|
|
|
|
|
+ var mes_mooccupyList = await _mo_mes_mooccupy.GetManyByCondition(x => x.moo_state == 1 && !x.IsDeleted && x.tenant_id == seorderentry.tenant_id
|
|
|
&& x.fitem_number == ic_Item.number);
|
|
&& x.fitem_number == ic_Item.number);
|
|
|
|
|
|
|
|
//首先满足需求数量工单其次判断是否满足交付日期、当数量不满足时继续查找最早交付日期订单 工单数量累加。
|
|
//首先满足需求数量工单其次判断是否满足交付日期、当数量不满足时继续查找最早交付日期订单 工单数量累加。
|
|
|
//当前工单计划日期-1天 小于交付日期 && 计算生产数量-入库数据并且大于需求产品数量。
|
|
//当前工单计划日期-1天 小于交付日期 && 计算生产数量-入库数据并且大于需求产品数量。
|
|
|
var morderDataList = morderList.Where(x => x.moentry_sys_etime.GetValueOrDefault().AddDays(-1) < DeliverDate &&
|
|
var morderDataList = morderList.Where(x => x.moentry_sys_etime.GetValueOrDefault().AddDays(-1) < DeliverDate &&
|
|
|
(x.morder_production_number - x.inventory_number) > Quantity).OrderByDescending(x => x.planner_end_date).ToList();
|
|
(x.morder_production_number - x.inventory_number) > Quantity).OrderByDescending(x => x.planner_end_date).ToList();
|
|
|
- List<mes_mooccupy> mes_Mooccupies = new List<mes_mooccupy>();
|
|
|
|
|
|
|
+ List<mo_mes_mooccupy> mes_Mooccupies = new List<mo_mes_mooccupy>();
|
|
|
//当数量或日期不满足的时候,寻找最早日期的工单
|
|
//当数量或日期不满足的时候,寻找最早日期的工单
|
|
|
if (morderDataList.Count == 0)
|
|
if (morderDataList.Count == 0)
|
|
|
{
|
|
{
|
|
@@ -224,7 +231,7 @@ namespace Business.ResourceExamineManagement
|
|
|
foreach (var item in morderDataList)
|
|
foreach (var item in morderDataList)
|
|
|
{
|
|
{
|
|
|
//查询当前工单是否存在占用情况
|
|
//查询当前工单是否存在占用情况
|
|
|
- var mooccupies = mes_mooccupyList.Where(x => x.moo_moid == item.Id).ToList();
|
|
|
|
|
|
|
+ var mooccupies = mes_mooccupyList.Where(x => x.moo_moid == item.mysql_id).ToList();
|
|
|
//已占用数据
|
|
//已占用数据
|
|
|
var Sumqty = mooccupies.Count > 0 ? mooccupies.Sum(x => x.moo_qty) : 0.00m;
|
|
var Sumqty = mooccupies.Count > 0 ? mooccupies.Sum(x => x.moo_qty) : 0.00m;
|
|
|
//判断此工单剩余可占用数量
|
|
//判断此工单剩余可占用数量
|
|
@@ -284,7 +291,7 @@ namespace Business.ResourceExamineManagement
|
|
|
//工单可占用数量满足 需求数量时直接占用需求数量
|
|
//工单可占用数量满足 需求数量时直接占用需求数量
|
|
|
QuantityNumber = Quantity;
|
|
QuantityNumber = Quantity;
|
|
|
}
|
|
}
|
|
|
- var mes_Mooccupy = GetMooccupies(seorderentry, ic_Item, item, QuantityNumber);
|
|
|
|
|
|
|
+ var mes_Mooccupy = GetMooccupies(seorderentry, ic_Item, item, QuantityNumber, bang_id);
|
|
|
mes_Mooccupies.Add(mes_Mooccupy);
|
|
mes_Mooccupies.Add(mes_Mooccupy);
|
|
|
//当剩余需要数量大于0则继续寻找可占用工单,已满足需要数量停止循环查找
|
|
//当剩余需要数量大于0则继续寻找可占用工单,已满足需要数量停止循环查找
|
|
|
if (Quantity - Sum <= 0)
|
|
if (Quantity - Sum <= 0)
|
|
@@ -391,19 +398,20 @@ namespace Business.ResourceExamineManagement
|
|
|
/// <param name="item">工单表</param>
|
|
/// <param name="item">工单表</param>
|
|
|
/// <param name="mes_mooccupy">占用工单表</param>
|
|
/// <param name="mes_mooccupy">占用工单表</param>
|
|
|
/// <returns></returns>
|
|
/// <returns></returns>
|
|
|
- public mes_mooccupy GetMooccupies(mo_crm_seorderentry seorderentry, ic_item ic_item, mes_morder item, decimal? number)
|
|
|
|
|
|
|
+ public mo_mes_mooccupy GetMooccupies(crm_seorderentry seorderentry, mo_ic_item ic_item, mo_mes_morder item, decimal? number, long bang_id)
|
|
|
{
|
|
{
|
|
|
//生成mes_mooccupy工单占用表数据,代表多个工单被某个销售订单已占用。
|
|
//生成mes_mooccupy工单占用表数据,代表多个工单被某个销售订单已占用。
|
|
|
- mes_mooccupy mes_Mooccupy = new mes_mooccupy();
|
|
|
|
|
- mes_Mooccupy.GenerateNewId();
|
|
|
|
|
- mes_Mooccupy.moo_id_type = "资源检查";
|
|
|
|
|
|
|
+ mo_mes_mooccupy mes_Mooccupy = new mo_mes_mooccupy();
|
|
|
|
|
+ mes_Mooccupy.mysql_id = snowFlake.NextId();
|
|
|
|
|
+ mes_Mooccupy.bang_id = bang_id;
|
|
|
|
|
+ mes_Mooccupy.moo_id_type = MorderEnum.Zyjc_Type;
|
|
|
mes_Mooccupy.moo_id_billid = seorderentry.seorder_id;//销售订单ID
|
|
mes_Mooccupy.moo_id_billid = seorderentry.seorder_id;//销售订单ID
|
|
|
mes_Mooccupy.fbill_no = seorderentry.bill_no;//销售订单号
|
|
mes_Mooccupy.fbill_no = seorderentry.bill_no;//销售订单号
|
|
|
mes_Mooccupy.fentry_id = seorderentry.entry_seq.Value;//销售订单行
|
|
mes_Mooccupy.fentry_id = seorderentry.entry_seq.Value;//销售订单行
|
|
|
mes_Mooccupy.fitem_name = ic_item.name;//物料名称
|
|
mes_Mooccupy.fitem_name = ic_item.name;//物料名称
|
|
|
mes_Mooccupy.fitem_number = ic_item.number;
|
|
mes_Mooccupy.fitem_number = ic_item.number;
|
|
|
mes_Mooccupy.fmodel = ic_item.model;//规格型号
|
|
mes_Mooccupy.fmodel = ic_item.model;//规格型号
|
|
|
- mes_Mooccupy.moo_moid = item.Id;
|
|
|
|
|
|
|
+ mes_Mooccupy.moo_moid = item.mysql_id;
|
|
|
mes_Mooccupy.moo_mo = item.morder_no;
|
|
mes_Mooccupy.moo_mo = item.morder_no;
|
|
|
//占用量=生产计划数量-入库数量-已被占用数量
|
|
//占用量=生产计划数量-入库数量-已被占用数量
|
|
|
mes_Mooccupy.moo_qty = number;
|
|
mes_Mooccupy.moo_qty = number;
|