using AutoMapper; using Microsoft.EntityFrameworkCore.Storage; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using NPOI.SS.Formula.Functions; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using WMS.Web.Core; using WMS.Web.Core.Dto; using WMS.Web.Core.Dto.Erp; using WMS.Web.Core.Dto.Erp.OutStock; using WMS.Web.Core.Dto.InStockTask; using WMS.Web.Core.Dto.Login; using WMS.Web.Core.Internal.Results; using WMS.Web.Domain.Entitys; using WMS.Web.Domain.Infrastructure; using WMS.Web.Domain.IService; using WMS.Web.Domain.IService.Public; using WMS.Web.Domain.Services.Public; using WMS.Web.Domain.Values; using static StackExchange.Redis.Role; namespace WMS.Web.Domain.Services { /// /// 入库任务单-服务 /// public class InStockTaskService : IInStockTaskService { private readonly IMapper _mapper; private ILogger _logger; private readonly IErpService _erpService; private readonly ILoginService _loginService; private readonly IBasicsRepositories _basicsRepositories; private readonly IInStockRepositories _inStockRepositories; private readonly IInStockTaskRepositories _inStockTaskRepositories; private readonly RedisClientService _redisClientService; public InStockTaskService(IMapper mapper, IErpService erpService, ILoginService loginService, IBasicsRepositories basicsRepositories, ILogger logger, RedisClientService redisClientService, IInStockRepositories inStockRepositories, IInStockTaskRepositories inStockTaskRepositories) { this._logger = logger; _mapper = mapper; _redisClientService = redisClientService; _erpService = erpService; _loginService = loginService; _basicsRepositories = basicsRepositories; _inStockRepositories = inStockRepositories; _inStockTaskRepositories = inStockTaskRepositories; } /// /// 来源单-金蝶校准-实时 /// /// /// public async Task Adjust(string sourceBillNo) { //1.事务 IDbContextTransaction _transaction = _basicsRepositories.GetTransaction(); bool isRollback = false; bool isTransaction = false; //2.查看是否有入库任务单 var task = await _inStockTaskRepositories.GetBySource(sourceBillNo); if (task == null) return Result.ReFailure(ResultCodes.OrderNoData); //3.有的话就同步一下金蝶的数据 var billNos = new List(); billNos.Add(sourceBillNo); //3.1订单类型-进去金蝶交互更新 if (task.Type == InstockType.Purchase) { var result = await this.SsynPurchaseInStock(billNos, isTransaction); if (!result.IsSuccess) isRollback = true; } else if(task.Type==InstockType.ProduceSotck) { var result = await this.SsynProduceSotck(billNos, isTransaction); if (!result.IsSuccess) isRollback = true; } else if (task.Type == InstockType.Miscellaneous) { var result = await this.SysnMiscellaneous(billNos, isTransaction); if (!result.IsSuccess) isRollback = true; } else if (task.Type == InstockType.Assembled) { var result = await this.SysnAssembledApp(billNos, isTransaction); if (!result.IsSuccess) isRollback = true; } else if (task.Type == InstockType.Stkdirecttransfers) { var result = await this.SysnTransferDirect(billNos, isTransaction); if (!result.IsSuccess) isRollback = true; } else if (task.Type == InstockType.StktransferInst) { var result = await this.SysnTransferin(billNos, isTransaction); if (!result.IsSuccess) isRollback = true; } //4.提交事务 var isSuccess = _basicsRepositories.CommitTransaction(isRollback, _transaction); if (!isSuccess) return Result.ReFailure(ResultCodes.AdjustError); return Result.ReSuccess(); } /// /// 同步:采购入库类型单据 /// /// /// /// public async Task SsynPurchaseInStock(List billNos = null, bool isTransaction = true, DateTime? beginTime = null) { //1.获取金蝶数据:采购订单数据 var erp_result = await _erpService.BillQueryForPurchaseInStock(billNos, beginTime); if (!erp_result.IsSuccess) return Result.ReFailure(erp_result.Message, erp_result.Status); var erp_list = erp_result.Data; return await this.SysnDataNew(erp_list.ToList(), isTransaction); } /// /// 同步:生产入库单据 /// /// /// /// public async Task SsynProduceSotck(List billNos = null, bool isTransaction = true, DateTime? beginTime = null) { //1.获取金蝶数据:生产入库数据 var erp_result = await _erpService.BillQueryForProduceSotckin(billNos, beginTime); if (!erp_result.IsSuccess) return Result.ReFailure(erp_result.Message, erp_result.Status); var erp_list = erp_result.Data; return await this.SysnDataNew(erp_list.ToList(), isTransaction); } /// /// 同步:其他入库单 /// /// /// /// public async Task SysnMiscellaneous(List billNos = null, bool isTransaction = true, DateTime? beginTime = null) { //1.获取金蝶数据:其他入库订单数据 var erp_result = await _erpService.BillQueryForMiscellaneous(billNos, beginTime); if (!erp_result.IsSuccess) return Result.ReFailure(erp_result.Message, erp_result.Status); var erp_list = erp_result.Data; return await this.SysnDataNew(erp_list.ToList(), isTransaction); } /// /// 同步:直接调拨入库单 /// /// /// /// public async Task SysnTransferDirect(List billNos = null, bool isTransaction = true, DateTime? beginTime = null) { //1.获取金蝶数据:直接调拨入库订单数据 var erp_result = await _erpService.BillQueryForTransferDirect(billNos, beginTime); if (!erp_result.IsSuccess) return Result.ReFailure(erp_result.Message, erp_result.Status); var erp_list = erp_result.Data; return await this.SysnDataNew(erp_list.ToList(), isTransaction); } /// /// 同步:分步式调入单 /// /// /// /// public async Task SysnTransferin(List billNos = null, bool isTransaction = true, DateTime? beginTime = null) { //1.获取金蝶数据:分步式入库订单数据 var erp_result = await _erpService.BillQueryForTransferin(billNos, beginTime); if (!erp_result.IsSuccess) return Result.ReFailure(erp_result.Message, erp_result.Status); var erp_list = erp_result.Data; return await this.SysnDataNew(erp_list.ToList(), isTransaction); } /// /// 同步:组装拆卸单 /// /// /// /// public async Task SysnAssembledApp(List billNos = null, bool isTransaction = true, DateTime? beginTime = null) { var erp_list = new List(); //1.获取金蝶数据:组装成品入库订单数据 var erp_result_ass = await _erpService.BillQueryForAssembledApp_Assembly(billNos, beginTime); if (!erp_result_ass.IsSuccess) return Result.ReFailure(erp_result_ass.Message, erp_result_ass.Status); var erp_list_ass = erp_result_ass.Data; erp_list.AddRange(erp_list_ass); //1.1.获取金蝶数据:拆卸子件入库订单数据 var erp_result_disass = await _erpService.BillQueryForAssembledApp_Disassembly(billNos, beginTime); if (!erp_result_disass.IsSuccess) return Result.ReFailure(erp_result_disass.Message, erp_result_disass.Status); var erp_list_disass = erp_result_disass.Data; erp_list.AddRange(erp_list_disass); return await this.SysnDataNew(erp_list, isTransaction); } /// /// 同步 /// /// /// public async Task Sysn(List billNos = null) { var info = _redisClientService.GetStringKey($"wms_instock_sync"); if (info == true) return Result.ReFailure(ResultCodes.ErpSyns); _redisClientService.SetStringKey($"wms_instock_sync", true, TimeSpan.FromMinutes(5)); //1.事务 IDbContextTransaction _transaction = _basicsRepositories.GetTransaction(); bool isRollback = false; bool isTransaction = false; //3.同步数据 var result = await this.InStock(billNos, isTransaction); if (!result.IsSuccess) isRollback = true; //3.提交事务 var isSuccess = _basicsRepositories.CommitTransaction(isRollback, _transaction); _redisClientService.SetStringKey($"wms_instock_sync", false, TimeSpan.FromMinutes(5)); if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError); return Result.ReSuccess(); } /// /// 同步:入库单类型的数据 /// /// /// /// public async Task InStock(List billNos, bool isTransaction) { if (billNos == null || billNos.Count == 0) { var beginTime = DateTime.Now.AddHours(-20);//默认拉去8小时以内的数据,ALTER BY YZH // var beginTime = DateTime.Now.AddDays(-200);//默认拉去8小时以内的数据,ALTER BY YZH这里要改回去 //6.同步数据:生产入库单 var ProduceSotck_result = await this.SsynProduceSotck(null, isTransaction, beginTime); if (!ProduceSotck_result.IsSuccess) return Result.ReFailure(ProduceSotck_result.Message, ProduceSotck_result.Status); //4.同步数据:分步式入库单 var Transferin_result = await this.SysnTransferin(null, isTransaction, beginTime); if (!Transferin_result.IsSuccess) return Result.ReFailure(Transferin_result.Message, Transferin_result.Status); //1.同步数据:采购订单 var purchase_result = await this.SsynPurchaseInStock(null, isTransaction, beginTime); if (!purchase_result.IsSuccess) return Result.ReFailure(purchase_result.Message, purchase_result.Status); //2.同步数据:其他入库单 var miscellaneou_result = await this.SysnMiscellaneous(null, isTransaction, beginTime); if (!miscellaneou_result.IsSuccess) return Result.ReFailure(miscellaneou_result.Message, miscellaneou_result.Status); //3.同步数据:直接调拨入库单 var TransferDirect_result = await this.SysnTransferDirect(null, isTransaction, beginTime); if (!TransferDirect_result.IsSuccess) return Result.ReFailure(TransferDirect_result.Message, TransferDirect_result.Status); //5.同步数据:组装拆卸单 var AssembledApp_result = await this.SysnAssembledApp(null, isTransaction, beginTime); if (!AssembledApp_result.IsSuccess) return Result.ReFailure(AssembledApp_result.Message, AssembledApp_result.Status); } else { List Instock_sourceBillNos = new List(); List Miscellaneous_sourceBillNos = new List(); List TransferDirect_sourceBillNos = new List(); List Transferin_sourceBillNos = new List(); List AssembledApp_sourceBillNos = new List(); var taskList = await _inStockTaskRepositories.GetListBy(billNos); foreach (var entity in taskList) { if (entity.Type == InstockType.Purchase) Instock_sourceBillNos.Add(entity.SourceBillNo); else if (entity.Type == InstockType.Stkdirecttransfers) TransferDirect_sourceBillNos.Add(entity.SourceBillNo); else if (entity.Type == InstockType.StktransferInst) Transferin_sourceBillNos.Add(entity.SourceBillNo); else if (entity.Type == InstockType.Assembled) AssembledApp_sourceBillNos.Add(entity.SourceBillNo); else if (entity.Type == InstockType.Miscellaneous) Miscellaneous_sourceBillNos.Add(entity.SourceBillNo); } if (Instock_sourceBillNos.Count() > 0) { //1.同步数据:采购订单 var purchase_result = await this.SsynPurchaseInStock(Instock_sourceBillNos, isTransaction); if (!purchase_result.IsSuccess) return Result.ReFailure(purchase_result.Message, purchase_result.Status); } if (Miscellaneous_sourceBillNos.Count() > 0) { //2.同步数据:其他入库单 var miscellaneou_result = await this.SysnMiscellaneous(Miscellaneous_sourceBillNos, isTransaction); if (!miscellaneou_result.IsSuccess) return Result.ReFailure(miscellaneou_result.Message, miscellaneou_result.Status); } if (TransferDirect_sourceBillNos.Count() > 0) { //3.同步数据:直接调拨入库单 var TransferDirect_result = await this.SysnTransferDirect(TransferDirect_sourceBillNos, isTransaction); if (!TransferDirect_result.IsSuccess) return Result.ReFailure(TransferDirect_result.Message, TransferDirect_result.Status); } if (Transferin_sourceBillNos.Count() > 0) { //4.同步数据:分步式入库单 var Transferin_result = await this.SysnTransferin(Transferin_sourceBillNos, isTransaction); if (!Transferin_result.IsSuccess) return Result.ReFailure(Transferin_result.Message, Transferin_result.Status); } if (AssembledApp_sourceBillNos.Count() > 0) { //5.同步数据:组装拆卸单 var AssembledApp_result = await this.SysnAssembledApp(AssembledApp_sourceBillNos, isTransaction); if (!AssembledApp_result.IsSuccess) return Result.ReFailure(AssembledApp_result.Message, AssembledApp_result.Status); } } return Result.ReSuccess(); } /// /// ERP数据同步到WMS数据库-旧代码 /// /// /// /// public async Task SysnData(List erp_list, bool isTransaction) { var type = (InstockType)erp_list.GroupBy(x => x.Type).Select(x => x.Key).FirstOrDefault(); var totalCount = erp_list.Count; var totalUpdateCount = 0; var totalAddCount = 0; //1.通过单据编号找到wms系统现有的任务单;并修改 var erp_remove_billNo = new List(); var SourceBillNo_list = erp_list.GroupBy(x => x.BillNo).Select(x => x.Key).ToList(); var data_list = await _inStockTaskRepositories.GetListBy(SourceBillNo_list); if (data_list.Count != 0) { data_list.ForEach(x => { var erp_list_dets = erp_list.Where(t => t.BillNo == x.SourceBillNo).ToList(); if (erp_list_dets != null && erp_list_dets.Count != 0 && erp_list_dets.Count > x.Details.Count) { var xd_detids = x.Details.Select(xd => xd.ErpDetailId).ToList(); var task_no_materials = erp_list_dets.Where(ed => !xd_detids.Contains(ed.ErpDetailId)).ToList(); var Add_task_no_materials = _mapper.Map>(task_no_materials); x.Details.AddRange(Add_task_no_materials); } }); //2.1提取出wms任务单明细信息 var data_list_details = data_list.SelectMany(x => x.Details).ToList(); foreach (var item in data_list_details) { var data = data_list.Where(x => x.Id == item.Fid).FirstOrDefault(); if (data == null) continue; //2.1.1对比erp的物料信息 var erp_data = erp_list.Where(x => x.ErpDetailId == item.ErpDetailId).FirstOrDefault(); if (erp_data != null) { //2.1.2修改数量 if (erp_data.Qty > item.AccruedQty && (erp_data.Qty > item.RealityQty && item.RealityQty != 0)) data.Status = InstockStatus.Part; else if (erp_data.Qty <= item.AccruedQty && erp_data.Qty <= item.RealityQty) data.Status = InstockStatus.Already; item.Remark = erp_data.Remark; item.AccruedQty = erp_data.Qty; item.FactoryPrice = erp_data.FactoryPrice; item.DeliveredQty = erp_data.DeliveredQty; //打印日志:需要的修改条数 totalUpdateCount++; erp_remove_billNo.Add(data.SourceBillNo); } } //金蝶修改了物料:老物料,应收数量修改为0, var data_list_details_new = data_list.SelectMany(x => x.Details).ToList(); data_list_details_new.ForEach(x => { //2.1.1对比erp的物料信息 var erp_data = erp_list.Where(t => t.ErpDetailId == x.ErpDetailId).FirstOrDefault(); if (erp_data != null) { if (erp_data.MaterialNumber != x.MaterialNumber) { //给老的物料应收数量改为0 x.AccruedQty = 0; } } else if (erp_data == null) { x.AccruedQty = 0; } }); //新物料新增一条 foreach (var item in erp_list) { var local_data_order = data_list.Where(t => t.SourceBillNo == item.BillNo).FirstOrDefault(); if (local_data_order != null) { var local_data = data_list_details_new.Where(t => t.ErpDetailId == item.ErpDetailId).ToList(); if (local_data != null && local_data.Count != 0) { var isHaveMater_detail = local_data.Where(t => t.MaterialNumber == item.MaterialNumber).Any(); if (!isHaveMater_detail) { //明细的物料改变了:新的物料重新添加一条明细 var Add_task_no_materials = _mapper.Map(item); data_list.Where(x => x.SourceBillNo == item.BillNo).FirstOrDefault().Status = InstockStatus.Part; data_list.Where(x => x.SourceBillNo == item.BillNo).FirstOrDefault()?.Details.Add(Add_task_no_materials); } } else { //新增明细 var Add_task_det = _mapper.Map(item); data_list.Where(x => x.SourceBillNo == item.BillNo).FirstOrDefault().Status = InstockStatus.Part; data_list.Where(x => x.SourceBillNo == item.BillNo).FirstOrDefault()?.Details.Add(Add_task_det); } } } //2.2.提交修改 var isSuccess = await _inStockTaskRepositories.UpdateRange(data_list, isTransaction); if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError); //要剔除的来源单据编号:去重 erp_remove_billNo = erp_remove_billNo.GroupBy(x => x).Select(x => x.Key).ToList(); //2.3剔除:已修改的单据 foreach (var item in erp_remove_billNo) { erp_list.RemoveAll(x => x.BillNo == item); } } //打印日志 //打印日志:需要的添加条数 //totalAddCount = erp_list.Count; //this.LogInfomation( type,totalCount, totalUpdateCount, totalAddCount); //3.wms任务单的来源单据编号不存在于erp中,那么就新增 if (erp_list.Count != 0) { var add_entitys = new List(); var current_billNos = erp_list.GroupBy(x => x.BillNo).Select(x => x.Key).ToList(); foreach (var item in current_billNos) { var current_order = erp_list.Where(x => x.BillNo == item).FirstOrDefault(); var dto = new InStockTask(); dto.Create((InstockType)current_order.Type, current_order.BillNo, current_order.CreateTime, current_order.SupplierId, current_order.OrgCode); //找到当前对应来源单据编号的集合数据 var current_erp_details = erp_list.Where(x => x.BillNo == item).ToList(); //给到dto的实体明细中 dto.Details = _mapper.Map>(current_erp_details); add_entitys.Add(dto); } //3.1提交新增 var isSuccess = await _inStockTaskRepositories.AddRange(add_entitys, isTransaction); if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError); } return Result.ReSuccess(); } /// /// ERP数据同步到WMS数据库-新代码 /// /// /// /// public async Task SysnDataNew(List erp_list, bool isTransaction) { if (erp_list.Count() <= 0) return Result.ReSuccess(); _logger.LogInformation($"获取到金蝶入库任务单数据:{JsonConvert.SerializeObject(erp_list)}"); //1.通过单据编号找到wms系统现有的任务单;并修改 var erp_removeList = new List(); var SourceBillNo_list = erp_list.GroupBy(x => x.BillNo).Select(x => x.Key).ToList(); var data_list = await _inStockTaskRepositories.GetListBy(SourceBillNo_list); //要新增的明细 var erp_addDetailsList = new List(); //2.遍历已有的任务单 if (data_list.Count != 0) { //2.1遍历任务单明细:改变已有的值和要添加的明细 foreach (var det in data_list.SelectMany(t => t.Details)) { var order = data_list.Where(o => o.Id == det.Fid).FirstOrDefault(); if (order != null) { var erp_data = erp_list.FirstOrDefault(a => a.ErpDetailId == det.ErpDetailId && a.BillNo == order.SourceBillNo); if (erp_data != null) { //如果该明细作废 则不修改了 if (det.IsRepeal == true) { //操作完后剔除 erp_removeList.Add(erp_data); continue; } if (erp_data.MaterialNumber == det.MaterialNumber) { //物料相同的,就改变数值 det.Remark = erp_data.Remark; det.AccruedQty = erp_data.Qty; det.FactoryPrice = erp_data.FactoryPrice; det.DeliveredQty = erp_data.DeliveredQty; } else { //老物料,应收数量修改为0 det.AccruedQty = 0; det.IsRepeal = true; } //操作完后剔除 erp_removeList.Add(erp_data); } } } //2.1.1当物料相同,仓库不同或者物料不同,就新增一条明细 foreach (var erp_data in erp_list) { var order = data_list.Where(x => x.SourceBillNo == erp_data.BillNo).FirstOrDefault(); if (order != null) { var IsHaveNewMaterial = order.Details.Where(x => x.ErpDetailId == erp_data.ErpDetailId && erp_data.MaterialNumber == x.MaterialNumber).Any(); if (!IsHaveNewMaterial) { //当物料相同,仓库不同或者物料不同,就新增一条明细 erp_addDetailsList.Add(erp_data); //操作完后剔除 erp_removeList.Add(erp_data); } } } //去重 var erp_addDetailsList_group = erp_addDetailsList.Distinct().ToList(); //2.2遍历任务单:添加新的明细 data_list.ForEach(order => { //2.1.任务单添加明细 var addErpDetails = erp_addDetailsList_group.Where(x => x.BillNo == order.SourceBillNo).ToList(); if (addErpDetails.Count != 0) { var addDetails = _mapper.Map>(addErpDetails); order.Details.AddRange(addDetails); } }); //2.4金蝶删除的明细,要把任务单里的明细应入库数量改为0 data_list.SelectMany(x => x.Details).Where(c => !erp_list.Any(a => a.ErpDetailId == c.ErpDetailId)) .ToList() .ForEach(x => { x.AccruedQty = 0; x.IsRepeal = true; }); //2.3遍历任务单:改变任务单的状态 data_list.ForEach(order => { //当应入库数量大于实际入库数量:状态就部分入库 //当应入库数量小于等于实际入库数量:状态就已入库 var details_Groups = order.Details.Where(x => x.AccruedQty != 0).GroupBy(x => x.MaterialNumber) .Select(x => new { MaterialNumber = x.Key, AccruedQtyTotal = x.Sum(t => t.AccruedQty), ReceiveQtyTotal = x.Sum(t => t.ReceiveQty), RealityQtyTotal = x.Sum(t => t.RealityQty) }).ToList(); bool IsAny = details_Groups.Any(d => d.RealityQtyTotal != 0 && d.AccruedQtyTotal > d.RealityQtyTotal); if (IsAny) order.Status = InstockStatus.Part; else if (details_Groups.Sum(x => x.ReceiveQtyTotal) <= 0 && order.Type == InstockType.Purchase) order.Status = InstockStatus.Wait; else if (details_Groups.Sum(x => x.RealityQtyTotal) <= 0) { //if (order.Type == InstockType.ProduceSotck) // { // order.Status = InstockStatus.Wait; // } // else // { order.Status = InstockStatus.WaitInStock; //} } else if (details_Groups.Sum(x => x.RealityQtyTotal) >= details_Groups.Sum(x => x.AccruedQtyTotal)) order.Status = InstockStatus.Already; //明细都作废后 整个单据作废 if (order.Details.Count() == order.Details.Where(w => w.IsRepeal == true).Count()) { order.Status = InstockStatus.Repeal; } }); //过滤掉已经作废的单据 //data_list = data_list.Where(w => w.Status != InstockStatus.Repeal).ToList(); //更新修改时间 data_list.ForEach(f => f.WmsUpdateTime = DateTime.Now); //2.3.提交任务单的修改 var isSuccess = await _inStockTaskRepositories.UpdateRange(data_list, isTransaction); if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError); } //2.4剔除:已修改的单据 foreach (var item in erp_removeList.Distinct().ToList()) erp_list.Remove(item); _logger.LogInformation("拉取金蝶数据:SysnDataNew5->" + JsonConvert.SerializeObject(erp_list)); //3.wms任务单的来源单据编号不存在于erp中,那么就新增 if (erp_list.Count != 0) { var add_entitys = new List(); var current_billNos = erp_list.GroupBy(x => x.BillNo).Select(x => x.Key).ToList(); foreach (var item in current_billNos) { var current_order = erp_list.Where(x => x.BillNo == item).FirstOrDefault(); var dto = new InStockTask(); dto.Create((InstockType)current_order.Type, current_order.BillNo, current_order.CreateTime, current_order.SupplierId, current_order.OrgCode); //找到当前对应来源单据编号的集合数据 var current_erp_details = erp_list.Where(x => x.BillNo == item).ToList(); //给到dto的实体明细中 dto.Details = _mapper.Map>(current_erp_details); add_entitys.Add(dto); } //3.1提交新增 var isSuccess = await _inStockTaskRepositories.AddRange(add_entitys, isTransaction); _logger.LogInformation($"金蝶数据写入:SysnDataNew6->结果:{isSuccess}" + JsonConvert.SerializeObject(add_entitys)); if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError); } return Result.ReSuccess(); } /// /// 作废 /// /// /// /// public async Task Repeal(OperateRequest dto, LoginInDto loginInfo) { var list = await _inStockTaskRepositories.GetListByDetailIds(dto.Ids); foreach (var entity in list) { var det_ids = entity.Details.Select(s => s.Id).ToList(); var change_ids = det_ids.Intersect(dto.Ids).ToList(); //作废 entity.Repeal(loginInfo.UserInfo.StaffId, change_ids); } var isSuccess = await _inStockTaskRepositories.UpdateRange(list, true); if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError); return Result.ReSuccess(); } /// /// 打印日志 /// /// /// /// /// public void LogInfomation(InstockType type, int totalCount, int updateCount, int addCount) { _logger.LogInformation($"《{type.GetRemark()}总条数:" + totalCount + ",修改条数:" + updateCount + ",新增条数:" + addCount + "》"); } /// /// 反作废 /// /// /// /// /// public async Task NoRepeal(OperateRequest dto, LoginInDto loginInfo) { var list = await _inStockTaskRepositories.GetListByDetailIds(dto.Ids); foreach (var entity in list) { var det_ids = entity.Details.Select(s => s.Id).ToList(); var change_ids = det_ids.Intersect(dto.Ids).ToList(); //作废 entity.NoRepeal(loginInfo.UserInfo.StaffId, change_ids); } var isSuccess = await _inStockTaskRepositories.UpdateRange(list, true); if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError); return Result.ReSuccess(); } /// /// 金蝶删单后wms单据作废 /// /// /// /// public async Task ErpDel() { var list = await _inStockTaskRepositories.GetEntityListByStatus(); var result = await GetData(list); if (!result.IsSuccess) return Result.ReFailure(result.Message, result.Status); var erp_list = result.Data; List update_list = new List(); //处理数据 因为入库任务单和出库任务单结构不一样 没有合并的单据 所以处理不同 foreach (var entity in list) { //判断是否在erp数据池里 int count = erp_list.Where(w => w.BillNo.Equals(entity.SourceBillNo)).Count(); if (count > 0) continue; //如果不在数据池里 被删除了 那么需要把订单作废 entity.ErpDel(); _logger.LogInformation($"入库任务单 金蝶未找到单据:{entity.SourceBillNo} wms订单号:{entity.BillNo} 作废来源单号:{entity.SourceBillNo}"); if (update_list.FirstOrDefault(f => f.Id == entity.Id) == null) update_list.Add(entity); } if (update_list.Count() <= 0) return Result.ReSuccess(); var isSuccess = await _inStockTaskRepositories.UpdateRange(update_list, true); if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError); return Result.ReSuccess(); } /// /// 获取金蝶数据 /// /// /// public async Task>> GetData(List list) { List erp_list = new List(); List Instock_sourceBillNos = new List(); List Miscellaneous_sourceBillNos = new List(); List TransferDirect_sourceBillNos = new List(); List Transferin_sourceBillNos = new List(); List AssembledApp_sourceBillNos = new List(); // List ProduceSotck_sourceBillNos = new List();//生产入库 foreach (var entity in list) { if (entity.Type == InstockType.Purchase) Instock_sourceBillNos.Add(entity.SourceBillNo); else if (entity.Type == InstockType.Stkdirecttransfers) TransferDirect_sourceBillNos.Add(entity.SourceBillNo); else if (entity.Type == InstockType.StktransferInst) Transferin_sourceBillNos.Add(entity.SourceBillNo); else if (entity.Type == InstockType.Assembled) AssembledApp_sourceBillNos.Add(entity.SourceBillNo); else if (entity.Type == InstockType.Miscellaneous) Miscellaneous_sourceBillNos.Add(entity.SourceBillNo); //else if (entity.Type == InstockType.ProduceSotck) // ProduceSotck_sourceBillNos.Add(entity.SourceBillNo); } //if (ProduceSotck_sourceBillNos.Count() > 0)//生产入库 //{ // var erp_result = await _erpService.BillQueryForProduceSotckin(ProduceSotck_sourceBillNos, null); // if (!erp_result.IsSuccess) // return Result>.ReFailure(erp_result.Message, erp_result.Status); // erp_list.AddRange(erp_result.Data); //} if (Instock_sourceBillNos.Count() > 0) { var erp_result = await _erpService.BillQueryForPurchaseInStock(Instock_sourceBillNos, null); if (!erp_result.IsSuccess) return Result>.ReFailure(erp_result.Message, erp_result.Status); erp_list.AddRange(erp_result.Data); } if (Miscellaneous_sourceBillNos.Count() > 0) { var erp_result = await _erpService.BillQueryForMiscellaneous(Miscellaneous_sourceBillNos, null); if (!erp_result.IsSuccess) return Result>.ReFailure(erp_result.Message, erp_result.Status); erp_list.AddRange(erp_result.Data); } if (TransferDirect_sourceBillNos.Count() > 0) { var erp_result = await _erpService.BillQueryForTransferDirect(TransferDirect_sourceBillNos, null); if (!erp_result.IsSuccess) return Result>.ReFailure(erp_result.Message, erp_result.Status); erp_list.AddRange(erp_result.Data); } if (Transferin_sourceBillNos.Count() > 0) { var erp_result = await _erpService.BillQueryForTransferin(Transferin_sourceBillNos, null); if (!erp_result.IsSuccess) return Result>.ReFailure(erp_result.Message, erp_result.Status); erp_list.AddRange(erp_result.Data); } if (AssembledApp_sourceBillNos.Count() > 0) { var erp_result_ass = await _erpService.BillQueryForAssembledApp_Assembly(AssembledApp_sourceBillNos, null); if (!erp_result_ass.IsSuccess) return Result>.ReFailure(erp_result_ass.Message, erp_result_ass.Status); erp_list.AddRange(erp_result_ass.Data); //1.1.获取金蝶数据:拆卸子件入库订单数据 var erp_result_disass = await _erpService.BillQueryForAssembledApp_Disassembly(AssembledApp_sourceBillNos, null); if (!erp_result_disass.IsSuccess) return Result>.ReFailure(erp_result_disass.Message, erp_result_disass.Status); erp_list.AddRange(erp_result_disass.Data); } return Result>.ReSuccess(erp_list); } } }