luodangjia
2024-08-21 782f0259bc2c0362a1075ea401c815186321d8c6
Merge remote-tracking branch 'origin/master'

# Conflicts:
# ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TGoodsController.java
27个文件已修改
13个文件已添加
995 ■■■■ 已修改文件
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/dto/UserListQueryDto.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TAppUser.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/dto/GetPermissionConfigurationDTO.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/dto/GetSiteListDTO.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/Site.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TChargingPile.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/vo/TChargingGunVO.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/OrderFallbackFactory.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/OrderClient.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ExchangeDto.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/dto/ExchangeDto.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/AuthFilter.java 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserAddressController.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/config/FileUploadConfig.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/FileController.java 142 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/SiteController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyController.java 65 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TApplyChargingPileController.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TChargingPileController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/TChargingPileMapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/PartnerServiceImpl.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/resources/logback.xml 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/SiteMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TChargingGunMapper.xml 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TChargingPileMapper.xml 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/pom.xml 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/builder/IotBuilder.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/config/IotAccountConfig.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/config/IotDAConfig.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/constant/IotConstant.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/api/IotInterfaceUtil.java 261 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/listener/IotMessageListener.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/produce/IotMessageProduce.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/time/UtcToSeconds.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/token/IotTokenUtil.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TEnterpriseUserApplicationController.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/query/PassDto.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/resources/mapper/other/TAdvertisingMapper.xml 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/resources/mybatis-config.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/dto/UserListQueryDto.java
@@ -18,4 +18,10 @@
    Integer vipTypeId;
    @ApiModelProperty(value = "单位id")
    Integer companyId;
    @ApiModelProperty(value = "到期天数1")
    Integer vipEndTime1;
    @ApiModelProperty(value = "到期天数2")
    Integer vipEndTime2;
}
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TAppUser.java
@@ -118,5 +118,9 @@
    @TableField(exist = false)
    private Long orderCount;
    @ApiModelProperty("剩余天数")
    @TableField(exist = false)
    private Long lastDays;
}
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/dto/GetPermissionConfigurationDTO.java
@@ -17,5 +17,5 @@
    @ApiModelProperty(value = "备注")
    private String permissionRemarks;
    @ApiModelProperty(value = "权限菜单")
    private Map<String, Object> menu;
    private List<Map<String, Object>> menu;
}
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/dto/GetSiteListDTO.java
@@ -17,6 +17,8 @@
    private String code;
    @ApiModelProperty(value = "站点名称")
    private String name;
    @ApiModelProperty(value = "合作商id")
    private Integer partnerId;
    @ApiModelProperty(value = "合作商名称")
    private String partnerName;
    @ApiModelProperty(value = "站点类型(0=其他,1=公共,2=个人,3=公交(专业),4=环卫(专用),5=物流(专用),6=出租车(专用))")
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/Site.java
@@ -10,6 +10,7 @@
import lombok.Data;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
 * @author zhibing.pu
@@ -204,7 +205,7 @@
    @TableField("establishment_time")
    @ApiModelProperty(value = "建站时间", notes = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDate establishmentTime;
    private LocalDateTime establishmentTime;
    /**
     * 排序
     */
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TChargingPile.java
@@ -58,7 +58,7 @@
    
    @ApiModelProperty(value = "站点名称")
    @TableField(exist = false)
    private Integer siteName;
    private String siteName;
    @ApiModelProperty(value = "合作商id", required = true)
    @TableField("partner_id")
@@ -66,7 +66,7 @@
    
    @ApiModelProperty(value = "合作商名称")
    @TableField(exist = false)
    private Integer partnerName;
    private String partnerName;
    @ApiModelProperty(value = "生产商机构代码")
    @TableField("manufacturer_code")
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/vo/TChargingGunVO.java
@@ -21,13 +21,13 @@
    @ApiModelProperty(value = "查看费率权限")
    private boolean authViewRates = true;
    
    @ApiModelProperty(value = "编辑权限")
    @ApiModelProperty(value = "下载二维码权限")
    private boolean authDownloadQRCode = true;
    
    @ApiModelProperty(value = "编辑权限")
    @ApiModelProperty(value = "查看详情权限")
    private boolean authQueryInfo = true;
    
    @ApiModelProperty(value = "编辑权限")
    @ApiModelProperty(value = "结束充电权限")
    private boolean authEndCharge = true;
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/OrderFallbackFactory.java
@@ -7,7 +7,7 @@
import com.ruoyi.order.api.model.TExchangeOrder;
import com.ruoyi.order.api.query.TActivityStatisticsQuery;
import com.ruoyi.order.api.vo.TActivityVO;
import com.ruoyi.other.api.dto.ExchangeDto;
import com.ruoyi.order.api.vo.ExchangeDto;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.openfeign.FallbackFactory;
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/OrderClient.java
@@ -5,9 +5,9 @@
import com.ruoyi.order.api.factory.ChargingOrderFallbackFactory;
import com.ruoyi.order.api.factory.OrderFallbackFactory;
import com.ruoyi.order.api.model.TExchangeOrder;
import com.ruoyi.order.api.vo.ExchangeDto;
import com.ruoyi.order.api.query.TActivityStatisticsQuery;
import com.ruoyi.order.api.vo.TActivityVO;
import com.ruoyi.other.api.dto.ExchangeDto;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ExchangeDto.java
New file
@@ -0,0 +1,18 @@
package com.ruoyi.order.api.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class ExchangeDto {
    @ApiModelProperty("商品id")
    Integer goodId;
    @ApiModelProperty("地址id")
    Integer addressId;
    @ApiModelProperty("备注")
    String remark;
    @ApiModelProperty(hidden = true)
    Long userId;
}
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/dto/ExchangeDto.java
@@ -13,7 +13,6 @@
    String remark;
    @ApiModelProperty(hidden = true)
    Long userId;
    @ApiModelProperty(hidden = true)
    Integer userId;
}
ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/AuthFilter.java
@@ -69,20 +69,20 @@
            return chain.filter(exchange);
        }
        //防抖校验
        try {
            antiShake(request);
        }catch (Exception e){
            log.error("[重复提交]请求路径:{}", exchange.getRequest().getPath());
            return ServletUtils.webFluxResponseWriter(exchange.getResponse(), e.getMessage(), HttpStatus.SUCCESS);
        }
