Merge remote-tracking branch 'origin/master' into dev

# Conflicts:
#	smart-switch-ruoyi/smart-switch-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java
This commit is contained in:
墨大叔 2024-10-14 08:36:19 +08:00
commit 32ed751e3d
10 changed files with 86 additions and 25 deletions

View File

@ -17,6 +17,8 @@ import com.ruoyi.ss.store.service.StoreService;
import com.ruoyi.ss.user.service.ISmUserService;
import com.ruoyi.ss.account.service.AccountService;
import com.ruoyi.ss.account.domain.enums.AccountType;
import com.ruoyi.system.domain.SysConfig;
import com.ruoyi.system.domain.enums.config.ConfigKey;
import com.ruoyi.system.service.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
@ -85,6 +87,9 @@ public class SysLoginService
@Autowired
private WxAuthService wxAuthService;
@Autowired
private ISysConfigService sysConfigService;
/**
* 登录验证
*
@ -255,20 +260,32 @@ public class SysLoginService
* 微信登录
*/
@Transactional
public String wxLogin(String openId) {
public String wxLogin(WxLoginBody body) {
// 通过openId查询用户判断是否微信用户
// 通过登录授权码获取到用户信息
WxMaJscode2SessionResult wxMaJscode2SessionResult = wxAuthService.wxJsCode2Session(body.getLoginCode());
ServiceUtil.assertion(wxMaJscode2SessionResult == null, "获取微信openId失败");
// 通过openId查询用户
String openId = wxMaJscode2SessionResult.getOpenid();
SmUser user = smUserService.selectSmUserByWxOpenId(openId);
// 不是微信用户则使用openId进行注册
// 若用户不存在则使用openId进行注册
if (user == null || Objects.equals(user.getDelFlag(), UserStatus.DELETED.getCode())) {
user = registerWx(openId);
// 获取手机号
boolean loginWithPhone = sysConfigService.getBoolean(ConfigKey.ARRIVAL_DELAY);
String mobile = null;
if (loginWithPhone && StringUtils.hasText(body.getMobileCode())) {
mobile = this.getWxPhoneNumber(body.getMobileCode());
}
// 用户注册
user = registerWx(openId, mobile);
}
ServiceUtil.assertion(user == null, "用户不存在");
Authentication authentication = null;
try {
UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(openId, Constants.CUSTOM_LOGIN_WX);
UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(user.getUserId(), Constants.CUSTOM_LOGIN_WX);
// 用户名和密码等信息保存在一个上下文中只要是同一线程等会就能拿到用户名和密码也就是能在loadUserByUsername(String username)方法中进行密码验证等
AuthenticationContextHolder.setContext(authenticationToken);
// 把用户登录类型放在上下文中的details属性中在UserDetailsServiceImpl.loadUserByUsername中获取
@ -293,7 +310,7 @@ public class SysLoginService
* 注册微信用户
* @param openId 微信OpenId
*/
private SmUser registerWx(String openId) {
private SmUser registerWx(String openId, String mobile) {
if (StringUtils.isBlank(openId)) {
return null;
}
@ -304,6 +321,7 @@ public class SysLoginService
SmUser newUser = new SmUser();
newUser.setUserName(name);
newUser.setWxOpenId(openId);
newUser.setPhonenumber(mobile);
smUserService.insertSmUser(newUser);
// 添加微信账户

View File

@ -60,7 +60,7 @@ public class UserDetailsServiceImpl implements UserDetailsService
return createLoginUser(user);
} else if(Constants.USER_TYPE_WX.equals(userType)) {
// app 用户微信登录
SmUser user = smUserService.selectSmUserByWxOpenId(username);
SmUser user = smUserService.selectSmUserByUserId(Long.parseLong(username));
this.checkUser(user, username);
return createLoginUser(user);
} else if(Constants.USER_TYPE_APP.equals(userType)) {

View File

@ -25,7 +25,8 @@ public enum ConfigKey {
ORDER_AUTO_CLOSE_CD("order.auto.close.cd", "订单自动关闭冷却时间(分)"),
RISK_WITHDRAW_TIME("risk.withdraw.time", "风控订单和提现相隔时长(分钟)"),
RISK_WITHDRAW_COUNT("risk.withdraw.count", "累计风险次数"),
RISK_WITHDRAW_ENABLED("risk.withdraw.enabled", "是否开启提现风控");
RISK_WITHDRAW_ENABLED("risk.withdraw.enabled", "是否开启提现风控"),
LOGIN_WITH_PHONE("login.with.phone", "登录是否需要手机号");
private final String key;
private final String msg;

View File

@ -12,6 +12,7 @@ import com.ruoyi.ss.device.domain.enums.DeviceServiceMode;
import com.ruoyi.ss.device.domain.vo.DeviceVO;
import com.ruoyi.ss.device.service.DeviceService;
import com.ruoyi.ss.device.service.DeviceValidator;
import com.ruoyi.ss.model.domain.enums.ModelTag;
import com.ruoyi.ss.store.service.StoreValidator;
import com.ruoyi.ss.suit.service.SuitValidator;
import org.eclipse.jetty.util.StringUtil;

View File

@ -311,6 +311,10 @@ public class TransactionBill extends BaseEntity implements Payable
@JsonView(JsonViewProfile.App.class)
private BigDecimal suitDeposit;
@Excel(name = "设备开启状态描述")
@ApiModelProperty("设备开启状态描述")
private String openMsg;
/**
* 获取价格
*/

View File

@ -134,7 +134,7 @@ public interface TransactionBillMapper
*/
int paying(Long billId);
int updateDeviceRechargeStatus(@Param("billId") Long billId, @Param("status") String status);
int updateDeviceRechargeStatus(@Param("billId") Long billId, @Param("status") String status, @Param("openMsg") String openMsg);
/**
* 修改设备充值状态

View File

@ -77,6 +77,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
stb.suit_void_result,
stb.suit_void_msg,
stb.suit_deposit,
stb.open_msg,
</sql>
<sql id="selectSmTransactionBillVo">
@ -199,6 +200,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="query.agentMobile != null and query.agentMobile != ''"> and stb.agent_mobile like concat('%', #{query.agentMobile}, '%')</if>
<if test="query.suitEnabledVoid != null "> and stb.suit_enabled_void = #{query.suitEnabledVoid}</if>
<if test="query.suitVoidResult != null and query.suitVoidResult != ''"> and stb.suit_void_result = #{query.suitVoidResult}</if>
<if test="query.openMsg != null and query.openMsg != ''"> and stb.open_msg like concat('%', #{query.openMsg}, '%')</if>
<if test="query.isUsing != null">
<if test="query.isUsing">
and <include refid="isUsing"/>
@ -482,6 +484,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="suitVoidResult != null">suit_void_result,</if>
<if test="suitVoidMsg != null">suit_void_msg,</if>
<if test="suitDeposit != null">suit_deposit,</if>
<if test="openMsg != null">open_msg,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="billNo != null">#{billNo},</if>
@ -547,6 +550,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="suitVoidResult != null">#{suitVoidResult},</if>
<if test="suitVoidMsg != null">#{suitVoidMsg},</if>
<if test="suitDeposit != null">#{suitDeposit},</if>
<if test="openMsg != null">#{openMsg},</if>
</trim>
</insert>
@ -629,7 +633,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="data.suitVoidMinute != null">stb.suit_void_minute = #{data.suitVoidMinute},</if>
<if test="data.suitVoidResult != null">stb.suit_void_result = #{data.suitVoidResult},</if>
<if test="data.suitVoidMsg != null">stb.suit_void_msg = #{data.suitVoidMsg},</if>
<if test="data.suitDeposit != null">suit_deposit = #{data.suitDeposit},</if>
<if test="data.suitDeposit != null">stb.suit_deposit = #{data.suitDeposit},</if>
<if test="data.openMsg != null">stb.open_msg = #{data.openMsg},</if>
</sql>
<update id="updateByQuery">
@ -724,8 +729,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<update id="updateDeviceRechargeStatus">
update sm_transaction_bill
set device_recharge_status = #{status}
where bill_id = #{billId} and `type` = '1' and device_recharge_status not in('1', '3')
set device_recharge_status = #{status},
open_msg = #{openMsg}
where bill_id = #{billId}
and `type` = '1'
and device_recharge_status not in('1', '3')
</update>
<update id="updateDeviceRechargeStatusByIds">

View File

@ -9,6 +9,7 @@ import com.ruoyi.ss.payBill.domain.PayBillVO;
import com.ruoyi.ss.payBill.interfaces.AfterPay;
import com.ruoyi.ss.transactionBill.domain.TransactionBill;
import com.ruoyi.ss.transactionBill.domain.TransactionBillQuery;
import com.ruoyi.ss.transactionBill.domain.enums.TransactionBillDeviceRechargeStatus;
import com.ruoyi.ss.transactionBill.domain.enums.TransactionBillStatus;
import com.ruoyi.ss.transactionBill.domain.vo.TransactionBillVO;
import com.ruoyi.ss.transactionBill.service.TransactionBillService;
@ -58,21 +59,36 @@ public class RechargeDepositAfterPay implements AfterPay {
data.setStatus(TransactionBillStatus.SUCCESS_DEPOSIT.getStatus());
data.setDepositPayId(payBill.getPayId());
data.setPayTime(DateUtils.toDate(payBill.getPayTime()));
data.setDeviceRechargeStatus(TransactionBillDeviceRechargeStatus.SUCCESS.getStatus());
data.setOpenMsg("成功");
TransactionBillQuery query = new TransactionBillQuery();
query.setBillId(bill.getBillId());
query.setStatus(TransactionBillStatus.UNPAID_DEPOSIT.getStatus());
int update = transactionBillService.updateByQuery(data, query);
ServiceUtil.assertion(update != 1, "修改订单信息失败,状态已经发生改变:%s", bill.getBillNo());
try {
iotService.open(device);
} catch (Exception e) {
log.error(e.getMessage());
}
this.openDevice(bill.getBillId(), device);
return update;
});
return result == null ? 0 : result;
}
/**
* 开启设备
*/
private int openDevice(Long billId, DeviceVO device) {
try {
iotService.open(device);
return 1;
} catch (Exception e) {
log.error(e.getMessage());
TransactionBill data = new TransactionBill();
data.setDeviceRechargeStatus(TransactionBillDeviceRechargeStatus.FAIL.getStatus());
data.setOpenMsg(e.getMessage());
data.setBillId(billId);
return transactionBillService.updateSmTransactionBill(data);
}
}
}

View File

@ -15,6 +15,7 @@ import com.ruoyi.ss.suit.domain.enums.SuitFeeType;
import com.ruoyi.ss.transactionBill.domain.TransactionBill;
import com.ruoyi.ss.transactionBill.domain.TransactionBillQuery;
import com.ruoyi.ss.transactionBill.domain.bo.PaySuccessBO;
import com.ruoyi.ss.transactionBill.domain.enums.TransactionBillDeviceRechargeStatus;
import com.ruoyi.ss.transactionBill.domain.enums.TransactionBillStatus;
import com.ruoyi.ss.transactionBill.domain.enums.TransactionBillType;
import com.ruoyi.ss.transactionBill.domain.vo.TransactionBillVO;

View File

@ -74,6 +74,7 @@ import java.time.LocalDateTime;
import java.util.*;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Function;
import java.util.stream.Collectors;
@ -846,23 +847,25 @@ public class TransactionBillServiceImpl implements TransactionBillService, After
ServiceUtil.assertion(TransactionBillDeviceRechargeStatus.BLUETOOTH.getStatus().equals(bill.getDeviceRechargeStatus()), "设备已选择蓝牙充值,请使用蓝牙进行充值");
// 设备开启状态描述
AtomicReference<String> openMsg = new AtomicReference<>("成功");
Boolean result = transactionTemplate.execute(status -> {
// 刷新设备数据
deviceService.pullDeviceInfo(bill.getDeviceId());
DeviceVO device = deviceService.selectById(bill.getDeviceId());
// 如果设备离线则直接返回失败
if (DeviceOnlineStatus.OFFLINE.getStatus().equals(device.getOnlineStatus())) {
return false;
}
// 更新套餐使用信息
int updateInfo = this.updateSuitInfoBeforeDevice(bill, device);
ServiceUtil.assertion(updateInfo != 1, "更新套餐使用信息失败");
// 修改设备充值状态成功
int updateRecharge = transactionBillMapper.updateDeviceRechargeStatus(bill.getBillId(), TransactionBillDeviceRechargeStatus.SUCCESS.getStatus());
int updateRecharge = transactionBillMapper.updateDeviceRechargeStatus(
bill.getBillId(),
TransactionBillDeviceRechargeStatus.SUCCESS.getStatus(),
openMsg.get()
);
ServiceUtil.assertion(updateRecharge != 1, "设备充值状态发生变化,请稍后重试");
try {
@ -886,6 +889,7 @@ public class TransactionBillServiceImpl implements TransactionBillService, After
} catch (Exception e) {
// 失败回滚
status.setRollbackOnly();
openMsg.set(e.getMessage());
return false;
}
});
@ -898,7 +902,11 @@ public class TransactionBillServiceImpl implements TransactionBillService, After
this.recordTime(bill, "用户充值订单:" + bill.getBillNo());
} else {
// 修改设备充值状态为失败
transactionBillMapper.updateDeviceRechargeStatus(billId, TransactionBillDeviceRechargeStatus.FAIL.getStatus());
transactionBillMapper.updateDeviceRechargeStatus(
billId,
TransactionBillDeviceRechargeStatus.FAIL.getStatus(),
openMsg.get()
);
}
return success;
@ -1356,6 +1364,9 @@ public class TransactionBillServiceImpl implements TransactionBillService, After
// 计算智能时长的使用金额
private BigDecimal calcSmartTimeAmount(TransactionBillVO order, LocalDateTime endTime) {
LocalDateTime startTime = order.getSuitStartTime();
if (startTime == null) {
startTime = LocalDateTime.now();
}
Duration between = Duration.between(startTime, endTime);
SuitTimeUnit unit = SuitTimeUnit.getByValue(order.getSuitTimeUnit());
@ -1614,6 +1625,7 @@ public class TransactionBillServiceImpl implements TransactionBillService, After
// 更新设备充值状态
TransactionBill data = new TransactionBill();
data.setDeviceRechargeStatus(TransactionBillDeviceRechargeStatus.SUCCESS.getStatus());
data.setOpenMsg("蓝牙充值成功");
TransactionBillQuery query = new TransactionBillQuery();
query.setBillId(bill.getBillId());
query.setType(TransactionBillType.RECHARGE.getType());
@ -1627,7 +1639,7 @@ public class TransactionBillServiceImpl implements TransactionBillService, After
int updateInfo = this.updateSuitInfoBeforeDevice(bill, device);
ServiceUtil.assertion(updateInfo != 1, "更新套餐使用信息失败");
// 修改剩余时间失败
// 修改剩余时间
boolean addTime = deviceService.addTime(bill.getDeviceId(), transactionBillConverter.toRechargeSeconds(bill), false);
ServiceUtil.assertion(!addTime, "修改剩余时间失败");