From 488c5dbe1e5db80ef99cd4faa768d55aab0b3ee8 Mon Sep 17 00:00:00 2001 From: 18942506660 <18942506660@A18942506660> Date: Wed, 20 Nov 2024 10:32:52 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=90=8C=E6=AD=A5=E7=89=A9?= =?UTF-8?q?=E6=96=99=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vs/WMS.Web/DesignTimeBuild/.dtbcache.v2 | Bin 277406 -> 277406 bytes .../Controllers/MaterialController.cs | 122 ++++++++++++++++++ src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml | 8 ++ .../IService/Public/IErpService.cs | 2 +- .../Infrastructure/IMaterialsRepositories.cs | 1 + .../Services/Public/ErpService.cs | 82 ++++++++++++ .../AuthorizationTokenSecurityPolicy.cs | 2 +- .../MaterialsRepositories.cs | 5 + 8 files changed, 220 insertions(+), 2 deletions(-) create mode 100644 src/WMS.Web.Api/Controllers/MaterialController.cs diff --git a/.vs/WMS.Web/DesignTimeBuild/.dtbcache.v2 b/.vs/WMS.Web/DesignTimeBuild/.dtbcache.v2 index e17b9d896f78b1bcf463629b1ee2acb43be640ff..e0f50eded0be3c9cb2a141ab7974d42926e4da5c 100644 GIT binary patch delta 27174 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 boe*PcF1NDEga1cq{`^bJesMzl@v{F1oTo33 diff --git a/src/WMS.Web.Api/Controllers/MaterialController.cs b/src/WMS.Web.Api/Controllers/MaterialController.cs new file mode 100644 index 00000000..018cb6fe --- /dev/null +++ b/src/WMS.Web.Api/Controllers/MaterialController.cs @@ -0,0 +1,122 @@ +using AutoMapper; +using WMS.Web.Core.Dto.Erp; +using WMS.Web.Core.Help; +using WMS.Web.Core.Internal.Results; +using WMS.Web.Domain.Entitys; +using WMS.Web.Domain.Infrastructure; +using WMS.Web.Domain.IService.Public; +using WMS.Web.Domain.Options; +using WMS.Web.Domain.Services; +using WMS.Web.Domain.Services.Public; +using WMS.Web.Domain.Values; +using WMS.Web.Repositories; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Caching.Memory; +using Microsoft.Extensions.Options; +using Newtonsoft.Json; +using Microsoft.Extensions.Logging; +using System.Threading.Tasks; +using System.Collections.Generic; +using System.Linq; + +namespace WMS.Web.Api.Controllers +{ + /// + /// 物料 + /// + [Route("api/[controller]")] + [ApiController] + public class MaterialController : ControllerBase + { + private IMapper _mapper; + private ILogger _logger; + private IErpService _erpService; + private IMaterialsRepositories _materialsRepositories; + private ErpOptions _erpOptions; + private readonly IMemoryCache _memoryCache; + public MaterialController(IMapper mapper, ILogger logger, IErpService erpService, + IMaterialsRepositories materialsRepositories, IOptions erpOptions, IMemoryCache memoryCache) + { + _mapper = mapper; + _logger = logger; + _erpService = erpService; + _materialsRepositories = materialsRepositories; + this._erpOptions = erpOptions.Value; + this._memoryCache = memoryCache; + } + + /// + /// 刷新物料 69条码或物料编码 名字 + /// + /// 物料编码 + /// 69 条码,other 名字和规格型号 + /// + [HttpGet] + [Route("Refresh/{number}/{type}")] + public async Task Refresh([FromRoute] string number, [FromRoute] string type) + { + if (string.IsNullOrEmpty(number)) + return Result.ReFailure("物料编码不能为空", 556677); + if (string.IsNullOrEmpty(type) || (!type.Equals("69") && !type.Equals("other"))) + return Result.ReFailure("类型只能是69或other", 556677); + + List numbers = new List(); + numbers.Add(number); + + var list = await _materialsRepositories.GetEntityList(numbers); + if (list.Count() <= 0) return Result.ReFailure(ResultCodes.MateriaNoData); + + var mDtos = await _erpService.BillQueryForMaterialByNumbers(numbers); + if (!mDtos.IsSuccess) return Result.ReFailure(mDtos.Message, mDtos.Status); + if (mDtos.Data.Count() <= 0) return Result.ReFailure(ResultCodes.MateriaNoData); + + var materials = _memoryCache.Get>(_erpOptions.cache_materail_key); + + List update_list = new List(); + foreach (var m in mDtos.Data) + { + var entity = list.FirstOrDefault(f => f.MaterialNumber.Equals(m.MaterialNumber)); + if (entity == null) continue; + if (type.Equals("69")) + { + entity.BarCode = m.BarCode.Trim(); + update_list.Add(entity); + } + //if (type.Equals("id")) + //{ + // entity.IdConvertBar = m.IdConvertBar.Trim(); + // update_list.Add(entity); + //} + if (type.Equals("other")) + { + entity.MaterialName = m.MaterialName; + entity.Specifications = m.Specifications; + update_list.Add(entity); + } + + //修改缓存 + if (materials == null) continue; + var entity_cache = materials.FirstOrDefault(f => f.MaterialNumber.Equals(m.MaterialNumber)); + if (entity_cache == null) continue; + if (type.Equals("69")) + entity_cache.BarCode = m.BarCode.Trim(); + //if (type.Equals("id")) + // entity_cache.IdConvertBar = m.IdConvertBar.Trim(); + if (type.Equals("other")) + { + entity_cache.MaterialName = m.MaterialName; + entity_cache.Specifications = m.Specifications; + } + + } + //修改缓存 + if (materials != null && materials.Count() > 0) + { + _memoryCache.Set(_erpOptions.cache_materail_key, materials, new MemoryCacheEntryOptions().SetAbsoluteExpiration(TimeSpan.FromMinutes(DateTimeUtil.GetTotalMinutesTimeSpan()))); + } + await _materialsRepositories.UpdateRange(update_list); + return Result.ReSuccess(); + } + } +} diff --git a/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml b/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml index f7fffd8c..4f9e603a 100644 --- a/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml +++ b/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml @@ -6269,6 +6269,14 @@ + + + 获取物料id32进制 + + + + + erp:基础数据-物料-ids查询 diff --git a/src/WMS.Web.Domain/IService/Public/IErpService.cs b/src/WMS.Web.Domain/IService/Public/IErpService.cs index 5d7510c5..b52997c7 100644 --- a/src/WMS.Web.Domain/IService/Public/IErpService.cs +++ b/src/WMS.Web.Domain/IService/Public/IErpService.cs @@ -134,7 +134,7 @@ namespace WMS.Web.Domain.IService.Public /// /// Task> BillQueryForMaterial(string number); - + Task> BillQueryForMaterialByNumbers(List materialNumbers); /// /// /// diff --git a/src/WMS.Web.Domain/Infrastructure/IMaterialsRepositories.cs b/src/WMS.Web.Domain/Infrastructure/IMaterialsRepositories.cs index 467e073c..4c36ea8d 100644 --- a/src/WMS.Web.Domain/Infrastructure/IMaterialsRepositories.cs +++ b/src/WMS.Web.Domain/Infrastructure/IMaterialsRepositories.cs @@ -61,5 +61,6 @@ namespace WMS.Web.Domain.Infrastructure /// /// Task UpdateRange(List entitys, bool isTransaction = true); + Task> GetEntityList(List materNumbers); } } diff --git a/src/WMS.Web.Domain/Services/Public/ErpService.cs b/src/WMS.Web.Domain/Services/Public/ErpService.cs index 59516961..afb41c06 100644 --- a/src/WMS.Web.Domain/Services/Public/ErpService.cs +++ b/src/WMS.Web.Domain/Services/Public/ErpService.cs @@ -1034,7 +1034,89 @@ namespace WMS.Web.Domain.Services.Public } + /// + /// 获取物料id32进制 + /// + /// + /// + /// + public async Task> BillQueryForMaterialByNumbers(List materialNumbers) + { + //2.先登录金蝶-拿到token + var token_result = await this.Init(); + if (!token_result.IsSuccess) + return ResultList.ReFailure(token_result); + + //3.获取金蝶物料:拼接参数和条件 + var query = new ErpBillQueryDto(token_result.Data); + var param = new ErpBillQueryParamDto(FormIdParam.BD_MATERIAL.ToString()); + param.FieldKeys = "FMATERIALID,FName,FNumber,FSpecification,FBaseUnitId,FBaseUnitId.FName,FBaseUnitId.FNumber,FBARCODE,FUseOrgId,FUseOrgId.FNumber,FIsBatchManage,FProductIDS"; + param.Limit = 10000; + + //查询条件:备注其中的条件值以金蝶的值为准!!! + //1.审核状态:已审核 + //2.禁用状态:A否,B是 + //3.使用组织:只查询“深圳市元创时代科技有限公司”这个组织;组织ID=100008--固定值查询(测试端和正式是一样的) + //param.FilterString = "FDocumentStatus='C' and FForbidStatus='A' and (FUseOrgId=19162897 or FUseOrgId=100008)"; + + + param.OrderString = "FCreateDate ASC"; + + //4.循环拿金蝶数据 + var erp_materials_list = new List(); + var error_josn = ""; + decimal d_count = Convert.ToDecimal(materialNumbers.Count()) / Convert.ToDecimal(100); + int count = (int)Math.Ceiling(d_count); + try + { + for (int i = 1; i <= count; i++) + { + param.FilterString = "FDocumentStatus='C' and FForbidStatus='A' and FUseOrgId=100008"; + + var list = materialNumbers.Skip((i - 1) * 100).Take(100); + string numbers = JsonConvert.SerializeObject(list); + numbers = numbers.Replace("[", "").Replace("]", "").Replace("\"", "'"); + param.FilterString += $" and FNumber in ({numbers}) and (FProductIDS<>'' or FProductIDS<>' ')"; + + + //4.2.参数json化 + query.Data = JsonConvert.SerializeObject(param); + var json = JsonConvert.SerializeObject(query); + + //4.3.请求查询接口并返回数据 + var result_json = await _client.ExecuteBillQueryAsync(json); + error_josn = result_json; + var result = JsonConvert.DeserializeObject>>(result_json); + //4.4.判断数据是否全部拉取完成:并停止循环的条件 + if (result == null || result.Count == 0) + break; + //4.5.拼装 + foreach (var item in result) + { + var lis = new ErpMaterialDto(); + lis.MaterialId = Convert.ToInt32(item[0]); + lis.MaterialName = item[1]; + lis.MaterialNumber = item[2]; + lis.Specifications = item[3]; + lis.BaseUnitId = Convert.ToInt32(item[4]); + lis.BaseUnitName = item[5]; + lis.BaseUnitNumber = item[6]; + lis.BarCode = item[7]; + lis.OrgId = Convert.ToInt32(item[8]); + lis.OrgCode = item[9]; + lis.IsBatchManage = Convert.ToBoolean(item[10]); + erp_materials_list.Add(lis); + } + } + return ResultList.ReSuccess(erp_materials_list); + } + catch (Exception ex) + { + _logger.LogInformation("物料拉取->失败:" + ex.Message + " " + error_josn); + return ResultList.ReFailure(ResultCodes.ErpSynsError); + } + } /// /// erp:基础数据-物料-ids查询 /// diff --git a/src/WMS.Web.Repositories/DependencyInjection/AuthorizationTokenSecurityPolicy.cs b/src/WMS.Web.Repositories/DependencyInjection/AuthorizationTokenSecurityPolicy.cs index e387b15d..7d70d264 100644 --- a/src/WMS.Web.Repositories/DependencyInjection/AuthorizationTokenSecurityPolicy.cs +++ b/src/WMS.Web.Repositories/DependencyInjection/AuthorizationTokenSecurityPolicy.cs @@ -49,7 +49,7 @@ namespace WMS.Web.Repositories.DependencyInjection string[] pathlist = path.Split('/'); bool isLogin = pathlist.Where(x => x == "login" || x.ToLower() == "heart" || x.ToLower() == "test" || x.ToLower() == "serialnumber" || x.ToLower() == "barcode" || - x.ToLower() == "swagger" || x.ToLower() == "productinventory").Any(); + x.ToLower() == "swagger" || x.ToLower() == "productinventory" || x.ToLower() == "material").Any(); if (isLogin) { context.Response.StatusCode = 200; diff --git a/src/WMS.Web.Repositories/MaterialsRepositories.cs b/src/WMS.Web.Repositories/MaterialsRepositories.cs index adb15c74..d6114797 100644 --- a/src/WMS.Web.Repositories/MaterialsRepositories.cs +++ b/src/WMS.Web.Repositories/MaterialsRepositories.cs @@ -160,5 +160,10 @@ namespace WMS.Web.Repositories return true; } } + public async Task> GetEntityList(List materNumbers) + { + var entitys = await _context.Materials.Where(x => materNumbers.Contains(x.MaterialNumber)).ToListAsync(); + return entitys; + } } }