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