diff --git a/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml b/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml index b1f04aaf..d7f4a7f1 100644 --- a/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml +++ b/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml @@ -1308,6 +1308,18 @@ + + + 入库任务单-服务接口 + + + + + 同步:采购入库类型单据 + + + + 出库服务 @@ -1876,6 +1888,18 @@ + + + 入库任务单-服务 + + + + + 同步:采购入库类型单据 + + + + 出库服务 diff --git a/src/WMS.Web.Domain/IService/IInStockTaskService.cs b/src/WMS.Web.Domain/IService/IInStockTaskService.cs new file mode 100644 index 00000000..5cea3269 --- /dev/null +++ b/src/WMS.Web.Domain/IService/IInStockTaskService.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; +using WMS.Web.Core.Internal.Results; + +namespace WMS.Web.Domain.IService +{ + /// + /// 入库任务单-服务接口 + /// + public interface IInStockTaskService + { + /// + /// 同步:采购入库类型单据 + /// + /// + /// + Task SsynPurchaseInStock(bool isTransaction); + } +} diff --git a/src/WMS.Web.Domain/QuartzJob/InStockOrderQuartzJob.cs b/src/WMS.Web.Domain/QuartzJob/InStockOrderQuartzJob.cs index fb82291b..5b7ccfd6 100644 --- a/src/WMS.Web.Domain/QuartzJob/InStockOrderQuartzJob.cs +++ b/src/WMS.Web.Domain/QuartzJob/InStockOrderQuartzJob.cs @@ -1,4 +1,5 @@ -using Microsoft.Extensions.DependencyInjection; +using Microsoft.EntityFrameworkCore.Storage; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Quartz; @@ -7,6 +8,7 @@ using System.Collections.Generic; using System.Text; using System.Threading.Tasks; using WMS.Web.Domain.Infrastructure; +using WMS.Web.Domain.IService; using WMS.Web.Domain.IService.Public; using WMS.Web.Domain.Options; @@ -20,20 +22,20 @@ namespace WMS.Web.Domain.QuartzJob private readonly ILogger _logger; private readonly IServiceScopeFactory _serviceScopeFactory; private readonly AppOptions _options; - private readonly IInStockTaskRepositories _inStockTaskRepositories; - private readonly IErpService _erpService; + private readonly IInStockTaskService _inStockTaskService; + private readonly ITransactionRepositories _transactionRepositories; public InStockOrderQuartzJob(ILogger logger, IServiceScopeFactory serviceScopeFactory, IOptions options, - IInStockTaskRepositories inStockTaskRepositories, - IErpService erpService) + IInStockTaskService inStockTaskService, + ITransactionRepositories transactionRepositories) { - this._erpService = erpService; this._logger = logger; _serviceScopeFactory = serviceScopeFactory; this._options = options?.Value; - _inStockTaskRepositories = inStockTaskRepositories; + _inStockTaskService = inStockTaskService; + _transactionRepositories = transactionRepositories; } /// @@ -45,27 +47,28 @@ namespace WMS.Web.Domain.QuartzJob { try { - - + //1.事务 + IDbContextTransaction _transaction = _transactionRepositories.GetTransaction(); + bool isRollback = false; + bool isTransaction = false; + //2.记录:开始时间 var begindatetime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); + _logger.LogInformation($"同步金蝶入库单数据:执行开始时间->{begindatetime}"); + //3.同步数据 + var result = await _inStockTaskService.SsynPurchaseInStock(isTransaction); + if (!result.IsSuccess) isRollback = true; - - var purchaseInStockOrder = await _erpService.BillQueryForPurchaseInStock(); - - - + //4.提交事务 + var isSuccess = _transactionRepositories.CommitTransaction(isRollback, _transaction); + + //5.记录:结束时间 var enddatetime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); - //_logger.LogInformation($"《获取金蝶数据》->执行开始时间:{begindatetime},\r\n" + - //$"执行条数:{result.Data?.ExecuteCount}条,\r\n" + - //$"新增数:{result.Data?.ExecuteCreateCount}条,\r\n" + - //$"更新数:{result.Data?.ExecuteUpdateCount}条,\r\n" + - //$"执行结果:{result.Data?.Message},\r\n" + - //$"执行结束时间:{enddatetime}"); + _logger.LogInformation($"同步金蝶入库单数据:执行结束时间->{begindatetime}"); } catch (Exception ex) { - _logger.LogInformation($"首页库存金额统计:定时任务执行失败->{ex.Message}"); + _logger.LogInformation($"同步金蝶入库单数据:定时任务执行失败->{ex.Message}"); } } diff --git a/src/WMS.Web.Domain/Services/InStockTaskService.cs b/src/WMS.Web.Domain/Services/InStockTaskService.cs new file mode 100644 index 00000000..be692a8a --- /dev/null +++ b/src/WMS.Web.Domain/Services/InStockTaskService.cs @@ -0,0 +1,107 @@ +using AutoMapper; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using WMS.Web.Core.Dto.Erp.Purchase; +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 ITransactionRepositories _transactionRepositories; + private readonly IInStockRepositories _inStockRepositories; + private readonly IInStockTaskRepositories _inStockTaskRepositories; + public InStockTaskService(IMapper mapper, IErpService erpService, ILoginService loginService, + ITransactionRepositories transactionRepositories, + IInStockRepositories inStockRepositories, IInStockTaskRepositories inStockTaskRepositories) + { + _mapper = mapper; + _erpService = erpService; + _loginService = loginService; + _transactionRepositories = transactionRepositories; + _inStockRepositories = inStockRepositories; + _inStockTaskRepositories = inStockTaskRepositories; + } + + + /// + /// 同步:采购入库类型单据 + /// + /// + /// + public async Task SsynPurchaseInStock(bool isTransaction) + { + //1.获取金蝶数据:采购订单数据 + var erp_result= await _erpService.BillQueryForPurchaseInStock(); + 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) + { + //2.1.1对比erp的物料信息 + var erp_data = erp_list.Where(x => x.FMaterialId == item.MaterialId).FirstOrDefault(); + if (erp_data != null) + { + //2.1.2修改数量 + item.AccruedQty = erp_data.FQty; + erp_removeList.Add(erp_data); + } + } + + //2.2.提交修改 + var isSuccess = await _inStockTaskRepositories.UpdateRange(data_list, isTransaction); + if (!isSuccess) + return ResultList.ReFailure(ResultCodes.DateWriteError); + + //2.3剔除:已修改的单据 + foreach (var item in erp_removeList) + { + erp_list.Remove(item); + } + } + + //3.wms任务单的来源单据编号不存在于erp中,那么就新增 + if (SourceBillNo_list.Count != 0) + { + var add_entitys = new List(); + foreach (var sourceBillNo in SourceBillNo_list) + { + var dto = new InStockTask(); + dto.SourceBillNo = sourceBillNo; + dto.Create(InstockType.Purchase); + dto.Details = _mapper.Map>(erp_list); + add_entitys.Add(dto); + } + //3.1提交新增 + var isSuccess = await _inStockTaskRepositories.AddRange(add_entitys, isTransaction); + if (!isSuccess) + return ResultList.ReFailure(ResultCodes.DateWriteError); + } + + return Result.ReSuccess(); + } + } +} diff --git a/src/WMS.Web.Domain/Services/Public/ErpService.cs b/src/WMS.Web.Domain/Services/Public/ErpService.cs index c2958af7..aedc3979 100644 --- a/src/WMS.Web.Domain/Services/Public/ErpService.cs +++ b/src/WMS.Web.Domain/Services/Public/ErpService.cs @@ -1,5 +1,6 @@ using AutoMapper; using ERP; +using Microsoft.EntityFrameworkCore.Storage; using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; @@ -34,18 +35,21 @@ namespace WMS.Web.Domain.Services.Public private ERPGWSoapClient _client; private readonly IMemoryCache _memoryCache; private readonly IInStockTaskRepositories _inStockTaskRepositories; + public readonly ITransactionRepositories _transactionRepositories; public ErpService( IMapper mapper, IOptions erpOptions, ILogger logger, IMemoryCache memoryCache, - IInStockTaskRepositories inStockTaskRepositories) + IInStockTaskRepositories inStockTaskRepositories, + ITransactionRepositories transactionRepositories) { this._erpOptions = erpOptions?.Value; this._mapper = mapper; this._logger = logger; this._memoryCache = memoryCache; this._inStockTaskRepositories = inStockTaskRepositories; + this._transactionRepositories = transactionRepositories; } /// @@ -100,7 +104,7 @@ namespace WMS.Web.Domain.Services.Public var result = JsonConvert.DeserializeObject>>(result_json); //5.返回数据的组装 - var list = new List(); + var erp_list = new List(); foreach (var item in result) { var lis = new ErpPurchaseInStockResultDto(); @@ -115,33 +119,13 @@ namespace WMS.Web.Domain.Services.Public lis.FEntryNote = item[8]; lis.FCreateDate =Convert.ToDateTime(item[9]); //list.FCHUCHANGPRICE=[10]FCHUCHANGPRICE;//这个是出厂价,但是金蝶测试没有这个字段,正式有的 - list.Add(lis); + erp_list.Add(lis); } - - //6. - var SourceBillNo_list = list.GroupBy(x=>x.FBillNo).Select(x => x.Key).ToList(); - var data_list= await _inStockTaskRepositories.GetListBy(SourceBillNo_list); - if (data_list.Count != 0) - { - var data_details_list= data_list.SelectMany(x => x.Details).ToList(); - foreach (var item in data_details_list) - { - - } - } - - var dto = new InStockTask(); - dto.Create(InstockType.Purchase); - dto.Details = _mapper.Map>(list); - - - - return ResultList.ReSuccess(list); - + return ResultList.ReSuccess(erp_list); } catch (Exception ex) { - return ResultList.ReFailure("错误", 10001); + return ResultList.ReFailure(ResultCodes.Erp_BillQuery_Error); } } diff --git a/src/WMS.Web.Domain/Values/ResultCodes.cs b/src/WMS.Web.Domain/Values/ResultCodes.cs index a3fcd4bf..6d8fa1e5 100644 --- a/src/WMS.Web.Domain/Values/ResultCodes.cs +++ b/src/WMS.Web.Domain/Values/ResultCodes.cs @@ -9,9 +9,9 @@ namespace WMS.Web.Domain.Values /// public partial class ResultCodes { - public static ValueTuple Erp_Login_Error = (1001, "Erp登录返回错误"); + public static ValueTuple Erp_Login_Error = (1001, "同步金蝶登录错误,请稍候再试"); - public static ValueTuple Erp_BillQuery_Error = (1002, "Erp单据查询返回错误"); + public static ValueTuple Erp_BillQuery_Error = (1002, "同步金蝶数据出错,请稍等再试"); /// /// 无效 /// diff --git a/src/WMS.Web.Repositories/DependencyInjection/AppBuilder.cs b/src/WMS.Web.Repositories/DependencyInjection/AppBuilder.cs index 6b160fa8..6877e1a1 100644 --- a/src/WMS.Web.Repositories/DependencyInjection/AppBuilder.cs +++ b/src/WMS.Web.Repositories/DependencyInjection/AppBuilder.cs @@ -240,6 +240,7 @@ namespace WMS.Web.Repositories.DependencyInjection Services.AddTransient(); Services.AddTransient(); Services.AddTransient(); + Services.AddTransient(); } }