diff --git a/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml b/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml index 5a6bad72..bc5074b3 100644 --- a/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml +++ b/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml @@ -1510,6 +1510,34 @@ 盘点单服务 + + + erp基础数据:扩展服务接口 + + + + + 获取物料名称 + + + + + + + 获取物料编码 + + + + + + + + 获取物料规格型号 + + + + + erp:单据查询-采购入库单 @@ -2281,6 +2309,35 @@ + + + erp基础数据:扩展服务 + + + + + 获取物料名称 + + + + + + + + 获取物料编码 + + + + + + + + 获取物料规格型号 + + + + + erp数据交互服务 diff --git a/src/WMS.Web.Domain/IService/Public/IErpBasicDataExtendService.cs b/src/WMS.Web.Domain/IService/Public/IErpBasicDataExtendService.cs new file mode 100644 index 00000000..33b488b3 --- /dev/null +++ b/src/WMS.Web.Domain/IService/Public/IErpBasicDataExtendService.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Text; +using WMS.Web.Core.Dto.Erp; + +namespace WMS.Web.Domain.IService.Public +{ + /// + /// erp基础数据:扩展服务接口 + /// + public interface IErpBasicDataExtendService + { + /// + /// 获取物料名称 + /// + /// + /// + string GetMaterialName(List erpMaterials, int materialId); + + /// + /// 获取物料编码 + /// + /// + /// + /// + string GetMaterialNumber(List erpMaterials, int materialId); + + /// + /// 获取物料规格型号 + /// + /// + /// + /// + string GetMaterialSpecifications(List erpMaterials, int materialId); + } +} diff --git a/src/WMS.Web.Domain/Services/InStockService.cs b/src/WMS.Web.Domain/Services/InStockService.cs index cf203d77..98dc27e5 100644 --- a/src/WMS.Web.Domain/Services/InStockService.cs +++ b/src/WMS.Web.Domain/Services/InStockService.cs @@ -6,6 +6,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using WMS.Web.Core.Dto; +using WMS.Web.Core.Dto.Erp; using WMS.Web.Core.Dto.InStock; using WMS.Web.Core.Dto.InStockTask; using WMS.Web.Core.Dto.Login; @@ -25,21 +26,25 @@ namespace WMS.Web.Domain.Services public class InStockService : IInStockService { private readonly IMapper _mapper; + private readonly IErpService _erpService; private readonly ILoginService _loginService; private readonly IBoxRepositories _boxRepositories; private readonly IBasicsRepositories _basicsRepositories; private readonly IInStockRepositories _inStockRepositories; private readonly IInStockTaskRepositories _inStockTaskRepositories; - public InStockService(IMapper mapper, ILoginService loginService, IBoxRepositories boxRepositories, - IBasicsRepositories basicsRepositories, + private readonly IErpBasicDataExtendService _erpBasicDataExtendService; + public InStockService(IMapper mapper, IErpService erpService, ILoginService loginService, IBoxRepositories boxRepositories, + IBasicsRepositories basicsRepositories, IErpBasicDataExtendService erpBasicDataExtendService, IInStockRepositories inStockRepositories, IInStockTaskRepositories inStockTaskRepositories) { _mapper = mapper; + _erpService = erpService; _loginService = loginService; _boxRepositories = boxRepositories; _basicsRepositories = basicsRepositories; _inStockRepositories = inStockRepositories; _inStockTaskRepositories = inStockTaskRepositories; + _erpBasicDataExtendService = erpBasicDataExtendService; } @@ -114,6 +119,12 @@ namespace WMS.Web.Domain.Services /// public async Task> GetInfoByBox(string boxBillNo) { + //1.获取物料集合 + var materials_result = await _erpService.BillQueryForMaterial(); + var materials = new List(); + if (materials_result.IsSuccess) + materials = materials_result.Data.ToList(); + //1.先判断:箱号已经绑定了入库任务单中;备注:业务说法就是箱是否收货了 var tast= await _inStockTaskRepositories.GetBy(boxBillNo); if (tast==null) @@ -134,6 +145,9 @@ namespace WMS.Web.Domain.Services continue; //3.2映射返回明细对象 var task_detail = _mapper.Map(item); + task_detail.MaterialName = _erpBasicDataExtendService.GetMaterialName(materials, task_detail.MaterialId); + task_detail.MaterialNumber = _erpBasicDataExtendService.GetMaterialNumber(materials, task_detail.MaterialId); + task_detail.Specifications = _erpBasicDataExtendService.GetMaterialSpecifications(materials, task_detail.MaterialId); result.Details.Add(task_detail); } return Result.ReSuccess(result); diff --git a/src/WMS.Web.Domain/Services/Public/ErpBasicDataExtendService.cs b/src/WMS.Web.Domain/Services/Public/ErpBasicDataExtendService.cs new file mode 100644 index 00000000..16b284e0 --- /dev/null +++ b/src/WMS.Web.Domain/Services/Public/ErpBasicDataExtendService.cs @@ -0,0 +1,66 @@ +using AutoMapper; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using WMS.Web.Core.Dto.Erp; +using WMS.Web.Domain.Infrastructure; +using WMS.Web.Domain.IService.Public; + +namespace WMS.Web.Domain.Services.Public +{ + /// + /// erp基础数据:扩展服务 + /// + public class ErpBasicDataExtendService: IErpBasicDataExtendService + { + private readonly IMapper _mapper; + private readonly ILoginService _loginService; + private readonly IBasicsRepositories _basicsRepositories; + + public ErpBasicDataExtendService(IMapper mapper, ILoginService loginService, + IBasicsRepositories basicsRepositories) + { + _mapper = mapper; + _loginService = loginService; + _basicsRepositories = basicsRepositories; + + } + + /// + /// 获取物料名称 + /// + /// + /// + /// + public string GetMaterialName(List erpMaterials,int materialId) + { + var mat= erpMaterials.Where(x => x.MaterialId == materialId).FirstOrDefault(); + return mat == null ? "" : mat.MaterialName; + } + + /// + /// 获取物料编码 + /// + /// + /// + /// + public string GetMaterialNumber(List erpMaterials, int materialId) + { + var mat = erpMaterials.Where(x => x.MaterialId == materialId).FirstOrDefault(); + return mat == null ? "" : mat.MaterialNumber; + } + + /// + /// 获取物料规格型号 + /// + /// + /// + /// + public string GetMaterialSpecifications(List erpMaterials, int materialId) + { + var mat = erpMaterials.Where(x => x.MaterialId == materialId).FirstOrDefault(); + return mat == null ? "" : mat.Specifications; + } + } +} diff --git a/src/WMS.Web.Domain/Services/Public/ErpService.cs b/src/WMS.Web.Domain/Services/Public/ErpService.cs index 47bf4091..de4f8972 100644 --- a/src/WMS.Web.Domain/Services/Public/ErpService.cs +++ b/src/WMS.Web.Domain/Services/Public/ErpService.cs @@ -38,7 +38,6 @@ namespace WMS.Web.Domain.Services.Public private ILogger _logger; private ERPGWSoapClient _client; private readonly IMemoryCache _memoryCache; - private readonly IInStockTaskRepositories _inStockTaskRepositories; private readonly ISingleDataService _singleDataService; private readonly ILoginRepositories _loginRepositories; private readonly IBasicsRepositories _basicsRepositories; @@ -48,7 +47,6 @@ namespace WMS.Web.Domain.Services.Public IOptions appOptions, ILogger logger, IMemoryCache memoryCache, - IInStockTaskRepositories inStockTaskRepositories, ISingleDataService singleDataService, ILoginRepositories loginRepositories, IBasicsRepositories basicsRepositories) { @@ -58,7 +56,6 @@ namespace WMS.Web.Domain.Services.Public this._mapper = mapper; this._logger = logger; this._memoryCache = memoryCache; - this._inStockTaskRepositories = inStockTaskRepositories; this._singleDataService = singleDataService; this._loginRepositories = loginRepositories; } @@ -181,53 +178,77 @@ namespace WMS.Web.Domain.Services.Public /// public async Task> BillQueryForMaterial() { - //1.先登录金蝶-拿到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,FForbidStatus,FUseOrgId"; - param.Limit = 10000; - Console.Write("请输入第几行:"); - var row=Console.ReadLine(); - param.StartRow = (Convert.ToInt32(row) * param.Limit); - - //查询条件:备注其中的条件值以金蝶的值为准!!! - //1.审核状态:已审核 - //2.禁用状态:A否,B是 - //3.使用组织:只查询“深圳市元创时代科技有限公司”这个组织;组织ID=100008--固定值查询(测试端和正式是一样的) - param.FilterString = "FDocumentStatus='C' and FForbidStatus='A' and FUseOrgId=100008"; - param.OrderString = "FCreateDate ASC"; - - query.Data = JsonConvert.SerializeObject(param); - var json = JsonConvert.SerializeObject(query); - - var beginTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); - _logger.LogInformation($"开始时间:{beginTime}"); - //4.请求查询接口 - var result_json = await _client.ExecuteBillQueryAsync(json); - var result = JsonConvert.DeserializeObject>>(result_json); - - var endTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); - _logger.LogInformation($"结束时间:{beginTime}"); - //5.返回数据的组装 - var erp_list = new List(); - foreach (var item in result) + //1.获取缓存中的物料数据; + var cache_key = "erp_materials_list"; + var materials = _memoryCache.Get>(cache_key); + if (materials == null || materials.Count == 0) { - var lis = new ErpMaterialDto(); - lis.MaterialId = Convert.ToInt32(item[0]); - lis.MaterialName = item[1]; - lis.MaterialNumber = item[2]; - lis.Specifications = item[3]; - lis.Status = item[4]; - lis.UseOrgId = item[5]; - erp_list.Add(lis); + + + //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,FForbidStatus,FUseOrgId"; + param.Limit = 10000; + //查询条件:备注其中的条件值以金蝶的值为准!!! + //1.审核状态:已审核 + //2.禁用状态:A否,B是 + //3.使用组织:只查询“深圳市元创时代科技有限公司”这个组织;组织ID=100008--固定值查询(测试端和正式是一样的) + param.FilterString = "FDocumentStatus='C' and FForbidStatus='A' and FUseOrgId=100008"; + param.OrderString = "FCreateDate ASC"; + + //4.循环拿金蝶数据 + bool isHave = true; + var erp_materials_list = new List(); + int skip = 0; + var beginTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); + _logger.LogInformation($"物料拉取-开始时间:{beginTime}"); + while (isHave) + { + //4.1.页码:页码按照金蝶的要求从0开始 + param.StartRow = (Convert.ToInt32(skip) * param.Limit); + //4.2.参数json化 + query.Data = JsonConvert.SerializeObject(param); + var json = JsonConvert.SerializeObject(query); + + //4.3.请求查询接口并返回数据 + var result_json = await _client.ExecuteBillQueryAsync(json); + var result = JsonConvert.DeserializeObject>>(result_json); + //4.4.判断数据是否全部拉取完成:并停止循环的条件 + if (result == null || result.Count == 0) + isHave = false; + //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.Status = item[4]; + lis.UseOrgId = item[5]; + erp_materials_list.Add(lis); + } + //4.6页面的叠加 + skip++; + } + var endTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); + _logger.LogInformation($"物料拉取-结束时间:{endTime}"); + //5.物料集合进行缓存 + _memoryCache.Set(cache_key, erp_materials_list, new MemoryCacheEntryOptions().SetAbsoluteExpiration(TimeSpan.FromHours(12))); + _logger.LogInformation($"物料拉取-总条数:{erp_materials_list.Count}"); + return ResultList.ReSuccess(erp_materials_list); } - _logger.LogInformation($"获取总条数:{erp_list.Count}"); - return ResultList.ReSuccess(erp_list); + else + { + return ResultList.ReSuccess(materials); + } + } /// diff --git a/src/WMS.Web.Repositories/DependencyInjection/AppBuilder.cs b/src/WMS.Web.Repositories/DependencyInjection/AppBuilder.cs index 3e16e9c1..10908300 100644 --- a/src/WMS.Web.Repositories/DependencyInjection/AppBuilder.cs +++ b/src/WMS.Web.Repositories/DependencyInjection/AppBuilder.cs @@ -234,8 +234,11 @@ namespace WMS.Web.Repositories.DependencyInjection Services.AddTransient(); Services.AddTransient(); Services.AddTransient(); + Services.AddTransient(); + + Services.AddTransient(); Services.AddTransient(); Services.AddTransient(); diff --git a/src/WMS.Web.Repositories/InStockRepositories.cs b/src/WMS.Web.Repositories/InStockRepositories.cs index c0f8c258..1dbdc1f4 100644 --- a/src/WMS.Web.Repositories/InStockRepositories.cs +++ b/src/WMS.Web.Repositories/InStockRepositories.cs @@ -27,19 +27,25 @@ namespace WMS.Web.Repositories private readonly ILoginRepositories _loginRepositories; private readonly RepositoryDbContext _context; private readonly ISingleDataService _singleDataService; + private readonly IErpService _erpService; + private readonly IErpBasicDataExtendService _erpBasicDataExtendService; public InStockRepositories(RepositoryDbContext context, IMapper mapper, + IErpService erpService, ILoginRepositories loginRepositories, IServiceProvider serviceProvider, - ISingleDataService singleDataService) + ISingleDataService singleDataService, + IErpBasicDataExtendService erpBasicDataExtendService) { _context = context; _mapper = mapper; + _erpService = erpService; _serviceProvider = serviceProvider; _loginRepositories = loginRepositories; _singleDataService = singleDataService; + _erpBasicDataExtendService = erpBasicDataExtendService; } /// @@ -49,6 +55,16 @@ namespace WMS.Web.Repositories /// public async Task> GetPagedList(InStockQueryRequest dto) { + //1.获取物料集合 + var materials_result = await _erpService.BillQueryForMaterial(); + if (!materials_result.IsSuccess) + return ResultPagedList.ReFailure(materials_result); + var materials = materials_result.Data.ToList(); + + //物料集合;模糊查询后的物料集合 + if (!string.IsNullOrEmpty(dto.MaterialNumber)) + materials = materials.Where(w => EF.Functions.Like(w.MaterialNumber, "%" + dto.MaterialNumber + "%")).ToList(); + var query=_context.InStockDetails .GroupJoin(_context.Instock, detail => detail.Fid, order => order.Id, (detail, orders) => new { detail, orders }) .SelectMany(x => x.orders.DefaultIfEmpty(), (p, order) => new { p.detail, order }) @@ -57,10 +73,14 @@ namespace WMS.Web.Repositories if (!string.IsNullOrEmpty(dto.SourceBillNo)) query = query.Where(w => EF.Functions.Like(w.detail.SourceBillNo, "%" + dto.SourceBillNo + "%")); - //if (!string.IsNullOrEmpty(dto.MaterialNumber)) - // query = query.Where(w => EF.Functions.Like(w.detail.BillNo, "%" + dto.BillNo + "%")); + //物料ID在模糊后的物料 + if (materials != null && materials.Count != 0 && !string.IsNullOrEmpty(dto.MaterialNumber)) + { + var mids = materials.Select(x => x.MaterialId).ToList(); + query = query.Where(w => mids.Contains(w.detail.MaterialId)); + } - if(dto.SupplierId.HasValue) + if (dto.SupplierId.HasValue) query = query.Where(w => w.detail.SupplierId == dto.SupplierId.Value); if (dto.OrgId.HasValue) @@ -90,10 +110,10 @@ namespace WMS.Web.Repositories SourceBillNo=s.detail.SourceBillNo, Supplier="", Org="", - MaterialName="", - MaterialNumber="", - Specifications="", - Stock= _singleDataService.GetSingleData(SingleAction.Stocks, _loginRepositories.CompanyId, s.detail.StockId), + MaterialName= _erpBasicDataExtendService.GetMaterialName(materials, s.detail.MaterialId), + MaterialNumber = _erpBasicDataExtendService.GetMaterialNumber(materials, s.detail.MaterialId), + Specifications = _erpBasicDataExtendService.GetMaterialSpecifications(materials, s.detail.MaterialId), + Stock = _singleDataService.GetSingleData(SingleAction.Stocks, _loginRepositories.CompanyId, s.detail.StockId), Qty =s.detail.Qty, Creator = _singleDataService.GetSingleData(SingleAction.Staffs, _loginRepositories.CompanyId, s.order.CreatorId), CreateTime =s.order.CreateTime, diff --git a/src/WMS.Web.Repositories/InStockTaskRepositories.cs b/src/WMS.Web.Repositories/InStockTaskRepositories.cs index 23c019f5..43b668fe 100644 --- a/src/WMS.Web.Repositories/InStockTaskRepositories.cs +++ b/src/WMS.Web.Repositories/InStockTaskRepositories.cs @@ -8,6 +8,7 @@ using System.Text; using System.Threading.Tasks; using WMS.Web.Core; using WMS.Web.Core.Dto; +using WMS.Web.Core.Dto.Erp; using WMS.Web.Core.Dto.InStockTask; using WMS.Web.Core.Help; using WMS.Web.Core.Internal.Results; @@ -31,19 +32,25 @@ namespace WMS.Web.Repositories private readonly RepositoryDbContext _context; private readonly ISingleDataService _singleDataService; private readonly ILoginRepositories _loginRepositories; + private readonly IErpService _erpService; + private readonly IErpBasicDataExtendService _erpBasicDataExtendService; public InStockTaskRepositories(RepositoryDbContext context, IMapper mapper, + IErpService erpService, IServiceProvider serviceProvider, ISingleDataService singleDataService, - ILoginRepositories loginRepositories) + ILoginRepositories loginRepositories, + IErpBasicDataExtendService erpBasicDataExtendService) { _context = context; _mapper = mapper; + _erpService = erpService; _serviceProvider = serviceProvider; _singleDataService = singleDataService; _loginRepositories = loginRepositories; + _erpBasicDataExtendService = erpBasicDataExtendService; } /// @@ -53,16 +60,31 @@ namespace WMS.Web.Repositories /// public async Task> GetPagedList(InStockTaskQueryRequest dto) { + //1.获取物料集合 + var materials_result = await _erpService.BillQueryForMaterial(); + if (!materials_result.IsSuccess) + return ResultPagedList.ReFailure(materials_result); + var materials = materials_result.Data.ToList(); + + //物料集合;模糊查询后的物料集合 + if (!string.IsNullOrEmpty(dto.MaterialNumber)) + materials = materials.Where(w => EF.Functions.Like(w.MaterialNumber, "%" + dto.MaterialNumber + "%")).ToList(); + var query = _context.InStockTaskDetails .GroupJoin(_context.InStockTask, detail => detail.Fid, order => order.Id, (detail, orders) => new { detail, orders }) - .SelectMany(x => x.orders.DefaultIfEmpty(), (p, order) => new { p.detail, order }) + .SelectMany(x => x.orders.DefaultIfEmpty(), (p, order) => new { p.detail, order }) .Where(adv => 1 == 1); if (!string.IsNullOrEmpty(dto.SourceBillNo)) query = query.Where(w => EF.Functions.Like(w.order.SourceBillNo, "%" + dto.SourceBillNo + "%")); - //if (!string.IsNullOrEmpty(dto.MaterialNumber)) - // query = query.Where(w => EF.Functions.Like(w.detail.BillNo, "%" + dto.BillNo + "%")); + //物料ID在模糊后的物料 + if (materials != null && materials.Count != 0 && !string.IsNullOrEmpty(dto.MaterialNumber)) + { + var mids = materials.Select(x => x.MaterialId).ToList(); + query = query.Where(w => mids.Contains(w.detail.MaterialId)); + } + if (dto.SupplierId.HasValue) query = query.Where(w => w.detail.SupplierId == dto.SupplierId.Value); @@ -88,7 +110,7 @@ namespace WMS.Web.Repositories int total = await query.CountAsync(); response.TotalCount = total; - var list = await query.Select(s => new InStockTaskQueryResponse() + var list =await query.Select(s => new InStockTaskQueryResponse() { Id = s.order.Id, DetailsId = s.detail.Id, @@ -98,19 +120,17 @@ namespace WMS.Web.Repositories SourceBillNo = s.order.SourceBillNo, Supplier = "", Org = "", - MaterialName = "", - MaterialNumber = "", - Specifications = "", + MaterialName = _erpBasicDataExtendService.GetMaterialName(materials,s.detail.MaterialId), + MaterialNumber = _erpBasicDataExtendService.GetMaterialNumber(materials, s.detail.MaterialId), + Specifications = _erpBasicDataExtendService.GetMaterialSpecifications(materials, s.detail.MaterialId), FactoryPrice = s.detail.FactoryPrice, Stock = "", AccruedQty = s.detail.AccruedQty, ReceiveQty = s.detail.ReceiveQty, RealityQty = s.detail.RealityQty, Receiver = "", - //ReceiveTime= s.order.ReceiveTime.ToString("yyyy-MM-dd HH:mm:ss.fff"), ReceiveTime = s.order.ReceiveTime.HasValue ? s.order.ReceiveTime.Value.ToString("yyyy-MM-dd HH:mm:ss") : "", Shelfer = "", - //ShelfTime= s.order.ShelfTime.ToString("yyyy-MM-dd HH:mm:ss.fff"), ShelfTime = s.order.ShelfTime.HasValue ? s.order.ShelfTime.Value.ToString("yyyy-MM-dd HH:mm:ss") : "", CreateTime = s.detail.CreateTime.ToString("yyyy-MM-dd HH:mm:ss"), }).OrderByDescending(x => x.Id).Skip((dto.PageNo - 1) * dto.PageSize).Take(dto.PageSize).ToListAsync(); @@ -199,6 +219,12 @@ namespace WMS.Web.Repositories /// public async Task> GetListBy(string sourceBillNo, InstockType? type=null) { + //1.获取物料集合 + var materials_result = await _erpService.BillQueryForMaterial(); + var materials = new List(); + if (materials_result.IsSuccess) + materials = materials_result.Data.ToList(); + var query = _context.InStockTaskDetails .GroupJoin(_context.InStockTask, detail => detail.Fid, order => order.Id, (detail, orders) => new { detail, orders }) .SelectMany(x => x.orders.DefaultIfEmpty(), (p, order) => new { p.detail, order }) @@ -215,10 +241,10 @@ namespace WMS.Web.Repositories MaterialId=s.detail.MaterialId, StockCode=s.detail.StockCode, StockName = _singleDataService.GetSingleData(SingleAction.Stocks, _loginRepositories.CompanyId, s.detail.StockId), - MaterialName = "", - MaterialNumber = "", - Specifications = "", - Qty=s.detail.AccruedQty, + MaterialName = _erpBasicDataExtendService.GetMaterialName(materials, s.detail.MaterialId), + MaterialNumber = _erpBasicDataExtendService.GetMaterialNumber(materials, s.detail.MaterialId), + Specifications = _erpBasicDataExtendService.GetMaterialSpecifications(materials, s.detail.MaterialId), + Qty =s.detail.AccruedQty, DeliveredQty=s.detail.DeliveredQty, Remark = s.detail.Remark }).ToListAsync();