//        try {
//            antiShake(request);
//        }catch (Exception e){
//            log.error("[重复提交]请求路径:{}", exchange.getRequest().getPath());
//            return ServletUtils.webFluxResponseWriter(exchange.getResponse(), e.getMessage(), HttpStatus.SUCCESS);
//        }
        
        //校验账户是否有效
        try {
            verifyToken(request);
            verifyAccount(request);
        }catch (Exception e){
            return unauthorizedResponse(exchange, e.getMessage());
        }
//        try {
//            verifyToken(request);
//            verifyAccount(request);
//        }catch (Exception e){
//            return unauthorizedResponse(exchange, e.getMessage());
//        }
        String token = getToken(request);
        Claims claims = JwtUtils.parseToken(token);
        String userkey = JwtUtils.getUserKey(claims);
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserAddressController.java
@@ -45,6 +45,18 @@
        return AjaxResult.ok(appUserAddressService.list(Wrappers.<TAppUserAddress>lambdaQuery().eq(TAppUserAddress::getAppUserId, userId)));
    }
    /**
     * 查询用户默认地址列表
     */
    @ApiOperation(tags = {"小程序-用户地址"},value = "查询用户默认地址列表")
    @GetMapping(value = "/queryDefaultAddress")
    public AjaxResult<TAppUserAddress> queryDefaultAddress() {
        // 用户id
        Long userId = tokenService.getLoginUserApplet().getUserId();
        return AjaxResult.ok(appUserAddressService.getOne(Wrappers.<TAppUserAddress>lambdaQuery().eq(TAppUserAddress::getAppUserId, userId)
                .eq(TAppUserAddress::getDefaultAddress,1)));
    }
    /**
     * 添加用户地址管理
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java
@@ -236,11 +236,14 @@
        }
        //列表查询
        Page<TAppUser> page = appUserService.lambdaQuery()
                .ge(TAppUser::getVipEndTime, LocalDateTime.now())
                .like(userListQueryDto.getUserPhone() != null && !"".equals(userListQueryDto.getUserPhone()), TAppUser::getPhone, userListQueryDto.getUserPhone())
                .eq(userListQueryDto.getCompanyId() != null, TAppUser::getCompanyId, userListQueryDto.getCompanyId())
                .eq(userListQueryDto.getCityCode() != null && !"".equals(userListQueryDto.getCityCode()), TAppUser::getCityCode, userListQueryDto.getCityCode())
                .eq(userListQueryDto.getStatus() != null, TAppUser::getStatus, userListQueryDto.getStatus())
                .eq(userListQueryDto.getVipTypeId() != null, TAppUser::getVipId, userListQueryDto.getVipTypeId())
                .ge(userListQueryDto.getVipEndTime1() != null, TAppUser::getVipEndTime, userListQueryDto.getVipEndTime1() == null ? null : LocalDateTime.now().plusDays(userListQueryDto.getVipEndTime1()))
                .le(userListQueryDto.getVipEndTime2() != null, TAppUser::getVipEndTime, userListQueryDto.getVipEndTime2() == null ? null : LocalDateTime.now().plusDays(userListQueryDto.getVipEndTime2()))
                .in(!userIds.isEmpty(),TAppUser::getId,userIds)
                .page(Page.of(userListQueryDto.getPageCurr(), userListQueryDto.getPageSize()));
        if (page.getRecords().isEmpty()){
@@ -255,15 +258,19 @@
            //拿到最新的tagId
            TAppUserTag one = appUserTagService.lambdaQuery().eq(TAppUserTag::getAppUserId, appUser.getId()).orderByDesc(TAppUserTag::getCreateTime).last("limit 1").one();
            //设置最新的tagName
            if (one!=null) {
            R<TUserTag> byIdTag = otherClient.getByIdTag(one.getUserTagId());
            if (byIdTag.getData()!=null) {
                appUser.setTagName(byIdTag.getData().getName());
                }
            }
            //匹配vipMap的值
            appUser.setVipName(vipMap.getData().get(appUser.getVipId()));
            //累计充电次数
            R<Long> useOrderCount = chargingOrderClient.useOrderCount(appUser.getId());
            appUser.setOrderCount(useOrderCount.getData());
            appUser.setLastDays( Duration.between(LocalDateTime.now(), appUser.getVipEndTime()).toDays());
            appUser.setUid(appUser.getId().toString());
        }
        return R.ok(page);
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/config/FileUploadConfig.java
New file
@@ -0,0 +1,21 @@
package com.ruoyi.chargingPile.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
 * <p>文件上传配置</p>
 *
 * @author mouseyCat
 * @date 2020/10/13 16:10
 */
@Data
@Component
@ConfigurationProperties(prefix = "file.upload")
public class FileUploadConfig {
    private String accessPath;
    private String allowExt;
    private String location;
    private String qrLocation;
}
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/FileController.java
New file
@@ -0,0 +1,142 @@
package com.ruoyi.chargingPile.controller;
import com.ruoyi.chargingPile.config.FileUploadConfig;
import com.ruoyi.common.core.web.domain.AjaxResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
 * 文件上传控制类
 *
 * @author junelee
 * @date 2020/3/20 20:21
 */
