权限处理

This commit is contained in:
andy 2025-04-16 14:11:18 +08:00
parent 94d499ab28
commit aed3cdf4a9
47 changed files with 1072 additions and 354 deletions

View File

@ -0,0 +1,26 @@
package com.evotech.hd.authorization.service;
import com.evotech.hd.common.core.Dto.BaseResponse;
import com.evotech.hd.common.core.entity.cloud.BatteryStation;
import com.evotech.hd.common.core.entity.cloud.Company;
import com.evotech.hd.common.core.entity.cloud.VehicleInfo;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
@FeignClient(value = "cloud-server", path = "/cloud")
public interface CloudService {
@GetMapping(value = "/batterystation/login/list", consumes = {MediaType.APPLICATION_JSON_UTF8_VALUE})
public BaseResponse<List<BatteryStation>> loadBatteryStation(@RequestParam("proxyCode") String proxyCode);
@GetMapping(value = "/company/login/one", consumes = {MediaType.APPLICATION_JSON_UTF8_VALUE})
public BaseResponse<Company> loadCompany(@RequestParam("code") String code);
@GetMapping(value = "/vehicle/login/list", consumes = {MediaType.APPLICATION_JSON_UTF8_VALUE})
public BaseResponse<List<VehicleInfo>> loadVehicleInfo(@RequestParam("companyCode") String companyCode);
}

View File

