skyline 1 rok pred
rodič
commit
84d68257dd
16 zmenil súbory, kde vykonal 426 pridanie a 232 odobranie
  1. 83 137
      car-wash-miniapp/src/main/java/com/kym/miniapp/mq/AliyunLotClient.java
  2. 258 0
      car-wash-miniapp/src/main/java/com/kym/miniapp/mq/AwoaraServiceImpl.java
  3. 0 2
      car-wash-miniapp/src/main/java/com/kym/miniapp/mq/MnsHandler.java
  4. 45 18
      car-wash-service/src/main/java/com/kym/service/awoara/AwoaraService.java
  5. 13 36
      car-wash-service/src/main/java/com/kym/service/awoara/entity/Method.java
  6. 6 0
      car-wash-service/src/main/java/com/kym/service/awoara/entity/event/Event.java
  7. 6 0
      car-wash-service/src/main/java/com/kym/service/awoara/entity/event/handle/AwoaraEventHandler.java
  8. 2 0
      car-wash-service/src/main/java/com/kym/service/awoara/entity/event/handle/BootEventHandler.java
  9. 2 0
      car-wash-service/src/main/java/com/kym/service/awoara/entity/event/handle/CardEventHandler.java
  10. 2 0
      car-wash-service/src/main/java/com/kym/service/awoara/entity/event/handle/DeviceStateEventHandler.java
  11. 2 0
      car-wash-service/src/main/java/com/kym/service/awoara/entity/event/handle/OrderCloseEventHandler.java
  12. 2 0
      car-wash-service/src/main/java/com/kym/service/awoara/entity/event/handle/OrderUpdateEventHandler.java
  13. 0 38
      car-wash-service/src/main/java/com/kym/service/awoara/entity/event/handle/ReportTypeHandle.java
  14. 2 0
      car-wash-service/src/main/java/com/kym/service/awoara/entity/event/handle/UserLoginEventHandler.java
  15. 1 1
      car-wash-service/src/main/java/com/kym/service/awoara/entity/response/AwoaraResponse.java
  16. 2 0
      car-wash-service/src/main/java/com/kym/service/awoara/factory/AwoaraEventHandlerFactory.java

+ 83 - 137
car-wash-service/src/main/java/com/kym/service/awoara/impl/AwoaraServiceImpl.java → car-wash-miniapp/src/main/java/com/kym/miniapp/mq/AliyunLotClient.java

@@ -1,49 +1,110 @@
-package com.kym.service.awoara.impl;
+package com.kym.miniapp.mq;
 
-import com.aliyun.iot20180120.Client;
 import com.aliyun.iot20180120.models.*;
 import com.aliyun.tea.TeaModel;
-import com.kym.service.awoara.AwoaraService;
-import com.kym.service.awoara.entity.ApiList;
-import com.kym.service.awoara.entity.Config;
-import com.kym.service.awoara.entity.MethodHelp;
-import com.kym.service.awoara.entity.event.OrderInfo;
-import com.kym.service.awoara.entity.response.AwoaraResponse;
-import com.kym.service.awoara.entity.response.CreateOrder;
-import com.kym.service.awoara.entity.response.HardwareInfo;
-import com.kym.service.awoara.entity.response.State;
+import com.kym.miniapp.config.AliyunLotConfig;
+import jakarta.annotation.PostConstruct;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
 import java.util.Arrays;
+import java.util.Base64;
 import java.util.List;
-import java.util.Map;
 
-@Service
+/**
+ * 阿里云物联网平台
+ *
+ * @author skyline
+ */
 @Slf4j
