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