package com.ruoyi.lsfx.client; import com.ruoyi.lsfx.constants.LsfxConstants; import com.ruoyi.lsfx.domain.request.*; import com.ruoyi.lsfx.domain.response.*; import com.ruoyi.lsfx.exception.LsfxApiException; import com.ruoyi.lsfx.util.HttpUtil; import com.ruoyi.lsfx.util.MD5Util; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import jakarta.annotation.Resource; import java.util.HashMap; import java.util.Map; /** * 流水分析平台客户端 */ @Slf4j @Component public class LsfxAnalysisClient { @Resource private HttpUtil httpUtil; @Value("${lsfx.api.base-url}") private String baseUrl; @Value("${lsfx.api.app-id}") private String appId; @Value("${lsfx.api.app-secret}") private String appSecret; @Value("${lsfx.api.client-id}") private String clientId; @Value("${lsfx.api.endpoints.get-token}") private String getTokenEndpoint; @Value("${lsfx.api.endpoints.upload-file}") private String uploadFileEndpoint; @Value("${lsfx.api.endpoints.fetch-inner-flow}") private String fetchInnerFlowEndpoint; @Value("${lsfx.api.endpoints.check-parse-status}") private String checkParseStatusEndpoint; @Value("${lsfx.api.endpoints.get-bank-statement}") private String getBankStatementEndpoint; /** * 获取Token */ public GetTokenResponse getToken(GetTokenRequest request) { log.info("【流水分析】获取Token请求: projectNo={}, entityName={}", request.getProjectNo(), request.getEntityName()); long startTime = System.currentTimeMillis(); try { String secretCode = MD5Util.generateSecretCode( request.getProjectNo(), request.getEntityName(), appSecret ); request.setAppSecretCode(secretCode); request.setAppId(appId); if (request.getAnalysisType() == null) { request.setAnalysisType(LsfxConstants.ANALYSIS_TYPE); } if (request.getRole() == null) { request.setRole(LsfxConstants.DEFAULT_ROLE); } String url = baseUrl + getTokenEndpoint; GetTokenResponse response = httpUtil.postJson(url, request, null, GetTokenResponse.class); long elapsed = System.currentTimeMillis() - startTime; if (response != null && response.getData() != null) { log.info("【流水分析】获取Token成功: projectId={}, 耗时={}ms", response.getData().getProjectId(), elapsed); } else { log.warn("【流水分析】获取Token响应异常: 耗时={}ms", elapsed); } return response; } catch (LsfxApiException e) { log.error("【流水分析】获取Token失败: projectNo={}, error={}", request.getProjectNo(), e.getMessage(), e); throw e; } catch (Exception e) { log.error("【流水分析】获取Token未知异常: projectNo={}", request.getProjectNo(), e); throw new LsfxApiException("获取Token失败: " + e.getMessage(), e); } } /** * 上传文件 */ public UploadFileResponse uploadFile(Integer groupId, org.springframework.core.io.Resource file) { log.info("【流水分析】上传文件请求: groupId={}, fileName={}", groupId, file.getFilename()); long startTime = System.currentTimeMillis(); try { String url = baseUrl + uploadFileEndpoint; Map params = new HashMap<>(); params.put("groupId", groupId); params.put("files", file); Map headers = new HashMap<>(); headers.put(LsfxConstants.HEADER_CLIENT_ID, clientId); UploadFileResponse response = httpUtil.uploadFile(url, params, headers, UploadFileResponse.class); long elapsed = System.currentTimeMillis() - startTime; if (response != null && response.getData() != null) { log.info("【流水分析】上传文件成功: uploadStatus={}, 耗时={}ms", response.getData().getUploadStatus(), elapsed); } else { log.warn("【流水分析】上传文件响应异常: 耗时={}ms", elapsed); } return response; } catch (LsfxApiException e) { log.error("【流水分析】上传文件失败: groupId={}, error={}", groupId, e.getMessage(), e); throw e; } catch (Exception e) { log.error("【流水分析】上传文件未知异常: groupId={}", groupId, e); throw new LsfxApiException("上传文件失败: " + e.getMessage(), e); } } /** * 拉取行内流水 */ public FetchInnerFlowResponse fetchInnerFlow(FetchInnerFlowRequest request) { log.info("【流水分析】拉取行内流水请求: groupId={}, customerNo={}", request.getGroupId(), request.getCustomerNo()); long startTime = System.currentTimeMillis(); try { String url = baseUrl + fetchInnerFlowEndpoint; Map headers = new HashMap<>(); headers.put(LsfxConstants.HEADER_CLIENT_ID, clientId); FetchInnerFlowResponse response = httpUtil.postJson(url, request, headers, FetchInnerFlowResponse.class); long elapsed = System.currentTimeMillis() - startTime; if (response != null && response.getData() != null) { log.info("【流水分析】拉取行内流水完成: code={}, message={}, 耗时={}ms", response.getData().getCode(), response.getData().getMessage(), elapsed); } else { log.warn("【流水分析】拉取行内流水响应异常: 耗时={}ms", elapsed); } return response; } catch (LsfxApiException e) { log.error("【流水分析】拉取行内流水失败: groupId={}, error={}", request.getGroupId(), e.getMessage(), e); throw e; } catch (Exception e) { log.error("【流水分析】拉取行内流水未知异常: groupId={}", request.getGroupId(), e); throw new LsfxApiException("拉取行内流水失败: " + e.getMessage(), e); } } /** * 检查文件解析状态 */ public CheckParseStatusResponse checkParseStatus(Integer groupId, String inprogressList) { log.info("【流水分析】检查文件解析状态: groupId={}, inprogressList={}", groupId, inprogressList); long startTime = System.currentTimeMillis(); try { String url = baseUrl + checkParseStatusEndpoint; Map params = new HashMap<>(); params.put("groupId", groupId); params.put("inprogressList", inprogressList); Map headers = new HashMap<>(); headers.put(LsfxConstants.HEADER_CLIENT_ID, clientId); CheckParseStatusResponse response = httpUtil.postJson(url, params, headers, CheckParseStatusResponse.class); long elapsed = System.currentTimeMillis() - startTime; if (response != null && response.getData() != null) { log.info("【流水分析】检查解析状态完成: parsing={}, pendingList.size={}, 耗时={}ms", response.getData().getParsing(), response.getData().getPendingList() != null ? response.getData().getPendingList().size() : 0, elapsed); } else { log.warn("【流水分析】检查解析状态响应异常: 耗时={}ms", elapsed); } return response; } catch (LsfxApiException e) { log.error("【流水分析】检查解析状态失败: groupId={}, error={}", groupId, e.getMessage(), e); throw e; } catch (Exception e) { log.error("【流水分析】检查解析状态未知异常: groupId={}", groupId, e); throw new LsfxApiException("检查解析状态失败: " + e.getMessage(), e); } } /** * 获取银行流水(新版接口) * 注意: 需要传入logId参数,参数名已从pageNum改为pageNow * * @param request 请求参数(groupId, logId, pageNow, pageSize) * @return 流水明细列表 */ public GetBankStatementResponse getBankStatement(GetBankStatementRequest request) { log.info("【流水分析】获取银行流水请求: groupId={}, logId={}, pageNow={}, pageSize={}", request.getGroupId(), request.getLogId(), request.getPageNow(), request.getPageSize()); long startTime = System.currentTimeMillis(); try { String url = baseUrl + getBankStatementEndpoint; Map headers = new HashMap<>(); headers.put(LsfxConstants.HEADER_CLIENT_ID, clientId); GetBankStatementResponse response = httpUtil.postJson(url, request, headers, GetBankStatementResponse.class); long elapsed = System.currentTimeMillis() - startTime; if (response != null && response.getData() != null) { log.info("【流水分析】获取银行流水成功: totalCount={}, 耗时={}ms", response.getData().getTotalCount(), elapsed); } else { log.warn("【流水分析】获取银行流水响应异常: 耗时={}ms", elapsed); } return response; } catch (LsfxApiException e) { log.error("【流水分析】获取银行流水失败: groupId={}, logId={}, error={}", request.getGroupId(), request.getLogId(), e.getMessage(), e); throw e; } catch (Exception e) { log.error("【流水分析】获取银行流水未知异常: groupId={}, logId={}", request.getGroupId(), request.getLogId(), e); throw new LsfxApiException("获取银行流水失败: " + e.getMessage(), e); } } }