Browse Source

+ csv 导出数据补充
+ MyBatisConfig 增加 json 类型处理器

chen.cheng 3 months ago
parent
commit
9b1340aca3
31 changed files with 761 additions and 180 deletions
  1. 3 1
      bd-park/park-backend/park-application/src/main/java/com/huashe/park/application/web/controller/cons/ConsUnitInfoController.java
  2. 11 0
      bd-park/park-backend/park-application/src/main/java/com/huashe/park/application/web/controller/cons/PileMachineInfoController.java
  3. 9 1
      bd-park/park-backend/park-collect/src/main/java/com/huashe/park/collect/controller/TopicController.java
  4. 118 46
      bd-park/park-backend/park-collect/src/main/java/com/huashe/park/collect/event/MachineRealtimeEventListener.java
  5. 23 11
      bd-park/park-backend/park-collect/src/main/java/com/huashe/park/collect/handle/RootMsgHandler.java
  6. 5 0
      bd-park/park-backend/park-common/src/main/java/com/huashe/park/common/animations/mybatis/Converter.java
  7. 20 0
      bd-park/park-backend/park-common/src/main/java/com/huashe/park/common/animations/mybatis/ConverterCache.java
  8. 13 0
      bd-park/park-backend/park-common/src/main/java/com/huashe/park/common/animations/mybatis/FieldConvert.java
  9. 34 0
      bd-park/park-backend/park-common/src/main/java/com/huashe/park/common/animations/mybatis/FieldMetadataCache.java
  10. 97 0
      bd-park/park-backend/park-common/src/main/java/com/huashe/park/common/animations/mybatis/handler/MySqlJsonHandler.java
  11. 16 0
      bd-park/park-backend/park-common/src/main/java/com/huashe/park/common/animations/mybatis/service/JsonConverter.java
  12. 14 0
      bd-park/park-backend/park-common/src/main/java/com/huashe/park/common/consts/RedisKey.java
  13. 39 0
      bd-park/park-backend/park-core/src/main/java/com/huashe/park/core/redis/RedisProxy.java
  14. 1 2
      bd-park/park-backend/park-core/src/main/java/com/huashe/park/core/service/IMachineProcessResultService.java
  15. 28 17
      bd-park/park-backend/park-core/src/main/java/com/huashe/park/core/service/impl/ConsUnitInfoServiceImpl.java
  16. 21 5
      bd-park/park-backend/park-core/src/main/java/com/huashe/park/core/service/impl/MachineProcessResultServiceImpl.java
  17. 3 4
      bd-park/park-backend/park-core/src/main/resources/mapper/cons/ConsMachineCmdHisMapper.xml
  18. 9 3
      bd-park/park-backend/park-core/src/main/resources/mapper/cons/MachineProcessResultMapper.xml
  19. 11 0
      bd-park/park-backend/park-core/src/main/resources/mapper/cons/PileHoleIndexRealtimeMapper.xml
  20. 3 4
      bd-park/park-backend/park-core/src/main/resources/mapper/park/ParkAttendGroupMapper.xml
  21. 3 4
      bd-park/park-backend/park-core/src/main/resources/mapper/park/ParkInspectProjMapper.xml
  22. 8 29
      bd-park/park-backend/park-domain/src/main/java/com/huashe/park/domain/dto/cons/ConsUnitResult.java
  23. 2 2
      bd-park/park-backend/park-domain/src/main/java/com/huashe/park/domain/dto/cons/ResultCADCsv.java
  24. 1 1
      bd-park/park-backend/park-domain/src/main/java/com/huashe/park/domain/entity/ConsPileHoleInfo.java
  25. 3 0
      bd-park/park-backend/park-domain/src/main/java/com/huashe/park/domain/entity/MachineProcessResult.java
  26. 9 0
      bd-park/park-backend/park-domain/src/main/java/com/huashe/park/domain/entity/PileHoleIndexRealtime.java
  27. 55 0
      bd-park/park-backend/park-infrastructure/src/main/java/com/huashe/park/infrastructure/cfg/mybatis/FieldConvertInterceptor.java
  28. 4 0
      bd-park/park-backend/park-infrastructure/src/main/java/com/huashe/park/infrastructure/cfg/mybatis/RegisterCustomerInterceptor.java
  29. 77 0
      bd-park/park-backend/park-infrastructure/src/main/java/com/huashe/park/infrastructure/cfg/mybatis/ResultTypeConvertInterceptor.java
  30. 30 50
      common-application/ruoyi-framework/src/main/java/com/ruoyi/framework/config/MyBatisConfig.java
  31. 91 0
      common-application/ruoyi-framework/src/main/java/com/ruoyi/framework/config/handler/MySqlJsonHandler.java

+ 3 - 1
bd-park/park-backend/park-application/src/main/java/com/huashe/park/application/web/controller/cons/ConsUnitInfoController.java

@@ -79,7 +79,6 @@ public class ConsUnitInfoController extends BaseController {
         consUnitInfoService.exportConsUnitHole(consUnitInfo, response);
     }
 
