Browse Source

2026-02-10

标签变动记录【手动重试】优化
master
fengyuan_yang 4 months ago
parent
commit
1965000b6f
  1. 75
      src/main/java/com/gaotao/modules/erp/service/impl/ErpInterfaceServiceImpl.java
  2. 16
      src/main/java/com/gaotao/modules/sys/dao/InterfaceLogDao.java
  3. 35
      src/main/resources/mapper/sys/InterfaceLogDao.xml

75
src/main/java/com/gaotao/modules/erp/service/impl/ErpInterfaceServiceImpl.java

@ -698,6 +698,7 @@ public class ErpInterfaceServiceImpl implements ErpInterfaceService {
* @return 调用结果 {success: true/false, message: "...", u8CCode: "..."} * @return 调用结果 {success: true/false, message: "...", u8CCode: "..."}
*/ */
@Override @Override
@Transactional(rollbackFor = Exception.class)
public Map<String, Object> syncCallErpInterface(String site, String buNo, String transactionId) { public Map<String, Object> syncCallErpInterface(String site, String buNo, String transactionId) {
logger.info("同步调用ERP接口 - site: {}, buNo: {}, transactionId: {}", site, buNo, transactionId); logger.info("同步调用ERP接口 - site: {}, buNo: {}, transactionId: {}", site, buNo, transactionId);
@ -730,7 +731,8 @@ public class ErpInterfaceServiceImpl implements ErpInterfaceService {
ApiInterfaceEntity apiInterface = apiInterfaceDao.getByInterfaceName(site, buNo, interfaceName); ApiInterfaceEntity apiInterface = apiInterfaceDao.getByInterfaceName(site, buNo, interfaceName);
if (apiInterface == null) { if (apiInterface == null) {
logger.error("未找到接口配置 - interfaceName: {}", interfaceName); logger.error("未找到接口配置 - interfaceName: {}", interfaceName);
saveFailureLog(site, buNo, transactionId, interfaceName, transactionLogs, "未找到接口配置");
// 失败时更新或新增api_log
updateOrInsertApiLog(site, buNo, transactionId, interfaceName, transactionLogs, "未找到接口配置", null);
result.put("message", "未找到接口配置: " + interfaceName); result.put("message", "未找到接口配置: " + interfaceName);
return result; return result;
} }
@ -764,28 +766,34 @@ public class ErpInterfaceServiceImpl implements ErpInterfaceService {
String flag = jsonResponse.getString("Flag"); String flag = jsonResponse.getString("Flag");
if ("success".equalsIgnoreCase(flag)) { if ("success".equalsIgnoreCase(flag)) {
// 成功更新StockTransactionLog
// 成功更新StockTransactionLog和api_log
String u8CCode = jsonResponse.getString("U8CCode"); String u8CCode = jsonResponse.getString("U8CCode");
logger.info("ERP接口调用成功 - U8单号: {}", u8CCode); logger.info("ERP接口调用成功 - U8单号: {}", u8CCode);
// 更新StockTransactionLog为成功
stockTransactionLogDao.updateSyncedSuccess(site, buNo, transactionId); stockTransactionLogDao.updateSyncedSuccess(site, buNo, transactionId);
// 更新api_log表成功时设置need_retry_flag=0
updateApiLogOnSuccess(site, transactionId, responseBody);
result.put("success", true); result.put("success", true);
result.put("message", "接口调用成功"); result.put("message", "接口调用成功");
result.put("u8CCode", u8CCode != null ? u8CCode : ""); result.put("u8CCode", u8CCode != null ? u8CCode : "");
} else { } else {
// 失败记录到api_log
// 失败更新或新增api_log
String errMsg = jsonResponse.getString("ErrMsg"); String errMsg = jsonResponse.getString("ErrMsg");
logger.error("ERP接口调用失败 - 错误: {}", errMsg); logger.error("ERP接口调用失败 - 错误: {}", errMsg);
saveFailureLog(site, buNo, transactionId, interfaceName, transactionLogs, errMsg);
// 失败时更新或新增api_log
updateOrInsertApiLog(site, buNo, transactionId, interfaceName, transactionLogs, errMsg, responseBody);
result.put("message", errMsg != null ? errMsg : "接口调用失败"); result.put("message", errMsg != null ? errMsg : "接口调用失败");
} }
} catch (Exception e) { } catch (Exception e) {
logger.error("调用ERP接口异常 - transactionId: {}, error: {}", transactionId, e.getMessage(), e); logger.error("调用ERP接口异常 - transactionId: {}, error: {}", transactionId, e.getMessage(), e);
saveFailureLog(site, buNo, transactionId, interfaceName, transactionLogs, "接口调用异常: " + e.getMessage());
// 异常时更新或新增api_log
updateOrInsertApiLog(site, buNo, transactionId, interfaceName, transactionLogs, "接口调用异常: " + e.getMessage(), null);
result.put("message", "接口调用异常: " + e.getMessage()); result.put("message", "接口调用异常: " + e.getMessage());
} }
@ -797,6 +805,63 @@ public class ErpInterfaceServiceImpl implements ErpInterfaceService {
return result; return result;
} }
/**
* 更新api_log表ERP接口调用成功时
*/
private void updateApiLogOnSuccess(String site, String transactionId, String responseData) {
try {
// 检查api_log中是否已存在该transactionId的记录
Map<String, Object> existingLog = interfaceLogDao.getApiLogByTransactionId(site, transactionId);
if (existingLog != null) {
// 如果存在更新记录成功时设置status_code=200, need_retry_flag=0
interfaceLogDao.updateApiLogByTransactionId(
site,
transactionId,
"200", // statusCode
"接口调用成功", // message
0, // needRetryFlag0表示不需要重试
responseData // lastResponseData
);
logger.info("成功更新api_log表 - transactionId: {}", transactionId);
} else {
logger.info("api_log表中不存在该记录,跳过更新 - transactionId: {}", transactionId);
}
} catch (Exception e) {
logger.error("更新api_log表失败 - transactionId: {}, error: {}", transactionId, e.getMessage(), e);
}
}
/**
* 更新或新增api_log表ERP接口调用失败时
*/
private void updateOrInsertApiLog(String site, String buNo, String transactionId, String interfaceName,
List<StockTransactionLogEntity> transactionLogs, String errorMsg, String responseData) {
try {
// 检查api_log中是否已存在该transactionId的记录
Map<String, Object> existingLog = interfaceLogDao.getApiLogByTransactionId(site, transactionId);
if (existingLog != null) {
// 如果存在更新记录失败时设置status_code=500, need_retry_flag=1
interfaceLogDao.updateApiLogByTransactionId(
site,
transactionId,
"500", // statusCode
errorMsg, // message
1, // needRetryFlag1表示需要重试
responseData // lastResponseData
);
logger.info("成功更新api_log表 - transactionId: {}", transactionId);
} else {
// 如果不存在新增记录
logger.info("api_log表中不存在该记录,开始新增 - transactionId: {}", transactionId);
saveFailureLog(site, buNo, transactionId, interfaceName, transactionLogs, errorMsg);
}
} catch (Exception e) {
logger.error("更新或新增api_log表失败 - transactionId: {}, error: {}", transactionId, e.getMessage(), e);
}
}
/** /**
* 格式化日期 * 格式化日期
*/ */

16
src/main/java/com/gaotao/modules/sys/dao/InterfaceLogDao.java

@ -77,6 +77,22 @@ public interface InterfaceLogDao extends BaseMapper<ApiLogEntity> {
@Param("requestId") String requestId, @Param("requestId") String requestId,
@Param("requestGroupId") Integer requestGroupId, @Param("requestGroupId") Integer requestGroupId,
@Param("interfaceName") String interfaceName); @Param("interfaceName") String interfaceName);
/**
* 根据site和transactionId查询api_log是否存在
*/
Map<String, Object> getApiLogByTransactionId(@Param("site") String site,
@Param("transactionId") String transactionId);
/**
* 根据transactionId更新api_log记录用于手动重试
*/
int updateApiLogByTransactionId(@Param("site") String site,
@Param("transactionId") String transactionId,
@Param("statusCode") String statusCode,
@Param("message") String message,
@Param("needRetryFlag") Integer needRetryFlag,
@Param("lastResponseData") String lastResponseData);
} }

