using Business.Core.Enum;
using Business.Core.MongoDBHelper;
using Business.Core.Utilities;
using Business.EntityFrameworkCore;
using Business.ResourceExamineManagement.Dto;
using Business.EntityFrameworkCore.SqlRepositories;
using Business.Model.Bang;
using Business.Model.MES.IC;
using Business.Model.Production;
using Business.Model.Sale;
using Business.Model.SRM;
using Business.Model.Tech;
using Business.MongoModel.MES.IC;
using Business.MongoModel.Production;
using Business.MongoModel.SRM;
using Business.MongoModel.Tech;
using Microsoft.EntityFrameworkCore;
using MongoDB.Driver;
using MongoDB.Driver.Linq;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
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.MultiTenancy;
using EFCore.BulkExtensions;
using Business.Quartz;
using MongoDB.Bson.Serialization.Attributes;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
using System.Diagnostics.CodeAnalysis;
using System.Diagnostics;
using Volo.Abp.Uow;
using Spire.Pdf.Exporting.XPS.Schema;
using Business.PriorityManagement;
using Newtonsoft.Json.Linq;
namespace Business.ResourceExamineManagement
{
///
/// 资源检查
///
//[Authorize(BusinessPermissions.ResourceExamine.Default)]
public class ResourceExamineAppService : ApplicationService, IResourceExamineAppService, ITransientDependency
{
#region 服务
SnowFlake help = new SnowFlake();
private readonly ICurrentTenant _currentTenant;
///
/// 工艺路径
///
private readonly IMongoDB _mes_technique;
///
/// 工序
///
private readonly IMongoDB _mes_process;
///
/// 工艺关联工序
///
private readonly IMongoDB _mes_tech_process;
///
/// 工艺工序关联工位
///
private readonly IMongoDB _mes_tech_proc_workshop;
///
/// 物料占用记录
///
private readonly IMongoDB _ic_item_stockoccupy;
///
/// 物料详情
///
private readonly IMongoDB _ic_item;
private IRepository _mysql_ic_item;
///
/// 物料BOM
///
private readonly IMongoDB _ic_bom;
private IRepository _mysql_ic_bom;
///
/// 物料BOM明细
///
private readonly IMongoDB _ic_bom_child;
private IRepository _mysql_ic_bom_child;
///
/// 物料库存表
///
private readonly IMongoDB _ic_item_stock;
private IRepository _mysql_ic_item_stock;
///
/// 物料采购计划表
///
private readonly IMongoDB _ic_plan;
private IRepository _mysql_ic_plan;
///
/// 物料工厂明细表
///
private readonly IMongoDB _ic_factory_details;
private IRepository _mysql_ic_factory_details;
///
/// 物料采购报价单
///
private readonly IMongoDB _srm_purchase;
private IRepository _mysql_srm_purchase;
///
/// 采购申请单
///
private readonly IMongoDB _srm_pr_main;
private IRepository _mysql_srm_pr_main;
///
/// 采购订单表
///
private readonly IMongoDB _srm_po_main;
private IRepository _mysql_srm_po_main;
///
/// 采购订单明细表
///
private readonly IMongoDB _srm_po_list;
private IRepository _mysql_srm_po_list;
///
/// 采购订单占用详情
///
private readonly IMongoDB _srm_po_occupy;
private IRepository _mysql_srm_po_occupy;
///
/// 供应商
///
private readonly IMongoDB _srm_supplier;
private IRepository _mysql_srm_supplier;
///
/// 委外工单
///
private readonly IMongoDB _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 IMongoDB _ic_check;
///
/// 替代群组
///
private readonly IMongoDB _ic_substitute;
///
/// 替代群组
///
private readonly IMongoDB _ic_substitute_group;
///
/// 替代群组
///
private readonly IMongoDB _ic_substitute_group_detail;
///
/// 生产工单主表
///
private readonly IMongoDB _mes_morder;
///
/// 生产工单子表
///
private readonly IMongoDB _mes_moentry;
///
/// 在制工单占用记录表
///
private readonly IMongoDB _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;
///
/// 标准BOM表
///
private readonly ISqlRepository _productStructureMaster;
private readonly ISqlRepository _workOrdRouting;
private readonly ISqlRepository _workOrdMaster;
private readonly ISqlRepository _workOrdDetail;
private readonly ISqlRepository _rf_serialnumber;
///
/// 资源检查入参
///
private readonly SeorderentryDto param = new SeorderentryDto();
///
/// 预处理
///
private readonly PretreatmentAppService _pretreatmentAppService;
///
/// 在途检查
///
private readonly PurchaseOrderAppService _purchaseOrderAppService;
///
/// 工单App
///
private readonly MorderAppService _morderAppService;
///
/// 计算BOM平铺物料情况
///
private readonly CalcBomViewAppService _CalcBomViewAppService;
private List leadTimeList;
private List supplierList;
private List planList;
private readonly BusinessBangDbContext _businessBangDbContext;
private readonly BusinessDbContext _businessDbContext;
private readonly ISqlRepository _tagMasterRepository;
///
/// 生产周期明细
///
private ISqlRepository _periodSequenceDet;
///
/// 生产线维护表
///
private ISqlRepository _lineMaster;
private ISqlRepository _itemMaster;
private ISqlRepository _nbrMaster;
private ISqlRepository _nbrDetail;
///
/// 生产排产
///
private readonly ProductionScheduleAppService _productionScheduleAppService;
///
/// 优先级
///
private readonly PriorityAppService _priorityAppService;
#endregion
#region 构造函数
///
/// 构造函数
///
///
///
public ResourceExamineAppService(
IMongoDB mes_technique,
IMongoDB mes_process,
IMongoDB mes_tech_process,
IMongoDB mes_tech_proc_workshop,
IMongoDB ic_item,
IMongoDB ic_bom,
IMongoDB ic_bom_child,
IMongoDB ic_item_stock,
IMongoDB ic_check,
IMongoDB ic_factory_details,
IMongoDB mes_oorder,
IMongoDB srm_pr_main,
IMongoDB srm_po_main,
IMongoDB srm_po_list,
IMongoDB srm_po_occupy,
IMongoDB srm_purchase,
IMongoDB ic_plan,
IMongoDB ic_substitute,
IMongoDB ic_substitute_group,
IMongoDB ic_substitute_group_detail,
IMongoDB mes_morder,
IMongoDB mes_moentry,
IMongoDB mes_mooccupy,
IMongoDB ic_item_stockoccupy,
IMongoDB 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_factory_details,
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_ic_plan,
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 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,
PriorityAppService priorityAppService,
ISqlRepository rf_serialnumber
)
{
_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;
_ic_check = ic_check;
_ic_factory_details = ic_factory_details;
_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_plan = ic_plan;
_ic_substitute = ic_substitute;
_ic_substitute_group = ic_substitute_group;
_ic_substitute_group_detail = 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_factory_details = mysql_ic_factory_details;
_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_ic_plan = mysql_ic_plan;
_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;
_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;
_priorityAppService= priorityAppService;
_rf_serialnumber = rf_serialnumber;
}
#endregion
///
/// 资源检查
///
///
///
///
public async Task ReceiveResult(ResourceCheckInputDto input)
{
//资源检查入参全局变量赋值
param.sorderId = input.sorderId;
param.tenantId = input.tenantId;
param.factoryId = input.factoryId;
param.checkflag = true;
//资源检查结果
PschedDto rtn = new PschedDto();
rtn.sorderid = input.sorderId;
//资源检查明细list
List examines = new List();
ExamineResult dtl;
//生成当前计算bangid
long bangid = help.NextId();
//获取订单数据
crm_seorder sorder = _mysql_crm_seorder.GetListAsync(p => p.tenant_id == input.tenantId && p.factory_id == input.factoryId && p.Id == input.sorderId && !p.IsDeleted).Result.FirstOrDefault();
if (sorder == null)
{
new NLogHelper("ResourceExamineAppService").WriteLog("ReceiveResult", "订单数据不存在", _currentTenant.Id.ToString());
throw new NotImplementedException("订单数据不存在!");
}
//获取订单行数据
List sentrys = await _mysql_crm_seorderentry.GetListAsync(p => p.tenant_id == input.tenantId && p.factory_id == input.factoryId && p.seorder_id == input.sorderId && !p.IsDeleted);
//删除同步Mysql后旧数据
await DeleteMySqlOldData(sentrys);
//数据库快照-同步mysql库数据到mongoDB中
await DbSnapShot(input.tenantId, input.factoryId, bangid);
//通过订单行的产品代码获取物料BOM数据
List boms = _ic_bom.Find(p => sentrys.Select(m => m.item_number).Contains(p.item_number) && p.factory_id == input.factoryId && p.tenant_id == input.tenantId && !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(autoCreates);
pretreatments = _mysql_b_bom_pretreatment.GetListAsync(s => boms.Select(c => c.mysql_id).ToList().Contains(s.sourceid)).Result;
}
DataInitialization(boms, bangid, sorder, icitemlist, stocklist, pretreatments);
foreach (var item in sentrys)
{
//获取销售订单“是否加急”字段
int urgent = sorder.urgent;
//工单资源检查信息
dtl = new ExamineResult();
dtl.sorderid = rtn.sorderid;
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;
//获取当前物料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.CalcView(getBomList, bangid, item.qty.GetValueOrDefault(), item.plan_date, sklist, item, urgent, 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);
//替代关系展开list
dtl.BomChildExamineList = getBomList;
//添加订单行开工信息
examines.Add(dtl);
}
//批量保存 后期考虑子工单
if (_CalcBomViewAppService.mordersInsertList.Any())
{
_CalcBomViewAppService.mordersInsertList.ForEach(s => { s.tenant_id = param.tenantId; s.factory_id = param.factoryId; });
await _mes_morder.InsertMany(_CalcBomViewAppService.mordersInsertList);
var mesorders = ObjectMapper.Map, List>(_CalcBomViewAppService.mordersInsertList);
_businessDbContext.BulkInsert(mesorders);
rtn.mordersList = _CalcBomViewAppService.mordersInsertList;
//插入工单相关数据
CreateWorkOrdDates(_CalcBomViewAppService.mordersInsertList);
}
if (_CalcBomViewAppService.mooccupyAllInsertList.Any())
{
_CalcBomViewAppService.mooccupyAllInsertList.ForEach(s => { s.tenant_id = param.tenantId; s.factory_id = param.factoryId; });
await _mes_mooccupy.InsertMany(_CalcBomViewAppService.mooccupyAllInsertList);
rtn.mooccupyAllList = _CalcBomViewAppService.mooccupyAllInsertList;
}
if (_CalcBomViewAppService.moentriesInsertList.Any())
{
_CalcBomViewAppService.moentriesInsertList.ForEach(s => { s.tenant_id = param.tenantId; s.factory_id = param.factoryId; });
await _mes_moentry.InsertMany(_CalcBomViewAppService.moentriesInsertList);
var mesmoentrys = ObjectMapper.Map, List>(_CalcBomViewAppService.moentriesInsertList);
_businessDbContext.BulkInsert(mesmoentrys);
}
if (_CalcBomViewAppService.orderList.Any())
{
_CalcBomViewAppService.orderList.ForEach(s => { s.tenant_id = param.tenantId; s.factory_id = param.factoryId; });
await _mes_oorder.InsertMany(_CalcBomViewAppService.orderList);
var ooders = ObjectMapper.Map, List>(_CalcBomViewAppService.orderList);
_businessDbContext.BulkInsert(ooders);
rtn.order_list = _CalcBomViewAppService.orderList;
}
if (sklist.Any())
{
sklist.ForEach(s => { s.id = help.NextId(); s.tenant_id = param.tenantId; s.factory_id = param.factoryId; });
await _ic_item_stockoccupy.InsertMany(sklist);
}
if (_CalcBomViewAppService.srm_Po_OccupiesInsert.Any())
{
_CalcBomViewAppService.srm_Po_OccupiesInsert.ForEach(s => { s.tenant_id = param.tenantId; s.factory_id = param.factoryId; });
await _srm_po_occupy.InsertMany(_CalcBomViewAppService.srm_Po_OccupiesInsert);
}
if (_CalcBomViewAppService.SRMPRDtoList.Any())
{
List> prlist = _CalcBomViewAppService.SRMPRDtoList.Where(f => f.srm_Pr_Main != null).Select(s => s.srm_Pr_Main).ToList();
List list = new List();
foreach (var pr in prlist)
{
foreach (var item in pr)
{
list.Add(item);
}
}
if (list.Any())
{
await _srm_pr_main.InsertMany(list);
var pr_mainlist = ObjectMapper.Map, List>(list);
_businessDbContext.BulkInsert(pr_mainlist);
AutoCreatePOFromPR(list, bangid, input);
}
rtn.srm_pr_list = _CalcBomViewAppService.SRMPRDtoList;
}
rtn.examines = examines;
rtn.item_stockoccupy_list = sklist;
//检查结果写入数据库
var b_Examine_Results = ObjectMapper.Map, List>(rtn.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 rtn.examines)
{
var b_ex = ObjectMapper.Map(ex);
b_ex.GenerateNewId();// = help.NextId();
if (_CalcBomViewAppService.mordersInsertList.Any())
{
b_ex.morder_id = _CalcBomViewAppService.mordersInsertList[0].mysql_id;
b_ex.morder_no = _CalcBomViewAppService.mordersInsertList[0].morder_no;
}
b_ex.create_time = DateTime.Now;
b_ex.tenant_id = param.tenantId;
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.tenant_id = param.tenantId;
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.tenant_id = param.tenantId;
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.tenant_id = param.tenantId;
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.tenant_id = param.tenantId;
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.tenant_id = param.tenantId;
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.tenant_id = param.tenantId;
o.factory_id = param.factoryId;
});
purchaseoccupyList.AddRange(purlist);
}
});
}
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 ClearSnapShot(bangid);
//return JsonConvert.SerializeObject(rtn);
return JsonConvert.SerializeObject("ok");
}
///
/// 通过ic_bom获取工艺路径数据
///
///
///
public List GetMesTechniques(List ic_Boms)
{
List techniques = new List();
//foreach (var item in ic_Boms)
//{
// mo_mes_technique entity = _mes_technique.Find(p => p.bom == item.bom_number && p.bomver == item.version && p.tenant_id == param.tenantId && p.factory_id == param.factoryId && !p.IsDeleted).Result.FirstOrDefault();
// if (entity != null)
// {
// techniques.Add(entity);
// }
//}
var builder = Builders.Filter;
var filters = new List>();
ic_Boms?.ForEach(item =>
{
var filter = builder.Eq(x => x.bom, item.bom_number)
& builder.Eq(x => x.bomver, item.version)
& builder.Eq(x => x.tenant_id, param.tenantId)
& builder.Eq(x => x.factory_id, param.factoryId)
& builder.Eq(x => x.IsDeleted, false);
filters.Add(filter);
});
techniques = _mes_technique.Find(builder.Or(filters)).Result;
return techniques;
}
///
/// 递归:获取icbom,icbomchild数据
///
///
///
///
public void GetIcBomData(List icBoms, List bomlist, List bomchildlist)
{
if (icBoms.Count() == 0)
{
return;
}
//添加物料bom数据
foreach (var ib in icBoms)
{
if (!bomlist.Exists(s => s.mysql_id == ib.mysql_id))
{
bomlist.Add(ib);
}
}
//获取物料bom明细数据
//List childList = _ic_bom_child.GetManyByCondition(p => icBoms.Select(m => m.mysql_id).Contains(p.bom_id) && p.use_status == 1 && p.tenant_id == param.tenantId && p.factory_id == param.factoryId && !p.IsDeleted).Result.ToList();
List childList = _ic_bom_child.GetManyByCondition(p => icBoms.Select(m => m.mysql_id).Contains(p.bom_id) && p.tenant_id == param.tenantId && p.factory_id == param.factoryId && !p.IsDeleted).Result.ToList();
//没有明细数据,终止
if (childList.Count == 0)
{
return;
}
foreach (var bchild in childList)
{
if (!bomchildlist.Exists(s => s.mysql_id == bchild.mysql_id))
{
bomchildlist.Add(bchild);
}
}
//通过物料bom明细数据反查物料bom数据
var boms = _ic_bom.GetManyByCondition(p => childList.Select(m => m.icitem_id).ToList().Contains(p.icitem_id) && p.use_status == 1 && p.tenant_id == param.tenantId && p.factory_id == param.factoryId && !p.IsDeleted).Result.ToList();
foreach (var chd in childList)
{
var curBoms = boms.Where(p => p.icitem_id == chd.icitem_id).ToList();
GetIcBomData(curBoms, bomlist, bomchildlist);
}
}
///
/// 删除旧订单行数据
///
///
///
///
///
public async Task DeleteMySqlOldData(List soentry_id)
{
List sentryids = soentry_id.Select(p => p.Id).ToList();
//删除工单相关表数据
/*var mes_moentry = _mysql_mes_moentry.GetListAsync(x => sentryids.Contains(x.soentry_id.Value)).Result;
var mes_morder = _mysql_mes_morder.GetListAsync(x => mes_moentry.Select(p => p.moentry_moid).ToList().Contains(x.Id)).Result;
if (mes_moentry.Count > 0)
{
await _mysql_mes_moentry.DeleteManyAsync(mes_moentry);
}
if (mes_morder.Count > 0)
{
await _mysql_mes_morder.DeleteManyAsync(mes_morder);
}*/
var mysql_mes_mooccupy = _mysql_mes_mooccupy.GetListAsync(x => soentry_id.Select(p => p.Id).Contains(x.moo_id_billid.Value)).Result;
if (mysql_mes_mooccupy.Count > 0)
{
await _mysql_mes_mooccupy.DeleteManyAsync(mysql_mes_mooccupy);
}
/*var srm_pr_main = _mysql_srm_pr_main.GetListAsync(x => soentry_id.Select(p => p.Id).Contains(x.sentry_id.GetValueOrDefault())).Result;
if (srm_pr_main.Count > 0)
{
await _mysql_srm_pr_main.DeleteManyAsync(srm_pr_main);
}*/
/*var mes_oorders = _mysql_mes_oorder.GetListAsync(x => soentry_id.Select(p => p.Id).Contains(x.sentry_id.GetValueOrDefault())).Result;
if (mes_oorders.Count > 0)
{
await _mysql_mes_oorder.DeleteManyAsync(mes_oorders);
}*/
}
///
/// 数据库快照
///
///
public async Task DbSnapShot(long tenantId, long factoryId, long bangid)
{
//同步物料库存数据
var icitemStokc = _mysql_ic_item_stock.GetListAsync(p => p.tenant_id == tenantId && p.factory_id == factoryId).Result;
if (icitemStokc.Count > 0)
{
//设置当前计算bangid
icitemStokc.ForEach(item => { item.bang_id = bangid; });
var moIcitemStokc = ObjectMapper.Map, List>(icitemStokc);
moIcitemStokc.ForEach(item => { item.id = help.NextId(); });
//插入数据
await _ic_item_stock.InsertMany(moIcitemStokc);
}
//在制工单占用记录表
var mes_mooccupy = _mysql_mes_mooccupy.GetListAsync(x => x.tenant_id == tenantId && x.factory_id == factoryId).Result;
if (mes_mooccupy.Count > 0)
{
mes_mooccupy.ForEach(item => { item.bang_id = bangid; });
var moMes_mooccupy = ObjectMapper.Map, List>(mes_mooccupy);
moMes_mooccupy.ForEach(item => { item.id = help.NextId(); });
await _mes_mooccupy.InsertMany(moMes_mooccupy);
}
//工单主表
var mes_morder = _mysql_mes_morder.GetListAsync(x => x.tenant_id == tenantId && x.factory_id == factoryId).Result;
if (mes_morder.Count > 0)
{
mes_morder.ForEach(item => { item.bang_id = bangid; });
var moMes_morder = ObjectMapper.Map, List>(mes_morder);
moMes_morder.ForEach(item => { item.id = help.NextId(); });
await _mes_morder.InsertMany(moMes_morder);
}
//工单子表
var mes_moentry = _mysql_mes_moentry.GetListAsync(x => x.tenant_id == tenantId && x.factory_id == factoryId).Result;
if (mes_moentry.Count > 0)
{
mes_moentry.ForEach(item => { item.bang_id = bangid; });
var moMes_moentry = ObjectMapper.Map, List>(mes_moentry);
moMes_moentry.ForEach(item => { item.id = help.NextId(); });
await _mes_moentry.InsertMany(moMes_moentry);
}
//TODO:要不要根据某些条件只同步有效的数据
//采购订单
var srm_po_main = _mysql_srm_po_main.GetListAsync(x => x.tenant_id == tenantId && x.factory_id == factoryId).Result;
if (srm_po_main.Count > 0)
{
srm_po_main.ForEach(item => { item.bang_id = bangid; });
var moSrm_po_main = ObjectMapper.Map, List>(srm_po_main);
moSrm_po_main.ForEach(item => { item.id = help.NextId(); });
await _srm_po_main.InsertMany(moSrm_po_main);
}
//采购订单明细
var srm_po_list = _mysql_srm_po_list.GetListAsync(x => x.tenant_id == tenantId && x.factory_id == factoryId).Result;
if (srm_po_list.Count > 0)
{
srm_po_list.ForEach(item => { item.bang_id = bangid; });
var moSrm_po_list = ObjectMapper.Map, List>(srm_po_list);
moSrm_po_list.ForEach(item => { item.id = help.NextId(); });
await _srm_po_list.InsertMany(moSrm_po_list);
}
//采购订单占用详情
var srm_po_occupy = _mysql_srm_po_occupy.GetListAsync(x => x.tenant_id == tenantId && x.factory_id == factoryId).Result;
if (srm_po_occupy.Count > 0)
{
srm_po_occupy.ForEach(item => { item.bang_id = bangid; });
var moSrm_po_occupy = ObjectMapper.Map, List>(srm_po_occupy);
moSrm_po_occupy.ForEach(item => { item.id = help.NextId(); });
await _srm_po_occupy.InsertMany(moSrm_po_occupy);
}
}
///
/// 清处数据库快照
///
///
public async Task ClearSnapShot(long bangid)
{
//清除物料库存数据
await _ic_item_stock.Delete(p => p.bang_id == bangid);
//清除工单占用记录表
await _mes_mooccupy.Delete(p => p.bang_id == bangid);
//清除工单主表
await _mes_morder.Delete(p => p.bang_id == bangid);
//清除工单子表
await _mes_moentry.Delete(p => p.bang_id == bangid);
//清除采购订单
await _srm_po_main.Delete(p => p.bang_id == bangid);
//清除采购订单明细
await _srm_po_list.Delete(p => p.bang_id == bangid);
//清除采购订单占用详情
await _srm_po_occupy.Delete(p => p.bang_id == bangid);
}
///
/// 根据物料id获取物料4个提前期
///
/// 物料id
/// 企业id
/// 工厂id
///
private List GetLeadTime(List icItemIds, long tenantId, long factoryid)
{
ProjectionDefinitionBuilder project = new ProjectionDefinitionBuilder();
return _ic_factory_details.Find(p => icItemIds.Contains(p.icitem_id) && p.factory_id == factoryid && p.tenant_id == tenantId && !p.IsDeleted,
project.Include(p => p.icitem_id).Include(p => p.production_leadtime).Include(p => p.stock_leadtime).
Include(p => p.transportation_leadtime).Include(p => p.order_leadtime).Include(p => p.minorderqty)).Result.
Select(x => new ICItemLeadTimeDto
{
item_id = x.icitem_id,
transportation_leadtime = x.transportation_leadtime,
stock_leadtime = x.stock_leadtime,
production_leadtime = x.production_leadtime,
order_leadtime = x.order_leadtime,
minorderqty = x.minorderqty
}).AsQueryable().ToList();
}
//根据物料id获取物料供应商
private List GetSupplier(List icItemIds, long tenantId, long factoryid)
{
return _srm_purchase.Find(p => icItemIds.Contains(p.icitem_id) && p.tenant_id == tenantId && p.factory_id == factoryid && !p.IsDeleted).Result;
}
//根据物料id获取物料采购计划表
private List GetICPlan(List icItemIds, long tenantId, long factoryid)
{
return _ic_plan.Find(p => icItemIds.Contains(p.icitem_id) && p.tenant_id == tenantId && p.factory_id == factoryid && !p.IsDeleted).Result;
}
///
/// 检查在途量
///
/// 物料列表
/// 工厂id
/// 销售订单交付日期
///
private async Task> CheckOnOrder(List returnlist, long tenantId, long factoryid, DateTime deliveryDate, long bangid)
{
//ToDo:企业Id,数据状态过滤以及isdeleted
var po_list = _srm_po_list.Find(p => returnlist.Select(x => x.item_id).Contains(p.icitem_id.Value) && p.tenant_id == tenantId && p.factory_id == factoryid && p.rarrdate >= DateTime.Now && p.rarrdate < deliveryDate && !p.IsDeleted).Result;
var itemlist = new List();//需要生成采购申请单的物料信息
var leadTimeList = GetLeadTime(returnlist.Select(p => p.item_id).ToList(), tenantId, factoryid);//提前期列表
var supplierList = GetSupplier(returnlist.Select(p => p.item_id).ToList(), tenantId, factoryid);//供应商列表
var planList = GetICPlan(returnlist.Select(p => p.item_id).ToList(), tenantId, factoryid);//plan列表
foreach (var item in returnlist)
{
//缺料
if (item.lack_qty > 0)
{
var itemPO = po_list.FindAll(x => x.icitem_id == item.item_id).OrderBy(v => v.rarrdate).ToList();
if (itemPO.Count <= 0 || itemPO.Sum(p => (p.qty - p.esqty)) < item.lack_qty)
{
//外购生成采购申请单
if (item.erp_cls == 3)
{
//DateTime lastTime = CreateSRMPR(item, tenantId, factoryid, bangid, 2, leadTimeList, supplierList, planList, deliveryDate);
//itemlist.Add(new ICItemDateDto { item_id = item.item_id, dateTime = lastTime });
}
else if (item.erp_cls == 2)
{
//委外生成委外采购申请单和委外工单
//DateTime lastTime = CreateSRMPR(item, tenantId, factoryid, bangid, 1, leadTimeList, supplierList, planList, deliveryDate);
//CreateMesOOder(item, tenantId, factoryid, bangid, leadTimeList, supplierList, deliveryDate);
//itemlist.Add(new ICItemDateDto { item_id = item.item_id, dateTime = lastTime });
}
}
else
{
decimal? itemPOQty = 0;//当前物料已抵扣数量
for (int i = 0; i < itemPO.Count; i++)
{
if (itemPOQty + itemPO[i].qty - itemPO[i].esqty >= item.lack_qty)
{
//在途满足,写占用表
itemlist.Add(new ICItemDateDto { item_id = itemPO[i].icitem_id.Value, dateTime = itemPO[i].rarrdate });
mo_srm_po_occupy po_Occupy = new mo_srm_po_occupy();
po_Occupy.GenerateNewId();
po_Occupy.polist_id = itemPO[i].po_id;//采购订单id
po_Occupy.polist_row = itemPO[i].polist_row;//采购订单行号
po_Occupy.eid = 111;//客户订单行id
po_Occupy.bill_no = 111;//客户订单id
po_Occupy.type = "在途占用";//类型
po_Occupy.entry_id = 1;//行号
po_Occupy.qty = item.lack_qty - itemPOQty;//占用量
po_Occupy.stime = DateTime.Now;//开始时间
po_Occupy.etime = deliveryDate;//结束时间
po_Occupy.state = 1;//占用状态
po_Occupy.cby = "";//变更人
po_Occupy.creason = "";//变更原因
po_Occupy.ctime = DateTime.Now;//变更时间
po_Occupy.bang_id = bangid;
await _srm_po_occupy.InsertOne(po_Occupy);
break;
}
else
{
//不满足逐步扣减
itemPOQty = itemPOQty + itemPO[i].qty - itemPO[i].esqty;
mo_srm_po_occupy po_Occupy = new mo_srm_po_occupy();
po_Occupy.GenerateNewId();
po_Occupy.polist_id = itemPO[i].po_id;//采购订单id
po_Occupy.polist_row = itemPO[i].polist_row;//采购订单行号
po_Occupy.eid = 111;//客户订单行id
po_Occupy.bill_no = 111;//客户订单id
po_Occupy.type = "在途占用";//类型
po_Occupy.entry_id = 1;//行号
po_Occupy.qty = itemPO[i].qty - itemPO[i].esqty;//占用量
po_Occupy.stime = DateTime.Now;//开始时间
po_Occupy.etime = deliveryDate;//结束时间
po_Occupy.state = 1;//占用状态
po_Occupy.cby = "";//变更人
po_Occupy.creason = "";//变更原因
po_Occupy.ctime = DateTime.Now;//变更时间
po_Occupy.bang_id = bangid;
await _srm_po_occupy.InsertOne(po_Occupy);
}
}
}
}
}
return itemlist;
}
/////
///// 生成委外工单
/////
/////
/////
//private DateTime CreateMesOOder(BomChildExamineDto returnlist, long tenantId, long factoryid, long bangId, List iCItemLeadTimes, List supplierList, DateTime deliveryDate)
//{
// mes_oorder oOrder = new mes_oorder();
// oOrder.GenerateNewId();
// oOrder.oorder_no = getOrderNum("WW");//生产工单编号
// oOrder.oorder_type = "委外工单";//生产工单类型
// oOrder.oorder_date = DateTime.Now;//委外订单日期
// oOrder.oorder_state = "已提交";//订单状态
// oOrder.ooentry_prd = 10000;//生产组织
// oOrder.ooentry_prdname = "1000";//生产组织名称
// oOrder.ooentry_wrkc = 10000;//工作中心id
// oOrder.ooentry_wrkcname = "10001";//工作中心名称
// oOrder.planner_num = "wwww";//计划员工号
// oOrder.planner_name = "qqq";//计划员名称
// oOrder.ooentry_stime = DateTime.Now;//计划开工日期
// oOrder.ooentry_etime = DateTime.Now;//计划完工日期
// oOrder.product_code = "产品代码";//产品代码
// oOrder.ffms_number = "1000";//fms旧料号
// oOrder.product_name = "test";//产品名称
// oOrder.specification_model = returnlist.model;//规格型号
// oOrder.bom_number = "";//bom编码
// oOrder.unit = returnlist.unit;//单位
// oOrder.morder_progress = "";//工单进度
// oOrder.morder_production_number = returnlist.lack_qty;//工单生产数量(计划数量)
// oOrder.need_number = returnlist.lack_qty;//需求数量
// oOrder.remaining_number = returnlist.lack_qty;//剩余可用数量
// oOrder.work_number = 0;//报工数量
// oOrder.inspection_number = 0;//报检数量
// oOrder.qualified_number = 0;//合格数量
// oOrder.inventory_number = 0;//入库数量
// oOrder.notice_qty = 0;//已开通知单数量
// oOrder.moentry_on = 1;//启动状态
// //oOrder.start_time = DateTime.Now;//开始时间
// //oOrder.pause_time = DateTime.Now;//最近暂停时间
// //oOrder.restart_time = DateTime.Now;//最近重启时间
// oOrder.project_name = returnlist.item_name;//项目名称
// oOrder.sent_status = 1;//发料状态 1-待发料 2-已发料
// oOrder.production_unit = returnlist.unit;//加工单位
// oOrder.production_unit_code = "";//加工单位编码
// oOrder.need_icitem_status = 1;//所需物料是否充足 1-充足 0-缺料
// oOrder.tenant_id = tenantId;
// oOrder.factory_id = factoryid;
// oOrder.bang_id = bangId;
// _mes_oorder.InsertOne(oOrder);
// return DateTime.Now;
//}
///
/// 生成委外工单
///
///
///
private mo_mes_oorder CreateMesOOder(BomChildExamineDto returnlist, long tenantId, long factoryid, long bangId, List iCItemLeadTimes, List supplierList, DateTime deliveryDate)
{
mo_mes_oorder oOrder = new mo_mes_oorder();
oOrder.GenerateNewId();
oOrder.oorder_no = getOrderNum("WW");//生产工单编号
oOrder.oorder_type = "委外工单";//生产工单类型
oOrder.oorder_date = DateTime.Now;//委外订单日期
oOrder.oorder_state = "已提交";//订单状态
oOrder.ooentry_prd = 10000;//生产组织
oOrder.ooentry_prdname = "1000";//生产组织名称
oOrder.ooentry_wrkc = 10000;//工作中心id
oOrder.ooentry_wrkcname = "10001";//工作中心名称
oOrder.planner_num = "wwww";//计划员工号
oOrder.planner_name = "qqq";//计划员名称
oOrder.ooentry_stime = DateTime.Now;//计划开工日期
oOrder.ooentry_etime = DateTime.Now;//计划完工日期
oOrder.product_code = "产品代码";//产品代码
oOrder.ffms_number = "1000";//fms旧料号
oOrder.product_name = "test";//产品名称
oOrder.specification_model = returnlist.model;//规格型号
oOrder.bom_number = returnlist.bom_number;//bom编码
oOrder.unit = returnlist.unit;//单位
oOrder.morder_progress = "";//工单进度
oOrder.morder_production_number = returnlist.lack_qty;//工单生产数量(计划数量)
oOrder.need_number = returnlist.lack_qty;//需求数量
oOrder.remaining_number = returnlist.lack_qty;//剩余可用数量
oOrder.work_number = 0;//报工数量
oOrder.inspection_number = 0;//报检数量
oOrder.qualified_number = 0;//合格数量
oOrder.inventory_number = 0;//入库数量
oOrder.notice_qty = 0;//已开通知单数量
oOrder.moentry_on = 1;//启动状态
//oOrder.start_time = DateTime.Now;//开始时间
//oOrder.pause_time = DateTime.Now;//最近暂停时间
//oOrder.restart_time = DateTime.Now;//最近重启时间
oOrder.project_name = returnlist.item_name;//项目名称
oOrder.sent_status = 1;//发料状态 1-待发料 2-已发料
oOrder.production_unit = returnlist.unit;//加工单位
oOrder.production_unit_code = "";//加工单位编码
oOrder.need_icitem_status = 1;//所需物料是否充足 1-充足 0-缺料
oOrder.tenant_id = tenantId;
oOrder.factory_id = factoryid;
oOrder.bang_id = bangId;
return oOrder;
//_mes_oorder.InsertOne(oOrder);
}
/////
///// 生成采购申请单,颗粒度是一个物料一个单,没必要弄列表
/////
/////
/////
///// 2委外采购申请单,3采购申请单
//private DateTime CreateSRMPR(BomChildExamineDto returnlist, long tenantId, long factoryid, long bangId, int orderType, List iCItemLeadTimes, List supplierList, List planList, DateTime deliveryDate)
//{
// var leadTime = iCItemLeadTimes.Find(x => x.item_id == returnlist.item_id);
// var supplier = supplierList.Find(x => x.icitem_id == returnlist.item_id);//默认取第一个供应商
// var plan = planList.Find(x => x.icitem_id == returnlist.item_id);
// if (leadTime == null || supplier == null || plan == null)
// {
// throw new NotImplementedException("未找到物料ic_factory_details或ic_item_pur或ic_plan信息!");
// }
// srm_pr_main srm_Pr = new srm_pr_main();
// srm_Pr.GenerateNewId();
// srm_Pr.pr_billno = getOrderNum("PR");//pr单号
// srm_Pr.pr_mono = "";//关联工单号
// srm_Pr.entity_id = 1;//工单行号
// srm_Pr.pr_purchaseid = supplier.supplier_id;//供应商id
// srm_Pr.pr_purchasenumber = supplier.supplier_number;//供应商编码
// srm_Pr.pr_purchasename = supplier.supplier_name;//供应商名称
// srm_Pr.pr_purchaser = supplier.purcher;//采购员
// srm_Pr.pr_purchaser_num = "";//采购员工号(采购信息表)
// srm_Pr.pr_rqty = returnlist.lack_qty;//需求数量
// srm_Pr.pr_aqty = returnlist.lack_qty;//申请数量
// srm_Pr.pr_sqty = returnlist.lack_qty;//建议数量
// 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 = deliveryDate.AddDays((double)leadTime.order_leadtime * -1);//系统建议下单日期
// srm_Pr.pr_sarrive_date = deliveryDate.AddDays((double)leadTime.transportation_leadtime * -1);//系统建议到达日期(建议到货日期)
// srm_Pr.pr_psend_date = deliveryDate.AddDays((double)leadTime.order_leadtime * -1);//计划下单日期
// srm_Pr.pr_parrive_date = deliveryDate.AddDays((double)leadTime.transportation_leadtime * -1);//计划到达日期
// srm_Pr.pr_psend_date = deliveryDate.AddDays((double)leadTime.order_leadtime * -1);//计划下单日期
// srm_Pr.pr_sysprice = returnlist.lack_qty * supplier.netpurchase_price * (1 + supplier.taxrate);//系统价格(含税)
// srm_Pr.pr_orderprice = returnlist.lack_qty * supplier.netpurchase_price * (1 + supplier.taxrate);//订单价格(含税)
// srm_Pr.pr_price = supplier.netpurchase_price;//采购净价(不含税)
// srm_Pr.pr_rate = supplier.taxrate;//税率
// srm_Pr.pr_unit = returnlist.unit;//单位
// srm_Pr.state = 1;//状态
// srm_Pr.old_apply_aqty = 0;//已申请数量
// srm_Pr.pr_type = orderType;//申请类型
// srm_Pr.currencytype = supplier.currency_type;//币种
// srm_Pr.secInv_ratio = plan.secinv_ratio;//安全库存触发采购比例
// srm_Pr.tenant_id = tenantId;
// srm_Pr.factory_id = factoryid;
// srm_Pr.bang_id = bangId;
// _srm_pr_main.InsertOne(srm_Pr);
// decimal? totalLeadTime = leadTime.transportation_leadtime + leadTime.stock_leadtime + leadTime.production_leadtime + leadTime.order_leadtime;
// return deliveryDate.AddDays((double)totalLeadTime * -1);//减去提前期
//}
///
/// 生成采购申请单,颗粒度是一个物料一个单,没必要弄列表
///
///
///
/// 2委外采购申请单,3采购申请单
private SRMPRDto CreateSRMPR(BomChildExamineDto returnlist, long tenantId, long factoryid, long bangId, int orderType, List iCItemLeadTimes, List supplierList, List planList, DateTime deliveryDate)
{
SRMPRDto sRMPR = new SRMPRDto();
mo_srm_pr_main srm_Pr = new mo_srm_pr_main();
var leadTime = iCItemLeadTimes.Find(x => x.item_id == returnlist.item_id);
var supplier = supplierList.Find(x => x.icitem_id == returnlist.item_id);//默认取第一个供应商
var plan = planList.Find(x => x.icitem_id == returnlist.item_id);
if (leadTime == null || supplier == null || plan == null)
{
sRMPR.srm_Pr_Main = null;
sRMPR.lastStartTmie = deliveryDate.AddDays(7 * -1);//减去提前期
return sRMPR;
//throw new NotImplementedException("未找到物料ic_factory_details或ic_item_pur或ic_plan信息!");
}
srm_Pr.GenerateNewId();
srm_Pr.pr_billno = returnlist.erp_cls == 2 ? GetMaxSerialNumber(416555183259717) : GetMaxSerialNumber(416188596088901);//pr单号
srm_Pr.pr_mono = "";//关联工单号
srm_Pr.entity_id = 1;//工单行号
srm_Pr.pr_purchaseid = supplier.supplier_id;//供应商id
srm_Pr.pr_purchasenumber = supplier.supplier_number;//供应商编码
srm_Pr.pr_purchasename = supplier.supplier_name;//供应商名称
srm_Pr.pr_purchaser = supplier.purcher;//采购员
srm_Pr.pr_purchaser_num = "";//采购员工号(采购信息表)
srm_Pr.pr_rqty = returnlist.lack_qty;//需求数量
srm_Pr.pr_aqty = returnlist.lack_qty;//申请数量
srm_Pr.pr_sqty = returnlist.lack_qty;//建议数量
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 = deliveryDate.AddDays((double)leadTime.order_leadtime * -1);//系统建议下单日期
srm_Pr.pr_sarrive_date = deliveryDate.AddDays((double)leadTime.transportation_leadtime * -1);//系统建议到达日期(建议到货日期)
srm_Pr.pr_psend_date = deliveryDate.AddDays((double)leadTime.order_leadtime * -1);//计划下单日期
srm_Pr.pr_parrive_date = deliveryDate.AddDays((double)leadTime.transportation_leadtime * -1);//计划到达日期
srm_Pr.pr_psend_date = deliveryDate.AddDays((double)leadTime.order_leadtime * -1);//计划下单日期
srm_Pr.pr_sysprice = returnlist.lack_qty * supplier.netpurchase_price * (1 + supplier.taxrate);//系统价格(含税)
srm_Pr.pr_orderprice = returnlist.lack_qty * supplier.netpurchase_price * (1 + supplier.taxrate);//订单价格(含税)
srm_Pr.pr_price = supplier.netpurchase_price;//采购净价(不含税)
srm_Pr.pr_rate = supplier.taxrate;//税率
srm_Pr.pr_unit = returnlist.unit;//单位
srm_Pr.state = 1;//状态
srm_Pr.old_apply_aqty = 0;//已申请数量
srm_Pr.pr_type = orderType;//申请类型
srm_Pr.currencytype = supplier.currency_type;//币种
srm_Pr.secInv_ratio = plan.secinv_ratio;//安全库存触发采购比例
srm_Pr.tenant_id = tenantId;
srm_Pr.factory_id = factoryid;
srm_Pr.bang_id = bangId;
//_srm_pr_main.InsertOne(srm_Pr);
decimal? totalLeadTime = leadTime.transportation_leadtime + leadTime.stock_leadtime + leadTime.production_leadtime + leadTime.order_leadtime;
sRMPR.srm_Pr_Main.Add(srm_Pr);
sRMPR.lastStartTmie = deliveryDate.AddDays((double)totalLeadTime * -1);//减去提前期
return sRMPR;
}
// 生成订单编号 字母+年月日+8位随机数+时间戳
private string getOrderNum(string preCode)
{
string Dates = DateTime.Now.ToString("yyyyMMdd");//获取当前时间
Random Rdm = new Random(Guid.NewGuid().GetHashCode());//随机数
TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);//时间戳
string newts = Convert.ToInt64(ts.TotalMilliseconds).ToString();//时间戳
string new_orderNum = preCode + Dates + Rdm.Next(0, 100000000) + newts;
return new_orderNum;
}
///
/// 同一周以周五为合并采购申请单截点判断是否为同一周
///
/// 基准订单时间
/// 目标订单时间
///
private bool IsSameWeek(DateTime orderTime1, DateTime orderTime2)
{
int week = (int)orderTime1.DayOfWeek;
bool isSameWeek = false;
DateTime dateTime = orderTime1;
switch (week)
{
case 0:
//星期天
dateTime = dateTime.AddDays(0);
dateTime = new DateTime(dateTime.Year, dateTime.Month, dateTime.Day, 23, 59, 59);
isSameWeek = orderTime2 < dateTime;
break;
case 1:
//星期一
dateTime = dateTime.AddDays(4);
dateTime = new DateTime(dateTime.Year, dateTime.Month, dateTime.Day, 23, 59, 59);
isSameWeek = orderTime2 < dateTime;
break;
case 2:
//星期二
dateTime = dateTime.AddDays(3);
dateTime = new DateTime(dateTime.Year, dateTime.Month, dateTime.Day, 23, 59, 59);
isSameWeek = orderTime2 < dateTime;
break;
case 3:
//星期三
dateTime = dateTime.AddDays(2);
dateTime = new DateTime(dateTime.Year, dateTime.Month, dateTime.Day, 23, 59, 59);
isSameWeek = orderTime2 < dateTime;
break;
case 4:
//星期四
dateTime = dateTime.AddDays(1);
dateTime = new DateTime(dateTime.Year, dateTime.Month, dateTime.Day, 23, 59, 59);
isSameWeek = orderTime2 < dateTime;
break;
case 5:
//星期五
dateTime = dateTime.AddDays(0);
dateTime = new DateTime(dateTime.Year, dateTime.Month, dateTime.Day, 23, 59, 59);
isSameWeek = orderTime2 < dateTime;
break;
case 6:
//星期六
dateTime = dateTime.AddDays(0);
dateTime = new DateTime(dateTime.Year, dateTime.Month, dateTime.Day, 23, 59, 59);
isSameWeek = orderTime2 < dateTime;
break;
}
return isSameWeek;
}
private void AutoCreatePOFromPR(List list, long bangid, ResourceCheckInputDto input)
{
var zcPr = list.Where(a => a.pr_billno.StartsWith("PR")).ToList();
if (zcPr.Any())
{
AutoCreateZCPOFromPR(zcPr, bangid, input);
}
var wwPr = list.Where(a => a.pr_billno.StartsWith("WWPR")).ToList();
if (wwPr.Any())
{
AutoCreateWWPOFromPR(wwPr, bangid, input);
}
}
private void AutoCreateZCPOFromPR(List list, long bangid, ResourceCheckInputDto input)
{
List polist = new List();
List podetaillist = new List();
//将PR按供应商和物料和日期(一周内)进行合并,生成PO
//1.按照供应商、需求日期排序
//2.判断是不是同一个供应商,不是的话就新建一个PO;是的话判断是不是同一周,不是的话就新建一个PO,是的话判断有没有相同物料,有的话合并物料数量价格,没有的话新建一条明细
list = list.OrderBy(a => a.pr_purchaseid).ThenBy(b => b.pr_rarrive_date).ToList();
long? supplierId = -1;
DateTime supplierDate = DateTime.Now;
foreach (var item in list)
{
if (item.pr_purchaseid != supplierId)
{
var itemsupplier = _srm_supplier.Find(a => a.mysql_id == item.pr_purchaseid && a.tenant_id == input.tenantId && a.factory_id == input.factoryId).Result;
//新建一个PO
mo_srm_po_main po_Main = new mo_srm_po_main();
po_Main.id = help.NextId();
po_Main.mysql_id = help.NextId();
po_Main.po_billno = GetMaxSerialNumber(416188684804165);
po_Main.po_purchaser = item.pr_purchaser;
po_Main.po_purchaser_no = item.pr_purchaser_num;
po_Main.po_ssend_date = DateTime.Now;
po_Main.po_total = item.pr_orderprice;
po_Main.po_tax_rate = item.pr_rate;
po_Main.po_express = 1;
po_Main.state = 0;
po_Main.po_note = "PR自动转PO";
po_Main.po_order_type = 1;
po_Main.currency = item.currencytype;
po_Main.bill_type = 1;
po_Main.supplier_id = item.pr_purchaseid;
po_Main.supplier_name = item.pr_purchasename;
po_Main.supplier_no = item.pr_purchasenumber;
po_Main.contact = itemsupplier is null? itemsupplier?.FirstOrDefault().contact:"";
po_Main.suppliertelephone = itemsupplier is null ? itemsupplier?.FirstOrDefault().telephone:"";
po_Main.deliveryaddress = "";
po_Main.supplierdddress = itemsupplier is null ? itemsupplier?.FirstOrDefault().supplier_address:"";
po_Main.confirmstate = 1;
po_Main.logisticsstate = 0;
po_Main.financialstate = 0;
po_Main.create_time = DateTime.Now;
po_Main.factory_id = input.factoryId;
po_Main.tenant_id = input.tenantId;
po_Main.bang_id = bangid;
po_Main.po_delivery = 1;
polist.Add(po_Main);
mo_srm_po_list podetail = new mo_srm_po_list();
podetail.id = help.NextId();
podetail.mysql_id = help.NextId();
podetail.po_id = po_Main.mysql_id;
podetail.po_billno = po_Main.po_billno;
podetail.polist_row = podetaillist.Where(a=>a.po_billno== po_Main.po_billno).Count() + 1;
podetail.pr_id = item.mysql_id;
podetail.pr_billno = item.pr_billno;
podetail.pr_purchase_id = po_Main.supplier_id;
podetail.pr_purchase_name = po_Main.supplier_name;
podetail.icitem_id = item.icitem_id;
podetail.icitem_name = item.icitem_name;
podetail.qty = item.pr_aqty;
podetail.netprice = item.pr_price;
podetail.rate = item.pr_rate;
podetail.price = item.pr_orderprice / item.pr_aqty;
podetail.total_price = item.pr_orderprice;
podetail.plan_qty = item.pr_aqty;
podetail.unit = item.pr_unit;
podetail.state = item.state;
podetail.rarrdate = item.pr_rarrive_date;
podetail.rnumber = 0;
podetail.currencytype = item.currencytype;
podetail.create_time = DateTime.Now;
podetail.factory_id = input.factoryId;
podetail.tenant_id = input.tenantId;
podetail.bang_id = bangid;
podetail.stock_id = 1;
podetaillist.Add(podetail);
supplierId = item.pr_purchaseid;
supplierDate = item.pr_rarrive_date.Value;
}
else
{
//同一个供应商先判断需求日期是否在同一周
if (IsSameWeek(supplierDate, item.pr_rarrive_date.Value))
{
var pomain = polist.FindAll(x => x.supplier_id == item.pr_purchaseid).OrderByDescending(b => b.create_time).First();
List detail = podetaillist.FindAll(a => a.po_billno == pomain.po_billno && a.icitem_id == item.icitem_id);
if (detail.Count > 0)
{
//TODO:只能记录一条PR,可能需要先合PR
//存在同一种物料,存在就计算数量和价格,
detail[0].qty = detail[0].qty + item.pr_aqty;
detail[0].netprice = detail[0].netprice + item.pr_price;
detail[0].total_price = detail[0].total_price + item.pr_orderprice;
detail[0].plan_qty = detail[0].plan_qty + item.pr_aqty;
detail[0].rarrdate = item.pr_rarrive_date;
pomain.po_total = pomain.po_total + item.pr_orderprice;
}
else
{
//不存在同一种物料新增一条明细
mo_srm_po_list podetail = new mo_srm_po_list();
podetail.id = help.NextId();
podetail.mysql_id = help.NextId();
podetail.po_id = pomain.mysql_id;
podetail.po_billno = pomain.po_billno;
podetail.polist_row = podetaillist.Where(a => a.po_billno == pomain.po_billno).Count() + 1;
podetail.pr_id = item.mysql_id;
podetail.pr_billno = item.pr_billno;
podetail.pr_purchase_id = pomain.supplier_id;
podetail.pr_purchase_name = pomain.supplier_name;
podetail.icitem_id = item.icitem_id;
podetail.icitem_name = item.icitem_name;
podetail.qty = item.pr_aqty;
podetail.netprice = item.pr_price;
podetail.rate = item.pr_rate;
podetail.price = item.pr_orderprice / item.pr_aqty;
podetail.total_price = item.pr_orderprice;
podetail.plan_qty = item.pr_aqty;
podetail.unit = item.pr_unit;
podetail.state = item.state;
podetail.rarrdate = item.pr_rarrive_date;
podetail.rnumber = 0;
podetail.currencytype = item.currencytype;
podetail.create_time = DateTime.Now;
podetail.factory_id = input.factoryId;
podetail.tenant_id = input.tenantId;
podetail.bang_id = bangid;
podetaillist.Add(podetail);
podetail.stock_id = 1;
pomain.po_total = pomain.po_total + item.pr_orderprice;
}
}
else
{
//不在同一周需要新建一张PO
var itemsupplier = _srm_supplier.Find(a => a.mysql_id == item.pr_purchaseid && a.tenant_id == input.tenantId && a.factory_id == input.factoryId).Result;
//新建一个PO单
mo_srm_po_main po_Main = new mo_srm_po_main();
po_Main.id = help.NextId();
po_Main.mysql_id = help.NextId();
po_Main.po_billno = GetMaxSerialNumber(416188684804165);
po_Main.po_purchaser = item.pr_purchaser;
po_Main.po_purchaser_no = item.pr_purchaser_num;
po_Main.po_ssend_date = DateTime.Now;
po_Main.po_total = item.pr_orderprice;
po_Main.po_tax_rate = item.pr_rate;
po_Main.po_express = 1;
po_Main.state = 0;
po_Main.po_note = "PR自动转PO";
po_Main.po_order_type = 1;
po_Main.currency = item.currencytype;
po_Main.bill_type = 1;
po_Main.supplier_id = item.pr_purchaseid;
po_Main.supplier_name = item.pr_purchasename;
po_Main.supplier_no = item.pr_purchasenumber;
po_Main.contact = itemsupplier is null ? itemsupplier?.FirstOrDefault().contact:"";
po_Main.suppliertelephone = itemsupplier is null ? itemsupplier?.FirstOrDefault().telephone:"";
po_Main.deliveryaddress = "";
po_Main.supplierdddress = itemsupplier is null ? itemsupplier?.FirstOrDefault().supplier_address:"";
po_Main.confirmstate = 1;
po_Main.logisticsstate = 0;
po_Main.financialstate = 0;
po_Main.create_time = DateTime.Now;
po_Main.factory_id = input.factoryId;
po_Main.tenant_id = input.tenantId;
po_Main.bang_id = bangid;
po_Main.po_delivery = 1;
polist.Add(po_Main);
mo_srm_po_list podetail = new mo_srm_po_list();
podetail.id = help.NextId();
podetail.mysql_id = help.NextId();
podetail.po_id = po_Main.mysql_id;
podetail.po_billno = po_Main.po_billno;
podetail.polist_row = podetaillist.Where(a => a.po_billno == po_Main.po_billno).Count() + 1;
podetail.pr_id = item.mysql_id;
podetail.pr_billno = item.pr_billno;
podetail.pr_purchase_id = po_Main.supplier_id;
podetail.pr_purchase_name = po_Main.supplier_name;
podetail.icitem_id = item.icitem_id;
podetail.icitem_name = item.icitem_name;
podetail.qty = item.pr_aqty;
podetail.netprice = item.pr_price;
podetail.rate = item.pr_rate;
podetail.price = item.pr_orderprice / item.pr_aqty;
podetail.total_price = item.pr_orderprice;
podetail.plan_qty = item.pr_aqty;
podetail.unit = item.pr_unit;
podetail.state = item.state;
podetail.rarrdate = item.pr_rarrive_date;
podetail.rnumber = 0;
podetail.currencytype = item.currencytype;
podetail.create_time = DateTime.Now;
podetail.factory_id = input.factoryId;
podetail.tenant_id = input.tenantId;
podetail.bang_id = bangid;
podetail.stock_id = 1;
podetaillist.Add(podetail);
supplierId = item.pr_purchaseid;
supplierDate = item.pr_rarrive_date.Value;
}
}
}
_srm_po_main.InsertMany(polist);
_srm_po_list.InsertMany(podetaillist);
List po_mainlist = ObjectMapper.Map, List>(polist);
_businessDbContext.BulkInsert(po_mainlist);
var po_listlist = ObjectMapper.Map, List>(podetaillist);
_businessDbContext.BulkInsert(po_listlist);
}
private void AutoCreateWWPOFromPR(List list, long bangid, ResourceCheckInputDto input)
{
List polist = new List();
List podetaillist = new List();
//将PR按供应商和物料和日期(一周内)进行合并,生成PO
//1.按照供应商、需求日期排序
//2.判断是不是同一个供应商,不是的话就新建一个PO;是的话判断是不是同一周,不是的话就新建一个PO,是的话判断有没有相同物料,有的话合并物料数量价格,没有的话新建一条明细
list = list.OrderBy(a => a.pr_purchaseid).ThenBy(b => b.pr_rarrive_date).ToList();
long? supplierId = -1;
DateTime supplierDate = DateTime.Now;
foreach (var item in list)
{
if (item.pr_purchaseid != supplierId)
{
var itemsupplier = _srm_supplier.Find(a => a.mysql_id == item.pr_purchaseid && a.tenant_id == input.tenantId && a.factory_id == input.factoryId).Result;
//新建一个PO
mo_srm_po_main po_Main = new mo_srm_po_main();
po_Main.id = help.NextId();
po_Main.mysql_id = help.NextId();
po_Main.po_billno = GetMaxSerialNumber(416555323363397);//WWPO
po_Main.po_purchaser = item.pr_purchaser;
po_Main.po_purchaser_no = item.pr_purchaser_num;
po_Main.po_ssend_date = DateTime.Now;
po_Main.po_total = item.pr_orderprice;
po_Main.po_tax_rate = item.pr_rate;
po_Main.po_express = 1;
po_Main.state = 0;
po_Main.po_note = "PR自动转PO";
po_Main.po_order_type = 1;
po_Main.currency = item.currencytype;
po_Main.bill_type = 1;
po_Main.supplier_id = item.pr_purchaseid;
po_Main.supplier_name = item.pr_purchasename;
po_Main.supplier_no = item.pr_purchasenumber;
po_Main.contact = itemsupplier is null ? itemsupplier?.FirstOrDefault().contact:"";
po_Main.suppliertelephone = itemsupplier is null ? itemsupplier?.FirstOrDefault().telephone:"";
po_Main.deliveryaddress = "";
po_Main.supplierdddress = itemsupplier is null ? itemsupplier?.FirstOrDefault().supplier_address:"";
po_Main.confirmstate = 1;
po_Main.logisticsstate = 0;
po_Main.financialstate = 0;
po_Main.create_time = DateTime.Now;
po_Main.factory_id = input.factoryId;
po_Main.tenant_id = input.tenantId;
po_Main.bang_id = bangid;
po_Main.po_delivery = 1;
polist.Add(po_Main);
mo_srm_po_list podetail = new mo_srm_po_list();
podetail.id = help.NextId();
podetail.mysql_id = help.NextId();
podetail.po_id = po_Main.mysql_id;
podetail.po_billno = po_Main.po_billno;
podetail.polist_row = podetaillist.Where(a => a.po_billno == po_Main.po_billno).Count() + 1;
podetail.pr_id = item.mysql_id;
podetail.pr_billno = item.pr_billno;
podetail.pr_purchase_id = po_Main.supplier_id;
podetail.pr_purchase_name = po_Main.supplier_name;
podetail.icitem_id = item.icitem_id;
podetail.icitem_name = item.icitem_name;
podetail.qty = item.pr_aqty;
podetail.netprice = item.pr_price;
podetail.rate = item.pr_rate;
podetail.price = item.pr_orderprice / item.pr_aqty;
podetail.total_price = item.pr_orderprice;
podetail.plan_qty = item.pr_aqty;
podetail.unit = item.pr_unit;
podetail.state = item.state;
podetail.rarrdate = item.pr_rarrive_date;
podetail.rnumber = 0;
podetail.currencytype = item.currencytype;
podetail.create_time = DateTime.Now;
podetail.factory_id = input.factoryId;
podetail.tenant_id = input.tenantId;
podetail.bang_id = bangid;
podetail.stock_id = 1;
podetaillist.Add(podetail);
supplierId = item.pr_purchaseid;
supplierDate = item.pr_rarrive_date.Value;
}
else
{
//同一个供应商先判断需求日期是否在同一周
if (IsSameWeek(supplierDate, item.pr_rarrive_date.Value))
{
var pomain = polist.FindAll(x => x.supplier_id == item.pr_purchaseid).OrderByDescending(b => b.create_time).First();
List detail = podetaillist.FindAll(a => a.po_billno == pomain.po_billno && a.icitem_id == item.icitem_id);
if (detail.Count > 0)
{
//TODO:只能记录一条PR,可能需要先合PR
//存在同一种物料,存在就计算数量和价格,
detail[0].qty = detail[0].qty + item.pr_aqty;
detail[0].netprice = detail[0].netprice + item.pr_price;
detail[0].total_price = detail[0].total_price + item.pr_orderprice;
detail[0].plan_qty = detail[0].plan_qty + item.pr_aqty;
detail[0].rarrdate = item.pr_rarrive_date;
pomain.po_total = pomain.po_total + item.pr_orderprice;
}
else
{
//不存在同一种物料新增一条明细
mo_srm_po_list podetail = new mo_srm_po_list();
podetail.id = help.NextId();
podetail.mysql_id = help.NextId();
podetail.po_id = pomain.mysql_id;
podetail.po_billno = pomain.po_billno;
podetail.polist_row = podetaillist.Where(a => a.po_billno == pomain.po_billno).Count() + 1;
podetail.pr_id = item.mysql_id;
podetail.pr_billno = item.pr_billno;
podetail.pr_purchase_id = pomain.supplier_id;
podetail.pr_purchase_name = pomain.supplier_name;
podetail.icitem_id = item.icitem_id;
podetail.icitem_name = item.icitem_name;
podetail.qty = item.pr_aqty;
podetail.netprice = item.pr_price;
podetail.rate = item.pr_rate;
podetail.price = item.pr_orderprice / item.pr_aqty;
podetail.total_price = item.pr_orderprice;
podetail.plan_qty = item.pr_aqty;
podetail.unit = item.pr_unit;
podetail.state = item.state;
podetail.rarrdate = item.pr_rarrive_date;
podetail.rnumber = 0;
podetail.currencytype = item.currencytype;
podetail.create_time = DateTime.Now;
podetail.factory_id = input.factoryId;
podetail.tenant_id = input.tenantId;
podetail.bang_id = bangid;
podetail.stock_id = 1;
podetaillist.Add(podetail);
pomain.po_total = pomain.po_total + item.pr_orderprice;
}
}
else
{
//不在同一周需要新建一张PO
var itemsupplier = _srm_supplier.Find(a => a.mysql_id == item.pr_purchaseid && a.tenant_id == input.tenantId && a.factory_id == input.factoryId).Result;
//新建一个PO单
mo_srm_po_main po_Main = new mo_srm_po_main();
po_Main.id = help.NextId();
po_Main.mysql_id = help.NextId();
po_Main.po_billno = GetMaxSerialNumber(416555323363397);
po_Main.po_purchaser = item.pr_purchaser;
po_Main.po_purchaser_no = item.pr_purchaser_num;
po_Main.po_ssend_date = DateTime.Now;
po_Main.po_total = item.pr_orderprice;
po_Main.po_tax_rate = item.pr_rate;
po_Main.po_express = 1;
po_Main.state = 0;
po_Main.po_note = "PR自动转PO";
po_Main.po_order_type = 1;
po_Main.currency = item.currencytype;
po_Main.bill_type = 1;
po_Main.supplier_id = item.pr_purchaseid;
po_Main.supplier_name = item.pr_purchasename;
po_Main.supplier_no = item.pr_purchasenumber;
po_Main.contact = itemsupplier is null ? itemsupplier?.FirstOrDefault().contact:"";
po_Main.suppliertelephone = itemsupplier is null ? itemsupplier?.FirstOrDefault().telephone:"";
po_Main.deliveryaddress = "";
po_Main.supplierdddress = itemsupplier is null ? itemsupplier?.FirstOrDefault().supplier_address:"";
po_Main.confirmstate = 1;
po_Main.logisticsstate = 0;
po_Main.financialstate = 0;
po_Main.create_time = DateTime.Now;
po_Main.factory_id = input.factoryId;
po_Main.tenant_id = input.tenantId;
po_Main.bang_id = bangid;
po_Main.po_delivery = 1;
polist.Add(po_Main);
mo_srm_po_list podetail = new mo_srm_po_list();
podetail.id = help.NextId();
podetail.mysql_id = help.NextId();
podetail.po_id = po_Main.mysql_id;
podetail.po_billno = po_Main.po_billno;
podetail.polist_row = podetaillist.Where(a => a.po_billno == po_Main.po_billno).Count() + 1;
podetail.pr_id = item.mysql_id;
podetail.pr_billno = item.pr_billno;
podetail.pr_purchase_id = po_Main.supplier_id;
podetail.pr_purchase_name = po_Main.supplier_name;
podetail.icitem_id = item.icitem_id;
podetail.icitem_name = item.icitem_name;
podetail.qty = item.pr_aqty;
podetail.netprice = item.pr_price;
podetail.rate = item.pr_rate;
podetail.price = item.pr_orderprice / item.pr_aqty;
podetail.total_price = item.pr_orderprice;
podetail.plan_qty = item.pr_aqty;
podetail.unit = item.pr_unit;
podetail.state = item.state;
podetail.rarrdate = item.pr_rarrive_date;
podetail.rnumber = 0;
podetail.currencytype = item.currencytype;
podetail.create_time = DateTime.Now;
podetail.factory_id = input.factoryId;
podetail.tenant_id = input.tenantId;
podetail.bang_id = bangid;
podetail.stock_id = 1;
podetaillist.Add(podetail);
supplierId = item.pr_purchaseid;
supplierDate = item.pr_rarrive_date.Value;
}
}
}
_srm_po_main.InsertMany(polist);
_srm_po_list.InsertMany(podetaillist);
List po_mainlist = ObjectMapper.Map