同步新物料接口

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 ILoginService _loginService;
private readonly AppOptions _options; private readonly AppOptions _options;
private readonly ISendMessageService _sendMessageService; private readonly ISendMessageService _sendMessageService;
private readonly IMaterialService _materialService;
public TestController(IErpService erpService, IInStockTaskService inStockTaskService, IBoxInventoryRepositories boxInventoryRepositories, public TestController(IErpService erpService, IInStockTaskService inStockTaskService, IBoxInventoryRepositories boxInventoryRepositories,
IBasicsRepositories transactionRepositories, IOpsService opsService, IBoxService boxService, IBasicsRepositories basicsRepositories, IBasicsRepositories transactionRepositories, IOpsService opsService, IBoxService boxService, IBasicsRepositories basicsRepositories,
IOutStockTaskRepositories outStockTaskRepositories, IOutStockTaskService outStockTaskService, IOptions<AppOptions> options, ILoginService loginService, ISendMessageService sendMessageService, IOutStockTaskRepositories outStockTaskRepositories, IOutStockTaskService outStockTaskService, IOptions<AppOptions> options, ILoginService loginService, ISendMessageService sendMessageService,
ITakeStockService takeStockService, ITakeStockRepositories takeStockRepositories, IOutStockService outStockService, IInStockTaskRepositories inStockTaskRepositories, ITakeStockService takeStockService, ITakeStockRepositories takeStockRepositories, IOutStockService outStockService, IInStockTaskRepositories inStockTaskRepositories,
IWebHostEnvironment env) IWebHostEnvironment env, IMaterialService materialService)
{ {
_materialService = materialService;
_loginService = loginService; _loginService = loginService;
_sendMessageService = sendMessageService; _sendMessageService = sendMessageService;
_inStockTaskRepositories = inStockTaskRepositories; _inStockTaskRepositories = inStockTaskRepositories;
@@ -341,5 +343,12 @@ namespace WMS.Web.Api.Controllers
{ {
return await _sendMessageService.Execute(); 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> <param name="orgId"></param>
<returns></returns> <returns></returns>
</member> </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 name="M:WMS.Web.Domain.Infrastructure.IMoveBoxRecordRepositories.AddRange(System.Collections.Generic.List{WMS.Web.Domain.Entitys.MoveBoxRecord},System.Boolean)">
批量添加 批量添加
</member> </member>
@@ -3876,7 +3882,7 @@
<param name="id"></param> <param name="id"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:WMS.Web.Domain.IService.Public.IErpService.BillQueryForMaterial"> <member name="M:WMS.Web.Domain.IService.Public.IErpService.BillQueryForMaterial(System.Boolean)">
<summary> <summary>
erp:单据查询-物料集合 erp:单据查询-物料集合
</summary> </summary>
@@ -4174,6 +4180,17 @@
<param name="customerStockCode"></param> <param name="customerStockCode"></param>
<returns></returns> <returns></returns>
</member> </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"> <member name="T:WMS.Web.Domain.IService.ISendMessageService">
<summary> <summary>
发送消息服务 发送消息服务
@@ -5519,7 +5536,7 @@
<param name="sourceBillNos"></param> <param name="sourceBillNos"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:WMS.Web.Domain.Services.Public.ErpService.BillQueryForMaterial"> <member name="M:WMS.Web.Domain.Services.Public.ErpService.BillQueryForMaterial(System.Boolean)">
<summary> <summary>
erp:单据查询-物料集合 erp:单据查询-物料集合
</summary> </summary>
@@ -6014,6 +6031,17 @@
<param name="customerStockCode"></param> <param name="customerStockCode"></param>
<returns></returns> <returns></returns>
</member> </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"> <member name="T:WMS.Web.Domain.Services.SendMessageService">
<summary> <summary>
阿里云短息服务 阿里云短息服务

View File

@@ -113,7 +113,7 @@ namespace WMS.Web.Domain.IService.Public
/// erp:单据查询-物料集合 /// erp:单据查询-物料集合
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
Task<ResultList<ErpMaterialDto>> BillQueryForMaterial(); Task<ResultList<ErpMaterialDto>> BillQueryForMaterial(bool isCache = true);
/// <summary> /// <summary>
/// erp:基础数据-物料信息 /// 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> /// <returns></returns>
Task<Materials> Get(int mid); Task<Materials> Get(int mid);
Materials GetNew(int mid);
/// <summary> /// <summary>
/// 物料 /// 物料
/// </summary> /// </summary>
@@ -41,5 +39,11 @@ namespace WMS.Web.Domain.Infrastructure
/// <param name="orgId"></param> /// <param name="orgId"></param>
/// <returns></returns> /// <returns></returns>
Task<Materials> Get(string code, int orgId); 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:单据查询-物料集合 /// erp:单据查询-物料集合
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
public async Task<ResultList<ErpMaterialDto>> BillQueryForMaterial() public async Task<ResultList<ErpMaterialDto>> BillQueryForMaterial(bool isCache = true)
{ {
try try
{ {
//1.获取缓存中的物料数据; if (isCache)
var materials = _memoryCache.Get<List<ErpMaterialDto>>(_erpOptions.cache_materail_key);
if (materials == null || materials.Count == 0)
{ {
var mats = await _materialsRepositories.GetEntityList(); //1.获取缓存中的物料数据;
if (mats == null || mats.Count == 0) var materials = _memoryCache.Get<List<ErpMaterialDto>>(_erpOptions.cache_materail_key);
return await this.BillQueryForMaterialPagedList(); if (materials == null || materials.Count == 0)
else
{ {
var beginTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); var mats = await _materialsRepositories.GetEntityList();
_logger.LogInformation($"物料拉取-开始时间:{beginTime}"); if (mats == null || mats.Count == 0)
var erp_materials_list = new List<ErpMaterialDto>(); return await this.BillQueryForMaterialPagedList();
//4.5.拼装 else
foreach (var item in mats)
{ {
var lis = new ErpMaterialDto(); var beginTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff");
lis.MaterialId = item.MaterialId; _logger.LogInformation($"物料拉取-开始时间:{beginTime}");
lis.MaterialName = item.MaterialName; //组装dto
lis.MaterialNumber = item.MaterialNumber; var erp_materials_list = mats.Select(x => _mapper.Map<ErpMaterialDto>(x)).ToList();
lis.Specifications = item.Specifications; _memoryCache.Set(_erpOptions.cache_materail_key, erp_materials_list, new MemoryCacheEntryOptions().SetAbsoluteExpiration(TimeSpan.FromMinutes(DateTimeUtil.GetTotalMinutesTimeSpan())));
lis.BaseUnitId = item.BaseUnitId; var endTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff");
lis.BaseUnitName = item.BaseUnitName; _logger.LogInformation($"物料拉取-结束时间:{endTime}");
lis.BaseUnitNumber = item.BaseUnitNumber; _logger.LogInformation($"物料拉取-本地数据库-总条数:{erp_materials_list.Count}");
lis.BarCode = item.BarCode; return ResultList<ErpMaterialDto>.ReSuccess(erp_materials_list);
lis.OrgId = item.OrgId;
lis.OrgCode = item.OrgCode;
erp_materials_list.Add(lis);
} }
_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 else
{ return await this.BillQueryForMaterialPagedList();
return ResultList<ErpMaterialDto>.ReSuccess(materials);
}
} }
catch (Exception ex) catch (Exception ex)
{ {
@@ -1008,10 +996,10 @@ namespace WMS.Web.Domain.Services.Public
_logger.LogInformation($"物料拉取-总条数:{erp_materials_list.Count}"); _logger.LogInformation($"物料拉取-总条数:{erp_materials_list.Count}");
return ResultList<ErpMaterialDto>.ReSuccess(erp_materials_list); return ResultList<ErpMaterialDto>.ReSuccess(erp_materials_list);
} }
catch (Exception) catch (Exception ex)
{ {
_logger.LogInformation("物料拉取->错误的Json" + error_josn); _logger.LogInformation("物料拉取->失败" + ex);
return null; 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<IInStockTaskBoxService, InStockTaskBoxService>();
Services.AddTransient<IBoxMarkService, BoxMarkService>(); Services.AddTransient<IBoxMarkService, BoxMarkService>();
Services.AddTransient<ISendMessageService, SendMessageService>(); Services.AddTransient<ISendMessageService, SendMessageService>();
Services.AddTransient<IMaterialService, MaterialService>();
} }

View File

@@ -95,17 +95,6 @@ namespace WMS.Web.Repositories
return res.Clone(); 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>
/// 获取 /// 获取
/// </summary> /// </summary>
@@ -119,5 +108,15 @@ namespace WMS.Web.Repositories
return res.Clone(); 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();
}
} }
} }