xuzhancheng há 2 semanas atrás
pai
commit
476c97681e

+ 135 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/MqTestController.java

@@ -0,0 +1,135 @@
+package cn.start.tz.module.pressure2.controller.admin;
+
+import cn.start.tz.framework.common.pojo.CommonResult;
+import cn.start.tz.module.pressure2.mq.message.JSPayConChargeEventMessage;
+import cn.start.tz.module.pressure2.mq.message.PayChargeEventMessage;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.annotation.Resource;
+import jakarta.annotation.security.PermitAll;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.rocketmq.spring.core.RocketMQTemplate;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static cn.start.tz.framework.common.pojo.CommonResult.success;
+
+
+@Tag(name = "管理后台 - Pressure2Test")
+@RestController
+@RequestMapping("/pressure2/test")
+@Validated
+@Slf4j
+public class MqTestController {
+
+    @Resource
+    private RocketMQTemplate rocketMQTemplate;
+
+    @GetMapping("/get")
+    @Operation(summary = "获取 test 信息")
+    public CommonResult<String> get() {
+        return success("true");
+    }
+
+    @GetMapping("/mq/test-pay-charge")
+    @Operation(summary = "测试 PayChargeStatusSendConsumer 监听")
+    @PermitAll
+    public CommonResult<String> testPayChargeStatusSendConsumer() {
+        log.info("开始测试 PayChargeStatusSendConsumer...");
+        
+        PayChargeEventMessage message = new PayChargeEventMessage();
+        message.setEventType(1); // 1.缴费
+        message.setChargeType(1); // 1.委托服务费
+        message.setChargeTime("2024-01-15 10:30:00");
+        
+        // 构造JSON格式的taskList
+        String taskListJson = "[{\"taskNo\":\"TEST20240115001\",\"chargeAmount\":100.00,\"inData\":\"4\"}]";
+        message.setTaskList(taskListJson);
+        
+        rocketMQTemplate.convertAndSend("js_pay_service_charge_status", message);
+        
+        log.info("测试消息已发送到 js_pay_service_charge_status");
+        return success("测试消息已发送,请查看消费者日志");
+    }
+
+    @GetMapping("/mq/test-pay-charge-cancel")
+    @Operation(summary = "测试 PayChargeStatusSendConsumer 解除缴费监听")
+    @PermitAll
+    public CommonResult<String> testPayChargeStatusSendConsumerCancel() {
+        log.info("开始测试 PayChargeStatusSendConsumer 解除缴费...");
+        
+        PayChargeEventMessage message = new PayChargeEventMessage();
+        message.setEventType(2); // 2.解除缴费
+        message.setChargeType(1);
+        message.setChargeTime("2024-01-15 10:35:00");
+        
+        String taskListJson = "[{\"taskNo\":\"TEST20240115001\",\"chargeAmount\":100.00,\"inData\":\"4\"}]";
+        message.setTaskList(taskListJson);
+        
+        rocketMQTemplate.convertAndSend("js_pay_service_charge_status", message);
+        
+        log.info("解除缴费测试消息已发送到 js_pay_service_charge_status");
+        return success("解除缴费测试消息已发送,请查看消费者日志");
+    }
+
+    @GetMapping("/mq/test-js-pay")
+    @Operation(summary = "测试 JSPayConChargeConsumer 监听")
+    @PermitAll
+    public CommonResult<String> testJSPayConChargeConsumer() {
+        log.info("开始测试 JSPayConChargeConsumer...");
+        
+        JSPayConChargeEventMessage message = new JSPayConChargeEventMessage();
+        message.setEventType(1); // 1.缴费
+        message.setChargeType(1);
+        message.setChargeTime("2024-01-15 10:40:00");
+        message.setContractNo("CONTRACT2024001");
+        message.setUnitcode("UNIT001");
+        message.setUnitname("测试单位");
+        
+        // 构造taskList
+        List<JSPayConChargeEventMessage.TaskInfo> taskList = new ArrayList<>();
+        JSPayConChargeEventMessage.TaskInfo taskInfo = new JSPayConChargeEventMessage.TaskInfo();
+        taskInfo.setTaskNo("JS_TEST20240115001");
+        taskInfo.setTaskinfoid("TASK_ID_001");
+        taskInfo.setInData("4"); // 承压类型
+        taskList.add(taskInfo);
+        message.setTaskList(taskList);
+        
+        rocketMQTemplate.convertAndSend("js_pay_con_charge", message);
+        
+        log.info("测试消息已发送到 js_pay_con_charge");
+        return success("测试消息已发送,请查看消费者日志");
+    }
+
+    @GetMapping("/mq/test-js-pay-cancel")
+    @Operation(summary = "测试 JSPayConChargeConsumer 解除缴费监听")
+    @PermitAll
+    public CommonResult<String> testJSPayConChargeConsumerCancel() {
+        log.info("开始测试 JSPayConChargeConsumer 解除缴费...");
+        
+        JSPayConChargeEventMessage message = new JSPayConChargeEventMessage();
+        message.setEventType(2); // 2.解除缴费
+        message.setChargeType(1);
+        message.setChargeTime("2024-01-15 10:45:00");
+        message.setContractNo("CONTRACT2024001");
+        
+        List<JSPayConChargeEventMessage.TaskInfo> taskList = new ArrayList<>();
+        JSPayConChargeEventMessage.TaskInfo taskInfo = new JSPayConChargeEventMessage.TaskInfo();
+        taskInfo.setTaskNo("JS_TEST20240115001");
+        taskInfo.setTaskinfoid("TASK_ID_001");
+        taskInfo.setInData("4");
+        taskList.add(taskInfo);
+        message.setTaskList(taskList);
+        
+        rocketMQTemplate.convertAndSend("js_pay_con_charge", message);
+        
+        log.info("解除缴费测试消息已发送到 js_pay_con_charge");
+        return success("解除缴费测试消息已发送,请查看消费者日志");
+    }
+
+}

