using Amazon.Runtime.Internal.Util;
using Business.Core.Enum;
using Business.Core.Utilities;
using Business.Domain;
using Business.Dto;
using Business.EntityFrameworkCore;
using Business.EntityFrameworkCore.SqlRepositories;
using Business.PriorityManagement;
using Business.Replenishment;
using Business.ReplenishmentManagement;
using Business.ResourceExamineManagement.Dto;
using Business.StructuredDB.SaleFcst;
using Business.StructuredDB.WMS;
using EFCore.BulkExtensions;
using IdentityModel.Client;
using Microsoft.AspNetCore.DataProtection.Repositories;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using MongoDB.Driver;
using MongoDB.Driver.Linq;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using RazorEngine.Compilation.ImpromptuInterface.Optimization;
using System;
using System.Collections.Generic;
using System.ComponentModel.Design;
using System.Linq;
using System.Linq.Dynamic.Core;
using System.Threading.Tasks;
using Volo.Abp.Application.Services;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.Json.SystemTextJson;
using Volo.Abp.MultiTenancy;
using Volo.Abp.ObjectMapping;
using Volo.Abp.Uow;
namespace Business.ResourceExamineManagement
{
///
/// 资源检查
///
//[Authorize(BusinessPermissions.ResourceExamine.Default)]
public class ResourceExamineAppService : ApplicationService, IResourceExamineAppService, ITransientDependency
{
#region 服务
SnowFlake help = new SnowFlake();
private readonly ICurrentTenant _currentTenant;
///
/// 工艺路径
///
private readonly IRepository _mes_technique;
///
/// 工序
///
private readonly IRepository _mes_process;
///
/// 工艺关联工序
///
private readonly IRepository _mes_tech_process;
///
/// 工艺工序关联工位
///
private readonly IRepository _mes_tech_proc_workshop;
///
/// 物料占用记录
///
private readonly IRepository _ic_item_stockoccupy;
private IRepository _mysql_ic_item_stockoccupy;
///
/// 物料详情
///
private readonly IRepository _ic_item;
private IRepository _mysql_ic_item;
///
/// 物料BOM
///
private readonly IRepository _ic_bom;
private IRepository _mysql_ic_bom;
///
/// 物料BOM明细
///
private readonly IRepository _ic_bom_child;
private IRepository _mysql_ic_bom_child;
///
/// 物料库存表
///
private readonly IRepository _ic_item_stock;
private IRepository _mysql_ic_item_stock;
///
/// 物料采购报价单
///
private readonly IRepository _srm_purchase;
private IRepository _mysql_srm_purchase;
///
/// 采购申请单
///
private readonly IRepository _srm_pr_main;
private IRepository _mysql_srm_pr_main;
///
/// 采购订单表
///
private readonly IRepository _srm_po_main;
private IRepository _mysql_srm_po_main;
///
/// 采购订单明细表
///
private readonly IRepository _srm_po_list;
private IRepository _mysql_srm_po_list;
///
/// 采购订单占用详情
///
private readonly IRepository _srm_po_occupy;
private IRepository _mysql_srm_po_occupy;
///
/// 供应商
///
private readonly IRepository _srm_supplier;
private IRepository _mysql_srm_supplier;
///
/// 委外工单
///
private readonly IRepository _mes_oorder;
private IRepository _mysql_mes_oorder;
private IRepository _mysql_b_bom_pretreatment;
private IRepository _mysql_examine_result;
private IRepository _mysql_bom_child_examine;
private IRepository _mysql_mo_occupy;
private IRepository _mysql_mo_order;
private IRepository _mysql_ooder;
private IRepository _mysql_purchase;
private IRepository _mysql_purchase_occupy;
///
/// 替代方案
///
private readonly IRepository _ic_substitute;
///
/// 替代方案群组
///
private readonly IRepository _ic_substitute_group;
///
/// 替代明细
///
private readonly IRepository _ic_substitute_group_detail;
///
/// 替代方案
///
private readonly IRepository _mysql_ic_substitute;
///
/// 替代方案群组
///
private readonly IRepository _mysql_ic_substitute_group;
///
/// 替代明细
///
private readonly IRepository _mysql_ic_substitute_group_detail;
///
/// 生产工单主表
///
private readonly IRepository _mes_morder;
///
/// 生产工单子表
///
private readonly IRepository _mes_moentry;
///
/// 在制工单占用记录表
///
private readonly IRepository _mes_mooccupy;
///
/// mysql在制工单占用表
///
private readonly IRepository _mysql_mes_mooccupy;
///
/// 销售订单
///
private readonly IRepository _mysql_crm_seorder;
///
/// 销售订单明细
///
private readonly IRepository _mysql_crm_seorderentry;
///
/// 生产工单主表
///
private readonly IRepository _mysql_mes_morder;
///
/// 生产工单子表
///
private readonly IRepository _mysql_mes_moentry;
///
/// 工艺路线表
///
private readonly ISqlRepository _routingOpDetail;
///
/// 生产线明细
///
private readonly ISqlRepository _prodLineDetail;
///
/// 排产记录表
///
private readonly ISqlRepository _periodSequenceDet;
///
/// 物料职责表
///
private readonly ISqlRepository _empWorkDutyMaster;
///
/// 雇员信息表
///
private readonly ISqlRepository _employeeMaster;
///
/// 排产结果明细
///
private ISqlRepository _scheduleResultOpMaster;
///
/// 工作日历
///
private readonly ISqlRepository _shopCalendarWorkCtr;
///
/// 休息时间段
///
private readonly ISqlRepository _qualityLineWorkDetail;
///
/// 节假日
///
private readonly ISqlRepository _holidayMaster;
///
/// 标准BOM表
///
private readonly ISqlRepository _productStructureMaster;
///
/// 工单工序表
///
private ISqlRepository _workOrdRouting;
///
/// 工单主表
///
private ISqlRepository _workOrdMaster;
///
/// 工单物料明细
///
private ISqlRepository _workOrdDetail;
private readonly ISqlRepository _rf_serialnumber;
private readonly ISqlRepository _locationDetail;
///
/// 资源检查入参
///
private readonly SeorderentryDto param = new SeorderentryDto();
///
/// 预处理
///
private readonly PretreatmentAppService _pretreatmentAppService;
///
/// 在途检查
///
private readonly PurchaseOrderAppService _purchaseOrderAppService;
///
/// 工单App
///
private readonly MorderAppService _morderAppService;
private readonly SerialNumberAppService _serialNumberAppService;
///
/// 优先级
///
private readonly ReplenishmentAppService _replenishmentAppService;
///
/// 计算BOM平铺物料情况
///
private readonly CalcBomViewAppService _CalcBomViewAppService;
private List leadTimeList;
private List supplierList;
private readonly BusinessBangDbContext _businessBangDbContext;
private readonly BusinessDbContext _businessDbContext;
private readonly ISqlRepository _tagMasterRepository;
///
/// 生产线维护表
///
private ISqlRepository _lineMaster;
private ISqlRepository _itemMaster;
private ISqlRepository _nbrMaster;
private ISqlRepository _nbrDetail;
private ISqlRepository _purOrdMaster;
private ISqlRepository _purOrdDetail;
private ISqlRepository _itemPackMaster;
private ISqlRepository _generalizedCodeMaster;
///
/// 生产排产
///
private readonly ProductionScheduleAppService _productionScheduleAppService;
///
/// 优先级
///
private readonly PriorityAppService _priorityAppService;
///
/// 产能检查
///
private readonly ProductExamineAppService _productExamineAppService;
///
/// 生产线明细表
///
public List prodLines = new List();
///
/// 标准工艺路径表
///
public List routingOps = new List();
///
/// 排产记录表
///
public List periodSequences = new List();
///
/// 工作日历
///
public List calendarWorks = new List();
///
/// 休息时间段
///
public List qualityLineWorks = new List();
///
/// 节假日
///
public List holidays = new List();
private readonly IUnitOfWorkManager _unitOfWorkManager;
#endregion
#region 构造函数
///
/// 构造函数
///
///
///
public ResourceExamineAppService(
IRepository mes_technique,
IRepository mes_process,
IRepository mes_tech_process,
IRepository mes_tech_proc_workshop,
IRepository ic_item,
IRepository ic_bom,
IRepository ic_bom_child,
IRepository ic_item_stock,
IRepository mes_oorder,
IRepository srm_pr_main,
IRepository srm_po_main,
IRepository srm_po_list,
IRepository srm_po_occupy,
IRepository srm_purchase,
IRepository ic_substitute,
IRepository ic_substitute_group,
IRepository ic_substitute_group_detail,
IRepository mes_morder,
IRepository mes_moentry,
IRepository mes_mooccupy,
IRepository ic_item_stockoccupy,
IRepository srm_supplier,
IRepository mysql_ic_item,
IRepository mysql_ic_bom,
IRepository mysql_ic_bom_child,
IRepository mysql_mes_technique,
IRepository mysql_crm_seorder,
IRepository mysql_crm_seorderentry,
IRepository mysql_ic_item_stock,
IRepository mysql_ic_item_stockoccupy,
IRepository mysql_mes_oorder,
IRepository mysql_srm_pr_main,
IRepository mysql_mes_mooccupy,
IRepository mysql_mes_morder,
IRepository mysql_mes_moentry,
IRepository mysql_mes_process,
IRepository mysql_mes_tech_process,
IRepository mysql_srm_po_main,
IRepository mysql_srm_po_list,
IRepository mysql_srm_po_occupy,
IRepository mysql_srm_purchase,
IRepository mysql_examine_result,
IRepository mysql_bom_child_examine,
IRepository mysql_mo_occupy,
IRepository mysql_mo_order,
IRepository mysql_ooder,
IRepository mysql_purchase,
IRepository mysql_purchase_occupy,
IRepository mysql_b_bom_pretreatment,
IRepository mysql_srm_supplier,
ISqlRepository tagMasterRepository,
ISqlRepository periodSequenceDet,
ISqlRepository employeeMaster,
ISqlRepository empWorkDutyMaster,
ISqlRepository lineMaster,
ISqlRepository itemMaster,
PretreatmentAppService pretreatmentAppService,
CalcBomViewAppService calcbomviewAppService,
PurchaseOrderAppService purchaseOrderAppService,
ICurrentTenant currentTenant,
MorderAppService morderAppService,
BusinessBangDbContext businessBangDbContext,
BusinessDbContext businessDbContext,
ProductionScheduleAppService productionScheduleAppService,
ISqlRepository routingOpDetail,
ISqlRepository productStructureMaster,
ISqlRepository workOrdRouting,
ISqlRepository workOrdMaster,
ISqlRepository workOrdDetail,
ISqlRepository nbrMaster,
ISqlRepository nbrDetail,
ISqlRepository purOrdMaster,
ISqlRepository purOrdDetail,
PriorityAppService priorityAppService,
ISqlRepository prodLineDetail,
ISqlRepository shopCalendarWorkCtr,
ISqlRepository qualityLineWorkDetail,
ISqlRepository holidayMaster,
ProductExamineAppService productExamineAppService,
ISqlRepository rf_serialnumber,
ISqlRepository locationDetail,
ISqlRepository itemPackMaster,
ISqlRepository generalizedCodeMaster,
ISqlRepository scheduleResultOpMaster,
IRepository mysql_ic_substitute,
IRepository mysql_ic_substitute_group,
IRepository mysql_ic_substitute_group_detail,
IRepository replenishmentROP,
IRepository domesticTerminalFcst,
ISqlRepository ASNBOLShipperDetail,
IRepository standardItemModelSet,
ISqlRepository invTransHist,
ISqlRepository SAPInv,
ISqlRepository monthlyShipmentPlan,
IRepository srmPurchase,
IUnitOfWorkManager unitOfWorkManager,
SerialNumberAppService serialNumberAppService,
ReplenishmentAppService replenishmentAppService
)
{
_mes_technique = mes_technique;
_mes_process = mes_process;
_mes_tech_process = mes_tech_process;
_mes_tech_proc_workshop = mes_tech_proc_workshop;
_ic_item = ic_item;
_ic_bom = ic_bom;
_ic_bom_child = ic_bom_child;
_ic_item_stock = ic_item_stock;
_mes_oorder = mes_oorder;
_srm_pr_main = srm_pr_main;
_srm_po_main = srm_po_main;
_srm_po_list = srm_po_list;
_srm_po_occupy = srm_po_occupy;
_srm_purchase = srm_purchase;
_ic_substitute = ic_substitute;
_ic_substitute_group = ic_substitute_group;
_ic_substitute_group_detail = ic_substitute_group_detail;
_mysql_ic_substitute = mysql_ic_substitute;
_mysql_ic_substitute_group = mysql_ic_substitute_group;
_mysql_ic_substitute_group_detail = mysql_ic_substitute_group_detail;
_mes_morder = mes_morder;
_mes_moentry = mes_moentry;
_mes_mooccupy = mes_mooccupy;
_ic_item_stockoccupy = ic_item_stockoccupy;
_srm_supplier = srm_supplier;
_mysql_ic_item = mysql_ic_item;
_mysql_ic_bom = mysql_ic_bom;
_mysql_ic_bom_child = mysql_ic_bom_child;
_mysql_crm_seorder = mysql_crm_seorder;
_mysql_crm_seorderentry = mysql_crm_seorderentry;
_mysql_ic_item_stock = mysql_ic_item_stock;
_mysql_ic_item_stockoccupy = mysql_ic_item_stockoccupy;
_mysql_mes_oorder = mysql_mes_oorder;
_mysql_srm_pr_main = mysql_srm_pr_main;
_mysql_mes_mooccupy = mysql_mes_mooccupy;
_mysql_mes_morder = mysql_mes_morder;
_mysql_mes_moentry = mysql_mes_moentry;
_mysql_srm_po_main = mysql_srm_po_main;
_mysql_srm_po_list = mysql_srm_po_list;
_mysql_srm_po_occupy = mysql_srm_po_occupy;
_mysql_srm_purchase = mysql_srm_purchase;
_mysql_examine_result = mysql_examine_result;
_mysql_bom_child_examine = mysql_bom_child_examine;
_mysql_mo_occupy = mysql_mo_occupy;
_mysql_mo_order = mysql_mo_order;
_mysql_ooder = mysql_ooder;
_mysql_purchase = mysql_purchase;
_mysql_purchase_occupy = mysql_purchase_occupy;
_mysql_b_bom_pretreatment = mysql_b_bom_pretreatment;
_mysql_srm_supplier = mysql_srm_supplier;
_tagMasterRepository = tagMasterRepository;
_periodSequenceDet = periodSequenceDet;
_employeeMaster = employeeMaster;
_empWorkDutyMaster = empWorkDutyMaster;
_pretreatmentAppService = pretreatmentAppService;
_CalcBomViewAppService = calcbomviewAppService;
_purchaseOrderAppService = purchaseOrderAppService;
_currentTenant = currentTenant;
_morderAppService = morderAppService;
_businessBangDbContext = businessBangDbContext;
_businessDbContext = businessDbContext;
_productionScheduleAppService = productionScheduleAppService;
_routingOpDetail = routingOpDetail;
_productStructureMaster = productStructureMaster;
_workOrdRouting = workOrdRouting;
_workOrdMaster = workOrdMaster;
_workOrdDetail = workOrdDetail;
_lineMaster = lineMaster;
_itemMaster = itemMaster;
_nbrMaster = nbrMaster;
_nbrDetail = nbrDetail;
_purOrdMaster = purOrdMaster;
_purOrdDetail= purOrdDetail;
_priorityAppService = priorityAppService;
_rf_serialnumber = rf_serialnumber;
_prodLineDetail = prodLineDetail;
_shopCalendarWorkCtr = shopCalendarWorkCtr;
_qualityLineWorkDetail = qualityLineWorkDetail;
_holidayMaster = holidayMaster;
_productExamineAppService = productExamineAppService;
_locationDetail = locationDetail;
_itemPackMaster = itemPackMaster;
_generalizedCodeMaster = generalizedCodeMaster;
_unitOfWorkManager = unitOfWorkManager;
_scheduleResultOpMaster = scheduleResultOpMaster;
_serialNumberAppService = serialNumberAppService;
_replenishmentAppService = replenishmentAppService;
}
#endregion
///
/// 资源检查 -- TODO:根据客户的不同标准交货期(假如客户设定10天),如果检查交期小于标准交货期(10天),则默认把建议交期调整为10天。
///
///
/// 类型(0,销售订单 1,全域订单)
///
///
public async Task ReceiveResult(string ids,int type, string companyid)
{
if (string.IsNullOrEmpty(ids))
{
throw new NotImplementedException("请输入正确的订单号!");
}
ResourceCheckInputDto input = new ResourceCheckInputDto();
input.sorderId = AnalysisIdList(ids);
//资源检查结果
PschedDto rtn = new PschedDto();
List sorders = new List();
List sentrys = new List();
//生成当前计算bangid
long bangid = help.NextId();
if (type == 0)
{
//获取订单数据
sorders = _mysql_crm_seorder.GetListAsync(p => input.sorderId.Contains(p.Id) && !p.IsDeleted).Result;
if (!sorders.Any())
{
new NLogHelper("ResourceExamineAppService").WriteLog("ReceiveResult", "订单数据不存在", _currentTenant.Id.ToString());
return "订单数据不存在";
}
//获取订单行数据
sentrys = await _mysql_crm_seorderentry.GetListAsync(p => input.sorderId.Contains(p.seorder_id.GetValueOrDefault()) && (p.progress=="1" || p.progress == "2") && !p.IsDeleted);
if (!sentrys.Any())
{
new NLogHelper("ResourceExamineAppService").WriteLog("ReceiveResult", "订单行数据不存在", _currentTenant.Id.ToString());
return "订单行数据不存在";
}
}
else {
//获取订单行数据
sentrys = await _mysql_crm_seorderentry.GetListAsync(p => (p.progress == "1" || p.progress == "2") && p.company_id.ToString() == companyid && !p.IsDeleted);
if (!sentrys.Any())
{
new NLogHelper("ResourceExamineAppService").WriteLog("ReceiveResult", "订单行数据不存在", _currentTenant.Id.ToString());
return "没有需要检查的订单行。";
}
sorders = _mysql_crm_seorder.GetListAsync(p => sentrys.Select(s => s.seorder_id).Contains(p.Id) && !p.IsDeleted).Result;
if (!sorders.Any())
{
new NLogHelper("ResourceExamineAppService").WriteLog("ReceiveResult", "订单数据不存在", _currentTenant.Id.ToString());
return "没有需要检查的订单。";
}
}
input.company_id = sorders[0].company_id;
input.factoryId = sorders[0].factory_id.GetValueOrDefault();
//资源检查入参全局变量赋值
param.company_id = input.company_id;
param.factoryId = input.factoryId;
param.checkflag = true;
rtn.sorderid = input.sorderId;
//资源检查明细list
List examines = new List();
ExamineResult dtl;
//处理销售订单优先级
sorders = _priorityAppService.CalcOrderPriority(sorders, sentrys);
AsyncItemStockFromWMS(sentrys);
//处理订单行优先级
sentrys = _priorityAppService.CalcOrderEntryPriority(sorders, sentrys);
//删除同步Mysql后旧数据
await DeleteMySqlOldData(sentrys);
//通过订单行的产品代码获取物料BOM数据
List boms = _ic_bom.GetListAsync(p => sentrys.Select(m => m.item_number).Contains(p.item_number) && p.factory_id == input.factoryId && p.company_id == input.company_id && !p.IsDeleted).Result.ToList();
//物料信息
List icitemlist = new List();
//物料库存表
List stocklist = new List();
//物料占用记录
List sklist = new List();
var pretreatments = _mysql_b_bom_pretreatment.GetListAsync(s => boms.Select(c => c.mysql_id).ToList().Contains(s.sourceid)).Result;
List autoCreates = new List();
boms.ForEach(p =>
{
if (!pretreatments.Where(s => s.sourceid == p.mysql_id).Any())
{
autoCreates.Add(p);
}
});
if (autoCreates.Any())
{
AutoCreateBomBill(param.company_id.ToString(), autoCreates);
pretreatments = _mysql_b_bom_pretreatment.GetListAsync(s => boms.Select(c => c.mysql_id).ToList().Contains(s.sourceid)).Result;
}
//数据库快照-同步mysql库数据到mongoDB中
await DbSnapShot(input.company_id, input.factoryId, bangid, pretreatments);
//记录订单行的物料齐套时间
List kittingTimes = new List();
DataInitialization(boms, bangid, icitemlist, stocklist, pretreatments, sklist);
_CalcBomViewAppService.morder_type = MorderEnum.XsMorder;
foreach (var sorder in sorders)
{
param.sorderId = sorder.Id;
param.company_id = input.company_id;
param.factoryId = input.factoryId;
//param.checkflag = true;
_morderAppService.param = param;
_purchaseOrderAppService.param = param;
_CalcBomViewAppService.param = param;
_CalcBomViewAppService.IsInverted = true;
_CalcBomViewAppService.seorder = sorder;//销售订单
var orderSentrys = sentrys.Where(s => s.seorder_id == sorder.Id).ToList();
foreach (var item in orderSentrys)
{
//工单资源检查信息
dtl = new ExamineResult();
dtl.sorderid = sorder.Id;
dtl.bill_no = sorder.bill_no;
dtl.sentry_id = item.Id;
dtl.entry_seq = item.entry_seq;
dtl.need_qty = item.qty.GetValueOrDefault();
dtl.need_time = item.plan_date;
dtl.bangid = bangid;
dtl.prd_code = item.item_number;
//获取当前物料bom数据
var childBom = boms.Where(p => p.item_number == item.item_number).FirstOrDefault();
dtl.bom_number = childBom.bom_number;
var itemPrelist = pretreatments.Where(s => s.sourceid == childBom.mysql_id).ToList();
if (!itemPrelist.Any())
{
continue;
}
var getBomList = ObjectMapper.Map, List>(itemPrelist);
getBomList.ForEach(s => s.sentry_id = item.Id);
//库存初始化
_CalcBomViewAppService.BomStock(getBomList, stocklist, bangid);
_CalcBomViewAppService.newStockOccList = new List();
//计算
_CalcBomViewAppService.CalcView(getBomList, bangid, item.qty.GetValueOrDefault(), item.plan_date, sklist, item, icitemlist);
//TODO:最晚开始时间
var curFacDtl = leadTimeList.FirstOrDefault(p => p.item_id == childBom.icitem_id);
//最晚开工时间=订单行客户要求交期-运输提前期-库存提前期-生产提前期-下单提前期-生产时间
dtl.latest_times = item.plan_date.GetValueOrDefault().AddDays(-Convert.ToDouble(curFacDtl?.transportation_leadtime.GetValueOrDefault() + curFacDtl?.stock_leadtime.GetValueOrDefault() + curFacDtl?.production_leadtime.GetValueOrDefault() + curFacDtl?.order_leadtime.GetValueOrDefault() + _CalcBomViewAppService.ProductionTimeDay));
//物料齐套时间
dtl.kitting_times = getBomList.Where(p => p.is_use).OrderByDescending(m => m.kitting_time).First().kitting_time.GetValueOrDefault();
//TODO:最早开始时间默认3天后(后期调整,因为要计算排产,计算产能这一类,才能得到开工时间)
dtl.earliest_times = dtl.kitting_times.AddDays(1);
item.progress = "2";
//替代关系展开list
dtl.BomChildExamineList = getBomList;
//添加订单行开工信息
examines.Add(dtl);
//记录订单行的建议交期
KittingTimeDto dto = new KittingTimeDto();
dto.sentry_id = item.Id;
dto.ItemNum = item.item_number;
dto.LackQty = getBomList.First(p => p.level == 1).lack_qty;
dto.kitting_time = dtl.kitting_times;
kittingTimes.Add(dto);
}
}
//计算订单行的建议交期(产能/物料)
CalcSuggestDate(sentrys, kittingTimes, icitemlist);
examines.ForEach(p => {
var sent = sentrys.Find(s => s.Id == p.sentry_id);
if (sent != null)
{
p.sys_material_date = sent.sys_material_date;
p.sys_capacity_date = sent.sys_capacity_date;
}
});
rtn.mordersList = _CalcBomViewAppService.mordersInsertList;
List prmainlist = new List();
if (_CalcBomViewAppService.SRMPRDtoList.Any())
{
List> prlist = _CalcBomViewAppService.SRMPRDtoList.Where(f => f.srm_Pr_Main != null).Select(s => s.srm_Pr_Main).ToList();
foreach (var pr in prlist)
{
foreach (var item in pr)
{
prmainlist.Add(item);
}
}
rtn.srm_pr_list = _CalcBomViewAppService.SRMPRDtoList;
}
using (var unitOfWork = _unitOfWorkManager.Begin(false,true))
{
try
{
await _mysql_crm_seorderentry.UpdateManyAsync(sentrys);
/*//批量保存 后期考虑子工单
if (moderlist.Any())
{
await _mes_morder.InsertMany(_CalcBomViewAppService.mordersInsertList);
_businessDbContext.BulkInsert(moderlist);
if (workOrds.Any())
{
_workOrdMaster.Insert(workOrds);
}
if (workOrdRoutings.Any())
{
_workOrdRouting.Insert(workOrdRoutings);
}
if (workOrdDetails.Any())
{
_workOrdDetail.Insert(workOrdDetails);
}
}*/
if (_CalcBomViewAppService.mordersInsertList.Any())
{
await _mes_morder.InsertManyAsync(_CalcBomViewAppService.mordersInsertList);
}
if (prmainlist.Any())
{
await _srm_pr_main.InsertManyAsync(prmainlist);
}
if (_CalcBomViewAppService.mooccupyAllInsertList.Any())
{
_CalcBomViewAppService.mooccupyAllInsertList.ForEach(s => { s.tenant_id = param.company_id.GetValueOrDefault(); s.company_id = param.company_id; s.factory_id = param.factoryId; });
await _mes_mooccupy.InsertManyAsync(_CalcBomViewAppService.mooccupyAllInsertList);
/*var moOccupy = ObjectMapper.Map, List>(_CalcBomViewAppService.mooccupyAllInsertList);
_businessDbContext.BulkInsert(moOccupy);*/
rtn.mooccupyAllList = _CalcBomViewAppService.mooccupyAllInsertList;
}
if (_CalcBomViewAppService.moentriesInsertList.Any())
{
_CalcBomViewAppService.moentriesInsertList.ForEach(s => { s.tenant_id = param.company_id.GetValueOrDefault(); s.company_id = param.company_id; s.factory_id = param.factoryId; });
await _mes_moentry.InsertManyAsync(_CalcBomViewAppService.moentriesInsertList);
/*var mesmoentrys = ObjectMapper.Map, List>(_CalcBomViewAppService.moentriesInsertList);
_businessDbContext.BulkInsert(mesmoentrys);*/
}
if (_CalcBomViewAppService.orderList.Any())
{
_CalcBomViewAppService.orderList.ForEach(s => { s.tenant_id = param.company_id.GetValueOrDefault(); s.company_id = param.company_id; s.factory_id = param.factoryId; });
await _mes_oorder.InsertManyAsync(_CalcBomViewAppService.orderList);
/*var ooders = ObjectMapper.Map, List>(_CalcBomViewAppService.orderList);
_businessDbContext.BulkInsert(ooders);*/
rtn.order_list = _CalcBomViewAppService.orderList;
}
if (_CalcBomViewAppService.newStockOccList.Any())
{
_CalcBomViewAppService.newStockOccList.ForEach(s => { s.GenerateNewId(help.NextId()); s.tenant_id = param.company_id.GetValueOrDefault(); s.company_id = param.company_id; s.factory_id = param.factoryId; });
await _ic_item_stockoccupy.InsertManyAsync(_CalcBomViewAppService.newStockOccList);
}
if (_CalcBomViewAppService.srm_Po_OccupiesInsert.Any())
{
_CalcBomViewAppService.srm_Po_OccupiesInsert.ForEach(s => { s.tenant_id = param.company_id.GetValueOrDefault(); s.company_id = param.company_id; s.factory_id = param.factoryId; });
await _srm_po_occupy.InsertManyAsync(_CalcBomViewAppService.srm_Po_OccupiesInsert);
/*var poOccupies = ObjectMapper.Map, List>(_CalcBomViewAppService.srm_Po_OccupiesInsert);
_businessDbContext.BulkInsert(poOccupies);*/
}
await unitOfWork.CompleteAsync();
}
catch (Exception e)
{
unitOfWork.Dispose();
new NLogHelper("ResourceExamineAppService").WriteLog("ReceiveResult", "资源检查工单相关数据更新失败:" + e.Message, _currentTenant.Id.ToString());
return e.Message;
};
}
rtn.examines = examines;
rtn.item_stockoccupy_list = sklist;
//检查结果写入数据库
await ExamineResultInsertDBAsync(rtn.examines);
//清空快照数据
await ClearSnapShot(bangid);
return JsonConvert.SerializeObject("ok");
}
public async Task ExamineResultInsertDBAsync(List examines)
{
//检查结果写入数据库
List examineList = new List();
List bomExamineList = new List();
List mooccupyList = new List();
List moorderList = new List();
List ooderList = new List();
List purchaseList = new List();
List purchaseoccupyList = new List();
foreach (var ex in examines)
{
var b_ex = ObjectMapper.Map(ex);
b_ex.GenerateNewId(help.NextId());// = help.NextId();
if (_CalcBomViewAppService.mordersInsertList.Any())
{
var moentry = _CalcBomViewAppService.moentriesInsertList.Where(s => s.soentry_id == b_ex.sentry_id).ToList();
if (moentry != null)
{
var sentryMo = _CalcBomViewAppService.mordersInsertList.Where(s => moentry.Select(x => x.moentry_moid).Contains(s.mysql_id) && s.product_code == ex.prd_code).FirstOrDefault();
if (sentryMo != null)
{
b_ex.morder_id = sentryMo.mysql_id;
b_ex.morder_no = sentryMo.morder_no;
}
}
}
b_ex.create_time = DateTime.Now;
b_ex.company_id = param.company_id;
b_ex.tenant_id = param.company_id;
b_ex.factory_id = param.factoryId;
examineList.Add(b_ex);
ex.BomChildExamineList.ForEach(s =>
{
var bc_ex = ObjectMapper.Map(s);
bc_ex.GenerateNewId(help.NextId());
bc_ex.examine_id = b_ex.Id;
bc_ex.company_id = param.company_id;
bc_ex.tenant_id = param.company_id;
bc_ex.factory_id = param.factoryId;
bc_ex.create_time = DateTime.Now;
bomExamineList.Add(bc_ex);
if (s.mo_occupy_list != null)
{
var olist = ObjectMapper.Map, List>(s.mo_occupy_list);
olist.ForEach(o =>
{
o.bom_child_examine_id = bc_ex.Id; o.company_id = param.company_id; o.tenant_id = param.company_id;
o.factory_id = param.factoryId;
});
mooccupyList.AddRange(olist);
}
if (s.make_list != null)
{
var mlist = ObjectMapper.Map, List>(s.make_list);
mlist.ForEach(o =>
{
o.bom_child_examine_id = bc_ex.Id; o.company_id = param.company_id; o.tenant_id = param.company_id;
o.factory_id = param.factoryId;
});
moorderList.AddRange(mlist);
}
if (s.subcontracting_list != null)
{
var slist = ObjectMapper.Map, List>(s.subcontracting_list);
slist.ForEach(o =>
{
o.bom_child_examine_id = bc_ex.Id; o.company_id = param.company_id; o.tenant_id = param.company_id;
o.factory_id = param.factoryId;
});
ooderList.AddRange(slist);
}
if (s.purchase_list != null)
{
var plist = ObjectMapper.Map, List>(s.purchase_list);
plist.ForEach(o =>
{
o.bom_child_examine_id = bc_ex.Id; o.company_id = param.company_id; o.tenant_id = param.company_id;
o.factory_id = param.factoryId;
});
purchaseList.AddRange(plist);
}
if (s.purchase_occupy_list != null)
{
var purlist = ObjectMapper.Map, List>(s.purchase_occupy_list);
purlist.ForEach(o =>
{
o.bom_child_examine_id = bc_ex.Id; o.company_id = param.company_id; o.tenant_id = param.company_id;
o.factory_id = param.factoryId;
});
purchaseoccupyList.AddRange(purlist);
}
});
}
using (var unitOfWork = _unitOfWorkManager.Begin(false, true))
{
try
{
if (examineList.Any())
{
_businessBangDbContext.BulkInsert(examineList);
}
if (bomExamineList.Any())
{
_businessBangDbContext.BulkInsert(bomExamineList.OrderBy(s => s.num_order).ToList());
}
if (mooccupyList.Any())
{
_businessBangDbContext.BulkInsert(mooccupyList);
}
if (moorderList.Any())
{
_businessBangDbContext.BulkInsert(moorderList);
}
if (ooderList.Any())
{
_businessBangDbContext.BulkInsert(ooderList);
}
if (purchaseList.Any())
{
_businessBangDbContext.BulkInsert(purchaseList);
}
if (purchaseoccupyList.Any())
{
_businessBangDbContext.BulkInsert(purchaseoccupyList);
}
await unitOfWork.CompleteAsync();
}
catch (Exception e)
{
new NLogHelper("ResourceExamineAppService").WriteLog("ReceiveResult", "资源检查计算结果相关数据更新失败:" + e.Message, _currentTenant.Id.ToString());
unitOfWork.Dispose();
}
}
}
//PR手动合并
public async Task PrMerge(string ids)
{
//物料、供应商为相同才允许合并。
var idList = AnalysisIdList(ids);
List prlist = _mysql_srm_pr_main.GetListAsync(s => idList.Contains(s.Id)).Result;
if (prlist.Any())
{
if (prlist.Where(s => s.state == 0).Count() > 0)
{
return JsonConvert.SerializeObject("所选包含已关闭采购申请,请重新选择。");
}
/*if (prlist.Where(s => s.state == 2).Count() > 0)
{
return JsonConvert.SerializeObject("所选包含已提交评审采购申请,请重新选择。");
}
if (prlist.Where(s => s.state == 4).Count() > 0)
{
return JsonConvert.SerializeObject("所选包含已评审通过采购申请,请重新选择。");
}*/
var list = prlist.GroupBy(s => new { s.icitem_id, s.pr_purchaseid, s.IsRequireGoods, s.supplier_type });
if (list.Count() > 1)
{
return JsonConvert.SerializeObject("所选行的物料编码、供应商名称、采购类型、供应类别必须相同");
}
}
else {
return JsonConvert.SerializeObject("所选采购申请单未找到,请刷新界面重新操作。");
}
List occupylist = _mysql_srm_po_occupy.GetListAsync(s => idList.Contains(s.polist_id.GetValueOrDefault())).Result;
srm_pr_main srm_Pr = help.DeepCopy(prlist[0]);
srm_Pr.GenerateNewId(help.NextId());
srm_Pr.pr_billno = prlist[0].pr_type == 2 ? _CalcBomViewAppService.getOrderNum("WWPR") : _CalcBomViewAppService.getOrderNum("PR");//pr单号
srm_Pr.state = 1;
/*if (mes_morder != null)
{
srm_Pr.pr_mono = mes_morder.morder_no;//关联工单号
srm_Pr.entity_id = 1;//工单行号
}*/
srm_Pr.pr_purchaseid = prlist[0].pr_purchaseid;//供应商id
srm_Pr.pr_purchasenumber = prlist[0].pr_purchasenumber;//供应商编码
srm_Pr.pr_purchasename = prlist[0].pr_purchasename;//供应商名称
srm_Pr.pr_purchaser = prlist[0].pr_purchaser;//采购员
srm_Pr.pr_purchaser_num = prlist[0].pr_purchaser_num;//采购员工号(采购信息表)*//*
srm_Pr.pr_rqty = prlist.Sum(s => s.pr_rqty);//需求数量
srm_Pr.pr_aqty = prlist.Sum(s => s.pr_aqty);//申请数量
srm_Pr.pr_sqty = prlist.Sum(s => s.pr_sqty);//建议数量
srm_Pr.pr_ssend_date= prlist.Min(s => s.pr_ssend_date);//系统建议下单日期
srm_Pr.pr_sarrive_date = prlist.Min(s => s.pr_sarrive_date);//系统建议到达日期(建议到货日期)
/* srm_Pr.pr_psend_date = prlist.Min(s => s.pr_psend_date);//计划下单日期
srm_Pr.pr_parrive_date = prlist.Min(s => s.pr_parrive_date);//计划到达日期
srm_Pr.pr_rarrive_date = prlist.Min(s => s.pr_rarrive_date);//需求到货日期*/
//srm_Pr.pr_sysprice = prlist.Sum(s => s.pr_rqty) * prlist[0].pr_price * (1 + prlist[0].pr_rate);//系统价格(含税)
srm_Pr.pr_orderprice = prlist.Sum(s => s.pr_aqty) * prlist[0].pr_sysprice;//订单价格(含税)
/*srm_Pr.icitem_id = returnlist.item_id;//物料id
srm_Pr.icitem_name = returnlist.item_name;//物料名称
srm_Pr.pr_order_type = 1;//单据类型
srm_Pr.pr_ssend_date = DateTime.Now;//系统建议下单日期
srm_Pr.pr_price = prlist[0].pr_price;//采购净价(不含税)
srm_Pr.pr_rate = prlist[0].pr_rate;//税率
srm_Pr.pr_unit = prlist[0].pr_unit;//单位
srm_Pr.state = prlist[0].state;//状态
srm_Pr.old_apply_aqty = prlist[0].old_apply_aqty;//已申请数量
srm_Pr.pr_type = prlist[0].pr_type;//申请类型
srm_Pr.currencytype = prlist[0].currencytype;//币种
srm_Pr.secInv_ratio = prlist[0].secInv_ratio;//安全库存触发采购比例
srm_Pr.tenant_id = prlist[0].tenant_id;
srm_Pr.factory_id = prlist[0].factory_id;*/
prlist.ForEach(s => { s.state = 0; s.refer_pr_billno = srm_Pr.pr_billno; });
occupylist.ForEach(s => { s.polist_id = srm_Pr.Id; });
using (var unitOfWork = _unitOfWorkManager.Begin(false, true))
{
try
{
_businessDbContext.BulkUpdate(prlist);
_businessDbContext.BulkInsert(new List { srm_Pr });
_businessDbContext.BulkUpdate(occupylist);
await unitOfWork.CompleteAsync();
}
catch (Exception e)
{
new NLogHelper("ResourceExamineAppService").WriteLog("PrMerge", "采购申请单合并数据更新失败:" + e.Message, _currentTenant.Id.ToString());
unitOfWork.Dispose();
return JsonConvert.SerializeObject(e.Message);
}
}
return JsonConvert.SerializeObject("ok");
}
//PR自动合并
public void PrAutoMerge(string companyid)
{
//TODO:先按每周四调度任务循环,周五下单处理
//拉取所有,然后根据送货周期来合并第一次得合并数据
//List prlist = _mysql_srm_pr_main.GetListAsync(s => s.state == 1 || s.state == 2).Result;
//直接按间隔多少天一次来处理数据,定时任务按周四来考虑。
DateTime toTime = DateTime.Now; //new DateTime(2023, 7, 6);
DateTime starttime = toTime.Date.AddDays(8);
DateTime endtime = toTime.Date.AddDays(14);
List prlist = _mysql_srm_pr_main.GetListAsync(s => s.company_id.ToString() == companyid && s.pr_ssend_date >= starttime && s.pr_ssend_date <= endtime && s.state == 1).Result;
List ic_Items = _mysql_ic_item.GetListAsync(s => s.company_id.ToString() == companyid && prlist.Select(c => c.icitem_id).Contains(s.Id)).Result;
var occupylist = _mysql_srm_po_occupy.GetListAsync(s => prlist.Select(c => c.Id).Contains(s.polist_id.GetValueOrDefault()) && s.company_id.ToString() == companyid && s.IsDeleted == false).Result;
List prWeekDtos = new List();
List insetPrList = new List();
List updatePrList = new List();
var moPrlist = ObjectMapper.Map, List>(prlist);
foreach (var pr in prlist)
{
bool bl = pr.sentry_id == null;//区分是销售订单和非销售订单的合并。
//找到是否生成了新的PR 当前数据是否已经产生合并,则不再合并。
var newPr = insetPrList.Find(s => s.pr_purchaseid == pr.pr_purchaseid && s.icitem_id == pr.icitem_id && s.IsRequireGoods == pr.IsRequireGoods && s.supplier_type==pr.supplier_type && (s.sentry_id == null) == bl);
//var newPr = insetPrList.Find(s => s.pr_purchaseid == pr.pr_purchaseid && s.icitem_id == pr.icitem_id);
if (newPr == null)
{
//有多条才进行合并
var ilist = prlist.Where(s => s.pr_purchaseid == pr.pr_purchaseid && s.icitem_id == pr.icitem_id && s.IsRequireGoods == pr.IsRequireGoods && s.supplier_type == pr.supplier_type && (s.sentry_id == null) == bl).ToList();
//var ilist = prlist.Where(s => s.pr_purchaseid == pr.pr_purchaseid && s.icitem_id == pr.icitem_id).ToList();
if (ilist.Count > 1)
{
var icitem = ic_Items.Find(s => s.Id == pr.icitem_id);
var prRefoccupy = occupylist.Where(s => s.polist_id == pr.Id).ToList();
newPr = help.DeepCopy(pr);
newPr.GenerateNewId(help.NextId());
prRefoccupy.ForEach(a => {
a.polist_id = newPr.Id;
});
newPr.pr_billno = pr.pr_type == 2 ? _CalcBomViewAppService.getOrderNum("WWPR") : _CalcBomViewAppService.getOrderNum("PR");//pr单号
newPr.state = pr.state;
newPr.pr_rqty = ilist.Sum(s => s.pr_rqty);//需求数量
newPr.pr_aqty = ilist.Sum(s => s.pr_aqty);//申请数量
newPr.pr_sqty = ilist.Sum(s => s.pr_sqty);//建议数量
newPr.pr_ssend_date = ilist.Min(s => s.pr_ssend_date);//系统建议下单日期
newPr.pr_sarrive_date = ilist.Min(s => s.pr_sarrive_date);//系统建议到达日期(建议到货日期)
/* newPr.pr_psend_date = ilist.Min(s => s.pr_psend_date);//计划下单日期
newPr.pr_parrive_date = ilist.Min(s => s.pr_parrive_date);//计划到达日期
newPr.pr_rarrive_date = ilist.Min(s => s.pr_rarrive_date);//需求到货日期*/
//newPr.pr_sysprice = newPr.pr_rqty * pr.pr_price * (1 + pr.pr_rate);//系统价格(含税)
newPr.pr_orderprice = newPr.pr_aqty * pr.pr_sysprice;//订单价格(含税)
ilist.ForEach(s => { s.refer_pr_billno = newPr.pr_billno; });
insetPrList.Add(newPr);
ilist.ForEach(s => { s.state = 0; });
updatePrList.AddRange(ilist);
}
}
}
#region 此逻辑是处理按每周几送货实现,先屏蔽
/*foreach (var pr in moPrlist)
{
var pur = purchaselist.Find(s => s.icitem_id == pr.icitem_id && s.supplier_id == pr.pr_purchaseid);
if (pur != null)
{
if (pur.is_week)
{
var prDtos = prWeekDtos.Where(s => s.icitem_id == pr.icitem_id && s.pr_purchaseid == pr.pr_purchaseid).ToList();
if (!prDtos.Any())
{
prDtos = AnalysisIntervalData(pur.is_days, pr);
prWeekDtos.AddRange(prDtos);
}
//判断当前PR属于哪个区间
if (prDtos.Any())
{
foreach (var dto in prDtos)
{
int wk = (int)pr.pr_rarrive_date.GetValueOrDefault().DayOfWeek;
wk = wk == 0 ? 7 : wk;
if (dto.weekList.Contains(wk))
{
if (wk >= dto.week)
{
pr.pr_rarrive_date = pr.pr_rarrive_date.GetValueOrDefault().Date.AddDays(dto.week - wk);
}
else {
//wk 2 week 5
pr.pr_rarrive_date = pr.pr_rarrive_date.GetValueOrDefault().Date.AddDays(0 - wk - (7 - dto.week));
}
break;
}
}
}
else {
//如果没有则还是需要处理
}
}
else
{
//如果此物料没有设置周期送货,则所有数据合并为一个PR,转成一个PO
}
}
}*/
#endregion
using (var unitOfWork = _unitOfWorkManager.Begin(false, true))
{
try
{
if (insetPrList.Any())
{
_businessDbContext.BulkInsert(insetPrList);
}
if (updatePrList.Any())
{
_businessDbContext.BulkUpdate(updatePrList);
}
if (occupylist.Any())
{
_businessDbContext.BulkUpdate(occupylist);
}
unitOfWork.CompleteAsync();
}
catch (Exception e)
{
unitOfWork.Dispose();
new NLogHelper("ResourceExamineAppService").WriteLog("PrAutoMerge", "采购申请单自动合并更新失败:" + e.Message, _currentTenant.Id.ToString());
};
}
}
///
/// 解析按周频率送货方式
///
///
///
///
private List AnalysisIntervalData(string is_days,mo_srm_pr_main pr)
{
List prWeekDtos = new List();
//周期送货,需要对数据进行按周期区分
if (!string.IsNullOrEmpty(is_days))
{
string[] days = JsonConvert.DeserializeObject(is_days);
List weekInt = new List();
foreach (var d in days)
{
if (!string.IsNullOrEmpty(d))
{
weekInt.Add(int.Parse(d));
}
}
weekInt.Sort();
//解析区间值
for (int idx = 0; idx < weekInt.Count; idx++)
{
PrWeekDto dto = new PrWeekDto();
dto.week = weekInt[idx];
dto.weekList = new List();
dto.icitem_id = pr.icitem_id.Value;
dto.pr_purchaseid = pr.pr_purchaseid.Value;
//判断如果还有送货日期,则需要设定区间范围包含本次和下次之前的周期
if (idx + 1 < weekInt.Count)
{
int end = weekInt[idx + 1];
for (int start = dto.week; start < end; start++)
{
dto.weekList.Add(start);
}
}
else
{
//假设 就定了周一
int count = 7 - dto.week + weekInt[0];
for (int start = 0; start < count; start++)
{
if (dto.week + start > 7)
{
dto.weekList.Add(dto.week + start - 7);
}
else
{
dto.weekList.Add(dto.week + start);
}
}
}
prWeekDtos.Add(dto);
}
}
return prWeekDtos;
}
/*
int getDateWeekRang(DateTime tmpDate)
{
var startDateStr = tmpDate.Date.AddDays(-(int)(tmpDate.DayOfWeek) + 1).ToString("yyyy-MM-dd");//当前周的开始日期
var endDateStr = tmpDate.Date.AddDays(7 - (int)(tmpDate.DayOfWeek)).ToString("yyyy-MM-dd");//当前周的结束日期
GregorianCalendar gc = new System.Globalization.GregorianCalendar();
int weekOfYear = gc.GetWeekOfYear(tmpDate, System.Globalization.CalendarWeekRule.FirstDay, DayOfWeek.Monday);
return weekOfYear;
}*/
//PR自动审核
public async Task