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

登录调试

上级 48e019d9
......@@ -21,7 +21,7 @@ rule_files:
scrape_configs:
- job_name: 'Prometheus'
static_configs:
- targets: ['127.0.0.1:9090']
- targets: ['19.168.8.190:9090']
- job_name: 'Grafana'
static_configs:
......
......@@ -3,6 +3,7 @@ package org.dromara.system.api;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.exception.user.UserException;
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.model.LoginUser;
import org.dromara.system.api.model.XcxLoginUser;
......@@ -68,6 +69,13 @@ public interface RemoteUserService {
*/
Boolean registerUserInfo(RemoteUserBo remoteUserBo) throws UserException, ServiceException;
/**
* 注册用户信息
* @param remoteWxUserBo 用户信息
* @return 结果
*/
Boolean registerWxUserInfo(RemoteWxUserBo remoteWxUserBo);
/**
* 通过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 {
*/
private String openid;
/**
* 获取手机号
*/
private String phone;
}
......@@ -86,6 +86,11 @@
<artifactId>ruoyi-api-resource</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-weixin</artifactId>
</dependency>
<!-- 自定义负载均衡(多团队开发使用) -->
<!-- <dependency>-->
<!-- <groupId>org.dromara</groupId>-->
......
......@@ -101,9 +101,12 @@ public class TokenController {
LoginVo loginVo = IAuthStrategy.login(body, clientVo, grantType);
Long userId = LoginHelper.getUserId();
if(!ObjectUtil.isNotNull(userId)){
scheduledExecutorService.schedule(() -> {
remoteMessageService.publishMessage(userId, "欢迎登录商旅微服务管理系统");
}, 3, TimeUnit.SECONDS);
}
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;
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.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.domain.vo.RemoteClientVo;
import org.dromara.system.api.model.XcxLoginUser;
......@@ -39,12 +42,24 @@ public class XcxAuthStrategy implements IAuthStrategy {
// xcxCode 为 小程序调用 wx.login 授权后获取
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
String openid = "";
String openid = auth.getOpenId();
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.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 @@
<module>ruoyi-common-nacos</module>
<module>ruoyi-common-bus</module>
<module>ruoyi-common-sse</module>
<module>ruoyi-common-weixin</module>
</modules>
<artifactId>ruoyi-common</artifactId>
......
......@@ -215,6 +215,13 @@
<version>${revision}</version>
</dependency>
<!-- 微信模块 -->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-weixin</artifactId>
<version>${revision}</version>
</dependency>
<!-- 租户模块 -->
<dependency>
<groupId>org.dromara</groupId>
......@@ -257,6 +264,13 @@
<version>${revision}</version>
</dependency>
<!-- 云上 -->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-ys</artifactId>
<version>${revision}</version>
</dependency>
</dependencies>
</dependencyManagement>
</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.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;
}
差异被折叠。
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论