+ 95 - 95
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/mq/consumer/JSPayConChargeConsumer.java

@@ -1,95 +1,95 @@
-//package cn.start.tz.module.pressure2.mq.consumer;
-//
-//
-//
-//import cn.start.tz.module.pressure2.api.taskorder.BoilerTaskOrderApi;
-//import cn.start.tz.module.pressure2.api.taskorder.dto.UpdatePayStatusDTO;
-//import cn.start.tz.module.pressure2.mq.message.JSPayConChargeEventMessage;
-//import com.fasterxml.jackson.databind.ObjectMapper;
-//import jakarta.annotation.Resource;
-//import lombok.extern.slf4j.Slf4j;
-//import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
-//import org.apache.rocketmq.spring.core.RocketMQListener;
-//import org.springframework.context.event.EventListener;
-//import org.springframework.stereotype.Component;
-//
-//import java.util.List;
-//
-//@Component
-//@RocketMQMessageListener( // 重点:添加 @RocketMQMessageListener 注解,声明消费的 topic
-//        topic = "js_pay_con_charge",
-//        consumerGroup = "js_pay_con_charge" + "_" + "${spring.profiles.active}"
-//)
-//
-//@Slf4j
-//public class JSPayConChargeConsumer implements RocketMQListener<JSPayConChargeEventMessage> {
-//
-//    @Resource
-//    private BoilerTaskOrderApi taskOrderApi;
-//
-//    @Resource
-//    private ObjectMapper objectMapper;
-//
-//    @EventListener
-//    // @Async // Spring Event 默认在 Producer 发送的线程,通过 @Async 实现异步
-//    @Override
-//    public void onMessage(JSPayConChargeEventMessage message) {
-//        log.info("JSPayConChargeConsumer [onMessage][消息内容({})]", message);
-//
-//        if("1".equals(message.getEventType()+"")){
-//            //费用事件:1.缴费 2.解除认领
-//            if(message.getTaskList() != null && !message.getTaskList().isEmpty()){
-//                try {
-//                    List<JSPayConChargeEventMessage.TaskInfo> taskInfos = message.getTaskList();
-//                    for (JSPayConChargeEventMessage.TaskInfo taskInfo :taskInfos){
-//                        if("4".equals(taskInfo.getInData())){
-//                            //承压
-//                            log.info("PayChargeStatusSendConsumer 承压支付回调 {}", taskInfo.getTaskNo());
-//                            UpdatePayStatusDTO payInfo = new UpdatePayStatusDTO();
-//                            payInfo.setOrderNo(taskInfo.getTaskNo());
-//                            payInfo.setChargeTime(message.getChargeTime());
-//                            payInfo.setFeeType(200);
-//                            taskOrderApi.updatePayStatus(payInfo);
-//                        }else if("5".equals(taskInfo.getInData())){
-//                            // 实验室
-//
-//                        }else{
-//                            log.warn("[onMessage][消息内容({})]", taskInfo.getInData());
-//                        }
-//                    }
-//
-//                }catch (Exception e){
-//                    log.error("PayChargeStatusSendConsumer error ", e);
-//                }
-//            }
-//
-//        }else if("2".equals(message.getEventType()+"")){
-//            try {
-//                List<JSPayConChargeEventMessage.TaskInfo> taskInfos = message.getTaskList();
-//                for (JSPayConChargeEventMessage.TaskInfo taskInfo :taskInfos){
-//                    if("4".equals(taskInfo.getInData())){
-//                        //承压
-//                        log.info("PayChargeStatusSendConsumer 承压支付解除回调 {}", taskInfo.getTaskNo());
-//                        UpdatePayStatusDTO payInfo = new UpdatePayStatusDTO();
-//                        payInfo.setOrderNo(taskInfo.getTaskNo());
-//                        payInfo.setChargeTime(message.getChargeTime());
-//                        payInfo.setIsCancel(true);
-//
-//                        taskOrderApi.updatePayStatus(payInfo);
-//                    }else if("5".equals(taskInfo.getInData())){
-//                        // 实验室
-//
-//                    }else{
-//                        log.warn("[onMessage][消息内容({})]", taskInfo.getInData());
-//                    }
-//                }
-//
-//            }catch (Exception e){
-//                log.error("PayChargeStatusSendConsumer error ", e);
-//            }
-//        }
-//
-//    }
-//
-//
-//}
+package cn.start.tz.module.pressure2.mq.consumer;
+
+
+
+import cn.start.tz.module.pressure2.api.taskorder.BoilerTaskOrderApi;
+import cn.start.tz.module.pressure2.api.taskorder.dto.UpdatePayStatusDTO;
+import cn.start.tz.module.pressure2.mq.message.JSPayConChargeEventMessage;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
+import org.apache.rocketmq.spring.core.RocketMQListener;
+import org.springframework.context.event.EventListener;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+@Component
+@RocketMQMessageListener( // 重点:添加 @RocketMQMessageListener 注解,声明消费的 topic
+        topic = "js_pay_con_charge",
+        consumerGroup = "js_pay_con_charge" + "_pressure2_" + "${spring.profiles.active}"
+)
+
+@Slf4j
+public class JSPayConChargeConsumer implements RocketMQListener<JSPayConChargeEventMessage> {
+
+    @Resource
+    private BoilerTaskOrderApi taskOrderApi;
+
+    @Resource
+    private ObjectMapper objectMapper;
+
+    @EventListener
+    // @Async // Spring Event 默认在 Producer 发送的线程,通过 @Async 实现异步
+    @Override
+    public void onMessage(JSPayConChargeEventMessage message) {
+        log.info("JSPayConChargeConsumer [onMessage][消息内容({})]", message);
+
+        if("1".equals(message.getEventType()+"")){
+            //费用事件:1.缴费 2.解除认领
+            if(message.getTaskList() != null && !message.getTaskList().isEmpty()){
+                try {
+                    List<JSPayConChargeEventMessage.TaskInfo> taskInfos = message.getTaskList();
+                    for (JSPayConChargeEventMessage.TaskInfo taskInfo :taskInfos){
+                        if("4".equals(taskInfo.getInData())){
+                            //承压
+                            log.info("PayChargeStatusSendConsumer 承压支付回调 {}", taskInfo.getTaskNo());
+                            UpdatePayStatusDTO payInfo = new UpdatePayStatusDTO();
+                            payInfo.setOrderNo(taskInfo.getTaskNo());
+                            payInfo.setChargeTime(message.getChargeTime());
+                            payInfo.setFeeType(200);
+                            taskOrderApi.updatePayStatus(payInfo);
+                        }else if("5".equals(taskInfo.getInData())){
+                            // 实验室
+
+                        }else{
+                            log.warn("[onMessage][消息内容({})]", taskInfo.getInData());
+                        }
+                    }
+
+                }catch (Exception e){
+                    log.error("PayChargeStatusSendConsumer error ", e);
+                }
+            }
+
+        }else if("2".equals(message.getEventType()+"")){
+            try {
+                List<JSPayConChargeEventMessage.TaskInfo> taskInfos = message.getTaskList();
+                for (JSPayConChargeEventMessage.TaskInfo taskInfo :taskInfos){
+                    if("4".equals(taskInfo.getInData())){
+                        //承压
+                        log.info("PayChargeStatusSendConsumer 承压支付解除回调 {}", taskInfo.getTaskNo());
+                        UpdatePayStatusDTO payInfo = new UpdatePayStatusDTO();
+                        payInfo.setOrderNo(taskInfo.getTaskNo());
+                        payInfo.setChargeTime(message.getChargeTime());
+                        payInfo.setIsCancel(true);
+
+                        taskOrderApi.updatePayStatus(payInfo);
+                    }else if("5".equals(taskInfo.getInData())){
+                        // 实验室
+
+                    }else{
+                        log.warn("[onMessage][消息内容({})]", taskInfo.getInData());
+                    }
+                }
+
+            }catch (Exception e){
+                log.error("PayChargeStatusSendConsumer error ", e);
+            }
+        }
+
+    }
+
+
+}

