using Business.Core.Enum;
using Business.Core.MongoDBHelper;
using Business.Core.Utilities;
using Bussiness.Model.MES.IC;
using Bussiness.Model.Sale;
using Bussiness.Model.SRM;
using Bussiness.MongoModel.MES.IC;
using Bussiness.MongoModel.Production;
using Bussiness.MongoModel.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 ZstdSharp.Unsafe;
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;
///
/// 雪花算法
///
SnowFlake snowFlake = new SnowFlake();
///
/// 采购明细
///
public List mo_Srm_Po_Lists = new List();
///
/// 采购占用
///
public List srm_Po_Occupies = 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 bang_id)
{
if (seorderentry == null)
{
//TODO:入参异常
}
List occupyList = new List();
var ic_Plan = ic_PlanList.Where(x => x.icitem_id == icitem_id).FirstOrDefault();
//查询出对应物料采购订单明细 --数据未被停用 && 评审通过后
var poDetailList = mo_Srm_Po_Lists.Where(x => x.icitem_id == icitem_id);
//采购订单占用数据
var poOccupys = srm_Po_Occupies.Where(x => poDetailList.Select(p => p.id).ToList().Contains(x.polist_id.GetValueOrDefault()));
//先查询出满足日期,并且数量可满足占用的数据
var poDetails = poDetailList.Where(x => x.rarrdate.GetValueOrDefault().AddDays(-(int)ic_Plan.self_inspection_date.GetValueOrDefault()) < DeliverDate && x.qty - x.rqty - x.esqty -
poOccupys.Where(p => p.polist_id.GetValueOrDefault() == x.mysql_id)?.Sum(m => m.qty) > Quantity).OrderByDescending(x => x.rarrdate).ToList();
//未满足则查询出满足日期的订单
if (poDetails.Count == 0)
{
poDetails = poDetailList.Where(x => x.rarrdate.GetValueOrDefault().AddDays(-(int)ic_Plan.self_inspection_date.GetValueOrDefault()) < DeliverDate).OrderByDescending(x => x.rarrdate).ToList();
}
var QuantityNumber = 0.00m;
foreach (var item in poDetails)
{
var poOccupy = poOccupys.Where(x => x.polist_id == item.id).ToList();
decimal? Qtys = poOccupy.Count > 0 ? poOccupy.Sum(x => x.qty) : 0.00m;
//剩余可用数量
var PlanQty = item.plan_qty - item.rqty - item.esqty - Qtys;
if (PlanQty > 0)
{
//可占用数量-需求数量小于0时 占用全部可占用数量
if (PlanQty - Quantity <= 0)
{
QuantityNumber = PlanQty.GetValueOrDefault();
}
else
{
//可占用数量满足 需求数量时直接占用需求数量
QuantityNumber = Quantity;
}
var mes_Mooccupy = GetMooccupies(seorderentry, item, QuantityNumber, bang_id);
occupyList.Add(mes_Mooccupy);
//当剩余需要数量大于0则继续寻找可占用工单,已满足需要数量停止循环查找
if (Quantity - PlanQty <= 0)
{
break;
}
Quantity = Quantity - PlanQty.GetValueOrDefault();
}
}
return occupyList.OrderByDescending(s => s.etime).ToList();
}
///
/// 拼接工单占用表
///
/// 销售订单子表
/// 物料详情表
/// 工单表
/// 占用工单表
///
public mo_srm_po_occupy GetMooccupies(crm_seorderentry seorderentry, mo_srm_po_list srm_po_list, decimal? number, long bang_id)
{
//生成mo_srm_po_occupy采购占用表数据。
mo_srm_po_occupy srm_Po_Occupy = new mo_srm_po_occupy();
srm_Po_Occupy.mysql_id = snowFlake.NextId();
srm_Po_Occupy.bang_id = bang_id;
srm_Po_Occupy.polist_id = srm_po_list.id;
srm_Po_Occupy.polist_row = srm_po_list.polist_row;
srm_Po_Occupy.eid = seorderentry.entry_seq.Value;
srm_Po_Occupy.bill_no = seorderentry.seorder_id;
srm_Po_Occupy.entry_id = seorderentry.entry_seq.GetValueOrDefault();
srm_Po_Occupy.qty = number;
srm_Po_Occupy.type = MorderEnum.Zyjc_Type;//TODO:类型未知
srm_Po_Occupy.stime = srm_po_list.create_time;
srm_Po_Occupy.etime = srm_po_list.rarrdate;
srm_Po_Occupy.state = 1;
srm_Po_Occupy.tenant_id = seorderentry.tenant_id;//取销售子表企业ID
srm_Po_Occupy.factory_id = seorderentry.factory_id;
srm_Po_Occupy.org_id = seorderentry.org_id;
return srm_Po_Occupy;
}
}
}