@Api(tags = "服务器文件上传")
@RestController
@CrossOrigin
@RequestMapping("/file/")
public class FileController {
    @Autowired
    private FileUploadConfig fileUploadConfig;
    @ApiOperation(value = "单文件上传", notes = "单文件上传,rename 默认不重命名")
    @PostMapping(value = "upload", headers = "content-type=multipart/form-data")
    public AjaxResult uploadImageMany(@RequestParam(value = "file") MultipartFile mf) throws IOException {
        if (mf.isEmpty()) {
            return AjaxResult.error("请传入文件!");
        }
        String TimeDir =new SimpleDateFormat("yyyy-MM-dd").format(new Date());
        String realPath = fileUploadConfig.getLocation() + TimeDir;
//        String realPath = "D:\\file\\" + TimeDir;
        File file = new File(realPath);
        // 没有目录就创建
        if (!file.exists()) {
            file.mkdirs();
        }
        // 获取文件名称
        String filename = mf.getOriginalFilename();
        // 获取文件后缀
        String ext = filename.substring(filename.lastIndexOf("."), filename.length());
        // 检查文件类型
        if (!fileUploadConfig.getAllowExt().contains(ext)) {
            return AjaxResult.error("上传文件格式不正确,仅支持" + fileUploadConfig.getAllowExt());
        }
        File targetFile = new File(realPath, filename);//目标文件
        //开始从源文件拷贝到目标文件
        //传图片一步到位
        mf.transferTo(targetFile);
        //拼接数据
        String imgstr = fileUploadConfig.getAccessPath() + TimeDir +"/"+ filename;
//        String imgstr = TimeDir +"/"+ filename;
        return AjaxResult.success(imgstr);
    }
//    @ApiOperation(value = "单文件上传", notes = "单文件上传,rename 默认不重命名")
//    @PostMapping(value = "strUpload", headers = "content-type=multipart/form-data")
//    public String strUpload(@RequestParam(value = "file") MultipartFile mf,@RequestParam(value = "fileName")String fileName) throws IOException {
//        if (mf.isEmpty()) {
//            return "请传入文件!";
//        }
//        String TimeDir =new SimpleDateFormat("yyyy-MM-dd").format(new Date());
//        String realPath = fileUploadConfig.getQrLocation() + TimeDir;
//        File file = new File(realPath);
//        // 没有目录就创建
//        if (!file.exists()) {
//            file.mkdirs();
//        }
//        File targetFile = new File(realPath, fileName);//目标文件
//        //开始从源文件拷贝到目标文件
//        //传图片一步到位
//        mf.transferTo(targetFile);
//        //拼接数据
//        return fileUploadConfig.getQrLocation() + TimeDir +"\\"+ fileName;
//    }
    @ApiOperation(value = "单文件上传", notes = "单文件上传,rename 默认不重命名")
    @PostMapping(value = "strUpload", headers = "content-type=multipart/form-data")
    public String strUpload(@RequestParam(value = "file") MultipartFile mf,@RequestParam(value = "fileName")String fileName) throws IOException {
        if (mf.isEmpty()) {
            return "请传入文件!";
        }
        String TimeDir =new SimpleDateFormat("yyyy-MM-dd").format(new Date());
//        String realPath = "D:\\file\\" + TimeDir;
        String realPath = fileUploadConfig.getLocation() + TimeDir;
        File file = new File(realPath);
        // 没有目录就创建
        if (!file.exists()) {
            file.mkdirs();
        }
        File targetFile = new File(realPath, fileName);//目标文件
        //开始从源文件拷贝到目标文件
        //传图片一步到位
        mf.transferTo(targetFile);
        String imgstr = fileUploadConfig.getAccessPath() + TimeDir +"/"+ fileName;
        //拼接数据
//        return TimeDir +"/"+ fileName;
        return imgstr;
    }
    @ApiOperation(value = "单文件上传(覆盖服务器原文件)", notes = "单文件上传,rename 默认不重命名")
    @PostMapping(value = "test/upload", headers = "content-type=multipart/form-data")
    public AjaxResult uploadTest(@RequestParam(value = "file") MultipartFile mf) throws IOException {
        if (mf.isEmpty()) {
            return AjaxResult.error("请传入文件!");
        }
        String TimeDir = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
        String realPath = fileUploadConfig.getLocation() + "2021-11-17";
        File file = new File(realPath);
        // 没有目录就创建
        if (!file.exists()) {
            file.mkdirs();
        }
        // 判断文件大小
        String filename = "6u2mGlqHkeE75e2ab51b4a03c6982ff7d68f4c024d43.jpg";
        // 获取文件后缀
        String ext = filename.substring(filename.lastIndexOf("."), filename.length());
        // 检查文件类型
        if (!fileUploadConfig.getAllowExt().contains(ext)) {
            return AjaxResult.error("上传文件格式不正确,仅支持" + fileUploadConfig.getAllowExt());
        }
        File targetFile = new File(realPath, filename);//目标文件
        //开始从源文件拷贝到目标文件
        //传图片一步到位
        mf.transferTo(targetFile);
        //拼接数据
        String imgstr = fileUploadConfig.getAccessPath() + "2021-11-17" + "/" + filename;
        return AjaxResult.success(imgstr);
    }
}
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/SiteController.java
@@ -165,7 +165,7 @@
    
    
    @ResponseBody
    @PostMapping("/getSiteInfo")
    @PostMapping("/getSiteInfo/{id}")
    @ApiOperation(value = "获取站点详情", tags = {"管理后台-站点管理"})
    public AjaxResult<Site> getSiteInfo(@PathVariable Integer id){
        Site site = siteService.getById(id);
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyController.java
@@ -183,39 +183,38 @@
        return AjaxResult.ok(accountingStrategyService.pageList(query));
    }
    @ApiOperation(tags = {"后台-申请表单-计费模板审核"},value = "审核")
    @PostMapping(value = "/auth/pass")
    public AjaxResult<PageInfo<TAccountingStrategyVO>> authPass(@RequestBody SteategyPassDto steategyPassDto) {
        TAccountingStrategy byId = accountingStrategyService.getById(steategyPassDto.getId());
        Long userId = tokenService.getLoginUser().getSysUser().getUserId();
        if (byId.getAuditStatus()==1&&byId.getFirstUserId()!=userId){
            return AjaxResult.error("您不是一级审核人员,无法审核");
        }
        if (byId.getAuditStatus()==2&&byId.getTwoUserId()!=userId){
            return AjaxResult.error("您不是二级审核人员,无法审核");
        }
        if (steategyPassDto.getPass()==1){
            if (byId.getAuditStatus()==1){
                byId.setAuditStatus(2);
                byId.setFirstRemark(steategyPassDto.getRemark());
            }else if (byId.getAuditStatus()==2){
                byId.setAuditStatus(3);
                byId.setTwoRemark(steategyPassDto.getRemark());
            }
        }else {
            byId.setAuditStatus(4);
        }
        return AjaxResult.success();
    }
