diff --git a/smart-switch-ruoyi/smart-switch-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java b/smart-switch-ruoyi/smart-switch-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java index 5731eb35..8d4e3c02 100644 --- a/smart-switch-ruoyi/smart-switch-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java +++ b/smart-switch-ruoyi/smart-switch-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java @@ -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); // 添加微信账户 diff --git a/smart-switch-ruoyi/smart-switch-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java b/smart-switch-ruoyi/smart-switch-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java index 8bd467c6..ee621ba3 100644 --- a/smart-switch-ruoyi/smart-switch-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java +++ b/smart-switch-ruoyi/smart-switch-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java @@ -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)) { diff --git a/smart-switch-ruoyi/smart-switch-system/src/main/java/com/ruoyi/system/domain/enums/config/ConfigKey.java b/smart-switch-ruoyi/smart-switch-system/src/main/java/com/ruoyi/system/domain/enums/config/ConfigKey.java index 94073267..99f27b9e 100644 --- a/smart-switch-ruoyi/smart-switch-system/src/main/java/com/ruoyi/system/domain/enums/config/ConfigKey.java +++ b/smart-switch-ruoyi/smart-switch-system/src/main/java/com/ruoyi/system/domain/enums/config/ConfigKey.java @@ -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; diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/impl/DeviceValidatorImpl.java b/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/impl/DeviceValidatorImpl.java index d3b166c5..0ccdf0d2 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/impl/DeviceValidatorImpl.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/impl/DeviceValidatorImpl.java @@ -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; diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/domain/TransactionBill.java b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/domain/TransactionBill.java index 3f8483a7..152ad28f 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/domain/TransactionBill.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/domain/TransactionBill.java @@ -311,6 +311,10 @@ public class TransactionBill extends BaseEntity implements Payable @JsonView(JsonViewProfile.App.class) private BigDecimal suitDeposit; + @Excel(name = "设备开启状态描述") + @ApiModelProperty("设备开启状态描述") + private String openMsg; + /** * 获取价格(分) */ diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/mapper/TransactionBillMapper.java b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/mapper/TransactionBillMapper.java index a01bc3c7..0582d9cb 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/mapper/TransactionBillMapper.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/mapper/TransactionBillMapper.java @@ -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); /** * 修改设备充值状态 diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/mapper/TransactionBillMapper.xml b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/mapper/TransactionBillMapper.xml index 5dac583c..87aad417 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/mapper/TransactionBillMapper.xml +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/mapper/TransactionBillMapper.xml @@ -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, @@ -199,6 +200,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and stb.agent_mobile like concat('%', #{query.agentMobile}, '%') and stb.suit_enabled_void = #{query.suitEnabledVoid} and stb.suit_void_result = #{query.suitVoidResult} + and stb.open_msg like concat('%', #{query.openMsg}, '%') and @@ -482,6 +484,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" suit_void_result, suit_void_msg, suit_deposit, + open_msg, #{billNo}, @@ -547,6 +550,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{suitVoidResult}, #{suitVoidMsg}, #{suitDeposit}, + #{openMsg}, @@ -629,7 +633,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" stb.suit_void_minute = #{data.suitVoidMinute}, stb.suit_void_result = #{data.suitVoidResult}, stb.suit_void_msg = #{data.suitVoidMsg}, - suit_deposit = #{data.suitDeposit}, + stb.suit_deposit = #{data.suitDeposit}, + stb.open_msg = #{data.openMsg}, @@ -724,8 +729,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 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') diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/service/impl/RechargeDepositAfterPay.java b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/service/impl/RechargeDepositAfterPay.java index 6f4c712e..5e678c4d 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/service/impl/RechargeDepositAfterPay.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/service/impl/RechargeDepositAfterPay.java @@ -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); + } + } } diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/service/impl/RechargePayHandler.java b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/service/impl/RechargePayHandler.java index 8c668432..1f1d77e7 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/service/impl/RechargePayHandler.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/service/impl/RechargePayHandler.java @@ -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; diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/service/impl/TransactionBillServiceImpl.java b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/service/impl/TransactionBillServiceImpl.java index 4066c5ed..1d6cf19a 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/service/impl/TransactionBillServiceImpl.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/service/impl/TransactionBillServiceImpl.java @@ -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 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, "修改剩余时间失败");