Pu Zhibing
2024-10-08 9f781b1841fb490179918e844bdd6ddd1773e441
修改bug
8个文件已修改
6个文件已添加
345 ■■■■ 已修改文件
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TChargingPile.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/IotInterfaceFallbackFactory.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/IotInterfaceClient.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/vo/AddDevice.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/vo/AddDeviceResp.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/vo/DeleteDeviceResp.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/pom.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/WxLoginController.java 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingGunServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/controller/IotInterfaceController.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/controller/SendMessageController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/api/IotInterfaceUtil.java 30 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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();
    }
}