提交 4f6e99cb authored 作者: hzh's avatar hzh

登录调试

上级 48e019d9
...@@ -21,7 +21,7 @@ rule_files: ...@@ -21,7 +21,7 @@ rule_files:
scrape_configs: scrape_configs:
- job_name: 'Prometheus' - job_name: 'Prometheus'
static_configs: static_configs:
- targets: ['127.0.0.1:9090'] - targets: ['19.168.8.190:9090']
- job_name: 'Grafana' - job_name: 'Grafana'
static_configs: static_configs:
......
...@@ -3,6 +3,7 @@ package org.dromara.system.api; ...@@ -3,6 +3,7 @@ package org.dromara.system.api;
import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.exception.user.UserException; import org.dromara.common.core.exception.user.UserException;
import org.dromara.system.api.domain.bo.RemoteUserBo; import org.dromara.system.api.domain.bo.RemoteUserBo;
import org.dromara.system.api.domain.bo.RemoteWxUserBo;
import org.dromara.system.api.domain.vo.RemoteUserVo; import org.dromara.system.api.domain.vo.RemoteUserVo;
import org.dromara.system.api.model.LoginUser; import org.dromara.system.api.model.LoginUser;
import org.dromara.system.api.model.XcxLoginUser; import org.dromara.system.api.model.XcxLoginUser;
...@@ -68,6 +69,13 @@ public interface RemoteUserService { ...@@ -68,6 +69,13 @@ public interface RemoteUserService {
*/ */
Boolean registerUserInfo(RemoteUserBo remoteUserBo) throws UserException, ServiceException; Boolean registerUserInfo(RemoteUserBo remoteUserBo) throws UserException, ServiceException;
/**
* 注册用户信息
* @param remoteWxUserBo 用户信息
* @return 结果
*/
Boolean registerWxUserInfo(RemoteWxUserBo remoteWxUserBo);
/** /**
* 通过userId查询用户账户 * 通过userId查询用户账户
* *
......
package org.dromara.system.api.domain.bo;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serial;
import java.io.Serializable;
/**
* 用户信息业务对象 sys_user
*
* @author Michelle.Chung
*/
@Data
@Accessors(chain = true)
@NoArgsConstructor
public class RemoteWxUserBo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 用户ID
*/
private Long userId;
/**
* 租户ID
*/
private String tenantId;
/**
* openId
*/
private String openId;
/**
* 手机号码
*/
private String phonenumber;
/**
* 备注
*/
private String remark;
}
...@@ -24,4 +24,9 @@ public class XcxLoginUser extends LoginUser { ...@@ -24,4 +24,9 @@ public class XcxLoginUser extends LoginUser {
*/ */
private String openid; private String openid;
/**
* 获取手机号
*/
private String phone;
} }
...@@ -86,6 +86,11 @@ ...@@ -86,6 +86,11 @@
<artifactId>ruoyi-api-resource</artifactId> <artifactId>ruoyi-api-resource</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-weixin</artifactId>
</dependency>
<!-- 自定义负载均衡(多团队开发使用) --> <!-- 自定义负载均衡(多团队开发使用) -->
<!-- <dependency>--> <!-- <dependency>-->
<!-- <groupId>org.dromara</groupId>--> <!-- <groupId>org.dromara</groupId>-->
......
...@@ -101,9 +101,12 @@ public class TokenController { ...@@ -101,9 +101,12 @@ public class TokenController {
LoginVo loginVo = IAuthStrategy.login(body, clientVo, grantType); LoginVo loginVo = IAuthStrategy.login(body, clientVo, grantType);
Long userId = LoginHelper.getUserId(); Long userId = LoginHelper.getUserId();
if(!ObjectUtil.isNotNull(userId)){
scheduledExecutorService.schedule(() -> { scheduledExecutorService.schedule(() -> {
remoteMessageService.publishMessage(userId, "欢迎登录商旅微服务管理系统"); remoteMessageService.publishMessage(userId, "欢迎登录商旅微服务管理系统");
}, 3, TimeUnit.SECONDS); }, 3, TimeUnit.SECONDS);
}
return R.ok(loginVo); return R.ok(loginVo);
} }
......
package org.dromara.auth.form;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.dromara.common.core.domain.model.LoginBody;
/**
* 三方登录对象
*
* @author Lion Li
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class XcxPhoneLoginBody extends LoginBody {
/**
* openId
*/
@NotBlank(message = "openId不能为空")
private String openId;
/**
* 用户信息,base64编码
*/
@NotBlank(message = "encryptedData不能为空")
private String encryptedData;
/**
* 加密算法的初始向量
*/
@NotBlank(message = "iv不能为空")
private String iv;
/**
* 用户登录凭证
*/
@NotBlank(message = "用户凭证不能为空")
private String sessionKey;
}
...@@ -12,6 +12,9 @@ import org.dromara.auth.service.SysLoginService; ...@@ -12,6 +12,9 @@ import org.dromara.auth.service.SysLoginService;
import org.dromara.common.core.utils.ValidatorUtils; import org.dromara.common.core.utils.ValidatorUtils;
import org.dromara.common.json.utils.JsonUtils; import org.dromara.common.json.utils.JsonUtils;
import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.weixin.dto.WxAuthReq;
import org.dromara.common.weixin.dto.WxAuthResp;
import org.dromara.common.weixin.utils.WeixinUtils;
import org.dromara.system.api.RemoteUserService; import org.dromara.system.api.RemoteUserService;
import org.dromara.system.api.domain.vo.RemoteClientVo; import org.dromara.system.api.domain.vo.RemoteClientVo;
import org.dromara.system.api.model.XcxLoginUser; import org.dromara.system.api.model.XcxLoginUser;
...@@ -39,12 +42,24 @@ public class XcxAuthStrategy implements IAuthStrategy { ...@@ -39,12 +42,24 @@ public class XcxAuthStrategy implements IAuthStrategy {
// xcxCode 为 小程序调用 wx.login 授权后获取 // xcxCode 为 小程序调用 wx.login 授权后获取
String xcxCode = loginBody.getXcxCode(); String xcxCode = loginBody.getXcxCode();
// 多个小程序识别使用 // 多个小程序识别使用
String appid = loginBody.getAppid(); // String appid = loginBody.getAppid();
WxAuthResp auth = WeixinUtils.auth(new WxAuthReq()
.setCode(xcxCode)
.setAppid(client.getClientKey())
.setSecret(client.getClientSecret()));
// todo 以下自行实现
// 校验 appid + appsrcret + xcxCode 调用登录凭证校验接口 获取 session_key 与 openid // 校验 appid + appsrcret + xcxCode 调用登录凭证校验接口 获取 session_key 与 openid
String openid = ""; String openid = auth.getOpenId();
XcxLoginUser loginUser = remoteUserService.getUserInfoByOpenid(openid); XcxLoginUser loginUser = remoteUserService.getUserInfoByOpenid(openid);
// 用户不存在 返回 openid
if (loginUser == null) {
LoginVo loginVo = new LoginVo();
loginVo.setOpenid(openid);
loginVo.setScope(auth.getSessionKey());
return loginVo;
}
loginUser.setClientKey(client.getClientKey()); loginUser.setClientKey(client.getClientKey());
loginUser.setDeviceType(client.getDeviceType()); loginUser.setDeviceType(client.getDeviceType());
......
package org.dromara.auth.service.impl;
import cn.dev33.satoken.stp.SaLoginModel;
import cn.dev33.satoken.stp.StpUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.dromara.auth.domain.vo.LoginVo;
import org.dromara.auth.form.XcxPhoneLoginBody;
import org.dromara.auth.service.IAuthStrategy;
import org.dromara.auth.service.SysLoginService;
import org.dromara.common.core.utils.ValidatorUtils;
import org.dromara.common.json.utils.JsonUtils;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.weixin.dto.WxAuthPhoneParseReq;
import org.dromara.common.weixin.utils.WeixinUtils;
import org.dromara.system.api.RemoteUserService;
import org.dromara.system.api.domain.bo.RemoteWxUserBo;
import org.dromara.system.api.domain.vo.RemoteClientVo;
import org.dromara.system.api.model.XcxLoginUser;
import org.springframework.stereotype.Service;
/**
* 邮件认证策略
*
* @author Michelle.Chung
*/
@Slf4j
@Service("xcxPhone" + IAuthStrategy.BASE_NAME)
@RequiredArgsConstructor
public class XcxPhoneAuthStrategy implements IAuthStrategy {
private final SysLoginService loginService;
@DubboReference
private RemoteUserService remoteUserService;
@Override
public LoginVo login(String body, RemoteClientVo client) {
XcxPhoneLoginBody loginBody = JsonUtils.parseObject(body, XcxPhoneLoginBody.class);
ValidatorUtils.validate(loginBody);
String phone = WeixinUtils.authParsePhone(new WxAuthPhoneParseReq()
.setEncryptedData(loginBody.getEncryptedData())
.setIv(loginBody.getIv())
.setSessionKey(loginBody.getSessionKey()));
remoteUserService.registerWxUserInfo(new RemoteWxUserBo()
.setTenantId(loginBody.getTenantId())
.setOpenId(loginBody.getOpenId())
.setPhonenumber(phone));
XcxLoginUser loginUser = remoteUserService.getUserInfoByOpenid(loginBody.getOpenId());
if (loginUser == null) {
throw new RuntimeException("用户不存在");
}
loginUser.setClientKey(client.getClientKey());
loginUser.setDeviceType(client.getDeviceType());
SaLoginModel model = new SaLoginModel();
model.setDevice(client.getDeviceType());
// 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置
// 例如: 后台用户30分钟过期 app用户1天过期
model.setTimeout(client.getTimeout());
model.setActiveTimeout(client.getActiveTimeout());
model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId());
// 生成token
LoginHelper.login(loginUser, model);
LoginVo loginVo = new LoginVo();
loginVo.setAccessToken(StpUtil.getTokenValue());
loginVo.setExpireIn(StpUtil.getTokenTimeout());
loginVo.setClientId(client.getClientId());
loginVo.setOpenid(loginBody.getOpenId());
return loginVo;
}
}
...@@ -45,6 +45,7 @@ ...@@ -45,6 +45,7 @@
<module>ruoyi-common-nacos</module> <module>ruoyi-common-nacos</module>
<module>ruoyi-common-bus</module> <module>ruoyi-common-bus</module>
<module>ruoyi-common-sse</module> <module>ruoyi-common-sse</module>
<module>ruoyi-common-weixin</module>
</modules> </modules>
<artifactId>ruoyi-common</artifactId> <artifactId>ruoyi-common</artifactId>
......
...@@ -215,6 +215,13 @@ ...@@ -215,6 +215,13 @@
<version>${revision}</version> <version>${revision}</version>
</dependency> </dependency>
<!-- 微信模块 -->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-weixin</artifactId>
<version>${revision}</version>
</dependency>
<!-- 租户模块 --> <!-- 租户模块 -->
<dependency> <dependency>
<groupId>org.dromara</groupId> <groupId>org.dromara</groupId>
...@@ -257,6 +264,13 @@ ...@@ -257,6 +264,13 @@
<version>${revision}</version> <version>${revision}</version>
</dependency> </dependency>
<!-- 云上 -->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-ys</artifactId>
<version>${revision}</version>
</dependency>
</dependencies> </dependencies>
</dependencyManagement> </dependencyManagement>
</project> </project>
<?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-weixin</artifactId>
<description>
ruoyi-common-weixin 微信模块
</description>
<dependencies>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-core</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>30.0-jre</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.70</version> <!-- 请使用最新版本 -->
</dependency>
</dependencies>
</project>
package org.dromara.common.weixin.config;
/**
* @author hzh
* @date 2024-11-12
* @desc 微信配置
**/
public class WeixinConfiguration {
/**
* 微信登录地址
*/
public static final String AUTH_URL = "https://api.weixin.qq.com/sns/jscode2session?" ;
/**
* 类型
*/
public static final String AUTH_GRANT_TYPE = "authorization_code" ;
}
package org.dromara.common.weixin.dto;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* @author wangxiao
*/
@Data
@Accessors(chain = true)
public class WxAuthPhoneParseReq {
/**
* 用户信息,base64编码
*/
private String encryptedData;
/**
* 加密算法的初始向量
*/
private String iv;
/**
* 用户登录凭证
*/
private String sessionKey;
}
package org.dromara.common.weixin.dto;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* @author hzh
* @date 2024-11-12
* @desc 微信授权请求参数
**/
@Data
@Accessors(chain = true)
public class WxAuthReq {
/**
* appid
*/
private String appid;
/**
* 密钥
*/
private String secret;
/**
* code
*/
private String code;
}
package org.dromara.common.weixin.dto;
import lombok.Data;
/**
* @author hzh
* @date 2024-11-12
* @desc 微信授权返回
**/
@Data
public class WxAuthResp {
/**
* openId
*/
private String openId;
/**
* sessionKey
*/
private String sessionKey;
}
package org.dromara.common.weixin.utils;
import com.alibaba.fastjson.JSON;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.AlgorithmParameters;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.security.Security;
import java.security.spec.InvalidParameterSpecException;
import java.util.Base64;
/**
* 用于解密微信手机号
*
* @author tyj
*/
public class AesForWxGetPhoneNumber {
/**
* 加密方式
*/
private static final String KEY_ALGORITHM = "AES";
/**
* 避免重复new生成多个BouncyCastleProvider对象,因为GC回收不了,会造成内存溢出
* 只在第一次调用decrypt()方法时才new 对象
*/
private static boolean initialized = false;
/**
* 用于Base64解密
*/
private final Base64.Decoder decoder = Base64.getDecoder();
/**
* 待解密的数据
*/
private final String originalContent;
/**
* 会话密钥sessionKey
*/
private final String encryptKey;
/**
* 加密算法的初始向量
*/
private final String iv;
public AesForWxGetPhoneNumber(String originalContent, String encryptKey, String iv) {
this.originalContent = originalContent;
this.encryptKey = encryptKey;
this.iv = iv;
}
/**
* BouncyCastle作为安全提供,防止我们加密解密时候因为jdk内置的不支持改模式运行报错。
**/
private static void initialize() {
if (initialized) {
return;
}
Security.addProvider(new BouncyCastleProvider());
initialized = true;
}
/**
* 生成 AlgorithmParameters
*
* @param iv iv
* @return AlgorithmParameters
*/
private static AlgorithmParameters generateIv(byte[] iv) throws NoSuchAlgorithmException, InvalidParameterSpecException {
AlgorithmParameters params = AlgorithmParameters.getInstance(KEY_ALGORITHM);
params.init(new IvParameterSpec(iv));
return params;
}
/**
* AES解密
* 填充模式AES/CBC/PKCS7Padding
* 解密模式128
*
* @return 解密后的信息对象
*/
public WxPhoneDecryptInfo decrypt() throws Exception {
initialize();
//数据填充方式
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
Key sKeySpec = new SecretKeySpec(decoder.decode(this.encryptKey), KEY_ALGORITHM);
// 初始化
cipher.init(Cipher.DECRYPT_MODE, sKeySpec, generateIv(decoder.decode(this.iv)));
byte[] data = cipher.doFinal(decoder.decode(this.originalContent));
String dataStr = new String(data, StandardCharsets.UTF_8);
return JSON.toJavaObject(JSON.parseObject(dataStr), WxPhoneDecryptInfo.class);
}
}
package org.dromara.common.weixin.utils;
import cn.hutool.http.HttpRequest;
import com.alibaba.fastjson.JSONObject;
import com.google.common.base.Joiner;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.weixin.dto.WxAuthPhoneParseReq;
import org.dromara.common.weixin.dto.WxAuthReq;
import org.dromara.common.weixin.dto.WxAuthResp;
import java.util.HashMap;
import java.util.Map;
import static org.dromara.common.weixin.config.WeixinConfiguration.AUTH_GRANT_TYPE;
import static org.dromara.common.weixin.config.WeixinConfiguration.AUTH_URL;
/**
* @author hzh
* @date 2024-11-12
* @desc 微信工具类
**/
@Slf4j
public class WeixinUtils {
private static String buildWxLoginUrl(Map<String, String> params) {
return AUTH_URL.concat(Joiner.on("&").withKeyValueSeparator("=").join(params));
}
/**
* 微信授权
*
* @param req 请求参数
* @return 返回结果
*/
public static WxAuthResp auth(WxAuthReq req) {
Map<String, String> params = new HashMap<>(8);
params.put("appid", req.getAppid());
params.put("secret", req.getSecret());
params.put("js_code", req.getCode());
params.put("grant_type", AUTH_GRANT_TYPE);
WxAuthResp resp;
try {
String result = buildWxLoginUrl(params);
HttpRequest httpRequest = HttpRequest.get(result);
String response = httpRequest.execute().body();
log.info("微信返回参数 response:{}", response);
String openid = JSONObject.parseObject(response).getString("openid");
//调用微信获取手机号功能,需要同步拿到sessionKey
String sessionKey = JSONObject.parseObject(response).getString("session_key");
log.info("code:{},openId:{},sessionKey:{}", req.getCode(), openid, sessionKey);
resp = new WxAuthResp();
resp.setOpenId(openid);
resp.setSessionKey(sessionKey);
} catch (Exception e) {
log.error("code to auth error", e);
throw new RuntimeException("微信登录失败!");
}
return resp;
}
public static String authParsePhone(WxAuthPhoneParseReq vo) {
String encryptedData = vo.getEncryptedData();
String sessionKey = vo.getSessionKey();
String iv = vo.getIv();
try {
AesForWxGetPhoneNumber aesForWxGetPhoneNumber = new AesForWxGetPhoneNumber(encryptedData, sessionKey, iv);
WxPhoneDecryptInfo decrypt = aesForWxGetPhoneNumber.decrypt();
//解密拿到手机号
return decrypt.getPhoneNumber();
} catch (Exception e) {
log.error("parse phone error", e);
throw new RuntimeException("微信授权手机号解析失败。");
}
}
}
package org.dromara.common.weixin.utils;
import lombok.Data;
/**
* @author tyj
*/
@Data
public class WxPhoneDecryptInfo {
private String phoneNumber;
private String purePhoneNumber;
private int countryCode;
private String watermark;
}
<?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-ys</artifactId>
<description>
ruoyi-common-ys 云上接口模块
</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.ys;
import cn.hutool.core.date.StopWatch;
import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.http.ContentType;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.ys.base.HttpKit;
import org.dromara.common.ys.base.PayKit;
import org.dromara.common.ys.common.ApiHttpResponse;
import org.dromara.common.ys.config.Config;
import org.dromara.common.ys.config.ProdConfig;
import org.dromara.common.ys.enums.ApiEnum;
import org.dromara.common.ys.enums.Domain;
import org.dromara.common.ys.enums.DomainEnum;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
/**
* @author hzh
* @date 2024-10-15
* @desc api相关接口
**/
@Slf4j
public class Api {
/**
* 获取接口请求的 URL
*
* @param apiEnum {@link ApiEnum} API 接口枚举
* @return {@link String} 返回完整的接口请求URL
*/
public static String getReqUrl(ApiEnum apiEnum) {
return getReqUrl(apiEnum, null);
}
/**
* 获取接口请求的 URL
*
* @param apiEnum {@link ApiEnum} API 接口枚举
* @param domain {@link Domain} API 接口域名枚举
* @return {@link String} 返回完整的接口请求URL
*/
public static String getReqUrl(ApiEnum apiEnum, Domain domain) {
if (domain == null) {
domain = DomainEnum.TEST;
}
return domain.getDomain()
.concat(apiEnum.getUrl());
}
public static ApiHttpResponse v1(com.wenhe.base.base.RequestMethodEnum method, String urlPrefix, String urlSuffix,
String userId,
String body) {
return v1(method, urlPrefix, urlSuffix, userId, null, body, null);
}
public static ApiHttpResponse v1(com.wenhe.base.base.RequestMethodEnum method, String urlPrefix, String urlSuffix,
String userId,
Map<String, Object> params, String body) {
return v1(method, urlPrefix, urlSuffix, userId, params, body, null);
}
/**
* v1 接口统一执行人口
*
* @param method {@link com.wenhe.base.base.RequestMethodEnum} 请求方法
* @param urlPrefix 可通过 {@link org.dromara.common.ys.enums.Domain}来获取
* @param urlSuffix 可通过 {@link org.dromara.common.ys.enums.ApiEnum} 来获取,URL挂载参数需要自行拼接
* @param userId 用户ID
* @param params Get 接口请求参数
* @param body 接口请求参数
* @param file 文件
* @return 请求返回的结果
*/
public static ApiHttpResponse v1(com.wenhe.base.base.RequestMethodEnum method, String urlPrefix, String urlSuffix,
String userId,
Map<String, Object> params, String body, File file) {
if (null != params && !params.keySet().isEmpty()) {
urlSuffix = urlSuffix.concat("?").concat(PayKit.createLinkString(params, true));
}
// 构建 Authorization
String authorization = userId;
if (method == com.wenhe.base.base.RequestMethodEnum.GET) {
return get(urlPrefix.concat(urlSuffix), authorization, null);
} else if (method == com.wenhe.base.base.RequestMethodEnum.POST) {
return post(urlPrefix.concat(urlSuffix), authorization, body);
} else if (method == com.wenhe.base.base.RequestMethodEnum.DELETE) {
return delete(urlPrefix.concat(urlSuffix), authorization, body);
} else if (method == com.wenhe.base.base.RequestMethodEnum.UPLOAD) {
return upload(urlPrefix.concat(urlSuffix), authorization, body, file);
} else if (method == com.wenhe.base.base.RequestMethodEnum.PATCH) {
return patch(urlPrefix.concat(urlSuffix), authorization, body);
} else if (method == com.wenhe.base.base.RequestMethodEnum.PUT) {
return put(urlPrefix.concat(urlSuffix), authorization, body);
}
return null;
}
/**
* put 请求
*
* @param url 请求url
* @param authorization 授权信息
* @param data 请求参数
* @return {@link ApiHttpResponse} 请求返回的结果
*/
public static ApiHttpResponse put(String url, String authorization, String data) {
return put(url, data, getHeaders(authorization, isProd(url)));
}
/**
* put 请求
*
* @param url 请求url
* @param data 请求参数
* @param headers 请求头
* @return {@link ApiHttpResponse} 请求返回的结果
*/
public static ApiHttpResponse put(String url, String data, Map<String, String> headers) {
return HttpKit.getDelegate().put(url, data, headers);
}
/**
* patch 请求
*
* @param url 请求url
* @param authorization 授权信息
* @param data 请求参数
* @return {@link ApiHttpResponse} 请求返回的结果
*/
public static ApiHttpResponse patch(String url, String authorization, String data) {
return patch(url, data, getHeaders(authorization, isProd(url)));
}
/**
* patch 请求
*
* @param url 请求url
* @param data 请求参数
* @param headers 请求头
* @return {@link ApiHttpResponse} 请求返回的结果
*/
public static ApiHttpResponse patch(String url, String data, Map<String, String> headers) {
return HttpKit.getDelegate().patch(url, data, headers);
}
/**
* upload 请求
*
* @param url 请求url
* @param authorization 授权信息
* @param data 请求参数
* @param file 上传文件
* @return {@link ApiHttpResponse} 请求返回的结果
*/
public static ApiHttpResponse upload(String url, String authorization, String data, File file) {
Map<String, Object> paramMap = new HashMap<>(2);
paramMap.put("file", file);
paramMap.put("meta", data);
return upload(url, paramMap, getUploadHeaders(authorization));
}
/**
* upload 请求
*
* @param url 请求url
* @param params 请求参数
* @param headers 请求头
* @return {@link ApiHttpResponse} 请求返回的结果
*/
public static ApiHttpResponse upload(String url, Map<String, Object> params, Map<String, String> headers) {
return HttpKit.getDelegate().post(url, params, headers);
}
public static Map<String, String> getUploadHeaders(String authorization) {
Map<String, String> headers = getBaseHeaders(authorization);
headers.put("Content-Type", "multipart/form-data;boundary=\"boundary\"");
return headers;
}
/**
* delete 请求
*
* @param url 请求url
* @param authorization 授权信息
* @param data 请求参数
* @return {@link ApiHttpResponse} 请求返回的结果
*/
public static ApiHttpResponse delete(String url, String authorization, String data) {
return delete(url, data, getHeaders(authorization, isProd(url)));
}
/**
* delete 请求
*
* @param url 请求url
* @param data 请求参数
* @param headers 请求头
* @return {@link ApiHttpResponse} 请求返回的结果
*/
public static ApiHttpResponse delete(String url, String data, Map<String, String> headers) {
return HttpKit.getDelegate().delete(url, data, headers);
}
/**
* post 请求
*
* @param url 请求url
* @param authorization 授权信息
* @param data 请求参数
* @return {@link ApiHttpResponse} 请求返回的结果
*/
public static ApiHttpResponse post(String url, String authorization, String data) {
return post(url, data, getHeaders(authorization, isProd(url)));
}
/**
* post 请求
*
* @param url 请求url
* @param data 请求参数
* @param headers 请求头
* @return {@link ApiHttpResponse} 请求返回的结果
*/
public static ApiHttpResponse post(String url, String data, Map<String, String> headers) {
// log.info("请求路径:{}", url);
log.info("请求头:{}", JSON.toJSONString(headers));
log.info("请求体:{}", data);
StopWatch watch = new StopWatch();
watch.start();
ApiHttpResponse res = HttpKit.getDelegate().post(url, data, headers);
log.info("返回参数:{}", JSON.toJSONString(res));
watch.stop();
log.info("请求耗时:{}ms", watch.getTotalTimeMillis());
return res;
}
/**
* get 请求
*
* @param url 请求url
* @param authorization 授权信息
* @param params 请求参数
* @return {@link ApiHttpResponse} 请求返回的结果
*/
public static ApiHttpResponse get(String url, String authorization, Map<String, Object> params) {
return get(url, params, getHeaders(authorization, isProd(url)));
}
public static boolean isProd(String url) {
return url.startsWith(DomainEnum.PROD.getDomain());
}
/**
* get 请求
*
* @param url 请求url
* @param params 请求参数
* @param headers 请求头
* @return {@link ApiHttpResponse} 请求返回的结果
*/
public static ApiHttpResponse get(String url, Map<String, Object> params, Map<String, String> headers) {
return HttpKit.getDelegate().get(url, params, headers);
}
public static Map<String, String> getHeaders(String authorization, boolean isProd) {
Map<String, String> headers = getBaseHeaders(authorization);
String signKey = Config.SIGN_KEY;
String corpId = Config.CORP_ID;
if (isProd) {
signKey = ProdConfig.SIGN_KEY;
corpId = ProdConfig.CORP_ID;
}
headers.put("Accept-language", "zh-CN,zh");
headers.put("Content-Type", ContentType.JSON.toString());
headers.put("reqType", Config.REQ_TYPE);
headers.put("corpId", corpId);
headers.put("timestamp", System.currentTimeMillis() + "");
headers.put("user", authorization);
headers.put("sign", md5Sign(headers.get("corpId"), headers.get("timestamp"), signKey));
return headers;
}
public static String md5Sign(String bussId, String reqId, String signKey) {
String sign = SecureUtil.md5(bussId + "&" + reqId);
if (CharSequenceUtil.isNotEmpty(signKey)) {
sign = SecureUtil.md5(signKey + "&" + sign);
}
return sign;
}
public static Map<String, String> getBaseHeaders(String authorization) {
Map<String, String> headers = new HashMap<>(5);
headers.put("Accept", ContentType.JSON.toString());
headers.put("Authorization", authorization);
return headers;
}
}
package org.dromara.common.ys.base;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.net.SSLContextBuilder;
import cn.hutool.core.net.SSLProtocols;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONObject;
import org.dromara.common.ys.common.ApiHttpResponse;
import javax.net.ssl.KeyManager;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLSocketFactory;
import java.io.File;
import java.io.InputStream;
import java.net.Proxy;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.security.KeyStore;
import java.security.SecureRandom;
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 abstract class AbstractHttpDelegate {
/**
* 设置代理
*
* @return {@link Proxy} 代理对象
*/
public Proxy getProxy() {
return null;
}
/**
* get 请求
*
* @param url 请求url
* @return {@link String} 请求返回的结果
*/
public String get(String url) {
return HttpUtil.get(url);
}
/**
* get 请求
*
* @param url 请求url
* @param paramMap 请求参数
* @return {@link String} 请求返回的结果
*/
public String get(String url, Map<String, Object> paramMap) {
return HttpUtil.get(url, paramMap);
}
/**
* get 请求
*
* @param url 请求url
* @param paramMap 请求参数
* @param headers 请求头
* @return {@link ApiHttpResponse} 请求返回的结果
*/
public ApiHttpResponse get(String url, Map<String, Object> paramMap, Map<String, String> headers) {
HttpResponse httpResponse = getToResponse(url, paramMap, headers);
return JSONObject.parseObject(httpResponse.body(), ApiHttpResponse.class);
}
/**
* post 请求
*
* @param url 请求url
* @param data 请求参数
* @return {@link String} 请求返回的结果
*/
public String post(String url, String data) {
return HttpUtil.post(url, data);
}
/**
* post 请求
*
* @param url 请求url
* @param paramMap 请求参数
* @return {@link String} 请求返回的结果
*/
public String post(String url, Map<String, Object> paramMap) {
return HttpUtil.post(url, paramMap);
}
/**
* post 请求
*
* @param url 请求url
* @param paramMap 请求参数
* @param headers 请求头
* @return {@link ApiHttpResponse} 请求返回的结果
*/
public ApiHttpResponse post(String url, Map<String, Object> paramMap, Map<String, String> headers) {
HttpResponse httpResponse = postToResponse(url, headers, paramMap);
return JSONObject.parseObject(httpResponse.body(), ApiHttpResponse.class);
}
/**
* post 请求
*
* @param url 请求url
* @param data 请求参数
* @param headers 请求头
* @return {@link ApiHttpResponse} 请求返回的结果
*/
public ApiHttpResponse post(String url, String data, Map<String, String> headers) {
HttpResponse httpResponse = postToResponse(url, headers, data);
return JSONObject.parseObject(httpResponse.body(), ApiHttpResponse.class);
}
/**
* patch 请求
*
* @param url 请求url
* @param paramMap 请求参数
* @param headers 请求头
* @return {@link ApiHttpResponse} 请求返回的结果
*/
public ApiHttpResponse patch(String url, Map<String, Object> paramMap, Map<String, String> headers) {
HttpResponse httpResponse = patchToResponse(url, headers, paramMap);
return JSONObject.parseObject(httpResponse.body(), ApiHttpResponse.class);
}
/**
* patch 请求
*
* @param url 请求url
* @param data 请求参数
* @param headers 请求头
* @return {@link ApiHttpResponse} 请求返回的结果
*/
public ApiHttpResponse patch(String url, String data, Map<String, String> headers) {
HttpResponse httpResponse = patchToResponse(url, headers, data);
return JSONObject.parseObject(httpResponse.body(), ApiHttpResponse.class);
}
/**
* delete 请求
*
* @param url 请求url
* @param paramMap 请求参数
* @param headers 请求头
* @return {@link ApiHttpResponse} 请求返回的结果
*/
public ApiHttpResponse delete(String url, Map<String, Object> paramMap, Map<String, String> headers) {
HttpResponse httpResponse = deleteToResponse(url, headers, paramMap);
return JSONObject.parseObject(httpResponse.body(), ApiHttpResponse.class);
}
/**
* delete 请求
*
* @param url 请求url
* @param data 请求参数
* @param headers 请求头
* @return {@link ApiHttpResponse} 请求返回的结果
*/
public ApiHttpResponse delete(String url, String data, Map<String, String> headers) {
HttpResponse httpResponse = deleteToResponse(url, headers, data);
return JSONObject.parseObject(httpResponse.body(), ApiHttpResponse.class);
}
/**
* put 请求
*
* @param url 请求url
* @param paramMap 请求参数
* @param headers 请求头
* @return {@link ApiHttpResponse} 请求返回的结果
*/
public ApiHttpResponse put(String url, Map<String, Object> paramMap, Map<String, String> headers) {
HttpResponse httpResponse = putToResponse(url, headers, paramMap);
return JSONObject.parseObject(httpResponse.body(), ApiHttpResponse.class);
}
/**
* put 请求
*
* @param url 请求url
* @param data 请求参数
* @param headers 请求头
* @return {@link ApiHttpResponse} 请求返回的结果
*/
public ApiHttpResponse put(String url, String data, Map<String, String> headers) {
HttpResponse httpResponse = putToResponse(url, headers, data);
return JSONObject.parseObject(httpResponse.body(), ApiHttpResponse.class);
}
/**
* 上传文件
*
* @param url 请求url
* @param data 请求参数
* @param certPath 证书路径
* @param certPass 证书密码
* @param filePath 上传文件路径
* @param protocol 协议
* @return {@link String} 请求返回的结果
*/
public String upload(String url, String data, String certPath, String certPass, String filePath, String protocol) {
try {
File file = FileUtil.newFile(filePath);
SSLSocketFactory sslSocketFactory = getSslSocketFactory(certPath, null, certPass, protocol);
return HttpRequest.post(url)
.setProxy(getProxy())
.setSSLSocketFactory(sslSocketFactory)
.header("Content-Type", "multipart/form-data;boundary=\"boundary\"")
.form("file", file)
.form("meta", data)
.execute()
.body();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 上传文件
*
* @param url 请求url
* @param data 请求参数
* @param certPath 证书路径
* @param certPass 证书密码
* @param filePath 上传文件路径
* @return {@link String} 请求返回的结果
*/
public String upload(String url, String data, String certPath, String certPass, String filePath) {
return upload(url, data, certPath, certPass, filePath, SSLProtocols.TLSv1);
}
/**
* post 请求
*
* @param url 请求url
* @param data 请求参数
* @param certPath 证书路径
* @param certPass 证书密码
* @param protocol 协议
* @return {@link String} 请求返回的结果
*/
public String post(String url, String data, String certPath, String certPass, String protocol) {
try {
SSLSocketFactory socketFactory = getSslSocketFactory(certPath, null, certPass, protocol);
return HttpRequest.post(url)
.setProxy(getProxy())
.setSSLSocketFactory(socketFactory)
.body(data)
.execute()
.body();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* post 请求
*
* @param url 请求url
* @param data 请求参数
* @param certPath 证书路径
* @param certPass 证书密码
* @return {@link String} 请求返回的结果
*/
public String post(String url, String data, String certPath, String certPass) {
return post(url, data, certPath, certPass, SSLProtocols.TLSv1);
}
/**
* post 请求
*
* @param url 请求url
* @param data 请求参数
* @param certFile 证书文件输入流
* @param certPass 证书密码
* @param protocol 协议
* @return {@link String} 请求返回的结果
*/
public String post(String url, String data, InputStream certFile, String certPass, String protocol) {
try {
SSLSocketFactory sslSocketFactory = getSslSocketFactory(null, certFile, certPass, protocol);
return HttpRequest.post(url)
.setProxy(getProxy())
.setSSLSocketFactory(sslSocketFactory)
.body(data)
.execute()
.body();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* post 请求
*
* @param url 请求url
* @param data 请求参数
* @param certFile 证书文件输入流
* @param certPass 证书密码
* @return {@link String} 请求返回的结果
*/
public String post(String url, String data, InputStream certFile, String certPass) {
return post(url, data, certFile, certPass, SSLProtocols.TLSv1);
}
/**
* get 请求
*
* @param url 请求url
* @param paramMap 请求参数
* @param headers 请求头
* @return {@link HttpResponse} 请求返回的结果
*/
private HttpResponse getToResponse(String url, Map<String, Object> paramMap, Map<String, String> headers) {
return HttpRequest.get(url)
.setProxy(getProxy())
.addHeaders(headers)
.form(paramMap)
.execute();
}
/**
* post 请求
*
* @param url 请求url
* @param headers 请求头
* @param data 请求参数
* @return {@link HttpResponse} 请求返回的结果
*/
private HttpResponse postToResponse(String url, Map<String, String> headers, String data) {
return HttpRequest.post(url)
.setProxy(getProxy())
.addHeaders(headers)
.body(data)
.execute();
}
/**
* post 请求
*
* @param url 请求url
* @param headers 请求头
* @param paramMap 请求参数
* @return {@link HttpResponse} 请求返回的结果
*/
private HttpResponse postToResponse(String url, Map<String, String> headers, Map<String, Object> paramMap) {
return HttpRequest.post(url)
.setProxy(getProxy())
.addHeaders(headers)
.form(paramMap)
.execute();
}
/**
* patch 请求
*
* @param url 请求url
* @param headers 请求头
* @param paramMap 请求参数
* @return {@link HttpResponse} 请求返回的结果
*/
private HttpResponse patchToResponse(String url, Map<String, String> headers, Map<String, Object> paramMap) {
return HttpRequest.patch(url)
.setProxy(getProxy())
.addHeaders(headers)
.form(paramMap)
.execute();
}
/**
* patch 请求
*
* @param url 请求url
* @param headers 请求头
* @param data 请求参数
* @return {@link HttpResponse} 请求返回的结果
*/
private HttpResponse patchToResponse(String url, Map<String, String> headers, String data) {
return HttpRequest.patch(url)
.setProxy(getProxy())
.addHeaders(headers)
.body(data)
.execute();
}
/**
* delete 请求
*
* @param url 请求url
* @param headers 请求头
* @param data 请求参数
* @return {@link HttpResponse} 请求返回的结果
*/
private HttpResponse deleteToResponse(String url, Map<String, String> headers, String data) {
return HttpRequest.delete(url)
.setProxy(getProxy())
.addHeaders(headers)
.body(data)
.execute();
}
/**
* delete 请求
*
* @param url 请求url
* @param headers 请求头
* @param paramMap 请求参数
* @return {@link HttpResponse} 请求返回的结果
*/
private HttpResponse deleteToResponse(String url, Map<String, String> headers, Map<String, Object> paramMap) {
return HttpRequest.delete(url)
.setProxy(getProxy())
.addHeaders(headers)
.form(paramMap)
.execute();
}
/**
* put 请求
*
* @param url 请求url
* @param headers 请求头
* @param data 请求参数
* @return {@link HttpResponse} 请求返回的结果
*/
private HttpResponse putToResponse(String url, Map<String, String> headers, String data) {
return HttpRequest.put(url)
.setProxy(getProxy())
.addHeaders(headers)
.body(data)
.execute();
}
/**
* put 请求
*
* @param url 请求url
* @param headers 请求头
* @param paramMap 请求参数
* @return {@link HttpResponse} 请求返回的结果
*/
private HttpResponse putToResponse(String url, Map<String, String> headers, Map<String, Object> paramMap) {
return HttpRequest.put(url)
.setProxy(getProxy())
.addHeaders(headers)
.form(paramMap)
.execute();
}
private KeyManager[] getKeyManager(String certPass, String certPath, InputStream certFile) throws Exception {
KeyStore clientStore = KeyStore.getInstance("PKCS12");
if (certFile != null) {
clientStore.load(certFile, certPass.toCharArray());
} else {
clientStore.load(Files.newInputStream(Paths.get(certPath)), certPass.toCharArray());
}
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(clientStore, certPass.toCharArray());
return kmf.getKeyManagers();
}
private SSLSocketFactory getSslSocketFactory(String certPath, InputStream certFile, String certPass, String protocol) throws Exception {
SSLContextBuilder sslContextBuilder = SSLContextBuilder.create();
sslContextBuilder.setProtocol(protocol);
sslContextBuilder.setKeyManagers(getKeyManager(certPass, certPath, certFile));
sslContextBuilder.setSecureRandom(new SecureRandom());
return sslContextBuilder.buildChecked().getSocketFactory();
}
}
package org.dromara.common.ys.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.ys.base;
import cn.hutool.core.util.CharsetUtil;
import java.io.UnsupportedEncodingException;
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 com.wenhe.base.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.ys.common;
import lombok.Data;
/**
* @author hzh
* @date 2024-10-15
* @desc 响应实体
**/
@Data
public class ApiHttpResponse {
/**
* 业务处理失败时,错误提示信息
*/
private String tips;
/**
* 当前时间戳
*/
private Long timestamp;
/**
* 请求唯一标识,可以将此标识提供给技术人员,方便快速定位错误日志
*/
private String requuid;
/**
* 业务处理失败时,异常信息,用于开发阶段快速定位问题,不能当做业务逻辑字段使用
*/
private String errMsg;
/**
* 业务错误代码 1表示成功,其他值的含义参见具体业务接口文档 ,
*/
private String errCode;
/**
* 环境标识 test:测试环境,prod:生产线上环境
*/
private String env;
/**
* 返回数据
*/
private String data;
}
package org.dromara.common.ys.common;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* code返回值
*
* @author wenhe
*/
@Getter
@AllArgsConstructor
public enum Code {
/**
* 成功
*/
SUCCESS("1", "成功");
private final String code;
private final String message;
}
package org.dromara.common.ys.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.ys.config;
/**
* 配置项
*
* @author wenhe
*/
public interface Config {
/**
* 请求来源
*/
String REQ_TYPE = "8" ;
/**
* 企业ID
*/
String CORP_ID = "3245263884b744eb95a2d75748138bba" ;
/**
* 签名key
*/
String SIGN_KEY = "1729128513420" ;
/**
* 默认用户id
*/
String USE_ID = "15301818478" ;
}
package org.dromara.common.ys.config;
/**
* 配置项
*
* @author wenhe
*/
public interface ProdConfig {
/**
* 请求来源
*/
String REQ_TYPE = "8" ;
/**
* 企业ID
*/
String CORP_ID = "c619f1b600cf483eab6a142fa0e8e10b" ;
/**
* 签名key
*/
String SIGN_KEY = "1729128597852" ;
}
package org.dromara.common.ys.constant;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 产品类型
*
* @author wenhe
*/
@Getter
@AllArgsConstructor
public enum Cplx {
/**
* 国内机票
*/
DOMESTIC("10901"),
/**
* 国际机票
*/
INTERNATIONAL("10902"),
/**
* 酒店
*/
HOTEL("10903"),
/**
* 火车票
*/
TRAIN("10904"),
/**
* 用车
*/
CAR("10906"),
/**
* 签证
*/
VISA("10913"),
/**
* 旅游
*/
TOUR("10918");
private final String code;
}
package org.dromara.common.ys.constant;
/**
* 证件类型
*
* @author wenhe
*/
public enum IDType {
/**
* 身份证
*/
NI,
/**
* 护照
*/
PP,
/**
* 其他
*/
ID
}
package org.dromara.common.ys.constant;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author wenhe
*/
@Getter
@AllArgsConstructor
public enum Sex {
/**
* 男
*/
M,
/**
* 女
*/
F
}
package org.dromara.common.ys.constant;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum Status {
TRUE(1),
FALSE(0);
private final int code;
}
package org.dromara.common.ys.constant;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author wenhe
*/
@Getter
@AllArgsConstructor
public enum TripType {
/**
* 应公
*/
PUBLIC("1"),
/**
* 应私
*/
PRIVATE("2");
private final String code;
}
package org.dromara.common.ys.constant.airport;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author wenhe
*/
@Getter
@AllArgsConstructor
public enum DateType {
/**
* 预定日期
*/
PRE_DATE(1, "预定日期"),
/**
* 出行日期
*/
TRAVEL_DATE(2, "出行日期"),
/**
* 出票/确认日期
*/
TICKET_DATE(3, "出票/确认日期");
private final int code;
private final String desc;
}
package org.dromara.common.ys.constant.airport;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author wenhe
*/
@Getter
@AllArgsConstructor
public enum OrderStatus {
/**
* 申请中
*/
APPLY("0", "申请中"),
/**
* 待送审
*/
WAIT_SEND("1", "待送审"),
/**
* 审批中
*/
AUDIT("2", "审批中"),
/**
* 待支付
*/
WAIT_PAY("3", "待支付"),
/**
* 待出票
*/
WAIT_OUT("4", "待出票"),
/**
* 已出票
*/
OUT_TICKET("6", "已出票"),
/**
* 已取消
*/
CANCEL("7", "已取消"),
/**
* 审批拒绝
*/
REFUSE_AUDIT("9", "审批拒绝"),
/**
* 出票中
*/
OUT_TICKETING("10", "出票中");
private final String code;
private final String desc;
}
package org.dromara.common.ys.constant.airport;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author wenhe
*/
@Getter
@AllArgsConstructor
public enum PersonType {
/**
* 成人
*/
ADULT("1"),
/**
* 儿童
*/
CHILDREN("2"),
/**
* 婴儿
*/
BABY("3");
private final String code;
}
package org.dromara.common.ys.constant.airport;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author wenhe
*/
@Getter
@AllArgsConstructor
public enum SendMode {
/**
* 不需要报销凭证
*/
NO_EXAM("0", "不需要报销凭证"),
/**
* 邮寄
* /
*/
MAIL("1", "邮寄"),
/**
* 公司统一配送
*/
COMPANY("2", "公司统一配送");
private final String code;
private final String desc;
}
package org.dromara.common.ys.constant.airport;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 航程类型
*
* @author wenhe
*/
@Getter
@AllArgsConstructor
public enum VoyageType {
/**
* 单程
*/
ONE(1, "单程"),
/**
* 往返
*/
TWO(2, "往返"),
/**
* 连程
*/
THREE(3, "连程"),
/**
* 缺口程
*/
FOUR(4, "缺口程");
private final Integer code;
private final String desc;
}
package org.dromara.common.ys.constant.org;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author hzh
* @date 2024-10-23
* @desc 出差审批属性
**/
@Getter
@AllArgsConstructor
public enum AppTravel {
/**
* 审批
*/
APPROVAL(0),
/**
* 全免
*/
ALL_FREE(1),
/**
* 个免
*/
PERSONAL_FREE(2);
private final int travel;
}
package org.dromara.common.ys.constant.org;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 预定范围
*
* @author wenhe
*/
@Getter
@AllArgsConstructor
public enum BookRange {
//预订范围, 0:,1:为本部门订票,2:为全公司预订,3:指定部门, 默认为0
/**
* 本人预订
*/
SELF(0),
/**
* 本部门预订
*/
DEPT(1),
/**
* 全公司预订
*/
COMPANY(2),
/**
* 指定部门预订
*/
APPOINT_DEPT(3);
private final int range;
}
package org.dromara.common.ys.constant.org;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 员工权限等级
*
* @author wenhe
*/
@Getter
@AllArgsConstructor
public enum PopLevel {
/**
* 员工
*/
STAFF(1),
/**
* 主管
*/
CHARGE(3),
/**
* 经理
*/
MANAGER(5);
private final int level;
}
package org.dromara.common.ys.constant.vehicles;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author hzh
* @date 2024-10-22
* @desc 用车类型
**/
@Getter
@AllArgsConstructor
public enum UseType {
/**
* 1日包
*/
DAY("1"),
/**
* 半日包
*/
HALF_DAY("2"),
/**
* 接机
*/
RECEIVE_AIRPORT("4"),
/**
* 送机
*/
ARRIVE_AIRPORT("5"),
/**
* 接站
*/
RECEIVE_STATION("6"),
/**
* 送站
*/
ARRIVE_STATION("7"),
/**
* 即时
*/
IMMEDIATE("8"),
/**
* 预约
*/
PRE_BOOK("9");
private final String code;
}
package org.dromara.common.ys.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.ys.enums;
/**
* 获取可用域名
*
* @author wenhe
*/
public interface Domain {
/**
* 获取域名
*
* @return 返回域名
*/
String getDomain();
}
package org.dromara.common.ys.enums;
/**
* 域名枚举
*
* @author wenhe
*/
public enum DomainEnum implements Domain {
/**
* 测试域名
*/
TEST("https://testxossapi.ystmc.com"),
/**
* 生产域名
*/
PROD("https://ossapi.ystmc.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.ys.enums.airport;
import org.dromara.common.ys.enums.ApiEnum;
/**
* 公共资源接口
*
* @author wenhe
*/
public enum AirportApiEnum implements ApiEnum {
/**
* 航班查询(全部)
*/
QUERY_FLIGHT("/open/plane/shopping/queryFlight", "查询指定航程和日期的航班舱位数据,一次性返回全部航班及舱位价格数据。由于在线接口展示的是map,不便于阅读,请在网页右上角点击下载“航班查询”接口详细文档"),
/**
* 航班列表最低价查询(第一屏)
*/
QUERY_FLIGHT_MIN_PRICE("/open/plane/shopping/queryFlightMinPrice", "机票航班列表查询, 每个航班只返回一条最低价数据。"),
/**
* 指定航班获取舱位价格(第二屏)
*/
QUERY_MORE_CABIN("/open/plane/shopping/queryMoreCabin", "根据指定航班获取舱位价格列表数据集合(第二屏查询),与航班列表最低价查询(第一屏)配合使用。"),
/**
* 获取经停信息
*/
QUERY_FLIGHT_STOP("/open/plane/shopping/queryFlightStop", "根据指定航班和出发日期获取经停站信息。"),
/**
* 获取退改规则
*/
QUERY_FLIGHT_RULE("/open/plane/shopping/queryFlightRule", "根据指定航司舱位,获取退改签规则"),
/**
* 匹配差旅标准
*/
MATCH_CLBZ("/open/plane/shopping/matchClbz", "重新匹配差旅标准接口,在航班查询接口已经返回了差标的匹配结果,如想在订单提交之前重新匹配差标,可使用此接口。"),
/**
* 航段验价
*/
CHECK_PRICE_FOR_FLIGHT("/open/plane/shopping/checkPriceForFlight", "根据航段验价接口,下单前可使用此接口进行验价。由于中航信限制或航司舱位特殊要求等其他方面的原因,不是所有情况都能根据航段获取到价格。建议生成编码之后再执行价格校验。"),
/**
* 验舱
*/
CHECK_CABIN("/open/plane/shopping/checkCabin", "根据航班舱位信息验证舱位座位数"),
/**
* 验证三方协议白名单
*/
CHECK_XYH_BMD("/open/plane/shopping/checkXyhBmd", "验证三方协议白名单"),
/**
* 订单列表
*/
QUERY_ORDER_LIST("/open/plane/order/queryOrderList", "根据订单编号查看机票订单详情信息,订单不存在时,data为null"),
/**
* 创建订单
*/
BOOK_ORDER("/open/plane/shopping/bookOrder", "机票下单接口,生成机票订单。单程多人会生成一个订单(一个订单最多支持9个乘机人);多程如果选择的航司不一样,或者价格政策不相同,会生成多个订单,具体以返回的订单号为准。"),
/**
* 订单详情
*/
QUERY_TK_ORDER("/open/plane/order/queryTkOrder", "根据订单编号查看机票订单详情信息,订单不存在时,data为null"),
/**
* 订单验票
*/
CHECK_PRICE_FOR_ORDER("/open/plane/order/checkPriceForOrder", "根据机票订单编号校验订单价格,可用于支付前校验一下订单价格。"),
/**
* 确认出票
*/
CONFIRM_TICKET("/open/plane/order/confirmTicket", "机票订单确认出票;调用此接口,会自动扣款(或欠款记账)并出票。前提是企业必须开通预存或月结欠款支付,否则会提示账户问题导致出票不成功。"),
/**
* 取消订单
*/
CANCEL_TK_ORDER("/open/plane/order/cancelTkOrder", "机票订单取消;已申请、已订座状态才能取消,出票中、已出票等状态无法取消。"),
/**
* 获取客票状态
*/
PLANE_CHECK_STATE("/open/plane/order/planeCheckState", "根据订单编号获取订单下所有乘客机票的使用状态,支持正常订单和改签订单。"),
/**
* 根据票号获取客票状态
*/
GET_TICKET_STATUS("/open/plane/order/getTicketStatus", "根据票号获取客票状态"),
/**
* 获取可退航段
*/
GET_VOYAGE_FOR_REFUND("/open/plane/refund/getVoyageForRefund", "根据订单编号获取可退票的航段和乘机人集合, 必须先调用此接口获取可退航段,在页面上展示让用户选择要退的航段或乘机人,再调用退票申请接口。"),
/**
* 申请退票
*/
ADD_REFUND_ORDER("/open/plane/refund/addRefundOrder", "退票下单接口,生成机票退票单。先调用获取可退航段接口,再调用此接口。此操作必须在正常订单是已出票后的状态下,并且乘机人和航段没有发生过退改才可执行。"),
/**
* 退票单详情
*/
QUERY_REFUND_ORDER("/open/plane/refund/queryRefundOrder", "根据退票订单编号或者原订单编号获取退票单详情集合,订单不存在时,data为null"),
/**
* 取消退票单
*/
CANCEL_REFUND_ORDER("/open/plane/refund/cancelRefundOrder", "机票退票订单取消,此操作必须在退票单状态是已申请的状态下执行,如果退票单已经是办理中,则无法取消。"),
/**
* 退票单列表
*/
REFUND_QUERY_LIST("/open/plane/refund/queryList", "退票单列表"),
/**
* 获取可改签航段
*/
GET_VOYAGE_FOR_CHANGE("/open/plane/change/getVoyageForChange", "获取可改签的航段集合,先调用此接口获取可改签的航段或乘机人,在页面上展示让用户选择,再调用申请改签接口。"),
/**
* 改签航班查询
*/
QUERY_FLIGHT_FOR_CHANGE("/open/plane/change/queryFlightForChange", "改签航班查询,指定出发日期查询同一航司下所有航班原舱位或高于原舱位的数据。"),
/**
* 申请改签
*/
ADD_CHANGE_ORDER("/open/plane/change/addChangeOrder", "改签下单接口,生成改签订单。先调用获取可改签航段接口,再调用申请改签接口。此操作必须在订单是已出票后的状态下,并且乘机人和航段没有发生过退改才可执行。"),
/**
* 改签单详情
*/
QUERY_CHANGE_ORDER("/open/plane/change/queryChangeOrder", "根据改签单号或者原订单编号获取改签单详情集合,订单不存在时,data为null"),
/**
* 取消改签单
*/
CANCEL_CHANGE_ORDER("/open/plane/change/cancelChangeOrder", "机票改签订单取消,此操作必须在订单状态是已申请的状态下执行"),
/**
* 退签单列表
*/
CHANGE_QUERY_LIST("/open/plane/change/queryList", "退签单列表"),
/**
* 改签单调度
*/
CHANGE_DISPATCH("/open/plane/change/dispatch", "改签单调度");
/**
* 接口URL
*/
private final String url;
/**
* 接口描述
*/
private final String desc;
AirportApiEnum(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.ys.enums.insurance;
import org.dromara.common.ys.enums.ApiEnum;
/**
* 保险相关接口
*
* @author wenhe
*/
public enum InsuranceApiEnum implements ApiEnum {
/**
* 获取保险产品列表
*/
GET_BX_CP("/open/insurance/shopping/getBxCP", "获取保险产品列表");
/**
* 接口URL
*/
private final String url;
/**
* 接口描述
*/
private final String desc;
InsuranceApiEnum(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.ys.enums.org;
import org.dromara.common.ys.enums.ApiEnum;
/**
* 公共资源接口
*
* @author wenhe
*/
public enum OrgApiEnum implements ApiEnum {
/**
* 员工维护
*/
EDIT_EMPLOYEE("/open/travel/orgEmp/editEmployee", "新增或修改员工资料");
/**
* 接口URL
*/
private final String url;
/**
* 接口描述
*/
private final String desc;
OrgApiEnum(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.ys.enums.resource;
import org.dromara.common.ys.enums.ApiEnum;
/**
* 公共资源接口
*
* @author wenhe
*/
public enum CommonResourceApiEnum implements ApiEnum {
/**
* 获取国家数据
*/
COUNTRY_DATA("/open/bdc/geo/queryCountryData", "获取国家数据"),
/**
* 获取省份数据
*/
PROVINCE_DATA("/open/bdc/geo/queryProvinceData", "获取省份数据"),
/**
* 获取城市数据
*/
CITY_DATA("/open/bdc/geo/queryCityData", "获取城市数据"),
/**
* 获取机场数据
*/
AIRPORT_DATA("/open/bdc/geo/queryAirportData", "获取机场数据"),
/**
* 获取火车站点数据
*/
STATION_DATA("/open/bdc/geo/queryStationData", "获取火车站点数据"),
/**
* 获取火车票席别数据
*/
TRAIN_BASE_DATA("/open/bdc/geo/queryTrainBaseData", "获取火车票席别数据"),
/**
* 获取数据字典
*/
DICT_DATA("/open/bdc/dict/queryBaseData", "获取数据字典");
/**
* 接口URL
*/
private final String url;
/**
* 接口描述
*/
private final String desc;
CommonResourceApiEnum(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.ys.enums.train;
import org.dromara.common.ys.enums.ApiEnum;
/**
* 公共资源接口
*
* @author wenhe
*/
public enum TrainApiEnum implements ApiEnum {
/**
* 查询火车所有站点
*/
FIND_ALL_STATION("/open/train/shopping/findAllStation", "查询火车所有站点"),
/**
* 车次查询列表
*/
QUERY("/open/train/shopping/query", "根据出发到达获取到车次列表");
/**
* 接口URL
*/
private final String url;
/**
* 接口描述
*/
private final String desc;
TrainApiEnum(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.ys.enums.vehicles;
import org.dromara.common.ys.enums.ApiEnum;
/**
* 用车资源接口
*
* @author wenhe
*/
public enum VehiclesApiEnum implements ApiEnum {
/**
* 即时用车预估价查询
*/
ESTIMATE_JSYC_PRICE("/open/vehicles/shopping/estimateJsycPrice", "根据出发地和目的地查询车辆"),
/**
* 预约用车预估价查询
*/
ESTIMATE_YYYC_PRICE("/open/vehicles/shopping/estimateYyycPrice", "根据出发地和目的地预约用车");
/**
* 接口URL
*/
private final String url;
/**
* 接口描述
*/
private final String desc;
VehiclesApiEnum(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.ys.service;
import org.dromara.common.ys.common.PageInfo;
import org.dromara.common.ys.service.model.res.airport.*;
import java.util.List;
/**
* @author wenhe
*/
public interface IAirportService {
/**
* 查询航班
*
* @param userId 用户id
* @param model 查询参数
* @return 查询结果
*/
QueryFlightModel queryFlight(String userId, org.dromara.common.ys.service.model.req.airport.QueryFlightModel model);
/**
* 查询航班最低价
*
* @param userId 用户id
* @param model 查询参数
* @return 查询结果
*/
QueryFlightMinPriceModel queryFlightMinPrice(String userId, org.dromara.common.ys.service.model.req.airport.QueryFlightMinPriceModel model);
/**
* 查询航班停靠城市
*
* @param userId 用户id
* @param model 查询参数
* @return 查询结果
*/
QueryFlightStopModel queryFlightStop(String userId, org.dromara.common.ys.service.model.req.airport.QueryFlightStopModel model);
/**
* 创建订单
*
* @param userId 用户id
* @param model 订单
* @return 订单列表
*/
List<BookOrderModel> bookOrder(String userId, org.dromara.common.ys.service.model.req.airport.bookOrder.BookOrderModel model);
/**
* 查询订单列表
*
* @param userId 用户id
* @param model 查询参数
* @return 查询结果
*/
PageInfo<OrderListModel> orderList(String userId, org.dromara.common.ys.service.model.req.airport.OrderListModel model);
/**
* 查询订单详情
*
* @param userId 用户id
* @param model 查询参数
* @return 查询结果
*/
QueryTkOrderModel detail(String userId, org.dromara.common.ys.service.model.req.airport.QueryTkOrderModel model);
}
package org.dromara.common.ys.service;
import org.dromara.common.ys.service.model.res.comomResource.*;
import java.util.List;
/**
* 公共数据接口
*
* @author wenhe
*/
public interface ICommonResourceService {
/**
* 获取国家列表
*
* @param userId 用户id
* @return 国家列表
*/
List<CountryModel> getCountryList(String userId);
/**
* 获取省份列表
*
* @param userId 用户id
* @return 省份列表
*/
List<ProvinceModel> getProvinceList(String userId);
/**
* 获取城市列表
*
* @param userId 用户id
* @return 城市列表
*/
List<CityModel> getCityList(String userId);
/**
* 获取机场列表
*
* @param userId 用户id
* @return 机场列表
*/
List<AirportModel> getAirportList(String userId);
/**
* 获取火车站列表
*
* @param userId 用户id
* @return 火车站列表
*/
List<StationModel> getStationList(String userId);
/**
* 获取火车席别列表
*
* @param userId 用户id
* @return 火车席别列表
*/
List<TrainBaseModel> getTrainBaseList(String userId);
/**
* 获取字典列表
*
* @param userId 用户id
* @param parType 字典类型
* @return 字典列表
*/
List<DictModel> getDictList(String userId, String parType);
}
package org.dromara.common.ys.service;
import org.dromara.common.ys.service.model.res.insurance.BxcpModel;
import java.util.List;
/**
* @author wenhe
*/
public interface IInsuranceService {
/**
* 查询保险列表
*
* @param userId 用户id
* @param model 查询条件
* @return 查询结果
*/
List<BxcpModel> list(String userId, org.dromara.common.ys.service.model.req.insurance.BxcpModel model);
}
package org.dromara.common.ys.service;
import org.dromara.common.ys.service.model.req.org.EditEmployeeModel;
/**
* @author wenhe
*/
public interface IOrgService {
/**
* 批量保存或更新员工
*
* @param userId 用户id
* @param model 员工
* @return 成功或失败
*/
boolean saveOrUpdateEmployee(String userId, EditEmployeeModel model);
}
package org.dromara.common.ys.service;
import org.dromara.common.ys.service.model.res.train.AllStationModel;
import org.dromara.common.ys.service.model.res.train.QueryModel;
import java.util.List;
/**
* @author wenhe
*/
public interface ITrainService {
/**
* 查询车辆信息
*
* @param userId 用户id
* @param model 查询参数
* @return 查询结果
*/
List<QueryModel> queryModel(String userId, org.dromara.common.ys.service.model.req.train.QueryModel model);
/**
* 查询所有车站信息
*
* @param userId 用户id
* @return 查询结果
*/
List<AllStationModel> getAllStation(String userId);
}
package org.dromara.common.ys.service;
import org.dromara.common.ys.service.model.res.vehicles.EstimateJsycPriceModel;
import org.dromara.common.ys.service.model.res.vehicles.EstimateYyycPriceModel;
/**
* @author wenhe
*/
public interface IVehiclesService {
/**
* 即时用车预估价查询
*
* @param userId 用户id
* @param model 即时用车预估价查询参数
* @return 即时用车预估价查询结果
*/
EstimateJsycPriceModel estimateJsycPrice(String userId, org.dromara.common.ys.service.model.req.vehicles.EstimateJsycPriceModel model);
/**
* 预约用车预估价查询
*
* @param userId 用户id
* @param model 预约用车预估价查询参数
* @return 预约用车预估价查询结果
*/
EstimateYyycPriceModel estimateYyycPrice(String userId, org.dromara.common.ys.service.model.req.vehicles.EstimateYyycPriceModel model);
}
package org.dromara.common.ys.service.impl;
import cn.hutool.core.text.CharSequenceUtil;
import com.alibaba.fastjson.JSON;
import com.wenhe.base.base.RequestMethodEnum;
import org.dromara.common.ys.Api;
import org.dromara.common.ys.common.ApiHttpResponse;
import org.dromara.common.ys.common.Code;
import org.dromara.common.ys.common.PageInfo;
import org.dromara.common.ys.enums.DomainEnum;
import org.dromara.common.ys.enums.airport.AirportApiEnum;
import org.dromara.common.ys.service.IAirportService;
import org.dromara.common.ys.service.model.res.airport.*;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author hzh
* @date 2024-10-21
* @desc 机票相关接口
**/
@Service
public class AirPortServiceImpl implements IAirportService {
@Override
public QueryFlightModel queryFlight(String userId, org.dromara.common.ys.service.model.req.airport.QueryFlightModel model) {
ApiHttpResponse res = Api.v1(
RequestMethodEnum.POST,
DomainEnum.TEST.getDomain(),
AirportApiEnum.QUERY_FLIGHT.getUrl(),
userId,
null,
JSON.toJSONString(model)
);
if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) {
throw new RuntimeException(res.getTips());
}
return JSON.parseObject(res.getData(), QueryFlightModel.class);
}
@Override
public QueryFlightMinPriceModel queryFlightMinPrice(String userId, org.dromara.common.ys.service.model.req.airport.QueryFlightMinPriceModel model) {
ApiHttpResponse res = Api.v1(
RequestMethodEnum.POST,
DomainEnum.TEST.getDomain(),
AirportApiEnum.QUERY_FLIGHT_MIN_PRICE.getUrl(),
userId,
null,
JSON.toJSONString(model)
);
if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) {
throw new RuntimeException(res.getTips());
}
return JSON.parseObject(res.getData(), QueryFlightMinPriceModel.class);
}
@Override
public QueryFlightStopModel queryFlightStop(String userId, org.dromara.common.ys.service.model.req.airport.QueryFlightStopModel model) {
ApiHttpResponse res = Api.v1(
RequestMethodEnum.POST,
DomainEnum.PROD.getDomain(),
AirportApiEnum.QUERY_FLIGHT_STOP.getUrl(),
userId,
null,
JSON.toJSONString(model)
);
if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) {
throw new RuntimeException(res.getTips());
}
return JSON.parseObject(res.getData(), QueryFlightStopModel.class);
}
@Override
public List<BookOrderModel> bookOrder(String userId, org.dromara.common.ys.service.model.req.airport.bookOrder.BookOrderModel model) {
ApiHttpResponse res = Api.v1(
RequestMethodEnum.POST,
DomainEnum.TEST.getDomain(),
AirportApiEnum.BOOK_ORDER.getUrl(),
userId,
null,
JSON.toJSONString(model)
);
if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) {
throw new RuntimeException(res.getTips());
}
return JSON.parseArray(JSON.parseObject(res.getData()).getString("orderList"), BookOrderModel.class);
}
@Override
public PageInfo<OrderListModel> orderList(String userId, org.dromara.common.ys.service.model.req.airport.OrderListModel model) {
ApiHttpResponse res = Api.v1(
RequestMethodEnum.POST,
DomainEnum.TEST.getDomain(),
AirportApiEnum.QUERY_ORDER_LIST.getUrl(),
userId,
null,
JSON.toJSONString(model)
);
if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) {
throw new RuntimeException(res.getTips());
}
PageInfo pageInfo = JSON.parseObject(JSON.parseObject(res.getData()).getString("orderList"), PageInfo.class);
return PageInfo.builder().build()
.setCount(pageInfo.getCount())
.setMap(pageInfo.getMap())
.setPageNum(pageInfo.getPageNum())
.setPages(pageInfo.getPages())
.setTotal(pageInfo.getTotal())
.setList(JSON.parseArray(JSON.toJSONString(pageInfo.getList()), OrderListModel.class));
}
@Override
public QueryTkOrderModel detail(String userId, org.dromara.common.ys.service.model.req.airport.QueryTkOrderModel model) {
ApiHttpResponse res = Api.v1(
RequestMethodEnum.POST,
DomainEnum.TEST.getDomain(),
AirportApiEnum.QUERY_TK_ORDER.getUrl(),
userId,
null,
JSON.toJSONString(model)
);
if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) {
throw new RuntimeException(res.getTips());
}
return JSON.parseObject(res.getData(), QueryTkOrderModel.class);
}
}
package org.dromara.common.ys.service.impl;
import cn.hutool.core.text.CharSequenceUtil;
import com.alibaba.fastjson.JSON;
import org.dromara.common.ys.Api;
import org.dromara.common.ys.common.ApiHttpResponse;
import org.dromara.common.ys.common.Code;
import org.dromara.common.ys.enums.DomainEnum;
import org.dromara.common.ys.enums.resource.CommonResourceApiEnum;
import org.dromara.common.ys.service.ICommonResourceService;
import org.dromara.common.ys.service.model.res.comomResource.*;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
/**
* @author hzh
* @date 2024-10-18
* @desc 公共资源
**/
@Service
public class CommonResourceServiceImpl implements ICommonResourceService {
@Override
public List<CountryModel> getCountryList(String userId) {
ApiHttpResponse res = Api.v1(
com.wenhe.base.base.RequestMethodEnum.POST,
DomainEnum.TEST.getDomain(),
CommonResourceApiEnum.COUNTRY_DATA.getUrl(),
userId,
JSON.toJSONString(new org.dromara.common.ys.service.model.req.commonResource.CountryModel())
);
if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) {
throw new RuntimeException(res.getTips());
}
return JSON.parseArray(JSON.parseObject(res.getData()).getString("countryDataList"), CountryModel.class);
}
@Override
public List<ProvinceModel> getProvinceList(String userId) {
ApiHttpResponse res = Api.v1(
com.wenhe.base.base.RequestMethodEnum.POST,
DomainEnum.TEST.getDomain(),
CommonResourceApiEnum.PROVINCE_DATA.getUrl(),
userId,
JSON.toJSONString(new org.dromara.common.ys.service.model.req.commonResource.ProvinceModel())
);
if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) {
throw new RuntimeException(res.getTips());
}
return JSON.parseArray(JSON.parseObject(res.getData()).getString("provinceDataList"), ProvinceModel.class);
}
@Override
public List<CityModel> getCityList(String userId) {
ApiHttpResponse res = Api.v1(
com.wenhe.base.base.RequestMethodEnum.POST,
DomainEnum.TEST.getDomain(),
CommonResourceApiEnum.CITY_DATA.getUrl(),
userId,
JSON.toJSONString(new org.dromara.common.ys.service.model.req.commonResource.CityModel())
);
if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) {
throw new RuntimeException(res.getTips());
}
if (res.getData() == null) {
return new ArrayList<>();
}
return JSON.parseArray(JSON.parseObject(res.getData()).getString("cityDataList"), CityModel.class);
}
@Override
public List<AirportModel> getAirportList(String userId) {
ApiHttpResponse res = Api.v1(
com.wenhe.base.base.RequestMethodEnum.POST,
DomainEnum.TEST.getDomain(),
CommonResourceApiEnum.AIRPORT_DATA.getUrl(),
userId,
JSON.toJSONString(new org.dromara.common.ys.service.model.req.commonResource.AirportModel())
);
if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) {
throw new RuntimeException(res.getTips());
}
if (res.getData() == null) {
return new ArrayList<>();
}
return JSON.parseArray(JSON.parseObject(res.getData()).getString("airportDataList"), AirportModel.class);
}
@Override
public List<StationModel> getStationList(String userId) {
ApiHttpResponse res = Api.v1(
com.wenhe.base.base.RequestMethodEnum.POST,
DomainEnum.TEST.getDomain(),
CommonResourceApiEnum.STATION_DATA.getUrl(),
userId,
null,
JSON.toJSONString(new org.dromara.common.ys.service.model.req.commonResource.StationModel())
);
if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) {
throw new RuntimeException(res.getTips());
}
if (res.getData() == null) {
return new ArrayList<>();
}
return JSON.parseArray(JSON.parseObject(res.getData()).getString("stationDataList"), StationModel.class);
}
@Override
public List<TrainBaseModel> getTrainBaseList(String userId) {
ApiHttpResponse res = Api.v1(
com.wenhe.base.base.RequestMethodEnum.POST,
DomainEnum.TEST.getDomain(),
CommonResourceApiEnum.TRAIN_BASE_DATA.getUrl(),
userId,
null,
JSON.toJSONString(new org.dromara.common.ys.service.model.req.commonResource.TrainBaseModel())
);
if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) {
throw new RuntimeException(res.getTips());
}
if (res.getData() == null) {
return new ArrayList<>();
}
return JSON.parseArray(JSON.parseObject(res.getData()).getString("trainBaseDataList"), TrainBaseModel.class);
}
@Override
public List<DictModel> getDictList(String userId, String parType) {
org.dromara.common.ys.service.model.req.commonResource.DictModel model = new org.dromara.common.ys.service.model.req.commonResource.DictModel().setParType(parType);
ApiHttpResponse res = Api.v1(
com.wenhe.base.base.RequestMethodEnum.POST,
DomainEnum.TEST.getDomain(),
CommonResourceApiEnum.DICT_DATA.getUrl(),
userId,
null,
JSON.toJSONString(model)
);
if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) {
throw new RuntimeException(res.getTips());
}
if (res.getData() == null) {
return new ArrayList<>();
}
return JSON.parseArray(JSON.parseObject(res.getData()).getString("baseDataList"), DictModel.class);
}
}
package org.dromara.common.ys.service.impl;
import cn.hutool.core.text.CharSequenceUtil;
import com.alibaba.fastjson.JSON;
import org.dromara.common.ys.Api;
import org.dromara.common.ys.common.ApiHttpResponse;
import org.dromara.common.ys.common.Code;
import org.dromara.common.ys.enums.DomainEnum;
import org.dromara.common.ys.enums.insurance.InsuranceApiEnum;
import org.dromara.common.ys.service.IInsuranceService;
import org.dromara.common.ys.service.model.res.insurance.BxcpModel;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author hzh
* @date 2024-10-24
**/
@Service
public class InsuranceServiceImpl implements IInsuranceService {
@Override
public List<BxcpModel> list(String userId, org.dromara.common.ys.service.model.req.insurance.BxcpModel model) {
ApiHttpResponse res = Api.v1(
com.wenhe.base.base.RequestMethodEnum.POST,
DomainEnum.TEST.getDomain(),
InsuranceApiEnum.GET_BX_CP.getUrl(),
userId,
null,
JSON.toJSONString(model)
);
if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) {
throw new RuntimeException(res.getTips());
}
return JSON.parseArray(JSON.parseObject(res.getData()).getString("cpList"), BxcpModel.class);
}
}
package org.dromara.common.ys.service.impl;
import cn.hutool.core.text.CharSequenceUtil;
import com.alibaba.fastjson.JSON;
import org.dromara.common.ys.Api;
import org.dromara.common.ys.common.ApiHttpResponse;
import org.dromara.common.ys.common.Code;
import org.dromara.common.ys.enums.DomainEnum;
import org.dromara.common.ys.enums.org.OrgApiEnum;
import org.dromara.common.ys.service.IOrgService;
import org.dromara.common.ys.service.model.req.org.EditEmployeeModel;
import org.springframework.stereotype.Service;
/**
* @author hzh
* @date 2024-10-23
**/
@Service
public class OrgServiceImpl implements IOrgService {
@Override
public boolean saveOrUpdateEmployee(String userId, EditEmployeeModel model) {
ApiHttpResponse res = Api.v1(
com.wenhe.base.base.RequestMethodEnum.POST,
DomainEnum.TEST.getDomain(),
OrgApiEnum.EDIT_EMPLOYEE.getUrl(),
userId,
null,
JSON.toJSONString(model)
);
if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) {
throw new RuntimeException(res.getTips());
}
return true;
}
}
package org.dromara.common.ys.service.impl;
import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import org.dromara.common.ys.Api;
import org.dromara.common.ys.common.ApiHttpResponse;
import org.dromara.common.ys.common.Code;
import org.dromara.common.ys.enums.DomainEnum;
import org.dromara.common.ys.enums.train.TrainApiEnum;
import org.dromara.common.ys.service.ITrainService;
import org.dromara.common.ys.service.model.res.train.AllStationModel;
import org.dromara.common.ys.service.model.res.train.QueryModel;
import org.springframework.stereotype.Service;
import java.util.Collections;
import java.util.List;
/**
* @author hzh
* @date 2024-10-22
**/
@Service
public class TrainServiceImpl implements ITrainService {
@Override
public List<QueryModel> queryModel(String userId, org.dromara.common.ys.service.model.req.train.QueryModel model) {
ApiHttpResponse res = Api.v1(
com.wenhe.base.base.RequestMethodEnum.POST,
DomainEnum.TEST.getDomain(),
TrainApiEnum.QUERY.getUrl(),
userId,
JSON.toJSONString(model)
);
if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) {
throw new RuntimeException(res.getErrMsg());
}
if (StrUtil.isEmpty(res.getData())) {
return Collections.emptyList();
}
return JSON.parseArray(JSON.parseObject(res.getData()).getString("trainList"), QueryModel.class);
}
@Override
public List<AllStationModel> getAllStation(String userId) {
ApiHttpResponse res = Api.v1(
com.wenhe.base.base.RequestMethodEnum.POST,
DomainEnum.TEST.getDomain(),
TrainApiEnum.FIND_ALL_STATION.getUrl(),
userId,
JSON.toJSONString(new org.dromara.common.ys.service.model.req.train.AllStationModel())
);
if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) {
throw new RuntimeException(res.getTips());
}
return JSON.parseArray(JSON.parseObject(res.getData()).getString("list"), AllStationModel.class);
}
}
package org.dromara.common.ys.service.impl;
import cn.hutool.core.text.CharSequenceUtil;
import com.alibaba.fastjson.JSON;
import org.dromara.common.ys.Api;
import org.dromara.common.ys.common.ApiHttpResponse;
import org.dromara.common.ys.common.Code;
import org.dromara.common.ys.enums.DomainEnum;
import org.dromara.common.ys.enums.vehicles.VehiclesApiEnum;
import org.dromara.common.ys.service.IVehiclesService;
import org.dromara.common.ys.service.model.res.vehicles.EstimateJsycPriceModel;
import org.dromara.common.ys.service.model.res.vehicles.EstimateYyycPriceModel;
import org.springframework.stereotype.Service;
/**
* @author hzh
* @date 2024-10-22
**/
@Service
public class VehiclesServiceImpl implements IVehiclesService {
@Override
public EstimateYyycPriceModel estimateYyycPrice(String userId, org.dromara.common.ys.service.model.req.vehicles.EstimateYyycPriceModel model) {
ApiHttpResponse res = Api.v1(
com.wenhe.base.base.RequestMethodEnum.POST,
DomainEnum.TEST.getDomain(),
VehiclesApiEnum.ESTIMATE_YYYC_PRICE.getUrl(),
userId,
null,
JSON.toJSONString(model)
);
if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) {
throw new RuntimeException(res.getTips());
}
return JSON.parseObject(res.getData(), EstimateYyycPriceModel.class);
}
@Override
public EstimateJsycPriceModel estimateJsycPrice(String userId, org.dromara.common.ys.service.model.req.vehicles.EstimateJsycPriceModel model) {
ApiHttpResponse res = Api.v1(
com.wenhe.base.base.RequestMethodEnum.POST,
DomainEnum.TEST.getDomain(),
VehiclesApiEnum.ESTIMATE_JSYC_PRICE.getUrl(),
userId,
null,
JSON.toJSONString(model)
);
if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) {
throw new RuntimeException(res.getTips());
}
return JSON.parseObject(res.getData(), EstimateJsycPriceModel.class);
}
}
/**
* <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.ys.service.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.ys.service.model.req.airport;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.dromara.common.ys.service.model.BaseModel;
/**
* @author hzh
* @date 2024-10-24
* @desc 机票查询列表
**/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class OrderListModel extends BaseModel {
/**
* 每页显示条数,不能小于10
*/
private Integer count;
/**
* 页数,不能小于1
*/
private Integer pageNum;
/**
* 日期类型 1预定日期 2出行日期 3出票/确认日期
*/
private Integer dateType;
/**
* 时间始 格式:yyyy-MM-dd
*/
private String dateStart;
/**
* 时间止 格式:yyyy-MM-dd
*/
private String dateEnd;
/**
* 出差申请单号
*/
private String travelNo;
/**
* 预订人
*/
private String bookNo;
/**
* 公司支付限制 1只查询公司支付订单 0或空不限制
*/
private Integer payCompanyFlag;
/**
* 订单状态 0申请中 1待送审 2审批中 3待支付 4待出票 6已出票 7已取消 9审批拒绝 10出票中
*/
private String orderStatus;
}
package org.dromara.common.ys.service.model.req.airport;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.dromara.common.ys.service.model.BaseModel;
/**
* @author hzh
* @date 2024-10-18
* @desc 航班最低价查询
**/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class QueryFlightMinPriceModel extends BaseModel {
/**
* 出发机场三字码,请参考机场静态数据,必须为大写三位字母
*/
private String departAirport;
/**
* 到达机场三字码,请参考机场静态数据,必须为大写三位字母 ,
*/
private String arriveAirport;
/**
* 出发日期,格式:yyyy-MM-dd ,
*/
private String departDate;
/**
* 差旅类型,1:因公 2:因私 默认1 ,
*/
private String tripType;
/**
* 用于匹配差标的员工工号,如不传,以当前登录人工号进行匹配
*/
private String empNo;
}
package org.dromara.common.ys.service.model.req.airport;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.dromara.common.ys.service.model.BaseModel;
/**
* @author hzh
* @date 2024-10-18
* @desc 航班查询请求参数
**/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class QueryFlightModel extends BaseModel {
/**
* 出发机场三字码,请参考机场静态数据,必须为大写三位字母
*/
private String departAirport;
/**
* 到达机场三字码,请参考机场静态数据,必须为大写三位字母 ,
*/
private String arriveAirport;
/**
* 出发日期,格式:yyyy-MM-dd ,
*/
private String departDate;
/**
* 差旅类型,1:因公 2:因私 默认1 ,
*/
private String tripType;
/**
* 用于匹配差标的员工工号,如不传,以当前登录人工号进行匹配
*/
private String empNo;
}
package org.dromara.common.ys.service.model.req.airport;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.dromara.common.ys.service.model.BaseModel;
/**
* @author hzh
* @date 2024-10-18
* @desc 获取航班经停信息
**/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class QueryFlightStopModel extends BaseModel {
/**
* 航班号
*/
private String flightNo;
/**
* 出发日期,格式:yyyy-MM-dd
*/
private String departDate;
}
package org.dromara.common.ys.service.model.req.airport;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.dromara.common.ys.service.model.BaseModel;
/**
* @author hzh
* @date 2024-10-18
* @desc 机票订单详情请求参数
**/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class QueryTkOrderModel extends BaseModel {
/**
* 订单编号(必填)
*/
private String orderNo;
}
package org.dromara.common.ys.service.model.req.airport.bookOrder;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.List;
/**
* 保险信息
*
* @author wenhe
*/
@Data
@Accessors(chain = true)
public class BookOrderInsurance {
/**
* 保险产品标识集合
*/
private List<String> bxcpIds;
}
package org.dromara.common.ys.service.model.req.airport.bookOrder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.dromara.common.ys.service.model.BaseModel;
import java.util.List;
/**
* @author hzh
* @date 2024-10-18
* @desc 创建订单请求参数
**/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class BookOrderModel extends BaseModel {
/**
* 乘机人集合
*/
private List<com.wenhe.base.model.req.airport.bookOrder.BookOrderPsg> psgList;
/**
* 航程集合
*/
private List<com.wenhe.base.model.req.airport.bookOrder.BookOrderRange> rangeList;
/**
* 保险信息
*/
private BookOrderInsurance insuranceBean;
/**
* 差旅类型,1:因公 2:因私 默认1
*/
private String tripType;
/**
* 项目编号,最大长度30位
*/
private String projectCode;
/**
* 项目名称,最大长度100位
*/
private String projectName;
/**
* 成本中心编号,最大长度30位
*/
private String costCenterCode;
/**
* 成本中心名称,最大长度100位
*/
private String costCenterName;
/**
* 出差申请单号,最大长度30位
*/
private String travelNo;
/**
* 出差申请备注,最大长度250位
*/
private String travelRemark;
/**
* 科目码,最大长度30位
*/
private String subjectCode;
/**
* 联系人
*/
private String linkman;
/**
* 联系电话
*/
private String linkTel;
/**
* 联系邮箱
*/
private String linkEmail;
/**
* 配送方式,0不需要报销凭证 1邮寄 2公司统一配送 默认2
*/
private String sendMode;
/**
* 收件人电话
*/
private String reciPhone;
/**
* 邮编
*/
private String postCode;
/**
* 收件人
*/
private String reciPient;
/**
* 收件地址
*/
private String reciAddr;
}
package org.dromara.common.ys.service.model.req.airport.bookOrder;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* 乘机人集合
*/
@Data
@Accessors(chain = true)
public class BookOrderPsg {
/**
* 乘机人姓名
*/
private String psgName;
/**
* 乘机人类型,1成人2儿童3婴儿 默认1 ,
*/
private String psgType;
/**
* 证件类型,NI身份证 PP护照 ID其他 ,
*/
private String idType;
/**
* 证件号码
*/
private String idno;
/**
* 手机号码,最好传入 以便航班有变化及时知情
*/
private String phoneNumber;
/**
* F女M男
*/
private String sex;
/**
* 出生日期
*/
private String born;
/**
* 员工工号
*/
private String empNo;
/**
* 附属员工工号,有附属员工的时候 才需要输入
*/
private String fsEmpNo;
}
package org.dromara.common.ys.service.model.req.airport.bookOrder;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* 航程集合
*/
@Accessors(chain = true)
@Data
public class BookOrderRange {
/**
* 航班号
*/
private String flightNo;
/**
* 舱位代码
*/
private String cabin;
/**
* 航班标识,航班查询时返回
*/
private String cacheId;
/**
* 价格缓存,航班查询时返回
*/
private String priceId;
/**
* 违背原因代码
*/
private String reasonCode;
/**
* 违背原因描述
*/
private String reasonDesc;
}
package org.dromara.common.ys.service.model.req.commonResource;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.dromara.common.ys.service.model.BaseModel;
/**
* @author hzh
* @date 2024-10-18
* @desc 机场请求参数
**/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class AirportModel extends BaseModel {
}
package org.dromara.common.ys.service.model.req.commonResource;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.dromara.common.ys.service.model.BaseModel;
/**
* @author hzh
* @date 2024-10-18
* @desc 城市请求参数
**/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class CityModel extends BaseModel {
}
package org.dromara.common.ys.service.model.req.commonResource;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.dromara.common.ys.service.model.BaseModel;
/**
* @author hzh
* @date 2024-10-18
* @desc 国家请求参数
**/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class CountryModel extends BaseModel {
}
package org.dromara.common.ys.service.model.req.commonResource;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.dromara.common.ys.service.model.BaseModel;
/**
* @author hzh
* @date 2024-10-18
* @desc 字典请求参数
**/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class DictModel extends BaseModel {
/**
* 查询类型,参考枚举值页面数据
*/
private String parType;
}
package org.dromara.common.ys.service.model.req.commonResource;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.dromara.common.ys.service.model.BaseModel;
/**
* @author hzh
* @date 2024-10-18
* @desc 省份请求参数
**/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class ProvinceModel extends BaseModel {
}
package org.dromara.common.ys.service.model.req.commonResource;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.dromara.common.ys.service.model.BaseModel;
/**
* @author hzh
* @date 2024-10-18
* @desc 火车站点请求参数
**/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class StationModel extends BaseModel {
}
package org.dromara.common.ys.service.model.req.commonResource;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.dromara.common.ys.service.model.BaseModel;
/**
* @author hzh
* @date 2024-10-18
* @desc 火车票席别请求参数
**/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class TrainBaseModel extends BaseModel {
/**
* 查询类型 0或空 座位席别
*/
private String queryType;
}
package org.dromara.common.ys.service.model.req.insurance;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.dromara.common.ys.service.model.BaseModel;
/**
* @author hzh
* @date 2024-10-18
* @desc 保险查询
**/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class BxcpModel extends BaseModel {
/**
* 产品类型,10901机票 10904火车票
*/
private String cplx;
}
package org.dromara.common.ys.service.model.req.org;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.dromara.common.ys.service.model.BaseModel;
/**
* @author hzh
* @date 2024-10-18
* @desc 员工新增或修改请求参数
**/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class EditEmployeeModel extends BaseModel {
/**
* 员工编号
*/
private String empNo;
/**
* 中文名字
*/
private String empName;
/**
* 英文名字,为空则由中文名称转换
*/
private String engName;
/**
* 性别, M:男 ,F:女 默认为M
*/
private String sex;
/**
* 生日,格式:yyyy-MM-dd,如果填写了身份证,根据身份证解析
*/
private String born;
/**
* 国家编号,默认中国(00002),详情查看国家静态数据
*/
private String nation;
/**
* 部门编号,如果部门编号为空,或查找不到所属部门,默认归属到根部门
*/
private String deptNo;
/**
* 员工职级代号,员工职级代号需提前在商旅系统中员工职级管理模块维护对应于员工职级维护的序号,默认为最低级别员工职级代号
*/
private String empRank;
/**
* 员工状态,0:离职, 1:在职 默认为1
*/
private Integer isValid;
/**
* 是否负责人,0:否,1:是 默认为0
*/
private Integer isdirector;
/**
* 是否审批人 0:否,1:是 默认为0
*/
private Integer ifApprover;
/**
* 常用号码
*/
private String phoneNumber;
/**
* 邮箱
*/
private String email;
/**
* 职务
*/
private String post;
/**
* 爱好
*/
private String preference;
/**
* 秘书/助理编号,传员工工号,多个用’,’分隔,员工工号不存在的时候直接忽略
*/
private String assistant;
/**
* 身份证
*/
private String idNumber;
/**
* 护照
*/
private String passport;
/**
* 护照有效期,格式:yyyy-MM-dd
*/
private String passportPeriod;
/**
* 护照签发地,默认中国(00002),详情查看国家静态数据
*/
private String placeOfIssue;
/**
* 其他证件
*/
private String otherNumber;
/**
* 其他证件有效期, 格式:yyyy-MM-dd
*/
private String otherPeriod;
/**
* 是否开启平台登录,0:否,1:是,默认为0,不开通时可以不传下面的一系列数值
*/
private Integer loginVip;
/**
* 权限等级,1:员工、3:主管、5:经理, 默认为1 ,
*/
private Integer popElevel;
/**
* 预订范围, 0:本人预订,1:为本部门订票,2:为全公司预订,3:指定部门, 默认为0
*/
private Integer bookRange;
/**
* 为外人预订, 0:否,1:是, 默认为0 ,
*/
private Integer bookOutside;
/**
* 预订全免, 0:审批,1:全免, 默认0
*/
private Integer appBook;
/**
* 出差审批属性, 0:审批,1:全免,2:个免, 默认0 ,
*/
private Integer appTravel;
/**
* 使用公司账户支付产品类型109 多个用,隔开
*/
private String useAccount;
/**
* 新员工编号
*/
private String newEmpNo;
}
package org.dromara.common.ys.service.model.req.train;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.dromara.common.ys.service.model.BaseModel;
/**
* @author hzh
* @date 2024-10-22
**/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class AllStationModel extends BaseModel {
}
package org.dromara.common.ys.service.model.req.train;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.dromara.common.ys.service.model.BaseModel;
/**
* @author hzh
* @date 2024-10-22
**/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class QueryModel extends BaseModel {
/**
* 乘车日期yyyy-MM-dd
*/
private String fromDate;
/**
* 出发站三字编码
*/
private String fromStationCode;
/**
* 到达站三字编码
*/
private String toStationCode;
/**
* 差旅类型 1因公 2因私
*/
private String tripType;
}
package org.dromara.common.ys.service.model.req.vehicles;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.dromara.common.ys.service.model.BaseModel;
import java.math.BigDecimal;
/**
* @author hzh
* @date 2024-10-22
**/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class EstimateJsycPriceModel extends BaseModel {
/**
* 1因公2因私
*/
private String tripType;
/**
* 用车城市id
*/
private String departCity;
/**
* 到达城市id
*/
private String arriveCity;
/**
* 用车类型 8即时 9预约
*/
private String useType;
/**
* 出发详细地址
*/
private String fromAddress;
/**
* 出发经度
*/
private BigDecimal fromLon;
/**
* 出发纬度
*/
private BigDecimal fromLat;
/**
* 到达详细地址
*/
private String toAddress;
/**
* 到达经度
*/
private BigDecimal toLon;
/**
* 到达纬度
*/
private BigDecimal toLat;
/**
* 用车时间 yyyy-mm-dd hh:mm
*/
private String useTime;
/**
* 出行人员工
*/
private String empNo;
/**
* 出差申请单号
*/
private String ccsqdNo;
}
package org.dromara.common.ys.service.model.req.vehicles;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.dromara.common.ys.service.model.BaseModel;
import java.math.BigDecimal;
/**
* @author hzh
* @date 2024-10-22
**/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class EstimateYyycPriceModel extends BaseModel {
/**
* 1因公2因私
*/
private String tripType;
/**
* 用车城市id
*/
private String departCity;
/**
* 到达城市id
*/
private String arriveCity;
/**
* 使用机场三字码或站点代码
*/
private String useAirportOrZd;
/**
* 用车类型 1日包 2半日包 4接机 5送机 6接站 7送站 ,
*/
private String useType;
/**
* 用车天数 除了日包需要传入 其他情况传0或不传
*/
private int useDays;
/**
* 出发详细地址
*/
private String fromAddress;
/**
* 出发经度
*/
private BigDecimal fromLon;
/**
* 出发纬度
*/
private BigDecimal fromLat;
/**
* 到达详细地址
*/
private String toAddress;
/**
* 到达经度
*/
private BigDecimal toLon;
/**
* 到达纬度
*/
private BigDecimal toLat;
/**
* 用车时间 yyyy-mm-dd hh:mm
*/
private String useTime;
/**
* 接送机时必传
*/
private String flightNo;
/**
* 出行人员工
*/
private String empNo;
/**
* 出差申请单号
*/
private String ccsqdNo;
}
package org.dromara.common.ys.service.model.res.airport;
import lombok.Data;
import java.math.BigDecimal;
/**
* @author hzh
* @date 2024-10-23
**/
@Data
public class BookOrderModel {
/**
* 订单编号
*/
private String orderNo;
/**
* 销售价
*/
private BigDecimal salePrice;
/**
* 机建
*/
private BigDecimal airportFee;
/**
* 税费
*/
private BigDecimal tax;
/**
* 服务费
*/
private BigDecimal serviceFee;
/**
* 客户奖励
*/
private BigDecimal khjl;
/**
* 总价格
*/
private BigDecimal totalPrice;
/**
* 编码
*/
private String pnrNo;
/**
* 订单状态 0已申请 1已订座
*/
private String orderStatus;
}
package org.dromara.common.ys.service.model.res.airport;
import lombok.Data;
/**
* @author hzh
* @date 2024-10-24
* @desc 订单列表
**/
@Data
public class OrderListModel {
/**
* 订单编号
*/
private String orderNo;
/**
* 订单状态 0申请中 1待送审 2审批中 3待支付 4待出票 6已出票 7已取消 9审批拒绝 10出票中
*/
private String orderStatus;
/**
* 航班号
*/
private String flightNo;
/**
* 订单状态名称
*/
private String orderStatusName;
/**
* 预定人工号
*/
private String bookerNo;
/**
* 舱位名称
*/
private String cabinName;
/**
* 预订人名称
*/
private String bookerName;
/**
* 航程中文
*/
private String voyageZh;
/**
* 预定时间 格式:yyyy-MM-dd HH:mm:ss ,
*/
private String bookDate;
/**
* 航程类型 1单程 2往返 3连程 4缺口程
*/
private String voyageType;
/**
* 出票时间 格式:yyyy-MM-dd HH:mm:ss
*/
private String drawDate;
/**
* 乘机人名称
*/
private String psgName;
/**
* 出发时间 格式:yyyy-MM-dd HH:mm
*/
private String departTime;
/**
* 差旅类型 1因公 2因私 ,
*/
private Integer tripType;
/**
* 订单总金额
*/
private String totalAmount;
}
package org.dromara.common.ys.service.model.res.airport;
import lombok.Data;
import java.util.List;
import java.util.Map;
/**
* @author hzh
* @date 2024-10-21
**/
@Data
public class QueryFlightMinPriceModel extends QueryFlightModel {
/**
* 价格map
*/
private Map<String, Object> priceMap;
/**
* 机型map
*/
private Map<String, Object> planeMap;
/**
* 查询耗时(毫秒)
*/
private Integer queryTimes;
/**
* 七天特价
*/
private List<WeekPrice> weekPrice;
/**
* 全天最低价
*/
private DayMinPrice dayMinPrice;
/**
* 航班集合
*/
private Map<String, Object> flightMap;
/**
* 航班标识
*/
private String cacheId;
}
package org.dromara.common.ys.service.model.res.airport;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* @author hzh
* @date 2024-10-15
* @desc 航班
**/
@Data
public class QueryFlightModel {
/**
* 价格map
*/
private Map<String, Object> priceMap;
/**
* 机型map
*/
private Map<String, Object> planeMap;
/**
* 查询耗时(毫秒)
*/
private Integer queryTimes;
/**
* 七天特价
*/
private List<WeekPrice> weekPrice;
/**
* 全天最低价
*/
private DayMinPrice dayMinPrice;
/**
* 航班集合
*/
private Map<String, Object> flightMap;
/**
* 航班标识
*/
private String cacheId;
}
/**
* 航班结果集
*/
@Data
class Flight {
/**
* 经停次数
*/
private int stopNum;
/**
* 航司名称
*/
private String airlineName;
/**
* 航司图片
*/
private String airlineImg;
/**
* 舱位集合 舱位集合 舱位代码为 key。包含多个
*/
private Cabin cabinMap;
/**
* 舱位等级集合
*/
private List<CabinType> cabinTypeList;
/**
* 航班号
*/
private String flightNo;
/**
* 共享航班号
*/
private String sharFlightNo;
/**
* 出发日期
*/
private String departDate;
/**
* 出发时间
*/
private String departTime;
/**
* 到达日期
*/
private String arriveDate;
/**
* 到达时间
*/
private String arriveTime;
/**
* 飞行时长 单位:分钟
*/
private int flyTime;
/**
* 飞行时长中文
*/
private String flyTimeStr;
/**
* 飞行里程
*/
private String distance;
/**
* 餐食 是否有食物 0否 1是
*/
private String hasFood;
/**
* 航司二字码
*/
private String airline;
/**
* 机型
*/
private String plane;
/**
* 是否展示
*/
private String isshow;
/**
* 出发机场名称
*/
private String departAirportName;
/**
* 出发机场三字码
*/
private String departAirport;
/**
* 出发航站楼
*/
private String departTerminal;
/**
* 到达机场名称
*/
private String arriveAirportName;
/**
* 到达航站楼
*/
private String arriveTerminal;
/**
* Y舱价格
*/
private Double yPrice;
/**
* 税费
*/
private Double tax;
/**
* 基建
*/
private Double airportFee;
/**
* 航班最低价格
*/
private Double realMinPrice;
/**
* 航班最低价舱位代码
*/
private String realMinPriceCabin;
/**
* 航班最低价舱位等级
*/
private String realMinPriceCabinType;
/**
* 航班最低价价格id
*/
private String realMinPriceId;
/**
* 公务舱最低价 航班没公务舱时返回-1
*/
private Double cMinPrice;
/**
* 公务舱全价 航班没公务舱时返回0
*/
private Double cPrice;
/**
* 头等舱最低价 航班没头等舱时返回-1
*/
private Double fMinPrice;
/**
* 头等舱全价 航班没头等舱时返回0
*/
private Double fPrice;
}
/**
* 舱位等级集合
*/
@Data
class CabinType {
/**
* 舱位等级名称
*/
private String cabinTypeName;
/**
* 舱位集合
*/
private List<Cabin> cabinList;
/**
* 舱位等级
*/
private String cabinType;
}
/**
* 舱位
*/
@Data
class Cabin {
/**
* 舱位等级名称
*/
private String cabinTypeName;
/**
* 舱位等级
*/
private String cabinType;
/**
* 舱位名称
*/
private String cabinName;
/**
* 舱位代码
*/
private String cabin;
/**
* 座位数量 A充足 0-9座位数
*/
private String seatCount;
/**
* 价格集合
*/
private List<String> priceList;
}
/**
* 机型
*/
@Data
class Plane {
/**
* 机身
*/
private String planeBody;
/**
* 最小座位数
*/
private String minSeat;
/**
* 最大座位数
*/
private String maxSeat;
/**
* 机型
*/
private String planeModel;
/**
* 飞机型号
*/
private String planeCode;
/**
* 飞机名称
*/
private String planeName;
}
/**
* 当天最低价
*/
@Data
class DayMinPrice {
/**
* 价格id
*/
private String priceId;
/**
* 账单价
*/
private BigDecimal salePrice;
/**
* 舱位名称
*/
private String cabinName;
/**
* 舱位代码
*/
private String cabin;
/**
* 航班号
*/
private String flightNo;
}
/**
* 一周特价
*/
@Data
class WeekPrice {
/**
* price
*/
private BigDecimal price;
/**
* 日期
*/
private Date date;
/**
* 星期
*/
private String week;
}
/**
* 价格结果集
*/
@Data
class Price {
/**
* 价格唯一标识
*/
private String priceId;
/**
* 产品类型
*/
private String productType;
/**
* 是否可销售
*/
private String isApply;
/**
* 是否支持儿童预定 Y-是、N-否
*/
private String isPermitChdBook;
/**
* 销售折扣
*/
private String saleDiscount;
/**
* 销售价格
*/
private String salePrice;
/**
* 服务费
*/
private String serviceFee;
/**
* 退票规则
*/
private String refundRule;
/**
* 改签规则
*/
private String changeRule;
/**
* 签转规则
*/
private String upgradeRule;
}
package org.dromara.common.ys.service.model.res.airport;
import lombok.Data;
import java.util.List;
/**
* @author hzh
* @date 2024-10-21
* @desc 航班经停信息
**/
@Data
public class QueryFlightStopModel {
/**
* 航班号
*/
private String flightNo;
/**
* 起飞日期
*/
private String departDate;
/**
* 起飞时间
*/
private String departTime;
/**
* 机场三字码
*/
private String departAirport;
/**
* 起飞机场名称
*/
private String departAirportName;
/**
* 起飞城市名称
*/
private String departCityName;
/**
* 到达日期
*/
private String arriveDate;
/**
* 到达时间
*/
private String arriveTime;
/**
* 到达机场三字码
*/
private String arriveAirport;
/**
* 到达机场名称
*/
private String arriveAirportName;
/**
* 到达城市名称
*/
private String arriveCityName;
/**
* 经停信息
*/
private List<FlightStopInfo> stopList;
}
@Data
class FlightStopInfo {
/**
* 经停机场三字码
*/
private String airport;
/**
* 经停机场三字码名称
*/
private String airportName;
/**
* 经停城市名称
*/
private String cityName;
/**
* 抵达时间
*/
private String arriveTime;
/**
* 起飞时间
*/
private String departTime;
}
package org.dromara.common.ys.service.model.res.airport;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.dromara.common.ys.service.model.res.airport.other.*;
import java.math.BigDecimal;
import java.util.List;
/**
* @author hzh
* @date 2024-11-04
**/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class QueryTkOrderModel {
/**
* 是否显示撤销审批操作 1显示 0不显示
**/
private String isShowCancelApproval;
/**
* 乘机人,多个以,隔开
**/
private String psg;
/**
* PNR编码
**/
private String pnrNo;
/**
* 是否显示支付操作,1是显示 2是不显示
**/
private String isShowPay;
/**
* 订单状态代码
**/
private String orderStatus;
/**
* 航程城市中文,城市名称拼接
**/
private String voyageCity;
/**
* 舱位
**/
private String cabin;
/**
* 打印行程单信息
**/
private List<TicketPrintInfoBean> printList;
/**
* PNR编码
**/
private String pnrError;
/**
* 婴儿数
**/
private Integer infNum;
/**
* 订单状态名称
**/
private String orderStatusName;
/**
* 乘机人集合
**/
private List<OrdePsgInfoBean> ordePsgList;
/**
* 航程类型,1单程2往返3联程4缺口
**/
private Integer voyageType;
/**
* 保险金额
**/
private BigDecimal insureAmount;
/**
* 行程id
**/
private String routeId;
/**
* 订单合计,票面价+机建+燃油+服务费+保险金额
**/
private BigDecimal orderTotalAmount;
/**
* 是否显示退票操作,1是显示 2是不显示
**/
private String isShowRefund;
/**
* 是否显示送审操作,1是显示 2是不显示
**/
private String isShowApproval;
/**
* 大客户协议号
**/
private String protocolNo;
/**
* 支付信息集合 适用于多科目支付
**/
private List<OrderPayInfoBean> payInfoList;
/**
* 国内国际,1国内 0国际
**/
private Integer international;
/**
* 是否显示取消操作,1是显示 2是不显示
**/
private String isShowCancel;
/**
* 备注信息
**/
private String bzbz;
/**
* 是否显示改签操作,1是显示 2是不显示
**/
private String isShowEndorse;
/**
* 服务费合计
**/
private BigDecimal serviceFee;
/**
* 订单号
**/
private String orderNo;
/**
* 成人数
**/
private Integer adultNum;
/**
* 保险明细集合
**/
private List<InsuranceInfoBean> insuranceList;
/**
* 预订时间,格式:yyyy-MM-dd HH:mm:ss
**/
private String bookDatetime;
/**
* 票面合计
**/
private BigDecimal salePrice;
/**
* 燃油合计
**/
private BigDecimal tax;
/**
* 是否支持协议欠款支付,1是显示 2是不显示
**/
private String sfzcxyqk;
/**
* 航程,机场三字码拼接
**/
private String voyage;
/**
* 差旅信息
**/
private OrderBusinessInfoBean businessInfo;
/**
* 儿童数
**/
private Integer chdNum;
/**
* 机建合计
**/
private BigDecimal airportFee;
/**
* 保险份数
**/
private Integer insureNum;
/**
* 航班号
**/
private String flightNo;
/**
* 航段集合
**/
private List<OrderRangeInfoBean> orderRangeList;
/**
* 航程机场中文,机场名称拼接
**/
private String voyageAirport;
/**
* 起飞日期,格式:YYYY-MM-dd HH:mm
**/
private String departDate;
/**
* 订单来源名称
**/
private String orderFrom;
/**
* 出票时间,格式:yyyy-MM-dd HH:mm:ss
**/
private String drawDatetime;
/**
* 支付状态,0未付 1已付
**/
private Integer payStatus;
/**
* 支付信息 只返回最后一种支付科目的信息
**/
private OrderPayInfoBean payInfo;
}
package org.dromara.common.ys.service.model.res.airport.other;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.math.BigDecimal;
/**
* @author hzh
* @date 2024-11-04
**/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class InsuranceInfoBean {
/**
* 保险险种名称
**/
private String xzmc;
/**
* 保险公司名称
**/
private String bxcpCompName;
/**
* 保单号
**/
private String bdh;
/**
*
**/
private String bidNo;
/**
*
**/
private String bsex;
/**
* 生效规则
**/
private String xsgzDesc;
/**
* 行程说明
**/
private String xc;
/**
* 保单生效时间
**/
private String bdsxsj;
/**
* 销售说明
**/
private String xssm;
/**
*
**/
private String bidType;
/**
* 航班号/车次
**/
private String hbh;
/**
* 投保状态名称
**/
private String tbztName;
/**
* 保险金额
**/
private BigDecimal insureAmount;
/**
* 保额说明
**/
private String besm;
/**
* 被保人
**/
private String bbr;
/**
*
**/
private String bborn;
/**
* 保险订单编号
**/
private String bxOrderNo;
/**
* 产品名称
**/
private String bxcpmc;
/**
* 投保状态
**/
private String tbzt;
/**
* 乘机人顺序号
**/
private Integer psgSn;
}
package org.dromara.common.ys.service.model.res.airport.other;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.math.BigDecimal;
import java.util.List;
/**
* @author hzh
* @date 2024-11-04
**/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class OrdePsgInfoBean {
/**
* 里程卡号
**/
private String mileageCardNo;
/**
* 票号信息集合
**/
private List<TicketInfoBean> ticketList;
/**
* 国籍
**/
private String nation;
/**
* 票价小计
**/
private BigDecimal psgTotalAmount;
/**
* 证件号码
**/
private String idNo;
/**
* 证件签发地
**/
private String placeOfIssue;
/**
* 所在部门的上10级部门编号
**/
private String empDeptNo10;
/**
* 保险金额
**/
private BigDecimal insureAmount;
/**
* 旅客类型,1成人 2儿童 3婴儿
**/
private Integer psgType;
/**
* 13位票号,多个以,隔开
**/
private String ticketNo;
/**
* 证件有效期,格式:yyyy-MM-dd
**/
private String passportPeriod;
/**
* 所在部门的上级部门名称
**/
private String empDeptName1;
/**
* 所在部门的上3级部门名称
**/
private String empDeptName3;
/**
* 顺序号
**/
private Integer sn;
/**
* 所在部门的上2级部门名称
**/
private String empDeptName2;
/**
* 所在部门的上5级部门名称
**/
private String empDeptName5;
/**
* 所在部门的上4级部门名称
**/
private String empDeptName4;
/**
* 所在部门的上7级部门名称
**/
private String empDeptName7;
/**
* 所在部门的上6级部门名称
**/
private String empDeptName6;
/**
* 服务费
**/
private BigDecimal serviceFee;
/**
* 所在部门的上9级部门名称
**/
private String empDeptName9;
/**
* 所在部门的上8级部门名称
**/
private String empDeptName8;
/**
* 所在部门名称
**/
private String empDepName;
/**
* 国籍名称
**/
private String nationName;
/**
* 所在部门的上级部门编号
**/
private String empDeptNo1;
/**
* 证件类型,NI身份证 PP护照 ID其他
**/
private String idType;
/**
* 所在部门的上3级部门编号
**/
private String empDeptNo3;
/**
* 票面价
**/
private BigDecimal salePrice;
/**
* 所在部门的上2级部门编号
**/
private String empDeptNo2;
/**
* 所在部门的上5级部门编号
**/
private String empDeptNo5;
/**
* 性别,F女 M男
**/
private String sex;
/**
* 所在部门的上4级部门编号
**/
private String empDeptNo4;
/**
* 旅客姓名
**/
private String psgName;
/**
* 所在部门的上7级部门编号
**/
private String empDeptNo7;
/**
* 所在部门的上10级部门名称
**/
private String empDeptName10;
/**
* 所在部门编号
**/
private String empDeptNo;
/**
* 所在部门的上6级部门编号
**/
private String empDeptNo6;
/**
* 燃油税
**/
private BigDecimal tax;
/**
* 所在部门的上9级部门编号
**/
private String empDeptNo9;
/**
* 对应员工工号
**/
private String empNo;
/**
* 所在部门的上8级部门编号
**/
private String empDeptNo8;
/**
* 出生日期,格式:yyyy-MM-dd
**/
private String birthDate;
/**
* 机建
**/
private BigDecimal airportFee;
/**
* 保险份数
**/
private Integer insureNum;
/**
* 手机号
**/
private String phoneNumber;
}
package org.dromara.common.ys.service.model.res.airport.other;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* @author hzh
* @date 2024-11-04
**/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class OrderBusinessInfoBean {
/**
* 最后审批时间,格式:yyyy-MM-dd HH:mm:ss
**/
private String appDatetime;
/**
* 联系手机
**/
private String linkMobile;
/**
* 出差事由
**/
private String travelRemark;
/**
* 企业预订人姓名
**/
private String bookerName;
/**
* 成本中心编号
**/
private String costCenterNo;
/**
* 联系人
**/
private String linkMan;
/**
* 违背事项代码
**/
private String violateitemCode;
/**
* 违背事项名称
**/
private String violateitem;
/**
* 差旅类型,1因公 2因私
**/
private Integer tripType;
/**
* 企业预订人工号
**/
private String bookerNo;
/**
* 项目编号
**/
private String projectNo;
/**
* 是否违背差旅标准,0否 1是
**/
private String isViolate;
/**
* 最后审批人工号
**/
private String appUserNo;
/**
* 最后审批人姓名
**/
private String appUserName;
/**
* 出差申请单号
**/
private String travelNo;
/**
* 成本中心名称
**/
private String costCenterName;
/**
* 审批规则名字
**/
private String appRuleName;
/**
* 违背原因代码
**/
private String reasonCode;
/**
* 项目名称
**/
private String projectName;
/**
* 违背原因名称
**/
private String reasonDesc;
/**
* 联系邮箱
**/
private String linkEmail;
}
package org.dromara.common.ys.service.model.res.airport.other;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.math.BigDecimal;
/**
* @author hzh
* @date 2024-11-04
**/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class OrderPayInfoBean {
/**
* 支付金额
**/
private BigDecimal payAmount;
/**
* 支付科目id
**/
private String paySubject;
/**
* 支付方式名称
**/
private String payMothedName;
/**
* 支付科目名称
**/
private String paySubjectName;
/**
* 支付卡号
**/
private String payBankCard;
/**
* 支付备注
**/
private String payRemark;
/**
* 支付流水号
**/
private String payBillno;
/**
* 支付时间,格式:yyyy-MM-dd HH:mm:ss
**/
private String payDate;
}
package org.dromara.common.ys.service.model.res.airport.other;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.math.BigDecimal;
/**
* @author hzh
* @date 2024-11-04
**/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class OrderRangeInfoBean {
/**
* 出发机场英文名
**/
private String departAirportNameEn;
/**
* 到达机场三字码
**/
private String arriveAirport;
/**
* 出发城市编号
**/
private String departCity;
/**
* 飞行里程(里)
**/
private Integer distance;
/**
* 推荐航班
**/
private String recomFlightNo;
/**
* 舱位等级
**/
private String cabin;
/**
* 舱位折扣,格式:8.5折 1.3倍
**/
private String discount;
/**
* 出发城市英文名
**/
private String departCityNameEn;
/**
* 出发航站楼
**/
private String departTerminal;
/**
* 到达机场英文名
**/
private String arriveAirportNameEn;
/**
* 到达城市名称
**/
private String arriveCityName;
/**
* 实际承运航班号
**/
private String shareFlightNo;
/**
* 到达时间,格式:yyyy-MM-dd HH:mm
**/
private String arriveTime;
/**
* 到达机场名称
**/
private String arriveAirportName;
/**
* 退票规则
**/
private String refundRule;
/**
* 机型
**/
private String model;
/**
* 航段顺序号
**/
private Integer sn;
/**
* 航司二字码
**/
private String airline;
/**
* 舱位名称
**/
private String cabinName;
/**
* 签转规定
**/
private String changeRule;
/**
* 是否经停,0否 1是
**/
private String stopFlag;
/**
* 出发城市名称
**/
private String departCityName;
/**
* 经停信息
**/
private StopFlagInfoBean stopFlagInfo;
/**
* 出发时间,格式:yyyy-MM-dd HH:mm
**/
private String departTime;
/**
* 到达航站楼
**/
private String arriveTerminal;
/**
* 最低价航班信息
**/
private String minFlightInfo;
/**
* Y舱全价
**/
private BigDecimal yprice;
/**
* 标准舱位运价
**/
private BigDecimal standardPrice;
/**
* 到达城市编号
**/
private String arriveCity;
/**
* 出发机场三字码
**/
private String departAirport;
/**
* 航班号
**/
private String flightNo;
/**
* 改签规则
**/
private String upgradeRule;
/**
* 到达城市英文名
**/
private String arriveCityNameEn;
/**
* 当天最低价
**/
private BigDecimal minPrice;
/**
* 是否有餐食,0否 1是
**/
private Integer isfood;
/**
* 出发机场名称
**/
private String departAirportName;
/**
* 飞行时长(分钟),格式:如60
**/
private Integer flightTime;
/**
* 航司名称
**/
private String airlineName;
}
package org.dromara.common.ys.service.model.res.airport.other;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* @author hzh
* @date 2024-11-04
**/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class StopFlagInfoBean {
/**
* 城市编号
**/
private String stopCity;
/**
* 机场三字码
**/
private String stopAirport;
/**
* 起飞时间,格式:yyyy-MM-dd HH:mm
**/
private String stopDepartTime;
/**
* 城市名称
**/
private String stopCityName;
/**
* 机场名称
**/
private String stopAirportName;
/**
* 到达时间,格式:yyyy-MM-dd HH:mm
**/
private String stopArriveTime;
}
package org.dromara.common.ys.service.model.res.airport.other;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.math.BigDecimal;
/**
* @author hzh
* @date 2024-11-04
**/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class TicketInfoBean {
/**
* 舱位代码
**/
private String cabin;
/**
* 折扣,格式:8.5折 1.3倍
**/
private String discount;
/**
* 航程城市名称
**/
private String voyageZh;
/**
* 票号 十三位票号 例如7811234567891
**/
private String tkno;
/**
* 到达时间,格式:yyyy-MM-dd HH:mm
**/
private String arriveTime;
/**
* 票价小计
**/
private BigDecimal ticketTotalAmount;
/**
* 航程类型,1单程 2往返 3连程 4缺口程
**/
private Integer voyageType;
/**
* 保险金额
**/
private BigDecimal insureAmount;
/**
* 票号,格式:789-1234567891
**/
private String ticketNo;
/**
* 航段序号,多个以,隔开
**/
private String ticketRangeNo;
/**
* 舱位名称
**/
private String cabinName;
/**
* 乘机人序号,对应乘机人集合中序号属性
**/
private String psgSn;
/**
* 服务费
**/
private BigDecimal serviceFee;
/**
* detr状态
**/
private String detrStatus;
/**
* 机票航段改签标识 改签状态 1改签中 0未改签 2改签完成
**/
private Integer rangeChangeFlag;
/**
* 出发时间,格式:yyyy-MM-dd HH:mm
**/
private String departTime;
/**
* 票面价
**/
private BigDecimal salePrice;
/**
* 乘机人
**/
private String psgName;
/**
* 燃油税
**/
private BigDecimal tax;
/**
* 航程
**/
private String voyage;
/**
* 机票航段退票标识退票状态0.正常1.退票中2.已完成
**/
private Integer rangeRefundFlag;
/**
* 机建
**/
private BigDecimal airportFee;
/**
* 保险份数
**/
private Integer insureNum;
/**
* uatp卡号
**/
private String uatpKh;
/**
* 结算状态 结算状态0未结1结算中2已结算3已入账4已确认
**/
private String jszt;
/**
* 航班号 好多以,隔开
**/
private String flightNo;
/**
* 创建时间
**/
private String createTime;
/**
* 退票标识
**/
private String refundFlag;
/**
* 票证状态,1正常、2退、3废
**/
private String tkStatus;
}
package org.dromara.common.ys.service.model.res.airport.other;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.math.BigDecimal;
/**
* @author hzh
* @date 2024-11-04
**/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class TicketPrintInfoBean {
/**
* 打印价格 包含基建税费
**/
private BigDecimal printAmount;
/**
* 打印时间
**/
private String printDate;
/**
* 出行人姓名
**/
private String psgName;
/**
* 打印行程单记录id
**/
private Integer id;
/**
* 打印状态 0未打印 1任务生成等待打印 2打印失败 3打印完成
**/
private Integer state;
/**
* 票号
**/
private String tkno;
/**
* 行程单号
**/
private String printInvoiceNo;
}
package org.dromara.common.ys.service.model.res.comomResource;
import lombok.Data;
/**
* @author hzh
* @date 2024-10-15
**/
@Data
public class AirportModel {
/**
* 城市id
*/
private String cityId;
/**
* 城市名称
*/
private String cityName;
/**
* 机场名称
*/
private String airportName;
/**
* 机场三字码
*/
private String threeCode;
}
package org.dromara.common.ys.service.model.res.comomResource;
import lombok.Data;
/**
* @author hzh
* @date 2024-10-15
* @desc 锁信息
**/
@Data
public class CityModel {
/**
* 城市id
*/
private String cityId;
/**
* 城市名称
*/
private String cityName;
/**
* 所在国家id
*/
private String countryId;
/**
* 所在省份id
*/
private String provinceId;
}
package org.dromara.common.ys.service.model.res.comomResource;
import lombok.Data;
/**
* @author hzh
* @date 2024-10-15
* @desc 锁信息
**/
@Data
public class CountryModel {
/**
* 国家编号
*/
private String countryCode;
/**
* 国家名称
*/
private String countryName;
}
package org.dromara.common.ys.service.model.res.comomResource;
import lombok.Data;
/**
* @author hzh
* @date 2024-10-15
* @desc 锁信息
**/
@Data
public class DictModel {
/**
* 数据编号
*/
private String id;
/**
* 数据名称
*/
private String cname;
}
package org.dromara.common.ys.service.model.res.comomResource;
import lombok.Data;
/**
* @author hzh
* @date 2024-10-15
* @desc 锁信息
**/
@Data
public class ProvinceModel {
/**
* 省份编号
*/
private String provinceCode;
/**
* 省份名称
*/
private String provinceName;
}
package org.dromara.common.ys.service.model.res.comomResource;
import lombok.Data;
/**
* @author hzh
* @date 2024-10-15
* @desc 锁信息
**/
@Data
public class StationModel {
/**
* 城市id
*/
private String cityId;
/**
* 城市名称
*/
private String cityName;
/**
* 站点代码
*/
private String stationCode;
/**
* 站点名称
*/
private String stationName;
}
package org.dromara.common.ys.service.model.res.comomResource;
import lombok.Data;
/**
* @author hzh
* @date 2024-10-15
* @desc 锁信息
**/
@Data
public class TrainBaseModel {
/**
* 编号
*/
private String code;
/**
* 名称
*/
private String name;
}
package org.dromara.common.ys.service.model.res.insurance;
import lombok.Data;
import java.math.BigDecimal;
/**
* @author hzh
* @date 2024-10-24
* @desc 保险
**/
@Data
public class BxcpModel {
/**
* 保险产品标识
*/
private String bxid;
/**
* 保险名称
*/
private String bxmc;
/**
* 险种名称
*/
private String bxxzmc;
/**
* 保险公司名称
*/
private String bxgsmc;
/**
* 保额 单位万元
*/
private BigDecimal be;
/**
* 销售价
*/
private BigDecimal saleprice;
/**
* 保额说明
*/
private String besm;
/**
* 保额 生效规则描述
*/
private String sxgzDesc;
/**
* 适用年龄
*/
private String synl;
/**
* 销售说明
*/
private String xssm;
}
package org.dromara.common.ys.service.model.res.train;
import lombok.Data;
/**
* @author hzh
* @date 2024-10-23
**/
@Data
public class AllStationModel {
/**
* 车站名称
*/
private String ename;
/**
* 备用1
*/
private String by1;
/**
* 备用2
*/
private String by2;
/**
* 备用3
*/
private String by3;
/**
* 备注
*/
private String bzbz;
/**
* 城市名称
*/
private String cityName;
/**
* 对应城市编号
*/
private String csbh;
/**
* 操作时间
*/
private String czdatetime;
/**
* 操作用户
*/
private String czuserid;
/**
* 到达说明
*/
private String ddsm;
/**
* 主键
*/
private String id;
/**
* 省份名称
*/
private String provinceName;
/**
* 拼音检索码
*/
private String pyjsm;
/**
* 所在城市
*/
private String szcs;
/**
* 所在省份
*/
private String szsf;
/**
* 距市中心距离
*/
private String szxjl;
/**
* 坐标id
*/
private String zbid;
/**
* 站点电话
*/
private String zddh;
/**
* 站点代码
*/
private String zddm;
/**
* 站点地址
*/
private String zddz;
/**
* 站点jj
*/
private String zdjj;
/**
* 站点名称
*/
private String zdmc;
/**
* 站点全拼
*/
private String zdqp;
}
package org.dromara.common.ys.service.model.res.train;
import lombok.Data;
import java.util.List;
/**
* @author hzh
* @date 2024-10-22
**/
@Data
public class QueryModel {
/**
* 列车类型代码 如Z直达 K快车等
* G——高铁
* C——城际列车
* D——动车
* Z——直达特快列车
* T——特快列车
* K——快速列车
* N——管内快速列车
* Y——临时旅游列车
* L、A——临时旅客列车
* S——市郊列车
* 无字母——普通旅客快车
*/
private String trainType;
/**
* 车次
*/
private String trainCode;
/**
* 内部编码
*/
private String trainNo;
/**
* 出发站编码
*/
private String fromStationCode;
/**
* 出发站名称
*/
private String fromStationName;
/**
* 出发城市id
*/
private String fromCity;
/**
* 出发城市名称
*/
private String fromCityName;
/**
* 出发站的序号
*/
private String fromStationNo;
/**
* 目的地编码
*/
private String toStationCode;
/**
* 目的地名称
*/
private String toStationName;
/**
* 目的地城市id
*/
private String toCity;
/**
* 目的地城市名称
*/
private String toCityName;
/**
* 目的地序号
*/
private String toStationNo;
/**
* 始发站代码
*/
private String startStationCode;
/**
* 始发站名称
*/
private String startStationName;
/**
* 始发站城市id
*/
private String startCity;
/**
* 始发站城市名称
*/
private String startCityName;
/**
* 终点站编码
*/
private String endStationCode;
/**
* 终点站名称
*/
private String endStationName;
/**
* 终点站城市id
*/
private String endCity;
/**
* 终点站城市名称
*/
private String endCityName;
/**
* 起售时间
*/
private String saleDateTime;
/**
* 起售时刻
*/
private String saleTime;
/**
* 开车时间 格式:HH:mm
*/
private String startTime;
/**
* 开车日期 格式:yyyy-MM-dd
*/
private String startDate;
/**
* 到达时天数
*/
private String arriveDays;
/**
* 到达时间 格式:HH:mm
*/
private String arriveTime;
/**
* 运行时间 格式:00小时15分钟
*/
private String runTime;
/**
* 运行分钟 格式:15 ,
*/
private String runMinute;
/**
* 是否可凭二代身份证直接进出站 0否 1是 ,
*/
private String isByidcard;
/**
* 现在是否可以购买
*/
private String canBuyNow;
/**
* 是否静音车厢 ,
*/
private String isQuietCoach;
/**
* 无座类型:O-二等座无座,1-硬座无座 ,
*/
private String wzType;
/**
* 座位列表
*/
private List<Seat> seatList;
}
@Data
class Seat {
/**
* 座位类型代码
*/
private String seatType;
/**
* 座位类型名称
*/
private String seatName;
/**
* 剩余座位数
*/
private String seatCount;
/**
* 价格
*/
private String price;
}
package org.dromara.common.ys.service.model.res.vehicles;
import lombok.Data;
import java.util.List;
/**
* @author hzh
* @date 2024-10-22
**/
@Data
public class EstimateJsycPriceModel {
/**
* 车型价格集合
*/
private List<VehiclesShoppingEstimatePriceTypeApi> typeList;
/**
* 缓存id
*/
private String cacheId;
}
package org.dromara.common.ys.service.model.res.vehicles;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
/**
* @author hzh
* @date 2024-10-22
**/
@Data
public class EstimateYyycPriceModel {
/**
* 车型价格集合
*/
private List<VehiclesShoppingEstimatePriceTypeApi> typeList;
/**
* 缓存id
*/
private String cacheId;
}
@Data
class VehiclesShoppingEstimatePriceTypeApi {
/**
* 车型id
*/
private String vehicleTypeId;
/**
* 车型名称
*/
private String vehicleTypeName;
/**
* 可载人数
*/
private Integer personNum;
/**
* 可载行李数
*/
private Integer luggageNum;
/**
* 可载行李数说明
*/
private String luggageMsg;
/**
* 车型描述
*/
private String vehicleTypeDesc;
/**
* 封面图片url
*/
private String coverUrl;
/**
* 价格集合
*/
private List<VehiclesShoppingEstimatePriceDetailApi> detailBeanList;
}
@Data
class VehiclesShoppingEstimatePriceDetailApi {
/**
* 产品ID
*/
private String productId;
/**
* 产品名称
*/
private String productName;
/**
* 价格来源(供应商id)
*/
private String priceFrom;
/**
* 价格来源名称(供应商名称)
*/
private String priceFromName;
/**
* 供应商图片地址
*/
private String priceFromUrl;
/**
* 产品标签
*/
private String productLable;
/**
* 产品标签名称
*/
private String productLabelName;
/**
* 免费取消提前时限 用车时间之前几小时
*/
private Double cancelAdvMils;
/**
* 退改规则说明
*/
private String ruleMsg;
/**
* 预定规则说明
*/
private String scheduledRulesMsg;
/**
* 超时规则说明
*/
private String timeoutRuleMsg;
/**
* 服务说明
*/
private String serviceDesc;
/**
* 预估行程距离,单位米
*/
private Double distance;
/**
* 预估行程时间,单位秒
*/
private Double duration;
/**
* 销售价 单位元
*/
private BigDecimal salePrice;
/**
* 销售服务费 单位元
*/
private BigDecimal serviceFee;
/**
* 差旅返回对象
*/
private VehiclesClzcMatchApi clzcMatch;
}
@Data
class VehiclesClzcMatchApi {
/**
* 适用规则 1预估价格 2里程 ,
*/
private String cityLevelCode;
/**
* 适用日期(周几) 多个,分割 ,
*/
private String wjMonths;
/**
* 可用时段
*/
private String kysd;
/**
* 是否违背0否1是
*/
private String sfwb;
/**
* 差旅标准值
*/
private String clzcValue;
/**
* 管控方式1只做提醒2不允许预订
*/
private Integer gkfs;
/**
* 违背说明
*/
private String wbsm;
}
org.dromara.common.ys.service.impl.AirPortServiceImpl
org.dromara.common.ys.service.impl.CommonResourceServiceImpl
org.dromara.common.ys.service.impl.InsuranceServiceImpl
org.dromara.common.ys.service.impl.OrgServiceImpl
org.dromara.common.ys.service.impl.TrainServiceImpl
org.dromara.common.ys.service.impl.VehiclesServiceImpl
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
<module>ruoyi-job</module> <module>ruoyi-job</module>
<module>ruoyi-resource</module> <module>ruoyi-resource</module>
<module>ruoyi-workflow</module> <module>ruoyi-workflow</module>
<module>ruoyi-server</module>
</modules> </modules>
<artifactId>ruoyi-modules</artifactId> <artifactId>ruoyi-modules</artifactId>
......
//package org.dromara.resource.service.airport;
//
//import com.alibaba.druid.util.StringUtils;
//import org.apache.commons.collections4.CollectionUtils;
//import org.dromara.common.core.constant.Constants;
//import org.dromara.common.core.domain.R;
//import org.dromara.common.redis.utils.RedisUtils;
//import org.dromara.common.ys.constant.Cplx;
//import org.dromara.common.ys.constant.TripType;
//import org.dromara.common.ys.service.IAirportService;
//import org.dromara.common.ys.service.ICommonResourceService;
//import org.dromara.common.ys.service.IInsuranceService;
//import org.dromara.common.ys.service.model.res.airport.BookOrderModel;
//import org.dromara.common.ys.service.model.res.airport.QueryFlightModel;
//import org.dromara.common.ys.service.model.res.comomResource.AirportModel;
//import org.springframework.web.bind.annotation.*;
//
//import java.time.Duration;
//import java.util.List;
//import java.util.stream.Collectors;
//
///**
// * @author hzh
// * @date 2024-10-28
// **/
//@RestController
//@RequestMapping("/biz/airport/ys")
//public class AirportController {
//
//
// private static final String AIRPORT = "airport:ys";
//
// private IAirportService service;
//
// private IInsuranceService insuranceService;
//
// private ICommonResourceService commonResourceService;
//
// @GetMapping("list")
// public R<QueryFlightModel> list(org.dromara.common.ys.service.model.req.airport.QueryFlightModel model) {
// List<AirportModel> airPortList = getAirPortList();
// model.setArriveAirport(airPortList.stream().filter(item -> StringUtils.equals(model.getArriveAirport(), item.getCityName())).map(AirportModel::getThreeCode).findFirst().orElse(null));
// model.setDepartAirport(airPortList.stream().filter(item -> StringUtils.equals(model.getDepartAirport(), item.getCityName())).map(AirportModel::getThreeCode).findFirst().orElse(null));
// model.setTripType(TripType.PUBLIC.getCode());
// try {
// return R.ok(service.queryFlight(getUserId(), model));
// } catch (Exception e) {
// throw new RuntimeException(e.getMessage());
// }
// }
//
// private List<AirportModel> getAirPortList() {
// List<AirportModel> airPortList = cacheService.get(AIRPORT);
// if (CollectionUtils.isEmpty(airPortList)) {
// airPortList = commonResourceService.getAirportList(getUserId());
// RedisUtils.setCacheObject(verifyKey, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION));
// cacheService.put(AIRPORT, airPortList, 60 * 60 * 24L);
// }
// return airPortList;
// }
//
// @GetMapping("/insuranceList")
// public CommonResponse<List<com.wenhe.base.model.res.insurance.BxcpModel>> insuranceList() {
// return CommonResponse.ok(insuranceService.list(getUserId(), new BxcpModel().setCplx(Cplx.DOMESTIC.getCode())));
// }
//
// @GetMapping("/airportList")
// public CommonResponse<List<AirportModel>> airportList(@RequestParam("keyword") String keyword) {
// List<AirportModel> list = getAirPortList();
// return CommonResponse.ok(
// list.stream().filter(item->{
// if (com.wenhe.base.service.tool.StringUtils.isNotEmpty(item.getCityName()) && item.getCityName().contains(keyword)) {
// return true;
// }
// if (com.wenhe.base.service.tool.StringUtils.isNotEmpty(item.getAirportName()) && item.getAirportName().contains(keyword)) {
// return true;
// }
// if (com.wenhe.base.service.tool.StringUtils.isNotEmpty(item.getThreeCode()) && item.getThreeCode().contains(keyword)) {
// return true;
// }
// return false;
// }).collect(Collectors.toList()));
// }
//
// /**
// * 下单接口
// *
// * @param model model
// * @return 订单详情
// */
// @PostMapping("/bookOrder")
// public CommonResponse<List<BookOrderModel>> bookOrder(@RequestBody com.wenhe.base.model.req.airport.bookOrder.BookOrderModel model) {
// model.setTripType(TripType.PUBLIC.getCode());
// List<BookOrderModel> orderList = service.bookOrder(getUserId(), model);
// return CommonResponse.ok(orderList);
// }
//
// @GetMapping("/orderList")
// public CommonResponse<PageInfo<OrderListModel>> orderList(com.wenhe.base.model.req.airport.OrderListModel model) {
// model.setBookNo(getUserId());
// return CommonResponse.ok(service.orderList(getUserId(), model));
// }
//
//
// @GetMapping("/orderDetail")
// public CommonResponse<QueryTkOrderModel> orderDetail(com.wenhe.base.model.req.airport.QueryTkOrderModel model) {
// return CommonResponse.ok(service.detail(getUserId(), model));
// }
//}
//package org.dromara.resource.service.train;
//
//import com.wenhe.base.api.common.CommonResponse;
//import com.wenhe.base.api.tool.IBaseCacheService;
//import com.wenhe.base.common.web.controller.AbstractCommonController;
//import com.wenhe.base.constant.TripType;
//import com.wenhe.base.model.req.train.QueryModel;
//import com.wenhe.base.model.res.comomResource.CityModel;
//import com.wenhe.base.model.res.train.AllStationModel;
//import com.wenhe.base.service.ICommonResourceService;
//import com.wenhe.base.service.ITrainService;
//import com.wenhe.base.service.tool.StringUtils;
//import com.wenhe.base.util.collection.CollectionUtils;
//import org.springframework.beans.factory.annotation.Autowired;
//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.ArrayList;
//import java.util.List;
//import java.util.concurrent.Callable;
//import java.util.concurrent.ExecutorService;
//import java.util.concurrent.Executors;
//import java.util.concurrent.Future;
//import java.util.stream.Collectors;
//
///**
// * @author hzh
// * @date 2024-10-29
// **/
//@RestController
//@RequestMapping("/biz/train/ys")
//public class TrainController extends AbstractCommonController {
//
// @Autowired
// private ITrainService trainService;
//
// @Autowired
// private ICommonResourceService commonResourceService;
//
// @Autowired
// private IBaseCacheService<List> cacheService;
//
// private static final String TRAIN = "train:ys";
// private static final String CITY = "city:ys";
//
// @GetMapping("/stationList")
// public CommonResponse<List<AllStationModel>> stationList(@RequestParam("keyword") String keyword) {
// List<AllStationModel> stationList = getStationList();
// return CommonResponse.ok(
// stationList.stream().filter(item -> {
// if (StringUtils.isNotEmpty(item.getCityName()) && item.getCityName().contains(keyword)) {
// return true;
// }
// if (StringUtils.isNotEmpty(item.getEname()) && item.getEname().contains(keyword)) {
// return true;
// }
// if (StringUtils.isNotEmpty(item.getZdmc()) && item.getZdmc().contains(keyword)) {
// return true;
// }
// if (StringUtils.isNotEmpty(item.getPyjsm()) && item.getPyjsm().contains(keyword)) {
// return true;
// }
// return false;
// }).collect(Collectors.toList())
// );
// }
//
// private List<AllStationModel> getStationList() {
// List<AllStationModel> stationList = (List<AllStationModel>) cacheService.get(TRAIN);
// if (CollectionUtils.isEmpty(stationList)) {
// stationList = trainService.getAllStation(getUserId());
// cacheService.put(TRAIN, stationList, 60 * 60 * 24L);
// }
// return stationList;
// }
//
// /**
// * 线程数
// */
// private static final int NUM_THREADS = 100;
//
// @GetMapping("/list")
// public CommonResponse<List<com.wenhe.base.model.res.train.QueryModel>> list(
// @RequestParam(value = "fromDate") String fromDate,
// @RequestParam(value = "fromStationCode", required = false) String fromStationCode,
// @RequestParam(value = "toStationCode", required = false) String toStationCode,
// @RequestParam(value = "fromCity", required = false) String fromCity,
// @RequestParam(value = "toCity", required = false) String toCity
// ) throws InterruptedException {
// //获取出发站点
// List<String> fromStationCodeList = getStationCodeList(fromStationCode, fromCity);
// //获取目的站点
// List<String> toStationCodeList = getStationCodeList(toStationCode, toCity);
//
// String userId = getUserId();
//
// List<Callable<List<com.wenhe.base.model.res.train.QueryModel>>> taskList = fromStationCodeList.stream().flatMap(fromCode ->
// toStationCodeList.stream().map(toCode -> (Callable<List<com.wenhe.base.model.res.train.QueryModel>>) () -> {
// QueryModel query = new QueryModel()
// .setFromDate(fromDate)
// .setFromStationCode(fromCode)
// .setToStationCode(toCode)
// .setTripType(TripType.PUBLIC.getCode());
// return trainService.queryModel(userId, query);
// })).collect(Collectors.toList());
//
//
// // 创建一个线程池
// ExecutorService executorService = Executors.newFixedThreadPool(NUM_THREADS);
//
// // 提交任务并等待完成
// List<Future<List<com.wenhe.base.model.res.train.QueryModel>>> futures = executorService.invokeAll(taskList);
//
// // 关闭线程池
// executorService.shutdown();
//
// // 检查任务是否完成
// List<com.wenhe.base.model.res.train.QueryModel> list = futures.stream().flatMap(f -> {
// try {
// return f.get().stream();
// } catch (Exception e) {
// return new ArrayList<com.wenhe.base.model.res.train.QueryModel>().stream();
// }
// }).collect(Collectors.groupingBy(com.wenhe.base.model.res.train.QueryModel::getTrainCode))
// .entrySet().stream().map(entry -> entry.getValue().get(0)).collect(Collectors.toList());
//
// return CommonResponse.ok(list);
// }
//
// private List<String> getStationCodeList(String stationCode, String city) {
// List<String> stationCodeList = new ArrayList<>();
// if (StringUtils.isNotEmpty(stationCode)) {
// stationCodeList.add(stationCode);
// } else {
// stationCodeList = getStationList().stream().filter(item -> StringUtils.equals(item.getCityName(), city)).map(AllStationModel::getZddm)
//
// .collect(Collectors.toList());
// }
// return stationCodeList;
// }
//
//
// @GetMapping("/cityList")
// public CommonResponse<List<CityModel>> list(@RequestParam("keyword") String keyword) {
// List<CityModel> cityList = getCityList();
// return CommonResponse.ok(cityList.stream().filter(item -> StringUtils.equals(item.getCityName(), keyword)).collect(Collectors.toList()));
// }
//
// private List<CityModel> getCityList() {
// List<CityModel> cityList = (List<CityModel>) cacheService.get(CITY);
// if (CollectionUtils.isEmpty(cityList)) {
// cityList = commonResourceService.getCityList(getUserId());
// cacheService.put(CITY, cityList, 60 * 60 * 24L);
// }
// return cityList;
// }
//
//}
//package org.dromara.resource.service.vehicle;
//
//import com.wenhe.base.api.common.CommonResponse;
//import com.wenhe.base.common.web.controller.AbstractCommonController;
//import com.wenhe.base.constant.TripType;
//import com.wenhe.base.model.req.vehicles.EstimateJsycPriceModel;
//import com.wenhe.base.model.req.vehicles.EstimateYyycPriceModel;
//import com.wenhe.base.service.IVehiclesService;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.web.bind.annotation.RequestMapping;
//import org.springframework.web.bind.annotation.RestController;
//
///**
// * @author hzh
// * @date 2024-10-29
// **/
//@RestController
//@RequestMapping("/biz/vehicle/ys")
//public class VehiclesController extends AbstractCommonController {
//
// @Autowired
// private IVehiclesService vehiclesService;
//
// @RequestMapping("/immediate")
// public CommonResponse<com.wenhe.base.model.res.vehicles.EstimateJsycPriceModel> immediate(EstimateJsycPriceModel model) {
// model.setTripType(TripType.PUBLIC.getCode());
// return CommonResponse.ok(vehiclesService.estimateJsycPrice(getUserId(), model));
// }
//
// @RequestMapping("/prebook")
// public CommonResponse<com.wenhe.base.model.res.vehicles.EstimateYyycPriceModel> prebook(EstimateYyycPriceModel model) {
// model.setTripType(TripType.PUBLIC.getCode());
// return CommonResponse.ok(vehiclesService.estimateYyycPrice(getUserId(), model));
// }
//
//
//}
package org.dromara.system.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import org.dromara.common.tenant.core.TenantEntity;
import java.util.Date;
/**
* 用户对象 sys_user
*
* @author Lion Li
*/
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
@TableName("wx_user")
public class WxUser extends TenantEntity {
/**
* 用户ID
*/
@TableId(value = "user_id")
private Long userId;
/**
* 用户账号
*/
private String openId;
/**
* 手机号码
*/
private String phonenumber;
/**
* 帐号状态(0正常 1停用)
*/
private String status;
/**
* 删除标志(0代表存在 2代表删除)
*/
@TableLogic
private String delFlag;
/**
* 最后登录IP
*/
private String loginIp;
/**
* 最后登录时间
*/
private Date loginDate;
/**
* 备注
*/
private String remark;
}
package org.dromara.system.domain.bo;
import io.github.linpeilie.annotations.AutoMapper;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.system.domain.WxUser;
/**
* 用户信息业务对象 sys_user
*
* @author Michelle.Chung
*/
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = WxUser.class, reverseConvertGenerate = false)
public class WxUserBo extends BaseEntity {
/**
* 用户ID
*/
private Long userId;
/**
* openId
*/
private String openId;
/**
* 手机号码
*/
@NotBlank(message = "手机号码不能为空")
private String phonenumber;
/**
* 帐号状态(0正常 1停用)
*/
private String status;
/**
* 备注
*/
private String remark;
}
package org.dromara.system.domain.vo;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import org.dromara.system.domain.WxUser;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* 用户信息视图对象 sys_user
*
* @author Michelle.Chung
*/
@Data
@AutoMapper(target = WxUser.class)
public class WxUserVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 用户ID
*/
private Long userId;
/**
* 租户ID
*/
private String tenantId;
/**
* 用户账号
*/
private String openId;
/**
* 手机号码
*/
private String phonenumber;
/**
* 帐号状态(0正常 1停用)
*/
private String status;
/**
* 最后登录IP
*/
private String loginIp;
/**
* 最后登录时间
*/
private Date loginDate;
/**
* 备注
*/
private String remark;
/**
* 创建时间
*/
private Date createTime;
}
...@@ -16,15 +16,18 @@ import org.dromara.common.mybatis.helper.DataPermissionHelper; ...@@ -16,15 +16,18 @@ import org.dromara.common.mybatis.helper.DataPermissionHelper;
import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.system.api.RemoteUserService; import org.dromara.system.api.RemoteUserService;
import org.dromara.system.api.domain.bo.RemoteUserBo; import org.dromara.system.api.domain.bo.RemoteUserBo;
import org.dromara.system.api.domain.bo.RemoteWxUserBo;
import org.dromara.system.api.domain.vo.RemoteUserVo; import org.dromara.system.api.domain.vo.RemoteUserVo;
import org.dromara.system.api.model.LoginUser; import org.dromara.system.api.model.LoginUser;
import org.dromara.system.api.model.RoleDTO; import org.dromara.system.api.model.RoleDTO;
import org.dromara.system.api.model.XcxLoginUser; import org.dromara.system.api.model.XcxLoginUser;
import org.dromara.system.domain.SysUser; import org.dromara.system.domain.SysUser;
import org.dromara.system.domain.bo.SysUserBo; import org.dromara.system.domain.bo.SysUserBo;
import org.dromara.system.domain.bo.WxUserBo;
import org.dromara.system.domain.vo.SysDeptVo; import org.dromara.system.domain.vo.SysDeptVo;
import org.dromara.system.domain.vo.SysRoleVo; import org.dromara.system.domain.vo.SysRoleVo;
import org.dromara.system.domain.vo.SysUserVo; import org.dromara.system.domain.vo.SysUserVo;
import org.dromara.system.domain.vo.WxUserVo;
import org.dromara.system.mapper.SysUserMapper; import org.dromara.system.mapper.SysUserMapper;
import org.dromara.system.service.*; import org.dromara.system.service.*;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
...@@ -46,6 +49,7 @@ public class RemoteUserServiceImpl implements RemoteUserService { ...@@ -46,6 +49,7 @@ public class RemoteUserServiceImpl implements RemoteUserService {
private final ISysConfigService configService; private final ISysConfigService configService;
private final ISysRoleService roleService; private final ISysRoleService roleService;
private final ISysDeptService deptService; private final ISysDeptService deptService;
private final IWxUserService wxUserService;
private final SysUserMapper userMapper; private final SysUserMapper userMapper;
/** /**
...@@ -148,13 +152,19 @@ public class RemoteUserServiceImpl implements RemoteUserService { ...@@ -148,13 +152,19 @@ public class RemoteUserServiceImpl implements RemoteUserService {
*/ */
@Override @Override
public XcxLoginUser getUserInfoByOpenid(String openid) throws UserException { public XcxLoginUser getUserInfoByOpenid(String openid) throws UserException {
// todo 自行实现 userService.selectUserByOpenid(openid); WxUserVo wxUser = wxUserService.selectUserByOpenId(openid);
SysUser sysUser = new SysUser(); if (!ObjectUtil.isNotNull(wxUser)) {
if (ObjectUtil.isNull(sysUser)) { return null;
// todo 用户不存在 业务逻辑自行实现 }
//根据手机号查询用户信息
SysUserVo user = userService.selectUserByPhonenumber(wxUser.getPhonenumber());
if (!ObjectUtil.isNotNull(user)) {
throw new UserException("user.not.exists", wxUser.getPhonenumber());
} }
SysUser sysUser = BeanUtil.copyProperties(user, SysUser.class);
if (UserStatus.DISABLE.getCode().equals(sysUser.getStatus())) { if (UserStatus.DISABLE.getCode().equals(sysUser.getStatus())) {
// todo 用户已被停用 业务逻辑自行实现 throw new UserException("user.blocked", sysUser.getUserName());
} }
// 框架登录不限制从什么表查询 只要最终构建出 LoginUser 即可 // 框架登录不限制从什么表查询 只要最终构建出 LoginUser 即可
// 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了 // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了
...@@ -190,6 +200,12 @@ public class RemoteUserServiceImpl implements RemoteUserService { ...@@ -190,6 +200,12 @@ public class RemoteUserServiceImpl implements RemoteUserService {
return userService.registerUser(sysUserBo, remoteUserBo.getTenantId()); return userService.registerUser(sysUserBo, remoteUserBo.getTenantId());
} }
@Override
public Boolean registerWxUserInfo(RemoteWxUserBo remoteWxUserBo) {
WxUserBo user = BeanUtil.copyProperties(remoteWxUserBo, WxUserBo.class);
return wxUserService.registerUser(user, remoteWxUserBo.getTenantId());
}
/** /**
* 通过用户ID查询用户账户 * 通过用户ID查询用户账户
* *
......
package org.dromara.system.mapper;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import org.dromara.common.mybatis.annotation.DataColumn;
import org.dromara.common.mybatis.annotation.DataPermission;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.system.domain.WxUser;
import org.dromara.system.domain.vo.WxUserVo;
import java.util.List;
/**
* 用户表 数据层
*
* @author Lion Li
*/
public interface WxUserMapper extends BaseMapperPlus<WxUser, WxUserVo> {
@DataPermission({
@DataColumn(key = "openId", value = "u.open_id")
})
Page<WxUserVo> selectPageUserList(@Param("page") Page<WxUser> page, @Param(Constants.WRAPPER) Wrapper<WxUser> queryWrapper);
@DataPermission({
@DataColumn(key = "openId", value = "u.open_id")
})
List<WxUserVo> selectUserList(@Param(Constants.WRAPPER) Wrapper<WxUser> queryWrapper);
@Override
@DataPermission({
@DataColumn(key = "deptName", value = "dept_id"),
@DataColumn(key = "userName", value = "user_id")
})
int update(@Param(Constants.ENTITY) WxUser user, @Param(Constants.WRAPPER) Wrapper<WxUser> updateWrapper);
@Override
@DataPermission({
@DataColumn(key = "userName", value = "user_id")
})
int updateById(@Param(Constants.ENTITY) WxUser user);
}
package org.dromara.system.service;
import org.dromara.system.domain.bo.WxUserBo;
import org.dromara.system.domain.vo.WxUserVo;
/**
* 用户 业务层
*
* @author Lion Li
*/
public interface IWxUserService {
/**
* 通过openId查询用户
*
* @param openId openId
* @return 用户对象信息
*/
WxUserVo selectUserByOpenId(String openId);
/**
* 注册用户
*
* @param user 用户对象
* @param tenantId 租户ID
* @return boolean
*/
boolean registerUser(WxUserBo user, String tenantId);
}
package org.dromara.system.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.system.domain.WxUser;
import org.dromara.system.domain.bo.WxUserBo;
import org.dromara.system.domain.vo.WxUserVo;
import org.dromara.system.mapper.WxUserMapper;
import org.dromara.system.service.IWxUserService;
import org.springframework.stereotype.Service;
/**
* 用户 业务层处理
*
* @author Lion Li
*/
@Slf4j
@RequiredArgsConstructor
@Service
public class WxUserServiceImpl implements IWxUserService {
private final WxUserMapper baseMapper;
/**
* 通过openId查询用户
*
* @param openId openId
* @return 用户对象信息
*/
@Override
public WxUserVo selectUserByOpenId(String openId) {
return baseMapper.selectVoOne(new LambdaQueryWrapper<WxUser>().eq(WxUser::getOpenId, openId));
}
/**
* 注册用户信息
*
* @param user 用户信息
* @return 结果
*/
@Override
public boolean registerUser(WxUserBo user, String tenantId) {
user.setCreateBy(0L);
user.setUpdateBy(0L);
WxUser wxUser = MapstructUtils.convert(user, WxUser.class);
wxUser.setTenantId(tenantId);
return baseMapper.insert(wxUser) > 0;
}
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.dromara.system.mapper.WxUserMapper">
<resultMap type="org.dromara.system.domain.vo.WxUserVo" id="WxUserResult">
<id property="userId" column="user_id"/>
</resultMap>
<select id="selectPageUserList" resultMap="WxUserResult">
select
<if test="ew.getSqlSelect != null">
${ew.getSqlSelect}
</if>
<if test="ew.getSqlSelect == null">
u.user_id, u.open_id, u.phonenumber,
u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark
</if>
from sys_user u
${ew.getCustomSqlSegment}
</select>
<select id="selectUserList" resultMap="WxUserResult">
select
<if test="ew.getSqlSelect != null">
${ew.getSqlSelect}
</if>
<if test="ew.getSqlSelect == null">
u.user_id, u.open_id, u.phonenumber,
u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark
</if>
from sys_user u
${ew.getCustomSqlSegment}
</select>
</mapper>
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论