using AutoMapper; using ERP; using Microsoft.EntityFrameworkCore.Storage; using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Linq; using System.ServiceModel; using System.Text; using System.Threading.Tasks; using BarCode.Web.Core.Dto.Erp; using BarCode.Web.Core.Dto.Erp.Customer; using BarCode.Web.Core.Dto.Erp.Org; using BarCode.Web.Core.Dto.Erp.OutStock; using BarCode.Web.Core.Dto.Erp.Supplier; using BarCode.Web.Core.Dto.Erp.TakeStock; using BarCode.Web.Core.Help; using BarCode.Web.Core.Internal.Results; using BarCode.Web.Domain.Entitys; using BarCode.Web.Domain.Infrastructure; using BarCode.Web.Domain.IService.Public; using BarCode.Web.Domain.Options; using BarCode.Web.Domain.Values; using BarCode.Web.Domain.Values.Erp; using BarCode.Web.Domain.Values.Single; using System.Text.Json.Nodes; using Quartz.Logging; using NPOI.SS.UserModel; namespace BarCode.Web.Domain.Services.Public { /// /// erp数据交互服务 /// public class ErpService : IErpService { private IMapper _mapper; private AppOptions _appOptions; private ErpOptions _erpOptions; private ILogger _logger; private ERPGWSoapClient _client; private readonly IMemoryCache _memoryCache; private readonly IBasicsRepositories _basicsRepositories; private readonly IMaterialsRepositories _materialsRepositories; private readonly IServiceProvider _serviceProvider; public ErpService( IMapper mapper, IOptions erpOptions, IOptions appOptions, IServiceProvider serviceProvider, ILogger logger, IMaterialsRepositories materialsRepositories, IMemoryCache memoryCache, IBasicsRepositories basicsRepositories) { _serviceProvider = serviceProvider; this._materialsRepositories = materialsRepositories; this._basicsRepositories = basicsRepositories; this._erpOptions = erpOptions?.Value; this._appOptions = appOptions?.Value; this._mapper = mapper; this._logger = logger; this._memoryCache = memoryCache; } /// /// 初始化ERP:登录到ERP /// /// public async Task> Init() { BasicHttpBinding binding = new BasicHttpBinding(); binding.MaxReceivedMessageSize = int.MaxValue; binding.SendTimeout = new TimeSpan(int.MaxValue); EndpointAddress address = new EndpointAddress(this._erpOptions.EndpointAddress); this._client = new ERPGWSoapClient(binding, address); try { var result = await this._client.ValidateSystemAsync(this._erpOptions.UserName, this._erpOptions.Password, this._erpOptions.ErpId, ""); if (result == null || result.AccessToken == null) { _logger.LogError($"金蝶Token获取失败: {result?.Message}"); return Result.ReFailure(ResultCodes.Erp_Login_Error); } return Result.ReSuccess(result.AccessToken); } catch (Exception ex) { _logger.LogError($"金蝶Token获取异常: {ex.Message}"); return Result.ReFailure(ResultCodes.Erp_Login_Error); } } public async Task> Init1() { BasicHttpBinding binding = new BasicHttpBinding(); binding.MaxReceivedMessageSize = int.MaxValue; binding.SendTimeout = new TimeSpan(int.MaxValue); EndpointAddress address = new EndpointAddress(this._erpOptions.EndpointAddress); this._client = new ERPGWSoapClient(binding, address); try { var result = await this._client.ValidateSystemAsync(this._erpOptions.UserName, this._erpOptions.Password, "Orico", ""); if (result == null) return Result.ReFailure(ResultCodes.Erp_Login_Error); return Result.ReSuccess(result.AccessToken); } catch (Exception ex) { return Result.ReFailure(ResultCodes.Erp_Login_Error); } } /// /// 查单据类型的值 /// /// public async Task> BillQueryForBillType() { try { //1.先登录金蝶-拿到token var token_result = await this.Init1(); if (!token_result.IsSuccess) return ResultList.ReFailure(token_result); //2.时间条件:可能还有其它条件 var beginTime = DateTime.Now.AddDays(-2).ToString("yyyy-MM-dd 00:00:00"); var endTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); //3.获取金蝶采购订单:拼接参数和条件 var query = new ErpBillQueryDto(token_result.Data); var param = new ErpBillQueryParamDto("BOS_BillType"); param.FieldKeys = "FBILLTYPEID,FNumber,FName"; param.Limit = 10000; param.FilterString = ""; query.Data = JsonConvert.SerializeObject(param); var json = JsonConvert.SerializeObject(query); //4.请求查询接口 var result_json = await _client.ExecuteBillQueryAsync(json); var result = JsonConvert.DeserializeObject>>(result_json); //5.返回数据的组装 var erp_list = new List(); foreach (var item in result) { var lis = new ErpBaseDto(); lis.Id = item[0]; lis.Number = item[1]; lis.Name = item[2]; erp_list.Add(lis); } return ResultList.ReSuccess(erp_list); } catch (Exception ex) { return ResultList.ReFailure(ResultCodes.Erp_BillQuery_Error); } } /// /// erp:单据查询-物料集合 /// /// public async Task> BillQueryForMaterial(bool isCache = true) { try { if (isCache) { //1.获取缓存中的物料数据; var materials = _memoryCache.Get>(_erpOptions.cache_materail_key); if (materials == null || materials.Count == 0) { var mats = await _materialsRepositories.GetEntityList(); if (mats == null || mats.Count == 0) return await this.BillQueryForMaterialPagedList(); else { 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(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}"); return ResultList.ReSuccess(erp_materials_list); } } else return ResultList.ReSuccess(materials); } else return await this.BillQueryForMaterialPagedList(); } catch (Exception ex) { _logger.LogInformation($"物料拉取-> 错误信息:" + ex.Message); return ResultList.ReFailure(ResultCodes.ErpMaterialError); } } /// /// 获取物料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,FModifyDate,FCreateDate,FProductLines1.FName,FProductCATs1.FName,FMaterialGroup.FName"; 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]); lis.IdConvertBar = item[11].Trim(); lis.FModifyDate = Convert.ToDateTime(item[12]); lis.FCreateDate = Convert.ToDateTime(item[13]); lis.FProductLines1FName =item[14]; lis.FProductCATs1FName = item[15]; lis.FMaterialGroupFName = item[16]; 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:基础数据-物料信息 /// /// /// public async Task> BillQueryForMaterial(int id) { //1.获取缓存中的物料数据 var materials = _memoryCache.Get>(_erpOptions.cache_materail_key); if (materials == null || materials.Count == 0) return Result.ReSuccess(null); //2.通过ID取当前物料列表中的 var mater = materials.Where(x => x.MaterialId == id).FirstOrDefault(); if (mater == null) { //2.1没有的话:去金蝶取 mater = await this.BillQueryForMaterialById(id); if (mater != null) { //把取到的数据放集合中并重新给缓存 materials.Add(mater); _memoryCache.Set(_erpOptions.cache_materail_key, materials, new MemoryCacheEntryOptions().SetAbsoluteExpiration(TimeSpan.FromMinutes(DateTimeUtil.GetTotalMinutesTimeSpan()))); return Result.ReSuccess(mater); } else return Result.ReSuccess(null); } return Result.ReSuccess(mater); } /// /// erp:基础数据-物料信息 /// /// /// public async Task> BillQueryForMaterial(string number) { //1.获取缓存中的物料数据 var materials = _memoryCache.Get>(_erpOptions.cache_materail_key); if (materials == null || materials.Count == 0) return Result.ReSuccess(null); //2.通过ID取当前物料列表中的 var mater = materials.Where(x => x.MaterialNumber == number).FirstOrDefault(); if (mater == null) { //2.1没有的话:去金蝶取 mater = await this.BillQueryForMaterialByNumber(number); if (mater != null) { //把取到的数据放集合中并重新给缓存 materials.Add(mater); _memoryCache.Set(_erpOptions.cache_materail_key, materials, new MemoryCacheEntryOptions().SetAbsoluteExpiration(TimeSpan.FromMinutes(DateTimeUtil.GetTotalMinutesTimeSpan()))); return Result.ReSuccess(mater); } else return Result.ReSuccess(null); } return Result.ReSuccess(mater); } /// /// erp:基础数据-物料-分页查询 /// /// private async Task> BillQueryForMaterialPagedList() { //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,FModifyDate,FCreateDate,FProductLines1.FName,FProductCATs1.FName,FMaterialGroup.FName"; param.Limit = 10000; //查询条件:备注其中的条件值以金蝶的值为准!!! //1.审核状态:已审核 //2.禁用状态:A否,B是 //3.使用组织:只查询“深圳市元创时代科技有限公司”这个组织;组织ID=100008--固定值查询(测试端和正式是一样的) //param.FilterString = "FDocumentStatus='C' and FForbidStatus='A' and (FUseOrgId=19162897 or FUseOrgId=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}"); var error_josn = ""; try { 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); error_josn = result_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.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]); lis.IdConvertBar = item[11].Trim(); lis.FModifyDate = Convert.ToDateTime(item[12]); lis.FCreateDate = Convert.ToDateTime(item[13]); lis.FProductLines1FName = item[14]; lis.FProductCATs1FName = item[15]; lis.FMaterialGroupFName = item[16]; erp_materials_list.Add(lis); } //4.6页面的叠加 skip++; } var endTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); _logger.LogInformation($"物料拉取-结束时间:{endTime}"); //5.物料集合进行缓存-当前缓存时间到当天晚上的0点,后面定时任务执行重新放入缓存 _memoryCache.Set(_erpOptions.cache_materail_key, erp_materials_list, new MemoryCacheEntryOptions().SetAbsoluteExpiration(TimeSpan.FromMinutes(DateTimeUtil.GetTotalMinutesTimeSpan()))); _logger.LogInformation($"物料拉取-总条数:{erp_materials_list.Count}"); return ResultList.ReSuccess(erp_materials_list); } catch (Exception ex) { _logger.LogInformation("物料拉取->失败:" + ex.Message + " " + error_josn); return ResultList.ReFailure(ResultCodes.ErpSynsError); } } /// /// erp:基础数据-物料-ids查询 /// /// /// private async Task BillQueryForMaterialById(int id) { //2.先登录金蝶-拿到token var token_result = await this.Init(); if (!token_result.IsSuccess) return null; //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--固定值查询(测试端和正式是一样的)---按ID查询就不需要固定组织条件了 param.FilterString = "FDocumentStatus='C' and FForbidStatus='A'"; param.OrderString = "FCreateDate ASC"; //根据物料ID查询 param.FilterString = param.FilterString + $" and FMATERIALID={id}"; //4.循环拿金蝶数据 var erp_materials_list = new List(); //4.2.参数json化 query.Data = JsonConvert.SerializeObject(param); var json = JsonConvert.SerializeObject(query); var error_josn = ""; try { //4.3.请求查询接口并返回数据 var result_json = await _client.ExecuteBillQueryAsync(json); error_josn = result_json; var result = JsonConvert.DeserializeObject>>(result_json); //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]); lis.IdConvertBar = item[11].Trim(); erp_materials_list.Add(lis); } if (erp_materials_list.Count == 0) return null; else return erp_materials_list.FirstOrDefault(); } catch (Exception) { _logger.LogInformation("物料拉取按ID->错误的Json:" + error_josn); return null; } } /// /// erp:基础数据-物料-number查询 /// /// /// public async Task BillQueryForMaterialByNumber(string number) { if (string.IsNullOrEmpty(number)) return null; //2.先登录金蝶-拿到token var token_result = await this.Init(); if (!token_result.IsSuccess) return null; //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--固定值查询(测试端和正式是一样的)---按ID查询就不需要固定组织条件了 param.FilterString = "FDocumentStatus='C' and FForbidStatus='A'"; param.OrderString = "FCreateDate ASC"; //根据物料ID查询 param.FilterString = param.FilterString + $" and FNumber='{number}'"; //4.循环拿金蝶数据 var erp_materials_list = new List(); //4.2.参数json化 query.Data = JsonConvert.SerializeObject(param); var json = JsonConvert.SerializeObject(query); var error_josn = ""; try { //4.3.请求查询接口并返回数据 var result_json = await _client.ExecuteBillQueryAsync(json); error_josn = result_json; var result = JsonConvert.DeserializeObject>>(result_json); //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]); lis.IdConvertBar = item[11].Trim(); erp_materials_list.Add(lis); } if (erp_materials_list.Count == 0) return null; else return erp_materials_list.FirstOrDefault(); } catch (Exception) { _logger.LogInformation("物料拉取按Number->错误的Json:" + error_josn + ";参数:" + json); return null; } } public async Task BillQueryForMaterialByNumber(string number, string orgCode) { if (string.IsNullOrEmpty(number)) return null; //2.先登录金蝶-拿到token var token_result = await this.Init(); if (!token_result.IsSuccess) return null; //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--固定值查询(测试端和正式是一样的)---按ID查询就不需要固定组织条件了 param.FilterString = "FDocumentStatus='C' and FForbidStatus='A'"; param.OrderString = "FCreateDate ASC"; //根据物料ID查询 param.FilterString = param.FilterString + $" and FNumber='{number}' and FUseOrgId.FNumber='{orgCode}'"; //4.循环拿金蝶数据 var erp_materials_list = new List(); //4.2.参数json化 query.Data = JsonConvert.SerializeObject(param); var json = JsonConvert.SerializeObject(query); var error_josn = ""; try { //4.3.请求查询接口并返回数据 var result_json = await _client.ExecuteBillQueryAsync(json); error_josn = result_json; var result = JsonConvert.DeserializeObject>>(result_json); //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]); lis.IdConvertBar = item[11].Trim(); erp_materials_list.Add(lis); } if (erp_materials_list.Count == 0) return null; else return erp_materials_list.FirstOrDefault(); } catch (Exception ex) { _logger.LogInformation($"物料拉取按Number->错误的Json:" + error_josn + ";参数:" + json + " 错误信息:" + ex.Message); return null; } } /// /// erp:单据查询-组织数据 /// /// public async Task> BillQueryForOrg() { string result_json = ""; try { //1.获取缓存中的组织数据; var orgs = _memoryCache.Get>(_erpOptions.cache_org_key); if (orgs == null || orgs.Count == 0) { //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.ORG_Organizations.ToString()); param.FieldKeys = "FOrgID,FNumber,FName"; param.Limit = 10000; //查询条件:备注其中的条件值以金蝶的值为准!!! param.FilterString = ""; //备注:因为组织数据不是很多,就不能和获取物料一样循环获取;组织这里就获取10000条数据就行了 var beginTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); _logger.LogInformation($"组织拉取-开始时间yzh20250530:{beginTime}"); //4.参数json化 query.Data = JsonConvert.SerializeObject(param); var json = JsonConvert.SerializeObject(query); //5.请求查询接口并返回数据 result_json = await _client.ExecuteBillQueryAsync(json); var result = JsonConvert.DeserializeObject>>(result_json); var endTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); _logger.LogInformation($"组织拉取-结束时间yzh20250530:{endTime}"); //6.拼装 var list = new List(); foreach (var item in result) { var lis = new ErpOrgDto(); lis.Id = int.Parse(item[0]); lis.Number = item[1]; lis.Name = item[2]; list.Add(lis); } //5.组织集合进行缓存 _memoryCache.Set(_erpOptions.cache_org_key, list, new MemoryCacheEntryOptions().SetAbsoluteExpiration(TimeSpan.FromMinutes(DateTimeUtil.GetTotalMinutesTimeSpan()))); return ResultList.ReSuccess(list); } else { return ResultList.ReSuccess(orgs); } } catch (Exception ex) { _logger.LogError($"金蝶组织拉取异常20250530{ex.Message}{result_json}"); return ResultList.ReFailure(ResultCodes.ErpOrgError); } } /// /// erp:供应商 /// /// public async Task> BillQueryForSupplier() { string result_json = ""; try { //1.获取缓存中的供应商数据; var suppliers = _memoryCache.Get>(_erpOptions.cache_supplier_key); if (suppliers == null || suppliers.Count == 0) { //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_Supplier.ToString()); param.FieldKeys = "FSupplierId,FNumber,FName,FUseOrgId.FNumber"; int skip = 1; param.Limit = 10000; var list = new List(); while (true) { param.StartRow = (Convert.ToInt32(skip) * param.Limit); //查询条件:备注其中的条件值以金蝶的值为准!!! //param.FilterString = "FUseOrgId=100008"; //param.FilterString = "(FUseOrgId = 100008 or FUseOrgId = 19162897)"; //备注:因为供应商数据不是很多,就不能和获取物料一样循环获取;组织这里就获取10000条数据就行了 var beginTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); _logger.LogInformation($"供应商拉取-开始时间yzh20250804:{beginTime}"); //4.参数json化 query.Data = JsonConvert.SerializeObject(param); var json = JsonConvert.SerializeObject(query); //5.请求查询接口并返回数据 result_json = await _client.ExecuteBillQueryAsync(json); var result = JsonConvert.DeserializeObject>>(result_json); //4.4.判断数据是否全部拉取完成:并停止循环的条件 if (result == null || result.Count == 0) break; var endTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); _logger.LogInformation($"供应商拉取-结束时间yzh:{endTime}"); foreach (var item in result) { var lis = new ErpSupplierDto(); lis.Id = int.Parse(item[0]); lis.Number = item[1]; lis.Name = item[2]; lis.OrgCode = item[3]; list.Add(lis); } skip++; } //5.供应商集合进行缓存 _memoryCache.Set(_erpOptions.cache_supplier_key, list, new MemoryCacheEntryOptions().SetAbsoluteExpiration(TimeSpan.FromMinutes(DateTimeUtil.GetTotalMinutesTimeSpan()))); return ResultList.ReSuccess(list); } else { return ResultList.ReSuccess(suppliers); } } catch (Exception ex) { _logger.LogError($"金蝶供应商拉取异常{ex.Message} {result_json}"); return ResultList.ReFailure(ResultCodes.ErpSupplierError); } } /// /// 客户 /// /// public async Task> BillQueryForCustomer() { try { //1.获取缓存中的供应商数据; var customers = _memoryCache.Get>(_erpOptions.cache_customer_key); if (customers == null || customers.Count == 0) { //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_Customer.ToString()); param.FieldKeys = "FCUSTID,FNumber,FName"; param.Limit = 10000; //查询条件:备注其中的条件值以金蝶的值为准!!! param.FilterString = ""; var list = new List(); //备注:因为供应商数据不是很多,就不能和获取物料一样循环获取;组织这里就获取10000条数据就行了 var beginTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); _logger.LogInformation($"客户拉取-开始时间yzh:{beginTime}"); int skip = 0; //4.参数json化 while (true) { //4.1.页码:页码按照金蝶的要求从0开始 param.StartRow = (Convert.ToInt32(skip) * param.Limit); query.Data = JsonConvert.SerializeObject(param); var json = JsonConvert.SerializeObject(query); //5.请求查询接口并返回数据 var result_json = await _client.ExecuteBillQueryAsync(json); var result = JsonConvert.DeserializeObject>>(result_json); if (result == null || result.Count == 0) break; //6.拼装 foreach (var item in result) { var lis = new ErpCustomerDto(); lis.Id = int.Parse(item[0]); lis.Number = item[1]; lis.Name = item[2]; list.Add(lis); } //4.6页面的叠加 skip++; } var endTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); _logger.LogInformation($"客户拉取-结束时间yzh:{endTime}"); //5.供应商集合进行缓存 _memoryCache.Set(_erpOptions.cache_customer_key, list, new MemoryCacheEntryOptions().SetAbsoluteExpiration(TimeSpan.FromMinutes(DateTimeUtil.GetTotalMinutesTimeSpan()))); _logger.LogInformation($"客户拉取-总条数yzh:{list.Count}"); return ResultList.ReSuccess(list); } else { return ResultList.ReSuccess(customers); } } catch (Exception) { return ResultList.ReFailure(ResultCodes.ErpSupplierError); } } /// /// erp:仓库 /// /// public async Task> BillQueryForStock() { try { //1.获取缓存中的仓库数据; var stocks = _memoryCache.Get>(_erpOptions.cache_stock_key); if (stocks == null || stocks.Count == 0) { //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_STOCK.ToString()); param.FieldKeys = "FStockId,FName,FNumber,FUseOrgId,FUseOrgId.FNumber"; param.Limit = 10000; //查询条件:备注其中的条件值以金蝶的值为准!!! param.FilterString = ""; //备注:因为供应商数据不是很多,就不能和获取物料一样循环获取;组织这里就获取10000条数据就行了 var beginTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); _logger.LogInformation($"仓库拉取-开始时间yzh:{beginTime}"); //4.参数json化 query.Data = JsonConvert.SerializeObject(param); var json = JsonConvert.SerializeObject(query); //5.请求查询接口并返回数据 var result_json = await _client.ExecuteBillQueryAsync(json); var result = JsonConvert.DeserializeObject>>(result_json); //6.拼装 var list = new List(); foreach (var item in result) { var lis = new ErpStockDto(); lis.Id = int.Parse(item[0]); lis.Name = item[1]; lis.Code = item[2]; lis.OrgId = Convert.ToInt32(item[3]); lis.OrgCode = item[4]; list.Add(lis); } //5.供应商集合进行缓存 _memoryCache.Set(_erpOptions.cache_stock_key, list, new MemoryCacheEntryOptions().SetAbsoluteExpiration(TimeSpan.FromDays(3))); _logger.LogInformation($"仓库拉取-总条数yzh:{list.Count}"); return ResultList.ReSuccess(list); } else { return ResultList.ReSuccess(stocks); } } catch (Exception) { return ResultList.ReFailure(ResultCodes.ErpStockError); } } /// /// 根据仓库编码获取仓位 /// /// /// public async Task> BillQueryForSubStock() { try { //1.获取缓存中的仓库数据; var stocks = _memoryCache.Get>(_erpOptions.cache_substock_key); if (stocks == null || stocks.Count == 0) { var token_result = await this.Init(); if (!token_result.IsSuccess) return ResultList.ReFailure(token_result); var query = new ErpBillQueryDto(token_result.Data); var param = new ErpBillQueryParamDto(FormIdParam.BD_STOCK.ToString()); param.FieldKeys = "FStockFlexDetail_FDetailID,FFlexEntryName,FFlexEntryId.FNumber,FUseOrgId.FNumber,FNumber"; param.Limit = 100000; param.FilterString = $"FNumber='HD' or FNumber='GD'";//FNumber='C' query.Data = JsonConvert.SerializeObject(param); var json = JsonConvert.SerializeObject(query); var result_json = await _client.ExecuteBillQueryAsync(json); var result = JsonConvert.DeserializeObject>>(result_json); var list = new List(); foreach (var item in result) { var lis = new Erp_SubStockDto(); if (item[0] == "0") continue; lis.Id = int.Parse(item[0]); lis.Name = item[1]; lis.Code = item[2]; lis.OrgCode = item[3]; lis.StockCode = item[4]; list.Add(lis); } //5.供应商集合进行缓存 只有查询全部的时候才缓存 _memoryCache.Set(_erpOptions.cache_substock_key, list, new MemoryCacheEntryOptions().SetAbsoluteExpiration(TimeSpan.FromDays(3))); _logger.LogInformation($"子仓库拉取-总条数:{list.Count}"); return ResultList.ReSuccess(list); } else { return ResultList.ReSuccess(stocks); } } catch (Exception) { return ResultList.ReFailure(ResultCodes.ErpSubStockError); } } #region 金蝶操作交互 /// /// 同步数据(保存提交审核) /// /// /// /// public async Task> Save(T dto, string formId) { try { var token_result = await this.Init(); if (!token_result.IsSuccess) return Result.ReFailure(token_result.Message, token_result.Status); var query = new ErpBillQueryDto(token_result.Data, formId); var param = new ErpSave(formId, dto); query.Data = JsonConvert.SerializeObject(param); //保存 var result_json = await _client.SaveAsync(JsonConvert.SerializeObject(query)); _logger.LogInformation("入库单->开始同步金蝶:保存参数" + JsonConvert.SerializeObject(query) + " 结果->" + result_json); JObject jobject = (JObject)JsonConvert.DeserializeObject(result_json); if (jobject["Result"]["ResponseStatus"]["IsSuccess"].ToString().ToLower() == "true") { //保存成功后返回number 后续操作根据Id操作 string number = jobject["Result"]["ResponseStatus"]["SuccessEntitys"][0]["Number"].ToString(); return Result.ReSuccess(number); } var msg = jobject["Result"]["ResponseStatus"]["Errors"][0]["Message"].ToString(); return Result.ReFailure(msg, 10002); } catch (Exception ex) { return Result.ReFailure(ex.ToString(), 10002); } } /// /// 提交 /// /// /// /// public async Task Submit(ErpOperateDto dto, string formId) { try { var token_result = await this.Init(); if (!token_result.IsSuccess) return token_result; var query = new ErpBillQueryDto(token_result.Data, formId); //提交 query.Data = JsonConvert.SerializeObject(dto); var result_json = await _client.SubmitAsync(JsonConvert.SerializeObject(query)); _logger.LogInformation("入库单->开始同步金蝶:提交参数" + JsonConvert.SerializeObject(query) + " 结果->" + result_json); JObject jobject = (JObject)JsonConvert.DeserializeObject(result_json); if (jobject["Result"]["ResponseStatus"]["IsSuccess"].ToString().ToLower() == "true") return Result.ReSuccess(); var msg = jobject["Result"]["ResponseStatus"]["Errors"][0]["Message"].ToString(); return Result.ReFailure(msg, 10002); } catch (Exception ex) { return Result.ReFailure(ex.ToString(), 10002); } } /// /// 审核 /// /// /// /// public async Task Audit(ErpOperateDto dto, string formId) { try { var token_result = await this.Init(); if (!token_result.IsSuccess) return token_result; var query = new ErpBillQueryDto(token_result.Data, formId); //提交 query.Data = JsonConvert.SerializeObject(dto); var result_json = await _client.AuditAsync(JsonConvert.SerializeObject(query)); _logger.LogInformation("入库单->开始同步金蝶:审核参数" + JsonConvert.SerializeObject(query) + " 结果->" + result_json); JObject jobject = (JObject)JsonConvert.DeserializeObject(result_json); if (jobject["Result"]["ResponseStatus"]["IsSuccess"].ToString().ToLower() == "true") return Result.ReSuccess(); var msg = jobject["Result"]["ResponseStatus"]["Errors"][0]["Message"].ToString(); return Result.ReFailure(msg, 10002); } catch (Exception ex) { return Result.ReFailure(ex.ToString(), 10002); } } /// /// 反审核 /// /// /// /// public async Task NoAudit(ErpOperateDto dto, string formId) { try { var token_result = await this.Init(); if (!token_result.IsSuccess) return token_result; var query = new ErpBillQueryDto(token_result.Data); //提交 query.Data = JsonConvert.SerializeObject(dto); var result_json = await _client.UnAuditAsync(JsonConvert.SerializeObject(query)); JObject jobject = (JObject)JsonConvert.DeserializeObject(result_json); var isSuccess = jobject["Result"]["ResponseStatus"]["IsSuccess"].ToString().ToLower(); if (jobject["Result"]["ResponseStatus"]["IsSuccess"].ToString().ToLower() == "true") return Result.ReSuccess(); var msg = jobject["Result"]["ResponseStatus"]["Errors"][0]["Message"].ToString(); return Result.ReFailure(msg, 10002); } catch (Exception ex) { return Result.ReFailure(ex.ToString(), 10002); } } /// /// 删除 /// /// /// /// public async Task Delete(ErpOperateDto dto, string formId) { try { var token_result = await this.Init(); if (!token_result.IsSuccess) return token_result; var query = new ErpBillQueryDto(token_result.Data); //提交 query.Data = JsonConvert.SerializeObject(dto); var result_json = await _client.DeleteAsync(JsonConvert.SerializeObject(query)); JObject jobject = (JObject)JsonConvert.DeserializeObject(result_json); var isSuccess = jobject["Result"]["ResponseStatus"]["IsSuccess"].ToString().ToLower(); if (jobject["Result"]["ResponseStatus"]["IsSuccess"].ToString().ToLower() == "true") return Result.ReSuccess(); var msg = jobject["Result"]["ResponseStatus"]["Errors"][0]["Message"].ToString(); return Result.ReFailure(msg, 10002); } catch (Exception ex) { return Result.ReFailure(ex.ToString(), 10002); } } /// /// 下推 /// /// /// public async Task> Push(ErpPushDto dto) { try { var token_result = await this.Init(); if (!token_result.IsSuccess) return token_result; var query = new ErpBillQueryDto(token_result.Data, dto.FormId); query.Data = JsonConvert.SerializeObject(dto); //下推 string json = JsonConvert.SerializeObject(query); var result_json = await _client.PushAsync(json); _logger.LogInformation("入库单->开始同步金蝶:下推参数" + json + " 结果->" + result_json); JObject jobject = (JObject)JsonConvert.DeserializeObject(result_json); var isSuccess = jobject["Result"]["ResponseStatus"]["IsSuccess"].ToString().ToLower(); if (jobject["Result"]["ResponseStatus"]["IsSuccess"].ToString().ToLower() == "true") { //保存成功后返回Id 后续操作根据Id操作 string id = jobject["Result"]["ResponseStatus"]["SuccessEntitys"][0]["Id"].ToString(); return Result.ReSuccess(id); } var msg = jobject["Result"]["ResponseStatus"]["Errors"][0]["Message"].ToString(); return Result.ReFailure(msg, 10002); } catch (Exception ex) { return Result.ReFailure(ex.ToString(), 10002); } } #endregion } }