//    @ApiOperation(tags = {"后台-申请表单-计费模板审核"},value = "审核")
//    @PostMapping(value = "/auth/pass")
//    public AjaxResult<PageInfo<TAccountingStrategyVO>> authPass(@RequestBody SteategyPassDto steategyPassDto) {
//        TAccountingStrategy byId = accountingStrategyService.getById(steategyPassDto.getId());
//        Long userId = tokenService.getLoginUser().getSysUser().getUserId();
//        if (byId.getAuditStatus()==1&&byId.getFirstUserId()!=userId){
//            return AjaxResult.error("您不是一级审核人员,无法审核");
//        }
//        if (byId.getAuditStatus()==2&&byId.getTwoUserId()!=userId){
//            return AjaxResult.error("您不是二级审核人员,无法审核");
//        }
//        if (steategyPassDto.getPass()==1){
//            if (byId.getAuditStatus()==1){
//
//                byId.setAuditStatus(2);
//                byId.setFirstRemark(steategyPassDto.getRemark());
//
//            }else if (byId.getAuditStatus()==2){
//                byId.setAuditStatus(3);
//                byId.setTwoRemark(steategyPassDto.getRemark());
//
//            }
//        }else {
//            byId.setAuditStatus(4);
//        }
//
//
//
//
//
//
//    }
    /**
     * 小程序远程调用 根据会员折扣、预付金额 计算服务费
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TApplyChargingPileController.java
@@ -74,6 +74,18 @@
        applyChargingPileService.updateById(byId);
        return AjaxResult.success();
    }
    @ApiOperation(tags = {"后台-申请表单-申请建桩"},value = "删除")
    @DeleteMapping(value = "/remark")
    public AjaxResult remark(String ids) {
        String[] split = ids.split(",");
        for (String s : split) {
            applyChargingPileService.removeById(s);
        }
        return AjaxResult.success();
    }
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TChargingPileController.java
@@ -83,7 +83,7 @@
    @ResponseBody
    @GetMapping("/pageChargingPileList")
    @ApiOperation(value = "获取充电桩列表数据", tags = {"管理后台-充电桩信息"})
    public AjaxResult<PageInfo<PageChargingPileListDTO>> pageChargingPileList(@RequestBody PageChargingPileList page){
    public AjaxResult<PageInfo<PageChargingPileListDTO>> pageChargingPileList(PageChargingPileList page){
        PageInfo<PageChargingPileListDTO> list = chargingPileService.pageChargingPileList(page);
        return AjaxResult.success(list);
    }
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/TChargingPileMapper.java
@@ -39,7 +39,7 @@
     * @param id
     * @return
     */
    TChargingPile getChargingPile(Integer id);
    TChargingPile getChargingPile(@Param("id") Integer id);
    /**
     * 获取站点下充电桩及充电枪列表
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/PartnerServiceImpl.java
@@ -328,7 +328,6 @@
        Partner partner = this.getById(partnerId);
        GetPermissionConfigurationDTO dto = new GetPermissionConfigurationDTO();
        dto.setPermissionRemarks(partner.getPermissionRemarks());
        Map<String, Object> menu = new HashMap<>();
        List<TPartnerSite> list = partnerSiteService.list(new LambdaQueryWrapper<TPartnerSite>()
                .eq(TPartnerSite::getPartnerId, partnerId)
                .eq(TPartnerSite::getSiteId, siteId));
@@ -337,7 +336,9 @@
                .eq(TSiteMenu::getParentId, 0)
                .eq(TSiteMenu::getVisible, 0)
                .eq(TSiteMenu::getStatus, 0).orderByAsc(TSiteMenu::getOrderNum));
        List<Map<String, Object>> list1 = new ArrayList<>();
        for (TSiteMenu tSiteMenu : tSiteMenus) {
            Map<String, Object> menu = new HashMap<>();
            menu.put("id", tSiteMenu.getMenuId());
            menu.put("name", tSiteMenu.getMenuName());
            menu.put("path", tSiteMenu.getPath());
@@ -347,18 +348,21 @@
                    .eq(TSiteMenu::getParentId, tSiteMenu.getMenuId())
                    .eq(TSiteMenu::getVisible, 0)
                    .eq(TSiteMenu::getStatus, 0).orderByAsc(TSiteMenu::getOrderNum));
            Map<String, Object> child = new HashMap<>();
            List<Map<String, Object>> list2 = new ArrayList<>();
            for (TSiteMenu siteMenu : tSiteMenus1) {
                Map<String, Object> child = new HashMap<>();
                child.put("id", siteMenu.getMenuId());
                child.put("name", siteMenu.getMenuName());
                child.put("path", siteMenu.getPath());
                child.put("type", siteMenu.getMenuType());
                child.put("selected", collect.contains(siteMenu.getMenuId()));
                list2.add(child);
            }
            menu.put("selected", child.keySet().size() > 0 ? true : false);
            menu.put("child", child);
            menu.put("selected", list2.size() > 0 ? true : false);
            menu.put("child", list2);
            list1.add(menu);
        }
        dto.setMenu(menu);
        dto.setMenu(list1);
        return dto;
    }
    
ruoyi-service/ruoyi-chargingPile/src/main/resources/logback.xml
@@ -58,11 +58,11 @@
    </appender>
    <!-- 系统模块日志级别控制  -->
    <logger name="com.ruoyi" level="info" />
    <logger name="com.ruoyi" level="debug" />
    <!-- Spring日志级别控制  -->
    <logger name="org.springframework" level="warn" />
    <logger name="org.springframework" level="debug" />
    <root level="info">
    <root level="debug">
        <appender-ref ref="console" />
    </root>
    
ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/SiteMapper.xml
@@ -52,6 +52,7 @@
        a.id,
        a.code,
        a.name,
        a.partner_id as partnerId,
        b.name as partnerName,
        a.site_type as siteType,
        a.business_category as businessCategory,
ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TChargingGunMapper.xml
@@ -34,29 +34,29 @@
    </sql>
    <select id="pageList" resultType="com.ruoyi.chargingPile.api.vo.TChargingGunVO">
        SELECT
        tas.id, tas.code, tas.site_id, tas.partner_id, tas.charging_pile_id, tas.`name`, tas.`type`, tas.status, tas.charge_mode, tas.accounting_strategy_id,
        tas.upper_rated_voltage, tas.lower_limit_of_rated_voltage, tas.rated_current, tas.rated_power, tas.parking_number, tas.parking_status,
        tas.parking_lock_state, tas.national_standard, tas.remark, tas.create_time, tas.del_flag,tcg.name AS strategyName
        tcg.id, tcg.code, tcg.site_id, tcg.partner_id, tcg.charging_pile_id, tcg.`name`, tcg.`type`, tcg.status, tcg.charge_mode, tcg.accounting_strategy_id,
        tcg.upper_rated_voltage, tcg.lower_limit_of_rated_voltage, tcg.rated_current, tcg.rated_power, tcg.parking_number, tcg.parking_status,
        tcg.parking_lock_state, tcg.national_standard, tcg.remark, tcg.create_time, tcg.del_flag,tas.name AS strategyName
        FROM t_charging_gun tcg
        LEFT JOIN t_accounting_strategy tas ON tas.id = tcg.accounting_strategy_id
        <where>
            <if test="query.siteId != null">
                AND tas.site_id = #{query.siteId}
                AND tcg.site_id = #{query.siteId}
            </if>
            <if test="query.chargingPileId != null">
                AND tas.charging_pile_id = #{query.chargingPileId}
                AND tcg.charging_pile_id = #{query.chargingPileId}
            </if>
            <if test="query.name != null and query.name != ''">
                AND tas.`name` LIKE concat('%',#{query.name},'%')
                AND tcg.`name` LIKE concat('%',#{query.name},'%')
            </if>
            <if test="query.type != null">
                AND tas.`type` = #{query.type}
                AND tcg.`type` = #{query.type}
            </if>
            <if test="query.status != null">
                AND tas.status = #{query.status}
                AND tcg.status = #{query.status}
            </if>
            <if test="query.chargeMode != null">
                AND tas.chargeMode = #{query.chargeMode}
                AND tcg.chargeMode = #{query.chargeMode}
            </if>
            <if test="null != siteIds">
                and tcg.site_id in
@@ -64,9 +64,9 @@
                    #{item}
                </foreach>
            </if>
            AND tas.del_flag = ${@com.ruoyi.common.core.enums.DelFlagEnum@NO.getCode()}
            AND tcg.del_flag = ${@com.ruoyi.common.core.enums.DelFlagEnum@NO.getCode()}
        </where>
        ORDER BY tas.create_time DESC
        ORDER BY tcg.create_time DESC
    </select>
</mapper>
ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TChargingPileMapper.xml
@@ -31,22 +31,22 @@
    
    <select id="pageChargingPileList" resultType="com.ruoyi.chargingPile.api.dto.PageChargingPileListDTO">
        select
        id,
        code,
        name,
        number,
        type,
        a.id,
        a.code,
        a.name,
        a.number,
        a.type,
        a.site_id as siteId,
        b.name as siteName,
        a.partner_id as partnerId,
        c.name as partnerName,
        a.manufacturer,
        a.equipment_type as equipmentType,
        a.ratedPower
        a.rated_power as ratedPower
        from t_charging_pile a
        left join t_site b on (a.site_id = b.id)
        left join t_partner c on (a.partner_id = c.id)
        where del_flag = 0
        where a.del_flag = 0
        <if test="null != item.siteId">
            and a.site_id = #{item.siteId}
        </if>
@@ -74,6 +74,7 @@
        from t_charging_pile a
        left join t_site b on (a.site_id = b.id)
        left join t_partner c on (a.partner_id = c.id)
        where a.id = #{id}
    </select>
    <select id="getChargingGunList" resultType="com.ruoyi.chargingPile.api.vo.TChargingPileVO">
        select id,code, `name`, `number` from t_charging_pile
ruoyi-service/ruoyi-integration/pom.xml
@@ -127,12 +127,30 @@
            <version>4.7.1</version>
        </dependency>
        <!--spirngboot集成mongodb-->
        <!--mongodb-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
        <!--华为云-->
        <dependency>
            <groupId>com.huaweicloud.sdk</groupId>
            <artifactId>huaweicloud-sdk-core</artifactId>
            <version>[3.0.40-rc, 3.2.0)</version>
        </dependency>
        <dependency>
            <groupId>com.huaweicloud.sdk</groupId>
            <artifactId>huaweicloud-sdk-iotda</artifactId>
            <version>[3.0.40-rc, 3.2.0)</version>
        </dependency>
        <dependency>
            <groupId>com.huaweicloud.sdk</groupId>
            <artifactId>huaweicloud-sdk-bundle</artifactId>
            <version>3.1.87</version>
        </dependency>
    </dependencies>
    <build>
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/builder/IotBuilder.java
New file
@@ -0,0 +1,57 @@
package com.ruoyi.integration.iotda.builder;
import com.huaweicloud.sdk.core.auth.AbstractCredentials;
import com.huaweicloud.sdk.core.auth.BasicCredentials;
import com.huaweicloud.sdk.core.auth.ICredential;
import com.huaweicloud.sdk.core.region.Region;
import com.huaweicloud.sdk.iam.v3.IamClient;
import com.huaweicloud.sdk.iam.v3.region.IamRegion;
import com.huaweicloud.sdk.iotda.v5.IoTDAClient;
import com.ruoyi.integration.iotda.config.IotDAConfig;
import com.ruoyi.integration.iotda.constant.IotConstant;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class IotBuilder {
    @Autowired
    private IotDAConfig config;
    /**
     * iot build
     *
     * @return
     */
    public IoTDAClient buildIot() {
        ICredential auth = new BasicCredentials()
                // 标准版/企业版需要使用衍生算法,基础版请删除配置"withDerivedPredicate";
                .withDerivedPredicate(AbstractCredentials.DEFAULT_DERIVED_PREDICATE) // Used in derivative ak/sk authentication scenarios
                .withAk(config.getAk())
                .withSk(config.getSk());
        return IoTDAClient.newBuilder()
                .withCredential(auth)
                // 标准版/企业版:需自行创建Region对象,基础版:请使用IoTDARegion的region对象,如"withRegion(IoTDARegion.CN_NORTH_4)"
                .withRegion(new Region("cn-north-4", IotConstant.URL))
                .build();
    }
    /**
     * iam build
     *
     * @return
     */
    public IamClient buildIam() {
        ICredential auth = new BasicCredentials()
                // 标准版/企业版需要使用衍生算法,基础版请删除配置"withDerivedPredicate";
                .withDerivedPredicate(AbstractCredentials.DEFAULT_DERIVED_PREDICATE) // Used in derivative ak/sk authentication scenarios
                .withAk(config.getAk())
                .withSk(config.getSk());
        return IamClient.newBuilder()
                .withCredential(auth)
                .withRegion(IamRegion.valueOf("cn-north-4"))
                .build();
    }
}
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/config/IotAccountConfig.java
New file
@@ -0,0 +1,27 @@
package com.ruoyi.integration.iotda.config;
import lombok.Data;
import lombok.ToString;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Data
@ToString
@Component
@ConfigurationProperties(prefix = "iot.account.conf")
public class IotAccountConfig {
    /**
     * hostAccount配置
     */
    private String hostAccount;
    /**
     * iamAccount配置
     */
    private String iamAccount;
    /**
     * iamPassword配置
     */
    private String iamPassword;
}
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/config/IotDAConfig.java
New file
@@ -0,0 +1,35 @@
package com.ruoyi.integration.iotda.config;
import lombok.Data;
import lombok.ToString;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Data
@ToString
@Component
@ConfigurationProperties(prefix = "iot.conf")
public class IotDAConfig {
    /**
     * ak配置
     */
    private String ak;
    /**
     * sk配置
     */
    private String sk;
    /**
     * endpoint配置  938d8d39e2.iotda.cn-north-4.myhuaweicloud.com
     */
    private String endpoint;
    /**
     * project_id配置      0cc59978c61e4b4da24e8c3d02937b45
     */
    private String projectId;
    /**
     * Instance-Id配置      c60f266a-57a2-460c-a24e-eabda84602eb
     */
    private String instanceId;
}
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/constant/IotConstant.java
New file
@@ -0,0 +1,25 @@
package com.ruoyi.integration.iotda.constant;
public class IotConstant {
    /**
     * 华为云iot  token
     */
    public static final String IOT_TOKEN = "iot_token";
    /**
     * 模式
     */
    public static final String PASSWORD = "password";
    /**
     * URL
     */
    public static final String URL = "https://iotda.cn-north-4.myhuaweicloud.com";
    /**
     * 创建产品
     */
    public static final String CREATE_PRODUCT = URL+"/v5/iot/{project_id}/products";
    /**
     * 创建产品
     */
    public static final String DELETE_PRODUCT = URL+"/v5/iot/{project_id}/products/{product_id}";
}
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/api/IotInterfaceUtil.java
New file
@@ -0,0 +1,261 @@
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.utils.CodeGenerateUtils;
import com.ruoyi.common.core.utils.uuid.UUID;
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.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
/**
 * iot接口调用工具类
 */
