同步新物料接口

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

@@ -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);
}
}
}
}