diff --git a/.vs/WMS.Web/DesignTimeBuild/.dtbcache.v2 b/.vs/WMS.Web/DesignTimeBuild/.dtbcache.v2 index e17b9d89..e0f50ede 100644 Binary files a/.vs/WMS.Web/DesignTimeBuild/.dtbcache.v2 and b/.vs/WMS.Web/DesignTimeBuild/.dtbcache.v2 differ 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; + } } }