using Qdp.Foundation.Utilities;
using YLErp.DBModels;
using YLErp.DBModels.Consts;
using YLErp.DBModels.Enums;
using YLErp.Model;
using YLErp.Modules.ApiModule;
using YLErp.Modules.TradeDalModule;
using YLErp.Modules.UnderlyingModule;
using static YLErp.ConsGlobal;
namespace YLErp.Modules.TradeModule
{
///
/// 交易OA服务
///
public class TradeOAService : YLBaseService
{
private static readonly IYcLogger logger = LogFactory.GetLogger();
public TradeOAService(OptUserInfo userInfo) : base(userInfo)
{
}
public TradeOAService(YLBaseService baseService) : base(baseService)
{
}
///
/// 处理单个交易的OA提交
///
/// 交易ID
/// 处理结果
public async Task ProcessSingleOAAsync(int tradeId)
{
try
{
// 获取交易信息
var trade = DbContext.trade.FirstOrDefault(x=>x.id==tradeId);
if (trade == null)
{
return new TradeOAResult {TradeId=tradeId, Success = false, Message = "未找到交易信息" };
}
// 获取交易确认书信息
var tcr = DbContext.trade_contract_r.Where(t => t.Type == ContractTypeEnum.Trade && t.IsValid&&t.TradeId==tradeId)
.FirstOrDefault();
trade_contract_document tdoc = null;
if (tcr!=null)
{
tdoc = DbContext.trade_contract_document.Where(t => t.Code == tcr.ContractCode&&t.Type==tcr.Type).FirstOrDefault();
}
// 将之前的OA记录设置为无效
var existingOAResults = DbContext.tradeContractOaResult.Where(x => x.trade_id == tradeId && x.is_valid == true).ToList();
foreach (var existingResult in existingOAResults)
{
existingResult.is_valid = false;
existingResult.SetOpt(UserInfo);
}
// 创建OA结果记录
var oaResult = new trade_contract_oa_result
{
trade_id = tradeId,
contract_code = tcr?.ContractCode,
status = "提交中",
is_valid = true,
};
oaResult.SetOpt(UserInfo);
DbContext.tradeContractOaResult.Add(oaResult);
await DbContext.SaveChangesAsync();
// 调用OA接口
var oaResp = await CallOAInterfaceAsync(trade, tcr?.ContractCode, tdoc, oaResult.id);
if (oaResp != null&& oaResp.success)
{
oaResult.status = "提交成功";
oaResult.oa_fileid = oaResp.data?.fileid;
oaResult.oa_msg = oaResp.data?.url;
}
else
{
oaResult.status = "提交失败";
oaResult.oa_msg = oaResp?.message ?? "OA接口调用失败";
}
await DbContext.SaveChangesAsync();
return new TradeOAResult { TradeId = tradeId, Success = oaResult.status== "提交成功", Message = oaResult.oa_msg };
}
catch (Exception ex)
{
logger.Error($"处理交易ID {tradeId} 的OA时发生错误: {ex.Message}", ex);
return new TradeOAResult { TradeId = tradeId, Success = false, Message = $"提交OA失败: {ex.Message}" };
}
}
///
/// 调用OA接口
///
/// 交易信息
/// 合同编号
/// 交易确认书文档
/// OA结果记录ID
/// 是否成功
private async Task CallOAInterfaceAsync(trade trade, string contractCode, trade_contract_document tdoc, int oaResultId)
{
try
{
// 获取OA配置
var oaConfigSection = AppManager.GetConfiguration().GetSection("oa_confg");
var baseUrl = oaConfigSection["BaseUrl"];
var loginName = UserInfo.OaAccount;
var systemKey = oaConfigSection["SystemKey"];
var objectClass = oaConfigSection["ObjectClass"];
var urgent = int.Parse(oaConfigSection["Urgent"] ?? "1");
var issend = int.Parse(oaConfigSection["Issend"] ?? "0");
if (string.IsNullOrEmpty(loginName))
{
logger.Error("OA账号未配置");
return new OAResponse() { data = null, success = false, message = "OA账号未配置" };
}
if (string.IsNullOrEmpty(baseUrl))
{
logger.Error("OA接口配置中BaseUrl为空");
return new OAResponse() { data = null, success = false, message = "OA接口配置中地址为空" };
}
// 处理附件
var attachments = new List