@Slf4j
@Component
public class IotInterfaceUtil {
    private static final String dataFormat = "json";
    private static final String protocolType = "HTTPS";
    private static final String deviceType = "充电桩";
    private static final String serviceType = "直流充电";
    @Autowired
    private IotBuilder iotBuilder;
    @Autowired
    private IotDAConfig iotDAConfig;
    private String decodeUrl(String url) {
        return MessageFormat.format(url, iotDAConfig.getProjectId());
    }
    public static void main(String[] args) {
    }
    /**
     * 创建产品
     * @param productId 产品ID,使用UUID.randomUUID().toString()生成 需替换特殊字符 "-" 为空
     * @param productName 产品名称
     * @return CreateProductResponse
     */
    public CreateProductResponse createProductSolution(String productId,String productName) {
        CreateProductRequest request = new CreateProductRequest();
        AddProduct body = new AddProduct();
        List<ServiceCapability> listbodyServiceCapabilities = new ArrayList<>();
        listbodyServiceCapabilities.add(
                new ServiceCapability()
                        .withServiceId(CodeGenerateUtils.generateVolumeSn())
                        .withServiceType(serviceType)
        );
        body.withServiceCapabilities(listbodyServiceCapabilities);
        body.withDataFormat(dataFormat);
        body.withProtocolType(protocolType);
        body.withDeviceType(deviceType);
        body.withName(productName);
        body.withProductId(productId);
        request.withBody(body);
        request.withInstanceId(iotDAConfig.getInstanceId());
        try {
            CreateProductResponse response = iotBuilder.buildIot().createProduct(request);
            log.info("创建产品:{}",response.toString());
            return response;
        } catch (ConnectionException | RequestTimeoutException e) {
            e.printStackTrace();
        } catch (ServiceResponseException e) {
            e.printStackTrace();
            log.info(String.valueOf(e.getHttpStatusCode()));
            log.info(e.getRequestId());
            log.info(e.getErrorCode());
            log.info(e.getErrorMsg());
        }
        return null;
    }
    /**
     * 删除产品
     * @param productId 产品ID,使用UUID.randomUUID().toString()生成 需替换特殊字符 "-" 为空
     * @return DeleteProductResponse
     */
    public DeleteProductResponse deleteProductRequest(String productId) {
        DeleteProductRequest request = new DeleteProductRequest();
        request.withProductId(productId);
        request.withInstanceId(iotDAConfig.getInstanceId());
        try {
            DeleteProductResponse response = iotBuilder.buildIot().deleteProduct(request);
            log.info("删除产品:{}",response.toString());
            return response;
        } catch (ConnectionException e) {
            e.printStackTrace();
        } catch (RequestTimeoutException e) {
            e.printStackTrace();
        } catch (ServiceResponseException e) {
            e.printStackTrace();
            System.out.println(e.getHttpStatusCode());
            System.out.println(e.getRequestId());
            System.out.println(e.getErrorCode());
            System.out.println(e.getErrorMsg());
        }
        return null;
    }
    /**
     * 创建设备
     * @param productId 产品ID
     * @param nodeId 设备标识码  通常使用IMEI、MAC地址或Serial No作为node_id
     * @param deviceId 设备ID 使用CodeGenerateUtils.generateVolumeSn()
     * @param deviceName 设备名称
     * @param description 设备描述
     * @return AddDeviceResponse
     */
    public AddDeviceResponse addDeviceRequest(String productId,String nodeId,String deviceId,String deviceName,String description) {
        AddDeviceRequest request = new AddDeviceRequest();
        AddDevice body = new AddDevice();
        body.withDeviceId(deviceId);
        body.withNodeId(nodeId);
        body.withDeviceName(deviceName);
        body.withProductId(productId);
        body.withDescription(description);
        request.withBody(body);
        try {
            AddDeviceResponse response = iotBuilder.buildIot().addDevice(request);
            log.info("创建设备:{}",response.toString());
            return response;
        } catch (ConnectionException e) {
            e.printStackTrace();
        } catch (RequestTimeoutException e) {
            e.printStackTrace();
        } catch (ServiceResponseException e) {
            e.printStackTrace();
            System.out.println(e.getHttpStatusCode());
            System.out.println(e.getRequestId());
            System.out.println(e.getErrorCode());
            System.out.println(e.getErrorMsg());
        }
        return null;
    }
    /**
     * 修改设备
     * @param deviceId 设备ID 使用已有设备编号
     * @param deviceName 设备名称
     * @param description 设备描述
     * @return UpdateDeviceResponse
     */
    public UpdateDeviceResponse updateDeviceRequest(String deviceId,String deviceName,String description) {
        UpdateDeviceRequest request = new UpdateDeviceRequest();
        request.withDeviceId(deviceId);
        UpdateDevice body = new UpdateDevice();
        body.withDescription(description);
        body.withDeviceName(deviceName);
        request.withBody(body);
        try {
            UpdateDeviceResponse response = iotBuilder.buildIot().updateDevice(request);
            log.info("修改设备:{}",response.toString());
            return response;
        } catch (ConnectionException e) {
            e.printStackTrace();
        } catch (RequestTimeoutException e) {
            e.printStackTrace();
        } catch (ServiceResponseException e) {
            e.printStackTrace();
            System.out.println(e.getHttpStatusCode());
            System.out.println(e.getRequestId());
            System.out.println(e.getErrorCode());
            System.out.println(e.getErrorMsg());
        }
        return null;
    }
    /**
     * 冻结设备
     * @param deviceId 设备ID 使用已有设备编号
     * @return FreezeDeviceResponse
     */
    public FreezeDeviceResponse freezeDeviceRequest(String deviceId) {
        FreezeDeviceRequest request = new FreezeDeviceRequest();
        request.withDeviceId(deviceId);
        try {
            FreezeDeviceResponse response = iotBuilder.buildIot().freezeDevice(request);
            log.info("冻结设备:{}",response.toString());
            return response;
        } catch (ConnectionException e) {
            e.printStackTrace();
        } catch (RequestTimeoutException e) {
            e.printStackTrace();
        } catch (ServiceResponseException e) {
            e.printStackTrace();
            System.out.println(e.getHttpStatusCode());
            System.out.println(e.getRequestId());
            System.out.println(e.getErrorCode());
            System.out.println(e.getErrorMsg());
        }
        return null;
    }
    /**
     * 解冻设备
     * @param deviceId 设备ID 使用已有设备编号
     * @return UnfreezeDeviceResponse
     */
    public UnfreezeDeviceResponse unfreezeDeviceRequest(String deviceId) {
        UnfreezeDeviceRequest request = new UnfreezeDeviceRequest();
        request.withDeviceId(deviceId);
        try {
            UnfreezeDeviceResponse response = iotBuilder.buildIot().unfreezeDevice(request);
            log.info("解冻设备:{}",response.toString());
            return response;
        } catch (ConnectionException e) {
            e.printStackTrace();
        } catch (RequestTimeoutException e) {
            e.printStackTrace();
        } catch (ServiceResponseException e) {
            e.printStackTrace();
            System.out.println(e.getHttpStatusCode());
            System.out.println(e.getRequestId());
            System.out.println(e.getErrorCode());
            System.out.println(e.getErrorMsg());
        }
        return null;
    }
    /**
     * 删除设备
     * @param deviceId 设备ID 使用已有设备编号
     * @return DeleteDeviceResponse
     */
    public DeleteDeviceResponse deleteDeviceRequest(String deviceId) {
        DeleteDeviceRequest request = new DeleteDeviceRequest();
        request.withDeviceId(deviceId);
        try {
            DeleteDeviceResponse response = iotBuilder.buildIot().deleteDevice(request);
            log.info("删除设备:{}",response.toString());
            return response;
        } catch (ConnectionException e) {
            e.printStackTrace();
        } catch (RequestTimeoutException e) {
            e.printStackTrace();
        } catch (ServiceResponseException e) {
            e.printStackTrace();
            System.out.println(e.getHttpStatusCode());
            System.out.println(e.getRequestId());
            System.out.println(e.getErrorCode());
            System.out.println(e.getErrorMsg());
        }
        return null;
    }
}
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/listener/IotMessageListener.java
New file
@@ -0,0 +1,13 @@
package com.ruoyi.integration.iotda.utils.listener;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
 * iotda消息监听
 */
