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