From 0a06eadb4c65625a0cb0fbda917d6b2c341f3207 Mon Sep 17 00:00:00 2001 From: "review512jwy@163.com" <“review512jwy@163.com”> Date: Tue, 14 Jul 2026 10:42:28 +0800 Subject: [PATCH] =?UTF-8?q?csdj=E4=B8=8B=E8=A1=8C=E6=8E=A7=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ApGatewayController.java | 23 ++++++++++- .../dto/apgateway/CsdjDownlinkParam.java | 14 +++++++ .../business/service/ApGatewayService.java | 2 +- .../service/impl/ApGatewayServiceImpl.java | 39 +++++++++++++++++++ 4 files changed, 75 insertions(+), 3 deletions(-) create mode 100644 data-center-business-model/src/main/java/com/techsor/datacenter/business/dto/apgateway/CsdjDownlinkParam.java diff --git a/data-center-business-controller/src/main/java/com/techsor/datacenter/business/controller/ApGatewayController.java b/data-center-business-controller/src/main/java/com/techsor/datacenter/business/controller/ApGatewayController.java index fcdd0e1..a95d92d 100644 --- a/data-center-business-controller/src/main/java/com/techsor/datacenter/business/controller/ApGatewayController.java +++ b/data-center-business-controller/src/main/java/com/techsor/datacenter/business/controller/ApGatewayController.java @@ -14,8 +14,8 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @RestController @@ -25,7 +25,7 @@ import org.springframework.web.bind.annotation.*; @Slf4j public class ApGatewayController { - @Autowired + @Resource private ApGatewayService apGatewayService; @Operation(summary = "Get Gateway clients list by param", description = "") @@ -94,6 +94,25 @@ public class ApGatewayController { } + + @Operation(summary = "CSDJ 下行指令", description = "type=1 端子状態通知要求(0x03), 后续扩展") + @PostMapping(path = "/csdj/downlink") + public SimpleDataResponse csdjDownlink( + @Parameter(name = "LoginName", description = "Login name", required = true, schema = @Schema(defaultValue = "admin")) @RequestHeader(required = true) String LoginName, + @Parameter(name = "AccessToken", description = "Authentication token", required = true) @RequestHeader(required = true) String AccessToken, + @Parameter(name = "UserId", description = "User ID", required = true, schema = @Schema(defaultValue = "1")) @RequestHeader(required = true) Long UserId, + @Parameter(name = "CompanyId", description = "User's company ID", required = false, schema = @Schema(defaultValue = "1")) @RequestHeader(required = false) Long CompanyId, + @Parameter(name = "LanguageType", description = "Language type 0: Chinese 1: English 2: Japanese", required = true, schema = @Schema(defaultValue = "2")) @RequestHeader(required = true) Integer LanguageType, + @Parameter(name = "UTCOffset", description = "Offset between GMT and local time in minutes, e.g., -480 for GMT+8") @RequestHeader(required = true) Integer UTCOffset, + @RequestBody CsdjDownlinkParam param) { + try { + return apGatewayService.csdjDownlink(param.getTerminalId(), param.getType()); + } catch (Exception e) { + log.error("[CSDJ-Downlink] 接口异常", e); + return SimpleDataResponse.fail(ResponseCode.SERVER_ERROR, "下行请求异常: " + e.getMessage()); + } + } + @Hidden @Operation(summary = "MQTT statistical history", description = "") @PostMapping(path = "/heartbeat/getListPage") diff --git a/data-center-business-model/src/main/java/com/techsor/datacenter/business/dto/apgateway/CsdjDownlinkParam.java b/data-center-business-model/src/main/java/com/techsor/datacenter/business/dto/apgateway/CsdjDownlinkParam.java new file mode 100644 index 0000000..31e818e --- /dev/null +++ b/data-center-business-model/src/main/java/com/techsor/datacenter/business/dto/apgateway/CsdjDownlinkParam.java @@ -0,0 +1,14 @@ +package com.techsor.datacenter.business.dto.apgateway; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class CsdjDownlinkParam { + + @Schema(description = "终端ID (IMEI)", example = "031") + private String terminalId; + + @Schema(description = "指令类型: 1=端子状態通知要求(0x03 查数据), 后续扩展", example = "1") + private Integer type; +} diff --git a/data-center-business-service/src/main/java/com/techsor/datacenter/business/service/ApGatewayService.java b/data-center-business-service/src/main/java/com/techsor/datacenter/business/service/ApGatewayService.java index 5b5a8a6..3f67a1a 100644 --- a/data-center-business-service/src/main/java/com/techsor/datacenter/business/service/ApGatewayService.java +++ b/data-center-business-service/src/main/java/com/techsor/datacenter/business/service/ApGatewayService.java @@ -25,6 +25,6 @@ public interface ApGatewayService { PageInfo getApHeartbeatHistoryListPage(ApGatewayHeartbeatQueryParam param, Long userId, Long companyId, Integer languageType); - + SimpleDataResponse csdjDownlink(String terminalId, Integer type); } diff --git a/data-center-business-service/src/main/java/com/techsor/datacenter/business/service/impl/ApGatewayServiceImpl.java b/data-center-business-service/src/main/java/com/techsor/datacenter/business/service/impl/ApGatewayServiceImpl.java index 30319ae..e2ad41e 100644 --- a/data-center-business-service/src/main/java/com/techsor/datacenter/business/service/impl/ApGatewayServiceImpl.java +++ b/data-center-business-service/src/main/java/com/techsor/datacenter/business/service/impl/ApGatewayServiceImpl.java @@ -26,6 +26,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.interceptor.TransactionAspectSupport; @@ -33,7 +34,9 @@ import org.springframework.util.ObjectUtils; import java.util.ArrayList; import java.util.Arrays; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; @@ -60,7 +63,10 @@ public class ApGatewayServiceImpl implements ApGatewayService { private UserOperationLogsService userOperationLogsService; @Resource private NotificationService notificationService; + @Resource + private RedisTemplate redisTemplate; + private static final String CSDJ_DOWNLINK_KEY_PREFIX = "csdj:downlink:"; @Override public PageInfo query(ApGatewayQueryParam param, Long userId, Long companyId, Integer languageType) { @@ -373,4 +379,37 @@ public class ApGatewayServiceImpl implements ApGatewayService { } + @Override + public SimpleDataResponse csdjDownlink(String terminalId, Integer type) { + if (terminalId == null || terminalId.isEmpty()) { + return SimpleDataResponse.fail(ResponseCode.MSG_ERROR, "terminalId 不能为空"); + } + if (type == null) { + return SimpleDataResponse.fail(ResponseCode.MSG_ERROR, "type 不能为空"); + } + + String payloadHex = switch (type) { + case 1 -> "03"; // 端子状態通知要求(CSDJ用) + default -> null; + }; + if (payloadHex == null) { + return SimpleDataResponse.fail(ResponseCode.MSG_ERROR, + "不支持的指令类型: " + type + " (当前支持: 1=端子状態通知要求)"); + } + + String key = CSDJ_DOWNLINK_KEY_PREFIX + terminalId; + redisTemplate.opsForList().rightPush(key, payloadHex); + Long pendingCount = redisTemplate.opsForList().size(key); + + Map result = new LinkedHashMap<>(); + result.put("success", true); + result.put("terminalId", terminalId); + result.put("type", type); + result.put("payloadHex", payloadHex); + result.put("pendingCount", pendingCount != null ? pendingCount : 0); + log.info("[CSDJ-Downlink] 已添加下行任务, terminalId={}, type={}, payloadHex={}, pendingCount={}", + terminalId, type, payloadHex, pendingCount); + return SimpleDataResponse.success(result); + } + }