35
src/main/resources/mapper/sys/InterfaceLogDao.xml

@ -199,6 +199,41 @@
and interface_name = #{interfaceName} and interface_name = #{interfaceName}
</update> </update>
<!-- 根据site和transactionId查询api_log是否存在 -->
<select id="getApiLogByTransactionId" resultType="map">
SELECT TOP 1
id,
site,
bu_no AS buNo,
request_id AS requestId,
transaction_id AS transactionId,
interface_name AS interfaceName,
request_group_id AS requestGroupId,
status_code AS statusCode,
message,
need_retry_flag AS needRetryFlag,
retry_count AS retryCount,
last_response_data AS lastResponseData,
last_retry_time AS lastRetryTime
FROM api_log WITH(NOLOCK)
WHERE site = #{site}
AND transaction_id = #{transactionId}
ORDER BY created_date DESC
</select>
<!-- 根据transactionId更新api_log记录(用于手动重试) -->
<update id="updateApiLogByTransactionId">
UPDATE api_log
SET status_code = #{statusCode},
message = #{message},
need_retry_flag = #{needRetryFlag},
last_response_data = #{lastResponseData},
retry_count = ISNULL(retry_count, 0) + 1,
last_retry_time = GETDATE()
WHERE site = #{site}
AND transaction_id = #{transactionId}
</update>
<!-- 查询接口配置信息 --> <!-- 查询接口配置信息 -->
<select id="queryApiInterface" resultType="com.gaotao.modules.sys.entity.ApiInterfaceEntity"> <select id="queryApiInterface" resultType="com.gaotao.modules.sys.entity.ApiInterfaceEntity">
SELECT SELECT

Loading…
Cancel
Save