-public class AwoaraServiceImpl implements AwoaraService {
+@Service
+public class AliyunLotClient {
 
-    private static final String ENDPOINT = "iot.cn-shanghai.aliyuncs.com";
-    private static final String IOT_INSTANCE_ID = "iot.cn-shanghai.aliyuncs.com";
-    private static final String GROUP_ID = "iot.cn-shanghai.aliyuncs.com";
+    private static AliyunLotConfig aliyunLotConfig;
+    private static com.aliyun.iot20180120.Client rRpcClient;
 
+    private static Base64.Encoder encoder = Base64.getEncoder();
 
-    // ============================================================== 阿里云lot主动请求 ==============================================================
+    public AliyunLotClient(AliyunLotConfig aliyunLotConfig) {
+        this.aliyunLotConfig = aliyunLotConfig;
+    }
 
     /**
      * 初始化IoT(Iot20180120)客户端
      */
-    public static com.aliyun.iot20180120.Client initialization() throws Exception {
-        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config().setRegionId("cn-shanghai").setAccessKeyId(System.getenv("ACCESS_KEY_ID")).setAccessKeySecret(System.getenv("ACCESS_KEY_SECRET"));
-        return new com.aliyun.iot20180120.Client(config);
+    @PostConstruct
+    public void init() throws Exception {
+        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
+                .setRegionId("cn-shanghai")
+                .setAccessKeyId(aliyunLotConfig.accessKey)
+                .setAccessKeySecret(aliyunLotConfig.accessSecret);
+        rRpcClient = new com.aliyun.iot20180120.Client(config);
     }
 
+    /**
+     * 调用Iot20180120客户端发送请求
+     * 2.CreateSubscribeRelation 创建MNS或AMQP服务端订阅
+     */
+    public static CreateSubscribeRelationResponseBody createSubscribeRelation(com.aliyun.iot20180120.Client client, String instanceId, String productKey, String type, Boolean deviceDataFlag, Boolean deviceLifeCycleFlag, Boolean deviceStatusChangeFlag, Boolean deviceTagFlag, Boolean deviceTopoLifeCycleFlag, Boolean foundDeviceListFlag, Boolean otaEventFlag, Boolean otaJobFlag, Boolean otaVersionFlag, Boolean thingHistoryFlag, String mnsConfiguration, String consumerGroupIds) throws Exception {
+        CreateSubscribeRelationRequest request = new CreateSubscribeRelationRequest().setProductKey(productKey).setType(type).setIotInstanceId(instanceId).setThingHistoryFlag(thingHistoryFlag).setOtaVersionFlag(otaVersionFlag).setOtaJobFlag(otaJobFlag).setOtaEventFlag(otaEventFlag).setFoundDeviceListFlag(foundDeviceListFlag).setDeviceTopoLifeCycleFlag(deviceTopoLifeCycleFlag).setDeviceTagFlag(deviceTagFlag).setDeviceStatusChangeFlag(deviceStatusChangeFlag).setDeviceLifeCycleFlag(deviceLifeCycleFlag).setDeviceDataFlag(deviceDataFlag).setMnsConfiguration(mnsConfiguration);
+        // 创建的AMQP订阅中的消费组ID,Type为AMQP时必填。
+        if (!com.aliyun.teautil.Common.empty(consumerGroupIds)) {
+            request.consumerGroupIds = Arrays.stream(consumerGroupIds.split(",", 100)).toList();
+        }
+
+        log.info("-------------------2.CreateSubscribeRelation 创建MNS或AMQP服务端订阅--------------------");
+        CreateSubscribeRelationResponse response = client.createSubscribeRelation(request);
+        log.info(com.aliyun.teautil.Common.toJSONString(TeaModel.buildMap(response.body)));
+        return response.body;
+    }
+
+    /**
+     * 调用Iot20180120客户端发送请求
+     * 3.UpdateSubscribeRelation 修改MNS或AMQP服务端订阅
+     */
+    public static UpdateSubscribeRelationResponseBody updateSubscribeRelation(com.aliyun.iot20180120.Client client, String iotInstanceId, String productKey, String type, Boolean deviceDataFlag, Boolean deviceLifeCycleFlag, Boolean deviceStatusChangeFlag, Boolean deviceTagFlag, Boolean deviceTopoLifeCycleFlag, Boolean foundDeviceListFlag, Boolean otaEventFlag, Boolean otaJobFlag, Boolean otaVersionFlag, Boolean thingHistoryFlag, String mnsConfiguration, String consumerGroupIds) throws Exception {
+        UpdateSubscribeRelationRequest request = new UpdateSubscribeRelationRequest().setProductKey(productKey).setType(type).setIotInstanceId(iotInstanceId).setThingHistoryFlag(thingHistoryFlag).setOtaVersionFlag(otaVersionFlag).setOtaJobFlag(otaJobFlag).setOtaEventFlag(otaEventFlag).setFoundDeviceListFlag(foundDeviceListFlag).setDeviceTopoLifeCycleFlag(deviceTopoLifeCycleFlag).setDeviceTagFlag(deviceTagFlag).setDeviceStatusChangeFlag(deviceStatusChangeFlag).setDeviceLifeCycleFlag(deviceLifeCycleFlag).setDeviceDataFlag(deviceDataFlag).setMnsConfiguration(mnsConfiguration);
+        // 创建的AMQP订阅中的消费组ID,Type为AMQP时必填。
+        if (!com.aliyun.teautil.Common.empty(consumerGroupIds)) {
+            request.consumerGroupIds = Arrays.stream(consumerGroupIds.split(",", 100)).toList();
+        }
+
+        log.info("-------------------3.UpdateSubscribeRelation 修改MNS或AMQP服务端订阅--------------------");
+        UpdateSubscribeRelationResponse response = client.updateSubscribeRelation(request);
+        log.info(com.aliyun.teautil.Common.toJSONString(TeaModel.buildMap(response.body)));
+        return response.body;
+    }
+
+    /**
+     * 调用Iot20180120客户端发送请求
+     * 4.DeleteSubscribeRelation 删除MNS或AMQP服务端订阅
+     */
+    public static DeleteSubscribeRelationResponseBody deleteSubscribeRelation(com.aliyun.iot20180120.Client client, String iotInstanceId, String productKey, String type) throws Exception {
+        DeleteSubscribeRelationRequest request = new DeleteSubscribeRelationRequest().setProductKey(productKey).setType(type).setIotInstanceId(iotInstanceId);
+        log.info("-------------------4.DeleteSubscribeRelation 删除MNS或AMQP服务端订阅--------------------");
+        DeleteSubscribeRelationResponse response = client.deleteSubscribeRelation(request);
+        log.info(com.aliyun.teautil.Common.toJSONString(TeaModel.buildMap(response.body)));
+        return response.body;
+    }
+
+    public static RRpcResponse rRpc(String productKey, String deviceName, String requestJson) throws Exception {
+        var requestBase64Byte = new String(encoder.encode(requestJson.getBytes()));
+        var request = new RRpcRequest().setIotInstanceId(aliyunLotConfig.getIotInstanceId()).setProductKey(productKey).setDeviceName(deviceName).setRequestBase64Byte(requestBase64Byte);
+        // 等待设备回复消息的时间,单位是毫秒,取值范围是1,000 ~8,000。
+        // 校验integer型入参
+        Integer iTimeout = 8000;
+        request.setTimeout(iTimeout);
+        log.info("-------------------1.RRpc:向指定设备发送请求消息,并同步返回响应--------------------");
+        RRpcResponse response = rRpcClient.rRpc(request);
+        log.info(com.aliyun.teautil.Common.toJSONString(TeaModel.buildMap(response)));
+        return response;
+    }
 
     /**
      * 调用Iot20180120客户端发送请求
      * 1.RRpc:向指定设备发送请求消息,并同步返回响应
      */
-    public static RRpcResponse rRpc(Client client, String iotInstanceId, String productKey, String deviceName, String requestBase64Byte, String timeout, String topic) throws Exception {
+    public static RRpcResponse rRpc(com.aliyun.iot20180120.Client client, String iotInstanceId, String productKey, String deviceName, String requestBase64Byte, String timeout, String topic) throws Exception {
         var request = new RRpcRequest().setIotInstanceId(iotInstanceId).setProductKey(productKey).setDeviceName(deviceName).setRequestBase64Byte(requestBase64Byte).setTopic(topic);
         // 等待设备回复消息的时间,单位是毫秒,取值范围是1,000 ~8,000。
         // 校验integer型入参
@@ -82,10 +143,6 @@ public class AwoaraServiceImpl implements AwoaraService {
         return response;
     }
 
-    // ============================================================== 阿里云lot主动请求 ==============================================================
-
-    // ============================================================== 石斑鱼上行消息 ==============================================================
-
     /**
      * 调用Iot20180120客户端发送请求
      * 1.QuerySubscribeRelation 查询MNS或AMQP服务端订阅
@@ -99,53 +156,6 @@ public class AwoaraServiceImpl implements AwoaraService {
     }
 
 
-    /**
-     * 调用Iot20180120客户端发送请求
-     * 2.CreateSubscribeRelation 创建MNS或AMQP服务端订阅
-     */
-    public static CreateSubscribeRelationResponseBody createSubscribeRelation(com.aliyun.iot20180120.Client client, String instanceId, String productKey, String type, Boolean deviceDataFlag, Boolean deviceLifeCycleFlag, Boolean deviceStatusChangeFlag, Boolean deviceTagFlag, Boolean deviceTopoLifeCycleFlag, Boolean foundDeviceListFlag, Boolean otaEventFlag, Boolean otaJobFlag, Boolean otaVersionFlag, Boolean thingHistoryFlag, String mnsConfiguration, String consumerGroupIds) throws Exception {
-        CreateSubscribeRelationRequest request = new CreateSubscribeRelationRequest().setProductKey(productKey).setType(type).setIotInstanceId(instanceId).setThingHistoryFlag(thingHistoryFlag).setOtaVersionFlag(otaVersionFlag).setOtaJobFlag(otaJobFlag).setOtaEventFlag(otaEventFlag).setFoundDeviceListFlag(foundDeviceListFlag).setDeviceTopoLifeCycleFlag(deviceTopoLifeCycleFlag).setDeviceTagFlag(deviceTagFlag).setDeviceStatusChangeFlag(deviceStatusChangeFlag).setDeviceLifeCycleFlag(deviceLifeCycleFlag).setDeviceDataFlag(deviceDataFlag).setMnsConfiguration(mnsConfiguration);
-        // 创建的AMQP订阅中的消费组ID,Type为AMQP时必填。
-        if (!com.aliyun.teautil.Common.empty(consumerGroupIds)) {
-            request.consumerGroupIds = Arrays.stream(consumerGroupIds.split(",", 100)).toList();
-        }
-
-        log.info("-------------------2.CreateSubscribeRelation 创建MNS或AMQP服务端订阅--------------------");
-        CreateSubscribeRelationResponse response = client.createSubscribeRelation(request);
-        log.info(com.aliyun.teautil.Common.toJSONString(TeaModel.buildMap(response.body)));
-        return response.body;
-    }
-
-    /**
-     * 调用Iot20180120客户端发送请求
-     * 3.UpdateSubscribeRelation 修改MNS或AMQP服务端订阅
-     */
-    public static UpdateSubscribeRelationResponseBody updateSubscribeRelation(com.aliyun.iot20180120.Client client, String iotInstanceId, String productKey, String type, Boolean deviceDataFlag, Boolean deviceLifeCycleFlag, Boolean deviceStatusChangeFlag, Boolean deviceTagFlag, Boolean deviceTopoLifeCycleFlag, Boolean foundDeviceListFlag, Boolean otaEventFlag, Boolean otaJobFlag, Boolean otaVersionFlag, Boolean thingHistoryFlag, String mnsConfiguration, String consumerGroupIds) throws Exception {
-        UpdateSubscribeRelationRequest request = new UpdateSubscribeRelationRequest().setProductKey(productKey).setType(type).setIotInstanceId(iotInstanceId).setThingHistoryFlag(thingHistoryFlag).setOtaVersionFlag(otaVersionFlag).setOtaJobFlag(otaJobFlag).setOtaEventFlag(otaEventFlag).setFoundDeviceListFlag(foundDeviceListFlag).setDeviceTopoLifeCycleFlag(deviceTopoLifeCycleFlag).setDeviceTagFlag(deviceTagFlag).setDeviceStatusChangeFlag(deviceStatusChangeFlag).setDeviceLifeCycleFlag(deviceLifeCycleFlag).setDeviceDataFlag(deviceDataFlag).setMnsConfiguration(mnsConfiguration);
-        // 创建的AMQP订阅中的消费组ID,Type为AMQP时必填。
-        if (!com.aliyun.teautil.Common.empty(consumerGroupIds)) {
-            request.consumerGroupIds = Arrays.stream(consumerGroupIds.split(",", 100)).toList();
-        }
-
-        log.info("-------------------3.UpdateSubscribeRelation 修改MNS或AMQP服务端订阅--------------------");
-        UpdateSubscribeRelationResponse response = client.updateSubscribeRelation(request);
-        log.info(com.aliyun.teautil.Common.toJSONString(TeaModel.buildMap(response.body)));
-        return response.body;
-    }
-
-    /**
-     * 调用Iot20180120客户端发送请求
-     * 4.DeleteSubscribeRelation 删除MNS或AMQP服务端订阅
-     */
-    public static DeleteSubscribeRelationResponseBody deleteSubscribeRelation(com.aliyun.iot20180120.Client client, String iotInstanceId, String productKey, String type) throws Exception {
-        DeleteSubscribeRelationRequest request = new DeleteSubscribeRelationRequest().setProductKey(productKey).setType(type).setIotInstanceId(iotInstanceId);
-        log.info("-------------------4.DeleteSubscribeRelation 删除MNS或AMQP服务端订阅--------------------");
-        DeleteSubscribeRelationResponse response = client.deleteSubscribeRelation(request);
-        log.info(com.aliyun.teautil.Common.toJSONString(TeaModel.buildMap(response.body)));
-        return response.body;
-    }
-
-
     void t1() {
         java.util.List<String> args = java.util.Arrays.asList("");
         // * param.1:IotInstanceId 实例ID
@@ -234,68 +244,4 @@ public class AwoaraServiceImpl implements AwoaraService {
             log.info(error.getMessage());
         }
     }
-
-    // ============================================================== 石斑鱼上行消息 ==============================================================
-
-    // ============================================================== 石斑鱼自定义API ==============================================================
-    @Override
-    public AwoaraResponse<ApiList> help() {
-        return null;
-    }
-
-    @Override
-    public AwoaraResponse<MethodHelp> methodHelp(String method) {
-        return null;
-    }
-
-    @Override
-    public AwoaraResponse<?> showMsgbox(Map<String, Object> params) {
-        return null;
-    }
-
-    @Override
-    public AwoaraResponse<?> hideMsgbox() {
-        return null;
-    }
-
-    @Override
-    public AwoaraResponse<?> reboot() {
-        return null;
-    }
-
-    @Override
-    public AwoaraResponse<State> queryState() {
-        return null;
-    }
-
-    @Override
-    public AwoaraResponse<HardwareInfo> queryHardwareInfo() {
-        return null;
-    }
-
-    @Override
-    public AwoaraResponse<CreateOrder> createOrder() {
-        return null;
-    }
-
-    @Override
-    public AwoaraResponse<?> closeOrder(Map<String, Object> params) {
-        return null;
-    }
-
-    @Override
-    public AwoaraResponse<OrderInfo> queryOrder(String orderId) {
-        return null;
-    }
-
-    @Override
-    public AwoaraResponse<Config> readConfig() {
-        return null;
-    }
-
-    @Override
-    public AwoaraResponse<?> writeConfig(Config config) {
-        return null;
-    }
-    // ============================================================== 石斑鱼自定义API ==============================================================
 }

+ 258 - 0
car-wash-miniapp/src/main/java/com/kym/miniapp/mq/AwoaraServiceImpl.java

@@ -0,0 +1,258 @@
+package com.kym.miniapp.mq;
+
+import com.alibaba.fastjson2.JSONObject;
+import com.alibaba.fastjson2.TypeReference;
+import com.kym.common.exception.BusinessException;
+import com.kym.common.utils.CommUtil;
+import com.kym.service.awoara.AwoaraService;
+import com.kym.service.awoara.entity.ApiList;
+import com.kym.service.awoara.entity.Config;
+import com.kym.service.awoara.entity.MethodHelp;
+import com.kym.service.awoara.entity.event.OrderInfo;
+import com.kym.service.awoara.entity.response.AwoaraResponse;
+import com.kym.service.awoara.entity.response.CreateOrder;
+import com.kym.service.awoara.entity.response.HardwareInfo;
+import com.kym.service.awoara.entity.response.State;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.nio.charset.StandardCharsets;
+import java.util.Base64;
+
+import static cn.hutool.http.HttpStatus.HTTP_OK;
+
+/**
+ * 石斑鱼主板API
+ *
+ * @author skyline
+ */
+@Service
+@Slf4j
+public class AwoaraServiceImpl implements AwoaraService {
+
+
+    /**
+     * BASE64解码器
+     */
+    private static Base64.Decoder decoder = Base64.getDecoder();
+
+    static <T> AwoaraResponse<T> doRequest(String productKey, String deviceName, String params, TypeReference<AwoaraResponse<T>>... typeReference) {
+        try {
+            var response = AliyunLotClient.rRpc(productKey, deviceName, params);
+            if (HTTP_OK == response.getStatusCode()) {
+                if (CommUtil.isNotEmptyAndNull(typeReference)) {
+                    return JSONObject.parseObject(new String(decoder.decode(response.getBody().payloadBase64Byte), StandardCharsets.UTF_8), typeReference[0]);
+                } else {
+                    return JSONObject.parseObject(new String(decoder.decode(response.getBody().payloadBase64Byte), StandardCharsets.UTF_8), AwoaraResponse.class);
+                }
+
+            } else {
+                throw new BusinessException("AliyunLot响应异常");
+            }
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    @Override
+    public AwoaraResponse<ApiList> help(String productKey, String deviceName) {
+        var params = """
+                {
+                    "version": "2.0",
+                    "method": "help",
+                    "params": []
+                }
+                """;
+        return doRequest(productKey, deviceName, params, new TypeReference<AwoaraResponse<ApiList>>() {
+        });
+    }
+
+    @Override
+    public AwoaraResponse<MethodHelp> methodHelp(String productKey, String deviceName, String method) {
+        var params = """
+                {
+                    "version": "2.0",
+                    "method": "help",
+                    "params": {
+                        "method": "%s"
+                     }
+                }
+                """.formatted(method);
+        return doRequest(productKey, deviceName, params, new TypeReference<AwoaraResponse<MethodHelp>>() {
+        });
+
+    }
+
+    @Override
+    public AwoaraResponse<?> showMsgbox(String productKey, String deviceName, String title, String content, int seconds) {
+        var params = """
+                {
+                    "version": "2.0",
+                        "method": "show_msgbox",
+                        "params": {
+                            "title": %s,
+                            "content": %s,
+                            "seconds": %d
+                        }
+                }
+                """.formatted(title, content, seconds);
+
+        return doRequest(productKey, deviceName, params, null);
+    }
+
+    @Override
+    public AwoaraResponse<?> hideMsgbox(String productKey, String deviceName) {
+        var params = """
+                {
+                    "version": "2.0",
+                    "method": "hide_msgbox",
+                    "params": []
+                }
+                """;
+        return doRequest(productKey, deviceName, params, null);
+    }
+
+    @Override
+    public AwoaraResponse<?> reboot(String productKey, String deviceName) {
+        var params = """
+                {
+                    "version": "2.0",
+                    "method": "reboot",
+                    "params": []
+                }
+                """;
+        return doRequest(productKey, deviceName, params, null);
+    }
+
+    @Override
+    public AwoaraResponse<State> queryState(String productKey, String deviceName) {
+        var params = """
+                {
+                    "version": "2.0",
+                    "method": "query_state",
+                    "params": []
+                }
+                """;
+        return doRequest(productKey, deviceName, params, new TypeReference<AwoaraResponse<State>>() {
+        });
+    }
+
+    @Override
+    public AwoaraResponse<HardwareInfo> queryHardwareInfo(String productKey, String deviceName) {
+        var params = """
+                {
+                    "version": "2.0",
+                    "method": "query_hardware_info",
+                    "params": []
+                }
+                """;
+        return doRequest(productKey, deviceName, params, new TypeReference<AwoaraResponse<HardwareInfo>>() {
+        });
+    }
+
+    @Override
+    public AwoaraResponse<CreateOrder> createOrder(String productKey, String deviceName, String orderId, String memberName, int memberBalance, int memberDiscount, int prepayMoney) {
+        var params = """
+                {
+                    "version": "2.0",
+                    "method": "create_order",
+                    "params": {
+                        "order_id": %s,
+                        "member_name": %s,
+                        "member_balance": %d,
+                        "member_discount": %d,
+                        "prepay_money": %d
+                    }
+                }
+                """.formatted(orderId, memberName, memberBalance, memberDiscount, prepayMoney);
+        return doRequest(productKey, deviceName, params, new TypeReference<AwoaraResponse<CreateOrder>>() {
+        });
+    }
+
+    @Override
+    public AwoaraResponse<?> closeOrder(String productKey, String deviceName, String orderId, int forceClose) {
+        var params = """
+                {
+                    "version": "2.0",
+                    "method": "close_order",
+                    "params": {
+                        "order_id": %s,
+                        "force_close": %d
+                     }
+                }
+                """.formatted(orderId, forceClose);
+        return doRequest(productKey, deviceName, params, null);
+    }
+
+    @Override
+    public AwoaraResponse<OrderInfo> queryOrder(String productKey, String deviceName, String orderId) {
+        var params = """
+                {
+                    "version": "2.0",
+                    "method": "query_order",
+                    "params": {
+                        "order_id": %s
+                     }
+                }
+                """.formatted(orderId);
+        return doRequest(productKey, deviceName, params, new TypeReference<AwoaraResponse<OrderInfo>>() {
+        });
+    }
+
+    @Override
+    public AwoaraResponse<Config> readConfig(String productKey, String deviceName) {
+        var params = """
+                {
+                    "version": "2.0",
+                    "method": "read_config",
+                    "params": []
+                }
+                """;
+        return doRequest(productKey, deviceName, params, new TypeReference<AwoaraResponse<Config>>() {
+        });
+    }
+
+    @Override
+    public AwoaraResponse<?> writeConfig(String productKey, String deviceName, Config config) {
+        var params = """
+                {
+                    "version": "2.0",
+                    "method": "write_config",
+                    "params": {
+                        "version":2,
+                        "maintenance_mode": 0,
+                        "user_message.1": "快与慢自助洗车",
+                        "user_message.2": "客服电话:13018061579",
+                        "sensor_water": 0,
+                        "price_space": 10,
+                        "price_water": 150,
+                        "price_foam": 250,
+                        "price_tap": 100,
+                        "price_cleaner": 120,
+                        "price_user_ext": 100,
+                        "idle_timeout": 1200,
+                        "operation_timeout": 3600,
+                        "quick_open_money": 2000,
+                        "work_mode": 1,
+                        "work_time_period.1": "00:00 - 00:00",
+                        "work_time_period.2": "00:00 - 00:00",
+                        "light_mode": 2,
+                        "light_time_period.1": "00:00 - 05:30",
+                        "light_time_period.2": "18:30 - 00:00",
+                        "sound_volume": 60,
+                        "screen_type": 0,
+                        "video_source": 0,
+                        "video_play_delay": 20,
+                        "work_light_delay": 30,
+                        "bill_delay": 60,
+                        "notice_throshold_idle": 300,
+                        "notice_throshold_operation": 600,
+                        "motor_mode": 0,
+                        "tts_open_by_button":"欢迎使用快与慢自助洗车机",
+                        "tts_open_by_network":"欢迎使用快与慢自助洗车机"
+                     }
+                }
+                """;
+        return doRequest(productKey, deviceName, params, null);
+    }
+}

+ 0 - 2
car-wash-miniapp/src/main/java/com/kym/miniapp/mq/MnsHandler.java

@@ -144,8 +144,6 @@ public class MnsHandler {
     private static <T> MessageBody<T> parseMessageBody(String jsonStr, Class<T> clazz) {
         // 去掉json字符串中的转义符
         var json = StringEscapeUtils.unescapeJava(jsonStr);
-        // 获取到泛型类型
-
         return JSONObject.parseObject(json, new TypeReference<>(clazz) {
 
         });

+ 45 - 18
car-wash-service/src/main/java/com/kym/service/awoara/AwoaraService.java

@@ -9,69 +9,88 @@ import com.kym.service.awoara.entity.response.CreateOrder;
 import com.kym.service.awoara.entity.response.HardwareInfo;
 import com.kym.service.awoara.entity.response.State;
 
-import java.util.Map;
-
 /**
  * @author skyline
  * 石斑鱼洗车主板API接口
  * 2023/8/7 15:06
  */
 public interface AwoaraService {
+
     /**
      * 获取API列表
      *
      * @return
      */
-    AwoaraResponse<ApiList> help();
+    AwoaraResponse<ApiList> help(String productKey, String deviceName);
+
 
     /**
      * 获取API帮助信息
      *
+     * @param productKey
+     * @param deviceName
      * @param method
      * @return
+     * @throws Exception
      */
-    AwoaraResponse<MethodHelp> methodHelp(String method);
+    AwoaraResponse<MethodHelp> methodHelp(String productKey, String deviceName, String method);
+
 
     /**
      * 显⽰消息对话框
-     * 意:系统只能显⽰⼀个对话框,新的对话框会把旧的覆盖掉
+     * 意:系统只能显⽰⼀个对话框,新的对话框会把旧的覆盖掉
      * title 参考数据定义中的设备状态。
      * content 参考数据定义中的订单信息(只有在洗⻋状态state=busy才会传回来)。
      * seconds 显⽰时⻓,单位秒,时间到了对话框⾃动消失
      *
-     * @param params
+     * @param productKey
+     * @param deviceName
+     * @param title
+     * @param content
+     * @param seconds
      * @return
      */
-    AwoaraResponse<?> showMsgbox(Map<String, Object> params);
+    AwoaraResponse<?> showMsgbox(String productKey, String deviceName, String title, String content, int seconds);
 
     /**
      * 隐藏消息对话框
      *
+     * @param productKey
+     * @param deviceName
      * @return
      */
-    AwoaraResponse<?> hideMsgbox();
+    AwoaraResponse<?> hideMsgbox(String productKey, String deviceName);
+
 
     /**
      * 重启设备
      * 注意:在洗⻋的时候或者账单明细⻚⾯,设备不会重启(在等待重启),重启前由3-5秒左右的延时(防⽌⽹络数据没有发送完成)。
      *
+     * @param productKey
+     * @param deviceName
      * @return
      */
-    AwoaraResponse<?> reboot();
+    AwoaraResponse<?> reboot(String productKey, String deviceName);
+
 
     /**
      * 查询设备状态
      *
+     * @param productKey
+     * @param deviceName
      * @return
      */
-    AwoaraResponse<State> queryState();
+    AwoaraResponse<State> queryState(String productKey, String deviceName);
+
 
     /**
      * 查询硬件信息
      *
+     * @param productKey
+     * @param deviceName
      * @return
      */
-    AwoaraResponse<HardwareInfo> queryHardwareInfo();
+    AwoaraResponse<HardwareInfo> queryHardwareInfo(String productKey, String deviceName);
 
     /**
      * 创建订单
@@ -86,38 +105,46 @@ public interface AwoaraService {
      *
      * @return
      */
-    AwoaraResponse<CreateOrder> createOrder();
+    AwoaraResponse<CreateOrder> createOrder(String productKey, String deviceName, String orderId, String memberName, int memberBalance, int memberDiscount, int prepayMoney);
 
     /**
      * 关闭订单
      *
-     * @param params
+     * @param productKey
+     * @param deviceName
+     * @param orderId
+     * @param forceClose
      * @return
      */
-    AwoaraResponse<?> closeOrder(Map<String, Object> params);
+    AwoaraResponse<?> closeOrder(String productKey, String deviceName, String orderId, int forceClose);
 
     /**
      * 查询订单
      * 注意:只能查询当前订单和上⼀个订单的信息,2G版本重启后不能查询之前的订单信息。
      *
+     * @param productKey
+     * @param deviceName
      * @param orderId
      * @return
      */
-    AwoaraResponse<OrderInfo> queryOrder(String orderId);
+    AwoaraResponse<OrderInfo> queryOrder(String productKey, String deviceName, String orderId);
 
     /**
      * 读取配置
      *
+     * @param productKey
+     * @param deviceName
      * @return
      */
-    AwoaraResponse<Config> readConfig();
+    AwoaraResponse<Config> readConfig(String productKey, String deviceName);
 
     /**
      * 修改配置
      *
+     * @param productKey
+     * @param deviceName
      * @param config
      * @return
      */
-    AwoaraResponse<?> writeConfig(Config config);
-
+    AwoaraResponse<?> writeConfig(String productKey, String deviceName, Config config);
 }

+ 13 - 36
car-wash-service/src/main/java/com/kym/service/awoara/entity/Method.java

@@ -2,44 +2,21 @@ package com.kym.service.awoara.entity;
 
 import lombok.Getter;
 
-import java.util.Arrays;
-import java.util.List;
-import java.util.Objects;
-
 @Getter
 public enum Method {
-    help("help", MethodHelp.class),
-    reboot("help", MethodHelp.class),
-    query_state("help", MethodHelp.class),
-    query_hardware_info("help", MethodHelp.class),
-    create_order("help", MethodHelp.class),
-    close_order("help", MethodHelp.class),
-    query_order("help", MethodHelp.class),
-    read_config("help", MethodHelp.class),
-    write_config("help", MethodHelp.class),
-    show_msgbox("help", MethodHelp.class),
-    hide_msgbox("help", MethodHelp.class);
-
-
-    public String method;
-    public Class<?> clazz;
-
-
-    Method(String method, Class<?> clazz) {
-        this.method = method;
-        this.clazz = clazz;
-    }
+    help,
+    reboot,
+    query_state,
+    query_hardware_info,
+    create_order,
+    close_order,
+    query_order,
+    read_config,
+    write_config,
+    show_msgbox,
+    hide_msgbox,
+    gate_control,
+    relay_control;
 
-    private static List<String> getMethods() {
-        // 获取所有的method
-        return Arrays.stream(values()).map(Method::getMethod).toList();
-    }
 
-    public static Class<?> getClazz(String method) {
-        // 通过对应的方法名获取对应的类
-        if (Objects.isNull(method) || !getMethods().contains(method)) {
-            return null;
-        }
-        return Arrays.stream(values()).filter(m -> m.getMethod().equals(method)).findFirst().get().getClazz();
-    }
 }

+ 6 - 0
car-wash-service/src/main/java/com/kym/service/awoara/entity/event/Event.java

@@ -6,6 +6,12 @@ import java.util.Arrays;
 import java.util.List;
 import java.util.Objects;
 
+/**
+ * 石斑鱼上报事件枚举
+ *
+ * @author skyline
+ */
+
 @Getter
 public enum Event {
     boot("boot", DeviceState.class), // 设备启动事件,设备上电启动

+ 6 - 0
car-wash-service/src/main/java/com/kym/service/awoara/entity/event/handle/AwoaraEventHandler.java

@@ -2,6 +2,12 @@ package com.kym.service.awoara.entity.event.handle;
 
 import com.kym.service.awoara.entity.event.MessageBody;
 
+/**
+ * 石斑鱼上报事件处理器
+ *
+ * @author skyline
+ */
 public interface AwoaraEventHandler<T> {
     void handle(MessageBody<T> message);
+
 }

+ 2 - 0
car-wash-service/src/main/java/com/kym/service/awoara/entity/event/handle/BootEventHandler.java

@@ -6,6 +6,8 @@ import lombok.extern.slf4j.Slf4j;
 
 /**
  * 设备启动事件处理
+ *
+ * @author skyline
  */
 @Slf4j
 public class BootEventHandler implements AwoaraEventHandler<DeviceStateObject> {

+ 2 - 0
car-wash-service/src/main/java/com/kym/service/awoara/entity/event/handle/CardEventHandler.java

@@ -9,6 +9,8 @@ import lombok.extern.slf4j.Slf4j;
  * <p>
  * 注意:⽆论⽤户刷的是普通卡还是储值卡,都会上传这个事件。 对于储值卡总是可以刷卡开关机,如果设备在
  * 线则上传,不在线则不上传。各字段的意义请参考订单信息中的解释
+ *
+ * @author skyline
  */
 @Slf4j
 public class CardEventHandler implements AwoaraEventHandler<CardEventObject> {

+ 2 - 0
car-wash-service/src/main/java/com/kym/service/awoara/entity/event/handle/DeviceStateEventHandler.java

@@ -6,6 +6,8 @@ import lombok.extern.slf4j.Slf4j;
 
 /**
  * 设备状态更新事件事件处理
+ *
+ * @author skyline
  */
 @Slf4j
 public class DeviceStateEventHandler implements AwoaraEventHandler<DeviceStateObject> {

+ 2 - 0
car-wash-service/src/main/java/com/kym/service/awoara/entity/event/handle/OrderCloseEventHandler.java

@@ -6,6 +6,8 @@ import lombok.extern.slf4j.Slf4j;
 
 /**
  * 关闭订单事件
+ *
+ * @author skyline
  */
 @Slf4j
 public class OrderCloseEventHandler implements AwoaraEventHandler<OrderInfoObject> {

+ 2 - 0
car-wash-service/src/main/java/com/kym/service/awoara/entity/event/handle/OrderUpdateEventHandler.java

@@ -10,6 +10,8 @@ import lombok.extern.slf4j.Slf4j;
  * 1、⽤来让服务器知道订单的当前状态,以下两个条件只要满⾜其中⼀个就上传⼀次。
  * 2、订单的应收⾦额和上次上传的应收⾦额⼤于等于1元则上传⼀次。
  * 3、如果⾦额不变,每个3分钟上传⼀次。
+ *
+ * @author skyline
  */
 @Slf4j
 public class OrderUpdateEventHandler implements AwoaraEventHandler<OrderInfoObject> {

+ 0 - 38
car-wash-service/src/main/java/com/kym/service/awoara/entity/event/handle/ReportTypeHandle.java

@@ -1,38 +0,0 @@
-package com.kym.service.awoara.entity.event.handle;
-
-import com.alibaba.fastjson2.JSONObject;
-import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.kym.service.awoara.entity.event.Payload;
-import com.kym.service.awoara.entity.event.Event;
-import com.kym.service.awoara.entity.event.OrderInfo;
-
-import java.io.IOException;
-
-/**
- * Report 消息解析器
- */
-public class ReportTypeHandle extends JacksonTypeHandler {
-    public ReportTypeHandle(Class<?> type) {
-        super(type);
-    }
-
-    @Override
-    public Object parse(String json) {
-        try {
-            var jsonObject = JSONObject.parse(json);
-            var event = jsonObject.getString("event");
-            return switch (Event.valueOf(event)) {
-                case boot -> null;
-                case device_state -> null;
-                case order_create -> getObjectMapper().readValue(json, new TypeReference<Payload<OrderInfo>>() {});
-                case order_update -> null;
-                case order_close -> null;
-                case user_login -> null;
-                case card_event -> null;
-            };
-        } catch (IOException e) {
-            throw new RuntimeException(e);
-        }
-    }
-}

+ 2 - 0
car-wash-service/src/main/java/com/kym/service/awoara/entity/event/handle/UserLoginEventHandler.java

@@ -6,6 +6,8 @@ import lombok.extern.slf4j.Slf4j;
 
 /**
  * 用户登录事件
+ *
+ * @author skyline
  */
 @Slf4j
 public class UserLoginEventHandler implements AwoaraEventHandler<UserLoginObject> {

+ 1 - 1
car-wash-service/src/main/java/com/kym/service/awoara/entity/response/AwoaraResponse.java

@@ -10,7 +10,7 @@ import java.util.List;
  */
 @Data
 @Accessors(chain = true)
-public abstract class AwoaraResponse<T> {
+public class AwoaraResponse<T> {
     private String version;
     private int code;
     private String code_msg;

+ 2 - 0
car-wash-service/src/main/java/com/kym/service/awoara/factory/AwoaraEventHandlerFactory.java

@@ -6,6 +6,8 @@ import com.kym.service.awoara.entity.event.handle.*;
 
 /**
  * 事件处理器工厂
+ *
+ * @author skyline
  */
 public class AwoaraEventHandlerFactory {
     public static AwoaraEventHandler getEventHandler(String eventName) {