@ -1,28 +1,27 @@
package com.evotech.hd.authorization.service.impl;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.apache.http.auth.AuthenticationException;
import org.springframework.beans.BeanUtils;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import cn.hutool.http.useragent.UserAgent;
import cn.hutool.http.useragent.UserAgentUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.alibaba.nacos.common.utils.CollectionUtils;
import com.evotech.hd.authorization.config.oauth2.MyAccessToken;
import com.evotech.hd.authorization.entity.LoginRequest;
import com.evotech.hd.authorization.entity.UserVo;
import com.evotech.hd.authorization.service.ResourceService;
import com.evotech.hd.authorization.service.CaptchaService;
import com.evotech.hd.authorization.service.CloudService;
import com.evotech.hd.authorization.service.LoginService;
import com.evotech.hd.authorization.service.ResourceService;
import com.evotech.hd.authorization.utils.LoginRequesHeadertUtil;
import com.evotech.hd.authorization.utils.Oauth2AccessTokenUtil;
import com.evotech.hd.authorization.utils.TokenUtil;
import com.evotech.hd.common.core.Dto.BaseResponse;
import com.evotech.hd.common.core.constant.HDConstant;
import com.evotech.hd.common.core.entity.LoginCacheInfo;
import com.evotech.hd.common.core.entity.Result;
import com.evotech.hd.common.core.entity.cloud.BatteryStation;
import com.evotech.hd.common.core.entity.cloud.Company;
import com.evotech.hd.common.core.entity.cloud.VehicleInfo;
import com.evotech.hd.common.core.entity.resource.LogLogin;
import com.evotech.hd.common.core.entity.resource.auth.AuthPermission;
import com.evotech.hd.common.core.entity.resource.auth.AuthRole;
@ -30,12 +29,19 @@ import com.evotech.hd.common.core.entity.resource.auth.AuthUser;
import com.evotech.hd.common.core.enums.CodeMsg;
import com.evotech.hd.common.redis.utils.RedisUtil;
import com.evotech.hd.common.web.util.IpUtil;
import cn.hutool.http.useragent.UserAgent;
import cn.hutool.http.useragent.UserAgentUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import org.apache.http.auth.AuthenticationException;
import org.springframework.beans.BeanUtils;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Service
public class LoginServiceImpl implements LoginService {
@ -48,6 +54,8 @@ public class LoginServiceImpl implements LoginService {
@Resource
private ResourceService resourceService;
@Resource
private CloudService cloudService;
@Resource
private RedisUtil redisUtil;
@Resource
private Environment env;
@ -109,7 +117,7 @@ public class LoginServiceImpl implements LoginService {
loginLog.setLoginTime(d);
loginLog.setCtime(d);
loginLog.setRequestIp(IpUtil.getRemoteIP(request));
String uaStr = request.getHeader("User-Agent");
String uaStr = request.getHeader("User-Agent");
UserAgent ua = UserAgentUtil.parse(uaStr);
loginLog.setUa(uaStr);
loginLog.setBrowser(ua.getBrowser().toString());
@ -164,7 +172,43 @@ public class LoginServiceImpl implements LoginService {
uv.setPermCodeList(permCodeList);
redisUtil.lSet(HDConstant.LOGIN_CACHE_KEY_PREFIX + jti + ":perms", permUriList.toArray(new String[permUriList.size()]), tokenExp);
}
if(rcodeList.contains(HDConstant.OPERATOR_ROLE_CODE)){
BaseResponse<List<BatteryStation>> result = cloudService.loadBatteryStation(user.getBusinessCode());
if(CodeMsg.SUCCESS.getCode().equals(result.getCode())){
List<BatteryStation> list = result.getData();
String pkIds = "-1";
String codes = "-1";
if(CollectionUtils.isNotEmpty(list)){
pkIds = list.stream().map(BatteryStation::getPkId).map(String::valueOf).filter(com.alibaba.nacos.common.utils.StringUtils::isNotEmpty).collect(Collectors.joining(","));
codes = list.stream().map(BatteryStation::getCode).filter(com.alibaba.nacos.common.utils.StringUtils::isNotEmpty).collect(Collectors.joining(","));
}
redisUtil.set(HDConstant.LOGIN_CACHE_KEY_PREFIX + HDConstant.PermissionConstant.PERMISSION_STATION_ID+":"+user.getPkId(), pkIds);
redisUtil.set(HDConstant.LOGIN_CACHE_KEY_PREFIX + HDConstant.PermissionConstant.PERMISSION_STATION_CODE+":"+user.getPkId(), codes);
}
}
if(rcodeList.contains(HDConstant.COMPANY_ROLE_CODE)){
BaseResponse<Company> companyResult = cloudService.loadCompany(user.getBusinessCode());
String companyId="-1", companyCode="-1", carIds="-1", carPlateNums="-1";
if(CodeMsg.SUCCESS.getCode().equals(companyResult.getCode())){
Company company = companyResult.getData();
if(!ObjectUtils.isEmpty(company)){
companyId = String.valueOf(company.getPkId());
companyCode = company.getCcode();
BaseResponse<List<VehicleInfo>> vehicleInfoResult = cloudService.loadVehicleInfo(company.getCcode());
if(CodeMsg.SUCCESS.getCode().equals(vehicleInfoResult.getCode())){
List<VehicleInfo> list = vehicleInfoResult.getData();
if(CollectionUtils.isNotEmpty(list)){
carIds = list.stream().map(VehicleInfo::getPkId).map(String::valueOf).filter(com.alibaba.nacos.common.utils.StringUtils::isNotEmpty).collect(Collectors.joining(","));
carPlateNums = list.stream().map(VehicleInfo::getPlateNum).filter(com.alibaba.nacos.common.utils.StringUtils::isNotEmpty).collect(Collectors.joining(","));
}
}
}
}
redisUtil.set(HDConstant.LOGIN_CACHE_KEY_PREFIX + HDConstant.PermissionConstant.PERMISSION_COMPANY_ID+":"+user.getPkId(), companyId);
redisUtil.set(HDConstant.LOGIN_CACHE_KEY_PREFIX + HDConstant.PermissionConstant.PERMISSION_COMPANY_CODE+":"+user.getPkId(), companyCode);
redisUtil.set(HDConstant.LOGIN_CACHE_KEY_PREFIX + HDConstant.PermissionConstant.PERMISSION_CAR_ID+":"+user.getPkId(), carIds);
redisUtil.set(HDConstant.LOGIN_CACHE_KEY_PREFIX + HDConstant.PermissionConstant.PERMISSION_CAR_CODE+":"+user.getPkId(), carPlateNums);
}
return uv;
}

View File

@ -14,12 +14,15 @@ spring:
name: oauth2-server
config:
import:
- nacos:yt-common.properties?refreshEnabled=true
- nacos:${spring.application.name}.yaml?refreshEnabled=true
cloud:
nacos:
serverAddr: 192.168.5.213:8848
username: nacos
password: nacos
config:
namespace: ${nacos.namespace:public}
discovery:
namespace: ${nacos.namespace:public}
register-enabled: true

View File

@ -0,0 +1,41 @@
package com.evotech.hd.common.core.Dto;
import com.evotech.hd.common.core.enums.CodeMsg;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
/**
* 请求返回对象
* @ClassName:BaseResponse
* @date: 2025年04月15日 16:37
* @author: andy.shi
* @contact: 17330188597
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
@Data
public class BaseResponse<T> implements Serializable {
@Schema(description = "请求处理状态", example = "1")
private Integer status;
@Schema(description = "状态码", example = "1000")
private String code;
@Schema(description = "返回消息")
private String msg;
@Schema(description = "返回数据")
private T data;
public BaseResponse() {
}
public BaseResponse<T> success(T o) {
this.status = 1;
this.code = CodeMsg.SUCCESS.getCode();
this.msg = CodeMsg.SUCCESS.getMsg();
this.data = o;
return this;
}
}

View File

@ -1,13 +1,33 @@
package com.evotech.hd.common.core.constant;
public interface HDConstant {
public static final class PermissionConstant{
public static final String PERMISSION_STATION_CODE = "STATION_CODE";
public static final String PERMISSION_STATION_ID = "STATION_ID";
public static final String PERMISSION_COMPANY_CODE = "COMPANY_CODE";
public static final String PERMISSION_COMPANY_ID = "COMPANY_ID";
public static final String PERMISSION_CAR_CODE = "CAR_CODE";
public static final String PERMISSION_CAR_ID = "CAR_ID";
}
String DEFAULT_MENU_TYPE= "default_menu";
/**
* 系统管理员角色
*/
String SYSTEM_MANAGER_ROLE_CODE = "SYSADMIN";
/**
/**
* 运营商角色
*/
String OPERATOR_ROLE_CODE = "PROXY";
/**
* 公司角色
*/
String COMPANY_ROLE_CODE = "COMPANY";
/**
* 认证请求头key
*/
String AUTHORIZATION_KEY = "Authorization";

View File

@ -1,12 +1,19 @@
package com.evotech.hd.common.core.dao.cloud;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.evotech.hd.common.core.constant.HDConstant;
import com.evotech.hd.common.core.entity.cloud.OrderSwapBattery;
import com.evotech.hd.common.core.permission.DataScope;
import com.evotech.hd.common.core.permission.DataScopes;
/**
* @author zrb
* @since 2024-11-22
*/
@DataScopes({
@DataScope(permissionObject = HDConstant.OPERATOR_ROLE_CODE, permissionScopeName = "station_code", permissionScopeRedisKey = HDConstant.PermissionConstant.PERMISSION_STATION_CODE),
@DataScope(permissionObject = HDConstant.COMPANY_ROLE_CODE, permissionScopeName = "plate_num", permissionScopeRedisKey = HDConstant.PermissionConstant.PERMISSION_CAR_CODE),
})
public interface OrderSwapBatteryDao extends BaseMapper<OrderSwapBattery> {
}

View File

@ -4,6 +4,7 @@ import com.evotech.hd.common.core.entity.BasePageRequest;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.format.annotation.DateTimeFormat;
@Data
@ -19,9 +20,11 @@ public class PageListSwapOrderPreRequest extends BasePageRequest {
private String plateNum;
@Schema(description = "预约换电日期开始", example = "yyyyMMdd")
@DateTimeFormat(pattern = "yyyyMMdd")
private String swapDayBegin;
@Schema(description = "预约换电日期结束")
@DateTimeFormat(pattern = "yyyyMMdd")
private String swapDayEnd;
@Schema(description = "换电站编码")

View File

@ -5,17 +5,15 @@ import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.io.Serializable;
import java.util.Date;
import org.springframework.format.annotation.DateTimeFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.media.Schema.RequiredMode;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.util.Date;
/**
* @author zrb
@ -42,6 +40,9 @@ public class AuthUser implements Serializable {
@Schema(description = "账号类型1-开发者2-运营方3-客户", requiredMode = RequiredMode.REQUIRED)
private Integer type;
@Schema(description = "业务code, 即公司类型,为公司统一社会信息代码, 运营商类型为运营商统一社会信用代码", hidden = true)
private String businessCode;
@Schema(description = "关联方代码")
private String typeRelateCode;
@ -111,4 +112,5 @@ public class AuthUser implements Serializable {
@Schema(description = "角色编码", hidden = true)
@TableField(exist = false)
private String rcodes;
}

View File

@ -0,0 +1,40 @@
package com.evotech.hd.common.core.permission;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface DataScope {
/***
* 是否生效
*/
boolean enabled() default true;
/***
* 表别名
*/
String tableAlias() default "";
/***
* 权限对象
* 具体参考
* HDConstant.OPERATOR_ROLE_CODE
* HDConstant.COMPANY_ROLE_CODE
*/
String permissionObject();
/***
* 运营商权限限制的字段
*/
String permissionScopeName();
/***
* 运营商权限限制的字段
* HDConstant.PermissionConstant中 的字段信息
*/
String permissionScopeRedisKey();
}

View File

@ -0,0 +1,20 @@
package com.evotech.hd.common.core.permission;
import org.springframework.stereotype.Component;
import java.lang.annotation.*;
/**
* 主要用来处理一个方法中, 有多个数据表的文图
* @DataScopes({
* @DataScope(tableAlias = 123,companyScopeName = "",operatorScopeName=""),
* @DataScope(tableAlias = 456,companyScopeName = "",operatorScopeName=""),})
*/
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface DataScopes {
DataScope[] value();
}

View File

@ -0,0 +1,24 @@
package com.evotech.hd.common.core.permission;
/**
* @desc: 枚举
* @ClassName:PermissionScopeEnum
* @date: 2025年04月15日 8:30
* @author: andy.shi
* @contact: 17330188597
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
public enum PermissionScopeEnum {
DEFAULT_NULL_TYPE(""),
INTEGER_TYPE("Integer"),
STRING_TYPE("String"),
COMPANY_LIMIT_CAR_TYPE("car"),
COMPANY_LIMIT_COMPANY_TYPE("company"),
;
String type;
PermissionScopeEnum(String type) {}
}

View File

@ -82,8 +82,16 @@
<groupId>cn.hutool</groupId>
<artifactId>hutool-crypto</artifactId>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-jwt</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-oauth2-jose</artifactId>
</dependency>
</dependencies>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>

View File

@ -0,0 +1,31 @@
package com.evotech.hd.cloud.config;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.DataPermissionInterceptor;
import com.evotech.hd.cloud.handler.DataScopeHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
/**
* @desc:
* @ClassName:MybatisPlusConfig
* @date: 2025年04月14日 16:14
* @author: andy.shi
* @contact: 17330188597
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
@EnableTransactionManagement(proxyTargetClass = true)
@Configuration
public class NewMybatisPlusConfig {
@Bean("newMybatisPlusInterceptor")
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 数据权限插件
interceptor.addInnerInterceptor(new DataPermissionInterceptor(new DataScopeHandler()));
return interceptor;
}
}

View File

@ -1,24 +1,14 @@
package com.evotech.hd.cloud.controller;
import java.util.List;
import java.util.Map;
import com.evotech.hd.cloud.mqtt.message.handle.RequestMessageService;
import org.springdoc.core.annotations.ParameterObject;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.evotech.hd.cloud.entity.request.PageListBatteryStationRequest;
import com.evotech.hd.cloud.mqtt.message.handle.RequestMessageService;
import com.evotech.hd.cloud.service.BatteryStationService;
import com.evotech.hd.common.core.Dto.BaseResponse;
import com.evotech.hd.common.core.entity.Result;
import com.evotech.hd.common.core.entity.cloud.BatteryStation;
import com.evotech.hd.common.core.entity.cloud.vo.BatteryStationVO;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import io.swagger.v3.oas.annotations.Hidden;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
@ -26,6 +16,11 @@ import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import org.springdoc.core.annotations.ParameterObject;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
@Tag(name = "换电站")
@ -103,4 +98,10 @@ public class BatteryStationController {
batteryStationService.downloadQRCode2(path, width, response);
}
@Operation(summary = "查询")
@GetMapping("/login/list")
public BaseResponse<List<BatteryStation>> loginList(@RequestParam String proxyCode) {
return batteryStationService.loginList(proxyCode);
}
}

View File

@ -1,26 +1,22 @@
package com.evotech.hd.cloud.controller.customer;
import java.util.List;
import java.util.Map;
import org.springdoc.core.annotations.ParameterObject;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.evotech.hd.cloud.service.CompanyService;
import com.evotech.hd.common.core.Dto.BaseResponse;
import com.evotech.hd.common.core.entity.BasePageRequest;
import com.evotech.hd.common.core.entity.Result;
import com.evotech.hd.common.core.entity.cloud.Company;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
import org.springdoc.core.annotations.ParameterObject;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
@Tag(name = "公司管理")
@RestController
@ -66,4 +62,10 @@ public class CompanyController {
return companyService.companyByCode(ccode);
}
@GetMapping("/login/one")
public BaseResponse<Company> loginOne(@RequestParam String code) {
return companyService.loginOne(code);
}
}

View File

@ -1,27 +1,22 @@
package com.evotech.hd.cloud.controller.customer;
import java.util.List;
import org.springdoc.core.annotations.ParameterObject;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.evotech.hd.cloud.entity.request.PageListVehicleRequest;
import com.evotech.hd.cloud.service.VehicleService;
import com.evotech.hd.common.core.Dto.BaseResponse;
import com.evotech.hd.common.core.entity.Result;
import com.evotech.hd.common.core.entity.cloud.VehicleInfo;
import com.evotech.hd.common.core.entity.cloud.VehicleWechatUserRelation;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import org.springdoc.core.annotations.ParameterObject;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@ -107,8 +102,14 @@ public class VehicleController {
public Result<List<VehicleWechatUserRelation>> listRelationUser(@NotBlank @RequestParam String PlantNo) {
return vehicleService.listRelationUser(PlantNo);
}
@Operation(summary = "查询")
@GetMapping("/login/list")
@ApiOperationSupport(order = 4)
public BaseResponse<List<VehicleInfo>> loginList(@RequestParam String companyCode) {
return vehicleService.loginList(companyCode);
}
}

View File

@ -1,27 +1,16 @@
package com.evotech.hd.cloud.controller.order;
import java.util.List;
import com.evotech.hd.common.core.entity.cloud.request.BatterySwapResponse;
import org.springdoc.core.annotations.ParameterObject;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.evotech.hd.cloud.entity.vo.NativePayVO;
import com.evotech.hd.cloud.service.OrderSwapBatteryService;
import com.evotech.hd.common.core.entity.Result;
import com.evotech.hd.common.core.entity.cloud.OrderSwapBattery;
import com.evotech.hd.common.core.entity.cloud.OrderSwapBatteryPre;
import com.evotech.hd.common.core.entity.cloud.OrderSwapBatteryStep;
import com.evotech.hd.common.core.entity.cloud.request.BatterySwapResponse;
import com.evotech.hd.common.core.entity.cloud.request.PageListSwapOrderPreRequest;
import com.evotech.hd.common.core.entity.cloud.request.PageListSwapOrderRequest;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import io.swagger.v3.oas.annotations.Hidden;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
@ -29,6 +18,11 @@ import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import org.springdoc.core.annotations.ParameterObject;
import org.springframework.web.bind.annotation.*;
import java.text.ParseException;
import java.util.List;
@Tag(name = "换电订单")
@ApiSupport(order = 22)
@ -57,7 +51,7 @@ public class OrderSwapBatteryController {
@Operation(summary = "查询预约")
@GetMapping("/pre/list")
@ApiOperationSupport(order = 3)
public Result<List<OrderSwapBatteryPre>> listPre(@ParameterObject PageListSwapOrderPreRequest plsopr) {
public Result<List<OrderSwapBatteryPre>> listPre(@ParameterObject PageListSwapOrderPreRequest plsopr) throws ParseException {
return orderSwapBatteryService.listPre(plsopr);
}

View File

@ -1,18 +1,24 @@
package com.evotech.hd.cloud.dao;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.evotech.hd.cloud.entity.request.PageListBatteryStationRequest;
import com.evotech.hd.common.core.constant.HDConstant;
import com.evotech.hd.common.core.entity.cloud.BatteryStation;
import com.evotech.hd.common.core.permission.DataScope;
import com.evotech.hd.common.core.permission.DataScopes;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @author zrb
* @since 2024-10-15
*/
//换电站
@DataScopes({
@DataScope(permissionObject = HDConstant.OPERATOR_ROLE_CODE, permissionScopeName = "pk_id", permissionScopeRedisKey = HDConstant.PermissionConstant.PERMISSION_STATION_ID)
})
public interface BatteryStationDao extends BaseMapper<BatteryStation> {
List<BatteryStation> listStation(Page<BatteryStation> page, @Param("plbsr") PageListBatteryStationRequest plbsr);

View File

@ -7,6 +7,7 @@ import com.evotech.hd.common.core.entity.cloud.Company;
* @author zrb
* @since 2024-11-20
*/
//换电站
public interface CompanyDao extends BaseMapper<Company> {
}

View File

@ -1,12 +1,19 @@
package com.evotech.hd.cloud.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.evotech.hd.common.core.constant.HDConstant;
import com.evotech.hd.common.core.entity.cloud.OrderSwapBatteryPre;
import com.evotech.hd.common.core.permission.DataScope;
import com.evotech.hd.common.core.permission.DataScopes;
/**
* @author zrb
* @since 2024-12-04
*/
@DataScopes({
@DataScope(permissionObject = HDConstant.OPERATOR_ROLE_CODE, permissionScopeName = "station_code", permissionScopeRedisKey = HDConstant.PermissionConstant.PERMISSION_STATION_CODE),
@DataScope(permissionObject = HDConstant.COMPANY_ROLE_CODE, permissionScopeName = "plate_num", permissionScopeRedisKey = HDConstant.PermissionConstant.PERMISSION_CAR_CODE)
})
public interface OrderSwapBatteryPreDao extends BaseMapper<OrderSwapBatteryPre> {
}

View File

@ -7,6 +7,7 @@ import com.evotech.hd.common.core.entity.cloud.VehicleInfo;
* @author zrb
* @since 2024-11-22
*/
//换电站
public interface VehicleInfoDao extends BaseMapper<VehicleInfo> {
}

View File

@ -0,0 +1,107 @@
package com.evotech.hd.cloud.handler;
import com.alibaba.nacos.common.utils.CollectionUtils;
import com.alibaba.nacos.common.utils.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.handler.MultiDataPermissionHandler;
import com.evotech.hd.cloud.utils.RedisCloudUtils;
import com.evotech.hd.common.core.permission.DataScope;
import com.evotech.hd.common.core.permission.DataScopes;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.Parenthesis;
import net.sf.jsqlparser.expression.StringValue;
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
import net.sf.jsqlparser.expression.operators.relational.InExpression;
import net.sf.jsqlparser.schema.Column;
import net.sf.jsqlparser.schema.Table;
import org.apache.commons.lang3.ObjectUtils;
import java.util.Arrays;
import java.util.stream.Collectors;
/**
* @desc:
* @ClassName:DataScopeHandler
* @date: 2025年04月14日 14:54
* @author: andy.shi
* @contact: 17330188597
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
public class DataScopeHandler implements MultiDataPermissionHandler {
/**
* 获取数据权限 SQL 片段
* <p>旧的 {@link MultiDataPermissionHandler#getSqlSegment(Expression, String)} 方法第一个参数包含所有的 where 条件信息如果 return null 会覆盖原有的 where 数据</p>
* <p>新版的 {@link MultiDataPermissionHandler#getSqlSegment(Table, Expression, String)} 方法不能覆盖原有的 where 数据如果 return null 则表示不追加任何 where 条件</p>
*
* @param table 所执行的数据库表信息可以通过此参数获取表名和表别名
* @param where 原有的 where 条件信息
* @param mappedStatementId Mybatis MappedStatement Id 根据该参数可以判断具体执行方法
* @return JSqlParser 条件表达式返回的条件表达式会拼接在原有的表达式后面不会覆盖原有的表达式
*/
@Override
public Expression getSqlSegment(Table table, Expression where, String mappedStatementId) {
try {
if(table != null && CollectionUtils.isNotEmpty(table.getNameParts()) && !"1".equals(RedisCloudUtils.getRoleType())){
String roleCode = RedisCloudUtils.getRoleCode();
Class<?> mapperClazz = Class.forName(mappedStatementId.substring(0, mappedStatementId.lastIndexOf(".")));
DataScopes dataScopesList = mapperClazz.getAnnotation(DataScopes.class);
if (ObjectUtils.isNotEmpty(dataScopesList)) {
for (DataScope dataScope :dataScopesList.value()){
if(dataScope.enabled()){
if(dataScope.permissionObject().equals(roleCode)){
return buildDataScopeByAnnotation(dataScope);
}
}
}
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
/**
* DataScope注解方式拼装数据权限
*
* @param dataScope
* @return
*/
private Expression buildDataScopeByAnnotation(DataScope dataScope) {
Expression expression = buildDataScopeExpression(dataScope, RedisCloudUtils.getPermissionValue(dataScope.permissionScopeRedisKey()));
return expression == null ? null : new Parenthesis(expression);
}
private Expression buildDataScopeExpression(DataScope dataScope, String value) {
if(!"null".equals(value)){
ExpressionList expressionList = new ExpressionList(Arrays.asList(value.split(",")).stream().map(StringValue::new).collect(Collectors.toList()));
// 设置左边的字段表达式右边设置值
InExpression operatorInExpression = new InExpression();
operatorInExpression.setLeftExpression(buildColumn(dataScope.tableAlias(), dataScope.permissionScopeName()));
operatorInExpression.setRightExpression(new Parenthesis(expressionList));
return operatorInExpression;
}
return null;
}
/**
* 构建Column
*
* @param tableAlias 表别名
* @param columnName 字段名称
* @return 带表别名字段
*/
private static Column buildColumn(String tableAlias, String columnName) {
if (StringUtils.isNotEmpty(tableAlias)) {
columnName = tableAlias + "." + columnName;
}
return new Column(columnName);
}
}

View File

@ -1,10 +1,10 @@
package com.evotech.hd.cloud.mqtt.config;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Date;
import java.util.concurrent.ConcurrentHashMap;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import jakarta.annotation.PreDestroy;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
@ -12,16 +12,14 @@ import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import jakarta.annotation.PreDestroy;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Date;
import java.util.concurrent.ConcurrentHashMap;
@Component
//@Component
@Order(value = 20)
@Slf4j
public class MqttConnectInit implements ApplicationRunner {

View File

@ -1,15 +1,15 @@
package com.evotech.hd.cloud.service;
import java.util.List;
import java.util.Map;
import com.evotech.hd.cloud.entity.request.PageListBatteryStationRequest;
import com.evotech.hd.common.core.Dto.BaseResponse;
import com.evotech.hd.common.core.entity.Result;
import com.evotech.hd.common.core.entity.cloud.BatteryStation;
import com.evotech.hd.common.core.entity.cloud.vo.BatteryStationVO;
import jakarta.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;
public interface BatteryStationService {
public Result<Integer> add(BatteryStation bs);
@ -29,4 +29,7 @@ public interface BatteryStationService {
public void createQRCode2(String path, String width, HttpServletResponse response);
public void downloadQRCode2(String path, String width, HttpServletResponse response);
public BaseResponse<List<BatteryStation>> loginList(String proxyId);
}

View File

@ -1,12 +1,13 @@
package com.evotech.hd.cloud.service;
import java.util.List;
import java.util.Map;
import com.evotech.hd.common.core.Dto.BaseResponse;
import com.evotech.hd.common.core.entity.BasePageRequest;
import com.evotech.hd.common.core.entity.Result;
import com.evotech.hd.common.core.entity.cloud.Company;
import java.util.List;
import java.util.Map;
public interface CompanyService {
public Result<Integer> add(Company company);
@ -19,4 +20,5 @@ public interface CompanyService {
public Result<Map<String, String>> companyByCode(String ccode);
public BaseResponse<Company> loginOne(String code);
}

View File

@ -1,23 +1,24 @@
package com.evotech.hd.cloud.service;
import java.util.List;
import com.evotech.hd.common.core.entity.cloud.request.BatterySwapResponse;
import com.evotech.hd.cloud.entity.vo.NativePayVO;
import com.evotech.hd.common.core.entity.Result;
import com.evotech.hd.common.core.entity.cloud.OrderSwapBattery;
import com.evotech.hd.common.core.entity.cloud.OrderSwapBatteryPre;
import com.evotech.hd.common.core.entity.cloud.OrderSwapBatteryStep;
import com.evotech.hd.common.core.entity.cloud.request.BatterySwapResponse;
import com.evotech.hd.common.core.entity.cloud.request.PageListSwapOrderPreRequest;
import com.evotech.hd.common.core.entity.cloud.request.PageListSwapOrderRequest;
import java.text.ParseException;
import java.util.List;
public interface OrderSwapBatteryService {
public Result<Integer> addPre(OrderSwapBatteryPre osbp);
public Result<Integer> cancelPre(Integer id, Integer status);
public Result<List<OrderSwapBatteryPre>> listPre(PageListSwapOrderPreRequest plsopr);
public Result<List<OrderSwapBatteryPre>> listPre(PageListSwapOrderPreRequest plsopr) throws ParseException;
public Result<Integer> add(OrderSwapBattery osb);

View File

@ -1,12 +1,13 @@
package com.evotech.hd.cloud.service;
import java.util.List;
import com.evotech.hd.cloud.entity.request.PageListVehicleRequest;
import com.evotech.hd.common.core.Dto.BaseResponse;
import com.evotech.hd.common.core.entity.Result;
import com.evotech.hd.common.core.entity.cloud.VehicleInfo;
import com.evotech.hd.common.core.entity.cloud.VehicleWechatUserRelation;
import java.util.List;
public interface VehicleService {
public Result<Integer> add(VehicleInfo vi);
@ -28,4 +29,8 @@ public interface VehicleService {
public Result<List<VehicleInfo>> listWechatUserRelation(String openid, String plateNum);
public Result<List<VehicleWechatUserRelation>> listRelationUser(String PlantNo);
public BaseResponse<List<VehicleInfo>> loginList(String companyCode);
}

View File

@ -1,21 +1,11 @@
package com.evotech.hd.cloud.service.impl;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.KeyPair;
import java.util.Base64;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.BeanUtils;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.crypto.KeyUtil;
import cn.hutool.crypto.asymmetric.AsymmetricAlgorithm;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.evotech.hd.cloud.dao.BatteryStationDao;
@ -25,20 +15,26 @@ import com.evotech.hd.cloud.entity.BatteryStationSecretKey;
import com.evotech.hd.cloud.entity.request.PageListBatteryStationRequest;
import com.evotech.hd.cloud.service.BatteryStationService;
import com.evotech.hd.cloud.service.rpc.WechatService;
import com.evotech.hd.common.core.Dto.BaseResponse;
import com.evotech.hd.common.core.entity.Result;
import com.evotech.hd.common.core.entity.cloud.BatteryStation;
import com.evotech.hd.common.core.entity.cloud.VehicleInfo;
import com.evotech.hd.common.core.entity.cloud.vo.BatteryStationVO;
import com.evotech.hd.common.core.enums.CodeMsg;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.crypto.KeyUtil;
import cn.hutool.crypto.asymmetric.AsymmetricAlgorithm;
import jakarta.annotation.Resource;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.BeanUtils;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.KeyPair;
import java.util.*;
@Service
public class BatteryStationServiceImpl implements BatteryStationService {
@ -272,4 +268,8 @@ public class BatteryStationServiceImpl implements BatteryStationService {
}
}
public BaseResponse<List<BatteryStation>> loginList(String proxyCode) {
return new BaseResponse<List<BatteryStation>>().success(batteryStationDao.selectList(new LambdaQueryWrapper<BatteryStation>().eq(BatteryStation::getProxyId, proxyCode).select(BatteryStation::getPkId, BatteryStation::getCode)));
}
}

View File

@ -1,21 +1,22 @@
package com.evotech.hd.cloud.service.impl;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.evotech.hd.cloud.dao.CompanyDao;
import com.evotech.hd.cloud.service.CompanyService;
import com.evotech.hd.common.core.Dto.BaseResponse;
import com.evotech.hd.common.core.entity.BasePageRequest;
import com.evotech.hd.common.core.entity.Result;
import com.evotech.hd.common.core.entity.cloud.Company;
import com.evotech.hd.common.core.enums.CodeMsg;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
@ -78,4 +79,9 @@ public class CompanyServiceImpl implements CompanyService {
return new Result<Map<String, String>>().success(m);
}
@Override
public BaseResponse<Company> loginOne(String code) {
return new BaseResponse<Company>().success(companyDao.selectOne(new LambdaQueryWrapper<Company>().eq(Company::getCcode, code)));
}
}

View File

@ -1,50 +1,32 @@
package com.evotech.hd.cloud.service.impl;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.evotech.hd.cloud.dao.BatteryStationDao;
import com.evotech.hd.cloud.dao.BatteryStationDcDao;
import com.evotech.hd.cloud.dao.BatteryStationRobotDao;
import com.evotech.hd.cloud.dao.CompanyDao;
import com.evotech.hd.cloud.dao.VehicleInfoDao;
import com.evotech.hd.cloud.dao.*;
import com.evotech.hd.cloud.entity.HomeStationOrderData;
import com.evotech.hd.cloud.entity.request.HomeDataRequest;
import com.evotech.hd.cloud.entity.vo.HomeData1;
import com.evotech.hd.cloud.entity.vo.HomeData2;
import com.evotech.hd.cloud.entity.vo.HomeData3;
import com.evotech.hd.cloud.entity.vo.HomeData4;
import com.evotech.hd.cloud.entity.vo.HomeData5;
import com.evotech.hd.cloud.entity.vo.HomeData6;
import com.evotech.hd.cloud.entity.vo.HomeData7;
import com.evotech.hd.cloud.entity.vo.*;
import com.evotech.hd.cloud.service.HomeService;
import com.evotech.hd.common.core.dao.cloud.HomeDataOrderSwapCollateDao;
import com.evotech.hd.common.core.dao.cloud.HomeDataTradeCollateDao;
import com.evotech.hd.common.core.dao.resource.ProxyOperaterDao;
import com.evotech.hd.common.core.dao.wechat.WechatUserDao;
import com.evotech.hd.common.core.entity.Result;
import com.evotech.hd.common.core.entity.cloud.BatteryStation;
import com.evotech.hd.common.core.entity.cloud.BatteryStationDc;
import com.evotech.hd.common.core.entity.cloud.BatteryStationRobot;
import com.evotech.hd.common.core.entity.cloud.Company;
import com.evotech.hd.common.core.entity.cloud.HomeDataOrderSwapCollate;
import com.evotech.hd.common.core.entity.cloud.HomeDataTradeCollate;
import com.evotech.hd.common.core.entity.cloud.VehicleInfo;
import com.evotech.hd.common.core.entity.cloud.*;
import com.evotech.hd.common.core.entity.resource.ProxyOperater;
import com.evotech.hd.common.core.entity.wechat.WechatUser;
import com.evotech.hd.common.core.enums.PayTypeEnums;
import com.evotech.hd.common.core.enums.TradeTypeEnums;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Service

View File

@ -1,36 +1,22 @@
package com.evotech.hd.cloud.service.impl;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONConfig;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.evotech.hd.cloud.dao.*;
import com.evotech.hd.common.core.entity.cloud.request.BatterySwapResponse;
import com.evotech.hd.cloud.mqtt.message.dto.newer.req.battery.BatterySwapReq;
import com.evotech.hd.cloud.entity.vo.NativePayVO;
import com.evotech.hd.cloud.mqtt.enums.MqttMessageTypeEnum;
import com.evotech.hd.cloud.mqtt.enums.RequestFunctionTypesEnum;
import com.evotech.hd.cloud.mqtt.message.MessageTopic;
import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader;
import com.evotech.hd.cloud.mqtt.message.dto.newer.req.battery.BatterySwapReq;
import com.evotech.hd.cloud.mqtt.message.handle.MessageUtilService;
import com.evotech.hd.common.core.entity.cloud.*;
import com.evotech.hd.common.redis.utils.RedisUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.evotech.hd.cloud.entity.vo.NativePayVO;
import com.evotech.hd.cloud.service.OrderSwapBatteryService;
import com.evotech.hd.cloud.service.TradeService;
import com.evotech.hd.cloud.service.WalletAccountService;
@ -40,6 +26,8 @@ import com.evotech.hd.cloud.utils.components.SwapOrderBasicFeeComponent;
import com.evotech.hd.common.core.dao.cloud.OrderSwapBatteryDao;
import com.evotech.hd.common.core.dao.wechat.WechatUserDao;
import com.evotech.hd.common.core.entity.Result;
import com.evotech.hd.common.core.entity.cloud.*;
import com.evotech.hd.common.core.entity.cloud.request.BatterySwapResponse;
import com.evotech.hd.common.core.entity.cloud.request.PageListSwapOrderPreRequest;
import com.evotech.hd.common.core.entity.cloud.request.PageListSwapOrderRequest;
import com.evotech.hd.common.core.entity.wechat.WechatUser;
@ -48,8 +36,22 @@ import com.evotech.hd.common.core.enums.OrderStatusEnums;
import com.evotech.hd.common.core.enums.PayTypeEnums;
import com.evotech.hd.common.core.enums.TradeTypeEnums;
import com.evotech.hd.common.core.utils.CommonUtil;
import com.evotech.hd.common.redis.utils.RedisUtil;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
@Slf4j
@Service
public class OrderSwapBatteryServiceImpl implements OrderSwapBatteryService {
@ -152,16 +154,18 @@ public class OrderSwapBatteryServiceImpl implements OrderSwapBatteryService {
}
@Override
public Result<List<OrderSwapBatteryPre>> listPre(PageListSwapOrderPreRequest plsopr) {
public Result<List<OrderSwapBatteryPre>> listPre(PageListSwapOrderPreRequest plsopr) throws ParseException {
Page<OrderSwapBatteryPre> page = new Page<OrderSwapBatteryPre>(plsopr.getPageNo(), plsopr.getPageSize());
page = orderSwapBatteryPreDao.selectPage(page, new QueryWrapper<OrderSwapBatteryPre>()
.eq(StringUtils.hasText(plsopr.getUcode()), "ucode", plsopr.getUcode())
.eq(plsopr.getStatus() != null, "status", plsopr.getStatus())
.eq(StringUtils.hasText(plsopr.getPlateNum()), "plate_num", plsopr.getPlateNum())
.eq(StringUtils.hasText(plsopr.getStationCode()), "station_code", plsopr.getStationCode())
.ge(StringUtils.hasText(plsopr.getSwapDayBegin()), "swap_day", plsopr.getSwapDayBegin())
.le(StringUtils.hasText(plsopr.getSwapDayEnd()), "swap_day", plsopr.getSwapDayEnd())
.orderByDesc("pk_id"));
page = orderSwapBatteryPreDao.selectPage(page, new LambdaQueryWrapper<OrderSwapBatteryPre>()
.eq(StringUtils.hasText(plsopr.getUcode()), OrderSwapBatteryPre::getUcode, plsopr.getUcode())
.eq(plsopr.getStatus() != null, OrderSwapBatteryPre::getStatus, plsopr.getStatus())
.eq(StringUtils.hasText(plsopr.getPlateNum()), OrderSwapBatteryPre::getPlateNum, plsopr.getPlateNum())
.eq(StringUtils.hasText(plsopr.getStationCode()), OrderSwapBatteryPre::getStationCode, plsopr.getStationCode())
.apply(StringUtils.hasText(plsopr.getSwapDayBegin()), "DATE_FORMAT(swap_day,'%Y-%m-%d') >={0}", DateFormatUtils.format(DateUtils.parseDate(plsopr.getSwapDayBegin(),"yyyyMMdd","yyyy-MM-dd"), "yyyy-MM-dd"))
.apply(StringUtils.hasText(plsopr.getSwapDayEnd()), "DATE_FORMAT(swap_day,'%Y-%m-%d') <={0}", DateFormatUtils.format(DateUtils.parseDate(plsopr.getSwapDayEnd(),"yyyyMMdd","yyyy-MM-dd"), "yyyy-MM-dd"))
// .ge(StringUtils.hasText(plsopr.getSwapDayBegin()), OrderSwapBatteryPre::getSwapDay, plsopr.getSwapDayBegin())
// .le(StringUtils.hasText(plsopr.getSwapDayEnd()), OrderSwapBatteryPre::getSwapDay, plsopr.getSwapDayEnd())
.orderByDesc(OrderSwapBatteryPre::getPkId));
if (page.getRecords().isEmpty()) {
return new Result<List<OrderSwapBatteryPre>>().error(CodeMsg.DATABASE_RESULT_NULL);
}
@ -220,19 +224,19 @@ public class OrderSwapBatteryServiceImpl implements OrderSwapBatteryService {
statusList = Arrays.asList(plsor.getStatus().split(",")).stream().map(Integer::valueOf).toList();
}
page = orderSwapBatteryDao.selectPage(page, new QueryWrapper<OrderSwapBattery>()
.eq(StringUtils.hasText(plsor.getOrderNo()), "order_no", plsor.getOrderNo())
.eq(StringUtils.hasText(plsor.getPlateNum()), "plate_num", plsor.getPlateNum())
.in(!plateNumList.isEmpty(), "plate_num", plateNumList)
.in(!statusList.isEmpty(), "status", statusList)
.ge(plsor.getOrderTimeBegin() != null, "order_time", plsor.getOrderTimeBegin())
.le(plsor.getOrderTimeEnd() != null, "order_time", plsor.getOrderTimeEnd())
.eq(StringUtils.hasText(plsor.getStationCode()), "station_code", plsor.getStationCode())
.like(StringUtils.hasText(plsor.getStationName()), "station_name", plsor.getStationName())
.eq(StringUtils.hasText(plsor.getUserId()), "order_pre_uid", plsor.getUserId())
.eq(StringUtils.hasText(plsor.getTradeNo()), "trade_no", plsor.getTradeNo())
.ne("del_flag", 1)
.orderByDesc("pk_id"));
page = orderSwapBatteryDao.selectPage(page, new LambdaQueryWrapper<OrderSwapBattery>()
.eq(StringUtils.hasText(plsor.getOrderNo()), OrderSwapBattery::getOrderNo, plsor.getOrderNo())
.eq(StringUtils.hasText(plsor.getPlateNum()), OrderSwapBattery::getPlateNum, plsor.getPlateNum())
.in(!plateNumList.isEmpty(), OrderSwapBattery::getPlateNum, plateNumList)
.in(!statusList.isEmpty(), OrderSwapBattery::getStatus, statusList)
.ge(plsor.getOrderTimeBegin() != null, OrderSwapBattery::getOrderTime, plsor.getOrderTimeBegin())
.le(plsor.getOrderTimeEnd() != null, OrderSwapBattery::getOrderTime, plsor.getOrderTimeEnd())
.eq(StringUtils.hasText(plsor.getStationCode()), OrderSwapBattery::getStationCode, plsor.getStationCode())
.like(StringUtils.hasText(plsor.getStationName()), OrderSwapBattery::getStationName, plsor.getStationName())
.eq(StringUtils.hasText(plsor.getUserId()), OrderSwapBattery::getOrderPreId, plsor.getUserId())
.eq(StringUtils.hasText(plsor.getTradeNo()), OrderSwapBattery::getTradeNo, plsor.getTradeNo())
.ne(OrderSwapBattery::getDelFlag, 1)
.orderByDesc(OrderSwapBattery::getPkId));
if (page.getRecords().isEmpty()) {
return new Result<List<OrderSwapBattery>>().error(CodeMsg.DATABASE_RESULT_NULL);
}

View File

@ -1,23 +1,23 @@
package com.evotech.hd.cloud.service.impl;
import java.util.Date;
import java.util.List;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.evotech.hd.cloud.dao.VehicleInfoDao;
import com.evotech.hd.cloud.dao.VehicleWechatUserRelationDao;
import com.evotech.hd.cloud.entity.request.PageListVehicleRequest;
import com.evotech.hd.cloud.service.VehicleService;
import com.evotech.hd.common.core.Dto.BaseResponse;
import com.evotech.hd.common.core.entity.Result;
import com.evotech.hd.common.core.entity.cloud.VehicleInfo;
import com.evotech.hd.common.core.entity.cloud.VehicleWechatUserRelation;
import com.evotech.hd.common.core.enums.CodeMsg;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.Date;
import java.util.List;
@Service
@ -67,6 +67,7 @@ public class VehicleServiceImpl implements VehicleService {
.eq(StringUtils.hasText(plvr.getTypeCode()), "type_code", plvr.getTypeCode())
.like(StringUtils.hasText(plvr.getPlateNum()), "plate_num", plvr.getPlateNum())
.eq(plvr.getOwnerType() != null, "owner_type", plvr.getOwnerType())
.like(StringUtils.hasText(plvr.getOwnerName()), "owner_name", plvr.getOwnerName())
.eq(StringUtils.hasText(plvr.getVinNo()), "vin_no", plvr.getVinNo())
.eq(StringUtils.hasText(plvr.getEngineNo()), "engine_no", plvr.getEngineNo())
.eq(StringUtils.hasText(plvr.getFrameworkNo()), "framework_no", plvr.getFrameworkNo())
@ -150,6 +151,10 @@ public class VehicleServiceImpl implements VehicleService {
return new Result<List<VehicleWechatUserRelation>>().success(list);
}
@Override
public BaseResponse<List<VehicleInfo>> loginList(String companyCode) {
return new BaseResponse<List<VehicleInfo>>().success(vehicleInfoDao.selectList(new LambdaQueryWrapper<VehicleInfo>().eq(VehicleInfo::getCcode, companyCode).select(VehicleInfo::getPkId, VehicleInfo::getPlateNum)));
}
}

View File

@ -0,0 +1,178 @@
package com.evotech.hd.cloud.utils;
import com.evotech.hd.common.core.constant.HDConstant;
import com.evotech.hd.common.core.entity.resource.auth.AuthUser;
import com.evotech.hd.common.redis.utils.RedisUtil;
import com.evotech.hd.common.web.util.RequestContextUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;
/**
* @desc:
* @ClassName:RedisCloudUtils
* @date: 2025年04月14日 15:24
* @author: andy.shi
* @contact: 17330188597
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
@Slf4j
public class RedisCloudUtils {
public static AuthUser getUser(){
AuthUser user = (AuthUser)getRedisObjectValue("user");
return (ObjectUtils.isEmpty(user) ? null : user);
}
public static String getRoleCode(){
String roles = getRedisStringValue("rcodes");
return StringUtils.isEmpty(roles) ? "" : roles;
}
public static String getPermissionValue(String key){
return getStringValue(HDConstant.LOGIN_CACHE_KEY_PREFIX + key+":"+getUserPkId());
}
public static String getStationCode(){
return getStringValue(HDConstant.LOGIN_CACHE_KEY_PREFIX + HDConstant.PermissionConstant.PERMISSION_STATION_CODE+":"+getUserPkId());
}
public static String getStationId(){
return getStringValue(HDConstant.LOGIN_CACHE_KEY_PREFIX + HDConstant.PermissionConstant.PERMISSION_STATION_ID+":"+getUserPkId());
}
public static String getCompanyCode(){
return getStringValue(HDConstant.LOGIN_CACHE_KEY_PREFIX + HDConstant.PermissionConstant.PERMISSION_COMPANY_CODE+":"+getUserPkId());
}
public static String getCompanyId(){
return getStringValue(HDConstant.LOGIN_CACHE_KEY_PREFIX + HDConstant.PermissionConstant.PERMISSION_COMPANY_ID+":"+getUserPkId());
}
public static String getCarCode(){
return getStringValue(HDConstant.LOGIN_CACHE_KEY_PREFIX + HDConstant.PermissionConstant.PERMISSION_CAR_CODE+":"+getUserPkId());
}
public static String getCarId(){
return getStringValue(HDConstant.LOGIN_CACHE_KEY_PREFIX + HDConstant.PermissionConstant.PERMISSION_CAR_ID+":"+getUserPkId());
}
private static Integer getUserPkId(){
AuthUser user = getUser();
if(org.apache.commons.lang3.ObjectUtils.isEmpty(user) || user.getPkId() == null){
return null;
}
return user.getPkId();
}
// public static Integer getCompanyScopeId(){
// return getUser().getPkId();
// }
/**
* 获取当前登录的角色信息, 0 站端, 1 管理员, 2 运营商, 3 公司,
* @author: andy.shi
* @contact: 17330188597
* @date: 2025/4/14/周一 14:21
* @return: * @return: java.lang.String
*/
public static String getRoleType(){
String roles = getRoleCode();
if(isAdmin(roles)){
return "1";
}
if(isOperator(roles)){
return "2";
}
if(isCompany(roles)){
return "3";
}
return "0";
}
//如果不等于-1 则证明为管理员
public static Boolean isAdmin(String roles){
return isAuthority(roles, HDConstant.SYSTEM_MANAGER_ROLE_CODE);
}
public static Boolean isOperator(String roles){
return isAuthority(roles,HDConstant.OPERATOR_ROLE_CODE);
}
public static Boolean isCompany(String roles){
return isAuthority(roles,HDConstant.COMPANY_ROLE_CODE);
}
private static Boolean isAuthority(String checkParamRoles, String paramRoleCode){
if(org.apache.commons.lang3.StringUtils.isNotEmpty(checkParamRoles)){
return checkParamRoles.lastIndexOf(paramRoleCode) != -1;
}
return getRoleCode().lastIndexOf(paramRoleCode) != -1;
}
/***
* 根据token拼接key, 获取String结果
* @param key
* @return
*/
private static String getRedisStringValue(String key) {
return String.valueOf(getRedisObjectValue(key));
}
/***
* 根据token拼接key, 获取Object结果
* @param key
* @return
*/
private static Object getRedisObjectValue(String key) {
String token = RequestContextUtil.getToken();
if(StringUtils.isEmpty(token)){
log.error("SpringUtil.getRedisValue========== token is null");
return null;
}
String jti = null;
try {
jti = TokenUtil.getJti(token);
if(StringUtils.isEmpty(jti)){
log.error("SpringUtil.getRedisValue========== jtj is null");
return null;
}
} catch (Exception e) {
log.error("SpringUtil.gegetRedisValuetUser========== jtj is null");
return null;
}
return getValue(HDConstant.LOGIN_CACHE_KEY_PREFIX + jti + ":"+key);
}
/***
* 根据key获取redis缓存
* @param key
* @return
*/
private static String getStringValue(String key){
Object obj = getValue(key);
return ObjectUtils.isEmpty(obj) ? null : String.valueOf(obj);
}
/***
* 根据key获取redis缓存
* @param key
* @return
*/
private static Object getValue(String key){
RedisUtil redisUtil = SpringUtil.getBean(RedisUtil.class);
if(ObjectUtils.isEmpty(redisUtil)){
log.error("SpringUtil.getRedisValue========== redisUtil is null");
}
Object obj = redisUtil.get(key);
if(ObjectUtils.isEmpty(obj)){
log.error("SpringUtil.getRedisValue=={}========== obj is null",key);
return null;
}
log.info("SpringUtil.getRedisValue=={}===={}",key,String.valueOf(obj));
return obj;
}
}

View File

@ -1,10 +1,15 @@
package com.evotech.hd.cloud.utils;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
/**
* @desc:
@ -48,4 +53,34 @@ public class SpringUtil implements ApplicationContextAware {
return b;
}
public static HttpServletRequest getRequest() {
RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();
if(null == requestAttributes) {
log.warn("The 'RequestAttributes' object is null, so can`t get 'HttpServletRequest' object!");
return null;
}
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes)requestAttributes;
HttpServletRequest request = servletRequestAttributes.getRequest();
return request;
}
public static HttpServletResponse getResponse() {
RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();
if(requestAttributes == null) {
log.warn("The 'RequestAttributes' object is null, so can`t get 'HttpServletResponse' object!");
return null;
}
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) requestAttributes;
HttpServletResponse resp = servletRequestAttributes.getResponse();
return resp;
}
}

View File

@ -0,0 +1,56 @@
package com.evotech.hd.cloud.utils;
import cn.hutool.core.date.DateUtil;
import cn.hutool.jwt.JWT;
import cn.hutool.jwt.JWTUtil;
import org.springframework.security.oauth2.jwt.JwtClaimNames;
import java.util.Date;
/**
* token解析工具类
*/
public class TokenUtil {
public static JWT parseToJwt(String token) {
JWT parseToken = JWTUtil.parseToken(token);
return parseToken;
}
/**
* 从token中获取userId
*/
public static String getUserId(String token) {
String uid = parseToJwt(token).getPayloads().getStr("uid");
return uid;
}
/**
* 从token中获取rcodes
*/
public static String getRcodes(String token) {
String uid = parseToJwt(token).getPayloads().getStr("rcodes");
return uid;
}
/**
* 从token中获取jti
*/
public static String getJti(String token) {
String jti = parseToJwt(token).getPayloads().getStr(JwtClaimNames.JTI).replaceAll("-", "");
return jti;
}
/**
* 从token中获取过期时间
*/
public static Date getExp(String token) {
String exp = parseToJwt(token).getPayloads().getStr(JwtClaimNames.EXP).toString();
return DateUtil.date(Long.valueOf(exp) * 1000);
}
}

View File

@ -12,7 +12,7 @@ logging:
spring:
# 服务名称必须带上不然nacos服务列表中没有也不会有注册成功的信息
application:
name: cloud-server
name: cloud-server #${cloud-manage-server:cloud-server}
jackson:
timeZone: GMT+08:00
date-format: yyyy-MM-dd HH:mm:ss
@ -20,7 +20,10 @@ spring:
write-dates-as-timestamps: false
config:
import:
- nacos:${spring.application.name}.yaml?refreshEnabled=true
- nacos:yt-common.properties?refreshEnabled=true
- nacos:cloud-server.yaml?refreshEnabled=true
cloud:
nacos:
serverAddr: 192.168.5.213:8848
@ -35,7 +38,8 @@ spring:
metadata:
management:
context-path: ${server.servlet.context-path}/actuator
config:
namespace: ${nacos.namespace:public}
# boot:
# admin:
# client:
@ -45,6 +49,7 @@ spring:
# username: jdyl
# password: jdyl123
# 添加这个客户端就显示ip而不是主机名我用nacos是显示的主机名
# instance:
# prefer-ip: true
# 为springbootadmin开启所有检查

View File

@ -1,68 +1,8 @@
package com.evotech.hd.cloud;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import java.util.stream.Collectors;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.evotech.hd.cloud.dao.*;
import com.evotech.hd.cloud.entity.BatteryStationSecretKey;
import com.evotech.hd.cloud.mqtt.enums.RequestFunctionTypesEnum;
import com.evotech.hd.cloud.mqtt.message.MessageTopic;
import com.evotech.hd.cloud.mqtt.message.handle.RequestMessageService;
import com.evotech.hd.cloud.service.BatteryStationCdStrategyService;
import com.evotech.hd.common.core.constant.HDConstant;
import com.evotech.hd.common.redis.utils.RedisUtil;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.evotech.hd.cloud.controller.test.service.MqttConfigService;
import com.evotech.hd.cloud.controller.test.service.MqttTestUtil;
import com.evotech.hd.cloud.mqtt.enums.MqttMessageTypeEnum;
import com.evotech.hd.cloud.mqtt.enums.StateFunctionTypesEnum;
import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader;
import com.evotech.hd.cloud.mqtt.message.MyMqttMessage;
import com.evotech.hd.cloud.mqtt.message.dto.newer.state.OrderStatus;
import com.evotech.hd.cloud.mqtt.message.dto.newer.state.OrderStatusData;
import com.evotech.hd.cloud.mqtt.message.dto.newer.state.SwapStep;
import com.evotech.hd.cloud.mqtt.message.handle.MessageUtilService;
import com.evotech.hd.cloud.service.BatteryStationDcService;
import com.evotech.hd.cloud.service.OrderSwapBatteryService;
import com.evotech.hd.cloud.service.WalletAccountService;
import com.evotech.hd.cloud.utils.components.SwapOrderBasicFeeComponent;
import com.evotech.hd.common.core.dao.cloud.OrderSwapBatteryDao;
import com.evotech.hd.common.core.dao.cloud.PreOrderRelationSwapOrderDao;
import com.evotech.hd.common.core.dao.resource.BatteryTypeDao;
import com.evotech.hd.common.core.dao.resource.CarTypeDao;
import com.evotech.hd.common.core.dao.wechat.WechatUserDao;
import com.evotech.hd.common.core.entity.Result;
import com.evotech.hd.common.core.entity.cloud.BatteryStation;
import com.evotech.hd.common.core.entity.cloud.BatteryStationDc;
import com.evotech.hd.common.core.entity.cloud.Company;
import com.evotech.hd.common.core.entity.cloud.OrderSwapBattery;
import com.evotech.hd.common.core.entity.cloud.OrderSwapBatteryPre;
import com.evotech.hd.common.core.entity.cloud.PreOrderRelationSwapOrder;
import com.evotech.hd.common.core.entity.cloud.TradeDetail;
import com.evotech.hd.common.core.entity.cloud.VehicleInfo;
import com.evotech.hd.common.core.entity.cloud.VehicleWechatUserRelation;
import com.evotech.hd.common.core.entity.cloud.WalletAccount;
import com.evotech.hd.common.core.entity.cloud.WalletAccountDetail;
import com.evotech.hd.common.core.entity.resource.BatteryType;
import com.evotech.hd.common.core.entity.resource.CarType;
import com.evotech.hd.common.core.entity.wechat.WechatUser;
import com.evotech.hd.common.core.enums.CodeMsg;
import com.evotech.hd.common.core.enums.OrderStatusEnums;
import com.evotech.hd.common.core.enums.TradeTypeEnums;
import com.evotech.hd.common.core.utils.CommonUtil;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.crypto.Mode;
import cn.hutool.crypto.Padding;
@ -70,7 +10,55 @@ import cn.hutool.crypto.symmetric.AES;
import cn.hutool.crypto.symmetric.SymmetricCrypto;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.evotech.hd.cloud.controller.test.service.MqttConfigService;
import com.evotech.hd.cloud.controller.test.service.MqttTestUtil;
import com.evotech.hd.cloud.dao.*;
import com.evotech.hd.cloud.entity.BatteryStationSecretKey;
import com.evotech.hd.cloud.mqtt.enums.MqttMessageTypeEnum;
import com.evotech.hd.cloud.mqtt.enums.RequestFunctionTypesEnum;
import com.evotech.hd.cloud.mqtt.enums.StateFunctionTypesEnum;
import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader;
import com.evotech.hd.cloud.mqtt.message.MyMqttMessage;
import com.evotech.hd.cloud.mqtt.message.dto.newer.state.OrderStatus;
import com.evotech.hd.cloud.mqtt.message.dto.newer.state.OrderStatusData;
import com.evotech.hd.cloud.mqtt.message.dto.newer.state.SwapStep;
import com.evotech.hd.cloud.mqtt.message.handle.MessageUtilService;
import com.evotech.hd.cloud.service.BatteryStationCdStrategyService;
import com.evotech.hd.cloud.service.BatteryStationDcService;
import com.evotech.hd.cloud.service.OrderSwapBatteryService;
import com.evotech.hd.cloud.service.WalletAccountService;
import com.evotech.hd.cloud.utils.components.SwapOrderBasicFeeComponent;
import com.evotech.hd.common.core.constant.HDConstant;
import com.evotech.hd.common.core.dao.cloud.OrderSwapBatteryDao;
import com.evotech.hd.common.core.dao.cloud.PreOrderRelationSwapOrderDao;
import com.evotech.hd.common.core.dao.resource.BatteryTypeDao;
import com.evotech.hd.common.core.dao.resource.CarTypeDao;
import com.evotech.hd.common.core.dao.wechat.WechatUserDao;
import com.evotech.hd.common.core.entity.Result;
import com.evotech.hd.common.core.entity.cloud.*;
import com.evotech.hd.common.core.entity.resource.BatteryType;
import com.evotech.hd.common.core.entity.resource.CarType;
import com.evotech.hd.common.core.entity.wechat.WechatUser;
import com.evotech.hd.common.core.enums.CodeMsg;
import com.evotech.hd.common.core.enums.OrderStatusEnums;
import com.evotech.hd.common.core.enums.TradeTypeEnums;
import com.evotech.hd.common.core.utils.CommonUtil;
import com.evotech.hd.common.redis.utils.RedisUtil;
import jakarta.annotation.Resource;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import java.util.stream.Collectors;
@SpringBootTest(classes = CloudManageServerApplication.class)
public class AddTestData {
@ -140,12 +128,13 @@ public class AddTestData {
// @Test
void testStrategyAndMqttM2S() {
void testStrategyAndMqttM2S() throws MqttException {
testClient = mqttService.connect();
// 1.
List<BatteryStation> stationList = batteryStationDao.selectList(new LambdaUpdateWrapper<BatteryStation>().eq(BatteryStation::getPkId, 4));
BatteryStation station = stationList.get(0);
sendStrategyInfo(station.getCode());
testClient.disconnect();
}

View File

@ -1,11 +1,14 @@
package com.evotech.hd.gateway.oauth2;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.evotech.hd.common.core.constant.HDConstant;
import com.evotech.hd.common.core.enums.CodeMsg;
import com.evotech.hd.common.core.utils.XCXUtil;
import com.evotech.hd.common.redis.utils.RedisUtil;
import com.evotech.hd.gateway.oauth2.service.WechatService;
import com.evotech.hd.gateway.utils.TokenUtil;
import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpMethod;
import org.springframework.http.server.reactive.ServerHttpRequest;
@ -18,19 +21,15 @@ import org.springframework.security.oauth2.core.OAuth2Error;
import org.springframework.security.web.server.authorization.AuthorizationContext;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import com.evotech.hd.common.core.constant.HDConstant;
import com.evotech.hd.common.core.enums.CodeMsg;
import com.evotech.hd.common.core.utils.XCXUtil;
import com.evotech.hd.common.redis.utils.RedisUtil;
import com.evotech.hd.gateway.oauth2.service.WechatService;
import com.evotech.hd.gateway.utils.TokenUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import jakarta.annotation.Resource;
import reactor.core.publisher.Mono;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;
/**
* 资源服务的权限管理器
* 鉴权时统一抛出OAuth2AuthorizationException
@ -44,9 +43,14 @@ public class AuthorizationManager implements ReactiveAuthorizationManager<Author
private RSAKeyPair rsaKeyPair;
@Resource
private WechatService wechatService;
@Value("${yt.gateway.is_pass:false}")
private boolean isPass;
@Value("${not_permission_url}")
private String notPermissionUrl;
@Override
@ -170,7 +174,11 @@ public class AuthorizationManager implements ReactiveAuthorizationManager<Author
List<Object> objectList = redisUtil.lGet(HDConstant.LOGIN_CACHE_KEY_PREFIX + jti + ":perms", 0, -1);
List<String> permList = objectList.stream().map(i -> i.toString()).toList();
String path = request.getURI().getPath().substring(8);
if (!permList.contains("gateway:" + path)) {
// if (!permList.contains("gateway:" + path)) {
// throw new OAuth2AuthorizationException(new OAuth2Error(CodeMsg.ACCESS_DENY.getCode(), CodeMsg.ACCESS_DENY.getMsg(), uri));
// }
//已授权接口,和无需授权接口
if (!permList.contains(path) && !Arrays.asList(notPermissionUrl.split(";")).contains(path)) {
throw new OAuth2AuthorizationException(new OAuth2Error(CodeMsg.ACCESS_DENY.getCode(), CodeMsg.ACCESS_DENY.getMsg(), uri));
}
return true;

View File

@ -24,12 +24,15 @@ spring:
max-in-memory-size: 10485760
config:
import:
- nacos:yt-common.properties?refreshEnabled=true
- nacos:${spring.application.name}.yaml?refreshEnabled=true
cloud:
nacos:
serverAddr: 192.168.5.213:8848
username: nacos
password: nacos
config:
namespace: ${nacos.namespace:public}
discovery:
namespace: ${nacos.namespace:public}
register-enabled: true

View File

@ -1,24 +1,22 @@
package com.evotech.hd.resource.controller;
import java.util.List;
import org.springdoc.core.annotations.ParameterObject;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.evotech.hd.common.core.entity.Result;
import com.evotech.hd.common.core.entity.resource.ProxyOperater;
import com.evotech.hd.resource.entity.request.PageListProxyOperaterRequest;
import com.evotech.hd.resource.service.ProxyOperaterService;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import org.springdoc.core.annotations.ParameterObject;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@Tag(name = "运营商")
@ApiSupport(order = 107)
@ -59,4 +57,5 @@ public class ProxyOperaterController {
}
}

View File

@ -1,7 +1,5 @@
package com.evotech.hd.resource.service;
import java.util.List;
import com.evotech.hd.common.core.entity.Result;
import com.evotech.hd.common.core.entity.request.ListDictRequest;
import com.evotech.hd.common.core.entity.resource.dict.Dict;
@ -9,6 +7,8 @@ import com.evotech.hd.common.core.entity.resource.dict.DictType;
import com.evotech.hd.resource.entity.DictInfo;
import com.evotech.hd.resource.entity.request.ListDictTypeRequest;
import java.util.List;
public interface DictService {
public Result<Integer> addType(DictType dt);
@ -29,4 +29,6 @@ public interface DictService {
public Result<List<DictInfo>> listDictInfo(String typeCode);
public List<Dict> listDictByType(String typeCode);
}

View File

@ -1,10 +1,7 @@
package com.evotech.hd.resource.service.impl;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.evotech.hd.common.core.dao.resource.dict.DictDao;
import com.evotech.hd.common.core.dao.resource.dict.DictTypeDao;
@ -16,15 +13,19 @@ import com.evotech.hd.common.core.enums.CodeMsg;
import com.evotech.hd.resource.entity.DictInfo;
import com.evotech.hd.resource.entity.request.ListDictTypeRequest;
import com.evotech.hd.resource.service.DictService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
@Service
@Slf4j
public class DictServiceImpl implements DictService {
@Resource
@ -128,4 +129,14 @@ public class DictServiceImpl implements DictService {
return new Result<List<DictInfo>>().success(list);
}
@Override
public List<Dict> listDictByType(String typeCode) {
DictType dictType = dictTypeDao.selectOne(new LambdaQueryWrapper<DictType>().eq(DictType::getTypeCode, typeCode));
if(ObjectUtils.isEmpty(dictType)){
log.info("typeCode:{}===未查询到当前类型", typeCode);
return Arrays.asList(new Dict());
}
return dictDao.selectList(new LambdaQueryWrapper<Dict>().eq(Dict::getTypeId, dictType.getPkId()).orderByAsc(Dict::getSort));
}
}

View File

@ -1,15 +1,10 @@
package com.evotech.hd.resource.service.impl;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import org.apache.ibatis.executor.BatchResult;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import cn.hutool.core.util.StrUtil;
import com.alibaba.nacos.common.utils.CollectionUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.evotech.hd.common.core.constant.HDConstant;
import com.evotech.hd.common.core.dao.resource.auth.AuthRoleDao;
import com.evotech.hd.common.core.dao.resource.auth.AuthRoleResourceDao;
import com.evotech.hd.common.core.dao.resource.auth.AuthUserRoleDao;
@ -17,13 +12,22 @@ import com.evotech.hd.common.core.entity.Result;
import com.evotech.hd.common.core.entity.resource.auth.AuthRole;
import com.evotech.hd.common.core.entity.resource.auth.AuthRoleResource;
import com.evotech.hd.common.core.entity.resource.auth.AuthUserRole;
import com.evotech.hd.common.core.entity.resource.dict.Dict;
import com.evotech.hd.common.core.enums.CodeMsg;
import com.evotech.hd.resource.entity.request.DelAddRoleSourceRequest;
import com.evotech.hd.resource.service.DictService;
import com.evotech.hd.resource.service.RoleService;
import cn.hutool.core.util.StrUtil;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.executor.BatchResult;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import java.util.*;
import java.util.stream.Collectors;
@Slf4j
@Service
public class RoleServiceImpl implements RoleService {
@ -33,18 +37,49 @@ public class RoleServiceImpl implements RoleService {
private AuthRoleResourceDao authRoleResourceDao;
@Resource
private AuthUserRoleDao authUserRoleDao;
@Resource
private DictService dictService;
@Override
public Result<Integer> add(AuthRole r) {
r.setCtime(new Date());
int n = authRoleDao.insert(r);
if (n == 1) {
return new Result<Integer>().success(n);
try {
addDefaultMenu(r);
} catch (Exception e) {
log.error("创建角色成功了, 但是初始化默认权限失败了",e);
}
return new Result<Integer>().success(n);
}
return new Result<Integer>().error("添加角色出错!");
}
public void addDefaultMenu(AuthRole r){
List<Dict> dictList = dictService.listDictByType(HDConstant.DEFAULT_MENU_TYPE);
if(CollectionUtils.isNotEmpty(dictList)){
Map<String, String> roleResourceMap = new LinkedHashMap<>();
dictList.stream().forEach(dict ->{
String[] codeArr = dict.getDictCode().split("_");
String val = roleResourceMap.containsKey(codeArr[0])? roleResourceMap.get(codeArr[0]) : "";
if(StringUtils.isEmpty(val)){
val = dict.getDictValue();
}else{
val += "," + dict.getDictValue();
}
roleResourceMap.put(codeArr[0], val);
});
DelAddRoleSourceRequest darsr = new DelAddRoleSourceRequest();
darsr.setRcode(r.getRcode());
darsr.setTypes(roleResourceMap.keySet().stream().collect(Collectors.joining(";")));
darsr.setSourceIds(roleResourceMap.values().stream().collect(Collectors.joining(";")));
delAddRoleSource(darsr);
}
}
@Override
@Transactional
public Result<Integer> delete(Integer rid) {
@ -154,10 +189,9 @@ public class RoleServiceImpl implements RoleService {
if (typeArr.length != sourceArr.length) {
return new Result<Integer>().error("参数格式错误");
}
// 2. 删除原来的
authRoleResourceDao.delete(new QueryWrapper<AuthRoleResource>().eq("rcode", rcode));
// 3. 增加新的
Date d = new Date();
List<Integer> oldResourceIds = new ArrayList<>();
List<AuthRoleResource> list = new ArrayList<AuthRoleResource>();
for (int i = 0; i < typeArr.length; i++) {
String[] sourceIdArr = sourceArr[i].split(",");
@ -167,9 +201,13 @@ public class RoleServiceImpl implements RoleService {
arr.setResourceType(typeArr[i]);
arr.setResourceId(Integer.valueOf(sourceIdArr[j]));
arr.setCtime(d);
list.add(arr);
list.add(arr);
oldResourceIds.add(arr.getResourceId());
}
}
// 2. 删除原来的
authRoleResourceDao.delete(new LambdaQueryWrapper<AuthRoleResource>().eq(AuthRoleResource::getRcode, rcode).in(AuthRoleResource::getResourceType, typeArr).in(CollectionUtils.isNotEmpty(oldResourceIds),AuthRoleResource::getResourceId, oldResourceIds));
return addRoleSource(list);
}

View File

@ -12,10 +12,11 @@ logging:
spring:
# 服务名称必须带上不然nacos服务列表中没有也不会有注册成功的信息
application:
name: resource-server
name: ${resource-server:resource-server}
config:
import:
- nacos:${spring.application.name}.yaml?refreshEnabled=true
- nacos:yt-common.properties?refreshEnabled=true
- nacos:resource-server.yaml?refreshEnabled=true
cloud:
nacos:
serverAddr: 192.168.5.213:8848
@ -30,6 +31,8 @@ spring:
metadata:
management:
context-path: ${server.servlet.context-path}/actuator
config:
namespace: ${nacos.namespace:public}
# 为springbootadmin开启所有检查
management:
endpoints:

View File

@ -26,6 +26,7 @@
<result column="ctime" property="ctime" />
<result column="updater" property="updater" />
<result column="uptime" property="uptime" />
<result column="businessCode" property="business_code" />
</resultMap>
<!-- 通用查询结果列 -->

View File

@ -1,10 +1,12 @@
package com.evotech.hd.wechat.service.rpc;
import java.util.List;
import java.util.Map;
import com.evotech.hd.common.core.entity.Result;
import com.evotech.hd.common.core.entity.cloud.*;
import com.evotech.hd.common.core.entity.cloud.request.BatterySwapResponse;
import com.evotech.hd.common.core.entity.cloud.request.PageListSwapOrderPreRequest;
import com.evotech.hd.common.core.entity.cloud.request.PageListSwapOrderRequest;
import com.evotech.hd.common.core.entity.cloud.request.PageListWalletRequest;
import com.evotech.hd.common.core.entity.cloud.vo.BatteryStationVO;
import com.evotech.hd.common.core.entity.wechat.WechatPayAttach;
import jakarta.validation.constraints.NotBlank;
import org.springframework.cloud.openfeign.FeignClient;
@ -14,20 +16,10 @@ import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import com.evotech.hd.common.core.entity.Result;
import com.evotech.hd.common.core.entity.cloud.OrderSwapBattery;
import com.evotech.hd.common.core.entity.cloud.OrderSwapBatteryPre;
import com.evotech.hd.common.core.entity.cloud.OrderSwapBatteryStep;
import com.evotech.hd.common.core.entity.cloud.TradeDetail;
import com.evotech.hd.common.core.entity.cloud.VehicleInfo;
import com.evotech.hd.common.core.entity.cloud.WalletAccount;
import com.evotech.hd.common.core.entity.cloud.WalletAccountDetail;
import com.evotech.hd.common.core.entity.cloud.request.PageListSwapOrderPreRequest;
import com.evotech.hd.common.core.entity.cloud.request.PageListSwapOrderRequest;
import com.evotech.hd.common.core.entity.cloud.request.PageListWalletRequest;
import com.evotech.hd.common.core.entity.cloud.vo.BatteryStationVO;
import java.util.List;
import java.util.Map;
@FeignClient(value = "cloud-server")
@FeignClient(value = "${CLOUD-SERVER-API-NAME}")
public interface CloudService {
@PostMapping(value = "/cloud/order/swap/pre/add",

View File

@ -12,10 +12,11 @@ logging:
spring:
# 服务名称必须带上不然nacos服务列表中没有也不会有注册成功的信息
application:
name: wechat-server
name: ${cloud-manage-server:wechat-server}
config:
import:
- nacos:${spring.application.name}.yaml?refreshEnabled=true
- nacos:yt-common.properties?refreshEnabled=true
- nacos:wechat-server.yaml?refreshEnabled=true
cloud:
nacos:
serverAddr: 192.168.5.213:8848
@ -30,6 +31,8 @@ spring:
metadata:
management:
context-path: ${server.servlet.context-path}/actuator
config:
namespace: ${nacos.namespace:public}
# 为springbootadmin开启所有检查
management: