同步新物料接口

This commit is contained in:
tongfei
2024-04-02 15:00:27 +08:00
parent 22404e9e3f
commit 6e97bdc559
10 changed files with 198 additions and 54 deletions

View File

@@ -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<AppOptions> 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<Result> SyscMats()
{
return await _materialService.SyncNewMaterials();
}
}
}

View File

@@ -3088,6 +3088,12 @@
<param name="orgId"></param>
<returns></returns>
</member>
<member name="M:WMS.Web.Domain.Infrastructure.IMaterialsRepositories.GetAllNumbers">
<summary>
</summary>
<returns></returns>
</member>
<member name="M:WMS.Web.Domain.Infrastructure.IMoveBoxRecordRepositories.AddRange(System.Collections.Generic.List{WMS.Web.Domain.Entitys.MoveBoxRecord},System.Boolean)">
批量添加
</member>
@@ -3876,7 +3882,7 @@
<param name="id"></param>
<returns></returns>
</member>
<member name="M:WMS.Web.Domain.IService.Public.IErpService.BillQueryForMaterial">
<member name="M:WMS.Web.Domain.IService.Public.IErpService.BillQueryForMaterial(System.Boolean)">
<summary>
erp:单据查询-物料集合
</summary>
@@ -4174,6 +4180,17 @@
<param name="customerStockCode"></param>
<returns></returns>
</member>
<member name="T:WMS.Web.Domain.IService.IMaterialService">
<summary>
物料服务接口
</summary>
</member>
<member name="M:WMS.Web.Domain.IService.IMaterialService.SyncNewMaterials">
<summary>
同步金蝶新物料
</summary>
<returns></returns>
</member>
<member name="T:WMS.Web.Domain.IService.ISendMessageService">
<summary>
发送消息服务
@@ -5519,7 +5536,7 @@
<param name="sourceBillNos"></param>
<returns></returns>
</member>
<member name="M:WMS.Web.Domain.Services.Public.ErpService.BillQueryForMaterial">
<member name="M:WMS.Web.Domain.Services.Public.ErpService.BillQueryForMaterial(System.Boolean)">
<summary>
erp:单据查询-物料集合
</summary>
@@ -6014,6 +6031,17 @@
<param name="customerStockCode"></param>
<returns></returns>
</member>
<member name="T:WMS.Web.Domain.Services.MaterialService">
<summary>
物料服务
</summary>
</member>
<member name="M:WMS.Web.Domain.Services.MaterialService.SyncNewMaterials">
<summary>
同步金蝶新的物料
</summary>
<returns></returns>
</member>
<member name="T:WMS.Web.Domain.Services.SendMessageService">
<summary>
阿里云短息服务

View File

@@ -113,7 +113,7 @@ namespace WMS.Web.Domain.IService.Public
/// erp:单据查询-物料集合
/// </summary>
/// <returns></returns>
Task<ResultList<ErpMaterialDto>> BillQueryForMaterial();
Task<ResultList<ErpMaterialDto>> BillQueryForMaterial(bool isCache = true);
/// <summary>
/// erp:基础数据-物料信息

View File

@@ -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
{
/// <summary>
/// 物料服务接口
/// </summary>
public interface IMaterialService
{
/// <summary>
/// 同步金蝶新物料
/// </summary>
/// <returns></returns>
Task<Result> SyncNewMaterials();
}
}

View File

@@ -32,8 +32,6 @@ namespace WMS.Web.Domain.Infrastructure
/// <returns></returns>
Task<Materials> Get(int mid);
Materials GetNew(int mid);
/// <summary>
/// 物料
/// </summary>
@@ -41,5 +39,11 @@ namespace WMS.Web.Domain.Infrastructure
/// <param name="orgId"></param>
/// <returns></returns>
Task<Materials> Get(string code, int orgId);
/// <summary>
///
/// </summary>
/// <returns></returns>
Task<List<string>> GetAllNumbers();
}
}

View File

@@ -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<ErpMaterialDto, Materials>().ReverseMap();
}
}
}

View File

@@ -817,50 +817,38 @@ namespace WMS.Web.Domain.Services.Public
/// erp:单据查询-物料集合
/// </summary>
/// <returns></returns>
public async Task<ResultList<ErpMaterialDto>> BillQueryForMaterial()
public async Task<ResultList<ErpMaterialDto>> BillQueryForMaterial(bool isCache = true)
{
try
{
//1.获取缓存中的物料数据;
var materials = _memoryCache.Get<List<ErpMaterialDto>>(_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<List<ErpMaterialDto>>(_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<ErpMaterialDto>();
//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<ErpMaterialDto>(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<ErpMaterialDto>.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<ErpMaterialDto>.ReSuccess(erp_materials_list);
}
}
else
return ResultList<ErpMaterialDto>.ReSuccess(materials);
}
else
{
return ResultList<ErpMaterialDto>.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<ErpMaterialDto>.ReSuccess(erp_materials_list);
}
catch (Exception)
catch (Exception ex)
{
_logger.LogInformation("物料拉取->错误的Json" + error_josn);
return null;
_logger.LogInformation("物料拉取->失败" + ex);
return ResultList<ErpMaterialDto>.ReFailure(ResultCodes.ErpSynsError);
}

View File

@@ -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
{
/// <summary>
/// 物料服务
/// </summary>
public class MaterialService: IMaterialService
{
private IMapper _mapper;
private ILogger<MaterialService> _logger;
private IErpService _erpService;
private IMaterialsRepositories _materialsRepositories;
public MaterialService(IMapper mapper, ILogger<MaterialService> logger, IErpService erpService, IMaterialsRepositories materialsRepositories)
{
_mapper = mapper;
_logger = logger;
_erpService = erpService;
_materialsRepositories = materialsRepositories;
}
/// <summary>
/// 同步金蝶新的物料
/// </summary>
/// <returns></returns>
public async Task<Result> 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<string>(materialNumbers);
//2.获取金蝶物料:不取缓存的
var mats_result = await _erpService.BillQueryForMaterial(false);
var mats = new List<ErpMaterialDto>();
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<Materials>(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);
}
}
}
}

View File

@@ -317,6 +317,7 @@ namespace WMS.Web.Repositories.DependencyInjection
Services.AddTransient<IInStockTaskBoxService, InStockTaskBoxService>();
Services.AddTransient<IBoxMarkService, BoxMarkService>();
Services.AddTransient<ISendMessageService, SendMessageService>();
Services.AddTransient<IMaterialService, MaterialService>();
}

View File

@@ -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();
}
/// <summary>
/// 获取
/// </summary>
@@ -119,5 +108,15 @@ namespace WMS.Web.Repositories
return res.Clone();
}
/// <summary>
/// 获取全部的物料编码
/// </summary>
/// <returns></returns>
public async Task<List<string>> GetAllNumbers()
{
var numbers = await _context.Materials.Select(x => x.MaterialNumber).ToListAsync();
return numbers.Clone().Distinct().ToList();
}
}
}