@Slf4j
@Component
public class IotMessageListener {
}
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/produce/IotMessageProduce.java
New file
@@ -0,0 +1,13 @@
package com.ruoyi.integration.iotda.utils.produce;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
 * iotda消息发送
 */
@Slf4j
@Component
public class IotMessageProduce {
}
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/time/UtcToSeconds.java
New file
@@ -0,0 +1,19 @@
package com.ruoyi.integration.iotda.utils.time;
import java.time.Instant;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
public class UtcToSeconds {
    public static long convertToSeconds(String utcTimeString) {
        Instant instant = Instant.parse(utcTimeString);
        long seconds = instant.atOffset(ZoneOffset.UTC).toEpochSecond();
        return seconds;
    }
    public static void main(String[] args) {
        String utcTimeString = "2023-04-01T12:00:00Z";
        long seconds = convertToSeconds(utcTimeString);
        System.out.println("Seconds since epoch: " + seconds);
    }
}
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/token/IotTokenUtil.java
New file
@@ -0,0 +1,72 @@
package com.ruoyi.integration.iotda.utils.token;
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.iam.v3.model.*;
import com.ruoyi.common.redis.service.RedisService;
import com.ruoyi.integration.iotda.constant.IotConstant;
import com.ruoyi.integration.iotda.builder.IotBuilder;
import com.ruoyi.integration.iotda.config.IotAccountConfig;
import com.ruoyi.integration.iotda.utils.time.UtcToSeconds;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
@Slf4j
@Component
public class IotTokenUtil {
    @Autowired
    private IotBuilder iotBuilder;
    @Autowired
    private IotAccountConfig accountConfig;
    @Autowired
    private RedisService redisService;
    /**
     * 获取token
     * @return
     */
    public KeystoneCreateUserTokenByPasswordResponse getToken() {
        KeystoneCreateUserTokenByPasswordRequest request = new KeystoneCreateUserTokenByPasswordRequest();
        KeystoneCreateUserTokenByPasswordRequestBody body = new KeystoneCreateUserTokenByPasswordRequestBody();
        PwdPasswordUserDomain domainUser = new PwdPasswordUserDomain();
        domainUser.withName(accountConfig.getHostAccount());
        PwdPasswordUser userPassword = new PwdPasswordUser();
        userPassword.withDomain(domainUser)
                .withName(accountConfig.getIamAccount())
                .withPassword(accountConfig.getIamPassword());
        PwdPassword passwordIdentity = new PwdPassword();
        passwordIdentity.withUser(userPassword);
        List<PwdIdentity.MethodsEnum> listIdentityMethods = new ArrayList<>();
        listIdentityMethods.add(PwdIdentity.MethodsEnum.fromValue(IotConstant.PASSWORD));
        PwdIdentity identityAuth = new PwdIdentity();
        identityAuth.withMethods(listIdentityMethods)
                .withPassword(passwordIdentity);
        PwdAuth authbody = new PwdAuth();
        authbody.withIdentity(identityAuth);
        body.withAuth(authbody);
        request.withBody(body);
        try {
            KeystoneCreateUserTokenByPasswordResponse response = iotBuilder.buildIam().keystoneCreateUserTokenByPassword(request);
            redisService.setCacheObject(IotConstant.IOT_TOKEN, response.getXSubjectToken(), UtcToSeconds.convertToSeconds(response.getToken().getExpiresAt()), TimeUnit.SECONDS);
            return response;
        } catch (ConnectionException e) {
            e.printStackTrace();
        } catch (RequestTimeoutException e) {
            e.printStackTrace();
        } catch (ServiceResponseException e) {
            e.printStackTrace();
            System.out.println(e.getHttpStatusCode());
            System.out.println(e.getRequestId());
            System.out.println(e.getErrorCode());
            System.out.println(e.getErrorMsg());
        }
        return null;
    }
}
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TEnterpriseUserApplicationController.java
@@ -4,11 +4,13 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.account.api.dto.EnterpriseQuery;
import com.ruoyi.account.api.feignClient.AppUserClient;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.log.annotation.Log;
import com.ruoyi.common.log.enums.BusinessType;
import com.ruoyi.common.security.service.TokenService;
import com.ruoyi.other.api.domain.TEnterpriseUserApplication;
import com.ruoyi.other.query.PassDto;
import com.ruoyi.other.service.TEnterpriseUserApplicationService;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
@@ -45,7 +47,7 @@
     * 添加计费策略管理
     */
    @Log(title = "添加集团用户申请", businessType = BusinessType.INSERT)
    @ApiOperation(tags = {"小程序-集团用户","后台-申请表单-集团用户"},value = "添加集团用户申请")
    @ApiOperation(tags = {"小程序-集团用户"},value = "添加集团用户申请")
    @PostMapping(value = "/add")
    public AjaxResult<Boolean> add(@Validated @RequestBody TEnterpriseUserApplication dto) {
        // 用户id
@@ -53,31 +55,40 @@
        return AjaxResult.ok(enterpriseUserApplicationService.save(dto));
    }
    @Log(title = "添加集团用户申请", businessType = BusinessType.INSERT)
    @ApiOperation(tags = {"后台-申请表单-集团用户"},value = "后台添加集团用户申请")
    @PostMapping(value = "/back/add")
    public AjaxResult<Boolean> backAdd(@Validated @RequestBody TEnterpriseUserApplication dto) {
        // 用户id
        return AjaxResult.ok(enterpriseUserApplicationService.save(dto));
    }
    @ApiOperation(tags = {"后台-申请表单-集团用户"},value = "集团用户列表")
    @PostMapping(value = "/page")
    public AjaxResult<Page<TEnterpriseUserApplication>> page(EnterpriseQuery enterpriseQuery) {
    public R<Page<TEnterpriseUserApplication>> page(EnterpriseQuery enterpriseQuery) {
        // 用户id
        if (enterpriseQuery.getPhone()!=null) {
            List<Long> userIds = appUserClient.getUserIdsByPhone(enterpriseQuery.getPhone()).getData();
            if (userIds.isEmpty()){
                return AjaxResult.warn("未查询到用户");
                return R.ok();
            }
            Page<TEnterpriseUserApplication> page = enterpriseUserApplicationService.lambdaQuery().in(TEnterpriseUserApplication::getAppUserId, userIds).page(Page.of(enterpriseQuery.getPageCurr(), enterpriseQuery.getPageSize()));
        return AjaxResult.ok(page);
        return R.ok(page);
        }else {
            Page<TEnterpriseUserApplication> page = enterpriseUserApplicationService.lambdaQuery().page(Page.of(enterpriseQuery.getPageCurr(), enterpriseQuery.getPageSize()));
            return AjaxResult.ok(page);
            return R.ok(page);
        }
    }
    @ApiOperation(tags = {"后台-申请表单-集团用户"},value = "备注")
    @GetMapping(value = "/remark")
    public AjaxResult pass(Integer id,String remark) {
    @PostMapping(value = "/remark")
    public AjaxResult pass(@RequestBody PassDto passDto) {
        // 用户id
        TEnterpriseUserApplication byId = enterpriseUserApplicationService.getById(id);
        byId.setRemark(remark);
        TEnterpriseUserApplication byId = enterpriseUserApplicationService.getById(passDto.getId());
        byId.setRemark(passDto.getRemark());
        enterpriseUserApplicationService.updateById(byId);
        return AjaxResult.success();
    }
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/query/PassDto.java
New file
@@ -0,0 +1,13 @@
package com.ruoyi.other.query;
import lombok.Data;
/**
 * @author zhibing.pu
 * @date 2024/8/20 18:25
 */
@Data
public class PassDto {
    Integer id;
    String remark;
}
ruoyi-service/ruoyi-other/src/main/resources/mapper/other/TAdvertisingMapper.xml
@@ -24,16 +24,16 @@
    <select id="pageList" resultType="com.ruoyi.other.api.domain.TAdvertising">
        select * from t_advertising
        <where>
            <if test="req.name != null and req.name != ''">
                AND  `name` LIKE concat('%',#{req.name}, '%')
            <if test="req.title != null and req.title != ''">
                AND  `name` LIKE concat('%',#{req.title}, '%')
            </if>
            <if test="req.state == 1">
            <if test="req.startState == 1">
                AND  start_time >= NOW()
            </if>
            <if test="req.state == 2">
            <if test="req.startState == 2">
                AND  start_time &lt;= NOW() AND end_time >= NOW()
            </if>
            <if test="req.state == 3">
            <if test="req.startState == 3">
                AND  end_time &lt;= NOW()
            </if>
            AND del_flag = ${@com.ruoyi.common.core.enums.DelFlagEnum@NO.getCode()}
ruoyi-service/ruoyi-other/src/main/resources/mybatis-config.xml
@@ -10,7 +10,7 @@
        <setting name="cacheEnabled" value="true"/>
        <!-- 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。默认 false  -->
        <!-- <setting name="lazyLoadingEnabled" value="true"/> -->
        <setting name="mapUnderscoreToCamelCase" value="false"/><!--是否将map下划线方式转为驼峰式命名-->
        <setting name="mapUnderscoreToCamelCase" value="true"/><!--是否将map下划线方式转为驼峰式命名-->
        <!-- 当开启时,任何方法的调用都会加载该对象的所有属性。默认 false,可通过select标签的 fetchType来覆盖-->
        <!-- <setting name="aggressiveLazyLoading" value="false"/>-->
        <!--  Mybatis 创建具有延迟加载能力的对象所用到的代理工具,默认JAVASSIST -->