提交 99d484ad authored 作者: hzh's avatar hzh

Merge branch 'dev'

# Conflicts: # ruoyi-modules/ruoyi-server/src/main/java/org/dromara/server/base/BaseController.java # ruoyi-modules/ruoyi-server/src/main/java/org/dromara/server/dubbo/RemoteServerServiceImpl.java
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="ruoyi-auth" type="docker-deploy" factoryName="dockerfile" server-name="Docker">
<deployment type="dockerfile">
<settings>
<option name="imageTag" value="ruoyi/ruoyi-auth:2.2.2" />
<option name="buildOnly" value="true" />
<option name="sourceFilePath" value="ruoyi-auth/Dockerfile" />
</settings>
</deployment>
<method v="2" />
</configuration>
</component>
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="ruoyi-gateway" type="docker-deploy" factoryName="dockerfile" server-name="Docker">
<deployment type="dockerfile">
<settings>
<option name="imageTag" value="ruoyi/ruoyi-gateway:2.2.2" />
<option name="buildOnly" value="true" />
<option name="sourceFilePath" value="ruoyi-gateway/Dockerfile" />
</settings>
</deployment>
<method v="2" />
</configuration>
</component>
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="ruoyi-gen" type="docker-deploy" factoryName="dockerfile" server-name="Docker">
<deployment type="dockerfile">
<settings>
<option name="imageTag" value="ruoyi/ruoyi-gen:2.2.2" />
<option name="buildOnly" value="true" />
<option name="sourceFilePath" value="ruoyi-modules/ruoyi-gen/Dockerfile" />
</settings>
</deployment>
<method v="2" />
</configuration>
</component>
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="ruoyi-job" type="docker-deploy" factoryName="dockerfile" server-name="Docker">
<deployment type="dockerfile">
<settings>
<option name="imageTag" value="ruoyi/ruoyi-job:2.2.2" />
<option name="buildOnly" value="true" />
<option name="sourceFilePath" value="ruoyi-modules/ruoyi-job/Dockerfile" />
</settings>
</deployment>
<method v="2" />
</configuration>
</component>
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="ruoyi-monitor" type="docker-deploy" factoryName="dockerfile" server-name="Docker">
<deployment type="dockerfile">
<settings>
<option name="imageTag" value="ruoyi/ruoyi-monitor:2.2.2" />
<option name="buildOnly" value="true" />
<option name="sourceFilePath" value="ruoyi-visual/ruoyi-monitor/Dockerfile" />
</settings>
</deployment>
<method v="2" />
</configuration>
</component>
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="ruoyi-nacos" type="docker-deploy" factoryName="dockerfile" server-name="Docker">
<deployment type="dockerfile">
<settings>
<option name="imageTag" value="ruoyi/ruoyi-nacos:2.2.2" />
<option name="buildOnly" value="true" />
<option name="sourceFilePath" value="ruoyi-visual/ruoyi-nacos/Dockerfile" />
</settings>
</deployment>
<method v="2" />
</configuration>
</component>
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="ruoyi-resource" type="docker-deploy" factoryName="dockerfile" server-name="Docker">
<deployment type="dockerfile">
<settings>
<option name="imageTag" value="ruoyi/ruoyi-resource:2.2.2" />
<option name="buildOnly" value="true" />
<option name="sourceFilePath" value="ruoyi-modules/ruoyi-resource/Dockerfile" />
</settings>
</deployment>
<method v="2" />
</configuration>
</component>
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="ruoyi-seata-server" type="docker-deploy" factoryName="dockerfile" server-name="Docker">
<deployment type="dockerfile">
<settings>
<option name="imageTag" value="ruoyi/ruoyi-seata-server:2.2.2" />
<option name="buildOnly" value="true" />
<option name="sourceFilePath" value="ruoyi-visual/ruoyi-seata-server/Dockerfile" />
</settings>
</deployment>
<method v="2" />
</configuration>
</component>
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="ruoyi-sentinel-dashboard" type="docker-deploy" factoryName="dockerfile" server-name="Docker">
<deployment type="dockerfile">
<settings>
<option name="imageTag" value="ruoyi/ruoyi-sentinel-dashboard:2.2.2" />
<option name="buildOnly" value="true" />
<option name="sourceFilePath" value="ruoyi-visual/ruoyi-sentinel-dashboard/Dockerfile" />
</settings>
</deployment>
<method v="2" />
</configuration>
</component>
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="ruoyi-snailjob-server" type="docker-deploy" factoryName="dockerfile" server-name="Docker">
<deployment type="dockerfile">
<settings>
<option name="imageTag" value="ruoyi/ruoyi-snailjob-server:2.2.2" />
<option name="buildOnly" value="true" />
<option name="sourceFilePath" value="ruoyi-visual/ruoyi-snailjob-server/Dockerfile" />
</settings>
</deployment>
<method v="2" />
</configuration>
</component>
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="ruoyi-system" type="docker-deploy" factoryName="dockerfile" server-name="Docker">
<deployment type="dockerfile">
<settings>
<option name="imageTag" value="ruoyi/ruoyi-system:2.2.2" />
<option name="buildOnly" value="true" />
<option name="sourceFilePath" value="ruoyi-modules/ruoyi-system/Dockerfile" />
</settings>
</deployment>
<method v="2" />
</configuration>
</component>
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="ruoyi-workflow" type="docker-deploy" factoryName="dockerfile" server-name="Docker">
<deployment type="dockerfile">
<settings>
<option name="imageTag" value="ruoyi/ruoyi-workflow:2.2.2" />
<option name="buildOnly" value="true" />
<option name="sourceFilePath" value="ruoyi-modules/ruoyi-workflow/Dockerfile" />
</settings>
</deployment>
<method v="2" />
</configuration>
</component>
...@@ -26,4 +26,13 @@ public interface RemoteServerService { ...@@ -26,4 +26,13 @@ public interface RemoteServerService {
*/ */
RemoteUser getUserByPhone(String tenantId, String phone); RemoteUser getUserByPhone(String tenantId, String phone);
/**
* 根据personCode查询用户昵称
*
* @param personCode personCode
* @return 用户昵称
*/
String selectNiceNameByPersonCodes(String personCode);
} }
...@@ -15,6 +15,11 @@ public interface RemoteYsOrderService { ...@@ -15,6 +15,11 @@ public interface RemoteYsOrderService {
*/ */
void updateAirportRefundOrder(); void updateAirportRefundOrder();
/**
* 更新机票改签订单
*/
void updateAirportChangeOrder();
/** /**
* 跟新火车票订单 * 跟新火车票订单
*/ */
...@@ -25,6 +30,11 @@ public interface RemoteYsOrderService { ...@@ -25,6 +30,11 @@ public interface RemoteYsOrderService {
*/ */
void updateTrainRefundOrder(); void updateTrainRefundOrder();
/**
* 跟新火车票改签订单
*/
void updateTrainChangeOrder();
/** /**
* 更新用车订单 * 更新用车订单
*/ */
......
...@@ -22,9 +22,10 @@ public interface RemoteUserService { ...@@ -22,9 +22,10 @@ public interface RemoteUserService {
* *
* @param username 用户名 * @param username 用户名
* @param tenantId 租户id * @param tenantId 租户id
* @param userType 用户类型
* @return 结果 * @return 结果
*/ */
LoginUser getUserInfo(String username, String tenantId) throws UserException; LoginUser getUserInfo(String username, String tenantId, String userType) throws UserException;
/** /**
* 通过用户id查询用户信息 * 通过用户id查询用户信息
...@@ -141,6 +142,14 @@ public interface RemoteUserService { ...@@ -141,6 +142,14 @@ public interface RemoteUserService {
*/ */
List<Long> selectUserIdsByRoleIds(List<Long> roleIds); List<Long> selectUserIdsByRoleIds(List<Long> roleIds);
/**
* 根据用户昵称查询userIds
*
* @param nickName 用户昵称
* @return 用户ids
*/
List<Long> selectUserIdsByNickName(String nickName);
/** /**
* 根据手机号查询租户id集合 * 根据手机号查询租户id集合
* *
......
...@@ -22,7 +22,6 @@ import static org.dromara.common.core.utils.ServletUtils.getClientIP; ...@@ -22,7 +22,6 @@ import static org.dromara.common.core.utils.ServletUtils.getClientIP;
/** /**
* @author hzh * @author hzh
* @date 2025-02-08 * @date 2025-02-08
* @desc TODO
**/ **/
@Slf4j @Slf4j
@Service @Service
...@@ -38,7 +37,7 @@ public abstract class AbstractMallStrategy implements IAuthStrategy { ...@@ -38,7 +37,7 @@ public abstract class AbstractMallStrategy implements IAuthStrategy {
@Nullable @Nullable
Long getMemberId(LoginBody loginBody, XcxLoginUser loginUser) { Long getMemberId(LoginBody loginBody, XcxLoginUser loginUser) {
// 增加商城逻辑 // 增加商城逻辑
Long thirdUserId; Long thirdUserId = null;
if (StringUtils.equals(loginBody.getTenantId(), DEFAULT_TENANT_ID) && StringUtils.equals(loginUser.getUserType(), UserType.APP_USER.getUserType())) { if (StringUtils.equals(loginBody.getTenantId(), DEFAULT_TENANT_ID) && StringUtils.equals(loginUser.getUserType(), UserType.APP_USER.getUserType())) {
thirdUserId = loginUser.getUserId(); thirdUserId = loginUser.getUserId();
} else { } else {
...@@ -49,12 +48,22 @@ public abstract class AbstractMallStrategy implements IAuthStrategy { ...@@ -49,12 +48,22 @@ public abstract class AbstractMallStrategy implements IAuthStrategy {
remoteUserBo.setNickName(remoteUserBo.getUserName()); remoteUserBo.setNickName(remoteUserBo.getUserName());
remoteUserBo.setUserType(UserType.APP_USER.getUserType()); remoteUserBo.setUserType(UserType.APP_USER.getUserType());
remoteUserBo.setPhonenumber(loginUser.getPhone()); remoteUserBo.setPhonenumber(loginUser.getPhone());
try { try {
thirdUserId = remoteUserService.registerUserInfo(remoteUserBo); thirdUserId = remoteUserService.getUserInfo(remoteUserBo.getUserName(), remoteUserBo.getTenantId(), remoteUserBo.getUserType()).getUserId();
} catch (Exception e) { } catch (Exception e) {
log.info("用户已存在:{},租户id:{}", remoteUserBo.getUserName(), remoteUserBo.getTenantId()); log.info("用户不存在:{},租户id:{},需要进行注册", remoteUserBo.getUserName(), remoteUserBo.getTenantId());
thirdUserId = remoteUserService.getUserInfo(remoteUserBo.getUserName(), remoteUserBo.getTenantId()).getUserId(); }
if (thirdUserId == null) {
try {
thirdUserId = remoteUserService.registerUserInfo(remoteUserBo);
} catch (Exception e) {
log.info("用户已存在:{},租户id:{}", remoteUserBo.getUserName(), remoteUserBo.getTenantId());
thirdUserId = remoteUserService.getUserInfo(remoteUserBo.getUserName(), remoteUserBo.getTenantId(), remoteUserBo.getUserType()).getUserId();
}
} }
} }
Long memberId = null; Long memberId = null;
......
...@@ -14,6 +14,7 @@ import org.dromara.auth.service.SysLoginService; ...@@ -14,6 +14,7 @@ import org.dromara.auth.service.SysLoginService;
import org.dromara.common.core.constant.Constants; import org.dromara.common.core.constant.Constants;
import org.dromara.common.core.constant.GlobalConstants; import org.dromara.common.core.constant.GlobalConstants;
import org.dromara.common.core.enums.LoginType; import org.dromara.common.core.enums.LoginType;
import org.dromara.common.core.enums.UserType;
import org.dromara.common.core.exception.user.CaptchaException; import org.dromara.common.core.exception.user.CaptchaException;
import org.dromara.common.core.exception.user.CaptchaExpireException; import org.dromara.common.core.exception.user.CaptchaExpireException;
import org.dromara.common.core.utils.MessageUtils; import org.dromara.common.core.utils.MessageUtils;
...@@ -67,7 +68,7 @@ public class PasswordAuthStrategy implements IAuthStrategy { ...@@ -67,7 +68,7 @@ public class PasswordAuthStrategy implements IAuthStrategy {
validateCaptcha(tenantId, username, code, uuid); validateCaptcha(tenantId, username, code, uuid);
} }
LoginUser loginUser = TenantHelper.dynamic(tenantId, () -> { LoginUser loginUser = TenantHelper.dynamic(tenantId, () -> {
LoginUser user = remoteUserService.getUserInfo(username, tenantId); LoginUser user = remoteUserService.getUserInfo(username, tenantId, UserType.SYS_USER.getUserType());
loginService.checkLogin(LoginType.PASSWORD, tenantId, username, () -> !BCrypt.checkpw(password, user.getPassword())); loginService.checkLogin(LoginType.PASSWORD, tenantId, username, () -> !BCrypt.checkpw(password, user.getPassword()));
return user; return user;
}); });
......
...@@ -51,6 +51,7 @@ ...@@ -51,6 +51,7 @@
<module>ruoyi-common-allPay</module> <module>ruoyi-common-allPay</module>
<module>ruoyi-common-mall</module> <module>ruoyi-common-mall</module>
<module>ruoyi-common-yudao-mybatis</module> <module>ruoyi-common-yudao-mybatis</module>
<module>ruoyi-common-51weishi</module>
</modules> </modules>
<artifactId>ruoyi-common</artifactId> <artifactId>ruoyi-common</artifactId>
......
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common</artifactId>
<version>${revision}</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ruoyi-common-51weishi</artifactId>
<description>
ruoyi-common-51weishi 51旅游卫士模块
</description>
<dependencies>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-core</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.22</version>
</dependency>
</dependencies>
</project>
package org.dromara.common.weishi.base;
import jakarta.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
/**
* <p>IJPay 让支付触手可及,封装了微信支付、支付宝支付、银联支付常用的支付方式以及各种常用的接口。</p>
*
* <p>不依赖任何第三方 mvc 框架,仅仅作为工具使用简单快速完成支付模块的开发,可轻松嵌入到任何系统里。 </p>
*
* <p>IJPay 交流群: 723992875、864988890</p>
*
* <p>Node.js 版: <a href="https://gitee.com/javen205/TNWX">https://gitee.com/javen205/TNWX</a></p>
*
* <p>Http 工具类</p>
*
* @author Javen
*/
public class HttpKit {
private static AbstractHttpDelegate delegate = new DefaultHttpKit();
public static AbstractHttpDelegate getDelegate() {
return delegate;
}
public static void setDelegate(AbstractHttpDelegate delegate) {
HttpKit.delegate = delegate;
}
public static String readData(HttpServletRequest request) {
BufferedReader br = null;
try {
StringBuilder result = new StringBuilder();
br = request.getReader();
for (String line; (line = br.readLine()) != null; ) {
if (result.length() > 0) {
result.append("\n");
}
result.append(line);
}
return result.toString();
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 将同步通知的参数转化为Map
*
* @param request {@link HttpServletRequest}
* @return 转化后的 Map
*/
public static Map<String, String> toMap(HttpServletRequest request) {
Map<String, String> params = new HashMap<>();
Map<String, String[]> requestParams = request.getParameterMap();
for (String name : requestParams.keySet()) {
String[] values = requestParams.get(name);
String valueStr = "" ;
for (int i = 0; i < values.length; i++) {
valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + "," ;
}
params.put(name, valueStr);
}
return params;
}
}
/**
* 使用 huTool 实现的 Http 工具类
*
* @author Javen
*/
class DefaultHttpKit extends AbstractHttpDelegate {
}
package org.dromara.common.weishi.base;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.*;
public class PayKit {
/**
* 把所有元素排序
*
* @param params 需要排序并参与字符拼接的参数组
* @return 拼接后字符串
*/
public static String createLinkString(Map<String, Object> params) {
return createLinkString(params, false);
}
/**
* @param params 需要排序并参与字符拼接的参数组
* @param encode 是否进行URLEncoder
* @return 拼接后字符串
*/
public static String createLinkString(Map<String, Object> params, boolean encode) {
return createLinkString(params, "&", encode);
}
/**
* @param params 需要排序并参与字符拼接的参数组
* @param connStr 连接符号
* @param encode 是否进行URLEncoder
* @return 拼接后字符串
*/
public static String createLinkString(Map<String, Object> params, String connStr, boolean encode) {
return createLinkString(params, connStr, encode, false);
}
public static String createLinkString(Map<String, Object> params, String connStr, boolean encode, boolean quotes) {
List<String> keys = new ArrayList<>(params.keySet());
Collections.sort(keys);
StringBuilder content = new StringBuilder();
for (int i = 0; i < keys.size(); i++) {
String key = keys.get(i);
Object value = params.get(key);
// 参数的值为空不参与签名
if (Objects.isNull(value)) {
continue;
}
// 拼接时,不包括最后一个&字符
if (i == keys.size() - 1) {
if (quotes) {
content.append(key).append("=").append('"').append(encode ? urlEncode(value.toString()) : value).append('"');
} else {
content.append(key).append("=").append(encode ? urlEncode(value.toString()) : value);
}
} else {
if (quotes) {
content.append(key).append("=").append('"').append(encode ? urlEncode(value.toString()) : value).append('"').append(connStr);
} else {
content.append(key).append("=").append(encode ? urlEncode(value.toString()) : value).append(connStr);
}
}
}
return content.toString();
}
/**
* URL 编码
*
* @param src 需要编码的字符串
* @return 编码后的字符串
*/
public static String urlEncode(String src) {
return URLEncoder.encode(src, StandardCharsets.UTF_8).replace("+", "%20");
}
}
package org.dromara.common.weishi.base;
/**
* HTTP 请求方法枚举
*
* @author wenhe
*/
public enum RequestMethodEnum {
/**
* 上传实质是 post 请求
*/
UPLOAD("POST"),
/**
* post 请求
*/
POST("POST"),
/**
* get 请求
*/
GET("GET"),
/**
* put 请求
*/
PUT("PUT"),
/**
* delete 请求
*/
DELETE("DELETE"),
/**
* options 请求
*/
OPTIONS("OPTIONS"),
/**
* head 请求
*/
HEAD("HEAD"),
/**
* trace 请求
*/
TRACE("TRACE"),
/**
* connect 请求
*/
CONNECT("CONNECT"),
/**
* PATCH 请求
*/
PATCH("PATCH"),
;
private final String method;
RequestMethodEnum(String method) {
this.method = method;
}
@Override
public String toString() {
return this.method;
}
}
package org.dromara.common.weishi.common;
import lombok.Data;
/**
* @author hzh
* @date 2024-10-15
* @desc 响应实体
**/
@Data
public class ApiHttpResponse {
/**
* 返回消息提示
*/
private String ResultMsg;
/**
* 返回代码
*/
private int ResultTp;
/**
* 返回数据
*/
private String Data;
}
package org.dromara.common.weishi.common;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* code返回值
*
* @author wenhe
*/
@Getter
@AllArgsConstructor
public enum Code {
/**
* 成功
*/
SUCCESS(0, "成功");
private final Integer code;
private final String message;
}
package org.dromara.common.weishi.common;
import lombok.*;
import lombok.experimental.Accessors;
import java.util.List;
import java.util.Map;
/**
* @author hzh
* @date 2024-10-18
* @desc 分页信息
**/
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class PageInfo<T> {
/**
* 额外参数
*/
private Map<String, Object> map;
/**
* 总记录数
*/
private Integer total;
/**
* 总页数
*/
private Integer pages;
/**
* 当前页数
*/
private Integer pageNum;
/**
* 每页显示的数量
*/
private Integer count;
/**
* 结果集合
*/
private List<T> list;
}
package org.dromara.common.weishi.config;
/**
* @author wenhe
*/
public interface UserConfig {
/**
* 用户名
*/
String USERNAME = "testuser";
/**
* 密码
*/
String PASSWORD = "Abc123.";
}
package org.dromara.common.weishi.constant;
import lombok.AllArgsConstructor;
/**
* @author wenhe
*/
@AllArgsConstructor
public enum IDType {
I("身份证", "I"),
E("信用代码", "E"),
P("护照", "P"),
C("中国护照", "C"),
F("外国护照", "F"),
H("港澳通行证", "H"),
M("港澳居民证", "M"),
T("台湾通行证", "T"),
W("台湾居民证", "W"),
J("军官证", "J"),
B("出生证", "B"),
Y("永居证", "Y"),
O("其他", "O");
private final String key;
private final String value;
}
package org.dromara.common.weishi.constant;
import lombok.AllArgsConstructor;
/**
* @author wenhe
*/
@AllArgsConstructor
public enum PersonType {
B("都支持", "B"),
E("企业", "E"),
P("个人", "P");
private final String key;
private final String value;
}
package org.dromara.common.weishi.constant;
import lombok.AllArgsConstructor;
/**
* @author wenhe
*/
@AllArgsConstructor
public enum Sex {
M("男", "M"),
F("男", "F"),
U("未知", "U");
private final String key;
private final String value;
}
package org.dromara.common.weishi.enums;
import java.util.Arrays;
import java.util.Optional;
/**
* API枚举接口
*
* @author hzh
*/
public interface ApiEnum {
/**
* 根据 url 获取枚举值
*
* @param enumClass 枚举class
* @param url url
* @param <E> 枚举类
* @return 枚举值
*/
static <E extends Enum<?> & ApiEnum> Optional<E> urlOf(Class<E> enumClass, String url) {
return Arrays.stream(enumClass.getEnumConstants()).filter(e -> e.getUrl().equals(url)).findFirst();
}
/**
* 获取枚举URL
*
* @return 枚举编码
*/
String getUrl();
/**
* 获取详细的描述信息
*
* @return 描述信息
*/
String getDesc();
}
package org.dromara.common.weishi.enums;
/**
* 获取可用域名
*
* @author wenhe
*/
public interface Domain {
/**
* 获取域名
*
* @return 返回域名
*/
String getDomain();
}
package org.dromara.common.weishi.enums;
/**
* 域名枚举
*
* @author wenhe
*/
public enum DomainEnum implements Domain {
/**
* 测试域名
*/
TEST("https://beta.51weishi.com:5005"),
/**
* 生产域名
*/
PROD("https://insure.51weishi.com");
/**
* 域名
*/
private final String domain;
DomainEnum(String domain) {
this.domain = domain;
}
@Override
public String getDomain() {
return domain;
}
@Override
public String toString() {
return domain;
}
}
package org.dromara.common.weishi.enums.auth;
import org.dromara.common.weishi.enums.ApiEnum;
/**
* 认证接口
*
* @author wenhe
*/
public enum AuthApiEnum implements ApiEnum {
/**
* 获取AccessToken接口
*/
AUTHORIZE("/api/v1/account/authorize", "获取AccessToken接口"),
/**
* 刷新AccessToken接口
*/
REFRESH("/api/v1/account/refresh", "刷新AccessToken接口");
/**
* 接口URL
*/
private final String url;
/**
* 接口描述
*/
private final String desc;
AuthApiEnum(String url, String desc) {
this.url = url;
this.desc = desc;
}
/**
* 获取枚举URL
*
* @return 枚举编码
*/
@Override
public String getUrl() {
return url;
}
/**
* 获取详细的描述信息
*
* @return 描述信息
*/
@Override
public String getDesc() {
return desc;
}
@Override
public String toString() {
return url;
}
}
package org.dromara.common.weishi.enums.insure;
import org.dromara.common.weishi.enums.ApiEnum;
/**
* 保单接口
*
* @author wenhe
*/
public enum InsureApiEnum implements ApiEnum {
/**
* 承保接口
*/
APPLY("/api/v1/insure/apply", "承保接口"),
/**
* 核保接口(请求参数同承保接口)
*/
PROPOSAL("/api/v1/insure/proposal", "核保接口(请求参数同承保接口)只是验证客户是否可以投保(包括旅游卫士和保司验证),并不会生成保单,但是部分保司并不支持核保操作"),
/**
* 签单接口
*/
ISSUE("/api/v1/insure/issue/{OrderNum}", "签单接口"),
/**
* 订单撤单接口
*/
CANCEL("/api/v1/order/insure/{orderNum}", "订单撤单接口"),
/**
* 保单撤单接口
*/
POLICY_CANCEL("/api/v1/insure/withdraw/policy/{policyNum}", "保单撤单接口"),
/**
* 根据订单号下载保单
*/
INSURE_DOWNLOAD("/api/v1/insure/download/order/{num}", "根据订单号下载保单"),
/**
* 获取投/被保险人申明接口
*/
AVOW_LIST("/api/v1/insurer/1/avow/list", "获取投/被保险人申明接口"),
;
/**
* 接口URL
*/
private final String url;
/**
* 接口描述
*/
private final String desc;
InsureApiEnum(String url, String desc) {
this.url = url;
this.desc = desc;
}
/**
* 获取枚举URL
*
* @return 枚举编码
*/
@Override
public String getUrl() {
return url;
}
/**
* 获取详细的描述信息
*
* @return 描述信息
*/
@Override
public String getDesc() {
return desc;
}
@Override
public String toString() {
return url;
}
}
package org.dromara.common.weishi.enums.product;
import org.dromara.common.weishi.enums.ApiEnum;
/**
* 产品接口
*
* @author wenhe
*/
public enum ProductApiEnum implements ApiEnum {
/**
* 产品列表接口
*/
PRODUCT_LIST("/api/v1/insure/products", "产品列表接口"),
/**
* 产品详情接口
*/
PRODUCT_DETAIL("/api/v1/insure/product/{productId}/view", "产品详情接口"),
/**
* 获取保险公司相关文档接口
*/
ANNEX("/api/v1/product/{id}/annex/{annexTp}", "获取保险公司相关文档接口"),;
/**
* 接口URL
*/
private final String url;
/**
* 接口描述
*/
private final String desc;
ProductApiEnum(String url, String desc) {
this.url = url;
this.desc = desc;
}
/**
* 获取枚举URL
*
* @return 枚举编码
*/
@Override
public String getUrl() {
return url;
}
/**
* 获取详细的描述信息
*
* @return 描述信息
*/
@Override
public String getDesc() {
return desc;
}
@Override
public String toString() {
return url;
}
}
package org.dromara.common.weishi.exception;
import java.io.Serial;
/**
* @author hzh
* @date 2025-05-12
**/
public class WeishiException extends RuntimeException{
@Serial
private static final long serialVersionUID = 1L;
public WeishiException(String message) {
super(message);
}
}
/**
* <p>IJPay 让支付触手可及,封装了微信支付、支付宝支付、银联支付常用的支付方式以及各种常用的接口。</p>
*
* <p>不依赖任何第三方 mvc 框架,仅仅作为工具使用简单快速完成支付模块的开发,可轻松嵌入到任何系统里。 </p>
*
* <p>IJPay 交流群: 723992875、864988890</p>
*
* <p>Node.js 版: <a href="https://gitee.com/javen205/TNWX">https://gitee.com/javen205/TNWX</a></p>
*
* <p>Model 公用方法</p>
*
* @author Javen
*/
package org.dromara.common.weishi.model;
import cn.hutool.core.util.StrUtil;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
public class BaseModel {
/**
* 将建构的 builder 转为 Map
*
* @return 转化后的 Map
*/
public Map<String, String> toMap() {
String[] fieldNames = getFiledNames(this);
HashMap<String, String> map = new HashMap<String, String>(fieldNames.length);
for (String name : fieldNames) {
String value = (String) getFieldValueByName(name, this);
if (StrUtil.isNotEmpty(value)) {
map.put(name, value);
}
}
return map;
}
/**
* 获取属性名数组
*
* @param obj 对象
* @return 返回对象属性名数组
*/
public String[] getFiledNames(Object obj) {
Field[] fields = obj.getClass().getDeclaredFields();
String[] fieldNames = new String[fields.length];
for (int i = 0; i < fields.length; i++) {
fieldNames[i] = fields[i].getName();
}
return fieldNames;
}
/**
* 根据属性名获取属性值
*
* @param fieldName 属性名称
* @param obj 对象
* @return 返回对应属性的值
*/
public Object getFieldValueByName(String fieldName, Object obj) {
try {
String firstLetter = fieldName.substring(0, 1).toUpperCase();
String getter = new StringBuffer().append("get")
.append(firstLetter)
.append(fieldName.substring(1))
.toString();
Method method = obj.getClass().getMethod(getter);
return method.invoke(obj);
} catch (Exception e) {
return null;
}
}
}
package org.dromara.common.weishi.model.req;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
import java.util.List;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ApplyRequest {
/**
* 流水号,幂等且唯一不能重复
*/
private String BatchNum;
/**
* 产品计划代码,需联系客户经理提供
*/
private String ProductNum;
/**
* 保单生效时间,格式为YYYY-MM-DD HH:MM:SS
*/
private String BeginDate;
/**
* 保单终止时间,格式为YYYY-MM-DD HH:MM:SS
*/
private String EndDate;
/**
* 旅行目的地
*/
private String TourDest;
/**
* 旅行团编号/航班号
*/
private String TourNum;
/**
* 标准保费合计,是Units中所有标准保费的总和
*/
private BigDecimal StdPremium;
/**
* 实收保费合计,是Units中所有实收保费的总和
*/
private BigDecimal ActPremium;
/**
* 投保单元列表,每个投保必须包含一个以上投保单元,一次投保多个被保险人且要求单人保单时此字段为多个元素,否则为单个元素
*/
private List<InsureUnit> Units;
/**
* 投保可选参数
*/
private Options Options;
/**
* 支付参数,在余额不足时需要此参数
*/
private PaymentOptions PaymentOptions;
/**
* 发票信息,需要开票时填写
*/
private Taxpayer Taxpayer;
@Data
public static class InsureUnit {
/**
* 投保人信息,若未指定投保人,默认选取第一个成年人作为投保人
*/
private PolicyHolder PolicyHolder;
/**
* 被保人列表
*/
private List<Insurant> Insureds;
}
@Data
public static class PolicyHolder {
/**
* 投保人姓名/名称
*/
private String Name;
/**
* 投保人性别
*/
private String Gender;
/**
* 证件类型,参考字段枚举
*/
private String IDTp;
/**
* 证件代码
*/
private String IDNum;
/**
* 出生日期
*/
private String Birthday;
/**
* 手机号码
*/
private String Mobile;
}
@Data
public static class Insurant {
/**
* 被保险人姓名
*/
private String Name;
/**
* 性别,M代表男,F代表女,U代表未知
*/
private String Gender;
/**
* 证件类型,参考字段枚举
*/
private String IDTp;
/**
* 证件号码
*/
private String IDNum;
/**
* 出生日期
*/
private String Birthday;
/**
* 手机号码
*/
private String Mobile;
/**
* 与投保人关系,参考字段枚举
*/
private String RelationTp;
/**
* 标准保费
*/
private BigDecimal StdPremium;
/**
* 实收保费
*/
private BigDecimal ActPremium;
}
@Data
public static class PaymentOptions {
/**
* 支付通道类型,固定传11
*/
private String PaymentTp;
/**
* 支付场景类型,固定传1
*/
private String SceneTp;
}
@Data
public static class Taxpayer {
/**
* 企业名称
*/
private String TaxpayerName;
/**
* 信用代码
*/
private String TaxpayerNum;
/**
* 企业开户银行
*/
private String TaxpayerBank;
/**
* 银行账户
*/
private String TaxpayerAccount;
/**
* 税务登记电话
*/
private String TaxpayerTelephone;
/**
* 税务登记地址
*/
private String TaxpayerAddr;
}
@Data
public static class Options {
/**
* 是否指定投保人
*/
private Boolean FixedHolder;
/**
* 投保人类型,P代表个人,E代表企业
*/
private String HolderTp;
/**
* 是否为单人保单
*/
private Boolean PersonalPol;
/**
* 是否合并保单文件
*/
private Boolean Merged;
/**
* 部分失败时是否自动保存到草稿箱
*/
private Boolean AutoDraft;
/**
* 是否显示投保关系
*/
private Boolean ShowRel;
}
}
package org.dromara.common.weishi.model.req;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
public class AuthRequest {
/**
* 用户名
*/
private String username;
/**
* 密码
*/
private String password;
}
package org.dromara.common.weishi.model.req;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
import java.util.List;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ProposalRequest {
/**
* 流水号,幂等性字段,唯一不能重复
*/
private String BatchNum;
/**
* 产品计划代码,联系客户经理提供
*/
private String ProductNum;
/**
* 保单生效时间,格式:YYYY-MM-DD HH:MM:SS
*/
private String BeginDate;
/**
* 保单终止时间,格式:YYYY-MM-DD HH:MM:SS
*/
private String EndDate;
/**
* 旅行目的地
*/
private String TourDest;
/**
* 旅行团编号/航班号
*/
private String TourNum;
/**
* 标准保费合计,Units中所有标准保费合计
*/
private BigDecimal StdPremium;
/**
* 实收保费合计,Units中所有实收保费合计
*/
private BigDecimal ActPremium;
/**
* 投保单元列表,每个投保必须有一个以上投保单元
*/
private List<InsureUnit> Units;
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class InsureUnit {
/**
* 投保人信息,未指定投保人时默认选取第一个成年人作为投保人
*/
private PolicyHolder PolicyHolder;
/**
* 被保人列表
*/
private List<Insurant> Insureds;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class PolicyHolder {
/**
* 投保人姓名/名称
*/
private String Name;
/**
* 投保人性别
*/
private String Gender;
/**
* 证件类型:I-身份证,P-护照,J-军官证,K-通行证,T-台湾通行证,G-港澳通行证,O-其他,E-统一信用代码
*/
private String IDTp;
/**
* 证件代码
*/
private String IDNum;
/**
* 出生日期,格式:yyyy-MM-dd
*/
private String Birthday;
/**
* 手机号码
*/
private String Mobile;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class Insurant {
/**
* 被保险人姓名
*/
private String Name;
/**
* 性别:M-男,F-女,U-未知
*/
private String Gender;
/**
* 证件类型:I-身份证,P-护照,J-军官证,K-通行证,T-台湾通行证,G-港澳通行证,O-其他,E-统一信用代码
*/
private String IDTp;
/**
* 证件号码
*/
private String IDNum;
/**
* 出生日期,格式:yyyy-MM-dd
*/
private String Birthday;
/**
* 手机号码
*/
private String Mobile;
/**
* 与投保人关系
*/
private String RelationTp;
/**
* 标准保费
*/
private BigDecimal StdPremium;
/**
* 实收保费
*/
private BigDecimal ActPremium;
}
}
package org.dromara.common.weishi.model.res;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* 用于表示保险公司相关资源路径信息的实体类
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class AnnexResponse {
/**
* 保险公司相关文件在云端的路径,当前指向一个PDF文件,可能是保险条款或其他重要文档
*/
private String CloudPath;
/**
* 包含多个页面链接的列表,这些链接当前均指向图片文件,可能是保险相关的宣传图、说明图等
*/
private List<String> Pages;
}
package org.dromara.common.weishi.model.res;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
import java.util.List;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ApplyResponse {
/**
* 流水号
*/
private String BatchNum;
/**
* 产品代码
*/
private String ProductNum;
/**
* 保单生效时间
*/
private String BeginDate;
/**
* 保单终止时间
*/
private String EndDate;
/**
* 旅行团编号
*/
private String TourNum;
/**
* 旅行目的地
*/
private String TourDest;
/**
* 发票大类,p - 个人,E - 企业,U - 未知
*/
private String InvoiceKind;
/**
* 开具发票的类型
*/
private String InvoiceTp;
/**
* 标准保费
*/
private BigDecimal StdPremium;
/**
* 实收保费
*/
private BigDecimal ActPremium;
/**
* 投保单元列表
*/
private List<Unit> Units;
/**
* 投保数据格式,P:图片, D - 数据
*/
private String DataTp;
/**
* 订单号
*/
private String OrderNum;
/**
* 计划ID
*/
private int PlanID;
/**
* 返回代码,0:成功,其他:失败
*/
private int ResultTp;
/**
* 返回内容
*/
private String ResultMsg;
/**
* 保单下载链接
*/
private String PolicyUrl;
/**
* 订单下载链接
*/
private String OrderUrl;
@Data
public static class Unit {
/**
* 投保人信息,投保人年龄必须大于18周岁
*/
private PolicyHolder PolicyHolder;
/**
* 被保人列表
*/
private List<Insured> Insureds;
/**
* 标准保费,Insureds下总被保险人数*标准单价
*/
private BigDecimal StdPremium;
/**
* 实收保费
*/
private BigDecimal ActPremium;
/**
* 保单号,投保时返回
*/
private String PolicyNum;
/**
* 返回代码,0:成功,其他:失败
*/
private int ResultTp;
/**
* 返回消息
*/
private String ResultMsg;
}
@Data
public static class PolicyHolder {
/**
* 投保人姓名/名称
*/
private String Name;
/**
* 投保人性别
*/
private String Gender;
/**
* 证件类型,参考字段枚举
*/
private String IDTp;
/**
* 证件代码
*/
private String IDNum;
/**
* 出生日期
*/
private String Birthday;
/**
* 手机号码
*/
private String Mobile;
}
@Data
public static class Insured {
/**
* 被保险人姓名
*/
private String Name;
/**
* 性别,M男/F女/U未知
*/
private String Gender;
/**
* 证件类型,参考字段枚举
*/
private String IDTp;
/**
* 证件号码
*/
private String IDNum;
/**
* 出生日期
*/
private String Birthday;
/**
* 手机号码
*/
private String Mobile;
/**
* 与投保人关系,参考字段枚举
*/
private String RelationTp;
/**
* 标准保费
*/
private BigDecimal StdPremium;
/**
* 实收保费
*/
private BigDecimal ActPremium;
/**
* 被保险人ID
*/
private int InsuredID;
}
}
package org.dromara.common.weishi.model.res;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class AuthResponse {
/**
* 访问token
*/
private String access_token;
/**
* 超时时间
*/
private int expires_in;
/**
* 令牌类型
*/
private String token_type;
/**
* 刷新token
*/
private String refresh_token;
/**
* 用户id
*/
private int user_id;
/**
* 用户名
*/
private String user_name;
}
package org.dromara.common.weishi.model.res;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author wenhe
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class AvowListResponse {
/**
* 唯一标识 ID
*/
private int ID;
/**
* 保险相关的声明文本
*/
private String AvowText;
/**
* 表示是否加粗,false 表示不加粗
*/
private boolean Bold;
/**
* 表示是否有颜色相关设置,false 表示无特殊颜色设置
*/
private boolean Color;
/**
* 排序字段,用于指定顺序
*/
private int OrderBy;
/**
* 保险公司 ID
*/
private int InsurerID;
}
package org.dromara.common.weishi.model.res;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
import java.util.List;
/**
* @author wenhe
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class IssueResponse {
/**
* 渠道类型,默认是B
*/
private String ChannelTp;
/**
* 流水号
*/
private String BatchNum;
/**
* 产品代码
*/
private String ProductNum;
/**
* 保单生效时间,格式:yyyy-MM-dd HH:mm:ss
*/
private String BeginDate;
/**
* 保单终止时间,格式:yyyy-MM-dd HH:mm:ss
*/
private String EndDate;
/**
* 旅行团编号
*/
private String TourNum;
/**
* 旅行目的地
*/
private String TourDest;
/**
* 开具发票的类型
*/
private String InvoiceTp;
/**
* 标准保费
*/
private BigDecimal StdPremium;
/**
* 实收保费
*/
private BigDecimal ActPremium;
/**
* 投保单元列表
*/
private List<Unit> Units;
/**
* 投保数据格式
*/
private String DataTp;
/**
* 订单号
*/
private String OrderNum;
/**
* 返回代码,0表示成功
*/
private int ResultNum;
/**
* 付款链接,余额不足时返回
*/
private String PaymentUrl;
/**
* 付款单号
*/
private String PaymentNum;
/**
* 付款金额
*/
private BigDecimal PaymentAmt;
/**
* 返回代码
*/
private String ResultTp;
/**
* 提示文本
*/
private String ResultMsg;
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class Unit {
/**
* 投保人信息,年龄必须大于18周岁
*/
private PolicyHolder PolicyHolder;
/**
* 被保人列表
*/
private List<Insured> Insureds;
/**
* 标准保费,Insureds下总被保险人数*标准单价
*/
private BigDecimal StdPremium;
/**
* 实收保费
*/
private BigDecimal ActPremium;
/**
* 标准退款金额
*/
private BigDecimal StdRefund;
/**
* 实际退款金额
*/
private BigDecimal ActRefund;
/**
* 保单号,成功时返回
*/
private String PolicyNum;
/**
* 返回代码,0表示成功
*/
private String ResultTp;
/**
* 提示文本
*/
private String ResultMsg;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class PolicyHolder {
/**
* 投保人姓名/名称
*/
private String Name;
/**
* 投保人性别
*/
private String Gender;
/**
* 证件类型:I-身份证,P-护照,J-军官证,K-通行证,T-台湾通行证,G-港澳通行证,O-其他,E-统一信用代码
*/
private String IDTp;
/**
* 证件代码
*/
private String IDNum;
/**
* 出生日期,格式:yyyy-MM-dd
*/
private String Birthday;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class Insured {
/**
* 被保险人姓名
*/
private String Name;
/**
* 性别:M-男,F-女,U-未知
*/
private String Gender;
/**
* 证件类型:I-身份证,P-护照,J-军官证,K-通行证,T-台湾通行证,G-港澳通行证,O-其他,E-统一信用代码
*/
private String IDTp;
/**
* 证件号码
*/
private String IDNum;
/**
* 出生日期,格式:yyyy-MM-dd
*/
private String Birthday;
/**
* 与投保人关系
*/
private String RelationTp;
/**
* 标准保费
*/
private BigDecimal StdPremium;
/**
* 实收保费
*/
private BigDecimal ActPremium;
/**
* 标准退款金额
*/
private BigDecimal StdRefund;
/**
* 实际退款金额
*/
private BigDecimal ActRefund;
}
}
package org.dromara.common.weishi.model.res;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ProductResponse {
/**
* 产品ID
*/
private int ProductID;
/**
* 产品名称
*/
private String ProductName;
/**
* 产品编码
*/
private String ProductNum;
/**
* 保险公司
*/
private String InsureAbbr;
/**
* 保险公司ID,用于唯一标识保险公司
*/
private Integer InsurerID;
/**
* 产品子类,D-境内旅游, O-出境旅游, W-境内出境, V-签证保险, A-航意航延, T-其他类型
*/
private String ProductSub;
/**
* 区间描述
*/
private String PeriodText;
/**
* 承保区域
*/
private String InsureArea;
/**
* 承保年龄
*/
private String InsureAge;
/**
* 保单条款Pdf的链接
*/
private String ClauseUrl;
/**
* 计划列表
*/
private List<Plan> Plans;
/**
* 包括的计划列表
*/
private List<Integer> IncludePlans;
/**
* 保障内容显示表头
*/
private List<List<HeadRow>> HeadRows;
/**
* 保障内容
*/
private List<List<ViewRow>> ViewRows;
/**
* 费率表年龄视图
*/
private List<AgeView> AgeViews;
/**
* QrBase64字段(根据你的数据结构中此字段无更多说明,按原样定义)
*/
private String QrBase64;
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class Plan {
/**
* 计划ID
*/
private Integer PlanID;
/**
* 计划名称
*/
private String PlanName;
/**
* 计划编码
*/
private String PlanNum;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class HeadRow {
/**
* 文本内容
*/
private String text;
/**
* 跨行数,可为空
*/
private Integer rowspan;
/**
* 跨列数,可为空
*/
private Integer colspan;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class ViewRow {
/**
* 保障内容/金额
*/
private String text;
/**
* 跨列数,可为空
*/
private Integer colspan;
/**
* 描述
*/
private String desc;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class AgeView {
/**
* 费率表年龄文本
*/
private String text;
/**
* 跨列数,可为空
*/
private Integer colspan;
/**
* 费率集合
*/
private List<List<AgeViewRow>> rows;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class AgeViewRow {
/**
* 期间描述
*/
private String text;
/**
* 跨列数,可为空
*/
private Integer colspan;
}
}
package org.dromara.common.weishi.model.res;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* 保险产品列表响应数据的实体类,用于封装保险产品相关信息的响应结果。
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ProductsResponse {
/**
* 保险公司ID,用于唯一标识保险公司
*/
private Integer InsurerID;
/**
* 保险公司简称,方便展示和识别保险公司
*/
private String InsurerAbbr;
/**
* 产品ID,用于唯一标识保险产品
*/
private Integer ProductID;
/**
* 产品名称,描述保险产品的具体名称
*/
private String ProductName;
/**
* 承保区域,说明该保险产品的保障覆盖区域
*/
private String InsureArea;
/**
* 保费描述,展示保险产品保费的相关信息,如价格范围
*/
private String PremText;
/**
* 区间描述,说明保险产品保障期限的区间信息
*/
private String PeriodText;
/**
* 保司信息披露文件链接,可用于获取保险公司的详细信息披露文件
*/
private String DisclosureUrl;
/**
* 保司信息披露图片集合,包含保险公司信息披露的相关图片链接列表
*/
private List<String> DisclosurePages;
/**
* 客户告知书链接,指向客户告知书的文件链接
*/
private String NotificationUrl;
/**
* 客户告知书图片集合,包含客户告知书的相关图片链接列表
*/
private List<String> NotificationPages;
/**
* 支持的证件类型列表,表明购买该保险产品时可使用的证件类型
*/
private List<String> SupportIdTp;
/**
* 保险计划列表,包含该保险产品下的多个具体保险计划
*/
private List<Plan> Plans;
/**
* 产品标签集合,可用于对保险产品进行分类或标记,目前可忽略此字段
*/
private List<Integer> Tags;
/**
* 保险计划的内部类,包含保险计划的详细配置信息。
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class Plan {
/**
* 产品ID,关联所属的保险产品
*/
private Integer ProductID;
/**
* 产品名称,所属保险产品的名称
*/
private String ProductName;
/**
* 计划ID,用于唯一标识该保险计划
*/
private Integer PlanID;
/**
* 计划代码,是保险计划的编码,方便内部管理和识别
*/
private String PlanNum;
/**
* 计划名称,描述保险计划的具体名称
*/
private String PlanName;
/**
* 允许的投保人类型,B表示都支持,E表示企业,P表示个人等
*/
private String HolderTp;
/**
* 产品数据类型,D表示数据,P表示图片,B表示都支持
*/
private String DataTp;
/**
* 费率类型,Q表示额定,T表示表定
*/
private String RatioTp;
/**
* 提前投保天数,即需要提前多少天进行投保操作
*/
private Integer Prepend;
/**
* 提前投保天数的最小值,用于限制提前投保的最早时间
*/
private Integer PrependMin;
/**
* 当天生效时间延迟时间,单位为分钟,即投保后延迟多久生效
*/
private Integer Minutes;
/**
* 当天生效时间延迟时间的最小值,用于限制生效时间延迟的最短时间
*/
private Integer MinutesMin;
/**
* 是否支持移动端适配,表明该保险计划在移动端的使用适配情况
*/
private Boolean MobileAdapt;
/**
* 最小被保险人人数,规定该保险计划最少可保障的被保险人数量
*/
private Integer InsuredMin;
/**
* 最大被保险人人数,规定该保险计划最多可保障的被保险人数量
*/
private Integer InsuredMax;
/**
* 产品支持时间选择,表明是否支持选择具体的保障时间
*/
private Boolean TimeSupport;
/**
* 是否支持受益人设置,说明该保险计划是否允许指定受益人
*/
private Boolean BeneSupport;
/**
* 产品是否与职业相关,表明职业因素是否会影响保险计划的相关条款
*/
private Boolean OccupWith;
/**
* 支持最大的职业等级,用于限制可参保的职业等级上限
*/
private Double MaxOccup;
/**
* 产品是否与社保相关,说明社保因素是否会对保险计划产生影响
*/
private Boolean SocialWith;
/**
* 产品是否需要健康告知,表明购买保险时是否需要提供健康状况信息
*/
private Boolean HealthWith;
/**
* 是否固定期间,说明保险计划的保障期限是否固定
*/
private Boolean PeriodFixed;
/**
* 期间单位,Y表示年,M表示月,D表示日,用于确定保障期限的时间单位
*/
private String PeriodUnit;
/**
* 最小保障期间,规定该保险计划的最短保障期限
*/
private Integer PeriodMin;
/**
* 最大保障期间,规定该保险计划的最长保障期限
*/
private Integer PeriodMax;
/**
* 默认周期,当未选择其他保障期限时的默认保障周期
*/
private Integer PeriodDefault;
/**
* 是否固定选项,用于描述保险计划的选项是否固定不可更改
*/
private Boolean OptionFixed;
/**
* 费率,用于计算保险费用的比率
*/
private Double Ratio;
/**
* 最小年龄,规定该保险计划可参保的最小年龄
*/
private Integer AgeMin;
/**
* 最小年龄单位,D表示天,Y表示年龄,用于确定最小年龄的计算单位
*/
private String AgeMinUnit;
/**
* 最大年龄,规定该保险计划可参保的最大年龄
*/
private Integer AgeMax;
/**
* 最大年龄单位,D表示天,Y表示年龄,用于确定最大年龄的计算单位
*/
private String AgeMaxUnit;
/**
* 条款Url,指向保险计划条款的文件链接,可用于查看详细条款
*/
private String ClauseUrl;
/**
* 折扣模式,S表示标准折扣,A表示实收折扣
*/
private String DiscountTp;
/**
* 产品折扣,用于计算实际保费时的折扣比例
*/
private Double Discount;
/**
* 费率表,包含不同保障期限、年龄等条件下的保费信息列表
*/
private List<Row> Rows;
/**
* 普通发票是否要求投保人,表明开具普通发票时对投保人的要求情况
*/
private Boolean OrdinaryHolder;
/**
* 是否提供增值税专用发票,说明该保险计划是否可开具增值税专用发票
*/
private Boolean SpecialAvaiable;
/**
* 是否是收藏计划,用于标识该保险计划是否被用户收藏
*/
private Boolean IsFavorite;
/**
* 标签列表,可用于对保险计划进行分类或标记,目前可忽略此字段
*/
private List<String> Tags;
}
/**
* 费率表项的内部类,包含特定条件下的保费信息。
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class Row {
/**
* 最小区间,在费率表中对应的保障期限的最小范围
*/
private Integer PeriodMin;
/**
* 最大区间,在费率表中对应的保障期限的最大范围
*/
private Integer PeriodMax;
/**
* 最小年龄,在该费率条件下可参保的最小年龄
*/
private Integer AgeMin;
/**
* 最小年龄单位,D表示天,Y表示年龄,用于确定最小年龄的计算单位
*/
private String AgeMinUnit;
/**
* 最大年龄,在该费率条件下可参保的最大年龄
*/
private Integer AgeMax;
/**
* 最大年龄单位,D表示天,Y表示年龄,用于确定最大年龄的计算单位
*/
private String AgeMaxUnit;
/**
* 保费金额,在该保障期限和年龄条件下对应的保险费用
*/
private Double Premium;
/**
* 是否包含社保,表明该保费计算是否包含社保因素
*/
private Boolean SocialIns;
/**
* 职业等级,在该费率条件下对应的职业等级,用于评估职业风险
*/
private Double OccupRank;
}
}
package org.dromara.common.weishi.model.res;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
@Data
public class ProposalResponse {
/**
* 流水号
*/
private String BatchNum;
/**
* 产品代码
*/
private String ProductNum;
/**
* 保单生效时间
*/
private String BeginDate;
/**
* 保单终止时间
*/
private String EndDate;
/**
* 旅行团编号
*/
private String TourNum;
/**
* 旅行目的地
*/
private String TourDest;
/**
* 发票大类,p-个人,E-企业,U-未知
*/
private String InvoiceKind;
/**
* 开具发票的类型
*/
private String InvoiceTp;
/**
* 标准保费
*/
private BigDecimal StdPremium;
/**
* 实收保费
*/
private BigDecimal ActPremium;
/**
* 投保单元列表
*/
private List<Unit> Units;
/**
* 投保数据格式,P-图片, D-数据
*/
private String DataTp;
/**
* 订单号,后续签单,下载,撤单需要用
*/
private String OrderNum;
/**
* 计划ID
*/
private int PlanID;
/**
* 返回代码,0:成功,其他:失败
*/
private int ResultTp;
/**
* 返回内容
*/
private String ResultMsg;
@Data
public static class Unit {
/**
* 投保人信息,投保人年龄必须大于18周岁
*/
private PolicyHolder PolicyHolder;
/**
* 被保人列表
*/
private List<Insured> Insureds;
/**
* 标准保费,Insureds下总被保险人数*标准单价
*/
private BigDecimal StdPremium;
/**
* 实收保费
*/
private BigDecimal ActPremium;
/**
* 核保单号,投保时返回
*/
private String PolicyNum;
/**
* 返回代码,0:成功,其他:失败
*/
private int ResultTp;
/**
* 返回消息
*/
private String ResultMsg;
}
@Data
public static class PolicyHolder {
/**
* 投保人姓名/名称
*/
private String Name;
/**
* 投保人性别
*/
private String Gender;
/**
* 证件类型,参考字段枚举
*/
private String IDTp;
/**
* 证件代码
*/
private String IDNum;
/**
* 出生日期
*/
private String Birthday;
/**
* 手机号码
*/
private String Mobile;
}
@Data
public static class Insured {
/**
* 被保险人姓名
*/
private String Name;
/**
* 性别,M男/F女/U未知
*/
private String Gender;
/**
* 证件类型,参考字段枚举
*/
private String IDTp;
/**
* 证件号码
*/
private String IDNum;
/**
* 出生日期
*/
private String Birthday;
/**
* 手机号码
*/
private String Mobile;
/**
* 与投保人关系,参考字段枚举
*/
private String RelationTp;
/**
* 标准保费
*/
private BigDecimal StdPremium;
/**
* 实收保费
*/
private BigDecimal ActPremium;
/**
* 被保险人ID
*/
private int InsuredID;
}
}
package org.dromara.common.weishi.model.res;
import lombok.Data;
/**
* @author wenhe
*/
@Data
public class TokenRefreshResponse {
/**
* 访问token
*/
private String access_token;
/**
* 超时时间,单位为秒
*/
private int expires_in;
/**
* 令牌类型
*/
private String token_type;
/**
* 刷新token
*/
private String refresh_token;
}
package org.dromara.common.weishi.service;
import org.dromara.common.weishi.model.req.ApplyRequest;
import org.dromara.common.weishi.model.req.ProposalRequest;
import org.dromara.common.weishi.model.res.*;
import java.util.List;
/**
* @author wenhe
*/
public interface WeishiService {
/**
* 认证接口
*
* @return 数据
*/
AuthResponse authorize();
/**
* 保险下单接口
*
* @param request 请求参数
* @return 响应数据
*/
ApplyResponse insureApply(ApplyRequest request);
/**
* 核保接口
*
* @param request 请求参数
* @return 响应数据
*/
ProposalResponse insureProposal(ProposalRequest request);
/**
* 签单接口
*
* @param orderNum 订单号
* @return 数据
*/
IssueResponse insureDetail(String orderNum);
/**
* 订单撤单接口
*
* @param orderNum 订单号
*/
void insureCancel(String orderNum);
/**
* 保单撤单接口
*
* @param policyNum 保单号
*/
void policyCancel(String policyNum);
/**
* 产品列表接口
*
* @return 产品列表
*/
List<ProductsResponse> productList();
/**
* 产品详情
*
* @param productId 产品id
* @return 产品详情
*/
ProductResponse productDetail(Integer productId);
/**
* 获取保险公司相关文档接口
* @param productId 产品id
* @param annexTp
* @return
*/
AnnexResponse annex(Integer productId,String annexTp);
}
package org.dromara.common.weishi.service.impl;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import org.dromara.common.weishi.Api;
import org.dromara.common.weishi.base.RequestMethodEnum;
import org.dromara.common.weishi.common.ApiHttpResponse;
import org.dromara.common.weishi.common.Code;
import org.dromara.common.weishi.config.UserConfig;
import org.dromara.common.weishi.enums.DomainEnum;
import org.dromara.common.weishi.enums.auth.AuthApiEnum;
import org.dromara.common.weishi.enums.insure.InsureApiEnum;
import org.dromara.common.weishi.enums.product.ProductApiEnum;
import org.dromara.common.weishi.exception.WeishiException;
import org.dromara.common.weishi.model.req.ApplyRequest;
import org.dromara.common.weishi.model.req.AuthRequest;
import org.dromara.common.weishi.model.req.ProposalRequest;
import org.dromara.common.weishi.model.res.*;
import org.dromara.common.weishi.service.WeishiService;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
* @author hzh
* @date 2025-05-12
**/
public class WeishiServiceImpl implements WeishiService {
@Override
public AuthResponse authorize() {
ApiHttpResponse res = Api.v1(RequestMethodEnum.POST,
DomainEnum.TEST.getDomain(),
AuthApiEnum.AUTHORIZE.getUrl(),
null,
JSON.toJSONString(
new AuthRequest()
.setUsername(UserConfig.USERNAME)
.setPassword(UserConfig.PASSWORD)
));
if (!Objects.equals(res.getResultTp(), Code.SUCCESS.getCode())) {
throw new WeishiException(res.getResultMsg());
}
return JSON.parseObject(res.getData(), AuthResponse.class);
}
@Override
public ApplyResponse insureApply(ApplyRequest request) {
ApiHttpResponse res = Api.v1(RequestMethodEnum.POST,
DomainEnum.TEST.getDomain(),
InsureApiEnum.APPLY.getUrl(),
getToken(),
JSON.toJSONString(request));
if (!Objects.equals(res.getResultTp(), Code.SUCCESS.getCode())) {
throw new WeishiException(res.getResultMsg());
}
return JSON.parseObject(res.getData(), ApplyResponse.class);
}
@Override
public ProposalResponse insureProposal(ProposalRequest request) {
ApiHttpResponse res = Api.v1(RequestMethodEnum.POST,
DomainEnum.TEST.getDomain(),
InsureApiEnum.PROPOSAL.getUrl(),
getToken(),
JSON.toJSONString(request));
if (!Objects.equals(res.getResultTp(), Code.SUCCESS.getCode())) {
throw new WeishiException(res.getResultMsg());
}
return JSON.parseObject(res.getData(), ProposalResponse.class);
}
@Override
public IssueResponse insureDetail(String orderNum) {
Map<String, Object> map = MapUtil.<String, Object>builder()
.put("OrderNum", orderNum)
.build();
ApiHttpResponse res = Api.v1(RequestMethodEnum.POST,
DomainEnum.TEST.getDomain(),
StrUtil.format(InsureApiEnum.ISSUE.getUrl(), map),
getToken(),
null);
if (!Objects.equals(res.getResultTp(), Code.SUCCESS.getCode())) {
throw new WeishiException(res.getResultMsg());
}
return JSON.parseObject(res.getData(), IssueResponse.class);
}
@Override
public void insureCancel(String orderNum) {
Map<String, Object> map = MapUtil.<String, Object>builder()
.put("OrderNum", orderNum)
.build();
ApiHttpResponse res = Api.v1(RequestMethodEnum.POST,
DomainEnum.TEST.getDomain(),
StrUtil.format(InsureApiEnum.CANCEL.getUrl(), map),
getToken(),
null);
if (!Objects.equals(res.getResultTp(), Code.SUCCESS.getCode())) {
throw new WeishiException(res.getResultMsg());
}
}
@Override
public void policyCancel(String policyNum) {
Map<String, Object> map = MapUtil.<String, Object>builder()
.put("policyNum", policyNum)
.build();
ApiHttpResponse res = Api.v1(RequestMethodEnum.POST,
DomainEnum.TEST.getDomain(),
StrUtil.format(InsureApiEnum.POLICY_CANCEL.getUrl(), map),
getToken(),
null);
if (!Objects.equals(res.getResultTp(), Code.SUCCESS.getCode())) {
throw new WeishiException(res.getResultMsg());
}
}
/**
* 获取token
*
* @return token
*/
private String getToken() {
return authorize().getAccess_token();
}
@Override
public List<ProductsResponse> productList() {
ApiHttpResponse res = Api.v1(RequestMethodEnum.GET,
DomainEnum.TEST.getDomain(),
ProductApiEnum.PRODUCT_LIST.getUrl(),
getToken(),
null);
if (!Objects.equals(res.getResultTp(), Code.SUCCESS.getCode())) {
throw new WeishiException(res.getResultMsg());
}
return JSON.parseArray(res.getData(), ProductsResponse.class);
}
@Override
public ProductResponse productDetail(Integer productId) {
Map<String, Object> map = MapUtil.<String, Object>builder()
.put("productId", productId)
.build();
ApiHttpResponse res = Api.v1(RequestMethodEnum.POST,
DomainEnum.TEST.getDomain(),
StrUtil.format(ProductApiEnum.PRODUCT_DETAIL.getUrl(), map),
getToken(),
null);
if (!Objects.equals(res.getResultTp(), Code.SUCCESS.getCode())) {
throw new WeishiException(res.getResultMsg());
}
return JSON.parseObject(res.getData(), ProductResponse.class);
}
@Override
public AnnexResponse annex(Integer productId, String annexTp) {
Map<String, Object> map = MapUtil.<String, Object>builder()
.put("productId", productId)
.put("annexTp", annexTp)
.build();
ApiHttpResponse res = Api.v1(RequestMethodEnum.POST,
DomainEnum.TEST.getDomain(),
StrUtil.format(ProductApiEnum.ANNEX.getUrl(), map),
getToken(),
null);
if (!Objects.equals(res.getResultTp(), Code.SUCCESS.getCode())) {
throw new WeishiException(res.getResultMsg());
}
return JSON.parseObject(res.getData(), AnnexResponse.class);
}
}
...@@ -299,6 +299,13 @@ ...@@ -299,6 +299,13 @@
<version>${revision}</version> <version>${revision}</version>
</dependency> </dependency>
<!-- 旅游卫士 -->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-51weishi</artifactId>
<version>${revision}</version>
</dependency>
</dependencies> </dependencies>
</dependencyManagement> </dependencyManagement>
</project> </project>
...@@ -19,7 +19,7 @@ public interface RegexConstants extends RegexPool { ...@@ -19,7 +19,7 @@ public interface RegexConstants extends RegexPool {
/** /**
* 权限标识必须符合 tool:build:list 格式,或者空字符串 * 权限标识必须符合 tool:build:list 格式,或者空字符串
*/ */
String PERMISSION_STRING = "^[a-zA-Z0-9_-]+:[a-zA-Z0-9_-]+:[a-zA-Z0-9_-]+(:[a-zA-Z0-9_-]+)?$"; String PERMISSION_STRING = "^(|null|([a-zA-Z0-9_-]+:[a-zA-Z0-9_-]+:[a-zA-Z0-9_-]+(:[a-zA-Z0-9_-]+)?)(,[a-zA-Z0-9_-]+:[a-zA-Z0-9_-]+:[a-zA-Z0-9_-]+(:[a-zA-Z0-9_-]+)?)*)$";
/** /**
* 身份证号码(后6位) * 身份证号码(后6位)
......
package org.dromara.common.mybatis.helper;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.apache.commons.collections4.CollectionUtils;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.SpringUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.enums.DataScopeType;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.system.api.RemoteDataScopeService;
import org.dromara.system.api.model.RoleDTO;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author hzh
* @date 2025-04-21
**/
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class CustomerDataPermissionHelper {
/**
* 是否需要过滤数据
*
* @return 是否需要过滤数据
*/
public static Boolean isNeedFilter() {
// 如果是超级管理员或租户管理员,则不过滤数据
if (LoginHelper.isSuperAdmin() || LoginHelper.isTenantAdmin()) {
return false;
}
List<RoleDTO> roles = LoginHelper.getLoginUser().getRoles();
for (RoleDTO role : roles) {
// 获取角色权限泛型
DataScopeType type = DataScopeType.findCode(role.getDataScope());
if (ObjectUtil.isNull(type)) {
throw new ServiceException("角色数据范围异常 => " + role.getDataScope());
}
// 全部数据权限直接返回
if (type == DataScopeType.ALL) {
return false;
}
}
return true;
}
public static Boolean isNeedFilterDeptId() {
List<RoleDTO> roles = LoginHelper.getLoginUser().getRoles();
for (RoleDTO role : roles) {
// 获取角色权限泛型
DataScopeType type = DataScopeType.findCode(role.getDataScope());
if (type == DataScopeType.CUSTOM || type == DataScopeType.DEPT || type == DataScopeType.DEPT_AND_CHILD) {
return true;
}
}
return false;
}
public static List<Long> getDeptIds() {
List<RoleDTO> roles = LoginHelper.getLoginUser().getRoles();
Long deptId = LoginHelper.getDeptId();
List<Long> deptIds = new ArrayList<>();
RemoteDataScopeService rdss = SpringUtils.getBean(RemoteDataScopeService.class);
for (RoleDTO role : roles) {
// 获取角色权限泛型
DataScopeType type = DataScopeType.findCode(role.getDataScope());
if (ObjectUtil.isNull(type)) {
throw new ServiceException("角色数据范围异常 => " + role.getDataScope());
}
if (type == DataScopeType.CUSTOM) {
deptIds.addAll(stringToListLong(rdss.getRoleCustom(role.getRoleId())));
} else if (type == DataScopeType.DEPT) {
deptIds.add(deptId);
} else if (type == DataScopeType.DEPT_AND_CHILD) {
deptIds.addAll(stringToListLong(rdss.getDeptAndChild(deptId)));
}
}
if (CollectionUtils.isEmpty(deptIds)) {
return List.of(-1L);
}
return deptIds;
}
public static List<Long> stringToListLong(String str) {
if (StringUtils.isBlank(str)) {
return List.of();
}
// 按逗号分割字符串为数组
String[] arr = StrUtil.splitToArray(str, ',');
// 将数组转换为List<Long>
List<Long> longList = CollUtil.newArrayList(arr).stream()
.map(Long::parseLong)
.collect(Collectors.toList());
return longList;
}
}
...@@ -37,6 +37,11 @@ ...@@ -37,6 +37,11 @@
<artifactId>ruoyi-api-resource</artifactId> <artifactId>ruoyi-api-resource</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-api-server</artifactId>
</dependency>
</dependencies> </dependencies>
</project> </project>
...@@ -33,4 +33,9 @@ public interface TransConstant { ...@@ -33,4 +33,9 @@ public interface TransConstant {
*/ */
String OSS_ID_TO_URL = "oss_id_to_url"; String OSS_ID_TO_URL = "oss_id_to_url";
/**
* 云上code转用户昵称
*/
String PERSON_CODE_TO_NICKNAME = "person_code_to_nickname";
} }
package org.dromara.common.translation.core.impl;
import lombok.AllArgsConstructor;
import org.apache.dubbo.config.annotation.DubboReference;
import org.dromara.common.translation.annotation.TranslationType;
import org.dromara.common.translation.constant.TransConstant;
import org.dromara.common.translation.core.TranslationInterface;
import org.dromara.server.api.RemoteServerService;
/**
* 用户名翻译实现
*
* @author Lion Li
*/
@AllArgsConstructor
@TranslationType(type = TransConstant.PERSON_CODE_TO_NICKNAME)
public class PersonCodeTranslationImpl implements TranslationInterface<String> {
@DubboReference
private RemoteServerService remoteServerService;
@Override
public String translation(Object key, String other) {
return remoteServerService.selectNiceNameByPersonCodes(key.toString());
}
}
...@@ -4,3 +4,4 @@ org.dromara.common.translation.core.impl.DictTypeTranslationImpl ...@@ -4,3 +4,4 @@ org.dromara.common.translation.core.impl.DictTypeTranslationImpl
org.dromara.common.translation.core.impl.OssUrlTranslationImpl org.dromara.common.translation.core.impl.OssUrlTranslationImpl
org.dromara.common.translation.core.impl.UserNameTranslationImpl org.dromara.common.translation.core.impl.UserNameTranslationImpl
org.dromara.common.translation.core.impl.NicknameTranslationImpl org.dromara.common.translation.core.impl.NicknameTranslationImpl
org.dromara.common.translation.core.impl.PersonCodeTranslationImpl
package org.dromara.job.snailjob;
import com.aizuda.snailjob.client.job.core.annotation.JobExecutor;
import com.aizuda.snailjob.client.job.core.dto.JobArgs;
import com.aizuda.snailjob.client.model.ExecuteResult;
import lombok.AllArgsConstructor;
import org.apache.dubbo.config.annotation.DubboReference;
import org.dromara.server.api.RemoteYsOrderService;
import org.springframework.stereotype.Component;
/**
* @author hzh
* @date 2024-11-18
*/
@AllArgsConstructor
@Component
@JobExecutor(name = "orderAirportChangeJobExecutor")
public class OrderAirportChangeJobExecutor {
@DubboReference
private RemoteYsOrderService remoteYsOrderService;
public ExecuteResult jobExecute(JobArgs jobArgs) {
remoteYsOrderService.updateAirportChangeOrder();
return ExecuteResult.success("更新成功");
}
}
package org.dromara.job.snailjob;
import com.aizuda.snailjob.client.job.core.annotation.JobExecutor;
import com.aizuda.snailjob.client.job.core.dto.JobArgs;
import com.aizuda.snailjob.client.model.ExecuteResult;
import lombok.AllArgsConstructor;
import org.apache.dubbo.config.annotation.DubboReference;
import org.dromara.server.api.RemoteYsOrderService;
import org.springframework.stereotype.Component;
/**
* @author hzh
* @date 2024-11-18
*/
@AllArgsConstructor
@Component
@JobExecutor(name = "orderTrainChangeJobExecutor")
public class OrderTrainChangeJobExecutor {
@DubboReference
private RemoteYsOrderService remoteYsOrderService;
public ExecuteResult jobExecute(JobArgs jobArgs) {
remoteYsOrderService.updateAirportChangeOrder();
return ExecuteResult.success("更新成功");
}
}
...@@ -134,6 +134,11 @@ ...@@ -134,6 +134,11 @@
<artifactId>ruoyi-common-websocket</artifactId> <artifactId>ruoyi-common-websocket</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-51weishi</artifactId>
</dependency>
</dependencies> </dependencies>
<build> <build>
......
...@@ -103,14 +103,22 @@ public class ProductSpuController { ...@@ -103,14 +103,22 @@ public class ProductSpuController {
@SaCheckPermission("product:spu:query") @SaCheckPermission("product:spu:query")
public R<List<ProductSpuRespVO>> getSpuList(@RequestParam("spuIds") Collection<Long> spuIds) { public R<List<ProductSpuRespVO>> getSpuList(@RequestParam("spuIds") Collection<Long> spuIds) {
return R.ok(ProductSpuConvert.INSTANCE.convertForSpuDetailRespListVO( return R.ok(ProductSpuConvert.INSTANCE.convertForSpuDetailRespListVO(
productSpuService.getSpuList(spuIds), productSkuService.getSkuListBySpuId(spuIds))); productSpuService.getSpuList(spuIds), productSkuService.getSkuListBySpuId(spuIds)));
} }
@GetMapping("/page") @GetMapping("/page")
@Operation(summary = "获得商品 SPU 分页") @Operation(summary = "获得商品 SPU 分页")
@SaCheckPermission("product:spu:query") @SaCheckPermission("product:spu:query")
public R<PageResult<ProductSpuRespVO>> getSpuPage(@Valid ProductSpuPageReqVO pageVO) { public R<PageResult<ProductSpuRespVO>> getSpuPage(@Valid ProductSpuPageReqVO pageVO) {
PageResult<ProductSpuDO> pageResult = productSpuService.getSpuPage(pageVO); PageResult<ProductSpuDO> pageResult = productSpuService.getSpuPage(pageVO, true);
return R.ok(org.dromara.common.mybatis.util.BeanUtils.toBean(pageResult, ProductSpuRespVO.class));
}
@GetMapping("/all/page")
@Operation(summary = "获得商品 SPU 分页")
@SaCheckPermission("product:spu:query")
public R<PageResult<ProductSpuRespVO>> getSpuPageAll(@Valid ProductSpuPageReqVO pageVO) {
PageResult<ProductSpuDO> pageResult = productSpuService.getSpuPage(pageVO, false);
return R.ok(org.dromara.common.mybatis.util.BeanUtils.toBean(pageResult, ProductSpuRespVO.class)); return R.ok(org.dromara.common.mybatis.util.BeanUtils.toBean(pageResult, ProductSpuRespVO.class));
} }
...@@ -127,7 +135,7 @@ public class ProductSpuController { ...@@ -127,7 +135,7 @@ public class ProductSpuController {
public void exportSpuList(@Validated ProductSpuPageReqVO reqVO, public void exportSpuList(@Validated ProductSpuPageReqVO reqVO,
HttpServletResponse response) { HttpServletResponse response) {
reqVO.setPageSize(PAGE_SIZE_NONE); reqVO.setPageSize(PAGE_SIZE_NONE);
List<ProductSpuDO> list = productSpuService.getSpuPage(reqVO).getList(); List<ProductSpuDO> list = productSpuService.getSpuPage(reqVO, true).getList();
ExcelUtil.exportExcel(BeanUtils.toBean(list, ProductSpuRespVO.class), "商品列表", ProductSpuRespVO.class, response); ExcelUtil.exportExcel(BeanUtils.toBean(list, ProductSpuRespVO.class), "商品列表", ProductSpuRespVO.class, response);
} }
......
...@@ -64,6 +64,13 @@ public class ProductSpuRespVO { ...@@ -64,6 +64,13 @@ public class ProductSpuRespVO {
@ExcelProperty("创建时间") @ExcelProperty("创建时间")
private LocalDateTime createTime; private LocalDateTime createTime;
@Schema(description = "是否可以退款", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "true")
private Boolean canRefund;
@Schema(description = "是否可以取消", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "true")
private Boolean canCancel;
// ========== SKU 相关字段 ========= // ========== SKU 相关字段 =========
@Schema(description = "规格类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") @Schema(description = "规格类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "true")
......
...@@ -44,13 +44,19 @@ public class ProductSpuSaveReqVO { ...@@ -44,13 +44,19 @@ public class ProductSpuSaveReqVO {
private String picUrl; private String picUrl;
@Schema(description = "商品轮播图", requiredMode = Schema.RequiredMode.REQUIRED, @Schema(description = "商品轮播图", requiredMode = Schema.RequiredMode.REQUIRED,
example = "[https://www.iocoder.cn/xx.png, https://www.iocoder.cn/xxx.png]") example = "[https://www.iocoder.cn/xx.png, https://www.iocoder.cn/xxx.png]")
private List<String> sliderPicUrls; private List<String> sliderPicUrls;
@Schema(description = "排序字段", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @Schema(description = "排序字段", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@NotNull(message = "商品排序字段不能为空") @NotNull(message = "商品排序字段不能为空")
private Integer sort; private Integer sort;
@Schema(description = "是否可以退款", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "true")
private Boolean canRefund;
@Schema(description = "是否可以取消", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "true")
private Boolean canCancel;
// ========== SKU 相关字段 ========= // ========== SKU 相关字段 =========
@Schema(description = "规格类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") @Schema(description = "规格类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "true")
......
...@@ -24,6 +24,7 @@ import org.dromara.mall.domain.trade.TradeOrderItemDO; ...@@ -24,6 +24,7 @@ import org.dromara.mall.domain.trade.TradeOrderItemDO;
import org.dromara.mall.service.trade.aftersale.AfterSaleLogService; import org.dromara.mall.service.trade.aftersale.AfterSaleLogService;
import org.dromara.mall.service.trade.aftersale.AfterSaleService; import org.dromara.mall.service.trade.aftersale.AfterSaleService;
import org.dromara.mall.service.trade.order.TradeOrderQueryService; import org.dromara.mall.service.trade.order.TradeOrderQueryService;
import org.jetbrains.annotations.NotNull;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
...@@ -53,8 +54,20 @@ public class AfterSaleController { ...@@ -53,8 +54,20 @@ public class AfterSaleController {
@Operation(summary = "获得售后订单分页") @Operation(summary = "获得售后订单分页")
@SaCheckPermission("trade:after-sale:query") @SaCheckPermission("trade:after-sale:query")
public R<PageResult<AfterSaleRespPageItemVO>> getAfterSalePage(@Valid AfterSalePageReqVO pageVO) { public R<PageResult<AfterSaleRespPageItemVO>> getAfterSalePage(@Valid AfterSalePageReqVO pageVO) {
return getAfterSalePage(pageVO, true);
}
@GetMapping("/all/page")
@Operation(summary = "获得售后订单分页")
@SaCheckPermission("trade:after-sale:query")
public R<PageResult<AfterSaleRespPageItemVO>> getAfterSalePageAll(@Valid AfterSalePageReqVO pageVO) {
return getAfterSalePage(pageVO, false);
}
@NotNull
private R<PageResult<AfterSaleRespPageItemVO>> getAfterSalePage(AfterSalePageReqVO pageVO, Boolean dataPermission) {
// 查询售后 // 查询售后
PageResult<AfterSaleDO> pageResult = afterSaleService.getAfterSalePage(pageVO); PageResult<AfterSaleDO> pageResult = afterSaleService.getAfterSalePage(pageVO, dataPermission);
if (CollUtil.isEmpty(pageResult.getList())) { if (CollUtil.isEmpty(pageResult.getList())) {
return R.ok(PageResult.empty()); return R.ok(PageResult.empty());
} }
......
...@@ -13,6 +13,7 @@ import org.dromara.mall.enums.trade.aftersale.AfterSaleWayEnum; ...@@ -13,6 +13,7 @@ import org.dromara.mall.enums.trade.aftersale.AfterSaleWayEnum;
import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List;
import static org.dromara.common.mall.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; import static org.dromara.common.mall.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
...@@ -51,4 +52,7 @@ public class AfterSalePageReqVO extends PageParam { ...@@ -51,4 +52,7 @@ public class AfterSalePageReqVO extends PageParam {
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime; private LocalDateTime[] createTime;
@Schema(description = "商品id集合")
private List<Long> spuIds;
} }
...@@ -52,23 +52,34 @@ public class TradeOrderController { ...@@ -52,23 +52,34 @@ public class TradeOrderController {
@Operation(summary = "获得交易订单分页") @Operation(summary = "获得交易订单分页")
@SaCheckPermission("trade:order:query") @SaCheckPermission("trade:order:query")
public R<PageResult<TradeOrderPageItemRespVO>> getOrderPage(TradeOrderPageReqVO reqVO) { public R<PageResult<TradeOrderPageItemRespVO>> getOrderPage(TradeOrderPageReqVO reqVO) {
return getOrderPage(reqVO, true);
}
private R<PageResult<TradeOrderPageItemRespVO>> getOrderPage(TradeOrderPageReqVO reqVO, Boolean dataPermission) {
// 查询订单 // 查询订单
PageResult<TradeOrderDO> pageResult = tradeOrderQueryService.getOrderPage(reqVO); PageResult<TradeOrderDO> pageResult = tradeOrderQueryService.getOrderPage(reqVO, dataPermission);
if (CollUtil.isEmpty(pageResult.getList())) { if (CollUtil.isEmpty(pageResult.getList())) {
return R.ok(PageResult.empty()); return R.ok(PageResult.empty());
} }
// 查询用户信息 // 查询用户信息
Set<Long> userIds = CollUtil.unionDistinct(convertList(pageResult.getList(), TradeOrderDO::getUserId), Set<Long> userIds = CollUtil.unionDistinct(convertList(pageResult.getList(), TradeOrderDO::getUserId),
convertList(pageResult.getList(), TradeOrderDO::getBrokerageUserId, Objects::nonNull)); convertList(pageResult.getList(), TradeOrderDO::getBrokerageUserId, Objects::nonNull));
Map<Long, MemberUserRespDTO> userMap = memberUserApi.getUserMap(userIds); Map<Long, MemberUserRespDTO> userMap = memberUserApi.getUserMap(userIds);
// 查询订单项 // 查询订单项
List<TradeOrderItemDO> orderItems = tradeOrderQueryService.getOrderItemListByOrderId( List<TradeOrderItemDO> orderItems = tradeOrderQueryService.getOrderItemListByOrderId(
convertSet(pageResult.getList(), TradeOrderDO::getId)); convertSet(pageResult.getList(), TradeOrderDO::getId));
// 最终组合 // 最终组合
return R.ok(TradeOrderConvert.INSTANCE.convertPage(pageResult, orderItems, userMap)); return R.ok(TradeOrderConvert.INSTANCE.convertPage(pageResult, orderItems, userMap));
} }
@GetMapping("/all/page")
@Operation(summary = "获得交易订单分页")
@SaCheckPermission("trade:order:query")
public R<PageResult<TradeOrderPageItemRespVO>> getOrderPageAll(TradeOrderPageReqVO reqVO) {
return getOrderPage(reqVO, false);
}
@GetMapping("/summary") @GetMapping("/summary")
@Operation(summary = "获得交易订单统计") @Operation(summary = "获得交易订单统计")
@SaCheckPermission("trade:order:query") @SaCheckPermission("trade:order:query")
......
...@@ -61,4 +61,7 @@ public class TradeOrderPageReqVO extends PageParam { ...@@ -61,4 +61,7 @@ public class TradeOrderPageReqVO extends PageParam {
@InEnum(value = TerminalEnum.class, message = "订单来源 {value}") @InEnum(value = TerminalEnum.class, message = "订单来源 {value}")
private Integer terminal; private Integer terminal;
@Schema(description = "订单id集合")
private List<Long> orderIds;
} }
package org.dromara.mall.controller.weishi.app;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.R;
import org.dromara.common.weishi.model.res.ProductResponse;
import org.dromara.common.weishi.model.res.ProductsResponse;
import org.dromara.common.weishi.service.WeishiService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* @author hzh
* @date 2025-05-12
**/
@Tag(name = "用户 App - 51旅游卫士")
@RestController
@RequestMapping("/app/weishi")
@Validated
@RequiredArgsConstructor
public class WeishiController {
private final WeishiService weishiService;
/**
* 产品列表
*
* @return 产品列表
*/
@GetMapping("/productList")
public R<List<ProductsResponse>> productList() {
return R.ok(weishiService.productList());
}
/**
* 产品详情
*
* @return 产品详情
*/
@GetMapping("/productDetail")
public R<ProductResponse> productDetail(@RequestParam Integer productId) {
return R.ok(weishiService.productDetail(productId));
}
}
...@@ -49,6 +49,11 @@ public class ProductBrandDO extends TenantEntity { ...@@ -49,6 +49,11 @@ public class ProductBrandDO extends TenantEntity {
*/ */
private Integer status; private Integer status;
/**
* 部门id
*/
private Long deptId;
/** /**
* 删除标志(0代表存在 2代表删除) * 删除标志(0代表存在 2代表删除)
*/ */
......
...@@ -61,6 +61,11 @@ public class ProductCategoryDO extends TenantEntity { ...@@ -61,6 +61,11 @@ public class ProductCategoryDO extends TenantEntity {
*/ */
private Integer status; private Integer status;
/**
* 部门id
*/
private Long deptId;
/** /**
* 删除标志(0代表存在 2代表删除) * 删除标志(0代表存在 2代表删除)
*/ */
......
...@@ -45,6 +45,11 @@ public class ProductPropertyDO extends TenantEntity { ...@@ -45,6 +45,11 @@ public class ProductPropertyDO extends TenantEntity {
*/ */
private String remark; private String remark;
/**
* 部门id
*/
private Long deptId;
/** /**
* 删除标志(0代表存在 2代表删除) * 删除标志(0代表存在 2代表删除)
*/ */
......
...@@ -52,6 +52,11 @@ public class ProductPropertyValueDO extends TenantEntity { ...@@ -52,6 +52,11 @@ public class ProductPropertyValueDO extends TenantEntity {
*/ */
private String remark; private String remark;
/**
* 部门id
*/
private Long deptId;
/** /**
* 删除标志(0代表存在 2代表删除) * 删除标志(0代表存在 2代表删除)
*/ */
......
...@@ -128,6 +128,11 @@ public class ProductSkuDO extends TenantEntity { ...@@ -128,6 +128,11 @@ public class ProductSkuDO extends TenantEntity {
} }
/**
* 部门id
*/
private Long deptId;
/** /**
* 删除标志(0代表存在 2代表删除) * 删除标志(0代表存在 2代表删除)
*/ */
......
...@@ -75,7 +75,14 @@ public class ProductSpuDO extends TenantEntity { ...@@ -75,7 +75,14 @@ public class ProductSpuDO extends TenantEntity {
*/ */
@TableField(typeHandler = JacksonTypeHandler.class) @TableField(typeHandler = JacksonTypeHandler.class)
private List<String> sliderPicUrls; private List<String> sliderPicUrls;
/**
* 是否可以退款
*/
private Boolean canRefund;
/**
* 是否可以取消
*/
private Boolean canCancel;
/** /**
* 排序字段 * 排序字段
*/ */
...@@ -168,6 +175,11 @@ public class ProductSpuDO extends TenantEntity { ...@@ -168,6 +175,11 @@ public class ProductSpuDO extends TenantEntity {
*/ */
private Integer browseCount; private Integer browseCount;
/**
* 部门id
*/
private Long deptId;
/** /**
* 删除标志(0代表存在 2代表删除) * 删除标志(0代表存在 2代表删除)
*/ */
......
package org.dromara.mall.mapper.product; package org.dromara.mall.mapper.product;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.apache.commons.collections4.CollectionUtils;
import org.dromara.common.core.utils.StreamUtils;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus; import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.common.mybatis.core.page.PageResult; import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX; import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.common.mybatis.helper.CustomerDataPermissionHelper;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.mall.controller.product.admin.spu.vo.ProductSpuPageReqVO; import org.dromara.mall.controller.product.admin.spu.vo.ProductSpuPageReqVO;
import org.dromara.mall.controller.product.app.spu.vo.AppProductSpuPageReqVO; import org.dromara.mall.controller.product.app.spu.vo.AppProductSpuPageReqVO;
import org.dromara.mall.domain.product.ProductSpuDO; import org.dromara.mall.domain.product.ProductSpuDO;
import org.dromara.mall.enums.product.ProductConstants; import org.dromara.mall.enums.product.ProductConstants;
import org.dromara.mall.enums.product.spu.ProductSpuStatusEnum; import org.dromara.mall.enums.product.spu.ProductSpuStatusEnum;
import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.Set; import java.util.Set;
...@@ -28,7 +34,7 @@ public interface ProductSpuMapper extends BaseMapperPlusPlus<ProductSpuDO, Produ ...@@ -28,7 +34,7 @@ public interface ProductSpuMapper extends BaseMapperPlusPlus<ProductSpuDO, Produ
* @param reqVO 分页请求参数 * @param reqVO 分页请求参数
* @return 商品 SPU 分页列表数据 * @return 商品 SPU 分页列表数据
*/ */
default PageResult<ProductSpuDO> selectPage(ProductSpuPageReqVO reqVO) { default PageResult<ProductSpuDO> selectPage(ProductSpuPageReqVO reqVO, Boolean dataPermission) {
Integer tabType = reqVO.getTabType(); Integer tabType = reqVO.getTabType();
LambdaQueryWrapperX<ProductSpuDO> queryWrapper = new LambdaQueryWrapperX<ProductSpuDO>() LambdaQueryWrapperX<ProductSpuDO> queryWrapper = new LambdaQueryWrapperX<ProductSpuDO>()
.likeIfPresent(ProductSpuDO::getName, reqVO.getName()) .likeIfPresent(ProductSpuDO::getName, reqVO.getName())
...@@ -37,6 +43,14 @@ public interface ProductSpuMapper extends BaseMapperPlusPlus<ProductSpuDO, Produ ...@@ -37,6 +43,14 @@ public interface ProductSpuMapper extends BaseMapperPlusPlus<ProductSpuDO, Produ
.orderByDesc(ProductSpuDO::getSort) .orderByDesc(ProductSpuDO::getSort)
.orderByDesc(ProductSpuDO::getId); .orderByDesc(ProductSpuDO::getId);
appendTabQuery(tabType, queryWrapper); appendTabQuery(tabType, queryWrapper);
// 设置权限
if (dataPermission && CustomerDataPermissionHelper.isNeedFilter()) {
if (CustomerDataPermissionHelper.isNeedFilterDeptId()) {
queryWrapper.in(ProductSpuDO::getDeptId, CustomerDataPermissionHelper.getDeptIds());
} else {
queryWrapper.eq(ProductSpuDO::getCreateBy, LoginHelper.getUserId());
}
}
return selectPagePlus(reqVO, queryWrapper); return selectPagePlus(reqVO, queryWrapper);
} }
...@@ -52,6 +66,18 @@ public interface ProductSpuMapper extends BaseMapperPlusPlus<ProductSpuDO, Produ ...@@ -52,6 +66,18 @@ public interface ProductSpuMapper extends BaseMapperPlusPlus<ProductSpuDO, Produ
queryWrapper.le(ProductSpuDO::getStock, ProductConstants.ALERT_STOCK) queryWrapper.le(ProductSpuDO::getStock, ProductConstants.ALERT_STOCK)
// 如果库存触发警戒库存且状态为回收站的话则不计入触发警戒库存的个数 // 如果库存触发警戒库存且状态为回收站的话则不计入触发警戒库存的个数
.notIn(ProductSpuDO::getStatus, ProductSpuStatusEnum.RECYCLE.getStatus()); .notIn(ProductSpuDO::getStatus, ProductSpuStatusEnum.RECYCLE.getStatus());
return selectCountDataPermission(queryWrapper);
}
default Long selectCountDataPermission(LambdaQueryWrapperX<ProductSpuDO> queryWrapper) {
// 设置权限
if (CustomerDataPermissionHelper.isNeedFilter()) {
if (CustomerDataPermissionHelper.isNeedFilterDeptId()) {
queryWrapper.in(ProductSpuDO::getDeptId, CustomerDataPermissionHelper.getDeptIds());
} else {
queryWrapper.eq(ProductSpuDO::getCreateBy, LoginHelper.getUserId());
}
}
return selectCount(queryWrapper); return selectCount(queryWrapper);
} }
...@@ -151,4 +177,27 @@ public interface ProductSpuMapper extends BaseMapperPlusPlus<ProductSpuDO, Produ ...@@ -151,4 +177,27 @@ public interface ProductSpuMapper extends BaseMapperPlusPlus<ProductSpuDO, Produ
update(null, updateWrapper); update(null, updateWrapper);
} }
/**
* 获取有权限的spuId集合
*
* @return spuId集合
*/
default List<Long> selectSpuIdsByDataPermission() {
// 设置权限
if (CustomerDataPermissionHelper.isNeedFilter()) {
LambdaQueryWrapper<ProductSpuDO> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.select(ProductSpuDO::getId);
if (CustomerDataPermissionHelper.isNeedFilterDeptId()) {
queryWrapper.in(ProductSpuDO::getDeptId, CustomerDataPermissionHelper.getDeptIds());
} else {
queryWrapper.eq(ProductSpuDO::getCreateBy, LoginHelper.getUserId());
}
List<ProductSpuDO> spuList = selectList(queryWrapper);
return CollectionUtils.isEmpty(spuList) ? List.of(-1L) : StreamUtils.toList(spuList, ProductSpuDO::getId);
} else {
return List.of();
}
}
} }
...@@ -27,6 +27,7 @@ public interface AfterSaleMapper extends BaseMapperPlusPlus<AfterSaleDO, AfterSa ...@@ -27,6 +27,7 @@ public interface AfterSaleMapper extends BaseMapperPlusPlus<AfterSaleDO, AfterSa
.eqIfPresent(AfterSaleDO::getWay, reqVO.getWay()) .eqIfPresent(AfterSaleDO::getWay, reqVO.getWay())
.likeIfPresent(AfterSaleDO::getOrderNo, reqVO.getOrderNo()) .likeIfPresent(AfterSaleDO::getOrderNo, reqVO.getOrderNo())
.likeIfPresent(AfterSaleDO::getSpuName, reqVO.getSpuName()) .likeIfPresent(AfterSaleDO::getSpuName, reqVO.getSpuName())
.inIfPresent(AfterSaleDO::getSpuId, reqVO.getSpuIds())
.betweenIfPresent(AfterSaleDO::getCreateTime, reqVO.getCreateTime()) .betweenIfPresent(AfterSaleDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(AfterSaleDO::getId)); .orderByDesc(AfterSaleDO::getId));
} }
......
...@@ -44,6 +44,7 @@ public interface TradeOrderMapper extends BaseMapperPlusPlus<TradeOrderDO, Trade ...@@ -44,6 +44,7 @@ public interface TradeOrderMapper extends BaseMapperPlusPlus<TradeOrderDO, Trade
.eqIfPresent(TradeOrderDO::getLogisticsId, reqVO.getLogisticsId()) .eqIfPresent(TradeOrderDO::getLogisticsId, reqVO.getLogisticsId())
.inIfPresent(TradeOrderDO::getPickUpStoreId, reqVO.getPickUpStoreIds()) .inIfPresent(TradeOrderDO::getPickUpStoreId, reqVO.getPickUpStoreIds())
.likeIfPresent(TradeOrderDO::getPickUpVerifyCode, reqVO.getPickUpVerifyCode()) .likeIfPresent(TradeOrderDO::getPickUpVerifyCode, reqVO.getPickUpVerifyCode())
.inIfPresent(TradeOrderDO::getId, reqVO.getOrderIds())
.betweenIfPresent(TradeOrderDO::getCreateTime, reqVO.getCreateTime()) .betweenIfPresent(TradeOrderDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(TradeOrderDO::getId)); .orderByDesc(TradeOrderDO::getId));
} }
......
...@@ -82,10 +82,11 @@ public interface ProductSpuService { ...@@ -82,10 +82,11 @@ public interface ProductSpuService {
/** /**
* 获得商品 SPU 分页,提供给挂你兰后台使用 * 获得商品 SPU 分页,提供给挂你兰后台使用
* *
* @param pageReqVO 分页查询 * @param pageReqVO 分页查询
* @param dataPermission 是否需要过滤权限
* @return 商品spu分页 * @return 商品spu分页
*/ */
PageResult<ProductSpuDO> getSpuPage(ProductSpuPageReqVO pageReqVO); PageResult<ProductSpuDO> getSpuPage(ProductSpuPageReqVO pageReqVO, Boolean dataPermission);
/** /**
* 获得商品 SPU 分页,提供给用户 App 使用 * 获得商品 SPU 分页,提供给用户 App 使用
......
...@@ -7,6 +7,7 @@ import jakarta.annotation.Resource; ...@@ -7,6 +7,7 @@ import jakarta.annotation.Resource;
import org.dromara.common.mall.enums.CommonStatusEnum; import org.dromara.common.mall.enums.CommonStatusEnum;
import org.dromara.common.mybatis.core.page.PageResult; import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX; import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.mall.controller.product.admin.brand.vo.ProductBrandCreateReqVO; import org.dromara.mall.controller.product.admin.brand.vo.ProductBrandCreateReqVO;
import org.dromara.mall.controller.product.admin.brand.vo.ProductBrandListReqVO; import org.dromara.mall.controller.product.admin.brand.vo.ProductBrandListReqVO;
import org.dromara.mall.controller.product.admin.brand.vo.ProductBrandPageReqVO; import org.dromara.mall.controller.product.admin.brand.vo.ProductBrandPageReqVO;
...@@ -49,6 +50,7 @@ public class ProductBrandServiceImpl implements ProductBrandService { ...@@ -49,6 +50,7 @@ public class ProductBrandServiceImpl implements ProductBrandService {
// 插入 // 插入
ProductBrandDO brand = BeanUtil.copyProperties(createReqVO, ProductBrandDO.class); ProductBrandDO brand = BeanUtil.copyProperties(createReqVO, ProductBrandDO.class);
brand.setDeptId(LoginHelper.getDeptId());
productBrandMapper.insert(brand); productBrandMapper.insert(brand);
// 返回 // 返回
return brand.getId(); return brand.getId();
......
...@@ -6,6 +6,7 @@ import jakarta.annotation.Resource; ...@@ -6,6 +6,7 @@ import jakarta.annotation.Resource;
import org.dromara.common.mall.enums.CommonStatusEnum; import org.dromara.common.mall.enums.CommonStatusEnum;
import org.dromara.common.mall.util.collection.CollectionUtils; import org.dromara.common.mall.util.collection.CollectionUtils;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX; import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.mall.controller.product.admin.category.vo.ProductCategoryListReqVO; import org.dromara.mall.controller.product.admin.category.vo.ProductCategoryListReqVO;
import org.dromara.mall.controller.product.admin.category.vo.ProductCategorySaveReqVO; import org.dromara.mall.controller.product.admin.category.vo.ProductCategorySaveReqVO;
import org.dromara.mall.domain.product.ProductCategoryDO; import org.dromara.mall.domain.product.ProductCategoryDO;
...@@ -49,6 +50,7 @@ public class ProductCategoryServiceImpl implements ProductCategoryService { ...@@ -49,6 +50,7 @@ public class ProductCategoryServiceImpl implements ProductCategoryService {
// 插入 // 插入
ProductCategoryDO category = BeanUtil.copyProperties(createReqVO, ProductCategoryDO.class); ProductCategoryDO category = BeanUtil.copyProperties(createReqVO, ProductCategoryDO.class);
category.setDeptId(LoginHelper.getDeptId());
productCategoryMapper.insert(category); productCategoryMapper.insert(category);
// 返回 // 返回
return category.getId(); return category.getId();
......
...@@ -5,6 +5,7 @@ import jakarta.annotation.Resource; ...@@ -5,6 +5,7 @@ import jakarta.annotation.Resource;
import org.dromara.common.mall.util.object.BeanUtils; import org.dromara.common.mall.util.object.BeanUtils;
import org.dromara.common.mybatis.core.page.PageResult; import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX; import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.mall.controller.product.admin.property.vo.property.ProductPropertyPageReqVO; import org.dromara.mall.controller.product.admin.property.vo.property.ProductPropertyPageReqVO;
import org.dromara.mall.controller.product.admin.property.vo.property.ProductPropertySaveReqVO; import org.dromara.mall.controller.product.admin.property.vo.property.ProductPropertySaveReqVO;
import org.dromara.mall.domain.product.ProductPropertyDO; import org.dromara.mall.domain.product.ProductPropertyDO;
...@@ -54,6 +55,7 @@ public class ProductPropertyServiceImpl implements ProductPropertyService { ...@@ -54,6 +55,7 @@ public class ProductPropertyServiceImpl implements ProductPropertyService {
// 插入 // 插入
ProductPropertyDO property = BeanUtils.toBean(createReqVO, ProductPropertyDO.class); ProductPropertyDO property = BeanUtils.toBean(createReqVO, ProductPropertyDO.class);
property.setDeptId(LoginHelper.getDeptId());
productPropertyMapper.insert(property); productPropertyMapper.insert(property);
// 返回 // 返回
return property.getId(); return property.getId();
......
...@@ -5,6 +5,7 @@ import jakarta.annotation.Resource; ...@@ -5,6 +5,7 @@ import jakarta.annotation.Resource;
import org.dromara.common.mall.util.object.BeanUtils; import org.dromara.common.mall.util.object.BeanUtils;
import org.dromara.common.mybatis.core.page.PageResult; import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX; import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.mall.controller.product.admin.property.vo.value.ProductPropertyValuePageReqVO; import org.dromara.mall.controller.product.admin.property.vo.value.ProductPropertyValuePageReqVO;
import org.dromara.mall.controller.product.admin.property.vo.value.ProductPropertyValueSaveReqVO; import org.dromara.mall.controller.product.admin.property.vo.value.ProductPropertyValueSaveReqVO;
import org.dromara.mall.domain.product.ProductPropertyValueDO; import org.dromara.mall.domain.product.ProductPropertyValueDO;
...@@ -52,6 +53,7 @@ public class ProductPropertyValueServiceImpl implements ProductPropertyValueServ ...@@ -52,6 +53,7 @@ public class ProductPropertyValueServiceImpl implements ProductPropertyValueServ
// 新增 // 新增
ProductPropertyValueDO value = BeanUtils.toBean(createReqVO, ProductPropertyValueDO.class); ProductPropertyValueDO value = BeanUtils.toBean(createReqVO, ProductPropertyValueDO.class);
value.setDeptId(LoginHelper.getDeptId());
productPropertyValueMapper.insert(value); productPropertyValueMapper.insert(value);
return value.getId(); return value.getId();
} }
......
...@@ -5,6 +5,7 @@ import cn.hutool.core.collection.ListUtil; ...@@ -5,6 +5,7 @@ import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import org.dromara.common.mall.util.object.BeanUtils; import org.dromara.common.mall.util.object.BeanUtils;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.mall.api.dto.product.ProductSkuUpdateStockReqDTO; import org.dromara.mall.api.dto.product.ProductSkuUpdateStockReqDTO;
import org.dromara.mall.controller.product.admin.spu.vo.ProductSkuSaveReqVO; import org.dromara.mall.controller.product.admin.spu.vo.ProductSkuSaveReqVO;
import org.dromara.mall.convert.product.ProductSkuConvert; import org.dromara.mall.convert.product.ProductSkuConvert;
...@@ -138,7 +139,10 @@ public class ProductSkuServiceImpl implements ProductSkuService { ...@@ -138,7 +139,10 @@ public class ProductSkuServiceImpl implements ProductSkuService {
@Override @Override
public void createSkuList(Long spuId, List<ProductSkuSaveReqVO> skuCreateReqList) { public void createSkuList(Long spuId, List<ProductSkuSaveReqVO> skuCreateReqList) {
List<ProductSkuDO> skus = BeanUtils.toBean(skuCreateReqList, ProductSkuDO.class, sku -> sku.setSpuId(spuId)); List<ProductSkuDO> skus = BeanUtils.toBean(skuCreateReqList, ProductSkuDO.class, sku ->{
sku.setSpuId(spuId);
sku.setDeptId(LoginHelper.getDeptId());
} );
productSkuMapper.insertBatch(skus); productSkuMapper.insertBatch(skus);
} }
......
...@@ -7,6 +7,8 @@ import jakarta.annotation.Resource; ...@@ -7,6 +7,8 @@ import jakarta.annotation.Resource;
import org.dromara.common.mall.enums.CommonStatusEnum; import org.dromara.common.mall.enums.CommonStatusEnum;
import org.dromara.common.mall.util.object.BeanUtils; import org.dromara.common.mall.util.object.BeanUtils;
import org.dromara.common.mybatis.core.page.PageResult; import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.mall.controller.product.admin.category.vo.ProductCategoryListReqVO; import org.dromara.mall.controller.product.admin.category.vo.ProductCategoryListReqVO;
import org.dromara.mall.controller.product.admin.spu.vo.ProductSkuSaveReqVO; import org.dromara.mall.controller.product.admin.spu.vo.ProductSkuSaveReqVO;
import org.dromara.mall.controller.product.admin.spu.vo.ProductSpuPageReqVO; import org.dromara.mall.controller.product.admin.spu.vo.ProductSpuPageReqVO;
...@@ -64,6 +66,8 @@ public class ProductSpuServiceImpl implements ProductSpuService { ...@@ -64,6 +66,8 @@ public class ProductSpuServiceImpl implements ProductSpuService {
productSkuService.validateSkuList(skuSaveReqList, createReqVO.getSpecType()); productSkuService.validateSkuList(skuSaveReqList, createReqVO.getSpecType());
ProductSpuDO spu = BeanUtils.toBean(createReqVO, ProductSpuDO.class); ProductSpuDO spu = BeanUtils.toBean(createReqVO, ProductSpuDO.class);
// 设置部门
spu.setDeptId(LoginHelper.getDeptId());
// 初始化 SPU 中 SKU 相关属性 // 初始化 SPU 中 SKU 相关属性
initSpuFromSkus(spu, skuSaveReqList); initSpuFromSkus(spu, skuSaveReqList);
// 插入 SPU // 插入 SPU
...@@ -205,8 +209,8 @@ public class ProductSpuServiceImpl implements ProductSpuService { ...@@ -205,8 +209,8 @@ public class ProductSpuServiceImpl implements ProductSpuService {
} }
@Override @Override
public PageResult<ProductSpuDO> getSpuPage(ProductSpuPageReqVO pageReqVO) { public PageResult<ProductSpuDO> getSpuPage(ProductSpuPageReqVO pageReqVO, Boolean dataPermission) {
return productSpuMapper.selectPage(pageReqVO); return productSpuMapper.selectPage(pageReqVO, dataPermission);
} }
@Override @Override
...@@ -252,19 +256,31 @@ public class ProductSpuServiceImpl implements ProductSpuService { ...@@ -252,19 +256,31 @@ public class ProductSpuServiceImpl implements ProductSpuService {
Map<Integer, Long> counts = Maps.newLinkedHashMapWithExpectedSize(5); Map<Integer, Long> counts = Maps.newLinkedHashMapWithExpectedSize(5);
// 查询销售中的商品数量 // 查询销售中的商品数量
counts.put(ProductSpuPageReqVO.FOR_SALE, counts.put(ProductSpuPageReqVO.FOR_SALE,
productSpuMapper.selectCount(ProductSpuDO::getStatus, ProductSpuStatusEnum.ENABLE.getStatus())); productSpuMapper.selectCountDataPermission(
new LambdaQueryWrapperX<ProductSpuDO>()
.eq(ProductSpuDO::getStatus, ProductSpuStatusEnum.ENABLE.getStatus())
));
// 查询仓库中的商品数量 // 查询仓库中的商品数量
counts.put(ProductSpuPageReqVO.IN_WAREHOUSE, counts.put(ProductSpuPageReqVO.IN_WAREHOUSE,
productSpuMapper.selectCount(ProductSpuDO::getStatus, ProductSpuStatusEnum.DISABLE.getStatus())); productSpuMapper.selectCountDataPermission(
new LambdaQueryWrapperX<ProductSpuDO>()
.eq(ProductSpuDO::getStatus, ProductSpuStatusEnum.DISABLE.getStatus())
));
// 查询售空的商品数量 // 查询售空的商品数量
counts.put(ProductSpuPageReqVO.SOLD_OUT, counts.put(ProductSpuPageReqVO.SOLD_OUT,
productSpuMapper.selectCount(ProductSpuDO::getStock, 0)); productSpuMapper.selectCountDataPermission(
new LambdaQueryWrapperX<ProductSpuDO>()
.eq(ProductSpuDO::getStock, 0)
));
// 查询触发警戒库存的商品数量 // 查询触发警戒库存的商品数量
counts.put(ProductSpuPageReqVO.ALERT_STOCK, counts.put(ProductSpuPageReqVO.ALERT_STOCK,
productSpuMapper.selectCount()); productSpuMapper.selectCount());
// 查询回收站中的商品数量 // 查询回收站中的商品数量
counts.put(ProductSpuPageReqVO.RECYCLE_BIN, counts.put(ProductSpuPageReqVO.RECYCLE_BIN,
productSpuMapper.selectCount(ProductSpuDO::getStatus, ProductSpuStatusEnum.RECYCLE.getStatus())); productSpuMapper.selectCountDataPermission(
new LambdaQueryWrapperX<ProductSpuDO>()
.eq(ProductSpuDO::getStatus, ProductSpuStatusEnum.RECYCLE.getStatus())
));
return counts; return counts;
} }
......
...@@ -20,10 +20,11 @@ public interface AfterSaleService { ...@@ -20,10 +20,11 @@ public interface AfterSaleService {
/** /**
* 【管理员】获得售后订单分页 * 【管理员】获得售后订单分页
* *
* @param pageReqVO 分页查询 * @param pageReqVO 分页查询
* @param dataPermission 是否权限过滤
* @return 售后订单分页 * @return 售后订单分页
*/ */
PageResult<AfterSaleDO> getAfterSalePage(AfterSalePageReqVO pageReqVO); PageResult<AfterSaleDO> getAfterSalePage(AfterSalePageReqVO pageReqVO, Boolean dataPermission);
/** /**
* 【会员】获得售后订单分页 * 【会员】获得售后订单分页
......
...@@ -34,6 +34,7 @@ import org.dromara.mall.enums.trade.order.TradeOrderTypeEnum; ...@@ -34,6 +34,7 @@ import org.dromara.mall.enums.trade.order.TradeOrderTypeEnum;
import org.dromara.mall.framework.trade.aftersale.core.annotations.AfterSaleLog; import org.dromara.mall.framework.trade.aftersale.core.annotations.AfterSaleLog;
import org.dromara.mall.framework.trade.aftersale.core.utils.AfterSaleLogUtils; import org.dromara.mall.framework.trade.aftersale.core.utils.AfterSaleLogUtils;
import org.dromara.mall.framework.trade.order.config.TradeOrderProperties; import org.dromara.mall.framework.trade.order.config.TradeOrderProperties;
import org.dromara.mall.mapper.product.ProductSpuMapper;
import org.dromara.mall.mapper.trade.AfterSaleMapper; import org.dromara.mall.mapper.trade.AfterSaleMapper;
import org.dromara.mall.service.trade.delivery.DeliveryExpressService; import org.dromara.mall.service.trade.delivery.DeliveryExpressService;
import org.dromara.mall.service.trade.order.TradeOrderQueryService; import org.dromara.mall.service.trade.order.TradeOrderQueryService;
...@@ -46,6 +47,7 @@ import org.springframework.transaction.support.TransactionSynchronizationManager ...@@ -46,6 +47,7 @@ import org.springframework.transaction.support.TransactionSynchronizationManager
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List;
import static org.dromara.common.mall.exception.util.ServiceExceptionUtil.exception; import static org.dromara.common.mall.exception.util.ServiceExceptionUtil.exception;
import static org.dromara.mall.enums.trade.ErrorCodeConstants.*; import static org.dromara.mall.enums.trade.ErrorCodeConstants.*;
...@@ -72,6 +74,8 @@ public class AfterSaleServiceImpl implements AfterSaleService { ...@@ -72,6 +74,8 @@ public class AfterSaleServiceImpl implements AfterSaleService {
@Resource @Resource
private AfterSaleMapper tradeAfterSaleMapper; private AfterSaleMapper tradeAfterSaleMapper;
@Resource @Resource
private ProductSpuMapper productSpuMapper;
@Resource
private TradeNoRedisDAO tradeNoRedisDAO; private TradeNoRedisDAO tradeNoRedisDAO;
@Resource @Resource
...@@ -83,7 +87,12 @@ public class AfterSaleServiceImpl implements AfterSaleService { ...@@ -83,7 +87,12 @@ public class AfterSaleServiceImpl implements AfterSaleService {
private TradeOrderProperties tradeOrderProperties; private TradeOrderProperties tradeOrderProperties;
@Override @Override
public PageResult<AfterSaleDO> getAfterSalePage(AfterSalePageReqVO pageReqVO) { public PageResult<AfterSaleDO> getAfterSalePage(AfterSalePageReqVO pageReqVO, Boolean dataPermission) {
// 获取有权限的商品
if (dataPermission) {
List<Long> spuIds = productSpuMapper.selectSpuIdsByDataPermission();
pageReqVO.setSpuIds(spuIds);
}
return tradeAfterSaleMapper.selectPagePlus(pageReqVO); return tradeAfterSaleMapper.selectPagePlus(pageReqVO);
} }
......
...@@ -60,10 +60,11 @@ public interface TradeOrderQueryService { ...@@ -60,10 +60,11 @@ public interface TradeOrderQueryService {
/** /**
* 【管理员】获得交易订单分页 * 【管理员】获得交易订单分页
* *
* @param reqVO 分页请求 * @param reqVO 分页请求
* @param dataPermission 是否需要过滤权限
* @return 交易订单 * @return 交易订单
*/ */
PageResult<TradeOrderDO> getOrderPage(TradeOrderPageReqVO reqVO); PageResult<TradeOrderDO> getOrderPage(TradeOrderPageReqVO reqVO, Boolean dataPermission);
/** /**
* 获得订单统计 * 获得订单统计
......
...@@ -5,7 +5,10 @@ import cn.hutool.core.map.MapUtil; ...@@ -5,7 +5,10 @@ import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.spring.SpringUtil; import cn.hutool.extra.spring.SpringUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import org.apache.commons.collections4.CollectionUtils;
import org.dromara.common.core.utils.StreamUtils;
import org.dromara.common.mybatis.core.page.PageResult; import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.mall.api.dto.member.MemberUserRespDTO; import org.dromara.mall.api.dto.member.MemberUserRespDTO;
import org.dromara.mall.api.service.member.MemberUserApi; import org.dromara.mall.api.service.member.MemberUserApi;
...@@ -21,6 +24,7 @@ import org.dromara.mall.enums.trade.order.TradeOrderStatusEnum; ...@@ -21,6 +24,7 @@ import org.dromara.mall.enums.trade.order.TradeOrderStatusEnum;
import org.dromara.mall.framework.trade.delivery.core.client.ExpressClientFactory; import org.dromara.mall.framework.trade.delivery.core.client.ExpressClientFactory;
import org.dromara.mall.framework.trade.delivery.core.client.dto.ExpressTrackQueryReqDTO; import org.dromara.mall.framework.trade.delivery.core.client.dto.ExpressTrackQueryReqDTO;
import org.dromara.mall.framework.trade.delivery.core.client.dto.ExpressTrackRespDTO; import org.dromara.mall.framework.trade.delivery.core.client.dto.ExpressTrackRespDTO;
import org.dromara.mall.mapper.product.ProductSpuMapper;
import org.dromara.mall.mapper.trade.TradeOrderItemMapper; import org.dromara.mall.mapper.trade.TradeOrderItemMapper;
import org.dromara.mall.mapper.trade.TradeOrderMapper; import org.dromara.mall.mapper.trade.TradeOrderMapper;
import org.dromara.mall.service.trade.delivery.DeliveryExpressService; import org.dromara.mall.service.trade.delivery.DeliveryExpressService;
...@@ -29,7 +33,6 @@ import org.springframework.stereotype.Service; ...@@ -29,7 +33,6 @@ import org.springframework.stereotype.Service;
import java.util.*; import java.util.*;
import static org.dromara.common.mall.exception.util.ServiceExceptionUtil.exception; import static org.dromara.common.mall.exception.util.ServiceExceptionUtil.exception;
import static org.dromara.common.mall.util.collection.CollectionUtils.convertSet; import static org.dromara.common.mall.util.collection.CollectionUtils.convertSet;
import static org.dromara.mall.enums.trade.ErrorCodeConstants.EXPRESS_NOT_EXISTS; import static org.dromara.mall.enums.trade.ErrorCodeConstants.EXPRESS_NOT_EXISTS;
...@@ -49,6 +52,8 @@ public class TradeOrderQueryServiceImpl implements TradeOrderQueryService { ...@@ -49,6 +52,8 @@ public class TradeOrderQueryServiceImpl implements TradeOrderQueryService {
@Resource @Resource
private TradeOrderMapper tradeOrderMapper; private TradeOrderMapper tradeOrderMapper;
@Resource @Resource
private ProductSpuMapper productSpuMapper;
@Resource
private TradeOrderItemMapper tradeOrderItemMapper; private TradeOrderItemMapper tradeOrderItemMapper;
@Resource @Resource
...@@ -88,12 +93,29 @@ public class TradeOrderQueryServiceImpl implements TradeOrderQueryService { ...@@ -88,12 +93,29 @@ public class TradeOrderQueryServiceImpl implements TradeOrderQueryService {
} }
@Override @Override
public PageResult<TradeOrderDO> getOrderPage(TradeOrderPageReqVO reqVO) { public PageResult<TradeOrderDO> getOrderPage(TradeOrderPageReqVO reqVO, Boolean dataPermission) {
// 根据用户查询条件构建用户编号列表 // 根据用户查询条件构建用户编号列表
Set<Long> userIds = buildQueryConditionUserIds(reqVO); Set<Long> userIds = buildQueryConditionUserIds(reqVO);
if (userIds == null) { // 没查询到用户,说明肯定也没他的订单 if (userIds == null) { // 没查询到用户,说明肯定也没他的订单
return PageResult.empty(); return PageResult.empty();
} }
// 权限处理
if (dataPermission) {
List<Long> spuIds = productSpuMapper.selectSpuIdsByDataPermission();
if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(spuIds)) {
List<TradeOrderItemDO> itemList = tradeOrderItemMapper.selectList(
new LambdaQueryWrapper<TradeOrderItemDO>()
.in(TradeOrderItemDO::getSpuId, spuIds)
.select(TradeOrderItemDO::getOrderId)
);
if (CollectionUtils.isEmpty(itemList)) {
return PageResult.empty();
}
reqVO.setOrderIds(StreamUtils.toList(itemList, TradeOrderItemDO::getOrderId));
}
}
// 分页查询 // 分页查询
return tradeOrderMapper.selectPage(reqVO, userIds); return tradeOrderMapper.selectPage(reqVO, userIds);
} }
......
...@@ -53,7 +53,6 @@ public class SysOssController extends BaseController { ...@@ -53,7 +53,6 @@ public class SysOssController extends BaseController {
* *
* @param ossIds OSS对象ID串 * @param ossIds OSS对象ID串
*/ */
@SaCheckPermission("system:oss:list")
@GetMapping("/listByIds/{ossIds}") @GetMapping("/listByIds/{ossIds}")
public R<List<SysOssVo>> listByIds(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ossIds) { public R<List<SysOssVo>> listByIds(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ossIds) {
List<SysOssVo> list = iSysOssService.listByIds(Arrays.asList(ossIds)); List<SysOssVo> list = iSysOssService.listByIds(Arrays.asList(ossIds));
...@@ -85,7 +84,6 @@ public class SysOssController extends BaseController { ...@@ -85,7 +84,6 @@ public class SysOssController extends BaseController {
* *
* @param ossId OSS对象ID * @param ossId OSS对象ID
*/ */
@SaCheckPermission("system:oss:download")
@GetMapping("/download/{ossId}") @GetMapping("/download/{ossId}")
public void download(@PathVariable Long ossId, HttpServletResponse response) throws IOException { public void download(@PathVariable Long ossId, HttpServletResponse response) throws IOException {
iSysOssService.download(ossId, response); iSysOssService.download(ossId, response);
......
package org.dromara.server.base; package org.dromara.server.base;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.dromara.common.core.utils.SpringUtils;
import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.server.config.YsConfig;
import java.util.List;
/** /**
* @author hzh * @author hzh
...@@ -37,4 +32,12 @@ public class BaseController { ...@@ -37,4 +32,12 @@ public class BaseController {
return userNo; return userNo;
} }
public String getQueryUserId(){
String userNo = LoginHelper.getUserNo();
if (StringUtils.isEmpty(userNo)) {
throw new RuntimeException("未获取到第三方用户编码");
}
return userNo;
}
} }
package org.dromara.server.controller; package org.dromara.server.controller;
import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.annotation.SaCheckPermission;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.R; import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup; import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup; import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.common.idempotent.annotation.RepeatSubmit; import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log; import org.dromara.common.log.annotation.Log;
import org.dromara.common.log.enums.BusinessType; import org.dromara.common.log.enums.BusinessType;
...@@ -53,9 +51,9 @@ public class OrderAirportController extends BaseController { ...@@ -53,9 +51,9 @@ public class OrderAirportController extends BaseController {
@SaCheckPermission("server:orderAirport:export") @SaCheckPermission("server:orderAirport:export")
@Log(title = "活动机票订单", businessType = BusinessType.EXPORT) @Log(title = "活动机票订单", businessType = BusinessType.EXPORT)
@PostMapping("/export") @PostMapping("/export")
public void export(OrderAirportBo bo, HttpServletResponse response) { public R<List<OrderAirportVo>> export(OrderAirportBo bo) {
List<OrderAirportVo> list = bizOrderAirportService.queryList(bo); bo.setProcessData(true);
ExcelUtil.exportExcel(list, "活动机票订单", OrderAirportVo.class, response); return R.ok(bizOrderAirportService.queryList(bo));
} }
/** /**
......
...@@ -8,7 +8,6 @@ import lombok.RequiredArgsConstructor; ...@@ -8,7 +8,6 @@ import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.R; import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup; import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup; import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.common.idempotent.annotation.RepeatSubmit; import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log; import org.dromara.common.log.annotation.Log;
import org.dromara.common.log.enums.BusinessType; import org.dromara.common.log.enums.BusinessType;
...@@ -53,9 +52,9 @@ public class OrderHotelController extends BaseController { ...@@ -53,9 +52,9 @@ public class OrderHotelController extends BaseController {
@SaCheckPermission("server:orderHotel:export") @SaCheckPermission("server:orderHotel:export")
@Log(title = "酒店订单", businessType = BusinessType.EXPORT) @Log(title = "酒店订单", businessType = BusinessType.EXPORT)
@PostMapping("/export") @PostMapping("/export")
public void export(OrderHotelBo bo, HttpServletResponse response) { public R<List<OrderHotelVo>> export(OrderHotelBo bo, HttpServletResponse response) {
List<OrderHotelVo> list = orderHotelService.queryList(bo); bo.setProcessData(true);
ExcelUtil.exportExcel(list, "酒店订单", OrderHotelVo.class, response); return R.ok(orderHotelService.queryList(bo));
} }
/** /**
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论