+ 167 - 167
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/mq/consumer/PayChargeStatusSendConsumer.java

@@ -1,167 +1,167 @@
-//package cn.start.tz.module.pressure2.mq.consumer;
-//
-//import cn.start.tz.module.pressure2.api.taskorder.BoilerTaskOrderApi;
-//import cn.start.tz.module.pressure2.api.taskorder.dto.UpdatePayStatusDTO;
-//import cn.start.tz.module.pressure2.mq.message.PayChargeEventMessage;
-//import com.fasterxml.jackson.databind.JsonNode;
-//import com.fasterxml.jackson.databind.ObjectMapper;
-//import com.fasterxml.jackson.databind.node.ArrayNode;
-//import jakarta.annotation.Resource;
-//import lombok.extern.slf4j.Slf4j;
-//import org.apache.commons.lang3.StringUtils;
-//import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
-//import org.apache.rocketmq.spring.core.RocketMQListener;
-//import org.springframework.context.event.EventListener;
-//import org.springframework.stereotype.Component;
-//
-//@Component
-//@RocketMQMessageListener( // 重点:添加 @RocketMQMessageListener 注解,声明消费的 topic
-//        topic = "js_pay_service_charge_status",
-//        consumerGroup = "js_pay_service_charge_status" + "_" + "${spring.profiles.active}"
-//)
-//
-//@Slf4j
-//public class PayChargeStatusSendConsumer implements RocketMQListener<PayChargeEventMessage> {
-//
-//
-//    @Resource
-//    private BoilerTaskOrderApi taskOrderApi;
-//
-//    @Resource
-//    private ObjectMapper objectMapper;
-//
-//    /**
-//     * 健壮的JSON解析方法,处理格式问题
-//     */
-//    private PayChargeEventMessage.TaskInfo[] parseTaskList(String taskListJson) {
-//        if (StringUtils.isBlank(taskListJson)) {
-//            return new PayChargeEventMessage.TaskInfo[0];
-//        }
-//
-//        try {
-//            // 首先尝试直接解析
-//            return objectMapper.readValue(taskListJson, PayChargeEventMessage.TaskInfo[].class);
-//        } catch (Exception e) {
-//            log.warn("直接JSON解析失败,尝试修复格式,错误: {}", e.getMessage());
-//
-//            try {
-//                // 尝试解析为JsonNode以便修复
-//                JsonNode rootNode = objectMapper.readTree(taskListJson);
-//
-//                if (rootNode.isArray()) {
-//                    // 如果是数组,直接转换
-//                    return objectMapper.convertValue(rootNode, PayChargeEventMessage.TaskInfo[].class);
-//                } else if (rootNode.isObject()) {
-//                    // 如果是单个对象,包装成数组
-//                    ArrayNode arrayNode = objectMapper.createArrayNode();
-//                    arrayNode.add(rootNode);
-//                    return objectMapper.convertValue(arrayNode, PayChargeEventMessage.TaskInfo[].class);
-//                } else {
-//                    log.error("无法解析的JSON格式,既不是数组也不是对象: {}", taskListJson);
-//                    return new PayChargeEventMessage.TaskInfo[0];
-//                }
-//            } catch (Exception e2) {
-//                log.error("JSON修复失败,原始数据: {}", taskListJson, e2);
-//                return new PayChargeEventMessage.TaskInfo[0];
-//            }
-//        }
-//    }
-//
-//    @EventListener
-//    // @Async // Spring Event 默认在 Producer 发送的线程,通过 @Async 实现异步
-//    @Override
-//    public void onMessage(PayChargeEventMessage message) {
-//        log.info("PayChargeStatusSendConsumer [onMessage][消息内容({})]", message);
-//
-//        //费用事件:1.缴费 2.解除认领
-//        if("1".equals(message.getEventType()+"")){
-//            if(StringUtils.isNotBlank(message.getTaskList())){
-//                // 使用健壮的解析方法
-//                PayChargeEventMessage.TaskInfo[] taskInfos = parseTaskList(message.getTaskList());
-//
-//                if (taskInfos.length == 0) {
-//                    log.warn("PayChargeStatusSendConsumer 解析到空的taskList数据");
-//                    return;
-//                }
-//
-//                log.info("PayChargeStatusSendConsumer 成功解析到{}条任务记录", taskInfos.length);
-//
-//                for (PayChargeEventMessage.TaskInfo taskInfo : taskInfos) {
-//                    try {
-//                        if("4".equals(taskInfo.getInData())){
-//                            //承压
-//                            log.info("PayChargeStatusSendConsumer 承压支付回调 {} - 金额: {}",
-//                                   taskInfo.getTaskNo(), taskInfo.getChargeAmount());
-//                            UpdatePayStatusDTO payInfo = new UpdatePayStatusDTO();
-//                            payInfo.setOrderNo(taskInfo.getTaskNo());
-//                            payInfo.setChargeTime(message.getChargeTime());
-//                            payInfo.setChargeAmount(taskInfo.getChargeAmount());
-//
-//                            taskOrderApi.updatePayStatus(payInfo);
-//                        } else if("5".equals(taskInfo.getInData())){
-//                            // 实验室
-//                            log.info("PayChargeStatusSendConsumer 实验室支付回调 {} - 金额: {}",
-//                                   taskInfo.getTaskNo(), taskInfo.getChargeAmount());
-//                        } else {
-//                            log.warn("PayChargeStatusSendConsumer 未知业务类型 inData: {}, taskNo: {}",
-//                                   taskInfo.getInData(), taskInfo.getTaskNo());
-//                        }
-//                    } catch (Exception e) {
-//                        log.error("PayChargeStatusSendConsumer 处理单条记录失败, taskNo: {}, 错误: {}",
-//                                taskInfo.getTaskNo(), e.getMessage(), e);
-//                        // 继续处理其他记录,不因为单条记录失败而中断
-//                    }
-//                }
-//            } else {
-//                log.warn("PayChargeStatusSendConsumer taskList为空");
-//            }
-//        }else if("2".equals(message.getEventType()+"")){
-//            if(StringUtils.isNotBlank(message.getTaskList())){
-//                // 使用健壮的解析方法
-//                PayChargeEventMessage.TaskInfo[] taskInfos = parseTaskList(message.getTaskList());
-//
-//                if (taskInfos.length == 0) {
-//                    log.warn("PayChargeStatusSendConsumer 解析到空的taskList数据");
-//                    return;
-//                }
-//
-//                log.info("PayChargeStatusSendConsumer 成功解析到{}条任务记录", taskInfos.length);
-//
-//                for (PayChargeEventMessage.TaskInfo taskInfo : taskInfos) {
-//                    try {
-//                        if("4".equals(taskInfo.getInData())){
-//                            //承压
-//                            log.info("PayChargeStatusSendConsumer 承压取消回调 {} - 金额: {}",
-//                                    taskInfo.getTaskNo(), taskInfo.getChargeAmount());
-//                            UpdatePayStatusDTO payInfo = new UpdatePayStatusDTO();
-//                            payInfo.setOrderNo(taskInfo.getTaskNo());
-//                            payInfo.setChargeTime(message.getChargeTime());
-//                            payInfo.setChargeAmount(taskInfo.getChargeAmount());
-//                            payInfo.setIsCancel(true);
-//
-//                            taskOrderApi.updatePayStatus(payInfo);
-//                        } else if("5".equals(taskInfo.getInData())){
-//                            // 实验室
-//                            log.info("PayChargeStatusSendConsumer 实验室支付取消回调 {} - 金额: {}",
-//                                    taskInfo.getTaskNo(), taskInfo.getChargeAmount());
-//                        } else {
-//                            log.warn("PayChargeStatusSendConsumer 未知业务类型 inData: {}, taskNo: {}",
-//                                    taskInfo.getInData(), taskInfo.getTaskNo());
-//                        }
-//                    } catch (Exception e) {
-//                        log.error("PayChargeStatusSendConsumer 处理单条记录失败, taskNo: {}, 错误: {}",
-//                                taskInfo.getTaskNo(), e.getMessage(), e);
-//                        // 继续处理其他记录,不因为单条记录失败而中断
-//                    }
-//                }
-//            } else {
-//                log.warn("PayChargeStatusSendConsumer taskList为空");
-//            }
-//        } else {
-//            log.info("PayChargeStatusSendConsumer 忽略事件类型: {}", message.getEventType());
-//        }
-//
-//    }
-//
-//
-//}
+package cn.start.tz.module.pressure2.mq.consumer;
+
+import cn.start.tz.module.pressure2.api.taskorder.BoilerTaskOrderApi;
+import cn.start.tz.module.pressure2.api.taskorder.dto.UpdatePayStatusDTO;
+import cn.start.tz.module.pressure2.mq.message.PayChargeEventMessage;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
+import org.apache.rocketmq.spring.core.RocketMQListener;
+import org.springframework.context.event.EventListener;
+import org.springframework.stereotype.Component;
+
+@Component
+@RocketMQMessageListener( // 重点:添加 @RocketMQMessageListener 注解,声明消费的 topic
+        topic = "js_pay_service_charge_status",
+        consumerGroup = "js_pay_service_charge_status" + "_pressure2_" + "${spring.profiles.active}"
+)
+
+@Slf4j
+public class PayChargeStatusSendConsumer implements RocketMQListener<PayChargeEventMessage> {
+
+
+    @Resource
+    private BoilerTaskOrderApi taskOrderApi;
+
+    @Resource
+    private ObjectMapper objectMapper;
+
+    /**
+     * 健壮的JSON解析方法,处理格式问题
+     */
+    private PayChargeEventMessage.TaskInfo[] parseTaskList(String taskListJson) {
+        if (StringUtils.isBlank(taskListJson)) {
+            return new PayChargeEventMessage.TaskInfo[0];
+        }
+
+        try {
+            // 首先尝试直接解析
+            return objectMapper.readValue(taskListJson, PayChargeEventMessage.TaskInfo[].class);
+        } catch (Exception e) {
+            log.warn("直接JSON解析失败,尝试修复格式,错误: {}", e.getMessage());
+
+            try {
+                // 尝试解析为JsonNode以便修复
+                JsonNode rootNode = objectMapper.readTree(taskListJson);
+
+                if (rootNode.isArray()) {
+                    // 如果是数组,直接转换
+                    return objectMapper.convertValue(rootNode, PayChargeEventMessage.TaskInfo[].class);
+                } else if (rootNode.isObject()) {
+                    // 如果是单个对象,包装成数组
+                    ArrayNode arrayNode = objectMapper.createArrayNode();
+                    arrayNode.add(rootNode);
+                    return objectMapper.convertValue(arrayNode, PayChargeEventMessage.TaskInfo[].class);
+                } else {
+                    log.error("无法解析的JSON格式,既不是数组也不是对象: {}", taskListJson);
+                    return new PayChargeEventMessage.TaskInfo[0];
+                }
+            } catch (Exception e2) {
+                log.error("JSON修复失败,原始数据: {}", taskListJson, e2);
+                return new PayChargeEventMessage.TaskInfo[0];
+            }
+        }
+    }
+
+    @EventListener
+    // @Async // Spring Event 默认在 Producer 发送的线程,通过 @Async 实现异步
+    @Override
+    public void onMessage(PayChargeEventMessage message) {
+        log.info("PayChargeStatusSendConsumer [onMessage][消息内容({})]", message);
+
+        //费用事件:1.缴费 2.解除认领
+        if("1".equals(message.getEventType()+"")){
+            if(StringUtils.isNotBlank(message.getTaskList())){
+                // 使用健壮的解析方法
+                PayChargeEventMessage.TaskInfo[] taskInfos = parseTaskList(message.getTaskList());
+
+                if (taskInfos.length == 0) {
+                    log.warn("PayChargeStatusSendConsumer 解析到空的taskList数据");
+                    return;
+                }
+
+                log.info("PayChargeStatusSendConsumer 成功解析到{}条任务记录", taskInfos.length);
+
+                for (PayChargeEventMessage.TaskInfo taskInfo : taskInfos) {
+                    try {
+                        if("4".equals(taskInfo.getInData())){
+                            //承压
+                            log.info("PayChargeStatusSendConsumer 承压支付回调 {} - 金额: {}",
+                                   taskInfo.getTaskNo(), taskInfo.getChargeAmount());
+                            UpdatePayStatusDTO payInfo = new UpdatePayStatusDTO();
+                            payInfo.setOrderNo(taskInfo.getTaskNo());
+                            payInfo.setChargeTime(message.getChargeTime());
+                            payInfo.setChargeAmount(taskInfo.getChargeAmount());
+
+                            taskOrderApi.updatePayStatus(payInfo);
+                        } else if("5".equals(taskInfo.getInData())){
+                            // 实验室
+                            log.info("PayChargeStatusSendConsumer 实验室支付回调 {} - 金额: {}",
+                                   taskInfo.getTaskNo(), taskInfo.getChargeAmount());
+                        } else {
+                            log.warn("PayChargeStatusSendConsumer 未知业务类型 inData: {}, taskNo: {}",
+                                   taskInfo.getInData(), taskInfo.getTaskNo());
+                        }
+                    } catch (Exception e) {
+                        log.error("PayChargeStatusSendConsumer 处理单条记录失败, taskNo: {}, 错误: {}",
+                                taskInfo.getTaskNo(), e.getMessage(), e);
+                        // 继续处理其他记录,不因为单条记录失败而中断
+                    }
+                }
+            } else {
+                log.warn("PayChargeStatusSendConsumer taskList为空");
+            }
+        }else if("2".equals(message.getEventType()+"")){
+            if(StringUtils.isNotBlank(message.getTaskList())){
+                // 使用健壮的解析方法
+                PayChargeEventMessage.TaskInfo[] taskInfos = parseTaskList(message.getTaskList());
+
+                if (taskInfos.length == 0) {
+                    log.warn("PayChargeStatusSendConsumer 解析到空的taskList数据");
+                    return;
+                }
+
+                log.info("PayChargeStatusSendConsumer 成功解析到{}条任务记录", taskInfos.length);
+
+                for (PayChargeEventMessage.TaskInfo taskInfo : taskInfos) {
+                    try {
+                        if("4".equals(taskInfo.getInData())){
+                            //承压
+                            log.info("PayChargeStatusSendConsumer 承压取消回调 {} - 金额: {}",
+                                    taskInfo.getTaskNo(), taskInfo.getChargeAmount());
+                            UpdatePayStatusDTO payInfo = new UpdatePayStatusDTO();
+                            payInfo.setOrderNo(taskInfo.getTaskNo());
+                            payInfo.setChargeTime(message.getChargeTime());
+                            payInfo.setChargeAmount(taskInfo.getChargeAmount());
+                            payInfo.setIsCancel(true);
+
+                            taskOrderApi.updatePayStatus(payInfo);
+                        } else if("5".equals(taskInfo.getInData())){
+                            // 实验室
+                            log.info("PayChargeStatusSendConsumer 实验室支付取消回调 {} - 金额: {}",
+                                    taskInfo.getTaskNo(), taskInfo.getChargeAmount());
+                        } else {
+                            log.warn("PayChargeStatusSendConsumer 未知业务类型 inData: {}, taskNo: {}",
+                                    taskInfo.getInData(), taskInfo.getTaskNo());
+                        }
+                    } catch (Exception e) {
+                        log.error("PayChargeStatusSendConsumer 处理单条记录失败, taskNo: {}, 错误: {}",
+                                taskInfo.getTaskNo(), e.getMessage(), e);
+                        // 继续处理其他记录,不因为单条记录失败而中断
+                    }
+                }
+            } else {
+                log.warn("PayChargeStatusSendConsumer taskList为空");
+            }
+        } else {
+            log.info("PayChargeStatusSendConsumer 忽略事件类型: {}", message.getEventType());
+        }
+
+    }
+
+
+}

+ 1 - 1
tz-module-pressure2/tz-module-pressure2-biz/src/main/resources/application-hsd.yaml

@@ -99,7 +99,7 @@ spring:
 
 # rocketmq 配置项,对应 RocketMQProperties 配置类
 rocketmq:
-  name-server: 192.168.0.53:9876 # RocketMQ Namesrv
+  name-server: 127.0.0.1:9876 # RocketMQ Namesrv
 
 #rocketmq:
 #  name-server: 192.168.20.224:9876

+ 1 - 1
tz-module-pressure2/tz-module-pressure2-biz/src/main/resources/application-hst.yaml

@@ -84,7 +84,7 @@ spring:
 
 # rocketmq 配置项,对应 RocketMQProperties 配置类
 rocketmq:
-  name-server: 192.168.0.53:9876 # RocketMQ Namesrv
+  name-server: data.hofo.co:9876 # RocketMQ Namesrv
 
 #rocketmq:
 #  name-server: 192.168.20.224:9876