using AutoMapper; using Microsoft.EntityFrameworkCore.Storage; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using WMS.Web.Core.Dto.Erp; using WMS.Web.Core.Dto.Erp.Purchase; using WMS.Web.Core.Dto.InStockTask; 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.Values; namespace WMS.Web.Domain.Services { /// /// 入库任务单-服务 /// public class InStockTaskService : IInStockTaskService { private readonly IMapper _mapper; private readonly IErpService _erpService; private readonly ILoginService _loginService; private readonly IBasicsRepositories _basicsRepositories; private readonly IInStockRepositories _inStockRepositories; private readonly IInStockTaskRepositories _inStockTaskRepositories; public InStockTaskService(IMapper mapper, IErpService erpService, ILoginService loginService, IBasicsRepositories basicsRepositories, IInStockRepositories inStockRepositories, IInStockTaskRepositories inStockTaskRepositories) { _mapper = mapper; _erpService = erpService; _loginService = loginService; _basicsRepositories = basicsRepositories; _inStockRepositories = inStockRepositories; _inStockTaskRepositories = inStockTaskRepositories; } /// /// 来源单-与金蝶校准-第二步-pad:这个只针对采购订单 /// /// /// 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 ResultList.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; } //4.提交事务 var isSuccess = _basicsRepositories.CommitTransaction(isRollback, _transaction); if (!isSuccess) return ResultList.ReFailure(ResultCodes.AdjustError); //5.再一次查询新的数据:并返回最后的结果 var request = new InStockTaskBillNoQueryRequest() { SourceBillNo = sourceBillNo }; var list = await _inStockTaskRepositories.GetListBy(request); return ResultList.ReSuccess(list); } /// /// 来源单-与金蝶校准-第二步-pad:这个是非采购订单上架使用 /// /// /// public async Task> AdjustNoPurchase(string sourceBillNo) { //1.事务 IDbContextTransaction _transaction = _basicsRepositories.GetTransaction(); bool isRollback = false; bool isTransaction = false; //2.查看是否有入库任务单 var task = await _inStockTaskRepositories.GetBySource(sourceBillNo); if (task == null) return ResultList.ReFailure(ResultCodes.OrderNoData); //3.有的话就同步一下金蝶的数据 var billNos = new List(); billNos.Add(sourceBillNo); //3.1这里要对入库任务单的类型逐一判断,进行去ErpService找对应的单据类型重新获取;这里只有采购,后面再加其它的 if (task.Type == InstockType.Miscellaneous) { var result = await this.SysnMiscellaneous(billNos, isTransaction); if (!result.IsSuccess) isRollback = true; } else if (task.Type == InstockType.Assembled) { } else if (task.Type == InstockType.Stkdirecttransfers) { } else if (task.Type == InstockType.StktransferInst) { } //4.提交事务 var isSuccess = _basicsRepositories.CommitTransaction(isRollback, _transaction); if (!isSuccess) return ResultList.ReFailure(ResultCodes.AdjustError); //5.再一次查询新的数据:并返回最后的结果 var request = new InStockTaskBillNoQueryRequest() { SourceBillNo = sourceBillNo }; var list = await _inStockTaskRepositories.GetListInfoBy(request); return ResultList.ReSuccess(list); } /// /// 同步:采购入库类型单据 /// /// /// /// public async Task SsynPurchaseInStock(List billNos = null, bool isTransaction = true) { //1.获取金蝶数据:采购订单数据 var erp_result = await _erpService.BillQueryForPurchaseInStock(billNos); if (!erp_result.IsSuccess) return Result.ReFailure(erp_result.Message, erp_result.Status); var erp_list = erp_result.Data; //2.通过单据编号找到wms系统现有的任务单;并修改 var erp_removeList = new List(); var SourceBillNo_list = erp_list.GroupBy(x => x.FBillNo).Select(x => x.Key).ToList(); var data_list = await _inStockTaskRepositories.GetListBy(SourceBillNo_list); if (data_list.Count != 0) { //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(); //2.1.1对比erp的物料信息 var erp_data = erp_list.Where(x => x.FBillNo == data.SourceBillNo && x.FMaterialId == item.MaterialId).FirstOrDefault(); if (erp_data != null) { //2.1.2修改数量 item.AccruedQty = erp_data.FQty; item.DeliveredQty = erp_data.FStockInQty; erp_removeList.Add(erp_data); } } //2.2.提交修改 var isSuccess = await _inStockTaskRepositories.UpdateRange(data_list, isTransaction); if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError); //2.3剔除:已修改的单据 foreach (var item in erp_removeList) { erp_list.Remove(item); } } //3.wms任务单的来源单据编号不存在于erp中,那么就新增 if (erp_list.Count != 0) { var add_entitys = new List(); //var current_billNos = erp_list.GroupBy(x => x.FBillNo).Select(x => x.Key).ToList(); var current_billNos = erp_list.GroupBy(x => new { x.FBillNo, x.FCreateDate }).Select(x => new { x.Key.FBillNo, x.Key.FCreateDate }).ToList(); foreach (var item in current_billNos) { var dto = new InStockTask(); dto.SourceBillNo = item.FBillNo; dto.CreateTime = item.FCreateDate; dto.Create(InstockType.Purchase); //找到当前对应来源单据编号的集合数据 var current_erp_details = erp_list.Where(x => x.FBillNo == item.FBillNo).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(); } /// /// 同步:其他入库单 /// /// /// /// public async Task SysnMiscellaneous(List billNos = null, bool isTransaction = true) { //1.获取金蝶数据:其他入库订单数据 var erp_result = await _erpService.BillQueryForMiscellaneous(billNos); if (!erp_result.IsSuccess) return Result.ReFailure(erp_result.Message, erp_result.Status); var erp_list = erp_result.Data; //2.通过单据编号找到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); if (data_list.Count != 0) { //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(); //2.1.1对比erp的物料信息 var erp_data = erp_list.Where(x => x.BillNo == data.SourceBillNo && x.MaterialId == item.MaterialId).FirstOrDefault(); if (erp_data != null) { //2.1.2修改数量 item.AccruedQty = erp_data.Qty; erp_removeList.Add(erp_data); } } //2.2.提交修改 var isSuccess = await _inStockTaskRepositories.UpdateRange(data_list, isTransaction); if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError); //2.3剔除:已修改的单据 foreach (var item in erp_removeList) { erp_list.Remove(item); } } //3.wms任务单的来源单据编号不存在于erp中,那么就新增 if (erp_list.Count != 0) { var add_entitys = new List(); var current_billNos = erp_list.GroupBy(x => new { x.BillNo,x.CreateTime }).Select(x => new {x.Key.BillNo,x.Key.CreateTime }).ToList(); foreach (var item in current_billNos) { var dto = new InStockTask(); dto.SourceBillNo = item.BillNo; dto.CreateTime = item.CreateTime; dto.Create(InstockType.Miscellaneous); //找到当前对应来源单据编号的集合数据 var current_erp_details = erp_list.Where(x => x.BillNo == item.BillNo).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(); } /// /// 同步:直接调拨入库单 /// /// /// /// public async Task SysnTransferDirect(List billNos = null, bool isTransaction = true) { //1.获取金蝶数据:直接调拨入库订单数据 var erp_result = await _erpService.BillQueryForTransferDirect(billNos); if (!erp_result.IsSuccess) return Result.ReFailure(erp_result.Message, erp_result.Status); var erp_list = erp_result.Data; //2.通过单据编号找到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); if (data_list.Count != 0) { //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(); //2.1.1对比erp的物料信息 var erp_data = erp_list.Where(x => x.BillNo == data.SourceBillNo && x.MaterialId == item.MaterialId).FirstOrDefault(); if (erp_data != null) { //2.1.2修改数量 item.AccruedQty = erp_data.Qty; erp_removeList.Add(erp_data); } } //2.2.提交修改 var isSuccess = await _inStockTaskRepositories.UpdateRange(data_list, isTransaction); if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError); //2.3剔除:已修改的单据 foreach (var item in erp_removeList) { erp_list.Remove(item); } } //3.wms任务单的来源单据编号不存在于erp中,那么就新增 if (erp_list.Count != 0) { var add_entitys = new List(); var current_billNos = erp_list.GroupBy(x => new { x.BillNo, x.CreateTime }).Select(x => new { x.Key.BillNo, x.Key.CreateTime }).ToList(); foreach (var item in current_billNos) { var dto = new InStockTask(); dto.SourceBillNo = item.BillNo; dto.CreateTime = item.CreateTime; dto.Create(InstockType.Stkdirecttransfers); //找到当前对应来源单据编号的集合数据 var current_erp_details = erp_list.Where(x => x.BillNo == item.BillNo).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(); } } }