Files
BarCode-Api/src/BarCode.Web.Domain/Services/Public/ErpService.cs
2026-02-09 16:59:27 +08:00

1218 lines
56 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
{
/// <summary>
/// erp数据交互服务
/// </summary>
public class ErpService : IErpService
{
private IMapper _mapper;
private AppOptions _appOptions;
private ErpOptions _erpOptions;
private ILogger<ErpService> _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> erpOptions,
IOptions<AppOptions> appOptions, IServiceProvider serviceProvider,
ILogger<ErpService> 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;
}
/// <summary>
/// 初始化ERP登录到ERP
/// </summary>
/// <returns></returns>
public async Task<Result<string>> 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<string>.ReFailure(ResultCodes.Erp_Login_Error);
}
return Result<string>.ReSuccess(result.AccessToken);
}
catch (Exception ex)
{
_logger.LogError($"金蝶Token获取异常: {ex.Message}");
return Result<string>.ReFailure(ResultCodes.Erp_Login_Error);
}
}
public async Task<Result<string>> 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<string>.ReFailure(ResultCodes.Erp_Login_Error);
return Result<string>.ReSuccess(result.AccessToken);
}
catch (Exception ex)
{
return Result<string>.ReFailure(ResultCodes.Erp_Login_Error);
}
}
/// <summary>
/// 查单据类型的值
/// </summary>
/// <returns></returns>
public async Task<ResultList<ErpBaseDto>> BillQueryForBillType()
{
try
{
//1.先登录金蝶-拿到token
var token_result = await this.Init1();
if (!token_result.IsSuccess)
return ResultList<ErpBaseDto>.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<List<List<string>>>(result_json);
//5.返回数据的组装
var erp_list = new List<ErpBaseDto>();
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<ErpBaseDto>.ReSuccess(erp_list);
}
catch (Exception ex)
{
return ResultList<ErpBaseDto>.ReFailure(ResultCodes.Erp_BillQuery_Error);
}
}
/// <summary>
/// erp:单据查询-物料集合
/// </summary>
/// <returns></returns>
public async Task<ResultList<ErpMaterialDto>> BillQueryForMaterial(bool isCache = true)
{
try
{
if (isCache)
{
//1.获取缓存中的物料数据;
var materials = _memoryCache.Get<List<ErpMaterialDto>>(_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<ErpMaterialDto>(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<ErpMaterialDto>.ReSuccess(erp_materials_list);
}
}
else
return ResultList<ErpMaterialDto>.ReSuccess(materials);
}
else
return await this.BillQueryForMaterialPagedList();
}
catch (Exception ex)
{
_logger.LogInformation($"物料拉取-> 错误信息:" + ex.Message);
return ResultList<ErpMaterialDto>.ReFailure(ResultCodes.ErpMaterialError);
}
}
/// <summary>
/// 获取物料id32进制
/// </summary>
/// <param name="materialNumbers"></param>
/// <returns></returns>
/// <exception cref="NotImplementedException"></exception>
public async Task<ResultList<ErpMaterialDto>> BillQueryForMaterialByNumbers(List<string> materialNumbers)
{
//2.先登录金蝶-拿到token
var token_result = await this.Init();
if (!token_result.IsSuccess)
return ResultList<ErpMaterialDto>.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<ErpMaterialDto>();
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<List<List<string>>>(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<ErpMaterialDto>.ReSuccess(erp_materials_list);
}
catch (Exception ex)
{
_logger.LogInformation("物料拉取->失败:" + ex.Message + " " + error_josn);
return ResultList<ErpMaterialDto>.ReFailure(ResultCodes.ErpSynsError);
}
}
/// <summary>
/// erp:基础数据-物料信息
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public async Task<Result<ErpMaterialDto>> BillQueryForMaterial(int id)
{
//1.获取缓存中的物料数据
var materials = _memoryCache.Get<List<ErpMaterialDto>>(_erpOptions.cache_materail_key);
if (materials == null || materials.Count == 0)
return Result<ErpMaterialDto>.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<ErpMaterialDto>.ReSuccess(mater);
}
else
return Result<ErpMaterialDto>.ReSuccess(null);
}
return Result<ErpMaterialDto>.ReSuccess(mater);
}
/// <summary>
/// erp:基础数据-物料信息
/// </summary>
/// <param name="number"></param>
/// <returns></returns>
public async Task<Result<ErpMaterialDto>> BillQueryForMaterial(string number)
{
//1.获取缓存中的物料数据
var materials = _memoryCache.Get<List<ErpMaterialDto>>(_erpOptions.cache_materail_key);
if (materials == null || materials.Count == 0)
return Result<ErpMaterialDto>.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<ErpMaterialDto>.ReSuccess(mater);
}
else
return Result<ErpMaterialDto>.ReSuccess(null);
}
return Result<ErpMaterialDto>.ReSuccess(mater);
}
/// <summary>
/// erp:基础数据-物料-分页查询
/// </summary>
/// <returns></returns>
private async Task<ResultList<ErpMaterialDto>> BillQueryForMaterialPagedList()
{
//2.先登录金蝶-拿到token
var token_result = await this.Init();
if (!token_result.IsSuccess)
return ResultList<ErpMaterialDto>.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<ErpMaterialDto>();
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<List<List<string>>>(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<ErpMaterialDto>.ReSuccess(erp_materials_list);
}
catch (Exception ex)
{
_logger.LogInformation("物料拉取->失败:" + ex.Message + " " + error_josn);
return ResultList<ErpMaterialDto>.ReFailure(ResultCodes.ErpSynsError);
}
}
/// <summary>
/// erp:基础数据-物料-ids查询
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
private async Task<ErpMaterialDto> 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<ErpMaterialDto>();
//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<List<List<string>>>(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;
}
}
/// <summary>
/// erp:基础数据-物料-number查询
/// </summary>
/// <param name="number"></param>
/// <returns></returns>
public async Task<ErpMaterialDto> 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<ErpMaterialDto>();
//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<List<List<string>>>(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<ErpMaterialDto> 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<ErpMaterialDto>();
//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<List<List<string>>>(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;
}
}
/// <summary>
/// erp:单据查询-组织数据
/// </summary>
/// <returns></returns>
public async Task<ResultList<ErpOrgDto>> BillQueryForOrg()
{
string result_json = "";
try
{
//1.获取缓存中的组织数据;
var orgs = _memoryCache.Get<List<ErpOrgDto>>(_erpOptions.cache_org_key);
if (orgs == null || orgs.Count == 0)
{
//2.先登录金蝶-拿到token
var token_result = await this.Init();
if (!token_result.IsSuccess)
return ResultList<ErpOrgDto>.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<List<List<string>>>(result_json);
var endTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff");
_logger.LogInformation($"组织拉取-结束时间yzh20250530{endTime}");
//6.拼装
var list = new List<ErpOrgDto>();
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<ErpOrgDto>.ReSuccess(list);
}
else
{
return ResultList<ErpOrgDto>.ReSuccess(orgs);
}
}
catch (Exception ex)
{
_logger.LogError($"金蝶组织拉取异常20250530{ex.Message}{result_json}");
return ResultList<ErpOrgDto>.ReFailure(ResultCodes.ErpOrgError);
}
}
/// <summary>
/// erp:供应商
/// </summary>
/// <returns></returns>
public async Task<ResultList<ErpSupplierDto>> BillQueryForSupplier()
{
string result_json = "";
try
{
//1.获取缓存中的供应商数据;
var suppliers = _memoryCache.Get<List<ErpSupplierDto>>(_erpOptions.cache_supplier_key);
if (suppliers == null || suppliers.Count == 0)
{
//2.先登录金蝶-拿到token
var token_result = await this.Init();
if (!token_result.IsSuccess)
return ResultList<ErpSupplierDto>.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<ErpSupplierDto>();
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<List<List<string>>>(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<ErpSupplierDto>.ReSuccess(list);
}
else
{
return ResultList<ErpSupplierDto>.ReSuccess(suppliers);
}
}
catch (Exception ex)
{
_logger.LogError($"金蝶供应商拉取异常{ex.Message} {result_json}");
return ResultList<ErpSupplierDto>.ReFailure(ResultCodes.ErpSupplierError);
}
}
/// <summary>
/// 客户
/// </summary>
/// <returns></returns>
public async Task<ResultList<ErpCustomerDto>> BillQueryForCustomer()
{
try
{
//1.获取缓存中的供应商数据;
var customers = _memoryCache.Get<List<ErpCustomerDto>>(_erpOptions.cache_customer_key);
if (customers == null || customers.Count == 0)
{
//2.先登录金蝶-拿到token
var token_result = await this.Init();
if (!token_result.IsSuccess)
return ResultList<ErpCustomerDto>.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<ErpCustomerDto>();
//备注因为供应商数据不是很多就不能和获取物料一样循环获取组织这里就获取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<List<List<string>>>(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<ErpCustomerDto>.ReSuccess(list);
}
else
{
return ResultList<ErpCustomerDto>.ReSuccess(customers);
}
}
catch (Exception)
{
return ResultList<ErpCustomerDto>.ReFailure(ResultCodes.ErpSupplierError);
}
}
/// <summary>
/// erp:仓库
/// </summary>
/// <returns></returns>
public async Task<ResultList<ErpStockDto>> BillQueryForStock()
{
try
{
//1.获取缓存中的仓库数据;
var stocks = _memoryCache.Get<List<ErpStockDto>>(_erpOptions.cache_stock_key);
if (stocks == null || stocks.Count == 0)
{
//2.先登录金蝶-拿到token
var token_result = await this.Init();
if (!token_result.IsSuccess)
return ResultList<ErpStockDto>.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<List<List<string>>>(result_json);
//6.拼装
var list = new List<ErpStockDto>();
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<ErpStockDto>.ReSuccess(list);
}
else
{
return ResultList<ErpStockDto>.ReSuccess(stocks);
}
}
catch (Exception)
{
return ResultList<ErpStockDto>.ReFailure(ResultCodes.ErpStockError);
}
}
/// <summary>
/// 根据仓库编码获取仓位
/// </summary>
/// <param name="code"></param>
/// <returns></returns>
public async Task<ResultList<Erp_SubStockDto>> BillQueryForSubStock()
{
try
{
//1.获取缓存中的仓库数据;
var stocks = _memoryCache.Get<List<Erp_SubStockDto>>(_erpOptions.cache_substock_key);
if (stocks == null || stocks.Count == 0)
{
var token_result = await this.Init();
if (!token_result.IsSuccess)
return ResultList<Erp_SubStockDto>.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<List<List<string>>>(result_json);
var list = new List<Erp_SubStockDto>();
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<Erp_SubStockDto>.ReSuccess(list);
}
else
{
return ResultList<Erp_SubStockDto>.ReSuccess(stocks);
}
}
catch (Exception)
{
return ResultList<Erp_SubStockDto>.ReFailure(ResultCodes.ErpSubStockError);
}
}
#region
/// <summary>
/// 同步数据(保存提交审核)
/// </summary>
/// <param name="dto"></param>
/// <param name="formId"></param>
/// <returns></returns>
public async Task<Result<string>> Save<T>(T dto, string formId)
{
try
{
var token_result = await this.Init();
if (!token_result.IsSuccess)
return Result<string>.ReFailure(token_result.Message, token_result.Status);
var query = new ErpBillQueryDto(token_result.Data, formId);
var param = new ErpSave<T>(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<string>.ReSuccess(number);
}
var msg = jobject["Result"]["ResponseStatus"]["Errors"][0]["Message"].ToString();
return Result<string>.ReFailure(msg, 10002);
}
catch (Exception ex)
{
return Result<string>.ReFailure(ex.ToString(), 10002);
}
}
/// <summary>
/// 提交
/// </summary>
/// <param name="dto"></param>
/// <param name="formId"></param>
/// <returns></returns>
public async Task<Result> 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);
}
}
/// <summary>
/// 审核
/// </summary>
/// <param name="dto"></param>
/// <param name="formId"></param>
/// <returns></returns>
public async Task<Result> 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);
}
}
/// <summary>
/// 反审核
/// </summary>
/// <param name="dto"></param>
/// <param name="formId"></param>
/// <returns></returns>
public async Task<Result> 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);
}
}
/// <summary>
/// 删除
/// </summary>
/// <param name="dto"></param>
/// <param name="formId"></param>
/// <returns></returns>
public async Task<Result> 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);
}
}
/// <summary>
/// 下推
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
public async Task<Result<string>> 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<string>.ReSuccess(id);
}
var msg = jobject["Result"]["ResponseStatus"]["Errors"][0]["Message"].ToString();
return Result<string>.ReFailure(msg, 10002);
}
catch (Exception ex)
{
return Result<string>.ReFailure(ex.ToString(), 10002);
}
}
#endregion
}
}