记得上下班打卡 | git大法好,push需谨慎

Commit 271d0ef2 authored by 姜秀龙's avatar 姜秀龙

订单处理

parent 8b1bec4f
......@@ -190,9 +190,9 @@ public class JxlDataKylinOrderController {
"JOIN kylin_order_ticket_status as kts ON kts.order_id = kot.order_tickets_id " +
"WHERE 1 = 1 " +
// "AND kts.status = 0 " +
// "AND kts.status = 2 " +
"AND kts.status = 1 " +
"AND kot.order_code = '572738923375898624308034090' " +
"AND kts.status = 2 " +
// "AND kts.status = 1 " +
"AND kot.order_code = '572744630768259072602399699' " +
"AND kot.performance_title = '2025珠海草莓音乐节' " +
"AND do.status = 1";
......@@ -480,4 +480,173 @@ public class JxlDataKylinOrderController {
}
}
@GetMapping("KO005")
@ApiOperation("修复订单支付状态 - admin显示已付款 用户显示取消中")
public ResponseDto KO005() {
try {
log.info("开始批量修复订单支付状态");
// 第一步:查询所有需要修复的订单(支付成功但订单状态未更新的)
log.info("第一步:查询所有需要修复的订单");
String findOrdersSql = "SELECT kot.order_tickets_id, kot.pay_code, kot.order_code, kts.status, kot.user_id " +
"FROM kylin_order_tickets as kot " +
"JOIN dragon_orders as do ON do.code = kot.pay_code " +
"JOIN kylin_order_ticket_status as kts ON kts.order_id = kot.order_tickets_id " +
"WHERE 1 = 1 " +
"AND kts.status = 1 " +
// "AND kot.order_code like '%0331891531%' " +
"AND kot.performance_title = '2025珠海草莓音乐节' " +
"AND do.status = 1";
Connection connection = DriverManager.getConnection(SQL_URL, SQL_USER, SQL_PWD);
PreparedStatement stmt = connection.prepareStatement(findOrdersSql);
ResultSetImpl rs = (ResultSetImpl) stmt.executeQuery();
int totalCount = 0;
int successCount = 0;
int skipCount = 0; // 跳过的订单数(有退款申请的)
int failCount = 0;
// 错误记录列表
java.util.List<String> errorList = new java.util.ArrayList<>();
// 第二步:逐个修复订单
log.info("第二步:开始逐个修复订单");
while (rs.next()) {
totalCount++;
String orderTicketsId = rs.getString("order_tickets_id");
String orderCode = rs.getString("order_code");
String userId = rs.getString("user_id");
try {
log.info("正在修复订单 {} - orderCode: {}, orderTicketsId: {}", totalCount, orderCode, orderTicketsId);
// 第二步补充:检查是否有退款申请记录,有退款申请的不处理
String checkRefundSql = "SELECT COUNT(1) as refund_count FROM kylin_order_refunds WHERE order_tickets_id = ?";
PreparedStatement refundStmt = connection.prepareStatement(checkRefundSql);
refundStmt.setString(1, orderTicketsId);
ResultSetImpl refundRs = (ResultSetImpl) refundStmt.executeQuery();
int refundCount = 0;
if (refundRs.next()) {
refundCount = refundRs.getInt("refund_count");
}
if (refundCount > 0) {
skipCount++;
String errorMsg = String.format("订单存在退款申请记录,跳过修复 - orderCode: %s, 退款记录数: %d", orderCode, refundCount);
log.warn(errorMsg);
errorList.add("SKIP_REFUND: " + errorMsg);
continue;
}
// 第三步:查询MongoDB中的订单状态是否为 1 如果为 1 更新 继续redis 如果不为 1 记录错误跳过
log.info("第三步:检查MongoDB中的订单状态");
// 先查询MongoDB中的订单状态
Query mongoQuery = Query.query(Criteria.where("orderTicketsId").is(orderTicketsId));
KylinOrderTicketVo mongoOrder = mongoTemplate.findOne(mongoQuery, KylinOrderTicketVo.class, KylinOrderTicketVo.class.getSimpleName());
if (mongoOrder == null) {
failCount++;
String errorMsg = String.format("MongoDB中未找到订单,跳过修复 - orderCode: %s, orderTicketsId: %s", orderCode, orderTicketsId);
log.error(errorMsg);
errorList.add("MONGO_NOT_FOUND: " + errorMsg);
continue;
}
// 检查MongoDB中的订单状态是否为1(已支付)
if (mongoOrder.getStatus() == null || mongoOrder.getStatus() != 1) {
// 获取支付信息
String verifySql = "SELECT do.payment_id, do.payment_type, do.payment_at " +
"FROM kylin_order_tickets as kot " +
"JOIN dragon_orders as do ON do.code = kot.pay_code " +
"WHERE kot.order_code = ? AND do.status = 1";
PreparedStatement payStmt = connection.prepareStatement(verifySql);
payStmt.setString(1, orderCode);
ResultSetImpl payRs = (ResultSetImpl) payStmt.executeQuery();
String paymentId = null;
String paymentType = null;
String paymentAt = null;
if (payRs.next()) {
paymentId = payRs.getString("payment_id");
paymentType = payRs.getString("payment_type");
paymentAt = payRs.getString("payment_at");
}
// MongoDB状态正确,更新订单状态(确保状态一致)
Document orderUpdateDoc = new Document("$set", new Document()
.append("paymentType", paymentType)
.append("paymentId", paymentId)
.append("timePay", paymentAt)
.append("status", 1)
.append("payStatus", 1)
);
mongoTemplate.getCollection(KylinOrderTicketVo.class.getSimpleName()).updateOne(
Query.query(Criteria.where("orderTicketsId").is(orderTicketsId)).getQueryObject(),
orderUpdateDoc
);
log.info("MongoDB订单状态更新完成 - orderCode: {}", orderCode);
// failCount++;
// String errorMsg = String.format("MongoDB中订单状态不为1,跳过修复 - orderCode: %s, MongoDB状态: %s", orderCode, mongoOrder.getStatus());
// log.error(errorMsg);
// errorList.add("MONGO_STATUS_ERROR: " + errorMsg);
// continue;
}
// 第四步:清理Redis缓存
redisDataSourceUtil.getRedisKylinUtil().del(KylinRedisConst.ORDER + orderTicketsId);
redisDataSourceUtil.getRedisKylinUtil().del(KylinRedisConst.ORDER_LIST + userId);
successCount++;
log.info("订单修复成功 - orderCode: {}", orderCode);
} catch (Exception e) {
failCount++;
String errorMsg = String.format("订单修复异常失败 - orderCode: %s, error: %s", orderCode, e.getMessage());
log.error(errorMsg, e);
errorList.add("EXCEPTION: " + errorMsg);
}
}
connection.close();
// 打印详细的错误信息
if (!errorList.isEmpty()) {
log.error("=== 详细错误信息 ===");
for (int i = 0; i < errorList.size(); i++) {
log.error("错误 {}: {}", i + 1, errorList.get(i));
}
log.error("=== 错误信息结束 ===");
}
// 验证计数是否正确
int calculatedTotal = successCount + skipCount + failCount;
if (calculatedTotal != totalCount) {
log.warn("计数验证失败!总数: {}, 计算总数: {} (成功: {} + 跳过: {} + 失败: {})",
totalCount, calculatedTotal, successCount, skipCount, failCount);
}
log.info("批量修复完成 - 总数: {}, 成功: {}, 跳过: {}, 失败: {}", totalCount, successCount, skipCount, failCount);
String resultMsg = String.format("批量修复完成!总数: %d, 成功: %d, 跳过: %d, 失败: %d",
totalCount, successCount, skipCount, failCount);
if (!errorList.isEmpty()) {
resultMsg += "\n详细错误信息:\n" + String.join("\n", errorList);
}
return ResponseDto.success(resultMsg);
} catch (Exception e) {
log.error("批量修复订单支付状态失败, error: ", e);
return ResponseDto.failure("批量修复失败: " + e.getMessage());
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment