using Business.Core.Enum;
using Business.Core.Utilities;
using Business.Domain;
using Business.ResourceExamineManagement.Dto;
using Business.StructuredDB.MES;
using System;
using System.Collections.Generic;
using System.Linq;
using Volo.Abp.Application.Services;
namespace Business.ResourceExamineManagement
{
public class PurchaseOrderAppService : ApplicationService
{
#region 服务
/////
///// 采购订单
/////
////private readonly IMongoDB _mo_srm_po_main;
/////
///// 采购订单明细详情
/////
////private readonly IMongoDB _mo_srm_po_list;
/////
///// 采购订单占用详情
/////
////private readonly IMongoDB _mo_srm_po_occupy;
/////
///// 采购申请单
/////
////private readonly IMongoDB _mo_srm_pr_main;
///
/// 资源检查入参
///
public SeorderentryDto param = new SeorderentryDto();
///
/// 雪花算法
///
SnowFlake snowFlake = new SnowFlake();
///
/// 采购明细
///
public List mo_Srm_Po_Lists = new List();
///
/// 采购占用
///
public List srm_Po_Occupies = new List();
///
/// 在途PR
///
public List srm_Pr_Mains = new List();
public mes_morder mes_morder = new mes_morder();
public List scm_Jhjh_Jqs = new List();
public List scm_Shdzbs = new List();
#endregion
#region 构造函数
///
/// 构造函数
///
///
///
public PurchaseOrderAppService(
// IMongoDB mo_srm_po_main,
// IMongoDB mo_srm_po_list,
// IMongoDB mo_srm_po_occupy,
// IMongoDB mo_srm_pr_main
)
{
//_mo_srm_po_main = mo_srm_po_main;
//_mo_srm_po_list = mo_srm_po_list;
//_mo_srm_po_occupy = mo_srm_po_occupy;
//_mo_srm_pr_main = mo_srm_pr_main;
}
#endregion
///
/// 检查在途订单
///
public List CheckPurchaseOrder(crm_seorderentry seorderentry, long icitem_id, decimal Quantity, DateTime DeliverDate, List ic_PlanList, long? supplier_id, long bang_id)
{
List occupyList = new List();
List purords=new List();
var ic_Plan = ic_PlanList.Where(x => x.mysql_id == icitem_id).FirstOrDefault();
//查询出对应物料采购订单明细 --数据未被停用 && 评审通过后
List poDetailList = new List();
if (supplier_id != null)
{
poDetailList = mo_Srm_Po_Lists.Where(x => x.icitem_id == icitem_id && x.pr_purchase_id == supplier_id && x.rarrdate.GetValueOrDefault() < DeliverDate).ToList();
}
else
{
poDetailList = mo_Srm_Po_Lists.Where(x => x.icitem_id == icitem_id && x.rarrdate.GetValueOrDefault() < DeliverDate).ToList();
}
//先查询出满足日期,并且数量可满足占用的数据
//var poDetails = poDetailList.Where(x => x.rarrdate.GetValueOrDefault() < DeliverDate && x.qty - x.rqty - x.esqty -
//poOccupys.Where(p => p.polist_id == x.mysql_id)?.Sum(m => m.qty) > Quantity).OrderByDescending(x => x.rarrdate).ToList();
//日期满足
/*var backPodtls = poDetailList.Where(x => x.rarrdate.GetValueOrDefault() < DeliverDate).ToList();
var occpolist = new List();
foreach (var pdtl in backPodtls)
{
occpolist = poOccupys.Where(p => p.polist_id == pdtl.mysql_id).ToList();
decimal occqty = 0;
if (occpolist.Any())
{
occqty = occpolist.Sum(m => m.qty.GetValueOrDefault());
}
if (pdtl.qty - pdtl.rqty - pdtl.esqty - occqty > Quantity)
{
poDetails.Add(pdtl);
}
}*/
var QuantityNumber = 0.00m;
List poOccupy = new List();
foreach (var item in poDetailList)
{
poOccupy = srm_Po_Occupies.Where(x => x.polist_id == item.mysql_id).ToList();
decimal? Qtys = poOccupy.Count > 0 ? poOccupy.Sum(x => x.qty.GetValueOrDefault()) : 0.00m;
//剩余可用数量
var PlanQty = item.qty.GetValueOrDefault() - item.rqty.GetValueOrDefault() - item.esqty.GetValueOrDefault() - Qtys;
if (PlanQty > 0)
{
//可占用数量-需求数量小于0时 占用全部可占用数量
if (PlanQty - Quantity <= 0)
{
QuantityNumber = PlanQty.GetValueOrDefault();
}
else
{
//可占用数量满足 需求数量时直接占用需求数量
QuantityNumber = Quantity;
}
var mes_Mooccupy = GetMooccupies(seorderentry, item.mysql_id, item.create_time, item.rarrdate, QuantityNumber, bang_id,1);
purords.Add(item.po_billno);
occupyList.Add(mes_Mooccupy);
//当剩余需要数量大于0则继续寻找可占用工单,已满足需要数量停止循环查找
if (Quantity - PlanQty <= 0)
{
break;
}
Quantity = Quantity - PlanQty.GetValueOrDefault();
}
}
//代表PO还未占用完
if (Quantity > 0)
{
var prlist = srm_Pr_Mains.Where(x => x.icitem_id.Value == icitem_id && x.pr_sarrive_date < DeliverDate && x.pr_mono != mes_morder.morder_no).OrderByDescending(f => f.pr_sarrive_date).ToList();
if (prlist.Any())
{
if (supplier_id != null)
{
prlist = prlist.Where(x => x.pr_purchaseid == supplier_id).ToList();
}
if (mes_morder != null)
{
if (supplier_id != null)
{
prlist.AddRange(srm_Pr_Mains.Where(x => x.icitem_id.Value == icitem_id && x.pr_purchaseid == supplier_id && x.pr_mono == mes_morder.morder_no).OrderByDescending(f => f.pr_sarrive_date).ToList());
}
else
{
prlist.AddRange(srm_Pr_Mains.Where(x => x.icitem_id.Value == icitem_id && x.pr_mono == mes_morder.morder_no).OrderByDescending(f => f.pr_sarrive_date).ToList());
}
}
foreach (var pr in prlist)
{
decimal prOccupy = srm_Po_Occupies.Where(x => x.polist_id == pr.mysql_id).Sum(c => c.qty.GetValueOrDefault());
//剩余可用数量
var prQty = pr.pr_aqty - prOccupy;
if (prQty > 0)
{
//可占用数量-需求数量小于0时 占用全部可占用数量
if (prQty - Quantity <= 0)
{
QuantityNumber = prQty.GetValueOrDefault();
}
else
{
//可占用数量满足 需求数量时直接占用需求数量
QuantityNumber = Quantity;
}
var mes_Mooccupy = GetMooccupies(seorderentry, pr.mysql_id, pr.create_time, pr.pr_sarrive_date, QuantityNumber, bang_id, 1);
occupyList.Add(mes_Mooccupy);
//当剩余需要数量大于0则继续寻找可占用,已满足需要数量停止循环查找
if (Quantity - prQty <= 0)
{
break;
}
Quantity = Quantity - prQty.GetValueOrDefault();
}
}
}
}
return occupyList.OrderByDescending(s => s.etime).ToList();
}
///
/// 检查在途和交期订单
///
public List CheckPurchaseOrderORJQ(crm_seorderentry seorderentry, long icitem_id, decimal Quantity, DateTime DeliverDate, List ic_PlanList, long? supplier_id, long bang_id)
{
List occupyList = new List();
List purords = new List();
var ic_Plan = ic_PlanList.Where(x => x.mysql_id == icitem_id).FirstOrDefault();
//查询出对应物料采购订单明细 --数据未被停用 && 评审通过后
List poDetailList = new List();
if (supplier_id != null)
{
poDetailList = mo_Srm_Po_Lists.Where(x => x.icitem_id == icitem_id && x.pr_purchase_id == supplier_id).ToList();
}
else
{
poDetailList = mo_Srm_Po_Lists.Where(x => x.icitem_id == icitem_id).ToList();
}
var shd = scm_Shdzbs.Where(x => x.sh_material_code == ic_Plan.number && x.yjdhrq >= DeliverDate && x.yjdhrq <= DeliverDate.AddDays(5)).ToList();
if (supplier_id != null)
{
shd = shd.Where(x => x.sh_purchase_id == supplier_id).ToList() ;
}
var QuantityNumber = 0.00m;
List poOccupy = new List();
if (shd.Any())
{
foreach (var item in shd)
{
poOccupy = srm_Po_Occupies.Where(x => x.polist_id == item.polist_id).ToList();
decimal? Qtys = poOccupy.Count > 0 ? poOccupy.Sum(x => x.qty.GetValueOrDefault()) : 0.00m;
//剩余可用数量
var PlanQty = item.sh_delivery_quantity - Qtys;
if (PlanQty > 0)
{
//可占用数量-需求数量小于0时 占用全部可占用数量
if (PlanQty - Quantity <= 0)
{
QuantityNumber = PlanQty.GetValueOrDefault();
}
else
{
//可占用数量满足 需求数量时直接占用需求数量
QuantityNumber = Quantity;
}
var mes_Mooccupy = GetMooccupies(seorderentry, item.id, item.jhshrq, item.yjdhrq, QuantityNumber, bang_id, 1);
purords.Add(item.po_bill);
occupyList.Add(mes_Mooccupy);
//当剩余需要数量大于0则继续寻找可占用工单,已满足需要数量停止循环查找
if (Quantity - PlanQty <= 0)
{
Quantity = 0;
break;
}
Quantity = Quantity - PlanQty.GetValueOrDefault();
}
}
}
if (Quantity > 0)
{
//承诺交期可用!poDetailList.Select(p => p.po_billno).Contains(x.cgdd)
var jqs = scm_Jhjh_Jqs.Where(x => ic_Plan.number == x.wlbm && x.jqhf >= DateTime.Today).OrderByDescending(f => f.jqhf).ToList();
if (supplier_id != null)
{
jqs = jqs.Where(x => x.pr_purchase_id == supplier_id).ToList();
}
if (jqs.Any())
{
foreach (var jq in jqs)
{
decimal prOccupy = srm_Po_Occupies.Where(x => x.polist_id == jq.polist_id).Sum(c => c.qty.GetValueOrDefault());
//剩余可用数量
var poDetail = poDetailList.Where(p => p.mysql_id == jq.polist_id).ToList();
var PlanQty = 0m;
if (poDetail.Any())
{
PlanQty = poDetail[0].qty.GetValueOrDefault() - poDetail[0].rqty.GetValueOrDefault() - poDetail[0].esqty.GetValueOrDefault();
}
//订单剩余数减去送货单占用数,等于交期可用数
var prQty = PlanQty - prOccupy; //jq.jhdsl - prOccupy;
if (prQty >= jq.jhdsl)
{
prQty = jq.jhdsl.GetValueOrDefault();
}
if (prQty > 0)
{
//可占用数量-需求数量小于0时 占用全部可占用数量
if (prQty - Quantity <= 0)
{
QuantityNumber = prQty;
}
else
{
//可占用数量满足 需求数量时直接占用需求数量
QuantityNumber = Quantity;
}
var mes_Mooccupy = GetMooccupies(seorderentry, jq.polist_id, jq.jqhf, jq.jqhf, QuantityNumber, bang_id, 2);
occupyList.Add(mes_Mooccupy);
//当剩余需要数量大于0则继续寻找可占用,已满足需要数量停止循环查找
if (Quantity - prQty <= 0)
{
break;
}
Quantity = Quantity - prQty;
}
}
}
}
return occupyList.OrderByDescending(s => s.etime).ToList();
}
///
/// 拼接PO占用表
///
/// 销售订单子表
/// 物料详情表
/// 工单表
/// 占用工单表
///
public mo_srm_po_occupy GetMooccupies(crm_seorderentry seorderentry, long id,DateTime? stime, DateTime? etime, decimal? number, long bang_id,int state)
{
//生成mo_srm_po_occupy采购占用表数据。
mo_srm_po_occupy srm_Po_Occupy = new mo_srm_po_occupy();
srm_Po_Occupy.GenerateNewId(snowFlake.NextId());
srm_Po_Occupy.mysql_id = snowFlake.NextId();
srm_Po_Occupy.bang_id = bang_id;
srm_Po_Occupy.polist_id = id;
if (seorderentry != null)
{
srm_Po_Occupy.eid = seorderentry.Id;
srm_Po_Occupy.bill_no = seorderentry.seorder_id;
srm_Po_Occupy.entry_id = seorderentry.entry_seq.GetValueOrDefault();
srm_Po_Occupy.org_id = seorderentry.org_id;
}
srm_Po_Occupy.qty = number;
srm_Po_Occupy.type = MorderEnum.Zyjc_Type;//TODO:类型未知
srm_Po_Occupy.stime = stime;
srm_Po_Occupy.etime = etime;
srm_Po_Occupy.state = state;
srm_Po_Occupy.company_id = param.company_id;//取销售子表企业ID
srm_Po_Occupy.factory_id = param.factoryId;
return srm_Po_Occupy;
}
}
}