ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TChargingPile.java
@@ -96,4 +96,8 @@ @ApiModelProperty(value = "设备状态(1=工作中,2=离线,3=故障)") @TableField("status") private Integer status; @ApiModelProperty(value = "iotd设备id") @TableField("iotd_device_id") private String iotdDeviceId; } ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/IotInterfaceFallbackFactory.java
New file @@ -0,0 +1,40 @@ package com.ruoyi.integration.api.factory; import com.ruoyi.common.core.domain.R; import com.ruoyi.integration.api.feignClient.IotInterfaceClient; import com.ruoyi.integration.api.feignClient.SwitchwayGateClient; import com.ruoyi.integration.api.vo.AddDevice; import com.ruoyi.integration.api.vo.AddDeviceResp; import com.ruoyi.integration.api.vo.DeleteDeviceResp; import com.ruoyi.integration.api.vo.SwitchwayGateReq; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; /** * 充电桩服务降级处理 * * @author ruoyi */ @Component public class IotInterfaceFallbackFactory implements org.springframework.cloud.openfeign.FallbackFactory<IotInterfaceClient> { private static final Logger log = LoggerFactory.getLogger(IotInterfaceFallbackFactory.class); @Override public IotInterfaceClient create(Throwable throwable) { log.error("调用失败:{}", throwable.getMessage()); return new IotInterfaceClient() { @Override public R<AddDeviceResp> addDevice(AddDevice addDevice) { return R.fail("添加设备失败:" + throwable.getMessage()); } @Override public R<DeleteDeviceResp> deleteDevice(String deviceId) { return R.fail("删除设备失败:" + throwable.getMessage()); } }; } } ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/IotInterfaceClient.java
New file @@ -0,0 +1,38 @@ package com.ruoyi.integration.api.feignClient; import com.ruoyi.common.core.constant.ServiceNameConstants; import com.ruoyi.common.core.domain.R; import com.ruoyi.integration.api.factory.IotInterfaceFallbackFactory; import com.ruoyi.integration.api.vo.AddDevice; import com.ruoyi.integration.api.vo.AddDeviceResp; import com.ruoyi.integration.api.vo.DeleteDeviceResp; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; /** * @author zhibing.pu * @Date 2024/10/8 10:24 */ @FeignClient(contextId = "IotInterfaceClient", value = ServiceNameConstants.INTEGRATION_SERVICE, fallbackFactory = IotInterfaceFallbackFactory.class) public interface IotInterfaceClient { /** * 添加设备 * @param addDevice * @return */ @PostMapping("/iotInterface/addDevice") R<AddDeviceResp> addDevice(@RequestBody AddDevice addDevice); /** * 删除设备 * @param deviceId * @return */ @PostMapping("/iotInterface/deleteDevice") R<DeleteDeviceResp> deleteDevice(@RequestParam("deviceId") String deviceId); } ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/vo/AddDevice.java
New file @@ -0,0 +1,27 @@ package com.ruoyi.integration.api.vo; import lombok.Data; /** * @author zhibing.pu * @Date 2024/10/8 10:26 */ @Data public class AddDevice { /** * 产品ID */ private String productId; /** * 设备标识码 设备编号 */ private String nodeId; /** * 设备名称 */ private String deviceName; /** * 设备描述 */ private String description; } ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/vo/AddDeviceResp.java
New file @@ -0,0 +1,69 @@ package com.ruoyi.integration.api.vo; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; /** * @author zhibing.pu * @Date 2024/10/8 10:37 */ @Data public class AddDeviceResp { private int httpStatusCode; @JsonInclude(JsonInclude.Include.NON_NULL) @JsonProperty("app_id") private String appId; @JsonInclude(JsonInclude.Include.NON_NULL) @JsonProperty("app_name") private String appName; @JsonInclude(JsonInclude.Include.NON_NULL) @JsonProperty("device_id") private String deviceId; @JsonInclude(JsonInclude.Include.NON_NULL) @JsonProperty("node_id") private String nodeId; @JsonInclude(JsonInclude.Include.NON_NULL) @JsonProperty("gateway_id") private String gatewayId; @JsonInclude(JsonInclude.Include.NON_NULL) @JsonProperty("device_name") private String deviceName; @JsonInclude(JsonInclude.Include.NON_NULL) @JsonProperty("node_type") private String nodeType; @JsonInclude(JsonInclude.Include.NON_NULL) @JsonProperty("description") private String description; @JsonInclude(JsonInclude.Include.NON_NULL) @JsonProperty("fw_version") private String fwVersion; @JsonInclude(JsonInclude.Include.NON_NULL) @JsonProperty("sw_version") private String swVersion; @JsonInclude(JsonInclude.Include.NON_NULL) @JsonProperty("device_sdk_version") private String deviceSdkVersion; @JsonInclude(JsonInclude.Include.NON_NULL) @JsonProperty("product_id") private String productId; @JsonInclude(JsonInclude.Include.NON_NULL) @JsonProperty("product_name") private String productName; @JsonInclude(JsonInclude.Include.NON_NULL) @JsonProperty("status") private String status; @JsonInclude(JsonInclude.Include.NON_NULL) @JsonProperty("create_time") private String createTime; @JsonInclude(JsonInclude.Include.NON_NULL) @JsonProperty("connection_status_update_time") private String connectionStatusUpdateTime; @JsonInclude(JsonInclude.Include.NON_NULL) @JsonProperty("active_time") private String activeTime; @JsonInclude(JsonInclude.Include.NON_NULL) @JsonProperty("extension_info") private Object extensionInfo; } ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/vo/DeleteDeviceResp.java
New file @@ -0,0 +1,19 @@ package com.ruoyi.integration.api.vo; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; /** * @author zhibing.pu * @Date 2024/10/8 10:40 */ @Data public class DeleteDeviceResp { @JsonIgnore private int httpStatusCode; @JsonInclude(JsonInclude.Include.NON_NULL) @JsonProperty("body") private String body; } ruoyi-api/ruoyi-api-integration/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -4,4 +4,5 @@ com.ruoyi.integration.api.factory.SendMessageFallbackFactory com.ruoyi.integration.api.factory.PlatformStartChargingReplyFallbackFactory com.ruoyi.integration.api.factory.PlatformStopChargingReplyFallbackFactory com.ruoyi.integration.api.factory.SwitchwayGateFallbackFactory com.ruoyi.integration.api.factory.SwitchwayGateFallbackFactory com.ruoyi.integration.api.factory.IotInterfaceFallbackFactory ruoyi-service/ruoyi-account/pom.xml
@@ -16,11 +16,6 @@ <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-mock</artifactId> <version>2.0.8</version> </dependency> <dependency> <groupId>com.ruoyi</groupId> <artifactId>ruoyi-api-order</artifactId> </dependency> ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/WxLoginController.java
@@ -63,11 +63,11 @@ private WeixinProperties wxConfig; @Autowired private RestTemplate wxRestTemplate; /** * 上传文件存储在本地的根路径 */ @Value("${file.path}") private String localFilePath; // /** // * 上传文件存储在本地的根路径 // */ // @Value("${file.path}") // private String localFilePath; @ApiOperation(value = "通过code获得openid,获取用户信息",tags = {"微信小程序登录"}) @PostMapping("/openIdByJsCode") public AjaxResult<Map<String, Object>> openIdByJsCode(@RequestBody AppletUserEncrypteData data) { @@ -99,9 +99,9 @@ public AjaxResult<Map<String, Object>> openIdByJsCode(@RequestBody AppletUserDecodeData appletUserDecodeData) { return AjaxResult.success(appUserService.wxLogin(appletUserDecodeData, null)); } public static MultipartFile convertInputStreamToMultipartFile(InputStream inputStream, String fileName, String contentType) throws IOException { return new MockMultipartFile(fileName, fileName, contentType, inputStream); } // public static MultipartFile convertInputStreamToMultipartFile(InputStream inputStream, String fileName, String contentType) throws IOException { // return new MockMultipartFile(fileName, fileName, contentType, inputStream); // } @ApiOperation(value = "获取微信小程序二维码",tags = {"获取微信小程序二维码"}) @PostMapping("/getQRCode") public AjaxResult getQRCode() { @@ -132,10 +132,10 @@ System.err.println(Base64.encodeBase64String(result)); inputStream = new ByteArrayInputStream(result); String finalFileName = System.currentTimeMillis() + "" + new SecureRandom().nextInt(0x0400) + ".jpeg"; MultipartFile multipartFile = convertInputStreamToMultipartFile(inputStream, finalFileName, "image/jpeg"); String name = FileUploadUtils.upload(localFilePath, multipartFile); System.err.println(name); return AjaxResult.success(name); // MultipartFile multipartFile = convertInputStreamToMultipartFile(inputStream, finalFileName, "image/jpeg"); // String name = FileUploadUtils.upload(localFilePath, multipartFile); // System.err.println(name); return AjaxResult.success(null); } catch (Exception e) { System.err.println("调用小程序生成微信永久小程序码URL接口异常" + e); } finally { ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingGunServiceImpl.java
@@ -116,6 +116,8 @@ return AjaxResult.error("接口编码已存在"); } this.save(dto); //下发硬件充电二维码 return AjaxResult.success(); } @@ -141,6 +143,8 @@ return AjaxResult.error("接口编码已存在"); } this.updateById(dto); //下发硬件充电二维码 return AjaxResult.success(); } ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java
@@ -23,12 +23,17 @@ import com.ruoyi.chargingPile.service.ISiteService; import com.ruoyi.chargingPile.service.TChargingGunService; import com.ruoyi.chargingPile.service.TChargingPileService; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.core.web.page.PageInfo; import com.ruoyi.common.security.utils.SecurityUtils; import com.ruoyi.integration.api.feignClient.IotInterfaceClient; import com.ruoyi.integration.api.feignClient.UploadRealTimeMonitoringDataClient; import com.ruoyi.integration.api.model.UploadRealTimeMonitoringData; import com.ruoyi.integration.api.vo.AddDevice; import com.ruoyi.integration.api.vo.AddDeviceResp; import com.ruoyi.integration.api.vo.DeleteDeviceResp; import com.ruoyi.order.api.feignClient.ChargingOrderAccountingStrategyClient; import com.ruoyi.order.api.feignClient.ChargingOrderClient; import com.ruoyi.order.api.model.TChargingOrder; @@ -93,6 +98,9 @@ @Resource private SysUserRoleClient sysUserRoleClient; @Resource private IotInterfaceClient iotInterfaceClient; @@ -151,7 +159,20 @@ if(count > 0){ return AjaxResult.error("设备编号已存在"); } this.save(chargingPile); //调用华为Iot创建设备 AddDevice addDevice = new AddDevice(); addDevice.setProductId("66da68d21837002b28b34ec0"); addDevice.setNodeId(chargingPile.getCode()); addDevice.setDeviceName(chargingPile.getName()); addDevice.setDescription(chargingPile.getNumber().toString()); AddDeviceResp deviceResp = iotInterfaceClient.addDevice(addDevice).getData(); if(null != deviceResp){ int httpStatusCode = deviceResp.getHttpStatusCode(); if(httpStatusCode == 201){ chargingPile.setIotdDeviceId(deviceResp.getDeviceId()); this.save(chargingPile); } } return AjaxResult.success(); } @@ -227,7 +248,6 @@ @Override public AjaxResult delChargingPile(Integer[] ids) { //检查是否有关联数据 //接口 long count = chargingGunService.count(new LambdaQueryWrapper<TChargingGun>().in(TChargingGun::getChargingPileId, Arrays.asList(ids)) .eq(TChargingGun::getDelFlag, 0)); if(count > 0){ @@ -235,7 +255,13 @@ } for (Integer id : ids) { TChargingPile chargingPile = this.getById(id); this.removeById(chargingPile); //调用华为Iot删除设备 if(StringUtils.isNotEmpty(chargingPile.getIotdDeviceId())){ DeleteDeviceResp deviceResp = iotInterfaceClient.deleteDevice(chargingPile.getIotdDeviceId()).getData(); if(null != deviceResp && deviceResp.getHttpStatusCode() == 201){ this.removeById(chargingPile); } } } return AjaxResult.success(); } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/controller/IotInterfaceController.java
New file @@ -0,0 +1,48 @@ package com.ruoyi.integration.iotda.controller; import com.huaweicloud.sdk.iotda.v5.model.AddDeviceResponse; import com.huaweicloud.sdk.iotda.v5.model.DeleteDeviceResponse; import com.ruoyi.common.core.domain.R; import com.ruoyi.integration.api.vo.AddDevice; import com.ruoyi.integration.api.vo.AddDeviceResp; import com.ruoyi.integration.api.vo.DeleteDeviceResp; import com.ruoyi.integration.iotda.utils.api.IotInterfaceUtil; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; /** * @author zhibing.pu * @Date 2024/10/8 10:29 */ @RestController @RequestMapping("/iotInterface") public class IotInterfaceController { @Resource private IotInterfaceUtil iotInterfaceUtil; /** * 添加设备 * @return */ @PostMapping("/addDevice") public R<AddDeviceResp> addDevice(@RequestBody AddDevice addDevice){ return iotInterfaceUtil.addDeviceRequest(addDevice.getProductId(), addDevice.getNodeId(), addDevice.getDeviceName(), addDevice.getDescription()); } /** * 删除设备 * @param deviceId * @return */ @PostMapping("/deleteDevice") public R<DeleteDeviceResp> deleteDevice(@RequestParam("deviceId") String deviceId){ return iotInterfaceUtil.deleteDeviceRequest(deviceId); } } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/controller/SendMessageController.java
@@ -228,5 +228,5 @@ public String platformRemoteUpdate(@RequestBody PlatformRemoteUpdate platformRemoteUpdate){ return iotMessageProduce.sendMessage(platformRemoteUpdate.getCharging_pile_code(), ServiceIdMenu.PLATFORM_REMOTE_UPDATE.getKey(),messageUtil.platformRemoteUpdate(platformRemoteUpdate)); } } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/api/IotInterfaceUtil.java
@@ -1,22 +1,19 @@ package com.ruoyi.integration.iotda.utils.api; import com.huaweicloud.sdk.core.auth.AbstractCredentials; import com.huaweicloud.sdk.core.auth.ICredential; import com.huaweicloud.sdk.core.exception.ConnectionException; import com.huaweicloud.sdk.core.exception.RequestTimeoutException; import com.huaweicloud.sdk.core.exception.ServiceResponseException; import com.huaweicloud.sdk.iotda.v5.IoTDAClient; import com.huaweicloud.sdk.iotda.v5.model.*; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.utils.CodeGenerateUtils; import com.ruoyi.common.core.utils.uuid.UUID; import com.ruoyi.integration.api.vo.AddDeviceResp; import com.ruoyi.integration.api.vo.DeleteDeviceResp; import com.ruoyi.integration.iotda.builder.IotBuilder; import com.ruoyi.integration.iotda.config.IotAccountConfig; import com.ruoyi.integration.iotda.config.IotDAConfig; import com.ruoyi.integration.iotda.constant.IotConstant; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.web.bind.annotation.RestController; import java.text.MessageFormat; import java.util.ArrayList; @@ -26,7 +23,7 @@ * iot接口调用工具类 */ @Slf4j @RestController @Component public class IotInterfaceUtil { private static final String dataFormat = "json"; @@ -118,7 +115,7 @@ * @param description 设备描述 * @return AddDeviceResponse */ public AddDeviceResponse addDeviceRequest(String productId,String nodeId,String deviceName,String description) { public R<AddDeviceResp> addDeviceRequest(String productId,String nodeId,String deviceName,String description) { AddDeviceRequest request = new AddDeviceRequest(); AddDevice body = new AddDevice(); body.withDeviceId(nodeId); @@ -130,7 +127,10 @@ try { AddDeviceResponse response = iotBuilder.buildIot().addDevice(request); log.info("创建设备:{}",response.toString()); return response; AddDeviceResp addDeviceResp = new AddDeviceResp(); BeanUtils.copyProperties(response, addDeviceResp); return R.ok(addDeviceResp); } catch (ConnectionException e) { e.printStackTrace(); } catch (RequestTimeoutException e) { @@ -142,7 +142,7 @@ System.out.println(e.getErrorCode()); System.out.println(e.getErrorMsg()); } return null; return R.fail(); } /** @@ -234,13 +234,15 @@ * @param deviceId 设备ID 使用已有设备编号 * @return DeleteDeviceResponse */ public DeleteDeviceResponse deleteDeviceRequest(String deviceId) { public R<DeleteDeviceResp> deleteDeviceRequest(String deviceId) { DeleteDeviceRequest request = new DeleteDeviceRequest(); request.withDeviceId(deviceId); try { DeleteDeviceResponse response = iotBuilder.buildIot().deleteDevice(request); log.info("删除设备:{}",response.toString()); return response; DeleteDeviceResp deleteDeviceResp = new DeleteDeviceResp(); BeanUtils.copyProperties(response, deleteDeviceResp); return R.ok(deleteDeviceResp); } catch (ConnectionException e) { e.printStackTrace(); } catch (RequestTimeoutException e) { @@ -252,6 +254,6 @@ System.out.println(e.getErrorCode()); System.out.println(e.getErrorMsg()); } return null; return R.fail(); } }