-    @Log(title = "施工单元", businessType = BusinessType.EXPORT)
     @PostMapping("/export/csv")
     public void exportCsv(HttpServletResponse response, ConsUnitInfo consUnitInfo) {
         consUnitInfoService.exportConsUnitRes(consUnitInfo, response);
@@ -142,4 +141,7 @@ public class ConsUnitInfoController extends BaseController {
     public AjaxResult remove(@PathVariable("id") Long id) {
         return toAjax(consUnitInfoService.deleteConsUnitInfoById(id));
     }
+
+
+
 }

+ 11 - 0
bd-park/park-backend/park-application/src/main/java/com/huashe/park/application/web/controller/cons/PileMachineInfoController.java

@@ -23,6 +23,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 import com.huashe.common.domain.AjaxResult;
 import com.huashe.park.common.i18n.MessageUtils;
+import com.huashe.park.core.redis.RedisProxy;
 import com.huashe.park.core.service.IPileHoleIndexRealtimeService;
 import com.huashe.park.core.service.IPileMachineInfoService;
 import com.huashe.park.domain.dto.cons.MachineBiz;
@@ -57,6 +58,9 @@ public class PileMachineInfoController extends BaseController {
     @Autowired
     private TokenService tokenService;
 
+    @Autowired
+    private RedisProxy redisProxy;
+
     /**
      * 查询施工桩机信息列表
      */
@@ -116,6 +120,13 @@ public class PileMachineInfoController extends BaseController {
         return toAjax(pileMachineInfoService.updatePileMachineInfoWidthPwd(pileMachineInfo));
     }
 
+    @PostMapping("/terminal/test")
+    @Anonymous
+    public void test() {
+        redisProxy.putMapToHash("test", BeanUtil.beanToMap(new MachineBiz()), 10000);
+        redisProxy.putHash("test", "designId", "123");
+    }
+
     @PostMapping("/terminal/login")
     @Anonymous
     public AjaxResult login(@RequestBody MachineLogin machineAuth) {

+ 9 - 1
bd-park/park-backend/park-collect/src/main/java/com/huashe/park/collect/controller/TopicController.java

@@ -78,6 +78,15 @@ public class TopicController extends BaseController {
         return AjaxResult.success(topicDataCfg.byteFormat(bytes, topicDataCfg.getProcessTopic().getProtocol()));
     }
 
+    @PostMapping("/decode/result")
+    @Anonymous
+    public AjaxResult decodeResult(@RequestBody String hex) throws Exception {
+        byte[] bytes = HexUtil.decodeHex(
+            "c800000000019624524dcb696c66313731666c313131786271696f38776d6167656d384c37896159834a41894160e5621923410b368d6a59834a41628db143621923410a368d6a59834a41698db14362192341e56fcc3f90ae7bb00000000000000000e878bd3c0000000000000196245059ca0000019624524dca00000000c2c2499a3f262d4000000000e56fcc3fe56fcc3f000000000000000000000000000020428fae7b3000000000c800000000000196245059ca000001962450d6ac000001962450d6ac0000019624524dd4313131786271696f5f313130445339383431323330303231325f333639");
+        return AjaxResult.success(topicDataCfg.byteFormat(bytes, topicDataCfg.getResultTopic().getProtocol()));
+    }
+
+    // fffd00001fffd24524dfffd696c66313731666c313131786271696f38776d6167656d384c37fffd6159fffd4a41fffd4160fffd62192341b36fffd6a59fffd4a4162fffdfffd4362192341a36fffd6a59fffd4a4169fffdfffd4362192341fffd6ffffd3ffffdfffd7bfffd00000000fffd78fffd3c0000001fffd245059fffd001fffd24524dfffd0000fffdfffd49fffd3f262d400000fffd6ffffd3ffffd6ffffd3f000000000000002042fffdfffd7b300000fffd000001fffd245059fffd001fffd24505ac001fffd24505ac001fffd24524dfffd313131786271696f5f313130445339383431323330303231325f333639
     @PostMapping("/new/topic")
     @Anonymous
     public void newTopic(@RequestBody MqttRequest mqttRequest) {
@@ -85,5 +94,4 @@ public class TopicController extends BaseController {
         mqttTemplate.subscribe(mqttRequest.getClientKey(), mqttRequest.getClientKey(), mqttRequest.getClientSecret(),
             mqttRequest.getTopic(), mqttRequest.getQos(), bean);
     }
-
 }

+ 118 - 46
bd-park/park-backend/park-collect/src/main/java/com/huashe/park/collect/event/MachineRealtimeEventListener.java

@@ -1,24 +1,33 @@
 package com.huashe.park.collect.event;
 
+import static com.huashe.park.common.consts.RedisKey.DEPTH_PRESS_TIPS;
+import static com.huashe.park.common.consts.RedisKey.PILE_MACHINE_MQTT;
 import static com.huashe.park.common.consts.enums.ConsStatus.CONS_STATUS_00;
 import static com.huashe.park.common.consts.enums.ConsStatus.CONS_STATUS_02;
 
+import java.util.HashMap;
+import java.util.Map;
+
 import org.apache.commons.lang3.ObjectUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.event.EventListener;
-import org.springframework.scheduling.annotation.Async;
-import org.springframework.stereotype.Component;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
 
+import com.alibaba.fastjson2.JSONObject;
 import com.huashe.park.common.DateTimeUtil;
+import com.huashe.park.common.consts.RedisKey;
 import com.huashe.park.common.consts.enums.MachineStatus;
+import com.huashe.park.core.redis.RedisProxy;
 import com.huashe.park.core.service.IConsPileHoleInfoService;
 import com.huashe.park.core.service.IPileHoleIndexRealtimeService;
 import com.huashe.park.core.service.IPileMachineInfoService;
 import com.huashe.park.domain.entity.ConsPileHoleInfo;
+import com.huashe.park.domain.entity.MachineProcess;
+import com.huashe.park.domain.entity.MachineProcessResult;
 import com.huashe.park.domain.entity.PileHoleIndexRealtime;
 import com.huashe.park.domain.entity.PileMachineInfo;
 
-@Component
+@Service
 public class MachineRealtimeEventListener {
 
     @Autowired
@@ -33,13 +42,12 @@ public class MachineRealtimeEventListener {
     @Autowired
     private IPileMachineInfoService pileMachineInfoService;
 
-    @EventListener
-    @Async
-    public void handleConsProcessEvent(PileMachineConsRealtimeEvent event) {
-        ConsPileHoleInfo consPileHoleInfo = consPileHoleInfoService
-            .selectConsPileHoleInfoByteId(event.getMessage().getPileId());
-        PileMachineInfo pileMachineInfo = machineInfoService
-            .selectPileMachineInfoByByteId(event.getMessage().getMachineId());
+    @Autowired
+    private RedisProxy redisProxy;
+
+    public void handleConsProcess(MachineProcess message) {
+        ConsPileHoleInfo consPileHoleInfo = consPileHoleInfoService.selectConsPileHoleInfoByteId(message.getPileId());
+        PileMachineInfo pileMachineInfo = machineInfoService.selectPileMachineInfoByByteId(message.getMachineId());
         if (ObjectUtils.isEmpty(consPileHoleInfo) || ObjectUtils.isEmpty(pileMachineInfo)) {
             return;
         }
@@ -52,31 +60,37 @@ public class MachineRealtimeEventListener {
         pileHoleIndexRealtime.setConsUnitId(consPileHoleInfo.getConsUnitId());
         pileHoleIndexRealtime.setHoleNum(consPileHoleInfo.getHoleNum());
 
-        pileHoleIndexRealtime.setCurrent(event.getMessage().getCurrent());
-        pileHoleIndexRealtime.setDepth(event.getMessage().getPileLength());
-        pileHoleIndexRealtime.setSprayPressure(event.getMessage().getSprayPressure());
-        pileHoleIndexRealtime.setTiltAngle(event.getMessage().getTiltAngle());
-        pileHoleIndexRealtime.setForwardTiltAngle(event.getMessage().getForwardTiltAngle());
+        pileHoleIndexRealtime.setCurrent(message.getCurrent());
+        pileHoleIndexRealtime.setDepth(message.getPileLength());
+        pileHoleIndexRealtime.setSprayPressure(message.getSprayPressure());
+        pileHoleIndexRealtime.setTiltAngle(message.getTiltAngle());
+        pileHoleIndexRealtime.setForwardTiltAngle(message.getForwardTiltAngle());
         // 送带量
-        pileHoleIndexRealtime.setSendSprayVolume(event.getMessage().getSprayVolume());
-        pileHoleIndexRealtime.setVerticalDeviation(event.getMessage().getVerticalAngle());
-        pileHoleIndexRealtime.setStatus(CONS_STATUS_02.getCode());
-        pileHoleIndexRealtime.setRealLat(event.getMessage().getLatitude());
-        pileHoleIndexRealtime.setRealLng(event.getMessage().getLongitude());
-        pileHoleIndexRealtime.setRealX(event.getMessage().getRealX());
-        pileHoleIndexRealtime.setRealY(event.getMessage().getRealY());
+        pileHoleIndexRealtime.setSendSprayVolume(message.getSprayVolume());
+        pileHoleIndexRealtime.setVerticalDeviation(message.getVerticalAngle());
+        pileHoleIndexRealtime.setRealLat(message.getLatitude());
+        pileHoleIndexRealtime.setRealLng(message.getLongitude());
+        pileHoleIndexRealtime.setRealX(message.getRealX());
+        pileHoleIndexRealtime.setRealY(message.getRealY());
         int cnt = pileHoleIndexRealtimeService.updatePileHoleIndexRealtimeByHoleIdAndMachineId(pileHoleIndexRealtime);
-        if (!(cnt > 0)) {
-            String dateFromMills = DateTimeUtil.getDateFromMills(event.getMessage().getDataTime());
+        String pileRedisKey = String.format(RedisKey.PILE_MACHINE_MQTT.MQTT_TOPIC_PREFIX, message.getPileId());
+        if (!redisProxy.hasKey(pileRedisKey)) {
+            redisProxy.putMapToHash(String.format(RedisKey.PILE_MACHINE_MQTT.MQTT_TOPIC_PREFIX, message.getPileId()),
+                generateMapTemplate(), 60 * 30);
+        }
+        if (cnt < 1) {
+            pileHoleIndexRealtime.setStatus(CONS_STATUS_02.getCode());
+            String dateFromMills = DateTimeUtil.getDateFromMills(message.getDataTime());
             pileHoleIndexRealtime.setStartTime(DateTimeUtil.parseDate(dateFromMills));
             pileHoleIndexRealtimeService.insertPileHoleIndexRealtime(pileHoleIndexRealtime);
+            consPileHoleInfoService.updateConsPileHoleInfo(new ConsPileHoleInfo() {
+                {
+                    setId(consPileHoleInfo.getId());
+                    setConsStatus(CONS_STATUS_02.getCode());
+                }
+            });
         }
-        consPileHoleInfoService.updateConsPileHoleInfo(new ConsPileHoleInfo() {
-            {
-                setId(consPileHoleInfo.getId());
-                setConsStatus(CONS_STATUS_02.getCode());
-            }
-        });
+
         pileMachineInfoService.updatePileMachineInfo(new PileMachineInfo() {
             {
                 setId(pileMachineInfo.getId());
@@ -85,15 +99,13 @@ public class MachineRealtimeEventListener {
                 setStatus(MachineStatus.MACHINE_STATUS_00.getCode());
             }
         });
+        // 处置各种最大值
+        handleMaxProcess(message);
     }
 
-    @EventListener
-    @Async
-    public void handleConsResultEvent(PileMachineConsResultEvent event) {
-        ConsPileHoleInfo consPileHoleInfo = consPileHoleInfoService
-            .selectConsPileHoleInfoByteId(event.getMessage().getPileId());
-        PileMachineInfo pileMachineInfo = machineInfoService
-            .selectPileMachineInfoByByteId(event.getMessage().getMachineId());
+    public void handleConsResult(MachineProcessResult message) {
+        ConsPileHoleInfo consPileHoleInfo = consPileHoleInfoService.selectConsPileHoleInfoByteId(message.getPileId());
+        PileMachineInfo pileMachineInfo = machineInfoService.selectPileMachineInfoByByteId(message.getMachineId());
         if (ObjectUtils.isEmpty(consPileHoleInfo) || ObjectUtils.isEmpty(pileMachineInfo)) {
             return;
         }
@@ -102,21 +114,23 @@ public class MachineRealtimeEventListener {
         pileHoleIndexRealtime.setHoleByteKey(consPileHoleInfo.getByteId());
         pileHoleIndexRealtime.setMachineByteKey(pileMachineInfo.getByteId());
         pileHoleIndexRealtime.setMachineId(pileMachineInfo.getId());
-        pileHoleIndexRealtime.setDepth(event.getMessage().getPileLength());
+        pileHoleIndexRealtime.setDepth(message.getPileLength());
         pileHoleIndexRealtime.setConsUnitId(consPileHoleInfo.getConsUnitId());
         pileHoleIndexRealtime.setHoleNum(consPileHoleInfo.getHoleNum());
-        pileHoleIndexRealtime.setSprayVolume(event.getMessage().getSprayVolume());
-        pileHoleIndexRealtime.setVerticalDeviation(event.getMessage().getVerticalDeviation());
+        pileHoleIndexRealtime.setSprayVolume(message.getSprayVolume());
+        pileHoleIndexRealtime.setVerticalDeviation(message.getVerticalDeviation());
         pileHoleIndexRealtime.setStatus(CONS_STATUS_00.getCode());
 
-        if (ObjectUtils.isNotEmpty(event.getMessage().getEndTime())) {
-            String dateFromMills = DateTimeUtil.getDateFromMills(event.getMessage().getEndTime());
+        if (ObjectUtils.isNotEmpty(message.getEndTime())) {
+            String dateFromMills = DateTimeUtil.getDateFromMills(message.getEndTime());
             pileHoleIndexRealtime.setEndTime(DateTimeUtil.parseDate(dateFromMills));
         }
-
+        pileHoleIndexRealtime
+            .setEndPress(getValue(message.getPileId(), PILE_MACHINE_MQTT.MQTT_TOPIC_PROCESS_MAX_PRESS));
+        pileHoleIndexRealtime.setDepthPress(depthPressMap(message.getPileId()));
         int cnt = pileHoleIndexRealtimeService.updatePileHoleIndexRealtimeByHoleIdAndMachineId(pileHoleIndexRealtime);
-        if (!(cnt > 0)) {
-            String dateFromMills = DateTimeUtil.getDateFromMills(event.getMessage().getStartTime());
+        if (cnt < 1) {
+            String dateFromMills = DateTimeUtil.getDateFromMills(message.getStartTime());
             pileHoleIndexRealtime.setStartTime(DateTimeUtil.parseDate(dateFromMills));
             pileHoleIndexRealtimeService.insertPileHoleIndexRealtime(pileHoleIndexRealtime);
         }
@@ -134,4 +148,62 @@ public class MachineRealtimeEventListener {
         });
     }
 
+    private void handleMaxProcess(MachineProcess message) {
+        Float maxPress = redisProxy.getHash(String.format(PILE_MACHINE_MQTT.MQTT_TOPIC_PREFIX, message.getPileId()),
+            PILE_MACHINE_MQTT.MQTT_TOPIC_PROCESS_MAX_PRESS);
+        Float maxDepth = redisProxy.getHash(String.format(PILE_MACHINE_MQTT.MQTT_TOPIC_PREFIX, message.getPileId()),
+            PILE_MACHINE_MQTT.MQTT_TOPIC_PROCESS_MAX_DEPTH);
+        Float sprayPressure = message.getSprayPressure();
+        // 如果压力大于最大压力,则更新最大压力
+        if (sprayPressure > maxPress) {
+            redisProxy.putHash(String.format(PILE_MACHINE_MQTT.MQTT_TOPIC_PREFIX, message.getPileId()),
+                PILE_MACHINE_MQTT.MQTT_TOPIC_PROCESS_MAX_PRESS, sprayPressure);
+        }
+        // 如果深度大于最大深度,则更新最大深度
+        if (message.getPileLength() > maxDepth) {
+            redisProxy.putHash(String.format(PILE_MACHINE_MQTT.MQTT_TOPIC_PREFIX, message.getPileId()),
+                PILE_MACHINE_MQTT.MQTT_TOPIC_PROCESS_MAX_DEPTH, message.getPileLength());
+        }
+        {
+            // 获取当前深度对应的最大压力
+            int index = (int) Math.floor(message.getPileLength() / 0.25f);
+            Float maxDepthPress = redisProxy.getHash(
+                String.format(PILE_MACHINE_MQTT.MQTT_TOPIC_PREFIX, message.getPileId()), Integer.toString(index));
+            if (maxDepthPress < sprayPressure) {
+                redisProxy.putHash(String.format(PILE_MACHINE_MQTT.MQTT_TOPIC_PREFIX, message.getPileId()),
+                    Integer.toString(index), sprayPressure);
+            }
+        }
+    }
+
+    private <T> T getValue(String pileId, String key) {
+        return redisProxy.getHash(String.format(PILE_MACHINE_MQTT.MQTT_TOPIC_PREFIX, pileId), key);
+    }
+
+    private JSONObject depthPressMap(String pileId) {
+        Map allHash = redisProxy.getAllHash(String.format(PILE_MACHINE_MQTT.MQTT_TOPIC_PREFIX, pileId));
+        if (CollectionUtils.isEmpty(allHash)) {
+            return null;
+        }
+        JSONObject result = new JSONObject(DEPTH_PRESS_TIPS.PILE_LENGTH_TIPS);
+        Float press;
+        for (int i = 0; i <= DEPTH_PRESS_TIPS.PILE_LENGTH_TIPS; i += 1) {
+            press = (Float) allHash.get(Integer.toString(i));
+            result.put(String.format("%.2fm", i * 0.25), press);
+        }
+        return result;
+    }
+
+    private Map<String, Object> generateMapTemplate() {
+        Map<String, Object> result = new HashMap<String, Object>() {
+            {
+                put(PILE_MACHINE_MQTT.MQTT_TOPIC_PROCESS_MAX_PRESS, 0);
+                put(PILE_MACHINE_MQTT.MQTT_TOPIC_PROCESS_MAX_DEPTH, 0);
+            }
+        };
+        for (int i = 0; i <= DEPTH_PRESS_TIPS.PILE_LENGTH_TIPS; i += 1) {
+            result.put(Integer.toString(i), 0);
+        }
+        return result;
+    }
 }

+ 23 - 11
bd-park/park-backend/park-collect/src/main/java/com/huashe/park/collect/handle/RootMsgHandler.java

@@ -12,7 +12,6 @@ package com.huashe.park.collect.handle;
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Map;
 import java.util.concurrent.LinkedBlockingQueue;
 
 import javax.annotation.PostConstruct;
@@ -25,12 +24,13 @@ import org.springframework.stereotype.Service;
 
 import com.alibaba.fastjson2.JSON;
 import com.alibaba.fastjson2.JSONObject;
-import com.huashe.common.utils.StringUtils;
 import com.huashe.park.collect.config.TopicDataCfg;
 import com.huashe.park.collect.core.TopicMsgEngine;
 import com.huashe.park.collect.event.EventPublisherService;
+import com.huashe.park.collect.event.MachineRealtimeEventListener;
 import com.huashe.park.common.ByteArrayUtil;
 import com.huashe.park.common.DateTimeUtil;
+import com.huashe.park.core.redis.RedisProxy;
 import com.huashe.park.core.service.IMachineProcessResultService;
 import com.huashe.park.core.service.IMachineProcessService;
 import com.huashe.park.domain.entity.MachineProcess;
@@ -67,6 +67,12 @@ public class RootMsgHandler extends TopicMsgEngine {
     @Autowired
     private EventPublisherService eventPublisherService;
 
+    @Autowired
+    private MachineRealtimeEventListener machineRealtimeEventListener;
+
+    @Autowired
+    private RedisProxy redisProxy;
+
     @PostConstruct
     public void init() {
         super.init();
@@ -83,8 +89,17 @@ public class RootMsgHandler extends TopicMsgEngine {
     public void handle(String topic, byte[] payload) {
         JSONObject jsonObject = new JSONObject();
         jsonObject.put(TOPIC_NAME, topic);
-        jsonObject.put("key", topic);
-        jsonObject.put(TOPIC_PAYLOAD, payload);
+        if (topic.endsWith(topicDataCfg.getResultTopic().getName())) {
+            JSONObject data = topicDataCfg.byteFormat(payload, topicDataCfg.getResultTopic().getProtocol());
+            jsonObject.put("key", data.get("pileId"));
+            jsonObject.put(TOPIC_PAYLOAD, data);
+        }
+
+        if (topic.endsWith(topicDataCfg.getProcessTopic().getName())) {
+            JSONObject data = topicDataCfg.byteFormat(payload, topicDataCfg.getProcessTopic().getProtocol());
+            jsonObject.put("key", data.get("pileId"));
+            jsonObject.put(TOPIC_PAYLOAD, data);
+        }
         push(jsonObject);
     }
 
@@ -93,28 +108,25 @@ public class RootMsgHandler extends TopicMsgEngine {
         String topic = json.getString(TOPIC_NAME);
         // 结果数据处理
         if (topic.endsWith(topicDataCfg.getResultTopic().getName())) {
-            byte[] bytes = json.getBytes(TOPIC_PAYLOAD);
-            JSONObject jsonObject = topicDataCfg.byteFormat(bytes, topicDataCfg.getResultTopic().getProtocol());
+            JSONObject jsonObject = json.getJSONObject(TOPIC_PAYLOAD);
             MachineProcessResult machineProcess = JSON.parseObject(jsonObject.toString(), MachineProcessResult.class);
             machineProcess.setRecordTime(DateTimeUtil.getDateFromMills(machineProcess.getDataTime()));
             machineProcess.setDt(
                 DateTimeUtil.getDateFromMills(machineProcess.getDataTime(), DateTimeUtil.DateFormatter.yyyyMMdd));
             machineProcessResultService.insertMachineProcessResult(machineProcess);
-            eventPublisherService.publishMachineResultEvent(machineProcess);
+            machineRealtimeEventListener.handleConsResult(machineProcess);
         }
         if (topic.endsWith(topicDataCfg.getProcessTopic().getName())) {
-            byte[] bytes = json.getBytes(TOPIC_PAYLOAD);
-            JSONObject jsonObject = topicDataCfg.byteFormat(bytes, topicDataCfg.getProcessTopic().getProtocol());
+            JSONObject jsonObject = json.getJSONObject(TOPIC_PAYLOAD);
             MachineProcess machineProcess = JSON.parseObject(jsonObject.toString(), MachineProcess.class);
             machineProcess.setRecordTime(DateTimeUtil.getDateFromMills(machineProcess.getDataTime()));
             machineProcess.setDt(
                 DateTimeUtil.getDateFromMills(machineProcess.getDataTime(), DateTimeUtil.DateFormatter.yyyyMMdd));
             machineProcessService.insertMachineProcess(machineProcess);
-            eventPublisherService.publishMachineProcessEvent(machineProcess);
+            machineRealtimeEventListener.handleConsProcess(machineProcess);
         }
     }
 
-
     public static void main(String[] args) {
         byte[] bytes = ByteArrayUtil.hexString2ByteArray(
             "590200000001951C387150353061623664373875393537343066346D75656466653462FA7E6A04ACCE5041A8C64B37EA401C4163077186A3CE50410F490C00A6401C4163077186A3CE5041FE480C00A6401C41000000000000000000000000000000000000000000000000000001951C37D7CB000001951C38711A00000000643BDF4F8DD72C400000000000000000000000000000000000000000000000000000204100000000000000005902000000000000000000000000000075393537343066345F313130445339383339333230303030325F");

+ 5 - 0
bd-park/park-backend/park-common/src/main/java/com/huashe/park/common/animations/mybatis/Converter.java

@@ -0,0 +1,5 @@
+package com.huashe.park.common.animations.mybatis;
+
+public interface Converter<S, T> {
+    T convert(S source);
+}

+ 20 - 0
bd-park/park-backend/park-common/src/main/java/com/huashe/park/common/animations/mybatis/ConverterCache.java

@@ -0,0 +1,20 @@
+package com.huashe.park.common.animations.mybatis;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+public class ConverterCache {
+    private static final Map<Class<?>, Converter<?, ?>> cache = new ConcurrentHashMap<>();
+
+    @SuppressWarnings("unchecked")
+    public static <C extends Converter<?, ?>> C getConverter(Class<C> converterClass) {
+        return (C) cache.computeIfAbsent(converterClass, clz -> {
+            try {
+                return (Converter<?, ?>) clz.getDeclaredConstructor().newInstance();
+            }
+            catch (Exception e) {
+                throw new RuntimeException("Failed to create converter: " + clz.getName(), e);
+            }
+        });
+    }
+}

+ 13 - 0
bd-park/park-backend/park-common/src/main/java/com/huashe/park/common/animations/mybatis/FieldConvert.java

@@ -0,0 +1,13 @@
+package com.huashe.park.common.animations.mybatis;
+
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.FIELD)
+public @interface FieldConvert {
+    Class<? extends Converter<?, ?>> converter();
+}

+ 34 - 0
bd-park/park-backend/park-common/src/main/java/com/huashe/park/common/animations/mybatis/FieldMetadataCache.java

@@ -0,0 +1,34 @@
+package com.huashe.park.common.animations.mybatis;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+public class FieldMetadataCache {
+    private static final Map<Class<?>, List<Field>> cache = new ConcurrentHashMap<>();
+
+    public static List<Field> getAnnotatedFields(Class<?> clazz, Class<? extends Annotation> annotation) {
+
+        return cache.computeIfAbsent(clazz, key -> {
+            List<Field> fields = new ArrayList<>();
+            Class<?> currentClass = clazz;
+            // 递归向上遍历所有父类
+            while (currentClass != null && currentClass != Object.class) {
+                Arrays.stream(currentClass.getDeclaredFields()).filter(f -> f.isAnnotationPresent(annotation))
+                    .forEach(filed -> {
+                        if (!filed.isAccessible()) {
+                            filed.setAccessible(true);
+                        }
+                        fields.add(filed);
+                    });
+                currentClass = currentClass.getSuperclass();
+            }
+            return Collections.unmodifiableList(fields);
+        });
+    }
+}

+ 97 - 0
bd-park/park-backend/park-common/src/main/java/com/huashe/park/common/animations/mybatis/handler/MySqlJsonHandler.java

@@ -0,0 +1,97 @@
+package com.huashe.park.common.animations.mybatis.handler;
+
+import java.sql.CallableStatement;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+import org.apache.ibatis.type.BaseTypeHandler;
+import org.apache.ibatis.type.JdbcType;
+import org.apache.ibatis.type.MappedTypes;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONObject;
+import com.alibaba.fastjson2.JSONWriter;
+
+/**
+ * @author fuwu314
+ * @describe:mysqlJson类型处理类
+ * @date 2024/9/18
+ */
+@MappedTypes(JSONObject.class)
+public class MySqlJsonHandler<T extends Object> extends BaseTypeHandler<T> {
+    private final static Logger log = LoggerFactory.getLogger(MySqlJsonHandler.class);
+
+    private Class<T> clazz;
+
+    public MySqlJsonHandler() {
+    }
+
+    public MySqlJsonHandler(Class<T> clazz) {
+        if (clazz == null)
+            throw new IllegalArgumentException("Type argument cannot be null");
+        this.clazz = clazz;
+    }
+
+    @Override
+    public void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException {
+        ps.setString(i, this.toJson(parameter));
+    }
+
+    @Override
+    public T getNullableResult(ResultSet rs, String columnName) throws SQLException {
+        return this.toObject(rs.getString(columnName), clazz);
+    }
+
+    @Override
+    public T getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
+        return this.toObject(rs.getString(columnIndex), clazz);
+    }
+
+    @Override
+    public T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
+        return this.toObject(cs.getString(columnIndex), clazz);
+    }
+
+    /**
+     * 将字符串内容转换为指定类型的对象
+     *
+     * @param content 字符串内容
+     * @param clazz 目标类型
+     * @return 目标类型的对象
+     */
+    private T toObject(String content, Class<T> clazz) {
+        if (content != null && !content.isEmpty()) {
+            try {
+                return JSON.parseObject(content, clazz);
+            }
+            catch (Exception e) {
+                log.error("解析JSON字符串出错", e);
+                return null;
+            }
+        }
+        else {
+            return null;
+        }
+    }
+
+    /**
+     * 将对象转换为JSON字符串
+     *
+     * @param object 要转换的对象
+     * @return JSON字符串
+     * @throws RuntimeException 如果转换过程中发生异常
+     */
+    private String toJson(T object) {
+        try {
+            return JSON.toJSONString(object, JSONWriter.Feature.WriteMapNullValue);
+        }
+        catch (Exception e) {
+            log.error("解析JSON字符串出错", e);
+            return "[]";
+        }
+    }
+
+}

+ 16 - 0
bd-park/park-backend/park-common/src/main/java/com/huashe/park/common/animations/mybatis/service/JsonConverter.java

@@ -0,0 +1,16 @@
+package com.huashe.park.common.animations.mybatis.service;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.alibaba.fastjson2.JSONObject;
+import com.huashe.park.common.animations.mybatis.Converter;
+
+public class JsonConverter implements Converter<String, JSONObject> {
+    @Override
+    public JSONObject convert(String source) {
+        if (StringUtils.isEmpty(source)) {
+            return null;
+        }
+        return JSONObject.parseObject(source);
+    }
+}

+ 14 - 0
bd-park/park-backend/park-common/src/main/java/com/huashe/park/common/consts/RedisKey.java

@@ -0,0 +1,14 @@
+package com.huashe.park.common.consts;
+
+public class RedisKey {
+    public interface PILE_MACHINE_MQTT {
+        String MQTT_TOPIC_PREFIX = "mqtt:process:%s";
+
+        String MQTT_TOPIC_PROCESS_MAX_PRESS = "maxPress";
+
+        String MQTT_TOPIC_PROCESS_MAX_DEPTH = "maxDepth";
+    }
+    public interface DEPTH_PRESS_TIPS {
+        int PILE_LENGTH_TIPS = 240;
+    }
+}

+ 39 - 0
bd-park/park-backend/park-core/src/main/java/com/huashe/park/core/redis/RedisProxy.java

@@ -7,6 +7,7 @@ import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
 
+import org.apache.commons.lang3.ObjectUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.BoundSetOperations;
 import org.springframework.data.redis.core.HashOperations;
@@ -14,6 +15,8 @@ import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.data.redis.core.ValueOperations;
 import org.springframework.stereotype.Service;
 
+import cn.hutool.core.bean.BeanUtil;
+
 @Service
 public class RedisProxy {
     @Autowired
@@ -238,4 +241,40 @@ public class RedisProxy {
     public Collection<String> keys(final String pattern) {
         return redisTemplate.keys(pattern);
     }
+
+    /**
+     * Put hash.
+     *
+     * @param <T> the type parameter
+     * @param key the key
+     * @param obj the obj
+     * @param expire the expire seconds
+     * @author chen.cheng
+     */
+    public <T> void putHash(String key, T obj, Integer expire) {
+        Map<String, Object> hash = BeanUtil.beanToMap(obj);
+        redisTemplate.opsForHash().putAll(key, hash);
+        if (ObjectUtils.isNotEmpty(expire)) {
+            redisTemplate.opsForHash().getOperations().expire(key, expire, TimeUnit.SECONDS);
+        }
+    }
+
+    public void putMapToHash(String key, Map<String, Object> obj, Integer expire) {
+        redisTemplate.opsForHash().putAll(key, obj);
+        if (ObjectUtils.isNotEmpty(expire)) {
+            redisTemplate.opsForHash().getOperations().expire(key, expire, TimeUnit.SECONDS);
+        }
+    }
+
+    public <T, R> void putHash(String key, String fieldName, R val) {
+        redisTemplate.opsForHash().put(key, fieldName, val);
+    }
+
+    public <R> R getHash(String key, String fieldName) {
+        return (R) redisTemplate.opsForHash().get(key, fieldName);
+    }
+
+    public Map getAllHash(String key) {
+        return redisTemplate.opsForHash().entries(key);
+    }
 }

+ 1 - 2
bd-park/park-backend/park-core/src/main/java/com/huashe/park/core/service/IMachineProcessResultService.java

@@ -1,6 +1,5 @@
 package com.huashe.park.core.service;
 
-import com.huashe.park.domain.dto.cons.ResultCADCsv;
 import com.huashe.park.domain.entity.MachineProcessResult;
 
 import java.util.List;
@@ -60,5 +59,5 @@ public interface IMachineProcessResultService {
      */
     public int deleteMachineProcessResultById(Long id);
 
-    List<ResultCADCsv> qeyConsUnitResult(Long consUnitId);
+    List<String[]> qeyConsUnitResult(Long consUnitId);
 }

+ 28 - 17
bd-park/park-backend/park-core/src/main/java/com/huashe/park/core/service/impl/ConsUnitInfoServiceImpl.java

@@ -31,6 +31,7 @@ import com.huashe.common.utils.DateUtils;
 import com.huashe.common.utils.StringUtils;
 import com.huashe.common.utils.uuid.Seq;
 import com.huashe.park.common.EnhancedIDGenerator;
+import com.huashe.park.common.consts.RedisKey;
 import com.huashe.park.common.consts.enums.ConsStatus;
 import com.huashe.park.common.excel.CsvAlias;
 import com.huashe.park.common.i18n.MessageUtils;
@@ -58,6 +59,7 @@ import com.ruoyi.common.config.RuoYiConfig;
 import com.ruoyi.common.utils.file.FileUtils;
 
 import cn.hutool.core.collection.ListUtil;
+import cn.hutool.core.convert.Convert;
 import cn.hutool.core.io.FileUtil;
 import cn.hutool.core.text.csv.CsvUtil;
 import cn.hutool.core.text.csv.CsvWriteConfig;
@@ -228,6 +230,7 @@ public class ConsUnitInfoServiceImpl implements IConsUnitInfoService {
 
     @Override
     public void importConsUnitHole(ConsUnitInfo consUnitInfo) {
+        // TODO 要做多项目切换
         int lastIndex = RuoYiConfig.getUploadPath().lastIndexOf("/");
         String filePath = consUnitInfo.getFileId().replaceFirst(PROFILE,
             RuoYiConfig.getUploadPath().substring(0, lastIndex));
@@ -244,20 +247,18 @@ public class ConsUnitInfoServiceImpl implements IConsUnitInfoService {
         List<CADJson> cadJsons = JSONArray.parseArray(json, CADJson.class);
         pileHoleInfoService.deleteConsPileHoleInfoByConsUnitId(consUnitInfo.getId());
         List<ConsPileHoleInfo> consPileHoleInfo = new ArrayList<>(cadJsons.size());
-        cadJsons.stream().filter(Objects::nonNull).forEach(item -> {
-            consPileHoleInfo.add(new ConsPileHoleInfo() {
-                {
-                    setConsUnitId(consUnitInfo.getId());
-                    setDeltaX(item.getCoordX());
-                    setDeltaY(item.getCoordY());
-                    setLng(item.getEarthCoordX());
-                    setLat(item.getEarthCoordY());
-                    setHoleNum(item.getPileNumber());
-                    setConsStatus(ConsStatus.CONS_STATUS_01.getCode());
-                    setDesDept(40L);
-                }
-            });
-        });
+        cadJsons.stream().filter(Objects::nonNull).forEach(item -> consPileHoleInfo.add(new ConsPileHoleInfo() {
+            {
+                setConsUnitId(consUnitInfo.getId());
+                setDeltaX(item.getCoordX());
+                setDeltaY(item.getCoordY());
+                setLng(item.getEarthCoordX());
+                setLat(item.getEarthCoordY());
+                setHoleNum(item.getPileNumber());
+                setConsStatus(ConsStatus.CONS_STATUS_01.getCode());
+                setDesDept(40L);
+            }
+        }));
         // 将 cadJsons,分拆成 100个 List<ConsPileHoleInfo>,批量插入
         List<List<ConsPileHoleInfo>> data = ListUtil.partition(consPileHoleInfo, 100);
         for (List<ConsPileHoleInfo> datum : data) {
@@ -373,12 +374,16 @@ public class ConsUnitInfoServiceImpl implements IConsUnitInfoService {
         ProjectInfo projectInfo = projectInfos.get(0);
         CsvWriteConfig csvWriteConfig = new CsvWriteConfig();
         Field[] fields = ReflectUtil.getFields(ResultCADCsv.class);
+        List<String> columnNames = new ArrayList<>();
         for (Field field : fields) {
             CsvAlias annotation = field.getAnnotation(CsvAlias.class);
             if (annotation != null) {
-                csvWriteConfig.addHeaderAlias(field.getName(), annotation.alias());
+                columnNames.add(annotation.alias());
             }
         }
+        for (int i = 0; i <= RedisKey.DEPTH_PRESS_TIPS.PILE_LENGTH_TIPS; i++) {
+            columnNames.add(String.format("%.2fm", i * 0.25));
+        }
         String filePath = StringUtils.format("{}/{}/{}_{}.{}", RuoYiConfig.getUploadPath(), DateUtils.datePath(),
             "cad-csv", Seq.getId("UPLOAD"), "csv");
         File csvFile = FileUtil.file(filePath);
@@ -418,9 +423,15 @@ public class ConsUnitInfoServiceImpl implements IConsUnitInfoService {
         header.add(new String[] {
             "Operator Name :", ""
         });
+
         writer.write(header);
-        List<ResultCADCsv> resultCADCsvs = machineProcessResultService.qeyConsUnitResult(consUnitInfo.getId());
-        writer.writeBeans(resultCADCsvs);
+        writer.write(new ArrayList<String[]>() {
+            {
+                add(Convert.toStrArray(columnNames));
+            }
+        });
+        List<String[]> resultCADCsvs = machineProcessResultService.qeyConsUnitResult(consUnitInfo.getId());
+        writer.write(resultCADCsvs);
         writer.flush();
         writer.close();
         return csvFile;

+ 21 - 5
bd-park/park-backend/park-core/src/main/java/com/huashe/park/core/service/impl/MachineProcessResultServiceImpl.java

@@ -2,10 +2,13 @@ package com.huashe.park.core.service.impl;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
 
+import com.alibaba.fastjson2.JSONObject;
 import com.huashe.park.common.DateTimeUtil;
 import com.huashe.park.common.consts.enums.ConsResult;
 import com.huashe.park.core.mapper.MachineProcessResultMapper;
@@ -15,6 +18,7 @@ import com.huashe.park.domain.dto.cons.ResultCADCsv;
 import com.huashe.park.domain.entity.MachineProcessResult;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.convert.Convert;
 
 /**
  * 桩机施工结果数据(2025-02-26版协议)Service业务层处理
@@ -95,10 +99,14 @@ public class MachineProcessResultServiceImpl implements IMachineProcessResultSer
     }
 
     @Override
-    public List<ResultCADCsv> qeyConsUnitResult(Long consUnitId) {
+    public List<String[]> qeyConsUnitResult(Long consUnitId) {
         List<ConsUnitResult> consUnitResults = machineProcessResultMapper.qeyConsUnitResult(consUnitId);
-        List<ResultCADCsv> resultCADCsvs = new ArrayList<>(consUnitResults.size());
+        List<String[]> resultCADCsvs = new ArrayList<>(consUnitResults.size());
         ResultCADCsv resultCADCsv;
+        ConsResult consResult;
+        Map<String, Object> stringObjectMap;
+        JSONObject depthPress;
+        String[] strings;
         for (ConsUnitResult consUnitResult : consUnitResults) {
             resultCADCsv = new ResultCADCsv();
             BeanUtil.copyProperties(consUnitResult, resultCADCsv);
@@ -109,13 +117,21 @@ public class MachineProcessResultServiceImpl implements IMachineProcessResultSer
             resultCADCsv.setStartingTime(
                 DateTimeUtil.getDateFromMills(consUnitResult.getDataTime(), DateTimeUtil.DateFormatter.HHmmss));
             resultCADCsv.setDuration(consUnitResult.getEndTime() - consUnitResult.getStartTime());
+
             // 评价结果转换
-            ConsResult consResult = ConsResult.getByCode(consUnitResult.getResultEvaluation());
+            consResult = ConsResult.getByCode(consUnitResult.getResultEvaluation());
             resultCADCsv.setEvaluation(consResult.getValue());
             resultCADCsv.setPullValue(consUnitResult.getSprayVolume());
-            resultCADCsv.setActualDepth(consUnitResult.getPileLength());
+            resultCADCsv.setActualDepth(consUnitResult.getPileLength() - consUnitResult.getSprayVolume());
             resultCADCsv.setEndingPress(consUnitResult.getPressure());
-            resultCADCsvs.add(resultCADCsv);
+            stringObjectMap = BeanUtil.beanToMap(resultCADCsv);
+            depthPress = consUnitResult.getDepthPress();
+            if (!CollectionUtils.isEmpty(depthPress)) {
+                stringObjectMap.putAll(depthPress);
+            }
+            strings = Convert.toStrArray(stringObjectMap.values());
+
+            resultCADCsvs.add(strings);
         }
         return resultCADCsvs;
     }

+ 3 - 4
bd-park/park-backend/park-core/src/main/resources/mapper/cons/ConsMachineCmdHisMapper.xml

@@ -7,8 +7,7 @@
     <resultMap type="ConsMachineCmdHis" id="ConsMachineCmdHisResult">
         <result property="id" column="id"/>
         <result property="toMachineId" column="to_machine_id"/>
-        <result property="cmdContent" column="cmd_content"
-                typeHandler="com.huashe.park.core.typehandle.MySqlJsonHandler"/>
+        <result property="cmdContent" column="cmd_content"/>
         <result property="cmdResult" column="cmd_result"/>
         <result property="updateTime" column="update_time"/>
         <result property="createTime" column="create_time"/>
@@ -53,7 +52,7 @@
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="toMachineId != null">#{toMachineId},</if>
-            <if test="cmdContent != null">#{cmdContent,typeHandler=com.huashe.park.core.typehandle.MySqlJsonHandler},</if>
+            <if test="cmdContent != null">#{cmdContent},</if>
             <if test="cmdResult != null">#{cmdResult},</if>
             <if test="updateTime != null">#{updateTime},</if>
             <if test="createTime != null">#{createTime},</if>
@@ -67,7 +66,7 @@
         <trim prefix="SET" suffixOverrides=",">
             <if test="toMachineId != null">to_machine_id = #{toMachineId},</if>
             <if test="cmdContent != null">cmd_content =
-                #{cmdContent,typeHandler=com.huashe.park.core.typehandle.MySqlJsonHandler},
+                #{cmdContent},
             </if>
             <if test="cmdResult != null">cmd_result = #{cmdResult},</if>
             <if test="updateTime != null">update_time = #{updateTime},</if>

+ 9 - 3
bd-park/park-backend/park-core/src/main/resources/mapper/cons/MachineProcessResultMapper.xml

@@ -49,7 +49,10 @@
         <result property="pullingStartTime" column="pulling_start_time"/>
         <result property="pullingEndTime" column="pulling_end_time"/>
     </resultMap>
-
+<!--    <resultMap id="ConsUnitResultResult" type="com.huashe.park.domain.dto.cons.ConsUnitResult">-->
+<!--        <result property="depthPress" column="depth_press"-->
+<!--                typeHandler="com.huashe.park.core.typehandle.MySqlJsonHandler"/>-->
+<!--    </resultMap>-->
     <sql id="selectMachineProcessResultVo">
         select id,
                cons_type,
@@ -448,11 +451,14 @@
                cphir.forward_tilt_angle,
                cphir.tilt_angle,
                cphir.hole_num,
-               cphir.spray_pressure pressure
+               cphir.spray_pressure pressure,
+               cphir.end_press,
+               cphir.depth_press
         from cons_machine_process_result cmpr
                  inner join cons_pile_hole_index_realtime cphir on
             cmpr.pile_id = cphir.hole_byte_key
-        where cphir.cons_unit_id = #{consUnitId} and cphir.status = '00'
+        where cphir.cons_unit_id = #{consUnitId}
+          and cphir.status = '00'
     </select>
 
 </mapper>

+ 11 - 0
bd-park/park-backend/park-core/src/main/resources/mapper/cons/PileHoleIndexRealtimeMapper.xml

@@ -27,6 +27,7 @@
         <result property="realLng" column="real_lng"/>
         <result property="consUnitId" column="cons_unit_id"/>
         <result property="holeNum" column="hole_num"/>
+
         <result property="updateTime" column="update_time"/>
         <result property="createTime" column="create_time"/>
         <result property="createBy" column="create_by"/>
@@ -55,6 +56,8 @@
                real_y,
                real_lat,
                real_lng,
+               end_press,
+               depth_press,
                update_time,
                create_time,
                create_by,
@@ -114,6 +117,8 @@
             <if test="realLng != null">real_lng,</if>
             <if test="consUnitId != null">cons_unit_id,</if>
             <if test="holeNum != null">hole_num,</if>
+            <if test="endPress != null">end_press,</if>
+            <if test="depthPress != null">depth_press,</if>
             <if test="updateTime != null">update_time,</if>
             <if test="createTime != null">create_time,</if>
             <if test="createBy != null">create_by,</if>
@@ -141,6 +146,8 @@
             <if test="realLng != null">#{realLng},</if>
             <if test="consUnitId != null">#{consUnitId},</if>
             <if test="holeNum != null">#{holeNum},</if>
+            <if test="endPress != null">#{endPress},</if>
+            <if test="depthPress != null">#{depthPress},</if>
             <if test="updateTime != null">#{updateTime},</if>
             <if test="createTime != null">#{createTime},</if>
             <if test="createBy != null">#{createBy},</if>
@@ -172,6 +179,8 @@
             <if test="realLng != null">real_lng = #{realLng},</if>
             <if test="consUnitId != null">cons_unit_id = #{consUnitId},</if>
             <if test="holeNum != null">hole_num = #{holeNum},</if>
+            <if test="endPress != null">end_press = #{endPress},</if>
+            <if test="depthPress != null">depth_press = #{depthPress},</if>
             <if test="updateTime != null">update_time = #{updateTime},</if>
             <if test="createTime != null">create_time = #{createTime},</if>
             <if test="createBy != null">create_by = #{createBy},</if>
@@ -200,6 +209,8 @@
             <if test="realLng != null">real_lng = #{realLng},</if>
             <if test="consUnitId != null">cons_unit_id = #{consUnitId},</if>
             <if test="holeNum != null">hole_num = #{holeNum},</if>
+            <if test="endPress != null">end_press = #{endPress},</if>
+            <if test="depthPress != null">depth_press = #{depthPress},</if>
             <if test="updateTime != null">update_time = #{updateTime},</if>
             <if test="createTime != null">create_time = #{createTime},</if>
             <if test="createBy != null">create_by = #{createBy},</if>

+ 3 - 4
bd-park/park-backend/park-core/src/main/resources/mapper/park/ParkAttendGroupMapper.xml

@@ -9,8 +9,7 @@
         <result property="name" column="name"/>
         <result property="remark" column="remark"/>
         <result property="poly" column="poly"/>
-        <result property="timeRange" column="time_range"
-                typeHandler="com.huashe.park.core.typehandle.MySqlJsonHandler"/>
+        <result property="timeRange" column="time_range"/>
         <result property="updateTime" column="update_time"/>
         <result property="createTime" column="create_time"/>
         <result property="createBy" column="create_by"/>
@@ -61,7 +60,7 @@
             <if test="name != null">#{name},</if>
             <if test="remark != null">#{remark},</if>
             <if test="poly != null">ST_GeomFromText(#{poly}),</if>
-            <if test="timeRange != null">#{timeRange,typeHandler=com.huashe.park.core.typehandle.MySqlJsonHandler},</if>
+            <if test="timeRange != null">#{timeRange},</if>
             <if test="updateTime != null">#{updateTime},</if>
             <if test="createTime != null">#{createTime},</if>
             <if test="createBy != null">#{createBy},</if>
@@ -76,7 +75,7 @@
             <if test="name != null">name = #{name},</if>
             <if test="remark != null">remark = #{remark},</if>
             <if test="poly != null">poly = ST_GeomFromText(#{poly}),</if>
-            <if test="timeRange != null">time_range = #{timeRange,typeHandler=com.huashe.park.core.typehandle.MySqlJsonHandler},</if>
+            <if test="timeRange != null">time_range = #{timeRange},</if>
             <if test="updateTime != null">update_time = #{updateTime},</if>
             <if test="createTime != null">create_time = #{createTime},</if>
             <if test="createBy != null">create_by = #{createBy},</if>

+ 3 - 4
bd-park/park-backend/park-core/src/main/resources/mapper/park/ParkInspectProjMapper.xml

@@ -6,8 +6,7 @@
 
     <resultMap type="ParkInspectProj" id="ParkInspectProjResult">
         <result property="id" column="id"/>
-        <result property="projContent" column="proj_content"
-                typeHandler="com.huashe.park.core.typehandle.MySqlJsonHandler"/>
+        <result property="projContent" column="proj_content"/>
         <result property="lng" column="lng"/>
         <result property="lat" column="lat"/>
         <result property="radius" column="radius"/>
@@ -63,7 +62,7 @@
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="projContent != null">
-                #{projContent,typeHandler=com.huashe.park.core.typehandle.MySqlJsonHandler},
+                #{projContent},
             </if>
             <if test="lng != null">#{lng},</if>
             <if test="lat != null">#{lat},</if>
@@ -80,7 +79,7 @@
     <update id="updateParkInspectProj" parameterType="ParkInspectProj">
         update park_inspect_proj
         <trim prefix="SET" suffixOverrides=",">
-            <if test="projContent != null">proj_content = #{projContent,typeHandler=com.huashe.park.core.typehandle.MySqlJsonHandler},</if>
+            <if test="projContent != null">proj_content = #{projContent},</if>
             <if test="lng != null">lng = #{lng},</if>
             <if test="lat != null">lat = #{lat},</if>
             <if test="radius != null">radius = #{radius},</if>

+ 8 - 29
bd-park/park-backend/park-domain/src/main/java/com/huashe/park/domain/dto/cons/ConsUnitResult.java

@@ -1,7 +1,13 @@
 package com.huashe.park.domain.dto.cons;
 
+import com.alibaba.fastjson2.JSONObject;
 import com.huashe.park.domain.entity.MachineProcessResult;
 
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
 public class ConsUnitResult extends MachineProcessResult {
     private Double forwardTiltAngle;
 
@@ -11,35 +17,8 @@ public class ConsUnitResult extends MachineProcessResult {
 
     private Double pressure;
 
-    public Double getForwardTiltAngle() {
-        return forwardTiltAngle;
-    }
-
-    public void setForwardTiltAngle(Double forwardTiltAngle) {
-        this.forwardTiltAngle = forwardTiltAngle;
-    }
-
-    public Double getTiltAngle() {
-        return tiltAngle;
-    }
-
-    public void setTiltAngle(Double tiltAngle) {
-        this.tiltAngle = tiltAngle;
-    }
-
-    public String getHoleNum() {
-        return holeNum;
-    }
-
-    public void setHoleNum(String holeNum) {
-        this.holeNum = holeNum;
-    }
+    private Float endPress;
 
-    public Double getPressure() {
-        return pressure;
-    }
+    private JSONObject depthPress;
 
-    public void setPressure(Double pressure) {
-        this.pressure = pressure;
-    }
 }

+ 2 - 2
bd-park/park-backend/park-domain/src/main/java/com/huashe/park/domain/dto/cons/ResultCADCsv.java

@@ -27,10 +27,10 @@ public class ResultCADCsv {
     private Long duration;
 
     @CsvAlias(alias = "X-coordinate")
-    private Double designX;
+    private Double realX;
 
     @CsvAlias(alias = "Y-coordinate")
-    private Double designY;
+    private Double realY;
 
     @CsvAlias(alias = "Height")
     private Double startHeight;

+ 1 - 1
bd-park/park-backend/park-domain/src/main/java/com/huashe/park/domain/entity/ConsPileHoleInfo.java

@@ -85,7 +85,7 @@ public class ConsPileHoleInfo extends BaseEntity {
 
     /** 桩径 */
     @Excel(name = "桩径")
-    private Long diameter;
+    private Long diameter = 0L;
 
     private Long consUnitId;
 

+ 3 - 0
bd-park/park-backend/park-domain/src/main/java/com/huashe/park/domain/entity/MachineProcessResult.java

@@ -3,9 +3,12 @@ package com.huashe.park.domain.entity;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
 
+import com.alibaba.fastjson2.JSONObject;
 import com.huashe.common.annotation.Excel;
 import com.huashe.common.domain.BaseEntity;
 import com.huashe.park.common.animations.FixedLength;
+import com.huashe.park.common.animations.mybatis.FieldConvert;
+import com.huashe.park.common.animations.mybatis.service.JsonConverter;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;

+ 9 - 0
bd-park/park-backend/park-domain/src/main/java/com/huashe/park/domain/entity/PileHoleIndexRealtime.java

@@ -2,6 +2,9 @@ package com.huashe.park.domain.entity;
 
 import java.util.Date;
 
+import com.alibaba.fastjson2.JSONObject;
+import com.huashe.park.common.animations.mybatis.FieldConvert;
+import com.huashe.park.common.animations.mybatis.service.JsonConverter;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
 
@@ -97,6 +100,12 @@ public class PileHoleIndexRealtime extends BaseEntity {
 
     private Double realLng;
 
+    private Float endPress;
+
+    @FieldConvert(converter = JsonConverter.class)
+    private JSONObject depthPress;
+
+
     @Override
     public String toString() {
         return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE).append("id", getId())

+ 55 - 0
bd-park/park-backend/park-infrastructure/src/main/java/com/huashe/park/infrastructure/cfg/mybatis/FieldConvertInterceptor.java

@@ -0,0 +1,55 @@
+package com.huashe.park.infrastructure.cfg.mybatis;
+
+import java.util.Arrays;
+import java.util.List;
+
+import com.huashe.park.common.animations.mybatis.FieldConvert;
+import org.apache.ibatis.executor.Executor;
+import org.apache.ibatis.mapping.MappedStatement;
+import org.apache.ibatis.plugin.Interceptor;
+import org.apache.ibatis.plugin.Intercepts;
+import org.apache.ibatis.plugin.Invocation;
+import org.apache.ibatis.plugin.Plugin;
+import org.apache.ibatis.plugin.Signature;
+import org.apache.ibatis.session.ResultHandler;
+import org.apache.ibatis.session.RowBounds;
+
+@Intercepts(@Signature(
+        type = Executor.class,
+        method = "query",
+        args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}
+))
+public class FieldConvertInterceptor implements Interceptor {
+    @Override
+    public Object intercept(Invocation invocation) throws Throwable {
+        // 执行原始查询逻辑
+        Object result = invocation.proceed();
+
+        // 处理结果集中的JSON字段
+//        if (result instanceof List) {
+//            ((List<?>) result).forEach(this::processJsonFields);
+//        } else if (result != null) {
+//            processJsonFields(result);
+//        }
+        return result;
+    }
+//
+//    private void processJsonFields(Object obj) {
+//        // 反射遍历所有标记@JsonField的字段
+//        Arrays.stream(obj.getClass().getDeclaredFields())
+//                .filter(f -> f.isAnnotationPresent(FieldConvert.class))
+//                .forEach(f -> {
+//                    try {
+//                        f.setAccessible(true);
+//                        String jsonValue = (String) f.get(obj);
+//                        if (jsonValue != null) {
+//                            JsonData data = new ObjectMapper().readValue(jsonValue, JsonData.class);
+//                            f.set(obj, data);
+//                        }
+//                    } catch (Exception e) {
+//                        throw new RuntimeException("JSON字段处理失败", e);
+//                    }
+//                });
+//    }
+
+}

+ 4 - 0
bd-park/park-backend/park-infrastructure/src/main/java/com/huashe/park/infrastructure/cfg/mybatis/RegisterCustomerInterceptor.java

@@ -23,8 +23,12 @@ public class RegisterCustomerInterceptor implements ApplicationListener<ContextR
     public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
         for (SqlSessionFactory factory : sqlSessionFactories) {
             factory.getConfiguration().setObjectWrapperFactory(new MapWrapperFactory());
+            // 这里注册的类型处理不能在mybatis启动的时候注册,所以需要在framework的工程里面MybatisConfig中注册,才能在rs字段映射的时候起作用。
+            // 这里注册只能是已经是默认转换完了在进行转换,可以转换同类型的字段比如字段的加解密
+            // factory.getConfiguration().getTypeHandlerRegistry().register(new MySqlJsonHandler<>());
             // 由于mybatis拦截器使用责任链模式,有可能会导致自定义拦截器失效,因此下面方法可以将自定义拦截器重新注入到sql中
             factory.getConfiguration().addInterceptor(mybatisInterceptor);
+            // factory.getConfiguration().addInterceptor(new FieldConvertInterceptor());
         }
     }
 }

+ 77 - 0
bd-park/park-backend/park-infrastructure/src/main/java/com/huashe/park/infrastructure/cfg/mybatis/ResultTypeConvertInterceptor.java

@@ -0,0 +1,77 @@
+package com.huashe.park.infrastructure.cfg.mybatis;
+
+import java.lang.reflect.Field;
+import java.sql.Statement;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.apache.ibatis.executor.resultset.ResultSetHandler;
+import org.apache.ibatis.mapping.MappedStatement;
+import org.apache.ibatis.plugin.Interceptor;
+import org.apache.ibatis.plugin.Intercepts;
+import org.apache.ibatis.plugin.Invocation;
+import org.apache.ibatis.plugin.Signature;
+import org.apache.ibatis.reflection.MetaObject;
+import org.apache.ibatis.reflection.SystemMetaObject;
+import org.springframework.util.ReflectionUtils;
+
+import com.huashe.park.common.animations.mybatis.Converter;
+import com.huashe.park.common.animations.mybatis.ConverterCache;
+import com.huashe.park.common.animations.mybatis.FieldConvert;
+import com.huashe.park.common.animations.mybatis.FieldMetadataCache;
+
+@Intercepts(@Signature(type = ResultSetHandler.class, method = "handleResultSets", args = {
+    Statement.class
+}))
+public class ResultTypeConvertInterceptor implements Interceptor {
+    @Override
+    public Object intercept(Invocation invocation) throws Throwable {
+        Object result = invocation.proceed();
+
+        // 获取MappedStatement
+        ResultSetHandler handler = (ResultSetHandler) invocation.getTarget();
+        MetaObject metaObject = SystemMetaObject.forObject(handler);
+        MappedStatement mappedStatement = (MappedStatement) metaObject.getValue("mappedStatement");
+
+        // 判断是否为resultType映射
+        if (mappedStatement.getResultMaps().size() == 1
+            && mappedStatement.getResultMaps().get(0).getResultMappings().isEmpty()) {
+            return filterResultType(result); // 仅处理resultType
+        }
+        return result; // 不处理resultMap
+    }
+
+    private Object filterResultType(Object result) {
+        // 自定义过滤逻辑(如字段脱敏、数据转换等)
+        if (result instanceof List) {
+            return ((List<?>) result).stream().map(this::processBean).collect(Collectors.toList());
+        }
+        return processBean(result);
+    }
+
+    private Object processBean(Object bean) {
+        if (bean == null) {
+            return null;
+        }
+        Class<?> clazz = bean.getClass();
+        List<Field> annotatedFields = FieldMetadataCache.getAnnotatedFields(clazz, FieldConvert.class);
+        // 遍历类及父类的所有字段
+
+        annotatedFields.forEach(field -> {
+            FieldConvert annotation = field.getAnnotation(FieldConvert.class);
+            if (annotation != null) {
+                // 获取转换器实例(带缓存)
+                Converter converter = ConverterCache.getConverter(annotation.converter());
+                // 获取原始值
+                Object originalValue = ReflectionUtils.getField(field, bean);
+                // 执行类型转换
+                Object convertedValue = converter.convert(originalValue);
+                // 设置转换后的值
+                ReflectionUtils.setField(field, bean, convertedValue);
+            }
+        }); // 包含私有字段
+
+        return bean;
+    }
+
+}

+ 30 - 50
common-application/ruoyi-framework/src/main/java/com/ruoyi/framework/config/MyBatisConfig.java

@@ -1,11 +1,7 @@
 package com.ruoyi.framework.config;
 
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import javax.sql.DataSource;
+import com.ruoyi.common.utils.StringMatchUtils;
+import com.ruoyi.framework.config.handler.MySqlJsonHandler;
 import org.apache.ibatis.io.VFS;
 import org.apache.ibatis.session.SqlSessionFactory;
 import org.mybatis.spring.SqlSessionFactoryBean;
@@ -22,90 +18,74 @@ import org.springframework.core.type.classreading.CachingMetadataReaderFactory;
 import org.springframework.core.type.classreading.MetadataReader;
 import org.springframework.core.type.classreading.MetadataReaderFactory;
 import org.springframework.util.ClassUtils;
-import com.ruoyi.common.utils.StringMatchUtils;
+
+import javax.sql.DataSource;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
 
 /**
  * Mybatis支持*匹配扫描包
- * 
+ *
  * @author ruoyi
  */
 @Configuration
-public class MyBatisConfig
-{
+public class MyBatisConfig {
     @Autowired
     private Environment env;
 
     static final String DEFAULT_RESOURCE_PATTERN = "**/*.class";
 
-    public static String setTypeAliasesPackage(String typeAliasesPackage)
-    {
+    public static String setTypeAliasesPackage(String typeAliasesPackage) {
         ResourcePatternResolver resolver = (ResourcePatternResolver) new PathMatchingResourcePatternResolver();
         MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(resolver);
         List<String> allResult = new ArrayList<String>();
-        try
-        {
-            for (String aliasesPackage : typeAliasesPackage.split(","))
-            {
+        try {
+            for (String aliasesPackage : typeAliasesPackage.split(",")) {
                 List<String> result = new ArrayList<String>();
                 aliasesPackage = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX
                         + ClassUtils.convertClassNameToResourcePath(aliasesPackage.trim()) + "/" + DEFAULT_RESOURCE_PATTERN;
                 Resource[] resources = resolver.getResources(aliasesPackage);
-                if (resources != null && resources.length > 0)
-                {
+                if (resources != null && resources.length > 0) {
                     MetadataReader metadataReader = null;
-                    for (Resource resource : resources)
-                    {
-                        if (resource.isReadable())
-                        {
+                    for (Resource resource : resources) {
+                        if (resource.isReadable()) {
                             metadataReader = metadataReaderFactory.getMetadataReader(resource);
-                            try
-                            {
+                            try {
                                 result.add(Class.forName(metadataReader.getClassMetadata().getClassName()).getPackage().getName());
-                            }
-                            catch (ClassNotFoundException e)
-                            {
+                            } catch (ClassNotFoundException e) {
                                 e.printStackTrace();
                             }
                         }
                     }
                 }
-                if (result.size() > 0)
-                {
+                if (result.size() > 0) {
                     HashSet<String> hashResult = new HashSet<String>(result);
                     allResult.addAll(hashResult);
                 }
             }
-            if (allResult.size() > 0)
-            {
+            if (allResult.size() > 0) {
                 typeAliasesPackage = String.join(",", (String[]) allResult.toArray(new String[0]));
-            }
-            else
-            {
+            } else {
                 throw new RuntimeException("mybatis typeAliasesPackage 路径扫描错误,参数typeAliasesPackage:" + typeAliasesPackage + "未找到任何包");
             }
-        }
-        catch (IOException e)
-        {
+        } catch (IOException e) {
             e.printStackTrace();
         }
         return typeAliasesPackage;
     }
 
-    public Resource[] resolveMapperLocations(String[] mapperLocations)
-    {
+    public Resource[] resolveMapperLocations(String[] mapperLocations) {
         ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();
         List<Resource> resources = new ArrayList<Resource>();
-        if (mapperLocations != null)
-        {
-            for (String mapperLocation : mapperLocations)
-            {
-                try
-                {
+        if (mapperLocations != null) {
+            for (String mapperLocation : mapperLocations) {
+                try {
                     Resource[] mappers = resourceResolver.getResources(mapperLocation);
                     resources.addAll(Arrays.asList(mappers));
-                }
-                catch (IOException e)
-                {
+                } catch (IOException e) {
                     // ignore
                 }
             }
@@ -114,8 +94,7 @@ public class MyBatisConfig
     }
 
     @Bean
-    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception
-    {
+    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
         String typeAliasesPackage = env.getProperty("mybatis.typeAliasesPackage");
         String mapperLocations = env.getProperty("mybatis.mapperLocations");
         String configLocation = env.getProperty("mybatis.configLocation");
@@ -127,6 +106,7 @@ public class MyBatisConfig
         sessionFactory.setTypeAliasesPackage(typeAliasesPackage);
         sessionFactory.setMapperLocations(resolveMapperLocations(StringMatchUtils.split(mapperLocations, ",")));
         sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation));
+        sessionFactory.addTypeHandlers(new MySqlJsonHandler<>(Object.class));
         return sessionFactory.getObject();
     }
 }

+ 91 - 0
common-application/ruoyi-framework/src/main/java/com/ruoyi/framework/config/handler/MySqlJsonHandler.java

@@ -0,0 +1,91 @@
+package com.ruoyi.framework.config.handler;
+
+
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONArray;
+import com.alibaba.fastjson2.JSONObject;
+import com.alibaba.fastjson2.JSONWriter;
+import org.apache.ibatis.type.BaseTypeHandler;
+import org.apache.ibatis.type.JdbcType;
+import org.apache.ibatis.type.MappedTypes;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.sql.CallableStatement;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+/**
+ * @author fuwu314
+ * @describe:mysqlJson类型处理类
+ * @date 2024/9/18
+ */
+@MappedTypes(value = {JSONObject.class, JSONArray.class})
+public class MySqlJsonHandler<T extends Object> extends BaseTypeHandler<T> {
+    private final static Logger log = LoggerFactory.getLogger(MySqlJsonHandler.class);
+    private Class<T> clazz;
+
+    public MySqlJsonHandler(Class<T> clazz) {
+        if (clazz == null) throw new IllegalArgumentException("Type argument cannot be null");
+        this.clazz = clazz;
+    }
+
+    @Override
+    public void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException {
+        ps.setString(i, this.toJson(parameter));
+    }
+
+    @Override
+    public T getNullableResult(ResultSet rs, String columnName) throws SQLException {
+        return this.toObject(rs.getString(columnName), clazz);
+    }
+
+    @Override
+    public T getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
+        return this.toObject(rs.getString(columnIndex), clazz);
+    }
+
+    @Override
+    public T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
+        return this.toObject(cs.getString(columnIndex), clazz);
+    }
+
+    /**
+     * 将字符串内容转换为指定类型的对象
+     *
+     * @param content 字符串内容
+     * @param clazz   目标类型
+     * @return 目标类型的对象
+     */
+    private T toObject(String content, Class<T> clazz) {
+        if (content != null && !content.isEmpty()) {
+            try {
+                return JSON.parseObject(content, clazz);
+            } catch (Exception e) {
+                log.error("解析JSON字符串出错", e);
+                return null;
+            }
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * 将对象转换为JSON字符串
+     *
+     * @param object 要转换的对象
+     * @return JSON字符串
+     * @throws RuntimeException 如果转换过程中发生异常
+     */
+    private String toJson(T object) {
+        try {
+            return JSON.toJSONString(object, JSONWriter.Feature.WriteMapNullValue);
+        } catch (Exception e) {
+            log.error("解析JSON字符串出错", e);
+            return "[]";
+        }
+    }
+
+
+}