diff --git a/src/WMS.Web.Api/Controllers/TestController.cs b/src/WMS.Web.Api/Controllers/TestController.cs index 66a78e36..2f1ca3aa 100644 --- a/src/WMS.Web.Api/Controllers/TestController.cs +++ b/src/WMS.Web.Api/Controllers/TestController.cs @@ -47,12 +47,14 @@ namespace WMS.Web.Api.Controllers private readonly ILoginService _loginService; private readonly AppOptions _options; private readonly ISendMessageService _sendMessageService; + private readonly IMaterialService _materialService; public TestController(IErpService erpService, IInStockTaskService inStockTaskService, IBoxInventoryRepositories boxInventoryRepositories, IBasicsRepositories transactionRepositories, IOpsService opsService, IBoxService boxService, IBasicsRepositories basicsRepositories, IOutStockTaskRepositories outStockTaskRepositories, IOutStockTaskService outStockTaskService, IOptions options, ILoginService loginService, ISendMessageService sendMessageService, ITakeStockService takeStockService, ITakeStockRepositories takeStockRepositories, IOutStockService outStockService, IInStockTaskRepositories inStockTaskRepositories, - IWebHostEnvironment env) + IWebHostEnvironment env, IMaterialService materialService) { + _materialService = materialService; _loginService = loginService; _sendMessageService = sendMessageService; _inStockTaskRepositories = inStockTaskRepositories; @@ -341,5 +343,12 @@ namespace WMS.Web.Api.Controllers { return await _sendMessageService.Execute(); } + + [HttpGet] + [Route("SyscMats")] + public async Task SyscMats() + { + return await _materialService.SyncNewMaterials(); + } } } diff --git a/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml b/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml index aa0c4dd2..c5233d68 100644 --- a/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml +++ b/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml @@ -3088,6 +3088,12 @@ + + + + + + 批量添加 @@ -3876,7 +3882,7 @@ - + erp:单据查询-物料集合 @@ -4174,6 +4180,17 @@ + + + 物料服务接口 + + + + + 同步金蝶新物料 + + + 发送消息服务 @@ -5519,7 +5536,7 @@ - + erp:单据查询-物料集合 @@ -6014,6 +6031,17 @@ + + + 物料服务 + + + + + 同步金蝶新的物料 + + + 阿里云短息服务 diff --git a/src/WMS.Web.Domain/IService/Public/IErpService.cs b/src/WMS.Web.Domain/IService/Public/IErpService.cs index eb6a3bed..3e6d337e 100644 --- a/src/WMS.Web.Domain/IService/Public/IErpService.cs +++ b/src/WMS.Web.Domain/IService/Public/IErpService.cs @@ -113,7 +113,7 @@ namespace WMS.Web.Domain.IService.Public /// erp:单据查询-物料集合 /// /// - Task> BillQueryForMaterial(); + Task> BillQueryForMaterial(bool isCache = true); /// /// erp:基础数据-物料信息 diff --git a/src/WMS.Web.Domain/IService/Public/IMaterialService.cs b/src/WMS.Web.Domain/IService/Public/IMaterialService.cs new file mode 100644 index 00000000..293df953 --- /dev/null +++ b/src/WMS.Web.Domain/IService/Public/IMaterialService.cs @@ -0,0 +1,20 @@ +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 IMaterialService + { + /// + /// 同步金蝶新物料 + /// + /// + Task SyncNewMaterials(); + } +} diff --git a/src/WMS.Web.Domain/Infrastructure/IMaterialsRepositories.cs b/src/WMS.Web.Domain/Infrastructure/IMaterialsRepositories.cs index d23124f2..ed6d13f2 100644 --- a/src/WMS.Web.Domain/Infrastructure/IMaterialsRepositories.cs +++ b/src/WMS.Web.Domain/Infrastructure/IMaterialsRepositories.cs @@ -32,8 +32,6 @@ namespace WMS.Web.Domain.Infrastructure /// Task Get(int mid); - Materials GetNew(int mid); - /// /// 物料 /// @@ -41,5 +39,11 @@ namespace WMS.Web.Domain.Infrastructure /// /// Task Get(string code, int orgId); + + /// + /// + /// + /// + Task> GetAllNumbers(); } } diff --git a/src/WMS.Web.Domain/Mappers/MaterialMapper.cs b/src/WMS.Web.Domain/Mappers/MaterialMapper.cs new file mode 100644 index 00000000..5bc0c097 --- /dev/null +++ b/src/WMS.Web.Domain/Mappers/MaterialMapper.cs @@ -0,0 +1,17 @@ +using AutoMapper; +using System; +using System.Collections.Generic; +using System.Text; +using WMS.Web.Core.Dto.Erp; +using WMS.Web.Domain.Entitys; + +namespace WMS.Web.Domain.Mappers +{ + public class MaterialMapper : Profile + { + public MaterialMapper() + { + CreateMap().ReverseMap(); + } + } +} diff --git a/src/WMS.Web.Domain/Services/Public/ErpService.cs b/src/WMS.Web.Domain/Services/Public/ErpService.cs index 0125fe47..5c23be06 100644 --- a/src/WMS.Web.Domain/Services/Public/ErpService.cs +++ b/src/WMS.Web.Domain/Services/Public/ErpService.cs @@ -817,50 +817,38 @@ namespace WMS.Web.Domain.Services.Public /// erp:单据查询-物料集合 /// /// - public async Task> BillQueryForMaterial() + public async Task> BillQueryForMaterial(bool isCache = true) { try { - //1.获取缓存中的物料数据; - var materials = _memoryCache.Get>(_erpOptions.cache_materail_key); - if (materials == null || materials.Count == 0) + if (isCache) { - var mats = await _materialsRepositories.GetEntityList(); - if (mats == null || mats.Count == 0) - return await this.BillQueryForMaterialPagedList(); - else + //1.获取缓存中的物料数据; + var materials = _memoryCache.Get>(_erpOptions.cache_materail_key); + if (materials == null || materials.Count == 0) { - var beginTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); - _logger.LogInformation($"物料拉取-开始时间:{beginTime}"); - var erp_materials_list = new List(); - //4.5.拼装 - foreach (var item in mats) + var mats = await _materialsRepositories.GetEntityList(); + if (mats == null || mats.Count == 0) + return await this.BillQueryForMaterialPagedList(); + else { - var lis = new ErpMaterialDto(); - lis.MaterialId = item.MaterialId; - lis.MaterialName = item.MaterialName; - lis.MaterialNumber = item.MaterialNumber; - lis.Specifications = item.Specifications; - lis.BaseUnitId = item.BaseUnitId; - lis.BaseUnitName = item.BaseUnitName; - lis.BaseUnitNumber = item.BaseUnitNumber; - lis.BarCode = item.BarCode; - lis.OrgId = item.OrgId; - lis.OrgCode = item.OrgCode; - erp_materials_list.Add(lis); + var beginTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); + _logger.LogInformation($"物料拉取-开始时间:{beginTime}"); + //组装dto + var erp_materials_list = mats.Select(x => _mapper.Map(x)).ToList(); + _memoryCache.Set(_erpOptions.cache_materail_key, erp_materials_list, new MemoryCacheEntryOptions().SetAbsoluteExpiration(TimeSpan.FromMinutes(DateTimeUtil.GetTotalMinutesTimeSpan()))); + var endTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); + _logger.LogInformation($"物料拉取-结束时间:{endTime}"); + _logger.LogInformation($"物料拉取-本地数据库-总条数:{erp_materials_list.Count}"); + return ResultList.ReSuccess(erp_materials_list); } - _memoryCache.Set(_erpOptions.cache_materail_key, erp_materials_list, new MemoryCacheEntryOptions().SetAbsoluteExpiration(TimeSpan.FromMinutes(DateTimeUtil.GetTotalMinutesTimeSpan()))); - var endTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); - _logger.LogInformation($"物料拉取-结束时间:{endTime}"); - _logger.LogInformation($"物料拉取-本地数据库-总条数:{erp_materials_list.Count}"); - return ResultList.ReSuccess(erp_materials_list); - } + } + else + return ResultList.ReSuccess(materials); } else - { - return ResultList.ReSuccess(materials); - } + return await this.BillQueryForMaterialPagedList(); } catch (Exception ex) { @@ -1008,10 +996,10 @@ namespace WMS.Web.Domain.Services.Public _logger.LogInformation($"物料拉取-总条数:{erp_materials_list.Count}"); return ResultList.ReSuccess(erp_materials_list); } - catch (Exception) + catch (Exception ex) { - _logger.LogInformation("物料拉取->错误的Json:" + error_josn); - return null; + _logger.LogInformation("物料拉取->失败:" + ex); + return ResultList.ReFailure(ResultCodes.ErpSynsError); } diff --git a/src/WMS.Web.Domain/Services/Public/MaterialService.cs b/src/WMS.Web.Domain/Services/Public/MaterialService.cs new file mode 100644 index 00000000..af90b433 --- /dev/null +++ b/src/WMS.Web.Domain/Services/Public/MaterialService.cs @@ -0,0 +1,78 @@ +using AutoMapper; +using Microsoft.Extensions.Logging; +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.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 MaterialService: IMaterialService + { + private IMapper _mapper; + private ILogger _logger; + private IErpService _erpService; + private IMaterialsRepositories _materialsRepositories; + public MaterialService(IMapper mapper, ILogger logger, IErpService erpService, IMaterialsRepositories materialsRepositories) + { + _mapper = mapper; + _logger = logger; + _erpService = erpService; + _materialsRepositories = materialsRepositories; + } + + /// + /// 同步金蝶新的物料 + /// + /// + public async Task SyncNewMaterials() + { + try + { + _logger.LogInformation("同步金蝶新物料:开始->" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); + //1.获取全部物料编码 + var materialNumbers = await _materialsRepositories.GetAllNumbers(); + //1.1通过hash处理 + var materialNumberSet = new HashSet(materialNumbers); + + //2.获取金蝶物料:不取缓存的 + var mats_result = await _erpService.BillQueryForMaterial(false); + var mats = new List(); + if (mats_result.IsSuccess) + mats = mats_result.Data.ToList(); + + //3.通过hash,更快的时间内判断元素是否存在于集合中,提高性能(10W数据十几毫秒级别) + var entitys = mats + .Where(item => !materialNumberSet.Contains(item.MaterialNumber)) + .Select(item => _mapper.Map(item)) + .ToList(); + + //4.添加数据库 + if (entitys.Count != 0) + { + var isSuccess = await _materialsRepositories.AddRange(entitys); + if (!isSuccess) + return Result.ReFailure(ResultCodes.DateWriteError); + } + _logger.LogInformation("同步金蝶新物料:结束->" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")+"->添加数量:"+entitys.Count); + return Result.ReSuccess(); + } + catch (Exception ex) + { + _logger.LogInformation("同步金蝶新物料:失败->" + ex.Message); + return Result.ReFailure(ex.Message,ex.HResult); + } + } + } +} diff --git a/src/WMS.Web.Repositories/DependencyInjection/AppBuilder.cs b/src/WMS.Web.Repositories/DependencyInjection/AppBuilder.cs index a0366a6c..a208820a 100644 --- a/src/WMS.Web.Repositories/DependencyInjection/AppBuilder.cs +++ b/src/WMS.Web.Repositories/DependencyInjection/AppBuilder.cs @@ -317,6 +317,7 @@ namespace WMS.Web.Repositories.DependencyInjection Services.AddTransient(); Services.AddTransient(); Services.AddTransient(); + Services.AddTransient(); } diff --git a/src/WMS.Web.Repositories/MaterialsRepositories.cs b/src/WMS.Web.Repositories/MaterialsRepositories.cs index 13edd766..03135e1e 100644 --- a/src/WMS.Web.Repositories/MaterialsRepositories.cs +++ b/src/WMS.Web.Repositories/MaterialsRepositories.cs @@ -95,17 +95,6 @@ namespace WMS.Web.Repositories return res.Clone(); } - public Materials GetNew(int mid) - { - var query = _context.Materials.Where(x => 1 == 1); - - query = query.Where(x => x.MaterialId == mid); - - var res = query.FirstOrDefault(); - - return res.Clone(); - } - /// /// 获取 /// @@ -119,5 +108,15 @@ namespace WMS.Web.Repositories return res.Clone(); } + + /// + /// 获取全部的物料编码 + /// + /// + public async Task> GetAllNumbers() + { + var numbers = await _context.Materials.Select(x => x.MaterialNumber).ToListAsync(); + return numbers.Clone().Distinct().ToList(); + } } }