提交 0f85edf1 authored 作者: hzh's avatar hzh

Merge branch 'dev'

# Conflicts: # ruoyi-modules/ruoyi-server/src/main/java/org/dromara/server/dubbo/RemoteServerServiceImpl.java # ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java
package org.dromara.server.api;
/**
* 部门审批设置
*
* @author wenhe
*/
public interface RemoteDeptOrderApproveService {
/**
* 根据部门id获取是否需要审批
*
* @param deptId 部门id
* @return 是否需要审批
*/
boolean selectOrderApproveByDeptId(Long deptId);
}
...@@ -21,10 +21,11 @@ public interface RemoteServerService { ...@@ -21,10 +21,11 @@ public interface RemoteServerService {
* 根据手机号查询用户 * 根据手机号查询用户
* *
* @param tenantId 租户id * @param tenantId 租户id
* @param userType 用户类型
* @param phone 用户手机号 * @param phone 用户手机号
* @return 用户信息 * @return 用户信息
*/ */
RemoteUser getUserByPhone(String tenantId, String phone); RemoteUser getUserByPhone(String tenantId, String userType, String phone);
/** /**
......
package org.dromara.server.api; package org.dromara.server.api;
import org.dromara.server.api.domain.RemoteOrderApprove;
/** /**
* @author wenhe * @author wenhe
*/ */
...@@ -53,4 +55,10 @@ public interface RemoteYsOrderService { ...@@ -53,4 +55,10 @@ public interface RemoteYsOrderService {
*/ */
void payed(String orderType, String orderNo); void payed(String orderType, String orderNo);
/**
* 订单审批
*
* @param orderApprove 审批内容
*/
void orderApprove(RemoteOrderApprove orderApprove);
} }
package org.dromara.server.api.domain;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serial;
import java.io.Serializable;
/**
* @author hzh
* @date 2025-06-13
**/
@Data
@Accessors(chain = true)
public class RemoteOrderApprove implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 订单id
*/
private String orderNo;
/**
* 订单类型
*/
private String orderType;
/**
* 授权人id
*/
private Long authId;
}
...@@ -48,5 +48,10 @@ public class RemoteUser implements Serializable { ...@@ -48,5 +48,10 @@ public class RemoteUser implements Serializable {
*/ */
private String phoneNumber; private String phoneNumber;
/**
* 用户类型
*/
private String userType;
} }
package org.dromara.system.api;
import org.dromara.system.api.domain.vo.RemoteProjectVo;
import java.util.List;
/**
* 项目服务
*
* @author wenhe
*/
public interface RemoteProjectService {
/**
* 获取项目列表
*
* @param tenantId 租户id
* @param phone 手机号
* @return 结果
*/
List<RemoteProjectVo> queryList(String tenantId, String phone);
/**
* 通过项目ID查询项目名称
*
* @param projectIds 项目ID串逗号分隔
* @return 项目名称串逗号分隔
*/
String selectProjectNameByIds(String projectIds);
}
...@@ -59,10 +59,12 @@ public interface RemoteUserService { ...@@ -59,10 +59,12 @@ public interface RemoteUserService {
* 通过openid查询用户信息 * 通过openid查询用户信息
* *
* @param openid openid * @param openid openid
* @param phone 手机号
* @param userType 用户类型
* @param tenantId 租户id * @param tenantId 租户id
* @return 结果 * @return 结果
*/ */
XcxLoginUser getUserInfoByOpenid(String openid, String phone, String tenantId) throws UserException; XcxLoginUser getUserInfoByOpenid(String openid, String phone, String userType, String tenantId) throws UserException;
/** /**
* 注册用户信息 * 注册用户信息
...@@ -135,6 +137,14 @@ public interface RemoteUserService { ...@@ -135,6 +137,14 @@ public interface RemoteUserService {
*/ */
List<RemoteUserVo> selectListByIds(List<Long> userIds); List<RemoteUserVo> selectListByIds(List<Long> userIds);
/**
* 通过用户id查询用户信息
*
* @param userId 用户id
* @return 用户信息
*/
RemoteUserVo selectById(Long userId);
/** /**
* 通过角色ID查询用户ID * 通过角色ID查询用户ID
* *
......
...@@ -36,6 +36,11 @@ public class RemoteLogininforBo implements Serializable { ...@@ -36,6 +36,11 @@ public class RemoteLogininforBo implements Serializable {
*/ */
private String userName; private String userName;
/**
* 用户类型
*/
private String userType;
/** /**
* 客户端 * 客户端
*/ */
......
...@@ -61,6 +61,11 @@ public class RemoteOperLogBo implements Serializable { ...@@ -61,6 +61,11 @@ public class RemoteOperLogBo implements Serializable {
*/ */
private String operName; private String operName;
/**
* 用户类型
*/
private String userType;
/** /**
* 部门名称 * 部门名称
*/ */
......
...@@ -36,6 +36,11 @@ public class RemoteWxUserBo implements Serializable { ...@@ -36,6 +36,11 @@ public class RemoteWxUserBo implements Serializable {
*/ */
private String openId; private String openId;
/**
* 用户类型
*/
private String userType;
/** /**
* 手机号码 * 手机号码
*/ */
......
package org.dromara.system.api.domain.vo;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 系统项目对象
*
* @author hzh
* @date 2025-06-11
*/
@Data
public class RemoteProjectVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 租户id
*/
private String tenantId;
/**
* id
*/
private Long projectId;
/**
* 项目名称
*/
private String projectName;
}
package org.dromara.auth.controller; package org.dromara.auth.controller;
import cn.dev33.satoken.exception.NotLoginException; import cn.dev33.satoken.exception.NotLoginException;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.codec.Base64; import cn.hutool.core.codec.Base64;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
...@@ -12,6 +13,7 @@ import me.zhyd.oauth.model.AuthUser; ...@@ -12,6 +13,7 @@ import me.zhyd.oauth.model.AuthUser;
import me.zhyd.oauth.request.AuthRequest; import me.zhyd.oauth.request.AuthRequest;
import me.zhyd.oauth.utils.AuthStateUtils; import me.zhyd.oauth.utils.AuthStateUtils;
import org.apache.dubbo.config.annotation.DubboReference; import org.apache.dubbo.config.annotation.DubboReference;
import org.dromara.auth.domain.vo.LoginProjectVo;
import org.dromara.auth.domain.vo.LoginTenantVo; import org.dromara.auth.domain.vo.LoginTenantVo;
import org.dromara.auth.domain.vo.LoginVo; import org.dromara.auth.domain.vo.LoginVo;
import org.dromara.auth.domain.vo.TenantListVo; import org.dromara.auth.domain.vo.TenantListVo;
...@@ -34,6 +36,7 @@ import org.dromara.common.tenant.helper.TenantHelper; ...@@ -34,6 +36,7 @@ import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.resource.api.RemoteMessageService; import org.dromara.resource.api.RemoteMessageService;
import org.dromara.system.api.*; import org.dromara.system.api.*;
import org.dromara.system.api.domain.vo.RemoteClientVo; import org.dromara.system.api.domain.vo.RemoteClientVo;
import org.dromara.system.api.domain.vo.RemoteProjectVo;
import org.dromara.system.api.domain.vo.RemoteTenantVo; import org.dromara.system.api.domain.vo.RemoteTenantVo;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
...@@ -64,6 +67,8 @@ public class TokenController { ...@@ -64,6 +67,8 @@ public class TokenController {
@DubboReference @DubboReference
private final RemoteTenantService remoteTenantService; private final RemoteTenantService remoteTenantService;
@DubboReference @DubboReference
private final RemoteProjectService remoteProjectService;
@DubboReference
private final RemoteClientService remoteClientService; private final RemoteClientService remoteClientService;
@DubboReference @DubboReference
private final RemoteSocialService remoteSocialService; private final RemoteSocialService remoteSocialService;
...@@ -239,10 +244,24 @@ public class TokenController { ...@@ -239,10 +244,24 @@ public class TokenController {
} }
// 根据域名进行筛选 // 根据域名进行筛选
List<TenantListVo> list = StreamUtils.filter(voList, vo -> List<TenantListVo> list = StreamUtils.filter(voList, vo ->
StringUtils.equals(vo.getDomain(), host)&& StringUtils.equals(vo.getDomain(), host) &&
virtual.equals(vo.getVirtual())); virtual.equals(vo.getVirtual()));
result.setVoList(CollUtil.isNotEmpty(list) ? list : voList); result.setVoList(CollUtil.isNotEmpty(list) ? list : voList);
return R.ok(result); return R.ok(result);
} }
/**
* 登录页面项目下拉框
*
* @param tenantId 租户id
* @param phone 手机号
* @return 项目列表
*/
@GetMapping("/project/list")
public R<List<LoginProjectVo>> projectList(@RequestParam(value = "tenantId", required = false) String tenantId,
@RequestParam(value = "phone", required = false) String phone) {
List<RemoteProjectVo> list = remoteProjectService.queryList(tenantId, phone);
return R.ok(BeanUtil.copyToList(list, LoginProjectVo.class));
}
} }
package org.dromara.auth.domain.vo;
import lombok.Data;
/**
* 登录项目对象
*
* @author wenhe
*/
@Data
public class LoginProjectVo {
/**
* 租户id
*/
private String tenantId;
/**
* 项目id
*/
private Long projectId;
/**
* 项目名称
*/
private String projectName;
}
...@@ -75,6 +75,7 @@ public class UserActionListener implements SaTokenListener { ...@@ -75,6 +75,7 @@ public class UserActionListener implements SaTokenListener {
logininforEvent.setTenantId(tenantId); logininforEvent.setTenantId(tenantId);
logininforEvent.setUsername(username); logininforEvent.setUsername(username);
logininforEvent.setStatus(Constants.LOGIN_SUCCESS); logininforEvent.setStatus(Constants.LOGIN_SUCCESS);
logininforEvent.setUserType((String) loginModel.getExtra(LoginHelper.USER_TYPE));
logininforEvent.setMessage(MessageUtils.message("user.login.success")); logininforEvent.setMessage(MessageUtils.message("user.login.success"));
SpringUtils.context().publishEvent(logininforEvent); SpringUtils.context().publishEvent(logininforEvent);
// 更新登录信息 // 更新登录信息
......
...@@ -126,7 +126,7 @@ public class SysLoginService { ...@@ -126,7 +126,7 @@ public class SysLoginService {
// 超级管理员 登出清除动态租户 // 超级管理员 登出清除动态租户
TenantHelper.clearDynamic(); TenantHelper.clearDynamic();
} }
recordLogininfor(loginUser.getTenantId(), loginUser.getUsername(), Constants.LOGOUT, MessageUtils.message("user.logout.success")); recordLogininfor(loginUser.getTenantId(), loginUser.getUsername(), Constants.LOGOUT, MessageUtils.message("user.logout.success"), loginUser.getUserType());
} catch (NotLoginException ignored) { } catch (NotLoginException ignored) {
} finally { } finally {
try { try {
...@@ -152,7 +152,7 @@ public class SysLoginService { ...@@ -152,7 +152,7 @@ public class SysLoginService {
boolean captchaEnabled = captchaProperties.getEnabled(); boolean captchaEnabled = captchaProperties.getEnabled();
// 验证码开关 // 验证码开关
if (captchaEnabled) { if (captchaEnabled) {
validateCaptcha(tenantId, username, registerBody.getCode(), registerBody.getUuid()); validateCaptcha(tenantId, username, registerBody.getCode(), registerBody.getUuid(), registerBody.getUserType());
} }
// 注册用户信息 // 注册用户信息
...@@ -178,7 +178,7 @@ public class SysLoginService { ...@@ -178,7 +178,7 @@ public class SysLoginService {
.setSystemUserId(userId) .setSystemUserId(userId)
); );
recordLogininfor(tenantId, username, Constants.REGISTER, MessageUtils.message("user.register.success")); recordLogininfor(tenantId, username, Constants.REGISTER, MessageUtils.message("user.register.success"), userType);
} }
/** /**
...@@ -187,17 +187,18 @@ public class SysLoginService { ...@@ -187,17 +187,18 @@ public class SysLoginService {
* @param username 用户名 * @param username 用户名
* @param code 验证码 * @param code 验证码
* @param uuid 唯一标识 * @param uuid 唯一标识
* @param userType 用户类型
*/ */
public void validateCaptcha(String tenantId, String username, String code, String uuid) { public void validateCaptcha(String tenantId, String username, String code, String uuid, String userType) {
String verifyKey = GlobalConstants.CAPTCHA_CODE_KEY + StringUtils.blankToDefault(uuid, ""); String verifyKey = GlobalConstants.CAPTCHA_CODE_KEY + StringUtils.blankToDefault(uuid, "");
String captcha = RedisUtils.getCacheObject(verifyKey); String captcha = RedisUtils.getCacheObject(verifyKey);
RedisUtils.deleteObject(verifyKey); RedisUtils.deleteObject(verifyKey);
if (captcha == null) { if (captcha == null) {
recordLogininfor(tenantId, username, Constants.REGISTER, MessageUtils.message("user.jcaptcha.expire")); recordLogininfor(tenantId, username, Constants.REGISTER, MessageUtils.message("user.jcaptcha.expire"), userType);
throw new CaptchaExpireException(); throw new CaptchaExpireException();
} }
if (!code.equalsIgnoreCase(captcha)) { if (!code.equalsIgnoreCase(captcha)) {
recordLogininfor(tenantId, username, Constants.REGISTER, MessageUtils.message("user.jcaptcha.error")); recordLogininfor(tenantId, username, Constants.REGISTER, MessageUtils.message("user.jcaptcha.error"), userType);
throw new CaptchaException(); throw new CaptchaException();
} }
} }
...@@ -210,20 +211,21 @@ public class SysLoginService { ...@@ -210,20 +211,21 @@ public class SysLoginService {
* @param message 消息内容 * @param message 消息内容
* @return * @return
*/ */
public void recordLogininfor(String tenantId, String username, String status, String message) { public void recordLogininfor(String tenantId, String username, String status, String message, String userType) {
// 封装对象 // 封装对象
LogininforEvent logininforEvent = new LogininforEvent(); LogininforEvent logininforEvent = new LogininforEvent();
logininforEvent.setTenantId(tenantId); logininforEvent.setTenantId(tenantId);
logininforEvent.setUsername(username); logininforEvent.setUsername(username);
logininforEvent.setStatus(status); logininforEvent.setStatus(status);
logininforEvent.setMessage(message); logininforEvent.setMessage(message);
logininforEvent.setUserType(userType);
SpringUtils.context().publishEvent(logininforEvent); SpringUtils.context().publishEvent(logininforEvent);
} }
/** /**
* 登录校验 * 登录校验
*/ */
public void checkLogin(LoginType loginType, String tenantId, String username, Supplier<Boolean> supplier) { public void checkLogin(LoginType loginType, String tenantId, String userType, String username, Supplier<Boolean> supplier) {
String errorKey = CacheConstants.PWD_ERR_CNT_KEY + username; String errorKey = CacheConstants.PWD_ERR_CNT_KEY + username;
String loginFail = Constants.LOGIN_FAIL; String loginFail = Constants.LOGIN_FAIL;
Integer maxRetryCount = userPasswordProperties.getMaxRetryCount(); Integer maxRetryCount = userPasswordProperties.getMaxRetryCount();
...@@ -233,7 +235,7 @@ public class SysLoginService { ...@@ -233,7 +235,7 @@ public class SysLoginService {
int errorNumber = ObjectUtil.defaultIfNull(RedisUtils.getCacheObject(errorKey), 0); int errorNumber = ObjectUtil.defaultIfNull(RedisUtils.getCacheObject(errorKey), 0);
// 锁定时间内登录 则踢出 // 锁定时间内登录 则踢出
if (errorNumber >= maxRetryCount) { if (errorNumber >= maxRetryCount) {
recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitExceed(), maxRetryCount, lockTime)); recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitExceed(), maxRetryCount, lockTime), userType);
throw new UserException(loginType.getRetryLimitExceed(), maxRetryCount, lockTime); throw new UserException(loginType.getRetryLimitExceed(), maxRetryCount, lockTime);
} }
...@@ -243,11 +245,11 @@ public class SysLoginService { ...@@ -243,11 +245,11 @@ public class SysLoginService {
RedisUtils.setCacheObject(errorKey, errorNumber, Duration.ofMinutes(lockTime)); RedisUtils.setCacheObject(errorKey, errorNumber, Duration.ofMinutes(lockTime));
// 达到规定错误次数 则锁定登录 // 达到规定错误次数 则锁定登录
if (errorNumber >= maxRetryCount) { if (errorNumber >= maxRetryCount) {
recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitExceed(), maxRetryCount, lockTime)); recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitExceed(), maxRetryCount, lockTime), userType);
throw new UserException(loginType.getRetryLimitExceed(), maxRetryCount, lockTime); throw new UserException(loginType.getRetryLimitExceed(), maxRetryCount, lockTime);
} else { } else {
// 未达到规定错误次数 // 未达到规定错误次数
recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitCount(), errorNumber)); recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitCount(), errorNumber), userType);
throw new UserException(loginType.getRetryLimitCount(), errorNumber); throw new UserException(loginType.getRetryLimitCount(), errorNumber);
} }
} }
......
...@@ -47,9 +47,10 @@ public class EmailAuthStrategy implements IAuthStrategy { ...@@ -47,9 +47,10 @@ public class EmailAuthStrategy implements IAuthStrategy {
String tenantId = loginBody.getTenantId(); String tenantId = loginBody.getTenantId();
String email = loginBody.getEmail(); String email = loginBody.getEmail();
String emailCode = loginBody.getEmailCode(); String emailCode = loginBody.getEmailCode();
String userType = loginBody.getUserType();
LoginUser loginUser = TenantHelper.dynamic(tenantId, () -> { LoginUser loginUser = TenantHelper.dynamic(tenantId, () -> {
LoginUser user = remoteUserService.getUserInfoByEmail(email, tenantId); LoginUser user = remoteUserService.getUserInfoByEmail(email, tenantId);
loginService.checkLogin(LoginType.EMAIL, tenantId, user.getUsername(), () -> !validateEmailCode(tenantId, email, emailCode)); loginService.checkLogin(LoginType.EMAIL, tenantId, userType, user.getUsername(), () -> !validateEmailCode(tenantId, email, emailCode, userType));
return user; return user;
}); });
loginUser.setClientKey(client.getClientKey()); loginUser.setClientKey(client.getClientKey());
...@@ -74,10 +75,10 @@ public class EmailAuthStrategy implements IAuthStrategy { ...@@ -74,10 +75,10 @@ public class EmailAuthStrategy implements IAuthStrategy {
/** /**
* 校验邮箱验证码 * 校验邮箱验证码
*/ */
private boolean validateEmailCode(String tenantId, String email, String emailCode) { private boolean validateEmailCode(String tenantId, String email, String emailCode, String userType) {
String code = RedisUtils.getCacheObject(GlobalConstants.CAPTCHA_CODE_KEY + email); String code = RedisUtils.getCacheObject(GlobalConstants.CAPTCHA_CODE_KEY + email);
if (StringUtils.isBlank(code)) { if (StringUtils.isBlank(code)) {
loginService.recordLogininfor(tenantId, email, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")); loginService.recordLogininfor(tenantId, email, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"), userType);
throw new CaptchaExpireException(); throw new CaptchaExpireException();
} }
return code.equals(emailCode); return code.equals(emailCode);
......
...@@ -14,7 +14,6 @@ import org.dromara.auth.service.SysLoginService; ...@@ -14,7 +14,6 @@ import org.dromara.auth.service.SysLoginService;
import org.dromara.common.core.constant.Constants; import org.dromara.common.core.constant.Constants;
import org.dromara.common.core.constant.GlobalConstants; import org.dromara.common.core.constant.GlobalConstants;
import org.dromara.common.core.enums.LoginType; import org.dromara.common.core.enums.LoginType;
import org.dromara.common.core.enums.UserType;
import org.dromara.common.core.exception.user.CaptchaException; import org.dromara.common.core.exception.user.CaptchaException;
import org.dromara.common.core.exception.user.CaptchaExpireException; import org.dromara.common.core.exception.user.CaptchaExpireException;
import org.dromara.common.core.utils.MessageUtils; import org.dromara.common.core.utils.MessageUtils;
...@@ -62,14 +61,15 @@ public class PasswordAuthStrategy implements IAuthStrategy { ...@@ -62,14 +61,15 @@ public class PasswordAuthStrategy implements IAuthStrategy {
String password = loginBody.getPassword(); String password = loginBody.getPassword();
String code = loginBody.getCode(); String code = loginBody.getCode();
String uuid = loginBody.getUuid(); String uuid = loginBody.getUuid();
String userType = loginBody.getUserType();
// 验证码开关 // 验证码开关
if (captchaProperties.getEnabled()) { if (captchaProperties.getEnabled()) {
validateCaptcha(tenantId, username, code, uuid); validateCaptcha(tenantId, username, code, uuid, userType);
} }
LoginUser loginUser = TenantHelper.dynamic(tenantId, () -> { LoginUser loginUser = TenantHelper.dynamic(tenantId, () -> {
LoginUser user = remoteUserService.getUserInfo(username, null, tenantId, UserType.SYS_USER.getUserType()); LoginUser user = remoteUserService.getUserInfo(username, null, tenantId, loginBody.getUserType());
loginService.checkLogin(LoginType.PASSWORD, tenantId, username, () -> !BCrypt.checkpw(password, user.getPassword())); loginService.checkLogin(LoginType.PASSWORD, tenantId, userType, username, () -> !BCrypt.checkpw(password, user.getPassword()));
return user; return user;
}); });
loginUser.setClientKey(client.getClientKey()); loginUser.setClientKey(client.getClientKey());
...@@ -80,7 +80,7 @@ public class PasswordAuthStrategy implements IAuthStrategy { ...@@ -80,7 +80,7 @@ public class PasswordAuthStrategy implements IAuthStrategy {
// 例如: 后台用户30分钟过期 app用户1天过期 // 例如: 后台用户30分钟过期 app用户1天过期
model.setTimeout(client.getTimeout()); model.setTimeout(client.getTimeout());
model.setActiveTimeout(client.getActiveTimeout()); model.setActiveTimeout(client.getActiveTimeout());
RemoteUser ru = remoteServerService.getUserByPhone(loginUser.getTenantId(), loginUser.getPhonenumber()); RemoteUser ru = remoteServerService.getUserByPhone(loginUser.getTenantId(), loginBody.getUserType(), loginUser.getPhonenumber());
model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId()); model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId());
model.setExtra(LoginHelper.YS_USER_ID, Optional.ofNullable(ru).map(RemoteUser::getUserNo).orElse(null)); model.setExtra(LoginHelper.YS_USER_ID, Optional.ofNullable(ru).map(RemoteUser::getUserNo).orElse(null));
// 生成token // 生成token
...@@ -100,16 +100,16 @@ public class PasswordAuthStrategy implements IAuthStrategy { ...@@ -100,16 +100,16 @@ public class PasswordAuthStrategy implements IAuthStrategy {
* @param code 验证码 * @param code 验证码
* @param uuid 唯一标识 * @param uuid 唯一标识
*/ */
private void validateCaptcha(String tenantId, String username, String code, String uuid) { private void validateCaptcha(String tenantId, String username, String code, String uuid, String userType) {
String verifyKey = GlobalConstants.CAPTCHA_CODE_KEY + StringUtils.blankToDefault(uuid, ""); String verifyKey = GlobalConstants.CAPTCHA_CODE_KEY + StringUtils.blankToDefault(uuid, "");
String captcha = RedisUtils.getCacheObject(verifyKey); String captcha = RedisUtils.getCacheObject(verifyKey);
RedisUtils.deleteObject(verifyKey); RedisUtils.deleteObject(verifyKey);
if (captcha == null) { if (captcha == null) {
loginService.recordLogininfor(tenantId, username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")); loginService.recordLogininfor(tenantId, username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"), userType);
throw new CaptchaExpireException(); throw new CaptchaExpireException();
} }
if (!code.equalsIgnoreCase(captcha)) { if (!code.equalsIgnoreCase(captcha)) {
loginService.recordLogininfor(tenantId, username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error")); loginService.recordLogininfor(tenantId, username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error"), userType);
throw new CaptchaException(); throw new CaptchaException();
} }
} }
......
...@@ -47,9 +47,10 @@ public class SmsAuthStrategy implements IAuthStrategy { ...@@ -47,9 +47,10 @@ public class SmsAuthStrategy implements IAuthStrategy {
String tenantId = loginBody.getTenantId(); String tenantId = loginBody.getTenantId();
String phonenumber = loginBody.getPhonenumber(); String phonenumber = loginBody.getPhonenumber();
String smsCode = loginBody.getSmsCode(); String smsCode = loginBody.getSmsCode();
String userType = loginBody.getUserType();
LoginUser loginUser = TenantHelper.dynamic(tenantId, () -> { LoginUser loginUser = TenantHelper.dynamic(tenantId, () -> {
LoginUser user = remoteUserService.getUserInfoByPhonenumber(phonenumber, tenantId); LoginUser user = remoteUserService.getUserInfoByPhonenumber(phonenumber, tenantId);
loginService.checkLogin(LoginType.SMS, tenantId, user.getUsername(), () -> !validateSmsCode(tenantId, phonenumber, smsCode)); loginService.checkLogin(LoginType.SMS, tenantId, userType, user.getUsername(), () -> !validateSmsCode(tenantId, phonenumber, smsCode, userType));
return user; return user;
}); });
loginUser.setClientKey(client.getClientKey()); loginUser.setClientKey(client.getClientKey());
...@@ -74,10 +75,10 @@ public class SmsAuthStrategy implements IAuthStrategy { ...@@ -74,10 +75,10 @@ public class SmsAuthStrategy implements IAuthStrategy {
/** /**
* 校验短信验证码 * 校验短信验证码
*/ */
private boolean validateSmsCode(String tenantId, String phonenumber, String smsCode) { private boolean validateSmsCode(String tenantId, String phonenumber, String smsCode, String userType) {
String code = RedisUtils.getCacheObject(GlobalConstants.CAPTCHA_CODE_KEY + phonenumber); String code = RedisUtils.getCacheObject(GlobalConstants.CAPTCHA_CODE_KEY + phonenumber);
if (StringUtils.isBlank(code)) { if (StringUtils.isBlank(code)) {
loginService.recordLogininfor(tenantId, phonenumber, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")); loginService.recordLogininfor(tenantId, phonenumber, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"), userType);
throw new CaptchaExpireException(); throw new CaptchaExpireException();
} }
return code.equals(smsCode); return code.equals(smsCode);
......
...@@ -70,13 +70,14 @@ public class XcxAuthStrategy extends AbstractMallStrategy implements IAuthStrate ...@@ -70,13 +70,14 @@ public class XcxAuthStrategy extends AbstractMallStrategy implements IAuthStrate
remoteUserService.registerWxUserInfo(new RemoteWxUserBo() remoteUserService.registerWxUserInfo(new RemoteWxUserBo()
.setTenantId(loginBody.getTenantId()) .setTenantId(loginBody.getTenantId())
.setOpenId(openid) .setOpenId(openid)
.setUserType(loginBody.getUserType())
.setPhonenumber(phone)); .setPhonenumber(phone));
} }
//校验手机号 //校验手机号
validatePhone(loginBody.getPhone(), phone); validatePhone(loginBody.getPhone(), phone);
XcxLoginUser loginUser = remoteUserService.getUserInfoByOpenid(openid, phone, loginBody.getTenantId()); XcxLoginUser loginUser = remoteUserService.getUserInfoByOpenid(openid, phone, loginBody.getUserType(), loginBody.getTenantId());
// 用户不存在 返回 openid // 用户不存在 返回 openid
if (loginUser == null) { if (loginUser == null) {
...@@ -103,7 +104,7 @@ public class XcxAuthStrategy extends AbstractMallStrategy implements IAuthStrate ...@@ -103,7 +104,7 @@ public class XcxAuthStrategy extends AbstractMallStrategy implements IAuthStrate
model.setTimeout(client.getTimeout()); model.setTimeout(client.getTimeout());
model.setActiveTimeout(client.getActiveTimeout()); model.setActiveTimeout(client.getActiveTimeout());
RemoteUser ru = remoteServerService.getUserByPhone(loginUser.getTenantId(), loginUser.getPhone()); RemoteUser ru = remoteServerService.getUserByPhone(loginUser.getTenantId(), loginUser.getUserType(), loginUser.getPhone());
model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId()); model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId());
model.setExtra(LoginHelper.YS_USER_ID, Optional.ofNullable(ru).map(RemoteUser::getUserNo).orElse(null)); model.setExtra(LoginHelper.YS_USER_ID, Optional.ofNullable(ru).map(RemoteUser::getUserNo).orElse(null));
model.setExtra(LoginHelper.OPEN_ID, openid); model.setExtra(LoginHelper.OPEN_ID, openid);
......
...@@ -55,12 +55,13 @@ public class XcxPhoneAuthStrategy extends AbstractMallStrategy implements IAuthS ...@@ -55,12 +55,13 @@ public class XcxPhoneAuthStrategy extends AbstractMallStrategy implements IAuthS
remoteUserService.registerWxUserInfo(new RemoteWxUserBo() remoteUserService.registerWxUserInfo(new RemoteWxUserBo()
.setTenantId(loginBody.getTenantId()) .setTenantId(loginBody.getTenantId())
.setOpenId(loginBody.getOpenId()) .setOpenId(loginBody.getOpenId())
.setUserType(loginBody.getUserType())
.setPhonenumber(phone)); .setPhonenumber(phone));
//校验手机号 //校验手机号
validatePhone(loginBody.getPhone(), phone); validatePhone(loginBody.getPhone(), phone);
XcxLoginUser loginUser = remoteUserService.getUserInfoByOpenid(loginBody.getOpenId(), phone, loginBody.getTenantId()); XcxLoginUser loginUser = remoteUserService.getUserInfoByOpenid(loginBody.getOpenId(), phone, loginBody.getUserType(), loginBody.getTenantId());
if (loginUser == null) { if (loginUser == null) {
throw new RuntimeException("用户不存在"); throw new RuntimeException("用户不存在");
...@@ -78,7 +79,7 @@ public class XcxPhoneAuthStrategy extends AbstractMallStrategy implements IAuthS ...@@ -78,7 +79,7 @@ public class XcxPhoneAuthStrategy extends AbstractMallStrategy implements IAuthS
// 例如: 后台用户30分钟过期 app用户1天过期 // 例如: 后台用户30分钟过期 app用户1天过期
model.setTimeout(client.getTimeout()); model.setTimeout(client.getTimeout());
model.setActiveTimeout(client.getActiveTimeout()); model.setActiveTimeout(client.getActiveTimeout());
RemoteUser ru = remoteServerService.getUserByPhone(loginUser.getTenantId(), loginUser.getPhone()); RemoteUser ru = remoteServerService.getUserByPhone(loginUser.getTenantId(), loginUser.getUserType(), loginUser.getPhone());
model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId()); model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId());
model.setExtra(LoginHelper.YS_USER_ID, Optional.ofNullable(ru).map(RemoteUser::getUserNo).orElse(null)); model.setExtra(LoginHelper.YS_USER_ID, Optional.ofNullable(ru).map(RemoteUser::getUserNo).orElse(null));
model.setExtra(LoginHelper.OPEN_ID, loginBody.getOpenId()); model.setExtra(LoginHelper.OPEN_ID, loginBody.getOpenId());
......
...@@ -52,6 +52,7 @@ ...@@ -52,6 +52,7 @@
<module>ruoyi-common-mall</module> <module>ruoyi-common-mall</module>
<module>ruoyi-common-yudao-mybatis</module> <module>ruoyi-common-yudao-mybatis</module>
<module>ruoyi-common-51weishi</module> <module>ruoyi-common-51weishi</module>
<module>ruoyi-common-hotel-zggl</module>
</modules> </modules>
<artifactId>ruoyi-common</artifactId> <artifactId>ruoyi-common</artifactId>
......
...@@ -31,7 +31,7 @@ public class WeishiServiceImpl implements WeishiService { ...@@ -31,7 +31,7 @@ public class WeishiServiceImpl implements WeishiService {
@Override @Override
public AuthResponse authorize(AuthRequest request) { public AuthResponse authorize(AuthRequest request) {
ApiHttpResponse res = Api.v1(RequestMethodEnum.POST, ApiHttpResponse res = Api.v1(RequestMethodEnum.POST,
DomainEnum.PROD.getDomain(), DomainEnum.TEST.getDomain(),
AuthApiEnum.AUTHORIZE.getUrl(), AuthApiEnum.AUTHORIZE.getUrl(),
null, null,
JSON.toJSONString(request)); JSON.toJSONString(request));
...@@ -44,7 +44,7 @@ public class WeishiServiceImpl implements WeishiService { ...@@ -44,7 +44,7 @@ public class WeishiServiceImpl implements WeishiService {
@Override @Override
public MenusResponse menus(String token) { public MenusResponse menus(String token) {
ApiHttpResponse res = Api.v1(RequestMethodEnum.POST, ApiHttpResponse res = Api.v1(RequestMethodEnum.POST,
DomainEnum.PROD.getDomain(), DomainEnum.TEST.getDomain(),
AuthApiEnum.MENUS.getUrl(), AuthApiEnum.MENUS.getUrl(),
token, token,
null); null);
...@@ -57,7 +57,7 @@ public class WeishiServiceImpl implements WeishiService { ...@@ -57,7 +57,7 @@ public class WeishiServiceImpl implements WeishiService {
@Override @Override
public ApplyResponse insureApply(String token, ApplyRequest request) { public ApplyResponse insureApply(String token, ApplyRequest request) {
ApplyResponse res = Api.v1(RequestMethodEnum.POST, ApplyResponse res = Api.v1(RequestMethodEnum.POST,
DomainEnum.PROD.getDomain(), DomainEnum.TEST.getDomain(),
InsureApiEnum.APPLY.getUrl(), InsureApiEnum.APPLY.getUrl(),
token, token,
JSON.toJSONString(request), JSON.toJSONString(request),
...@@ -71,7 +71,7 @@ public class WeishiServiceImpl implements WeishiService { ...@@ -71,7 +71,7 @@ public class WeishiServiceImpl implements WeishiService {
@Override @Override
public ProposalResponse insureProposal(String token, ProposalRequest request) { public ProposalResponse insureProposal(String token, ProposalRequest request) {
ProposalResponse res = Api.v1(RequestMethodEnum.POST, ProposalResponse res = Api.v1(RequestMethodEnum.POST,
DomainEnum.PROD.getDomain(), DomainEnum.TEST.getDomain(),
InsureApiEnum.PROPOSAL.getUrl(), InsureApiEnum.PROPOSAL.getUrl(),
token, token,
JSON.toJSONString(request), JSON.toJSONString(request),
...@@ -88,7 +88,7 @@ public class WeishiServiceImpl implements WeishiService { ...@@ -88,7 +88,7 @@ public class WeishiServiceImpl implements WeishiService {
.put("OrderNum", orderNum) .put("OrderNum", orderNum)
.build(); .build();
IssueResponse res = Api.v1(RequestMethodEnum.POST, IssueResponse res = Api.v1(RequestMethodEnum.POST,
DomainEnum.PROD.getDomain(), DomainEnum.TEST.getDomain(),
StrUtil.format(InsureApiEnum.ISSUE.getUrl(), map), StrUtil.format(InsureApiEnum.ISSUE.getUrl(), map),
token, token,
null, null,
...@@ -105,7 +105,7 @@ public class WeishiServiceImpl implements WeishiService { ...@@ -105,7 +105,7 @@ public class WeishiServiceImpl implements WeishiService {
.put("orderId", orderId) .put("orderId", orderId)
.build(); .build();
IssueResponse res = Api.v1(RequestMethodEnum.POST, IssueResponse res = Api.v1(RequestMethodEnum.POST,
DomainEnum.PROD.getDomain(), DomainEnum.TEST.getDomain(),
StrUtil.format(InsureApiEnum.ABANDON.getUrl(), map), StrUtil.format(InsureApiEnum.ABANDON.getUrl(), map),
token, token,
null, null,
...@@ -121,7 +121,7 @@ public class WeishiServiceImpl implements WeishiService { ...@@ -121,7 +121,7 @@ public class WeishiServiceImpl implements WeishiService {
.put("orderId", orderId) .put("orderId", orderId)
.build(); .build();
ApiHttpResponse res = Api.v1(RequestMethodEnum.GET, ApiHttpResponse res = Api.v1(RequestMethodEnum.GET,
DomainEnum.PROD.getDomain(), DomainEnum.TEST.getDomain(),
StrUtil.format(InsureApiEnum.DETAIL.getUrl(), map), StrUtil.format(InsureApiEnum.DETAIL.getUrl(), map),
token, token,
null); null);
...@@ -137,7 +137,7 @@ public class WeishiServiceImpl implements WeishiService { ...@@ -137,7 +137,7 @@ public class WeishiServiceImpl implements WeishiService {
.put("orderNum", orderNum) .put("orderNum", orderNum)
.build(); .build();
return Api.v1(RequestMethodEnum.DOWNLOAD, return Api.v1(RequestMethodEnum.DOWNLOAD,
DomainEnum.PROD.getDomain(), DomainEnum.TEST.getDomain(),
StrUtil.format(InsureApiEnum.DOWNLOAD.getUrl(), map), StrUtil.format(InsureApiEnum.DOWNLOAD.getUrl(), map),
token, token,
null, null,
...@@ -151,7 +151,7 @@ public class WeishiServiceImpl implements WeishiService { ...@@ -151,7 +151,7 @@ public class WeishiServiceImpl implements WeishiService {
.put("orderNum", orderNum) .put("orderNum", orderNum)
.build(); .build();
ApiHttpResponse res = Api.v1(RequestMethodEnum.POST, ApiHttpResponse res = Api.v1(RequestMethodEnum.POST,
DomainEnum.PROD.getDomain(), DomainEnum.TEST.getDomain(),
StrUtil.format(InsureApiEnum.CANCEL.getUrl(), map), StrUtil.format(InsureApiEnum.CANCEL.getUrl(), map),
token, token,
null); null);
...@@ -166,7 +166,7 @@ public class WeishiServiceImpl implements WeishiService { ...@@ -166,7 +166,7 @@ public class WeishiServiceImpl implements WeishiService {
.put("policyNum", policyNum) .put("policyNum", policyNum)
.build(); .build();
ApiHttpResponse res = Api.v1(RequestMethodEnum.POST, ApiHttpResponse res = Api.v1(RequestMethodEnum.POST,
DomainEnum.PROD.getDomain(), DomainEnum.TEST.getDomain(),
StrUtil.format(InsureApiEnum.POLICY_CANCEL.getUrl(), map), StrUtil.format(InsureApiEnum.POLICY_CANCEL.getUrl(), map),
token, token,
null); null);
...@@ -178,7 +178,7 @@ public class WeishiServiceImpl implements WeishiService { ...@@ -178,7 +178,7 @@ public class WeishiServiceImpl implements WeishiService {
@Override @Override
public List<ProductsResponse> productList(String token) { public List<ProductsResponse> productList(String token) {
ApiHttpResponse res = Api.v1(RequestMethodEnum.GET, ApiHttpResponse res = Api.v1(RequestMethodEnum.GET,
DomainEnum.PROD.getDomain(), DomainEnum.TEST.getDomain(),
ProductApiEnum.PRODUCT_LIST.getUrl(), ProductApiEnum.PRODUCT_LIST.getUrl(),
token, token,
null); null);
...@@ -194,7 +194,7 @@ public class WeishiServiceImpl implements WeishiService { ...@@ -194,7 +194,7 @@ public class WeishiServiceImpl implements WeishiService {
.put("productId", productId) .put("productId", productId)
.build(); .build();
ApiHttpResponse res = Api.v1(RequestMethodEnum.GET, ApiHttpResponse res = Api.v1(RequestMethodEnum.GET,
DomainEnum.PROD.getDomain(), DomainEnum.TEST.getDomain(),
StrUtil.format(ProductApiEnum.PRODUCT_DETAIL.getUrl(), map), StrUtil.format(ProductApiEnum.PRODUCT_DETAIL.getUrl(), map),
token, token,
null); null);
...@@ -211,7 +211,7 @@ public class WeishiServiceImpl implements WeishiService { ...@@ -211,7 +211,7 @@ public class WeishiServiceImpl implements WeishiService {
.put("annexTp", annexTp) .put("annexTp", annexTp)
.build(); .build();
ApiHttpResponse res = Api.v1(RequestMethodEnum.GET, ApiHttpResponse res = Api.v1(RequestMethodEnum.GET,
DomainEnum.PROD.getDomain(), DomainEnum.TEST.getDomain(),
StrUtil.format(ProductApiEnum.ANNEX.getUrl(), map), StrUtil.format(ProductApiEnum.ANNEX.getUrl(), map),
token, token,
null); null);
......
...@@ -3,6 +3,7 @@ package org.dromara.common.core.domain.model; ...@@ -3,6 +3,7 @@ package org.dromara.common.core.domain.model;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import org.dromara.common.core.enums.UserType;
/** /**
* 用户登录对象 * 用户登录对象
...@@ -40,4 +41,9 @@ public class LoginBody { ...@@ -40,4 +41,9 @@ public class LoginBody {
*/ */
private String uuid; private String uuid;
/**
* 用户类型
*/
private String userType = UserType.SYS_USER.getUserType();
} }
package org.dromara.common.core.enums; package org.dromara.common.core.enums;
import org.dromara.common.core.utils.StringUtils;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
import org.dromara.common.core.utils.StringUtils;
/** /**
* 设备类型 * 设备类型
...@@ -22,7 +22,12 @@ public enum UserType { ...@@ -22,7 +22,12 @@ public enum UserType {
/** /**
* app端 * app端
*/ */
APP_USER("app_user"); APP_USER("app_user"),
/**
* 项目人员
*/
PROJECT_USER("project_user");
private final String userType; private final String userType;
......
<?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-hotel-zggl</artifactId>
<description>
ruoyi-common-hotel-zgg 酒店-中国国旅对接模块
</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.hotel.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.hotel.base;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.*;
public class PayKit {
/**
* 把所有元素排序
*
* @param params 需要排序并参与字符拼接的参数组
* @return 拼接后字符串
*/
public static String createLinkString(Map<String, Object> params) {
return createLinkString(params, false);
}
/**
* @param params 需要排序并参与字符拼接的参数组
* @param encode 是否进行URLEncoder
* @return 拼接后字符串
*/
public static String createLinkString(Map<String, Object> params, boolean encode) {
return createLinkString(params, "&", encode);
}
/**
* @param params 需要排序并参与字符拼接的参数组
* @param connStr 连接符号
* @param encode 是否进行URLEncoder
* @return 拼接后字符串
*/
public static String createLinkString(Map<String, Object> params, String connStr, boolean encode) {
return createLinkString(params, connStr, encode, false);
}
public static String createLinkString(Map<String, Object> params, String connStr, boolean encode, boolean quotes) {
List<String> keys = new ArrayList<>(params.keySet());
Collections.sort(keys);
StringBuilder content = new StringBuilder();
for (int i = 0; i < keys.size(); i++) {
String key = keys.get(i);
Object value = params.get(key);
// 参数的值为空不参与签名
if (Objects.isNull(value)) {
continue;
}
// 拼接时,不包括最后一个&字符
if (i == keys.size() - 1) {
if (quotes) {
content.append(key).append("=").append('"').append(encode ? urlEncode(value.toString()) : value).append('"');
} else {
content.append(key).append("=").append(encode ? urlEncode(value.toString()) : value);
}
} else {
if (quotes) {
content.append(key).append("=").append('"').append(encode ? urlEncode(value.toString()) : value).append('"').append(connStr);
} else {
content.append(key).append("=").append(encode ? urlEncode(value.toString()) : value).append(connStr);
}
}
}
return content.toString();
}
/**
* URL 编码
*
* @param src 需要编码的字符串
* @return 编码后的字符串
*/
public static String urlEncode(String src) {
return URLEncoder.encode(src, StandardCharsets.UTF_8).replace("+", "%20");
}
}
package org.dromara.common.hotel.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"),
/**
*
*/
DOWNLOAD("GET");
;
private final String method;
RequestMethodEnum(String method) {
this.method = method;
}
@Override
public String toString() {
return this.method;
}
}
package org.dromara.common.hotel.common;
import lombok.Data;
/**
* @author hzh
* @date 2024-10-15
* @desc 响应实体
**/
@Data
public class ApiHttpResponse {
/**
* 说明
*/
private String Message;
/**
* 返回结果状态: 200成功;500错误
*/
private int Code;
/**
* 返回数据
*/
private String Data;
}
package org.dromara.common.hotel.common;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* code返回值
*
* @author wenhe
*/
@Getter
@AllArgsConstructor
public enum Code {
/**
* 成功
*/
SUCCESS(200, "成功");
private final Integer code;
private final String message;
}
package org.dromara.common.hotel.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.hotel.config;
/**
* @author wenhe
*/
public interface UserConfig {
/**
* 用户名
*/
String USERNAME = "testuser";
/**
* 密码
*/
String PASSWORD = "Abc123.";
}
package org.dromara.common.hotel.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.hotel.enums;
/**
* 获取可用域名
*
* @author wenhe
*/
public interface Domain {
/**
* 获取域名
*
* @return 返回域名
*/
String getDomain();
}
package org.dromara.common.hotel.enums;
/**
* 域名枚举
*
* @author wenhe
*/
public enum DomainEnum implements Domain {
/**
* 测试域名
*/
TEST("https://beta.51weishi.com:5005"),
/**
* 生产域名
*/
PROD("https://insure.51weishi.com");
/**
* 域名
*/
private final String domain;
DomainEnum(String domain) {
this.domain = domain;
}
@Override
public String getDomain() {
return domain;
}
@Override
public String toString() {
return domain;
}
}
package org.dromara.common.hotel.enums.auth;
import org.dromara.common.hotel.enums.ApiEnum;
/**
* 认证接口
*
* @author wenhe
*/
public enum AuthApiEnum implements ApiEnum {
/**
* 获取AccessToken接口
*/
AUTHORIZE("/api/v2/Authentication/GetToken", "获取AccessToken接口");
/**
* 接口URL
*/
private final String url;
/**
* 接口描述
*/
private final String desc;
AuthApiEnum(String url, String desc) {
this.url = url;
this.desc = desc;
}
/**
* 获取枚举URL
*
* @return 枚举编码
*/
@Override
public String getUrl() {
return url;
}
/**
* 获取详细的描述信息
*
* @return 描述信息
*/
@Override
public String getDesc() {
return desc;
}
@Override
public String toString() {
return url;
}
}
package org.dromara.common.hotel.enums.hotel;
import org.dromara.common.hotel.enums.ApiEnum;
/**
* 酒店接口
*
* @author wenhe
*/
public enum HotelApiEnum implements ApiEnum {
/**
* 酒店详细信息
*/
DETAIL("/api/v2/HotelProduct/GetHotelInfo", "获取多个酒店详细信息"),
/**
* 酒店Id列表
*/
ID_LIST("api/v2/HotelProduct/GetHotelIdList", "获取可用的酒店Id的列表,后续可以根据酒店ID通过 1.酒店详细信息接口 获取酒店详细信息"),
/**
* 房型列表
*/
ROOM_INFO("/api/v2/HotelProduct/GetRoomInfo", "获取酒店的所有房型"),
/**
* 报价
*/
GET_PRICE("/api/v2/HotelProduct/GetPrice", "获取单个酒店报价"),
;
/**
* 接口URL
*/
private final String url;
/**
* 接口描述
*/
private final String desc;
HotelApiEnum(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.hotel.enums.product;
import org.dromara.common.hotel.enums.ApiEnum;
/**
* 产品接口
*
* @author wenhe
*/
public enum OrderApiEnum implements ApiEnum {
/**
* 下单
*/
ORDER_CREATE("/api/v2/HotelOrder/Booking", "下单接口"),
/**
* 订单详情
*/
ORDER_DETAIL("/api/v2/HotelOrder/OrderQuery", "获取订单详情"),
/**
* 申请取消订单
*/
ORDER_CANCEL("/api/v2/HotelOrder/OrderCancel", "申请取消订单接口,申请提交成功后,实际取消结果以接口-2.订单详情查询结果为准"),;
/**
* 接口URL
*/
private final String url;
/**
* 接口描述
*/
private final String desc;
OrderApiEnum(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.hotel.exception;
import java.io.Serial;
/**
* @author hzh
* @date 2025-05-12
**/
public class HotelException extends RuntimeException{
@Serial
private static final long serialVersionUID = 1L;
public HotelException(String message) {
super(message);
}
}
/**
* <p>IJPay 让支付触手可及,封装了微信支付、支付宝支付、银联支付常用的支付方式以及各种常用的接口。</p>
*
* <p>不依赖任何第三方 mvc 框架,仅仅作为工具使用简单快速完成支付模块的开发,可轻松嵌入到任何系统里。 </p>
*
* <p>IJPay 交流群: 723992875、864988890</p>
*
* <p>Node.js 版: <a href="https://gitee.com/javen205/TNWX">https://gitee.com/javen205/TNWX</a></p>
*
* <p>Model 公用方法</p>
*
* @author Javen
*/
package org.dromara.common.hotel.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.hotel.model.req.auth;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
public class AuthRequest {
/**
* Wid
*/
private String Wid;
/**
* key
*/
private String ApiKey;
}
package org.dromara.common.hotel.model.req.hotel;
import lombok.Data;
import java.util.List;
/**
* 酒店详情请求参数封装类
* @author wenhe
*/
@Data
public class HotelDetailRequest {
/**
* 酒店ID集合(可选)
*/
private List<String> HotelIds;
/**
* CN:中国区域内酒店, 其他值:非中国区域内酒店(可选)
*/
private String SupplyArea = "";
/**
* 当前页码(可选)
*/
private int PageIndex = 1;
/**
* 每页显示记录数(可选)
*/
private int PageSize = 100;
}
package org.dromara.common.hotel.model.req.hotel;
import lombok.Data;
/**
* 酒店id集合请求参数封装类
*
* @author wenhe
*/
@Data
public class HotelIdListRequest {
/**
* CN:中国区域内酒店, 其他值:非中国区域内酒店(可选)
*/
private String SupplyArea = "";
/**
* 第一次调用传值0,后续调用使用前一次调用返回的
* 最大酒店Id,当返回的结果集的酒店Id数量小于
* PageSize,说明已经获取了所有可用的酒店ID.(必选)
*/
private String LastMaxId = "0";
/**
* 返回酒店Id的数量(必选)
*/
private Integer PageSize = 100;
}
package org.dromara.common.hotel.model.req.hotel;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.List;
/**
* 酒店价格查询请求参数类
* 用于封装调用酒店价格查询接口所需的各项参数,结合 Lombok 简化代码,自动生成 getter、setter、toString 等方法
*/
@Data
public class HotelPriceRequest {
/**
* 酒店编号(必选)
*/
private String HotelId;
/**
* 价格计划编号(可选)
*/
private String RatePlanId;
/**
* 入住日期(必选)
*/
private LocalDateTime CheckInDate;
/**
* 离店日期(必选)
*/
private LocalDateTime CheckOutDate;
/**
* 间数(必选)
*/
private Integer RoomCount;
/**
* 成人数(必选)
* 注意:每间房的成人数,不是所有房间的总成人数
*/
private Integer AdultCount;
/**
* 儿童数(可选,默认值 0)
* 注意:每间房的儿童数,不是所有房间的总儿童数
*/
private Integer ChildCount = 0;
/**
* 儿童年龄(可选)
* 注意:每间房儿童的年龄列表,不是所有房间儿童年龄的汇总,需与房间维度的儿童数对应
*/
private List<Integer> ChildAges;
/**
* 客人国籍(可选)
* 格式要求:2位国家 ISO 码,如 "CN"(中国)、"US"(美国)等
* 规则说明:报价、验价、下单流程中该值必须保持一致
*/
private String CountryCode;
}
package org.dromara.common.hotel.model.req.hotel;
import lombok.Data;
import java.util.List;
/**
* 房型列表请求参数封装类
* @author wenhe
*/
@Data
public class HotelRoomInfoRequest {
/**
* 酒店Id集合(必选)
*/
private List<String> HotelIds;
}
package org.dromara.common.hotel.model.req.order;
import lombok.Data;
/**
* 订单取消请求参数封装类
*
* @author wenhe
*/
@Data
public class OrderCancelRequest {
/**
* 订单号(必选)
*/
private Long OrderId;
}
package org.dromara.common.hotel.model.req.order;
import lombok.Data;
/**
* 订单详情查询请求参数实体类
* 规则:OrderId 和 WholesalerOrderId 必选其一,若两者都填则 OrderId 优先
*
* @author wenhe
*/
@Data
public class OrderDetailRequest {
/**
* 订单号,OrderId与WholesalerOrderId必填写 (可选)
* 一个,两者都填写则OrderId优先
*/
private Long OrderId;
/**
* 分销商订单号,OrderId与WholesalerOrderId (可选)
* 必填一个,两者都填写则OrderId优先
*/
private String WholesalerOrderId;
}
package org.dromara.common.hotel.model.req.order;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
/**
* 订单请求参数封装类
*
* @author wenhe
*/
@Data
public class OrderRequest {
/**
* 下单校验码,入参RatePlanId不为空时返(必选)
* 回该值,下单需要使用该值
*/
private String RateKey;
/**
* 酒店编号(必选)
*/
private String HotelId;
/**
* 价格计划编号(必选)
*/
private String RatePlanId;
/**
* 入住日期(必选)
*/
private LocalDateTime CheckInDate;
/**
* 离店日期(必选)
*/
private LocalDateTime CheckOutDate;
/**
* 间数(必选)
*/
private Integer RoomCount;
/**
* 总金额(必选)
*/
private BigDecimal TotalPrice;
/**
* 联系人名字(必选)
*/
private String ContactFirstName;
/**
* 联系人姓氏(必选)
*/
private String ContactLastName;
/**
* 联系人电话(必选)
*/
private String ContactMobile;
/**
* 特殊要求备注(必选)
*/
private String NoteToHotel;
/**
* 分销渠道订单号(必选)
*/
private String WholesalerOrderId;
/**
* 每日价格集合(必选)
*/
private List<PriceListInfo> PriceList;
/**
* 支付方式(必选)
* 说明:枚举值,1. 预授权 2. 余额支付(具体以接口约定为准,需与实际支付逻辑匹配)
*/
private Integer PayType;
/**
* 客人国籍(2位国家 ISO 码)(可选)
* 说明:报价、验价、下单需保持一致,示例:CN(中国)、US(美国)等
*/
private String CountryCode;
/**
* 到店自付发票金额(可选)
*/
private BigDecimal InvoicePrice;
/**
* 入住人信息合集(必选)
*/
private List<RoomListInfo> RoomList;
@Data
public static class PriceListInfo {
/**
* 入住日期
*/
private LocalDateTime Date;
/**
* 价格(每天每间价格)
*/
private BigDecimal Price;
}
@Data
public static class RoomListInfo {
/**
* 成人数
*/
private Integer AdultCount;
/**
* 成人姓名集合
*/
private List<AdultListInfo> AdultList;
/**
* 儿童人数
*/
private int ChildrenCount;
/**
* 儿童姓名集合
*/
private List<ChildrenListInfo> ChildrenList;
}
@Data
public static class AdultListInfo {
/**
* 入住人名字
*/
private String FirstName;
/**
* 入住人姓氏
*/
private String LastName;
}
@Data
public static class ChildrenListInfo {
/**
* 入住人名字
*/
private String FirstName;
/**
* 入住人姓氏
*/
private String LastName;
/**
* 年龄
*/
private Integer Age;
}
}
package org.dromara.common.hotel.model.res.auth;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class AuthResponse {
/**
* 说明
*/
private String Message;
/**
* 返回结果状态: 200成功;500错误
*/
private Integer Code;
/**
* token
*/
private String Token;
}
package org.dromara.common.hotel.model.res.hotel;
import lombok.Data;
import java.util.List;
/**
* 酒店详情响应类,用于封装酒店详情查询接口返回的数据结构
* @author wenhe
*/
@Data
public class HotelDetailResponse {
/**
* 响应状态码,200表示成功,500表示错误
*/
private int Code;
/**
* 说明
*/
private String Message;
/**
* 产品集合
*/
private List<Hotel> HotelList;
/**
* 单个酒店的详细信息类,对应接口返回中酒店的各项属性
*/
@Data
public static class Hotel {
/**
* 酒店编号
*/
private String HotelId;
/**
* 酒店中文名称
*/
private String HotelNameCN;
/**
* 酒店英文名称
*/
private String HotelNameEN;
/**
* 经度
*/
private String Longitude;
/**
* 纬度
*/
private String Latitude;
/**
* 经纬度类型,可选值为 gaode(高德)、google(谷歌)、baidu(百度)、other(其他)
*/
private String PositionType;
/**
* 酒店中文地址
*/
private String AddressCN;
/**
* 酒店英文地址
*/
private String AddressEN;
/**
* 国家编号
*/
private Integer CountryId;
/**
* 国家中文名称
*/
private String CountryNameCN;
/**
* 国家英文名称
*/
private String CountryNameEN;
/**
* 城市编号
*/
private Integer CityId;
/**
* 城市中文名称
*/
private String CityNameCN;
/**
* 城市英文名称
*/
private String CityNameEN;
/**
* 酒店联系电话
*/
private String Phone;
/**
* 酒店映射关系
*/
private List<Mapping> Mapping;
}
/**
* 酒店映射关系类,用于描述酒店与外部系统的映射关联
*/
@Data
public static class Mapping {
/**
* 映射类型,如 1-Elong、2-Meituan、3-Expedia 等(可根据实际枚举值补充说明)
*/
private int Type;
/**
* 映射ID
*/
private String MappingId;
}
}
package org.dromara.common.hotel.model.res.hotel;
import lombok.Data;
import java.util.List;
/**
* 酒店id集合详情响应类,用于封装酒店详情查询接口返回的数据结构
*
* @author wenhe
*/
@Data
public class HotelIdListResponse {
/**
* 响应状态码,200表示成功,500表示错误
*/
private Integer Code;
/**
* 说明
*/
private String Message;
/**
* 酒店Id集合
*/
private List<String> HotelIdList;
}
package org.dromara.common.hotel.model.res.hotel;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
/**
* 酒店价格查询接口返回结果封装类
* 用于接收并解析酒店价格查询接口返回的数据,结合 Lombok 简化代码,自动生成 getter、setter、toString 等方法
*/
@Data
public class HotelPriceResponse {
/**
* 返回结果状态码
* 规则:200 表示成功,500 表示错误
*/
private Integer Code;
/**
* 说明
*/
private String Message;
/**
* 报价集合
*/
private List<HotelList> HotelList;
/**
* 试单校验码
* 规则:当价格计划编号不为空时返回该值,下单流程需传入此数值
*/
private String RateKey;
/**
* 酒店信息子对象,用于封装单条酒店的详细数据
*/
@Data
public static class HotelList {
/**
* 酒店编号
* 唯一标识酒店的编码
*/
private String HotelId;
/**
* 酒店中文名称
*/
private String HotelNameCN;
/**
* 酒店英文名称
*/
private String HotelNameEN;
/**
* 房型集合
*/
private List<RoomType> RoomTypeList;
}
/**
* 房型信息封装类
* 用于接收并解析接口返回的房型数据,结合 Lombok 简化代码,自动生成 getter、setter、toString 等方法
*/
@Data
public static class RoomType {
/**
* 房型编号
*/
private String RoomTypeId;
/**
* 房型中文名称
*/
private String RoomTypeNameCN;
/**
* 房型英文名称
*/
private String RoomTypeNameEN;
/**
* 床型
* 格式要求:数量*床型
*/
private String BedType;
/**
* 窗户情况
* 枚举规则:0.有窗 1.部分有窗 2.无窗 3.未知 ,标记房型窗户配置状态
*/
private Integer Window;
/**
* 上网方式
* 枚举规则:0.无法上网 1.无线WIFI 2.有线宽带 3.无线WIFI和有线宽带 4.未知 ,说明房型网络接入方式
*/
private Integer InternetWay;
/**
* 最大入住成人数
* 规则:0 表示未知,大于 0 表示具体可入住成人数量上限
*/
private Integer MaxAdults;
/**
* 最大入住儿童数
* 规则:0 表示未知,大于 0 表示具体可入住儿童数量上限
*/
private Integer MaxChildren;
/**
* 房型面积
*/
private String UseableArea;
/**
* 楼层
*/
private String Floor;
/**
* 价格计划集合
*/
private List<RatePlan> RatePlanList;
}
/**
* 价格计划信息封装类
* 用于接收并解析接口返回的价格计划数据,结合 Lombok 简化代码,自动生成 getter、setter、toString 等方法
*/
@Data
public static class RatePlan {
/**
* 价格计划编号
*/
private String RatePlanId;
/**
* 价格计划中文名称
*/
private String RatePlanNameCN;
/**
* 价格计划英文名称
*/
private String RatePlanNameEN;
/**
* 早餐份数
*/
private Integer Breakfast;
/**
* 最小连住天数
* 规则:0 表示不限,大于 0 表示需要连续入住的最少天数
*/
private Integer ContinuousDays;
/**
* 最大连住天数
* 规则:0 表示不限,大于 0 表示最多可连续入住的天数
*/
private Integer MaxContinuousDays;
/**
* 提前预订天数
* 规则:0 表示不限,大于 0 表示需要提前预订的天数要求
*/
private Integer AdvanceDays;
/**
* 最少预订间数
* 规则:0 表示不限,大于 0 表示该价格计划最少要预订的房间数量
*/
private Integer MinRoomCount;
/**
* 最大预订间数
* 规则:0 表示不限,大于 0 表示该价格计划最多可预订的房间数量
*/
private Integer MaxRoomCount;
/**
* 最大成人数
* 规则:0 表示未知,大于 0 表示该价格计划下最多可入住的成人数量
*/
private Integer MaxAdultOccupancy;
/**
* 最大儿童数
* 规则:0 表示未知,大于 0 表示该价格计划下最多可入住的儿童数量
*/
private Integer MaxChildrenOccupancy;
/**
* 发票类型
* 枚举规则:0.无,1.酒店前台开发票,2.我司开发票
* 用于标记该价格计划对应的发票开具方式
*/
private Integer InvoiceType;
/**
* 每日价格集合
*/
private List<RatePlanPrice> RatePlanPriceList;
/**
* 礼包
*/
private List<Gift> GiftList;
/**
* 取消政策集合
*/
private List<CancellationPenalty> CancellationPenalties;
/**
* 取消政策使用的时区
*/
private String CityTimeZone;
/**
* 到店付的费或税
*/
private List<Fee> FeeList;
}
/**
* 每日价格计划信息封装类
* 用于接收并解析接口返回的每日价格计划数据,结合 Lombok 简化代码,自动生成 getter、setter、toString 等方法
*/
@Data
public static class RatePlanPrice {
/**
* 日期
*/
private LocalDateTime Date;
/**
* 价格
* 类型为 decimal,代表每天每间房的价格
*/
private BigDecimal Price;
/**
* 币种
* 字符串类型,标记价格对应的货币种类,如 "CNY"(人民币)、"USD"(美元)等
*/
private String Currency;
/**
* 可售间数
* 整数类型,标记该日期下该价格计划可销售的房间数量
*/
private Integer RoomCount;
/**
* 状态
* 枚举规则:1.上架 0.下架,标记该价格计划在对应日期的状态
*/
private Integer Flag;
}
/**
* 礼包信息封装类
* 用于接收并解析接口返回的礼包数据,结合 Lombok 简化代码,自动生成 getter、setter、toString 等方法
*/
@Data
public static class Gift {
/**
* 名称
*/
private String GiftName;
/**
* 描述
*/
private String GiftDesc;
/**
* 数量
*/
private Integer GiftCount;
/**
* 价格
*/
private String GiftPrice;
/**
* 生效时间
*/
private String StartDate;
/**
* 失效时间
*/
private String EndDate;
}
/**
* 取消政策实体类
* 用于封装取消政策相关数据,配合 Lombok 的 @Data 注解,自动生成 getter、setter、toString 等方法
*/
@Data
public static class CancellationPenalty {
/**
* 取消起始时间,使用 CityTimeZone 时区
*/
private String From;
/**
* 取消罚金金额
*/
private BigDecimal Amount;
}
/**
* 费用实体类
* 用于封装费用相关数据,配合 Lombok 的 @Data 注解,自动生成 getter、setter、toString 等方法
*/
@Data
public static class Fee {
/**
* 费用名称
*/
private String FeeName;
/**
* 费用金额
*/
private BigDecimal FeePrice;
/**
* 费用币种
*/
private String Currency;
}
}
package org.dromara.common.hotel.model.res.hotel;
import lombok.Data;
import java.util.List;
/**
* 酒店房间信息响应类
* 用于接收并解析酒店房间相关接口返回的 JSON 数据
*/
@Data
public class HotelRoomInfoResponse {
/**
* 返回结果状态: 200成功;500错
*/
private Integer Code;
/**
* 说明
*/
private String Message;
/**
* 酒店集合
*/
private List<HotelData> Data;
/**
* 酒店数据类,包含酒店 ID 及对应的房间列表
*/
@Data
public static class HotelData {
/**
* 酒店编号
*/
private String HotelId;
/**
* 房型集合
*/
private List<RoomInfo> RoomList;
}
/**
* 房间信息类,描述房间的具体属性
*/
@Data
public static class RoomInfo {
/**
* 房型编号
*/
private String RoomTypeId;
/**
* 房型中文名称
*/
private String RoomTypeNameCN;
/**
* 房型英文名称
*/
private String RoomTypeNameEN;
/**
* 最大入住成人数, 0 表示未知
*/
private Integer MaxAdults;
/**
* 最大入住儿童数, 0 表示未知
*/
private Integer MaxChildren;
/**
* 房型面积
*/
private String UseableArea;
/**
* 床型,格式: 数量*床型
*/
private String BedType;
/**
* 窗户情况:0.有窗 1.部分有窗 2.无窗 3.未知
*/
private Integer Window;
/**
* 上网方式:0.无法上网 1.无线WIFI 2.有线宽带 3.无线WIFI
* 和有线宽带 4.未知
*/
private Integer InternetWay;
/**
* 房型映射关系
*/
private List<Mapping> Mapping;
}
/**
* 酒店映射关系类,用于描述酒店与外部系统的映射关联
*/
@Data
public static class Mapping {
/**
* 映射类型,如 1-Elong、2-Meituan、3-Expedia 等(可根据实际枚举值补充说明)
*/
private Integer Type;
/**
* 映射ID
*/
private String MappingId;
}
}
package org.dromara.common.hotel.model.res.order;
import lombok.Data;
/**
* 订单取消响应结果实体类
* @author wenhe
*/
@Data
public class OrderCancelResponse {
/**
* 返回结果状态码
* 说明:200 表示成功,500 表示错误,用于快速判断接口调用结果
*/
private Integer Code;
/**
* 说明信息
* 用于返回接口调用的详细说明,如错误原因、成功提示等
*/
private String Message;
/**
* 订单号
* 类型为 long,唯一标识订单的编号,下单成功后返回,可用于后续订单查询、修改等操作
*/
private Long OrderId;
/**
* 订单状态
* 枚举值说明:
* 1. 确认有房
* 2. 等待预约确认
* 3. 确认无房
* 4. 已完成
* 5. 订单取消
* 6. 异常订单
* 7. 下单异常
* 用于标识订单当前所处的业务状态
*/
private Integer OrderStatus;
}
package org.dromara.common.hotel.model.res.order;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
/**
* 订单详情响应结果封装类
* 用于接收并解析订单详情接口返回的数据,结合 Lombok 简化代码,自动生成 getter、setter、toString 等方法
* 完整映射 JSON 结构,包含订单基础信息、价格列表、客人信息及接口状态码等
*/
@Data
public class OrderDetailResponse {
/**
* 订单详情核心数据
* 封装订单的详细信息,如订单号、酒店信息、价格列表等
*/
private OrderDetail orderDetail;
/**
* 接口返回状态码
* 规则:200 表示成功,500 表示错误(需结合实际接口约定)
*/
private Integer Code;
/**
* 说明信息
* 通常用于返回错误详情、提示等文本内容,成功时可能为空
*/
private String Message;
@Data
public static class OrderDetail {
/**
* 订单号
*/
private String OrderId;
/**
* 分销商订单号
*/
private String WholesalerOrderId;
/**
* 下单时间
* 格式:datetime 字符串,标记订单创建的时间点
*/
private String OrderDate;
/**
* 酒店编号
*/
private String HotelId;
/**
* 酒店中文名称
*/
private String HotelName;
/**
* 酒店英文名称
*/
private String HotelNameEN;
/**
* 房型编号
*/
private String RoomId;
/**
* 房型中文名称
*/
private String RoomName;
/**
* 房型英文名称
*/
private String RoomNameEN;
/**
* 间夜数
*/
private Integer RoomNum;
/**
* 入住日期
*/
private String CheckInDate;
/**
* 离店日期
*/
private String CheckOutDate;
/**
* 订单总价格
*/
private BigDecimal TotalPrice;
/**
* 每日价格集合
*/
private List<PriceListItem> PriceList;
/**
* 入住人姓名
*/
private String CustomerName;
/**
* 联系电话
*/
private String PhoneNumber;
/**
* 确认号
*/
private String ConfirmationNumber;
/**
* 订单状态
* 1.确认有房
* 3.等待房间确认
* 4.确认无房
* 5.已完成
* -1.订单取消
* 6.异常订单
* 7.下单异常
*/
private Integer OrderStatus;
/**
* 授信状态 0未授信 1已授信
*/
private Integer PaymentStatus;
}
@Data
public static class PriceListItem {
/**
* 入住日期
*/
private String Date;
/**
* 间数
*/
private Integer Count;
/**
* 币种
*/
private String Currency;
/**
* 早餐份数
*/
private Integer Breakfast;
/**
* 价格,每天每间价格
*/
private BigDecimal Price;
}
}
package org.dromara.common.hotel.model.res.order;
import lombok.Data;
/**
* 订单响应结果实体类
* 用于封装订单操作(如下单、查询等)后的返回数据,配合 Lombok 的 @Data 注解,自动生成 getter、setter、toString 等方法
*/
@Data
public class OrderResponse {
/**
* 返回结果状态码
* 说明:200 表示成功,500 表示错误,用于快速判断接口调用结果
*/
private Integer Code;
/**
* 说明信息
* 用于返回接口调用的详细说明,如错误原因、成功提示等
*/
private String Message;
/**
* 订单号
* 类型为 long,唯一标识订单的编号,下单成功后返回,可用于后续订单查询、修改等操作
*/
private Long OrderId;
/**
* 订单状态
* 枚举值说明:
* 1. 确认有房
* 2. 等待预约确认
* 3. 确认无房
* 4. 已完成
* 5. 订单取消
* 6. 异常订单
* 7. 下单异常
* 用于标识订单当前所处的业务状态
*/
private Integer OrderStatus;
}
package org.dromara.common.hotel.service;
import org.dromara.common.hotel.model.req.auth.AuthRequest;
import org.dromara.common.hotel.model.req.hotel.HotelDetailRequest;
import org.dromara.common.hotel.model.req.hotel.HotelIdListRequest;
import org.dromara.common.hotel.model.req.hotel.HotelPriceRequest;
import org.dromara.common.hotel.model.req.hotel.HotelRoomInfoRequest;
import org.dromara.common.hotel.model.req.order.OrderCancelRequest;
import org.dromara.common.hotel.model.req.order.OrderDetailRequest;
import org.dromara.common.hotel.model.req.order.OrderRequest;
import org.dromara.common.hotel.model.res.auth.AuthResponse;
import org.dromara.common.hotel.model.res.hotel.HotelDetailResponse;
import org.dromara.common.hotel.model.res.hotel.HotelIdListResponse;
import org.dromara.common.hotel.model.res.hotel.HotelPriceResponse;
import org.dromara.common.hotel.model.res.hotel.HotelRoomInfoResponse;
import org.dromara.common.hotel.model.res.order.OrderCancelResponse;
import org.dromara.common.hotel.model.res.order.OrderDetailResponse;
import org.dromara.common.hotel.model.res.order.OrderResponse;
/**
* @author wenhe
*/
public interface HotelChinaService {
/**
* 认证
*
* @param req 请求参数
* @return 响应参数
*/
AuthResponse authorize(AuthRequest req);
/**
* 酒店详情
*
* @param token token
* @param req 请求参数
* @return 响应参数
*/
HotelDetailResponse hotelDetail(String token, HotelDetailRequest req);
/**
* 酒店Id列表
*
* @param token token
* @param req 请求参数
* @return 响应参数
*/
HotelIdListResponse hotelIdList(String token, HotelIdListRequest req);
/**
* 房型列表
*
* @param token token
* @param req 请求参数
* @return 响应参数
*/
HotelRoomInfoResponse hotelRoomInfo(String token, HotelRoomInfoRequest req);
/**
* 报价
*
* @param token token
* @param req 请求参数
* @return 响应参数
*/
HotelPriceResponse hotelPrice(String token, HotelPriceRequest req);
/**
* 下单
*
* @param token token
* @param req 请求参数
* @return 响应参数
*/
OrderResponse order(String token, OrderRequest req);
/**
* 订单详情
*
* @param token token
* @param req 请求参数
* @return 响应参数
*/
OrderDetailResponse orderDetail(String token, OrderDetailRequest req);
/**
* 订单取消
*
* @param token token
* @param req 请求参数
* @return 响应参数
*/
OrderCancelResponse orderCancel(String token, OrderCancelRequest req);
}
package org.dromara.common.hotel.service.impl;
import com.alibaba.fastjson.JSON;
import org.dromara.common.hotel.Api;
import org.dromara.common.hotel.base.RequestMethodEnum;
import org.dromara.common.hotel.common.Code;
import org.dromara.common.hotel.enums.DomainEnum;
import org.dromara.common.hotel.enums.auth.AuthApiEnum;
import org.dromara.common.hotel.enums.hotel.HotelApiEnum;
import org.dromara.common.hotel.enums.product.OrderApiEnum;
import org.dromara.common.hotel.exception.HotelException;
import org.dromara.common.hotel.model.req.auth.AuthRequest;
import org.dromara.common.hotel.model.req.hotel.HotelDetailRequest;
import org.dromara.common.hotel.model.req.hotel.HotelIdListRequest;
import org.dromara.common.hotel.model.req.hotel.HotelPriceRequest;
import org.dromara.common.hotel.model.req.hotel.HotelRoomInfoRequest;
import org.dromara.common.hotel.model.req.order.OrderCancelRequest;
import org.dromara.common.hotel.model.req.order.OrderDetailRequest;
import org.dromara.common.hotel.model.req.order.OrderRequest;
import org.dromara.common.hotel.model.res.auth.AuthResponse;
import org.dromara.common.hotel.model.res.hotel.HotelDetailResponse;
import org.dromara.common.hotel.model.res.hotel.HotelIdListResponse;
import org.dromara.common.hotel.model.res.hotel.HotelPriceResponse;
import org.dromara.common.hotel.model.res.hotel.HotelRoomInfoResponse;
import org.dromara.common.hotel.model.res.order.OrderCancelResponse;
import org.dromara.common.hotel.model.res.order.OrderDetailResponse;
import org.dromara.common.hotel.model.res.order.OrderResponse;
import org.dromara.common.hotel.service.HotelChinaService;
import java.util.Objects;
/**
* @author hzh
* @date 2025-05-12
**/
public class HotelChinaServiceImpl implements HotelChinaService {
@Override
public AuthResponse authorize(AuthRequest req) {
AuthResponse res = Api.v1(RequestMethodEnum.POST,
DomainEnum.TEST.getDomain(),
AuthApiEnum.AUTHORIZE.getUrl(),
null,
JSON.toJSONString(req),
AuthResponse.class);
if (!Objects.equals(res.getCode(), Code.SUCCESS.getCode())) {
throw new HotelException(res.getMessage());
}
return res;
}
@Override
public HotelDetailResponse hotelDetail(String token, HotelDetailRequest req) {
HotelDetailResponse res = Api.v1(RequestMethodEnum.POST,
DomainEnum.TEST.getDomain(),
HotelApiEnum.DETAIL.getUrl(),
token,
JSON.toJSONString(req),
HotelDetailResponse.class);
if (!Objects.equals(res.getCode(), Code.SUCCESS.getCode())) {
throw new HotelException(res.getMessage());
}
return res;
}
@Override
public HotelIdListResponse hotelIdList(String token, HotelIdListRequest req) {
HotelIdListResponse res = Api.v1(RequestMethodEnum.POST,
DomainEnum.TEST.getDomain(),
HotelApiEnum.ID_LIST.getUrl(),
token,
JSON.toJSONString(req),
HotelIdListResponse.class);
if (!Objects.equals(res.getCode(), Code.SUCCESS.getCode())) {
throw new HotelException(res.getMessage());
}
return res;
}
@Override
public HotelRoomInfoResponse hotelRoomInfo(String token, HotelRoomInfoRequest req) {
HotelRoomInfoResponse res = Api.v1(RequestMethodEnum.POST,
DomainEnum.TEST.getDomain(),
HotelApiEnum.ROOM_INFO.getUrl(),
token,
JSON.toJSONString(req),
HotelRoomInfoResponse.class);
if (!Objects.equals(res.getCode(), Code.SUCCESS.getCode())) {
throw new HotelException(res.getMessage());
}
return res;
}
@Override
public HotelPriceResponse hotelPrice(String token, HotelPriceRequest req) {
HotelPriceResponse res = Api.v1(RequestMethodEnum.POST,
DomainEnum.TEST.getDomain(),
HotelApiEnum.GET_PRICE.getUrl(),
token,
JSON.toJSONString(req),
HotelPriceResponse.class);
if (!Objects.equals(res.getCode(), Code.SUCCESS.getCode())) {
throw new HotelException(res.getMessage());
}
return res;
}
@Override
public OrderResponse order(String token, OrderRequest req) {
OrderResponse res = Api.v1(RequestMethodEnum.POST,
DomainEnum.TEST.getDomain(),
OrderApiEnum.ORDER_CREATE.getUrl(),
token,
JSON.toJSONString(req),
OrderResponse.class);
if (!Objects.equals(res.getCode(), Code.SUCCESS.getCode())) {
throw new HotelException(res.getMessage());
}
return res;
}
@Override
public OrderDetailResponse orderDetail(String token, OrderDetailRequest req) {
OrderDetailResponse res = Api.v1(RequestMethodEnum.POST,
DomainEnum.TEST.getDomain(),
OrderApiEnum.ORDER_DETAIL.getUrl(),
token,
JSON.toJSONString(req),
OrderDetailResponse.class);
if (!Objects.equals(res.getCode(), Code.SUCCESS.getCode())) {
throw new HotelException(res.getMessage());
}
return res;
}
@Override
public OrderCancelResponse orderCancel(String token, OrderCancelRequest req) {
OrderCancelResponse res = Api.v1(RequestMethodEnum.POST,
DomainEnum.TEST.getDomain(),
OrderApiEnum.ORDER_CANCEL.getUrl(),
token,
JSON.toJSONString(req),
OrderCancelResponse.class);
if (!Objects.equals(res.getCode(), Code.SUCCESS.getCode())) {
throw new HotelException(res.getMessage());
}
return res;
}
}
...@@ -96,6 +96,7 @@ public class LogAspect { ...@@ -96,6 +96,7 @@ public class LogAspect {
operLog.setOperUrl(StringUtils.substring(ServletUtils.getRequest().getRequestURI(), 0, 255)); operLog.setOperUrl(StringUtils.substring(ServletUtils.getRequest().getRequestURI(), 0, 255));
LoginUser loginUser = LoginHelper.getLoginUser(); LoginUser loginUser = LoginHelper.getLoginUser();
operLog.setOperName(loginUser.getUsername()); operLog.setOperName(loginUser.getUsername());
operLog.setUserType(loginUser.getUserType());
operLog.setDeptName(loginUser.getDeptName()); operLog.setDeptName(loginUser.getDeptName());
if (e != null) { if (e != null) {
......
...@@ -63,6 +63,7 @@ public class LogEventListener { ...@@ -63,6 +63,7 @@ public class LogEventListener {
s.append(getBlock(ip)); s.append(getBlock(ip));
s.append(address); s.append(address);
s.append(getBlock(logininforEvent.getUsername())); s.append(getBlock(logininforEvent.getUsername()));
s.append(getBlock(logininforEvent.getUserType()));
s.append(getBlock(logininforEvent.getStatus())); s.append(getBlock(logininforEvent.getStatus()));
s.append(getBlock(logininforEvent.getMessage())); s.append(getBlock(logininforEvent.getMessage()));
// 打印信息到日志 // 打印信息到日志
...@@ -83,6 +84,7 @@ public class LogEventListener { ...@@ -83,6 +84,7 @@ public class LogEventListener {
logininfor.setLoginLocation(address); logininfor.setLoginLocation(address);
logininfor.setBrowser(browser); logininfor.setBrowser(browser);
logininfor.setOs(os); logininfor.setOs(os);
logininfor.setUserType(logininforEvent.getUserType());
logininfor.setMsg(logininforEvent.getMessage()); logininfor.setMsg(logininforEvent.getMessage());
// 日志状态 // 日志状态
if (StringUtils.equalsAny(logininforEvent.getStatus(), Constants.LOGIN_SUCCESS, Constants.LOGOUT, Constants.REGISTER)) { if (StringUtils.equalsAny(logininforEvent.getStatus(), Constants.LOGIN_SUCCESS, Constants.LOGOUT, Constants.REGISTER)) {
......
...@@ -27,6 +27,11 @@ public class LogininforEvent implements Serializable { ...@@ -27,6 +27,11 @@ public class LogininforEvent implements Serializable {
*/ */
private String username; private String username;
/**
* 用户类型
*/
private String userType;
/** /**
* 登录状态 0成功 1失败 * 登录状态 0成功 1失败
*/ */
......
...@@ -63,6 +63,11 @@ public class OperLogEvent implements Serializable { ...@@ -63,6 +63,11 @@ public class OperLogEvent implements Serializable {
*/ */
private String operName; private String operName;
/**
* 用户类型
*/
private String userType;
/** /**
* 部门名称 * 部门名称
*/ */
......
package org.dromara.common.mybatis.service; package org.dromara.common.mybatis.service;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ReflectUtil; import cn.hutool.core.util.ReflectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.MapstructUtils;
...@@ -103,7 +105,6 @@ public abstract class AbstractBaseService<V, B, T> implements IBaseService<V, B, ...@@ -103,7 +105,6 @@ public abstract class AbstractBaseService<V, B, T> implements IBaseService<V, B,
} }
} catch (NoSuchFieldException | IllegalAccessException e) { } catch (NoSuchFieldException | IllegalAccessException e) {
// 处理异常,可以打印日志或者抛出异常 // 处理异常,可以打印日志或者抛出异常
e.printStackTrace();
} }
} }
...@@ -131,6 +132,18 @@ public abstract class AbstractBaseService<V, B, T> implements IBaseService<V, B, ...@@ -131,6 +132,18 @@ public abstract class AbstractBaseService<V, B, T> implements IBaseService<V, B,
return lqw; return lqw;
} }
@Override
public IPage<V> convertPage(IPage<T> page) {
List<T> list = page.getRecords();
// 创建一个新的VO对象分页列表,并设置分页信息
IPage<V> voPage = new Page<>(page.getCurrent(), page.getSize(), page.getTotal());
if (CollUtil.isEmpty(list)) {
return voPage;
}
voPage.setRecords(MapstructUtils.convert(list, (Class<V>) GenericsUtils.getSuperClassGenricType(this.getClass(), 0)));
return voPage;
}
@Override @Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) { public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if (isValid) { if (isValid) {
......
package org.dromara.common.mybatis.service; package org.dromara.common.mybatis.service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.common.mybatis.core.page.OrderBy; import org.dromara.common.mybatis.core.page.OrderBy;
import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.PageQuery;
...@@ -105,6 +106,13 @@ public interface IBaseService<V, B, T> { ...@@ -105,6 +106,13 @@ public interface IBaseService<V, B, T> {
*/ */
LambdaQueryWrapper<T> buildQueryWrapper(B bo); LambdaQueryWrapper<T> buildQueryWrapper(B bo);
/**
* 分页转化
* @param page page
* @return 分页
*/
IPage<V> convertPage(IPage<T> page);
/** /**
* 保存之前校验实体 * 保存之前校验实体
* *
......
...@@ -27,6 +27,8 @@ public class SaPermissionImpl implements StpInterface { ...@@ -27,6 +27,8 @@ public class SaPermissionImpl implements StpInterface {
} else if (userType == UserType.APP_USER) { } else if (userType == UserType.APP_USER) {
// 其他端 自行根据业务编写 // 其他端 自行根据业务编写
return new ArrayList<>(loginUser.getMenuPermission()); return new ArrayList<>(loginUser.getMenuPermission());
} else if (userType == UserType.PROJECT_USER) {
return new ArrayList<>(loginUser.getMenuPermission());
} }
return new ArrayList<>(); return new ArrayList<>();
} }
...@@ -42,6 +44,8 @@ public class SaPermissionImpl implements StpInterface { ...@@ -42,6 +44,8 @@ public class SaPermissionImpl implements StpInterface {
return new ArrayList<>(loginUser.getRolePermission()); return new ArrayList<>(loginUser.getRolePermission());
} else if (userType == UserType.APP_USER) { } else if (userType == UserType.APP_USER) {
// 其他端 自行根据业务编写 // 其他端 自行根据业务编写
} else if (userType == UserType.PROJECT_USER) {
return new ArrayList<>(loginUser.getRolePermission());
} }
return new ArrayList<>(); return new ArrayList<>();
} }
......
...@@ -11,6 +11,7 @@ import lombok.NoArgsConstructor; ...@@ -11,6 +11,7 @@ import lombok.NoArgsConstructor;
import org.dromara.common.core.constant.TenantConstants; import org.dromara.common.core.constant.TenantConstants;
import org.dromara.common.core.constant.UserConstants; import org.dromara.common.core.constant.UserConstants;
import org.dromara.common.core.enums.UserType; import org.dromara.common.core.enums.UserType;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mall.enums.TerminalEnum; import org.dromara.common.mall.enums.TerminalEnum;
import org.dromara.system.api.model.LoginUser; import org.dromara.system.api.model.LoginUser;
...@@ -43,6 +44,8 @@ public class LoginHelper { ...@@ -43,6 +44,8 @@ public class LoginHelper {
public static final String YS_USER_ID = "ysUserId"; public static final String YS_USER_ID = "ysUserId";
public static final String OPEN_ID = "openId"; public static final String OPEN_ID = "openId";
public static final String MEMBER_ID = "memberId"; public static final String MEMBER_ID = "memberId";
public static final String USER_TYPE = "userType";
public static final String PROJECT_ID = "projectId";
/** /**
* 登录系统 基于 设备类型 * 登录系统 基于 设备类型
...@@ -60,8 +63,12 @@ public class LoginHelper { ...@@ -60,8 +63,12 @@ public class LoginHelper {
.setExtra(DEPT_KEY, loginUser.getDeptId()) .setExtra(DEPT_KEY, loginUser.getDeptId())
.setExtra(DEPT_NAME_KEY, loginUser.getDeptName()) .setExtra(DEPT_NAME_KEY, loginUser.getDeptName())
.setExtra(DEPT_CATEGORY_KEY, loginUser.getDeptCategory()) .setExtra(DEPT_CATEGORY_KEY, loginUser.getDeptCategory())
.setExtra(USER_TYPE, loginUser.getUserType())
); );
StpUtil.getTokenSession().set(LOGIN_USER_KEY, loginUser); StpUtil.getTokenSession().set(LOGIN_USER_KEY, loginUser);
if (StringUtils.contains(loginUser.getUserType(), UserType.PROJECT_USER.getUserType())) {
StpUtil.getTokenSession().set(PROJECT_ID, Long.valueOf(StringUtils.splitList(loginUser.getUserType(), ":").get(1)));
}
} }
/** /**
...@@ -142,6 +149,22 @@ public class LoginHelper { ...@@ -142,6 +149,22 @@ public class LoginHelper {
return Convert.toLong(getExtra(MEMBER_ID)); return Convert.toLong(getExtra(MEMBER_ID));
} }
/**
* 获取项目id
*/
public static Long getProjectId() {
SaSession session = StpUtil.getTokenSession();
if (ObjectUtil.isNull(session)) {
return null;
}
Object project = session.get(PROJECT_ID);
if (project == null) {
return null;
} else {
return Long.parseLong(project.toString());
}
}
/** /**
* 获取客户端ID * 获取客户端ID
*/ */
...@@ -186,6 +209,13 @@ public class LoginHelper { ...@@ -186,6 +209,13 @@ public class LoginHelper {
return UserType.getUserType(loginType); return UserType.getUserType(loginType);
} }
/**
* 获取用户类型
*/
public static String getUserTypeStr() {
return StpUtil.getLoginIdAsString();
}
/** /**
* 是否为超级管理员 * 是否为超级管理员
* *
...@@ -240,4 +270,16 @@ public class LoginHelper { ...@@ -240,4 +270,16 @@ public class LoginHelper {
} }
} }
/**
* 动态设置项目id
*
* @param projectId 项目id
*/
public static void dynamicProjectId(Long projectId) {
if (projectId != null) {
StpUtil.getTokenSession().set(PROJECT_ID, projectId);
} else {
StpUtil.getTokenSession().delete(PROJECT_ID);
}
}
} }
...@@ -23,6 +23,11 @@ public interface TransConstant { ...@@ -23,6 +23,11 @@ public interface TransConstant {
*/ */
String DEPT_ID_TO_NAME = "dept_id_to_name"; String DEPT_ID_TO_NAME = "dept_id_to_name";
/**
* 项目id转名称
*/
String PROJECT_ID_TO_NAME = "project_id_to_name";
/** /**
* 字典type转label * 字典type转label
*/ */
......
package org.dromara.common.translation.core.impl;
import lombok.AllArgsConstructor;
import org.apache.dubbo.config.annotation.DubboReference;
import org.dromara.common.translation.annotation.TranslationType;
import org.dromara.common.translation.constant.TransConstant;
import org.dromara.common.translation.core.TranslationInterface;
import org.dromara.system.api.RemoteProjectService;
/**
* 部门翻译实现
*
* @author Lion Li
*/
@AllArgsConstructor
@TranslationType(type = TransConstant.PROJECT_ID_TO_NAME)
public class ProjectNameTranslationImpl implements TranslationInterface<String> {
@DubboReference
private RemoteProjectService remoteProjectService;
@Override
public String translation(Object key, String other) {
return remoteProjectService.selectProjectNameByIds(key.toString());
}
}
...@@ -5,3 +5,4 @@ org.dromara.common.translation.core.impl.OssUrlTranslationImpl ...@@ -5,3 +5,4 @@ org.dromara.common.translation.core.impl.OssUrlTranslationImpl
org.dromara.common.translation.core.impl.UserNameTranslationImpl org.dromara.common.translation.core.impl.UserNameTranslationImpl
org.dromara.common.translation.core.impl.NicknameTranslationImpl org.dromara.common.translation.core.impl.NicknameTranslationImpl
org.dromara.common.translation.core.impl.PersonCodeTranslationImpl org.dromara.common.translation.core.impl.PersonCodeTranslationImpl
org.dromara.common.translation.core.impl.ProjectNameTranslationImpl
...@@ -14,6 +14,7 @@ import org.dromara.common.ys.config.ProdConfig; ...@@ -14,6 +14,7 @@ import org.dromara.common.ys.config.ProdConfig;
import org.dromara.common.ys.enums.ApiEnum; import org.dromara.common.ys.enums.ApiEnum;
import org.dromara.common.ys.enums.Domain; import org.dromara.common.ys.enums.Domain;
import org.dromara.common.ys.enums.DomainEnum; import org.dromara.common.ys.enums.DomainEnum;
import org.dromara.common.ys.exception.YunShangException;
import java.io.File; import java.io.File;
import java.util.HashMap; import java.util.HashMap;
...@@ -79,6 +80,7 @@ public class Api { ...@@ -79,6 +80,7 @@ public class Api {
public static ApiHttpResponse v1(com.wenhe.base.base.RequestMethodEnum method, String urlPrefix, String urlSuffix, public static ApiHttpResponse v1(com.wenhe.base.base.RequestMethodEnum method, String urlPrefix, String urlSuffix,
String userId, String userId,
Map<String, Object> params, String body, File file) { Map<String, Object> params, String body, File file) {
try {
if (null != params && !params.keySet().isEmpty()) { if (null != params && !params.keySet().isEmpty()) {
urlSuffix = urlSuffix.concat("?").concat(PayKit.createLinkString(params, true)); urlSuffix = urlSuffix.concat("?").concat(PayKit.createLinkString(params, true));
} }
...@@ -100,6 +102,10 @@ public class Api { ...@@ -100,6 +102,10 @@ public class Api {
return put(urlPrefix.concat(urlSuffix), authorization, body); return put(urlPrefix.concat(urlSuffix), authorization, body);
} }
return null; return null;
} catch (Exception e) {
e.printStackTrace();
throw new YunShangException("接口调用失败,无数据返回!");
}
} }
/** /**
......
package org.dromara.common.ys.exception;
/**
* @author hzh
* @date 2025-06-20
**/
public class YunShangException extends RuntimeException {
public YunShangException(String message) {
super("差旅资源调用失败!" + message);
}
}
...@@ -8,6 +8,7 @@ import org.dromara.common.ys.common.Code; ...@@ -8,6 +8,7 @@ import org.dromara.common.ys.common.Code;
import org.dromara.common.ys.common.PageInfo; import org.dromara.common.ys.common.PageInfo;
import org.dromara.common.ys.enums.DomainEnum; import org.dromara.common.ys.enums.DomainEnum;
import org.dromara.common.ys.enums.bill.BillApiEnum; import org.dromara.common.ys.enums.bill.BillApiEnum;
import org.dromara.common.ys.exception.YunShangException;
import org.dromara.common.ys.model.req.bill.AccountDetailModel; import org.dromara.common.ys.model.req.bill.AccountDetailModel;
import org.dromara.common.ys.model.req.bill.ConfirmReconModel; import org.dromara.common.ys.model.req.bill.ConfirmReconModel;
import org.dromara.common.ys.model.res.bill.*; import org.dromara.common.ys.model.res.bill.*;
...@@ -33,7 +34,7 @@ public class BillServiceImpl implements IBillService { ...@@ -33,7 +34,7 @@ public class BillServiceImpl implements IBillService {
JSON.toJSONString(model) JSON.toJSONString(model)
); );
if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) { if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) {
throw new RuntimeException(res.getTips()); throw new YunShangException(res.getTips());
} }
return JSON.parseObject(JSON.parseObject(res.getData()).toJSONString(), QueryBillModel.class); return JSON.parseObject(JSON.parseObject(res.getData()).toJSONString(), QueryBillModel.class);
} }
...@@ -48,7 +49,7 @@ public class BillServiceImpl implements IBillService { ...@@ -48,7 +49,7 @@ public class BillServiceImpl implements IBillService {
JSON.toJSONString(model) JSON.toJSONString(model)
); );
if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) { if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) {
throw new RuntimeException(res.getTips()); throw new YunShangException(res.getTips());
} }
return JSON.parseObject(JSON.parseObject(res.getData()).toJSONString(), QueryBillAllModel.class); return JSON.parseObject(JSON.parseObject(res.getData()).toJSONString(), QueryBillAllModel.class);
} }
...@@ -63,7 +64,7 @@ public class BillServiceImpl implements IBillService { ...@@ -63,7 +64,7 @@ public class BillServiceImpl implements IBillService {
JSON.toJSONString(model) JSON.toJSONString(model)
); );
if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) { if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) {
throw new RuntimeException(res.getTips()); throw new YunShangException(res.getTips());
} }
if (res.getData() == null) { if (res.getData() == null) {
return PageInfo.<AccountDetailBeanModel>builder().build() return PageInfo.<AccountDetailBeanModel>builder().build()
...@@ -94,7 +95,7 @@ public class BillServiceImpl implements IBillService { ...@@ -94,7 +95,7 @@ public class BillServiceImpl implements IBillService {
JSON.toJSONString(model) JSON.toJSONString(model)
); );
if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) { if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) {
throw new RuntimeException(res.getTips()); throw new YunShangException(res.getTips());
} }
return JSON.parseObject(JSON.parseObject(res.getData()).toJSONString(), ConsTicketListModel.class); return JSON.parseObject(JSON.parseObject(res.getData()).toJSONString(), ConsTicketListModel.class);
} }
...@@ -109,7 +110,7 @@ public class BillServiceImpl implements IBillService { ...@@ -109,7 +110,7 @@ public class BillServiceImpl implements IBillService {
JSON.toJSONString(model) JSON.toJSONString(model)
); );
if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) { if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) {
throw new RuntimeException(res.getTips()); throw new YunShangException(res.getTips());
} }
return JSON.parseObject(JSON.parseObject(res.getData()).toJSONString(), TravelBillPushStatementModel.class); return JSON.parseObject(JSON.parseObject(res.getData()).toJSONString(), TravelBillPushStatementModel.class);
} }
...@@ -124,7 +125,7 @@ public class BillServiceImpl implements IBillService { ...@@ -124,7 +125,7 @@ public class BillServiceImpl implements IBillService {
JSON.toJSONString(model) JSON.toJSONString(model)
); );
if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) { if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) {
throw new RuntimeException(res.getTips()); throw new YunShangException(res.getTips());
} }
return JSON.parseObject(JSON.parseObject(res.getData()).toJSONString(), TravelBillGetCompareResultModel.class); return JSON.parseObject(JSON.parseObject(res.getData()).toJSONString(), TravelBillGetCompareResultModel.class);
} }
...@@ -139,7 +140,7 @@ public class BillServiceImpl implements IBillService { ...@@ -139,7 +140,7 @@ public class BillServiceImpl implements IBillService {
JSON.toJSONString(model) JSON.toJSONString(model)
); );
if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) { if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) {
throw new RuntimeException(res.getTips()); throw new YunShangException(res.getTips());
} }
return JSON.parseObject(JSON.parseObject(res.getData()).toJSONString(), EditBxjlModel.class); return JSON.parseObject(JSON.parseObject(res.getData()).toJSONString(), EditBxjlModel.class);
} }
...@@ -154,7 +155,7 @@ public class BillServiceImpl implements IBillService { ...@@ -154,7 +155,7 @@ public class BillServiceImpl implements IBillService {
JSON.toJSONString(model) JSON.toJSONString(model)
); );
if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) { if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) {
throw new RuntimeException(res.getTips()); throw new YunShangException(res.getTips());
} }
} }
} }
...@@ -7,6 +7,7 @@ import org.dromara.common.ys.common.ApiHttpResponse; ...@@ -7,6 +7,7 @@ import org.dromara.common.ys.common.ApiHttpResponse;
import org.dromara.common.ys.common.Code; import org.dromara.common.ys.common.Code;
import org.dromara.common.ys.enums.DomainEnum; import org.dromara.common.ys.enums.DomainEnum;
import org.dromara.common.ys.enums.resource.CommonResourceApiEnum; import org.dromara.common.ys.enums.resource.CommonResourceApiEnum;
import org.dromara.common.ys.exception.YunShangException;
import org.dromara.common.ys.model.req.commonResource.*; import org.dromara.common.ys.model.req.commonResource.*;
import org.dromara.common.ys.service.ICommonResourceService; import org.dromara.common.ys.service.ICommonResourceService;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
...@@ -32,7 +33,7 @@ public class CommonResourceServiceImpl implements ICommonResourceService { ...@@ -32,7 +33,7 @@ public class CommonResourceServiceImpl implements ICommonResourceService {
JSON.toJSONString(new CountryModel()) JSON.toJSONString(new CountryModel())
); );
if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) { if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) {
throw new RuntimeException(res.getTips()); throw new YunShangException(res.getTips());
} }
return JSON.parseArray(JSON.parseObject(res.getData()).getString("countryDataList"), org.dromara.common.ys.model.res.comomResource.CountryModel.class); return JSON.parseArray(JSON.parseObject(res.getData()).getString("countryDataList"), org.dromara.common.ys.model.res.comomResource.CountryModel.class);
} }
...@@ -47,7 +48,7 @@ public class CommonResourceServiceImpl implements ICommonResourceService { ...@@ -47,7 +48,7 @@ public class CommonResourceServiceImpl implements ICommonResourceService {
JSON.toJSONString(new ProvinceModel()) JSON.toJSONString(new ProvinceModel())
); );
if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) { if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) {
throw new RuntimeException(res.getTips()); throw new YunShangException(res.getTips());
} }
return JSON.parseArray(JSON.parseObject(res.getData()).getString("provinceDataList"), org.dromara.common.ys.model.res.comomResource.ProvinceModel.class); return JSON.parseArray(JSON.parseObject(res.getData()).getString("provinceDataList"), org.dromara.common.ys.model.res.comomResource.ProvinceModel.class);
} }
...@@ -62,7 +63,7 @@ public class CommonResourceServiceImpl implements ICommonResourceService { ...@@ -62,7 +63,7 @@ public class CommonResourceServiceImpl implements ICommonResourceService {
JSON.toJSONString(new CityModel()) JSON.toJSONString(new CityModel())
); );
if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) { if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) {
throw new RuntimeException(res.getTips()); throw new YunShangException(res.getTips());
} }
if (res.getData() == null) { if (res.getData() == null) {
return new ArrayList<>(); return new ArrayList<>();
...@@ -80,7 +81,7 @@ public class CommonResourceServiceImpl implements ICommonResourceService { ...@@ -80,7 +81,7 @@ public class CommonResourceServiceImpl implements ICommonResourceService {
JSON.toJSONString(new AirportModel()) JSON.toJSONString(new AirportModel())
); );
if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) { if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) {
throw new RuntimeException(res.getTips()); throw new YunShangException(res.getTips());
} }
if (res.getData() == null) { if (res.getData() == null) {
return new ArrayList<>(); return new ArrayList<>();
...@@ -99,7 +100,7 @@ public class CommonResourceServiceImpl implements ICommonResourceService { ...@@ -99,7 +100,7 @@ public class CommonResourceServiceImpl implements ICommonResourceService {
JSON.toJSONString(new StationModel()) JSON.toJSONString(new StationModel())
); );
if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) { if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) {
throw new RuntimeException(res.getTips()); throw new YunShangException(res.getTips());
} }
if (res.getData() == null) { if (res.getData() == null) {
return new ArrayList<>(); return new ArrayList<>();
...@@ -118,7 +119,7 @@ public class CommonResourceServiceImpl implements ICommonResourceService { ...@@ -118,7 +119,7 @@ public class CommonResourceServiceImpl implements ICommonResourceService {
JSON.toJSONString(new TrainBaseModel()) JSON.toJSONString(new TrainBaseModel())
); );
if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) { if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) {
throw new RuntimeException(res.getTips()); throw new YunShangException(res.getTips());
} }
if (res.getData() == null) { if (res.getData() == null) {
return new ArrayList<>(); return new ArrayList<>();
...@@ -138,7 +139,7 @@ public class CommonResourceServiceImpl implements ICommonResourceService { ...@@ -138,7 +139,7 @@ public class CommonResourceServiceImpl implements ICommonResourceService {
JSON.toJSONString(model) JSON.toJSONString(model)
); );
if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) { if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) {
throw new RuntimeException(res.getTips()); throw new YunShangException(res.getTips());
} }
if (res.getData() == null) { if (res.getData() == null) {
return new ArrayList<>(); return new ArrayList<>();
......
...@@ -8,6 +8,7 @@ import org.dromara.common.ys.common.Code; ...@@ -8,6 +8,7 @@ import org.dromara.common.ys.common.Code;
import org.dromara.common.ys.common.PageInfo; import org.dromara.common.ys.common.PageInfo;
import org.dromara.common.ys.enums.DomainEnum; import org.dromara.common.ys.enums.DomainEnum;
import org.dromara.common.ys.enums.hotel.HotelApiEnum; import org.dromara.common.ys.enums.hotel.HotelApiEnum;
import org.dromara.common.ys.exception.YunShangException;
import org.dromara.common.ys.model.req.hotel.HotelQueryOrderModel; import org.dromara.common.ys.model.req.hotel.HotelQueryOrderModel;
import org.dromara.common.ys.model.req.hotel.HotelQueryRefundOrderModel; import org.dromara.common.ys.model.req.hotel.HotelQueryRefundOrderModel;
import org.dromara.common.ys.model.req.hotel.PayOrderModel; import org.dromara.common.ys.model.req.hotel.PayOrderModel;
...@@ -37,7 +38,7 @@ public class HotelServiceImpl implements IHotelService { ...@@ -37,7 +38,7 @@ public class HotelServiceImpl implements IHotelService {
JSON.toJSONString(model) JSON.toJSONString(model)
); );
if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) { if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) {
throw new RuntimeException(res.getTips()); throw new YunShangException(res.getTips());
} }
if (res.getData() == null) { if (res.getData() == null) {
return null; return null;
...@@ -55,7 +56,7 @@ public class HotelServiceImpl implements IHotelService { ...@@ -55,7 +56,7 @@ public class HotelServiceImpl implements IHotelService {
JSON.toJSONString(model) JSON.toJSONString(model)
); );
if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) { if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) {
throw new RuntimeException(res.getTips()); throw new YunShangException(res.getTips());
} }
return Optional.ofNullable(res.getData()).map(data->JSON.parseObject(JSON.parseObject(data).toJSONString(), HotelShoppingPricePlanModel.class)).orElse(null); return Optional.ofNullable(res.getData()).map(data->JSON.parseObject(JSON.parseObject(data).toJSONString(), HotelShoppingPricePlanModel.class)).orElse(null);
} }
...@@ -70,7 +71,7 @@ public class HotelServiceImpl implements IHotelService { ...@@ -70,7 +71,7 @@ public class HotelServiceImpl implements IHotelService {
JSON.toJSONString(model) JSON.toJSONString(model)
); );
if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) { if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) {
throw new RuntimeException(res.getTips()); throw new YunShangException(res.getTips());
} }
if (res.getData() == null) { if (res.getData() == null) {
return PageInfo.<HotelShoppingBaseListModel>builder().build() return PageInfo.<HotelShoppingBaseListModel>builder().build()
...@@ -101,7 +102,7 @@ public class HotelServiceImpl implements IHotelService { ...@@ -101,7 +102,7 @@ public class HotelServiceImpl implements IHotelService {
JSON.toJSONString(model) JSON.toJSONString(model)
); );
if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) { if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) {
throw new RuntimeException(res.getTips()); throw new YunShangException(res.getTips());
} }
return JSON.parseObject(JSON.parseObject(res.getData()).toJSONString(), HotelOrderBookModel.class); return JSON.parseObject(JSON.parseObject(res.getData()).toJSONString(), HotelOrderBookModel.class);
} }
...@@ -116,7 +117,7 @@ public class HotelServiceImpl implements IHotelService { ...@@ -116,7 +117,7 @@ public class HotelServiceImpl implements IHotelService {
JSON.toJSONString(model) JSON.toJSONString(model)
); );
if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) { if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) {
throw new RuntimeException(res.getTips()); throw new YunShangException(res.getTips());
} }
return JSON.parseObject(JSON.parseObject(res.getData()).toJSONString(), CancelOrderModel.class); return JSON.parseObject(JSON.parseObject(res.getData()).toJSONString(), CancelOrderModel.class);
} }
...@@ -131,7 +132,7 @@ public class HotelServiceImpl implements IHotelService { ...@@ -131,7 +132,7 @@ public class HotelServiceImpl implements IHotelService {
JSON.toJSONString(model) JSON.toJSONString(model)
); );
if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) { if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) {
throw new RuntimeException(res.getTips()); throw new YunShangException(res.getTips());
} }
return true; return true;
} }
...@@ -146,7 +147,7 @@ public class HotelServiceImpl implements IHotelService { ...@@ -146,7 +147,7 @@ public class HotelServiceImpl implements IHotelService {
JSON.toJSONString(model) JSON.toJSONString(model)
); );
if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) { if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) {
throw new RuntimeException(res.getTips()); throw new YunShangException(res.getTips());
} }
return JSON.parseObject(JSON.parseObject(res.getData()).toJSONString(), HotelOrderQueryDetailModel.class); return JSON.parseObject(JSON.parseObject(res.getData()).toJSONString(), HotelOrderQueryDetailModel.class);
} }
...@@ -161,7 +162,7 @@ public class HotelServiceImpl implements IHotelService { ...@@ -161,7 +162,7 @@ public class HotelServiceImpl implements IHotelService {
JSON.toJSONString(model) JSON.toJSONString(model)
); );
if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) { if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) {
throw new RuntimeException(res.getTips()); throw new YunShangException(res.getTips());
} }
if (res.getData() == null) { if (res.getData() == null) {
return PageInfo.<HotelOrderQueryListModel>builder().build() return PageInfo.<HotelOrderQueryListModel>builder().build()
...@@ -192,7 +193,7 @@ public class HotelServiceImpl implements IHotelService { ...@@ -192,7 +193,7 @@ public class HotelServiceImpl implements IHotelService {
JSON.toJSONString(model) JSON.toJSONString(model)
); );
if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) { if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) {
throw new RuntimeException(res.getTips()); throw new YunShangException(res.getTips());
} }
return JSON.parseArray(JSON.parseObject(res.getData()).getString("orderGather"), HtOrderInfoModel.class); return JSON.parseArray(JSON.parseObject(res.getData()).getString("orderGather"), HtOrderInfoModel.class);
} }
...@@ -207,7 +208,7 @@ public class HotelServiceImpl implements IHotelService { ...@@ -207,7 +208,7 @@ public class HotelServiceImpl implements IHotelService {
JSON.toJSONString(model) JSON.toJSONString(model)
); );
if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) { if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) {
throw new RuntimeException(res.getTips()); throw new YunShangException(res.getTips());
} }
return JSON.parseArray(JSON.parseObject(res.getData()).getString("orderGather"), HtRefundInfoModel.class); return JSON.parseArray(JSON.parseObject(res.getData()).getString("orderGather"), HtRefundInfoModel.class);
} }
...@@ -222,7 +223,7 @@ public class HotelServiceImpl implements IHotelService { ...@@ -222,7 +223,7 @@ public class HotelServiceImpl implements IHotelService {
JSON.toJSONString(model) JSON.toJSONString(model)
); );
if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) { if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) {
throw new RuntimeException(res.getTips()); throw new YunShangException(res.getTips());
} }
return JSON.parseObject(JSON.parseObject(res.getData()).toJSONString(), HotelOrderXjdModel.class); return JSON.parseObject(JSON.parseObject(res.getData()).toJSONString(), HotelOrderXjdModel.class);
} }
......
...@@ -7,6 +7,7 @@ import org.dromara.common.ys.common.ApiHttpResponse; ...@@ -7,6 +7,7 @@ import org.dromara.common.ys.common.ApiHttpResponse;
import org.dromara.common.ys.common.Code; import org.dromara.common.ys.common.Code;
import org.dromara.common.ys.enums.DomainEnum; import org.dromara.common.ys.enums.DomainEnum;
import org.dromara.common.ys.enums.insurance.InsuranceApiEnum; import org.dromara.common.ys.enums.insurance.InsuranceApiEnum;
import org.dromara.common.ys.exception.YunShangException;
import org.dromara.common.ys.model.req.insurance.BxcpModel; import org.dromara.common.ys.model.req.insurance.BxcpModel;
import org.dromara.common.ys.service.IInsuranceService; import org.dromara.common.ys.service.IInsuranceService;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
...@@ -31,7 +32,7 @@ public class InsuranceServiceImpl implements IInsuranceService { ...@@ -31,7 +32,7 @@ public class InsuranceServiceImpl implements IInsuranceService {
JSON.toJSONString(model) JSON.toJSONString(model)
); );
if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) { if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) {
throw new RuntimeException(res.getTips()); throw new YunShangException(res.getTips());
} }
return JSON.parseArray(JSON.parseObject(res.getData()).getString("cpList"), org.dromara.common.ys.model.res.insurance.BxcpModel.class); return JSON.parseArray(JSON.parseObject(res.getData()).getString("cpList"), org.dromara.common.ys.model.res.insurance.BxcpModel.class);
} }
......
...@@ -7,8 +7,9 @@ import org.dromara.common.ys.common.ApiHttpResponse; ...@@ -7,8 +7,9 @@ import org.dromara.common.ys.common.ApiHttpResponse;
import org.dromara.common.ys.common.Code; import org.dromara.common.ys.common.Code;
import org.dromara.common.ys.enums.DomainEnum; import org.dromara.common.ys.enums.DomainEnum;
import org.dromara.common.ys.enums.org.OrgApiEnum; import org.dromara.common.ys.enums.org.OrgApiEnum;
import org.dromara.common.ys.service.IOrgService; import org.dromara.common.ys.exception.YunShangException;
import org.dromara.common.ys.model.req.org.EditEmployeeModel; import org.dromara.common.ys.model.req.org.EditEmployeeModel;
import org.dromara.common.ys.service.IOrgService;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
/** /**
...@@ -29,7 +30,7 @@ public class OrgServiceImpl implements IOrgService { ...@@ -29,7 +30,7 @@ public class OrgServiceImpl implements IOrgService {
JSON.toJSONString(model) JSON.toJSONString(model)
); );
if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) { if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) {
throw new RuntimeException(res.getTips()); throw new YunShangException(res.getTips());
} }
return true; return true;
} }
......
...@@ -8,6 +8,7 @@ import org.dromara.common.ys.common.Code; ...@@ -8,6 +8,7 @@ import org.dromara.common.ys.common.Code;
import org.dromara.common.ys.common.PageInfo; import org.dromara.common.ys.common.PageInfo;
import org.dromara.common.ys.enums.DomainEnum; import org.dromara.common.ys.enums.DomainEnum;
import org.dromara.common.ys.enums.qz.QzApiEnum; import org.dromara.common.ys.enums.qz.QzApiEnum;
import org.dromara.common.ys.exception.YunShangException;
import org.dromara.common.ys.model.req.qz.*; import org.dromara.common.ys.model.req.qz.*;
import org.dromara.common.ys.model.res.qz.GetAssociatDetailModel; import org.dromara.common.ys.model.res.qz.GetAssociatDetailModel;
import org.dromara.common.ys.model.res.qz.GetProdDetailModel; import org.dromara.common.ys.model.res.qz.GetProdDetailModel;
...@@ -36,7 +37,7 @@ public class QzServiceImpl implements IQzService { ...@@ -36,7 +37,7 @@ public class QzServiceImpl implements IQzService {
JSON.toJSONString(model) JSON.toJSONString(model)
); );
if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) { if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) {
throw new RuntimeException(res.getTips()); throw new YunShangException(res.getTips());
} }
if (res.getData() == null) { if (res.getData() == null) {
return PageInfo.<VisaProdBeanModel>builder().build() return PageInfo.<VisaProdBeanModel>builder().build()
...@@ -67,7 +68,7 @@ public class QzServiceImpl implements IQzService { ...@@ -67,7 +68,7 @@ public class QzServiceImpl implements IQzService {
JSON.toJSONString(model) JSON.toJSONString(model)
); );
if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) { if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) {
throw new RuntimeException(res.getTips()); throw new YunShangException(res.getTips());
} }
if (res.getData() == null) { if (res.getData() == null) {
return PageInfo.<AssocitionBeanModel>builder().build() return PageInfo.<AssocitionBeanModel>builder().build()
...@@ -98,7 +99,7 @@ public class QzServiceImpl implements IQzService { ...@@ -98,7 +99,7 @@ public class QzServiceImpl implements IQzService {
JSON.toJSONString(model) JSON.toJSONString(model)
); );
if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) { if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) {
throw new RuntimeException(res.getTips()); throw new YunShangException(res.getTips());
} }
if (res.getData() == null) { if (res.getData() == null) {
return PageInfo.<OrderListBeanModel>builder().build() return PageInfo.<OrderListBeanModel>builder().build()
...@@ -129,7 +130,7 @@ public class QzServiceImpl implements IQzService { ...@@ -129,7 +130,7 @@ public class QzServiceImpl implements IQzService {
JSON.toJSONString(model) JSON.toJSONString(model)
); );
if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) { if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) {
throw new RuntimeException(res.getTips()); throw new YunShangException(res.getTips());
} }
return JSON.parseObject(JSON.parseObject(res.getData()).toJSONString(), GetProdDetailModel.class); return JSON.parseObject(JSON.parseObject(res.getData()).toJSONString(), GetProdDetailModel.class);
} }
...@@ -144,7 +145,7 @@ public class QzServiceImpl implements IQzService { ...@@ -144,7 +145,7 @@ public class QzServiceImpl implements IQzService {
JSON.toJSONString(model) JSON.toJSONString(model)
); );
if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) { if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) {
throw new RuntimeException(res.getTips()); throw new YunShangException(res.getTips());
} }
return JSON.parseObject(JSON.parseObject(res.getData()).toJSONString(), QzOrderGetDetailModel.class); return JSON.parseObject(JSON.parseObject(res.getData()).toJSONString(), QzOrderGetDetailModel.class);
} }
...@@ -159,7 +160,7 @@ public class QzServiceImpl implements IQzService { ...@@ -159,7 +160,7 @@ public class QzServiceImpl implements IQzService {
JSON.toJSONString(model) JSON.toJSONString(model)
); );
if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) { if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) {
throw new RuntimeException(res.getTips()); throw new YunShangException(res.getTips());
} }
} }
...@@ -173,7 +174,7 @@ public class QzServiceImpl implements IQzService { ...@@ -173,7 +174,7 @@ public class QzServiceImpl implements IQzService {
JSON.toJSONString(model) JSON.toJSONString(model)
); );
if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) { if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) {
throw new RuntimeException(res.getTips()); throw new YunShangException(res.getTips());
} }
return JSON.parseObject(JSON.parseObject(res.getData()).toJSONString(), GetAssociatDetailModel.class); return JSON.parseObject(JSON.parseObject(res.getData()).toJSONString(), GetAssociatDetailModel.class);
} }
...@@ -188,7 +189,7 @@ public class QzServiceImpl implements IQzService { ...@@ -188,7 +189,7 @@ public class QzServiceImpl implements IQzService {
JSON.toJSONString(model) JSON.toJSONString(model)
); );
if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) { if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) {
throw new RuntimeException(res.getTips()); throw new YunShangException(res.getTips());
} }
return JSON.parseArray(JSON.parseObject(res.getData()).getString("newAppointmentBeans"), NewAppointmentBeanModel.class); return JSON.parseArray(JSON.parseObject(res.getData()).getString("newAppointmentBeans"), NewAppointmentBeanModel.class);
} }
...@@ -203,7 +204,7 @@ public class QzServiceImpl implements IQzService { ...@@ -203,7 +204,7 @@ public class QzServiceImpl implements IQzService {
JSON.toJSONString(model) JSON.toJSONString(model)
); );
if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) { if (!CharSequenceUtil.equals(res.getErrCode(), Code.SUCCESS.getCode())) {
throw new RuntimeException(res.getTips()); throw new YunShangException(res.getTips());
} }
} }
} }
差异被折叠。
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论