From bed6becab65745585281ba2e499fa39de561c29f Mon Sep 17 00:00:00 2001 From: zhibing.pu <393733352@qq.com> Date: 星期五, 09 八月 2024 16:47:28 +0800 Subject: [PATCH] 提交管理后台部分接口 --- ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/IPartnerService.java | 36 ++ ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/dto/PageChargingPileListDTO.java | 8 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysUser.java | 13 ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/vo/TChargingGunVO.java | 18 + ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/SysUserFallbackFactory.java | 7 ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/dto/GetPermissionConfigurationDTO.java | 21 + ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/query/SetPermissionConfiguration.java | 24 + ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/PartnerController.java | 41 ++ ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/SiteMapper.xml | 6 ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/RequestParamGlobalFilter.java | 98 +++++ ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml | 6 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingGunServiceImpl.java | 35 + ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TChargingPileMapper.xml | 6 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/SiteController.java | 28 + ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TChargingGunMapper.xml | 6 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/SiteMapper.java | 2 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/PartnerServiceImpl.java | 160 +++++++- ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java | 2 ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/AuthFilter.java | 30 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/domain/SiteMenu.java | 72 ++++ ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/Partner.java | 5 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/SysUserClient.java | 9 ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/dto/GetSiteListDTO.java | 8 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/TChargingPileMapper.java | 2 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/TChargingGunMapper.java | 2 ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/XssFilter.java | 136 ------ ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TSiteMenu.java | 2 ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/SignFilter.java | 181 ++++++++++ ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java | 29 + ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java | 19 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TChargingPileController.java | 5 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java | 7 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/SiteServiceImpl.java | 45 ++ ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java | 10 ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/PartnerMapper.xml | 1 35 files changed, 841 insertions(+), 239 deletions(-) diff --git a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/dto/GetPermissionConfigurationDTO.java b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/dto/GetPermissionConfigurationDTO.java new file mode 100644 index 0000000..dfe66c9 --- /dev/null +++ b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/dto/GetPermissionConfigurationDTO.java @@ -0,0 +1,21 @@ +package com.ruoyi.chargingPile.api.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + * @author zhibing.pu + * @Date 2024/8/9 10:30 + */ +@Data +@ApiModel +public class GetPermissionConfigurationDTO { + @ApiModelProperty(value = "备注") + private String permissionRemarks; + @ApiModelProperty(value = "权限菜单") + private Map<String, Object> menu; +} diff --git a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/dto/GetSiteListDTO.java b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/dto/GetSiteListDTO.java index 7fb9ab5..f971f06 100644 --- a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/dto/GetSiteListDTO.java +++ b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/dto/GetSiteListDTO.java @@ -43,4 +43,12 @@ private Integer accountingStrategyId; @ApiModelProperty("计费策略类型(1=平台添加,2=自定义策略)") private Integer accountingStrategyType; + @ApiModelProperty(value = "计费策略权限") + private boolean authAccountingStrategy = true; + @ApiModelProperty(value = "合作商权限") + private boolean authPartner = true; + @ApiModelProperty(value = "编辑权限") + private boolean authUpdate = true; + @ApiModelProperty(value = "删除权限") + private boolean authDelete = true; } diff --git a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/dto/PageChargingPileListDTO.java b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/dto/PageChargingPileListDTO.java index b58c94f..74826e8 100644 --- a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/dto/PageChargingPileListDTO.java +++ b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/dto/PageChargingPileListDTO.java @@ -37,5 +37,13 @@ private String equipmentType; @ApiModelProperty(value = "额定功率") private BigDecimal ratedPower; + @ApiModelProperty(value = "查看权限") + private boolean authQueryInfo = true; + @ApiModelProperty(value = "编辑权限") + private boolean authUpdate = true; + @ApiModelProperty(value = "删除权限") + private boolean authDelete = true; + @ApiModelProperty(value = "新增接口权限") + private boolean authAddChargingGun = true; } diff --git a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/Partner.java b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/Partner.java index 481c96c..9a6d580 100644 --- a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/Partner.java +++ b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/Partner.java @@ -98,4 +98,9 @@ @TableField("password") @ApiModelProperty(value = "登录密码", required = true) private String password; + /** + * 权限备注 + */ + @TableField("permission_remarks") + private String permissionRemarks; } diff --git a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TSiteMenu.java b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TSiteMenu.java index ac58640..0fbeaf2 100644 --- a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TSiteMenu.java +++ b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TSiteMenu.java @@ -64,7 +64,7 @@ @TableField("is_cache") private Integer isCache; - @ApiModelProperty(value = "菜单类型(M目录 C菜单 F按钮)") + @ApiModelProperty(value = "菜单类型(M目录 C菜单 F按钮 D数据)") @TableField("menu_type") private String menuType; diff --git a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/query/SetPermissionConfiguration.java b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/query/SetPermissionConfiguration.java new file mode 100644 index 0000000..bc77f75 --- /dev/null +++ b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/query/SetPermissionConfiguration.java @@ -0,0 +1,24 @@ +package com.ruoyi.chargingPile.api.query; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author zhibing.pu + * @Date 2024/8/9 11:13 + */ +@Data +@ApiModel +public class SetPermissionConfiguration { + @ApiModelProperty(value = "备注") + private String permissionRemarks; + @ApiModelProperty(value = "权限菜单id数组", required = true) + private List<Integer> menuId; + @ApiModelProperty(value = "站点id", required = true) + private Integer siteId; + @ApiModelProperty(value = "合作商id", required = true) + private Integer partnerId; +} diff --git a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/vo/TChargingGunVO.java b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/vo/TChargingGunVO.java index bfdcd03..db1d3e4 100644 --- a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/vo/TChargingGunVO.java +++ b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/vo/TChargingGunVO.java @@ -11,5 +11,23 @@ @ApiModelProperty(value = "策略名称") private String strategyName; + + @ApiModelProperty(value = "编辑权限") + private boolean authUpdate = true; + + @ApiModelProperty(value = "删除权限") + private boolean authDelete = true; + + @ApiModelProperty(value = "查看费率权限") + private boolean authViewRates = true; + + @ApiModelProperty(value = "编辑权限") + private boolean authDownloadQRCode = true; + + @ApiModelProperty(value = "编辑权限") + private boolean authQueryInfo = true; + + @ApiModelProperty(value = "编辑权限") + private boolean authEndCharge = true; } diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysUser.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysUser.java index 8163aa5..dbebc60 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysUser.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysUser.java @@ -62,11 +62,6 @@ /** 用户头像 */ private String avatar; - /** - * 登录账号 - */ - @TableField("account") - private String account; /** 密码 */ @NotBlank(message = "密码不能为空") @@ -269,14 +264,6 @@ public void setAvatar(String avatar) { this.avatar = avatar; - } - - public String getAccount() { - return account; - } - - public void setAccount(String account) { - this.account = account; } public String getPassword() diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/SysUserFallbackFactory.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/SysUserFallbackFactory.java index 49df453..d8d4994 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/SysUserFallbackFactory.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/SysUserFallbackFactory.java @@ -86,11 +86,6 @@ } @Override - public R<SysUser> queryUserByAccount(String account) { - return null; - } - - @Override public R<SysUser> queryUserByUserName(String userName) { return R.fail("通过账号查询用户失败:" + cause.getMessage()); } @@ -102,7 +97,7 @@ @Override public R resetPassword(SysUser user) { - return null; + return R.fail("重置用户密码失败:" + cause.getMessage()); } }; } diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/SysUserClient.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/SysUserClient.java index ad41b7f..4dff3cc 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/SysUserClient.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/SysUserClient.java @@ -86,15 +86,6 @@ */ @PostMapping("/user/queryUserByPhone") R<SysUser> queryUserByPhone(@RequestBody String phone); - - - /** - * 根据账号获取用户数据 - * @param account - * @return - */ - @PostMapping("/user/queryUserByAccount") - R<SysUser> queryUserByAccount(@RequestBody String account); /** * 通过账号查询用户 diff --git a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/AuthFilter.java b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/AuthFilter.java index d59c735..e829417 100644 --- a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/AuthFilter.java +++ b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/AuthFilter.java @@ -1,5 +1,7 @@ package com.ruoyi.gateway.filter; +import com.alibaba.fastjson.JSONObject; +import org.apache.commons.codec.binary.Base64; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -7,7 +9,10 @@ import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.cloud.gateway.filter.GlobalFilter; import org.springframework.core.Ordered; +import org.springframework.core.io.buffer.DataBuffer; +import org.springframework.http.HttpHeaders; import org.springframework.http.server.reactive.ServerHttpRequest; +import org.springframework.http.server.reactive.ServerHttpRequestDecorator; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; import com.ruoyi.common.core.constant.CacheConstants; @@ -20,7 +25,14 @@ import com.ruoyi.common.redis.service.RedisService; import com.ruoyi.gateway.config.properties.IgnoreWhiteProperties; import io.jsonwebtoken.Claims; +import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.concurrent.atomic.AtomicReference; /** * 网关鉴权 @@ -37,9 +49,6 @@ @Autowired private RedisService redisService; - - @Value("${security.sign}") - private boolean parameter_signature; @Override @@ -70,15 +79,7 @@ if (StringUtils.isEmpty(userid) || StringUtils.isEmpty(username)) { return unauthorizedResponse(exchange, "令牌验证失败"); } - if(parameter_signature){ - String sign = request.getHeaders().getFirst(TokenConstants.SING); - String nonce_str = request.getHeaders().getFirst(TokenConstants.NONCE_STR); - if(StringUtils.isEmpty(sign) || StringUtils.isEmpty(nonce_str)){ - log.error("[鉴权签名异常处理]请求路径:{}", exchange.getRequest().getPath()); - return ServletUtils.webFluxResponseWriter(exchange.getResponse(), "签名校验失败", HttpStatus.BAD_REQUEST); - } - } - + // 设置用户信息到请求 addHeader(mutate, SecurityConstants.USER_KEY, userkey); addHeader(mutate, SecurityConstants.DETAILS_USER_ID, userid); @@ -126,10 +127,11 @@ } return token; } - + + @Override public int getOrder() { - return -200; + return -300; } } \ No newline at end of file diff --git a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/RequestParamGlobalFilter.java b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/RequestParamGlobalFilter.java new file mode 100644 index 0000000..c13f096 --- /dev/null +++ b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/RequestParamGlobalFilter.java @@ -0,0 +1,98 @@ +package com.ruoyi.gateway.filter; + +import com.alibaba.fastjson.JSONObject; +import com.ruoyi.common.core.constant.HttpStatus; +import com.ruoyi.common.core.constant.TokenConstants; +import com.ruoyi.common.core.utils.ServletUtils; +import com.ruoyi.common.core.utils.StringUtils; +import com.ruoyi.common.core.utils.html.EscapeUtil; +import com.ruoyi.gateway.config.properties.XssProperties; +import io.netty.buffer.ByteBufAllocator; +import org.apache.commons.codec.binary.Base64; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.cloud.gateway.filter.GatewayFilterChain; +import org.springframework.cloud.gateway.filter.GlobalFilter; +import org.springframework.core.Ordered; +import org.springframework.core.io.buffer.*; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; +import org.springframework.http.server.reactive.ServerHttpRequest; +import org.springframework.http.server.reactive.ServerHttpRequestDecorator; +import org.springframework.stereotype.Component; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.concurrent.atomic.AtomicReference; + +/** + * 跨站脚本过滤器 + * + * @author ruoyi + */ +@Component +public class RequestParamGlobalFilter implements GlobalFilter, Ordered { + + + + @Override + public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { + ServerHttpRequestDecorator httpRequestDecorator = requestDecorator(exchange); + return chain.filter(exchange.mutate().request(httpRequestDecorator).build()); + } + + + + + private ServerHttpRequestDecorator requestDecorator(ServerWebExchange exchange) { + ServerHttpRequestDecorator serverHttpRequestDecorator = new ServerHttpRequestDecorator(exchange.getRequest()) { + @Override + public Flux<DataBuffer> getBody() { + Flux<DataBuffer> body = super.getBody(); + return body.buffer().map(dataBuffers -> { + DataBufferFactory dataBufferFactory = new DefaultDataBufferFactory(); + DataBuffer join = dataBufferFactory.join(dataBuffers); + byte[] content = new byte[join.readableByteCount()]; + join.read(content); + DataBufferUtils.release(join); + String bodyStr = new String(content, StandardCharsets.UTF_8); + // 转成字节 + byte[] bytes = bodyStr.getBytes(); + NettyDataBufferFactory nettyDataBufferFactory = new NettyDataBufferFactory(ByteBufAllocator.DEFAULT); + DataBuffer buffer = nettyDataBufferFactory.allocateBuffer(bytes.length); + buffer.write(bytes); + return buffer; + }); + } + + @Override + public HttpHeaders getHeaders() { + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.putAll(super.getHeaders()); + // 由于修改了请求体的body,导致content-length长度不确定,因此需要删除原先的content-length + httpHeaders.remove(HttpHeaders.CONTENT_LENGTH); + httpHeaders.set(HttpHeaders.TRANSFER_ENCODING, "chunked"); + return httpHeaders; + } + + }; + return serverHttpRequestDecorator; + } + + + @Override + public int getOrder() + { + return HIGHEST_PRECEDENCE; + } +} diff --git a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/SignFilter.java b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/SignFilter.java new file mode 100644 index 0000000..799de22 --- /dev/null +++ b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/SignFilter.java @@ -0,0 +1,181 @@ +package com.ruoyi.gateway.filter; + +import com.alibaba.fastjson.JSONObject; +import com.ruoyi.common.core.constant.CacheConstants; +import com.ruoyi.common.core.constant.HttpStatus; +import com.ruoyi.common.core.constant.SecurityConstants; +import com.ruoyi.common.core.constant.TokenConstants; +import com.ruoyi.common.core.utils.JwtUtils; +import com.ruoyi.common.core.utils.ServletUtils; +import com.ruoyi.common.core.utils.StringUtils; +import com.ruoyi.common.redis.service.RedisService; +import com.ruoyi.gateway.config.properties.IgnoreWhiteProperties; +import io.jsonwebtoken.Claims; +import org.apache.commons.codec.binary.Base64; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cloud.gateway.filter.GatewayFilterChain; +import org.springframework.cloud.gateway.filter.GlobalFilter; +import org.springframework.core.Ordered; +import org.springframework.core.io.buffer.DataBuffer; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.server.reactive.ServerHttpRequest; +import org.springframework.http.server.reactive.ServerHttpRequestDecorator; +import org.springframework.stereotype.Component; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.concurrent.atomic.AtomicReference; + +/** + * 网关鉴权 + * + * @author ruoyi + */ +@Component +public class SignFilter implements GlobalFilter, Ordered { + private static final Logger log = LoggerFactory.getLogger(SignFilter.class); + + // 排除过滤的 uri 地址,nacos自行添加 + @Autowired + private IgnoreWhiteProperties ignoreWhite; + + @Autowired + private RedisService redisService; + + @Value("${security.sign}") + private boolean parameter_signature; + + + @Override + public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { + ServerHttpRequest request = exchange.getRequest(); + ServerHttpRequest.Builder mutate = request.mutate(); + + HttpMethod method = request.getMethod(); + if(method != HttpMethod.POST){ + return chain.filter(exchange.mutate().request(mutate.build()).build()); + } + String sing = request.getHeaders().getFirst(TokenConstants.SING); + String nonce_str = request.getHeaders().getFirst(TokenConstants.NONCE_STR); + if (parameter_signature && StringUtils.isEmpty(sing)) { + return unauthorizedResponse(exchange, "签名不能为空!"); + } + if (parameter_signature && StringUtils.isEmpty(nonce_str)) { + return unauthorizedResponse(exchange, "签名不能为空!"); + } + if(parameter_signature && !authSign(exchange)){ + return unauthorizedResponse(exchange, "签名不通过!"); + } + return chain.filter(exchange.mutate().request(mutate.build()).build()); + } + + + + private Mono<Void> unauthorizedResponse(ServerWebExchange exchange, String msg) { + log.error("[签名异常处理]请求路径:{}", exchange.getRequest().getPath()); + return ServletUtils.webFluxResponseWriter(exchange.getResponse(), msg, HttpStatus.BAD_REQUEST); + } + + + /** + * 校验签名 + * @param exchange + * @return + */ + private boolean authSign(ServerWebExchange exchange){ + return false; + } + + + + /** + * 签名校验 + * @param httpRequestDecorator + * @return + */ + private boolean authSign(ServerHttpRequestDecorator httpRequestDecorator) { + HttpHeaders headers = httpRequestDecorator.getHeaders(); + Flux<DataBuffer> body = httpRequestDecorator.getBody(); + AtomicReference<JSONObject> jsonObject = new AtomicReference<>(new JSONObject()); + httpRequestDecorator.getBody().map(dataBuffers -> dataBuffers.toString()); + JSONObject params = jsonObject.get(); + String sign = headers.getFirst(TokenConstants.SING); + if(StringUtils.isEmpty(sign)){ + return false; + } + String nonce_str = headers.getFirst(TokenConstants.NONCE_STR); + if(StringUtils.isEmpty(nonce_str)){ + return false; + } + + String signUrlEncode = localSignUrl(params, nonce_str); + signUrlEncode = signUrlEncode.replaceAll("& #40;", "\\(") + .replaceAll("& #41;", "\\)") + .replaceAll("\\+", " "); + if(sign.equals(signUrlEncode)){ + return true; + } + return false; + } + + + /** + * 组装签名路径 + * @param params + * @return + */ + public static String localSignUrl(JSONObject params, String key) { + List<String> keySet = new ArrayList<>(params.keySet()); + // 对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序) + Collections.sort(keySet, new Comparator<String>() { + @Override + public int compare(String o1, String o2) { + return o1.compareTo(o2); + } + }); + // 构造签名键值对的格式 + StringBuilder sb = new StringBuilder(); + for (String k : keySet) { + String v = params.getString(k); + if(StringUtils.isNotEmpty(v)){ + sb.append(k + "=" + v + "&"); + } + } + String signUrl = sb.substring(0, sb.length() - 1); + return signUrlEncode(signUrl, key); + } + + + /** + * 签名字符串加密 + * @param signUrl + * @param encryptKey + * @return + */ + public static String signUrlEncode(String signUrl, String encryptKey) { + byte[] signByte = new byte[0]; + try { + signByte = HMACSHA1.HmacSHA1Encrypt(signUrl, encryptKey); + } catch (Exception e) { + throw new RuntimeException(e); + } + String localSign = Base64.encodeBase64String(signByte); + return localSign; + } + + + @Override + public int getOrder() + { + return -200; + } +} \ No newline at end of file diff --git a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/XssFilter.java b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/XssFilter.java index fe449a9..6d3e498 100644 --- a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/XssFilter.java +++ b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/XssFilter.java @@ -50,52 +50,41 @@ // 跨站脚本的 xss 配置,nacos自行添加 @Autowired private XssProperties xss; - - @Value("${security.sign}") - private boolean parameter_signature; @Override - public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) - { + public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { ServerHttpRequest request = exchange.getRequest(); // xss开关未开启 或 通过nacos关闭,不过滤 - if (!xss.getEnabled()) - { + if (!xss.getEnabled()) { return chain.filter(exchange); } // GET DELETE 不过滤 HttpMethod method = request.getMethod(); - if (method == null || method == HttpMethod.GET || method == HttpMethod.DELETE) - { + if (method == null || method == HttpMethod.GET || method == HttpMethod.DELETE) { return chain.filter(exchange); } // 非json类型,不过滤 - if (!isJsonRequest(exchange)) - { + if (!isJsonRequest(exchange)) { return chain.filter(exchange); } // excludeUrls 不过滤 String url = request.getURI().getPath(); - if (StringUtils.matches(url, xss.getExcludeUrls())) - { + if (StringUtils.matches(url, xss.getExcludeUrls())) { return chain.filter(exchange); } ServerHttpRequestDecorator httpRequestDecorator = requestDecorator(exchange); - if(parameter_signature && !authSign(httpRequestDecorator)){ - log.error("[鉴权签名异常处理]请求路径:{}", exchange.getRequest().getPath()); - return ServletUtils.webFluxResponseWriter(exchange.getResponse(), "签名校验失败", HttpStatus.BAD_REQUEST); - } return chain.filter(exchange.mutate().request(httpRequestDecorator).build()); - } - private ServerHttpRequestDecorator requestDecorator(ServerWebExchange exchange) - { - ServerHttpRequestDecorator serverHttpRequestDecorator = new ServerHttpRequestDecorator(exchange.getRequest()) - { + + + + + + private ServerHttpRequestDecorator requestDecorator(ServerWebExchange exchange) { + ServerHttpRequestDecorator serverHttpRequestDecorator = new ServerHttpRequestDecorator(exchange.getRequest()) { @Override - public Flux<DataBuffer> getBody() - { + public Flux<DataBuffer> getBody() { Flux<DataBuffer> body = super.getBody(); return body.buffer().map(dataBuffers -> { DataBufferFactory dataBufferFactory = new DefaultDataBufferFactory(); @@ -116,8 +105,7 @@ } @Override - public HttpHeaders getHeaders() - { + public HttpHeaders getHeaders() { HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.putAll(super.getHeaders()); // 由于修改了请求体的body,导致content-length长度不确定,因此需要删除原先的content-length @@ -135,104 +123,10 @@ * * @param exchange HTTP请求 */ - public boolean isJsonRequest(ServerWebExchange exchange) - { + public boolean isJsonRequest(ServerWebExchange exchange) { String header = exchange.getRequest().getHeaders().getFirst(HttpHeaders.CONTENT_TYPE); return StringUtils.startsWithIgnoreCase(header, MediaType.APPLICATION_JSON_VALUE); } - - - /** - * 签名校验 - * @param httpRequestDecorator - * @return - */ - private boolean authSign(ServerHttpRequestDecorator httpRequestDecorator) { - HttpHeaders headers = httpRequestDecorator.getHeaders(); - AtomicReference<JSONObject> jsonObject = new AtomicReference<>(new JSONObject()); - httpRequestDecorator.getBody().buffer().map(dataBuffers -> { - DataBufferFactory dataBufferFactory = new DefaultDataBufferFactory(); - DataBuffer join = dataBufferFactory.join(dataBuffers); - byte[] content = new byte[join.readableByteCount()]; - join.read(content); - DataBufferUtils.release(join); - String bodyStr = new String(content, StandardCharsets.UTF_8); - jsonObject.set(JSON.parseObject(bodyStr)); - - // 防xss攻击过滤 - bodyStr = EscapeUtil.clean(bodyStr); - // 转成字节 - byte[] bytes = bodyStr.getBytes(); - NettyDataBufferFactory nettyDataBufferFactory = new NettyDataBufferFactory(ByteBufAllocator.DEFAULT); - DataBuffer buffer = nettyDataBufferFactory.allocateBuffer(bytes.length); - buffer.write(bytes); - return buffer; - }); - JSONObject params = jsonObject.get(); - String sign = headers.getFirst(TokenConstants.SING); - if(StringUtils.isEmpty(sign)){ - return false; - } - String nonce_str = headers.getFirst(TokenConstants.NONCE_STR); - if(StringUtils.isEmpty(nonce_str)){ - return false; - } - - String signUrlEncode = localSignUrl(params, nonce_str); - signUrlEncode = signUrlEncode.replaceAll("& #40;", "\\(") - .replaceAll("& #41;", "\\)") - .replaceAll("\\+", " "); - if(sign.equals(signUrlEncode)){ - return true; - } - return false; - } - - - /** - * 组装签名路径 - * @param params - * @return - */ - public static String localSignUrl(JSONObject params, String key) { - List<String> keySet = new ArrayList<>(params.keySet()); - // 对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序) - Collections.sort(keySet, new Comparator<String>() { - @Override - public int compare(String o1, String o2) { - return o1.compareTo(o2); - } - }); - // 构造签名键值对的格式 - StringBuilder sb = new StringBuilder(); - for (String k : keySet) { - String v = params.getString(k); - if(StringUtils.isNotEmpty(v)){ - sb.append(k + "=" + v + "&"); - } - } - String signUrl = sb.substring(0, sb.length() - 1); - return signUrlEncode(signUrl, key); - } - - - /** - * 签名字符串加密 - * @param signUrl - * @param encryptKey - * @return - */ - public static String signUrlEncode(String signUrl, String encryptKey) { - byte[] signByte = new byte[0]; - try { - signByte = HMACSHA1.HmacSHA1Encrypt(signUrl, encryptKey); - } catch (Exception e) { - throw new RuntimeException(e); - } - String localSign = Base64.encodeBase64String(signByte); - return localSign; - } - @Override public int getOrder() diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java index 28d1593..dac579f 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java @@ -356,7 +356,7 @@ } @PostMapping("/updateSysUser") - @Transactional(propagation = Propagation.REQUIRES_NEW) + @Transactional(rollbackFor = Exception.class) public R<Boolean> updateSysUser(@RequestBody SysUser sysUser) { try { sysUser.setUpdateBy(SecurityUtils.getUsername()); @@ -675,19 +675,6 @@ .last("LIMIT 1")); return R.ok(user); } - - /** - * 根据账号获取用户数据 - * @param account - * @return - */ - @PostMapping("/queryUserByAccount") - public R<SysUser> queryUserByAccount(@RequestBody String account){ - SysUser user = userService.getOne(Wrappers.lambdaQuery(SysUser.class) - .eq(SysUser::getAccount, account) - .eq(SysUser::getDelFlag, "0")); - return R.ok(user); - } /** @@ -711,7 +698,7 @@ */ @ResponseBody @PostMapping("/addSysUser") - @Transactional(propagation = Propagation.REQUIRES_NEW) + @Transactional(rollbackFor = Exception.class) public R addSysUser(@RequestBody SysUser user){ user.setUserName(user.getPhonenumber()); if(!org.springframework.util.StringUtils.hasLength(user.getNickName())){ @@ -720,7 +707,7 @@ if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) { throw new RuntimeException("手机号已开通账号"); } - if (StringUtils.isNotEmpty(user.getAccount()) && !userService.checkAccountUnique(user)) { + if (StringUtils.isNotEmpty(user.getUserName()) && !userService.checkUserNameUnique(user)) { throw new RuntimeException("登录账号已存在"); } user.setCreateBy(SecurityUtils.getUsername()); diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java index 17dedc0..9d9cc62 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java @@ -121,13 +121,6 @@ */ public SysUser checkPhoneUnique(String phonenumber); - /** - * 校验登录账号是否唯一 - * @param account 登录账号 - * @return - */ - SysUser checkAccountUnique(String account); - /** diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java index d4f7f95..3f08d28 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java @@ -85,8 +85,6 @@ * @return 结果 */ public boolean checkPhoneUnique(SysUser user); - - boolean checkAccountUnique(SysUser user); /** * 校验email是否唯一 diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java index 5bf158f..50b929f 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java @@ -198,16 +198,6 @@ } - @Override - public boolean checkAccountUnique(SysUser user) { - SysUser info = userMapper.checkAccountUnique(user.getAccount()); - if (StringUtils.isNotNull(info) ) - { - return UserConstants.NOT_UNIQUE; - } - return UserConstants.UNIQUE; - } - /** * 校验email是否唯一 * diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml index 78f62da..e7df625 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml @@ -13,7 +13,6 @@ <result property="phonenumber" column="phonenumber" /> <result property="sex" column="sex" /> <result property="avatar" column="avatar" /> - <result property="account" column="account" /> <result property="password" column="password" /> <result property="status" column="status" /> <result property="delFlag" column="del_flag" /> @@ -119,11 +118,6 @@ <select id="checkPhoneUnique" parameterType="String" resultMap="SysUserResult"> select user_id, phonenumber from sys_user where phonenumber = #{phonenumber} and del_flag = '0' limit 1 - </select> - - - <select id="checkAccountUnique" resultMap="SysUserResult"> - select user_id, account from sys_user where account = #{account} and del_flag = '0' limit 1 </select> <select id="checkEmailUnique" parameterType="String" resultMap="SysUserResult"> diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/PartnerController.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/PartnerController.java index 5139fdd..159f1f6 100644 --- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/PartnerController.java +++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/PartnerController.java @@ -2,13 +2,18 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; +import com.ruoyi.chargingPile.api.dto.GetPermissionConfigurationDTO; import com.ruoyi.chargingPile.api.dto.PartnerListDTO; import com.ruoyi.chargingPile.api.model.Partner; import com.ruoyi.chargingPile.api.query.GetPartnerList; +import com.ruoyi.chargingPile.api.query.SetPermissionConfiguration; import com.ruoyi.chargingPile.dto.ResetPassword; import com.ruoyi.chargingPile.service.IPartnerService; 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.system.api.domain.SysUser; +import com.ruoyi.system.api.feignClient.SysUserClient; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; @@ -27,6 +32,10 @@ @Resource private IPartnerService partnerService; + + @Resource + private SysUserClient sysUserClient; + @@ -91,10 +100,38 @@ @ResponseBody - @PostMapping("/getPartner") + @GetMapping("/getPartner") @ApiOperation(value = "获取所有合作商", tags = {"管理后台-站点管理"}) public AjaxResult<List<Partner>> getPartner(){ - List<Partner> list = partnerService.list(new LambdaQueryWrapper<Partner>().eq(Partner::getDelFlag, 0)); + SysUser sysUser = sysUserClient.getSysUser(SecurityUtils.getUserId()).getData(); + Integer roleType = sysUser.getRoleType(); + Integer objectId = sysUser.getObjectId(); + LambdaQueryWrapper<Partner> wrapper = new LambdaQueryWrapper<Partner>().eq(Partner::getDelFlag, 0); + if(2 == roleType){ + wrapper.eq(Partner::getId, objectId); + } + List<Partner> list = partnerService.list(wrapper); return AjaxResult.success(list); } + + + + @ResponseBody + @GetMapping("/getPermissionConfiguration/{siteId}") + @ApiOperation(value = "获取合作商权限设置", tags = {"管理后台-站点管理"}) + public AjaxResult<GetPermissionConfigurationDTO> getPermissionConfiguration(@PathVariable("siteId") Integer siteId, @RequestParam("partnerId") Integer partnerId){ + GetPermissionConfigurationDTO permissionConfiguration = partnerService.getPermissionConfiguration(siteId, partnerId); + return AjaxResult.success(permissionConfiguration); + } + + + @ResponseBody + @PostMapping("/setPermissionConfiguration/{siteId}") + @ApiOperation(value = "设置合作商权限", tags = {"管理后台-站点管理"}) + public AjaxResult setPermissionConfiguration(@RequestBody SetPermissionConfiguration req){ + partnerService.setPermissionConfiguration(req); + return AjaxResult.success(); + } + + } diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/SiteController.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/SiteController.java index a6334e3..d740784 100644 --- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/SiteController.java +++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/SiteController.java @@ -6,9 +6,14 @@ import com.ruoyi.chargingPile.api.query.GetSiteList; import com.ruoyi.chargingPile.api.query.SiteQuery; import com.ruoyi.chargingPile.api.vo.SiteVO; +import com.ruoyi.chargingPile.domain.SiteMenu; +import com.ruoyi.chargingPile.service.IPartnerService; import com.ruoyi.chargingPile.service.ISiteService; 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.system.api.domain.SysUser; +import com.ruoyi.system.api.feignClient.SysUserClient; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; @@ -28,6 +33,17 @@ @Resource private ISiteService siteService; + + @Resource + private IPartnerService partnerService; + + @Resource + private SysUserClient sysUserClient; + + + + + @ResponseBody @@ -87,8 +103,16 @@ @GetMapping("/getAllSiteList") @ApiOperation(value = "获取所有站点数据", tags = {"管理后台-充电桩信息"}) public AjaxResult<List<Site>> getAllSiteList(){ - List<Site> list = siteService.list(new LambdaQueryWrapper<Site>().eq(Site::getDelFlag, 0) - .orderByDesc(Site::getCreateTime)); + //校验当前账户站点权限 + SysUser sysUser = sysUserClient.getSysUser(SecurityUtils.getUserId()).getData(); + Integer roleType = sysUser.getRoleType(); + Integer objectId = sysUser.getObjectId(); + LambdaQueryWrapper<Site> wrapper = new LambdaQueryWrapper<Site>().eq(Site::getDelFlag, 0); + if(2 == roleType){ + List<Integer> list = partnerService.authSite(objectId, SiteMenu.SITE_LIST); + wrapper.in(Site::getId, list); + } + List<Site> list = siteService.list(wrapper.orderByDesc(Site::getCreateTime)); return AjaxResult.success(list); } } diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TChargingPileController.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TChargingPileController.java index 34f88b6..e549840 100644 --- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TChargingPileController.java +++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TChargingPileController.java @@ -54,7 +54,10 @@ */ @ApiOperation(tags = {"小程序-充电桩"},value = "查询充电桩列表") @PostMapping(value = "/list") - public AjaxResult<List<TChargingPile>> list(@RequestParam(name = "siteId",value = "站点id",required = false)Integer siteId) { + @ApiImplicitParams({ + @ApiImplicitParam(name = "siteId", value = "站点id") + }) + public AjaxResult<List<TChargingPile>> list(@RequestParam("siteId") Integer siteId) { return AjaxResult.ok(chargingPileService.list(Wrappers.lambdaQuery(TChargingPile.class) .eq(TChargingPile::getSiteId,siteId))); } diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/domain/SiteMenu.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/domain/SiteMenu.java new file mode 100644 index 0000000..dfe5f0f --- /dev/null +++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/domain/SiteMenu.java @@ -0,0 +1,72 @@ +package com.ruoyi.chargingPile.domain; + + +/** + * @author zhibing.pu + * @Date 2024/8/9 15:28 + */ +public enum SiteMenu { + //站点管理 + SITE_LIST("/data/site"), + //站点计费策略 + SITE_ACCOUNTING_STRATEGY("/data/site/accounting_strategy"), + //站点编辑 + SITE_UPDATE("/data/site/update"), + //站点删除 + SITE_DELETE("/data/site/delete"), + //充电桩信息 + CHARGING_PILE("/data/charging_pile"), + //充电桩查看 + CHARGING_PILE_QUERY_INFO("/data/charging_pile/query_info"), + //充电桩编辑 + CHARGING_PILE_UPDATE("/data/charging_pile/update"), + //充电桩删除 + CHARGING_PILE_DELETE("/data/charging_pile/delete"), + //充电桩新增接口 + CHARGING_PILE_ADD_CHARGING_GUN("/data/charging_pile/add_charging_gun"), + //接口信息 + CHARGING_GUN("/data/charging_gun"), + //接口编辑 + CHARGING_GUN_UPDATE("/data/charging_gun/update"), + //接口删除 + CHARGING_GUN_DELETE("/data/charging_gun/delete"), + //接口查看费率 + CHARGING_GUN_VIEW_RATES("/data/charging_gun/view_rates"), + //接口下载二维码 + CHARGING_GUN_DOWNLOAD_QR_CODE("/data/charging_gun/download_qr_code"), + //接口查看详情 + CHARGING_GUN_QUERY_INFO("/data/charging_gun/query_info"), + //接口结束充电 + CHARGING_GUN_END_CHARGE("/data/charging_gun/end_charge"), + //停车场配置 + PARKING_LOT("/data/parking_lot"), + //停车场查看 + PARKING_LOT_QUERY_INFO("/data/parking_lot/query_info"), + //停车场编辑 + PARKING_LOT_UPDATE("/data/parking_lot/update"), + //停车场删除 + PARKING_LOT_DELETE("/data/parking_lot/delete"), + //停车场监控 + PARKING_LOT_MONITOR("/data/parking_lot/monitor"), + //停车场新增车库 + PARKING_LOT_ADD_GARAGE("/data/parking_lot/add_garage"), + //监控管理 + MONITOR("/data/monitor"), + //监控查看 + MONITOR_QUERY_INFO("/data/monitor/query_info"), + ; + private String value; + + + SiteMenu(String value) { + this.value = value; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } +} diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/SiteMapper.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/SiteMapper.java index 7fae91b..2487a6e 100644 --- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/SiteMapper.java +++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/SiteMapper.java @@ -24,7 +24,7 @@ * @param siteList * @return */ - List<GetSiteListDTO> getSiteList(PageInfo<GetSiteListDTO> pageInfo, @Param("item") GetSiteList siteList); + List<GetSiteListDTO> getSiteList(PageInfo<GetSiteListDTO> pageInfo, @Param("item") GetSiteList siteList, @Param("ids") List<Integer> ids); /** * 获取站点分页列表 diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/TChargingGunMapper.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/TChargingGunMapper.java index 79ddcd0..2076f7a 100644 --- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/TChargingGunMapper.java +++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/TChargingGunMapper.java @@ -27,6 +27,6 @@ * @param pageInfo * @return */ - List<TChargingGunVO> pageList(@Param("query") TChargingGunQuery query, @Param("pageInfo")PageInfo<TChargingGunVO> pageInfo); + List<TChargingGunVO> pageList(@Param("query") TChargingGunQuery query, @Param("pageInfo")PageInfo<TChargingGunVO> pageInfo, @Param("siteIds") List<Integer> siteIds); } diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/TChargingPileMapper.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/TChargingPileMapper.java index f254d0a..c4b4151 100644 --- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/TChargingPileMapper.java +++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/TChargingPileMapper.java @@ -27,7 +27,7 @@ * @param page * @return */ - List<PageChargingPileListDTO> pageChargingPileList(PageInfo<PageChargingPileListDTO> pageInfo, @Param("item") PageChargingPileList page); + List<PageChargingPileListDTO> pageChargingPileList(PageInfo<PageChargingPileListDTO> pageInfo, @Param("item") PageChargingPileList page, @Param("siteIds") List<Integer> siteIds); /** diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/IPartnerService.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/IPartnerService.java index 27f1720..ad23cf3 100644 --- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/IPartnerService.java +++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/IPartnerService.java @@ -1,15 +1,20 @@ package com.ruoyi.chargingPile.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.chargingPile.api.dto.GetPermissionConfigurationDTO; import com.ruoyi.chargingPile.api.dto.PartnerListDTO; import com.ruoyi.chargingPile.api.model.Partner; import com.ruoyi.chargingPile.api.query.GetPartnerList; +import com.ruoyi.chargingPile.api.query.SetPermissionConfiguration; +import com.ruoyi.chargingPile.domain.SiteMenu; import com.ruoyi.chargingPile.dto.ResetPassword; import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.core.web.page.PageInfo; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; + +import java.util.List; /** * @author zhibing.pu @@ -59,4 +64,35 @@ * @param resetPassword */ AjaxResult resetPassword(ResetPassword resetPassword); + + + /** + * 获取合作商权限 + * @param siteId + * @return + */ + GetPermissionConfigurationDTO getPermissionConfiguration(Integer siteId, Integer partnerId); + + /** + * 合作商权限配置 + * @param req + */ + void setPermissionConfiguration(SetPermissionConfiguration req); + + + /** + * 获取合作商授权的站点数据 + * @param siteMenu 授权菜单路径枚举类 + * @return + */ + List<Integer> authSite(Integer partnerId, SiteMenu siteMenu); + + + /** + * 判断当前账户是否有权限 + * @param siteId 站点id + * @param siteMenu 菜单路径枚举类 + * @return + */ + boolean authMenu(Integer partnerId, Integer siteId, SiteMenu siteMenu); } diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/PartnerServiceImpl.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/PartnerServiceImpl.java index 4b0e2ca..e89e9e0 100644 --- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/PartnerServiceImpl.java +++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/PartnerServiceImpl.java @@ -2,18 +2,20 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.chargingPile.api.dto.GetPermissionConfigurationDTO; import com.ruoyi.chargingPile.api.dto.PartnerListDTO; -import com.ruoyi.chargingPile.api.model.Partner; -import com.ruoyi.chargingPile.api.model.Site; +import com.ruoyi.chargingPile.api.model.*; import com.ruoyi.chargingPile.api.query.GetPartnerList; +import com.ruoyi.chargingPile.api.query.SetPermissionConfiguration; +import com.ruoyi.chargingPile.domain.SiteMenu; import com.ruoyi.chargingPile.dto.ResetPassword; import com.ruoyi.chargingPile.mapper.PartnerMapper; -import com.ruoyi.chargingPile.service.IPartnerService; -import com.ruoyi.chargingPile.service.ISiteService; +import com.ruoyi.chargingPile.service.*; 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.system.api.domain.SysRole; import com.ruoyi.system.api.domain.SysUser; import com.ruoyi.system.api.feignClient.SysRoleClient; @@ -22,10 +24,10 @@ import io.seata.spring.annotation.GlobalTransactional; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; -import java.util.Arrays; -import java.util.List; +import java.util.*; import java.util.stream.Collectors; /** @@ -43,6 +45,15 @@ @Resource private ISiteService siteService; + + @Resource + private TPartnerSiteService partnerSiteService; + + @Resource + private TSiteMenuService siteMenuService; + + @Resource + private TChargingPileService chargingPileService; @@ -85,7 +96,7 @@ * @return */ @Override - @GlobalTransactional//分布式事务 + @GlobalTransactional(rollbackFor = Exception.class)//分布式事务 public AjaxResult addPartner(Partner partner) { //校验参数和重复数据 AjaxResult ajaxResult = addPartnerParameterCheck(partner); @@ -110,9 +121,8 @@ this.save(partner); //添加登录账户 SysUser user = new SysUser(); - user.setAccount(partner.getAccount()); user.setPhonenumber(partner.getPhoneOne()); - user.setUserName(partner.getName()); + user.setUserName(partner.getAccount()); user.setNickName(partner.getName()); user.setAvatar(partner.getLogoUrl()); user.setPassword(partner.getPassword()); @@ -189,7 +199,7 @@ * @return */ @Override - @GlobalTransactional//分布式事务 + @GlobalTransactional(rollbackFor = Exception.class)//分布式事务 public AjaxResult editPartner(Partner partner) { //校验参数和重复数据 AjaxResult ajaxResult = addPartnerParameterCheck(partner); @@ -211,7 +221,7 @@ return AjaxResult.error("登录账号不能重复"); } Partner oldPartner = this.getById(partner.getId()); - SysUser user = sysUserClient.queryUserByAccount(oldPartner.getAccount()).getData(); + SysUser user = sysUserClient.queryUserByUserName(oldPartner.getAccount()).getData(); //修改数据 this.updateById(partner); @@ -220,9 +230,8 @@ user = new SysUser(); user.setStatus("0"); user.setDelFlag("0"); - user.setAccount(partner.getAccount()); user.setPhonenumber(partner.getPhoneOne()); - user.setUserName(partner.getName()); + user.setUserName(partner.getAccount()); user.setNickName(partner.getName()); user.setAvatar(partner.getLogoUrl()); user.setPassword(partner.getPassword()); @@ -234,9 +243,8 @@ throw new RuntimeException(r.getMsg()); } }else{ - user.setAccount(partner.getAccount()); user.setPhonenumber(partner.getPhoneOne()); - user.setUserName(partner.getName()); + user.setUserName(partner.getAccount()); user.setNickName(partner.getName()); user.setAvatar(partner.getLogoUrl()); user.setPassword(partner.getPassword()); @@ -255,16 +263,19 @@ * @param id 合作商id */ @Override - @GlobalTransactional//分布式事务 + @GlobalTransactional(rollbackFor = Exception.class)//分布式事务 public AjaxResult delPartner(Integer id) { //查询有无关联数据 //站点 long count = siteService.count(new LambdaQueryWrapper<Site>().eq(Site::getPartnerId, id).eq(Site::getDelFlag, 0)); if(count > 0){ - return AjaxResult.error("当前合作商有关联得站点,删除失败!"); + return AjaxResult.error("当前合作商有关联站点,删除失败!"); } - // todo 代码完善 //充电桩 + long count1 = chargingPileService.count(new LambdaQueryWrapper<TChargingPile>().eq(TChargingPile::getPartnerId, id).eq(TChargingPile::getDelFlag, 0)); + if(count1 > 0){ + return AjaxResult.error("当前合作商有关联充电桩,删除失败!"); + } Partner partner = this.getById(id); if(null == partner){ @@ -272,7 +283,7 @@ } partner.setDelFlag(true); this.updateById(partner); - SysUser user = sysUserClient.queryUserByAccount(partner.getAccount()).getData(); + SysUser user = sysUserClient.queryUserByUserName(partner.getAccount()).getData(); user.setDelFlag("2"); sysUserClient.updateUser(user); return AjaxResult.success(); @@ -284,7 +295,7 @@ * @param resetPassword */ @Override - @GlobalTransactional//分布式事务 + @GlobalTransactional(rollbackFor = Exception.class)//分布式事务 public AjaxResult resetPassword(ResetPassword resetPassword) { if(null == resetPassword.getId()){ return AjaxResult.error("合作商id不能为空"); @@ -296,9 +307,116 @@ partner.setPassword(resetPassword.getPassword()); this.updateById(partner); //修改登录账号的密码 - SysUser user = sysUserClient.queryUserByAccount(partner.getAccount()).getData(); + SysUser user = sysUserClient.queryUserByUserName(partner.getAccount()).getData(); user.setPassword(partner.getPassword()); sysUserClient.resetPassword(user); return AjaxResult.success(); } + + + /** + * 获取合作商权限 + * @return + */ + @Override + public GetPermissionConfigurationDTO getPermissionConfiguration(Integer siteId, Integer partnerId) { + 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)); + List<Integer> collect = list.stream().map(TPartnerSite::getSiteMenuId).collect(Collectors.toList()); + List<TSiteMenu> tSiteMenus = siteMenuService.list(new LambdaQueryWrapper<TSiteMenu>() + .eq(TSiteMenu::getParentId, 0) + .eq(TSiteMenu::getVisible, 0) + .eq(TSiteMenu::getStatus, 0).orderByAsc(TSiteMenu::getOrderNum)); + for (TSiteMenu tSiteMenu : tSiteMenus) { + menu.put("id", tSiteMenu.getMenuId()); + menu.put("name", tSiteMenu.getMenuName()); + menu.put("path", tSiteMenu.getPath()); + menu.put("type", tSiteMenu.getMenuType()); + + List<TSiteMenu> tSiteMenus1 = siteMenuService.list(new LambdaQueryWrapper<TSiteMenu>() + .eq(TSiteMenu::getParentId, tSiteMenu.getMenuId()) + .eq(TSiteMenu::getVisible, 0) + .eq(TSiteMenu::getStatus, 0).orderByAsc(TSiteMenu::getOrderNum)); + Map<String, Object> child = new HashMap<>(); + for (TSiteMenu siteMenu : tSiteMenus1) { + 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())); + } + menu.put("selected", child.keySet().size() > 0 ? true : false); + menu.put("child", child); + } + dto.setMenu(menu); + return dto; + } + + + /** + * 合作商权限配置 + * @param req + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void setPermissionConfiguration(SetPermissionConfiguration req) { + //删除原始配置 + partnerSiteService.remove(new LambdaQueryWrapper<TPartnerSite>().eq(TPartnerSite::getPartnerId, req.getPartnerId()).eq(TPartnerSite::getSiteId, req.getSiteId())); + //添加新的配置 + List<TPartnerSite> sites = new ArrayList<>(); + List<Integer> list = req.getMenuId(); + for (Integer integer : list) { + TPartnerSite partnerSite = new TPartnerSite(); + partnerSite.setPartnerId(req.getPartnerId()); + partnerSite.setSiteId(req.getSiteId()); + partnerSite.setSiteMenuId(integer); + sites.add(partnerSite); + } + partnerSiteService.saveBatch(sites); + //修改权限配置 + Partner partner = this.getById(req.getPartnerId()); + partner.setPermissionRemarks(req.getPermissionRemarks()); + this.updateById(partner); + } + + + /** + * 获取合作商授权的站点数据 + * @param siteMenu 授权菜单路径枚举类 + * @return + */ + @Override + public List<Integer> authSite(Integer partnerId, SiteMenu siteMenu) { + TSiteMenu one = siteMenuService.getOne(new LambdaQueryWrapper<TSiteMenu>().eq(TSiteMenu::getPath, siteMenu.getValue()).eq(TSiteMenu::getStatus, 0)); + List<TPartnerSite> list = partnerSiteService.list(new LambdaQueryWrapper<TPartnerSite>() + .eq(TPartnerSite::getPartnerId, partnerId) + .eq(TPartnerSite::getSiteMenuId, one.getMenuId())); + List<Integer> collect = list.stream().map(TPartnerSite::getSiteId).collect(Collectors.toList()); + if(collect.size() == 0){ + collect.add(-1); + } + return collect; + } + + + /** + * 判断当前账户是否有权限 + * @param siteId 站点id + * @param siteMenu 菜单路径枚举类 + * @return + */ + @Override + public boolean authMenu(Integer partnerId, Integer siteId, SiteMenu siteMenu) { + TSiteMenu one = siteMenuService.getOne(new LambdaQueryWrapper<TSiteMenu>().eq(TSiteMenu::getPath, siteMenu.getValue()).eq(TSiteMenu::getStatus, 0)); + TPartnerSite partnerSite = partnerSiteService.getOne(new LambdaQueryWrapper<TPartnerSite>() + .eq(TPartnerSite::getPartnerId, partnerId) + .eq(TPartnerSite::getSiteMenuId, one.getMenuId()) + .eq(TPartnerSite::getSiteId, siteId)); + return null == partnerSite ? false : true; + } } diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/SiteServiceImpl.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/SiteServiceImpl.java index 98220eb..a9777ad 100644 --- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/SiteServiceImpl.java +++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/SiteServiceImpl.java @@ -5,16 +5,23 @@ import com.ruoyi.chargingPile.api.dto.GetSiteListDTO; import com.ruoyi.chargingPile.api.model.Site; import com.ruoyi.chargingPile.api.model.TChargingGun; +import com.ruoyi.chargingPile.api.model.TChargingPile; import com.ruoyi.chargingPile.api.query.GetSiteList; import com.ruoyi.chargingPile.api.query.SiteQuery; import com.ruoyi.chargingPile.api.vo.SiteVO; import com.ruoyi.chargingPile.api.vo.TAccountingStrategyVO; +import com.ruoyi.chargingPile.domain.SiteMenu; import com.ruoyi.chargingPile.mapper.SiteMapper; +import com.ruoyi.chargingPile.service.IPartnerService; import com.ruoyi.chargingPile.service.ISiteService; import com.ruoyi.chargingPile.service.TChargingGunService; +import com.ruoyi.chargingPile.service.TChargingPileService; 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.system.api.domain.SysUser; +import com.ruoyi.system.api.feignClient.SysUserClient; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; @@ -32,6 +39,15 @@ @Resource private TChargingGunService chargingGunService; + @Resource + private TChargingPileService chargingPileService; + + @Resource + private SysUserClient sysUserClient; + + @Resource + private IPartnerService partnerService; + /** @@ -41,10 +57,30 @@ */ @Override public PageInfo<GetSiteListDTO> getSiteList(GetSiteList siteList) { + List<Integer> ids = null; + //校验合作商权限 + SysUser sysUser = sysUserClient.getSysUser(SecurityUtils.getUserId()).getData(); + Integer roleType = sysUser.getRoleType(); + Integer objectId = sysUser.getObjectId(); + //合作商 + if(roleType == 2){ + ids = partnerService.authSite(objectId, SiteMenu.SITE_LIST); + } PageInfo<GetSiteListDTO> pageInfo = new PageInfo<>(siteList.getPageCurr(), siteList.getPageSize()); - List<GetSiteListDTO> list = this.baseMapper.getSiteList(pageInfo, siteList); + List<GetSiteListDTO> list = this.baseMapper.getSiteList(pageInfo, siteList, ids); + for (GetSiteListDTO getSiteListDTO : list) { + Integer siteId = getSiteListDTO.getId(); + getSiteListDTO.setAuthAccountingStrategy(roleType == 1 ? true : partnerService.authMenu(objectId, siteId, SiteMenu.SITE_ACCOUNTING_STRATEGY)); + //平台账号才有此权限 + getSiteListDTO.setAuthPartner(roleType == 1 ? true : false); + getSiteListDTO.setAuthUpdate(roleType == 1 ? true : partnerService.authMenu(objectId, siteId, SiteMenu.SITE_UPDATE)); + getSiteListDTO.setAuthDelete(roleType == 1 ? true : partnerService.authMenu(objectId, siteId, SiteMenu.SITE_DELETE)); + } return pageInfo.setRecords(list); } + + + /** * 添加站点信息 @@ -148,7 +184,10 @@ public AjaxResult delSite(Integer id) { //查询是否有关联数据 //充电桩 - // todo 待完善 + long count1 = chargingPileService.count(new LambdaQueryWrapper<TChargingPile>().eq(TChargingPile::getSiteId, id).eq(TChargingPile::getDelFlag, 0)); + if(count1 > 0){ + return AjaxResult.error("该站点有关联充电桩,删除失败!"); + } Site site = this.getById(id); site.setDelFlag(true); this.updateById(site); @@ -170,7 +209,7 @@ * @param accountingStrategyId 计费策略id */ @Override - @Transactional(propagation = Propagation.REQUIRES_NEW) + @Transactional(rollbackFor = Exception.class) public void setAccountingStrategy(Integer id, Integer accountingStrategyId) { Site site = this.getById(id); site.setAccountingStrategyId(accountingStrategyId); diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingGunServiceImpl.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingGunServiceImpl.java index 73709a5..b97602d 100644 --- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingGunServiceImpl.java +++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingGunServiceImpl.java @@ -7,13 +7,19 @@ import com.ruoyi.chargingPile.api.query.TChargingGunQuery; import com.ruoyi.chargingPile.api.vo.TChargingGunVO; import com.ruoyi.chargingPile.api.vo.TMonitoringEquipmentVO; +import com.ruoyi.chargingPile.domain.SiteMenu; import com.ruoyi.chargingPile.mapper.TChargingGunMapper; +import com.ruoyi.chargingPile.service.IPartnerService; import com.ruoyi.chargingPile.service.TChargingGunService; 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.system.api.domain.SysUser; +import com.ruoyi.system.api.feignClient.SysUserClient; import org.springframework.stereotype.Service; +import javax.annotation.Resource; import java.util.List; /** @@ -26,11 +32,38 @@ */ @Service public class TChargingGunServiceImpl extends ServiceImpl<TChargingGunMapper, TChargingGun> implements TChargingGunService { + + @Resource + private SysUserClient sysUserClient; + + @Resource + private IPartnerService partnerService; + + + @Override public PageInfo<TChargingGunVO> pageList(TChargingGunQuery query) { + List<Integer> siteIds = null; + //校验合作商权限 + SysUser sysUser = sysUserClient.getSysUser(SecurityUtils.getUserId()).getData(); + Integer roleType = sysUser.getRoleType(); + Integer objectId = sysUser.getObjectId(); + //合作商 + if(roleType == 2){ + siteIds = partnerService.authSite(objectId, SiteMenu.CHARGING_GUN); + } PageInfo<TChargingGunVO> pageInfo = new PageInfo<>(query.getPageCurr(),query.getPageSize()); - List<TChargingGunVO> list = this.baseMapper.pageList(query,pageInfo); + List<TChargingGunVO> list = this.baseMapper.pageList(query,pageInfo, siteIds); + for (TChargingGunVO tChargingGunVO : list) { + Integer siteId = tChargingGunVO.getSiteId(); + tChargingGunVO.setAuthDelete(roleType == 1 ? true : partnerService.authMenu(objectId, siteId, SiteMenu.CHARGING_GUN_DELETE)); + tChargingGunVO.setAuthDownloadQRCode(roleType == 1 ? true : partnerService.authMenu(objectId, siteId, SiteMenu.CHARGING_GUN_DOWNLOAD_QR_CODE)); + tChargingGunVO.setAuthEndCharge(roleType == 1 ? true : partnerService.authMenu(objectId, siteId, SiteMenu.CHARGING_GUN_END_CHARGE)); + tChargingGunVO.setAuthQueryInfo(roleType == 1 ? true : partnerService.authMenu(objectId, siteId, SiteMenu.CHARGING_GUN_QUERY_INFO)); + tChargingGunVO.setAuthUpdate(roleType == 1 ? true : partnerService.authMenu(objectId, siteId, SiteMenu.CHARGING_GUN_UPDATE)); + tChargingGunVO.setAuthViewRates(roleType == 1 ? true : partnerService.authMenu(objectId, siteId, SiteMenu.CHARGING_GUN_VIEW_RATES)); + } pageInfo.setRecords(list); return pageInfo; } diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java index 0442587..055590a 100644 --- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java +++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java @@ -7,12 +7,17 @@ import com.ruoyi.chargingPile.api.model.TChargingPile; import com.ruoyi.chargingPile.api.query.BatchSetAccountingStrategy; import com.ruoyi.chargingPile.api.query.PageChargingPileList; +import com.ruoyi.chargingPile.domain.SiteMenu; import com.ruoyi.chargingPile.mapper.TChargingPileMapper; +import com.ruoyi.chargingPile.service.IPartnerService; import com.ruoyi.chargingPile.service.TChargingGunService; import com.ruoyi.chargingPile.service.TChargingPileService; 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.system.api.domain.SysUser; +import com.ruoyi.system.api.feignClient.SysUserClient; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -33,6 +38,12 @@ @Resource private TChargingGunService chargingGunService; + @Resource + private SysUserClient sysUserClient; + + @Resource + private IPartnerService partnerService; + @@ -43,8 +54,24 @@ */ @Override public PageInfo<PageChargingPileListDTO> pageChargingPileList(PageChargingPileList page) { + List<Integer> siteIds = null; + //校验合作商权限 + SysUser sysUser = sysUserClient.getSysUser(SecurityUtils.getUserId()).getData(); + Integer roleType = sysUser.getRoleType(); + Integer objectId = sysUser.getObjectId(); + //合作商 + if(roleType == 2){ + siteIds = partnerService.authSite(objectId, SiteMenu.CHARGING_PILE); + } PageInfo<PageChargingPileListDTO> pageInfo = new PageInfo<>(page.getPageCurr(), page.getPageSize()); - List<PageChargingPileListDTO> list = this.baseMapper.pageChargingPileList(pageInfo, page); + List<PageChargingPileListDTO> list = this.baseMapper.pageChargingPileList(pageInfo, page, siteIds); + for (PageChargingPileListDTO pageChargingPileListDTO : list) { + Integer siteId = pageChargingPileListDTO.getSiteId(); + pageChargingPileListDTO.setAuthAddChargingGun(roleType == 1 ? true : partnerService.authMenu(objectId, siteId, SiteMenu.CHARGING_PILE_ADD_CHARGING_GUN)); + pageChargingPileListDTO.setAuthDelete(roleType == 1 ? true : partnerService.authMenu(objectId, siteId, SiteMenu.CHARGING_PILE_DELETE)); + pageChargingPileListDTO.setAuthQueryInfo(roleType == 1 ? true : partnerService.authMenu(objectId, siteId, SiteMenu.CHARGING_PILE_QUERY_INFO)); + pageChargingPileListDTO.setAuthUpdate(roleType == 1 ? true : partnerService.authMenu(objectId, siteId, SiteMenu.CHARGING_PILE_UPDATE)); + } return pageInfo.setRecords(list); } diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/PartnerMapper.xml b/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/PartnerMapper.xml index ae39a6f..4efbd05 100644 --- a/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/PartnerMapper.xml +++ b/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/PartnerMapper.xml @@ -16,6 +16,7 @@ <result column="remark" property="remark" /> <result column="account" property="account" /> <result column="password" property="password" /> + <result column="permission_remarks" property="permissionRemarks"/> <result column="create_time" property="createTime" /> <result column="del_flag" property="delFlag" /> </resultMap> diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/SiteMapper.xml b/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/SiteMapper.xml index ba0802e..b7b4557 100644 --- a/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/SiteMapper.xml +++ b/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/SiteMapper.xml @@ -94,6 +94,12 @@ <if test="null != item.districtsCode and '' != item.districtsCode"> and a.districts_code = #{item.districtsCode} </if> + <if test="null != ids"> + and a.id in + <foreach collection="ids" item="itemm" index="index" open="(" separator="," close=")"> + #{itemm} + </foreach> + </if> order by a.sort desc, a.create_time desc limit #{item.pageCurr}, #{item.pageSize} </select> diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TChargingGunMapper.xml b/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TChargingGunMapper.xml index fac952c..f7c9430 100644 --- a/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TChargingGunMapper.xml +++ b/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TChargingGunMapper.xml @@ -57,6 +57,12 @@ <if test="query.chargeMode != null"> AND tas.chargeMode = #{query.chargeMode} </if> + <if test="null != siteIds"> + and tcg.site_id in + <foreach collection="siteIds" index="index" item="item" open="(" separator="," close=")"> + #{item} + </foreach> + </if> AND tas.del_flag = ${@com.ruoyi.common.core.enums.DelFlagEnum@NO.getCode()} </where> ORDER BY tas.create_time DESC diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TChargingPileMapper.xml b/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TChargingPileMapper.xml index d09f3e1..6171d5f 100644 --- a/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TChargingPileMapper.xml +++ b/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TChargingPileMapper.xml @@ -56,6 +56,12 @@ <if test="null != item.type"> and a.type = #{item.type} </if> + <if test="null != siteIds"> + and a.site_id in + <foreach collection="siteIds" item="itemm" index="index" open="(" separator="," close=")"> + #{itemm} + </foreach> + </if> order by a.create_time desc limit #{item.pageCurr}, #{item.pageSize} </select> -- Gitblit v1.7.1