押金不足时先退押金,再充值

This commit is contained in:
邱贞招 2024-11-21 10:05:08 +08:00
parent 9ab83f4607
commit ef093e84c3
6 changed files with 139 additions and 88 deletions

View File

@ -242,11 +242,11 @@ public class AppVerifyController extends BaseController
return error("当前车辆有骑行中的订单,请换车");
}
//根据余额和充值记录判断是否有充值过押金没有充值过押金提示充值押金
if(!asUserService.checkIsDeposit(order.getUserId())){
if(!asUserService.checkIsDeposit(order.getUserId(),area.getAreaId())){
return error("您还未充值押金,请先充值押金");
}
logger.info("【扫码/编号开锁骑行】请求:{}", JSON.toJSON(order));
if(etOrderService.isInOrder(order.getUserId(),order.getOrderNo()).size()>0){
if(!etOrderService.isInOrder(order.getUserId(), order.getOrderNo()).isEmpty()){
return error("您有未完成的订单,请先完成订单");
}
//低电量不得骑行判断
@ -368,7 +368,7 @@ public class AppVerifyController extends BaseController
etOrder.setStatus(ServiceConstants.ORDER_STATUS_ORDER_END);
etOrder.setPaid(ServiceConstants.ORDER_PAY_STATUS_PAID);
List<EtOrder> etOrders = etOrderMapper.selectEtOrderList(etOrder);
if(etOrders.size()==0){
if(etOrders.isEmpty()){
throw new ServiceException("提现失败,未找到押金订单");
}
List<EtOrder> inOrder = etOrderService.isInOrder(etOrder.getUserId(), null);
@ -428,48 +428,48 @@ public class AppVerifyController extends BaseController
return etOrderService.withdraw(etOrder1,etOrder1.getTotalFee());
}
/**
* 车辆预约
*/
@Log(title = "车辆预约", businessType = BusinessType.APPOINTMENT)
@PostMapping("/device/appointment")
public AjaxResult deviceAppointment(EtOrderVo appointmentVo)
{
logger.info("【车辆预约信息】:{}", JSON.toJSON(appointmentVo));
AsDevice asDevice = asDeviceService.selectAsDeviceBySn(appointmentVo.getSn());
//设备是否在线
if(!asDeviceService.isOnline(appointmentVo.getSn())){
return error("设备不在线");
}
EtOperatingArea area = etOperatingAreaService.selectEtOperatingAreaByAreaId(asDevice.getAreaId());
//实名判断
if(area.getAuthentication().equals(ServiceConstants.IS_AUTHENTICATION_YES) && !asUserService.checkIsAuthentication(appointmentVo.getUserId())){
return error("您还未实名,请先实名");
}
//运营时间判断
if(!asDeviceService.isOperatingTime(appointmentVo.getSn())){
return error("不在营业时间内,不得骑行");
}
if(etOrderService.isInOrder(appointmentVo.getUserId(),appointmentVo.getOrderNo()).size()>0){
throw new ServiceException("您有未完成的订单,请先完成订单");
}
//根据余额和充值记录判断是否有充值过押金没有充值过押金提示充值押金
if(!asUserService.checkIsDeposit(appointmentVo.getUserId())){
throw new ServiceException("您还未充值押金,请先充值押金");
}
//检验预约订单只能有一个
if(etOrderService.checkIsUnique(appointmentVo.getUserId())){
throw new ServiceException("您有预约中的订单,请务重复操作");
}
appointmentVo.setType("2");
String status = asDevice.getStatus();
if(!ServiceConstants.VEHICLE_STATUS_NORMAL.equals(status)){
//根据状态值返回不同的提示
return error(CommonUtil.format(status));
}
OrderResponse orderResponse = asDeviceService.deviceAppointment(appointmentVo);
return success(orderResponse);
}
// /**
// * 车辆预约
// */
// @Log(title = "车辆预约", businessType = BusinessType.APPOINTMENT)
// @PostMapping("/device/appointment")
// public AjaxResult deviceAppointment(EtOrderVo appointmentVo)
// {
// logger.info("【车辆预约信息】:{}", JSON.toJSON(appointmentVo));
// AsDevice asDevice = asDeviceService.selectAsDeviceBySn(appointmentVo.getSn());
// //设备是否在线
// if(!asDeviceService.isOnline(appointmentVo.getSn())){
// return error("设备不在线");
// }
// EtOperatingArea area = etOperatingAreaService.selectEtOperatingAreaByAreaId(asDevice.getAreaId());
// //实名判断
// if(area.getAuthentication().equals(ServiceConstants.IS_AUTHENTICATION_YES) && !asUserService.checkIsAuthentication(appointmentVo.getUserId())){
// return error("您还未实名,请先实名");
// }
// //运营时间判断
// if(!asDeviceService.isOperatingTime(appointmentVo.getSn())){
// return error("不在营业时间内,不得骑行");
// }
// if(etOrderService.isInOrder(appointmentVo.getUserId(),appointmentVo.getOrderNo()).size()>0){
// throw new ServiceException("您有未完成的订单,请先完成订单");
// }
// //根据余额和充值记录判断是否有充值过押金没有充值过押金提示充值押金
// if(!asUserService.checkIsDeposit(appointmentVo.getUserId())){
// throw new ServiceException("您还未充值押金,请先充值押金");
// }
// //检验预约订单只能有一个
// if(etOrderService.checkIsUnique(appointmentVo.getUserId())){
// throw new ServiceException("您有预约中的订单,请务重复操作");
// }
// appointmentVo.setType("2");
// String status = asDevice.getStatus();
// if(!ServiceConstants.VEHICLE_STATUS_NORMAL.equals(status)){
// //根据状态值返回不同的提示
// return error(CommonUtil.format(status));
// }
// OrderResponse orderResponse = asDeviceService.deviceAppointment(appointmentVo);
// return success(orderResponse);
// }
/**
@ -866,7 +866,7 @@ public class AppVerifyController extends BaseController
@GetMapping(value = "/checkIsDeposit")
public AjaxResult checkIsDeposit(Long userId)
{
Boolean aBoolean = asUserService.checkIsDeposit(userId);
Boolean aBoolean = asUserService.checkIsDeposit(userId,null);
return AjaxResult.success("操作成功",aBoolean);
}

View File

@ -199,7 +199,7 @@ public interface IAsUserService
* 检测用户是否有充值过押金
* @param userId
*/
public Boolean checkIsDeposit(Long userId);
public Boolean checkIsDeposit(Long userId,Long areaId);
/**
* 新增用户

View File

@ -889,6 +889,9 @@ public class AsDeviceServiceImpl extends ServiceImpl<AsDeviceMapper, AsDevice> i
/** 2.发送命令*/
ResponseVo responseVo = sendCommandWithResp(asDevice.getMac(), token, IotConstants.COMMAND_OPEN+IotConstants.COMMAND_FREQUENCY_5, "编号开锁", finalOrderNo);
if(responseVo.getCode() != 0){
// todo asDevice.getMac()
log.info("【扫码/编号开锁骑行】发送开锁命令失败,通过api重新查询状态");
throw new ServiceException("【扫码/编号开锁骑行】发送开锁命令失败");
}
}else{

View File

@ -1,6 +1,7 @@
package com.ruoyi.system.service.impl;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson2.JSON;
import com.ruoyi.common.annotation.DataScope;
import com.ruoyi.common.constant.CacheConstants;
import com.ruoyi.common.constant.ServiceConstants;
@ -8,25 +9,27 @@ import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.domain.entity.AsUser;
import com.ruoyi.common.core.domain.entity.EtOrderDto;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.core.domain.vo.LabelVo;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.common.utils.bean.BeanValidators;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.common.utils.uuid.IdUtils;
import com.ruoyi.common.utils.verify.VerifyIdentityUtil;
import com.ruoyi.system.domain.EtOnlineLog;
import com.ruoyi.system.domain.EtOperatingArea;
import com.ruoyi.system.domain.EtOrder;
import com.ruoyi.system.domain.EtRefund;
import com.ruoyi.system.domain.vo.AuthenticationVo;
import com.ruoyi.system.mapper.AsUserMapper;
import com.ruoyi.system.mapper.EtOrderMapper;
import com.ruoyi.system.mapper.SysUserMapper;
import com.ruoyi.system.service.IAsUserService;
import com.ruoyi.system.service.IEtOperatingAreaService;
import com.ruoyi.system.service.IEtOrderService;
import com.ruoyi.system.service.ISysConfigService;
import com.ruoyi.system.service.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@ -39,6 +42,8 @@ import javax.validation.Validator;
import java.math.BigDecimal;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
* 用户 业务层处理
@ -80,6 +85,20 @@ public class AsUserServiceImpl implements IAsUserService
@Value("${et.appcode}")
private String appcode;
@Autowired
private IWxPayService wxPayService;
@Autowired
private IEtRefundService etRefundService;
@Autowired
private ScheduledExecutorService scheduledExecutorService;
@Autowired
private IAsUserService asUserService;
/**
* 根据条件分页查询用户列表
*
@ -463,35 +482,64 @@ public class AsUserServiceImpl implements IAsUserService
* @param userId
*/
@Override
public Boolean checkIsDeposit(Long userId) {
public Boolean checkIsDeposit(Long userId,Long areaId) {
AsUser asUser = asUserMapper.selectUserById(userId);
BigDecimal balance = asUser.getBalance();
// EtOperatingArea area = etOperatingAreaService.selectEtOperatingAreaByAreaId(Long.parseLong(asUser.getAreaId()));
// BigDecimal deposit = new BigDecimal(area.getDeposit());
// if(deposit.compareTo(BigDecimal.ZERO)==0){//押金为0直接返回true
// log.info("运营区【{}】押金为0",area.getAreaName());
// return true;
// }
EtOperatingArea area = etOperatingAreaService.selectEtOperatingAreaByAreaId(areaId);
BigDecimal deposit = new BigDecimal(area.getDeposit());
if(balance.compareTo(deposit)<0){
if(balance.compareTo(BigDecimal.ZERO)==0){//余额为0
log.info("用户【{}】余额为0",userId);
return false;
}else{
//余额小于押金且不等于0先退款再返回false让他重新充值
log.info("用户【{}】余额小于押金先退款再返回false重新充值",userId);
refundRemainingDeposit(userId);
return false;
}
}
if(ObjectUtil.isNull(balance)){
log.info("用户【{}】余额为空",userId);
return false;
}
if(balance.compareTo(BigDecimal.ZERO)==0){//余额为0
log.info("用户【{}】余额为0",userId);
return false;
}
// 判断是否有押金充值记录
EtOrder etOrder = new EtOrder();
etOrder.setType(ServiceConstants.ORDER_TYPE_DEPOSIT);
etOrder.setUserId(userId);
etOrder.setPaid("1");
if(etOrderMapper.selectEtOrderList(etOrder).size()<1){//没有充值押金记录
if(etOrderMapper.selectEtOrderList(etOrder).isEmpty()){//没有充值押金记录
log.info("用户【{}】没有充值押金记录",userId);
return false;
}
return true;
}
/* 异步处理退剩余押金*/
private void refundRemainingDeposit(Long userId) {
scheduledExecutorService.schedule(() -> {
String outRefundNo = IdUtils.getOrderNo("ref");
EtOrder etOrder1 = etOrderService.getDepositOrder(userId);
BigDecimal deposit = etOrder1.getPayFee();
log.info("【押金不足,先退剩余押金】用户【{}】,退款金额【{}】,退款单号【{}】",userId,deposit,outRefundNo);
/** 2.记录退款表 创建退款对象*/
etOrder1.setReason("押金不足,先退剩余押金");
EtRefund refund1= etOrderService.createRefund(etOrder1, deposit, null, null, null, null, outRefundNo,ServiceConstants.REFUND_TYPE_DEPOSIT);
int i = etRefundService.insertEtRefund(refund1);
if(i>0){
log.info("【押金不足,退剩余押金】保存退款对象成功");
// 更新用户
AsUser currentUser = new AsUser();
currentUser.setUserId(userId);
currentUser.setBalance(BigDecimal.ZERO);
if (asUserMapper.updateUser(currentUser) > 0)
{
log.info("【押金不足,退剩余押金】更新用户信息成功:{}", JSON.toJSON(currentUser));
}
}
wxPayService.refund(etOrder1, "押金不足,先退剩余押金", deposit,outRefundNo);
}, 0, TimeUnit.SECONDS);
}
/**
* 新增用户
*/

View File

@ -618,7 +618,7 @@ public class CallbackServiceImpl implements CallbackService {
etOrder.setType(ServiceConstants.ORDER_TYPE_DEPOSIT);
etOrder.setStatus(ServiceConstants.ORDER_STATUS_ORDER_END);
List<EtOrder> etOrders = etOrderMapper.selectEtOrderList(etOrder);
if (etOrders.size() == 0 || ObjectUtil.isNull(etOrders) ) {
if (etOrders.isEmpty() || ObjectUtil.isNull(etOrders) ) {
throw new ServiceException("押金充值记录不存在");
}
Optional<EtOrder> latestOrder = etOrders.stream()

View File

@ -896,7 +896,7 @@ public class EtOrderServiceImpl implements IEtOrderService
depositOrder.setType(ServiceConstants.ORDER_TYPE_DEPOSIT);
depositOrder.setStatus(ServiceConstants.ORDER_STATUS_ORDER_END);
List<EtOrder> etOrders = etOrderMapper.selectEtOrderList(depositOrder);
if (etOrders.size() == 0 || ObjectUtil.isNull(etOrders) ) {
if (etOrders.isEmpty() || ObjectUtil.isNull(etOrders) ) {
throw new ServiceException("押金充值记录不存在");
}
Optional<EtOrder> latestOrder = etOrders.stream()
@ -1448,25 +1448,25 @@ public class EtOrderServiceImpl implements IEtOrderService
return etOrder;
}
private void verify(EtOrderVo order, Long userId) {
if(etOrderService.isInOrder(userId,null).size()>0){
throw new ServiceException("您有未完成的订单,请先完成订单");
}
//根据余额和充值记录判断是否有充值过押金没有充值过押金提示充值押金
if(!asUserService.checkIsDeposit(userId)){
throw new ServiceException("您还未充值押金,请先充值押金");
}
//检验预约订单只能有一个
if(etOrderService.checkIsUnique(userId)){
throw new ServiceException("您有预约中的订单,请务重复操作");
}
AsDevice asDevice = asDeviceService.selectAsDeviceBySn(order.getSn());
String status = asDevice.getStatus();
if(!ServiceConstants.VEHICLE_STATUS_NORMAL.equals(status)){
//根据状态值返回不同的提示
throw new ServiceException(CommonUtil.format(status));
}
}
// private void verify(EtOrderVo order, Long userId) {
// if(etOrderService.isInOrder(userId,null).size()>0){
// throw new ServiceException("您有未完成的订单,请先完成订单");
// }
// //根据余额和充值记录判断是否有充值过押金没有充值过押金提示充值押金
// if(!asUserService.checkIsDeposit(userId)){
// throw new ServiceException("您还未充值押金,请先充值押金");
// }
// //检验预约订单只能有一个
// if(etOrderService.checkIsUnique(userId)){
// throw new ServiceException("您有预约中的订单,请务重复操作");
// }
// AsDevice asDevice = asDeviceService.selectAsDeviceBySn(order.getSn());
// String status = asDevice.getStatus();
// if(!ServiceConstants.VEHICLE_STATUS_NORMAL.equals(status)){
// //根据状态值返回不同的提示
// throw new ServiceException(CommonUtil.format(status));
// }
// }
/**
* 检验预约订单只能有一个
@ -1557,22 +1557,22 @@ public class EtOrderServiceImpl implements IEtOrderService
/** 总收入*/
BigDecimal totalAmount = defaultIfNull(etCapitalFlowMapper.getTotalAmount(timeStart, timeEnd, null, aLong),BigDecimal.ZERO);// 骑行订单收入
BigDecimal deductionAmount = defaultIfNull(etCapitalFlowMapper.getDeductionAmount(timeStart, timeEnd, null, aLong),BigDecimal.ZERO);// 押金抵扣金额
BigDecimal depositAmount = defaultIfNull(etOrderMapper.getDepositAmount(timeStart, timeEnd, aLong,null),BigDecimal.ZERO);// 押金收入 25123
BigDecimal depositAmount = defaultIfNull(etOrderMapper.getDepositAmount(timeStart, timeEnd, aLong,3L),BigDecimal.ZERO);// 押金收入 25123
BigDecimal totalFlowAmount = totalAmount.add(depositAmount).add(deductionAmount);// 总流水
income.setTotalFlowAmount(totalFlowAmount);
income.setDeductionAmount(deductionAmount);
income.setOrderPaid(totalAmount.add(deductionAmount).add(deductionAmount));//订单支付
income.setDepositPaid(depositAmount);
income.setDepositPaid(depositAmount);//押金收入
/** 总支出*/
BigDecimal refundFee = defaultIfNull(etOrderMapper.getRefundFee(timeStart, timeEnd, null, aLong,null), BigDecimal.ZERO);//订单退款
BigDecimal depositRefundFee = defaultIfNull(etOrderMapper.getDepositRefundFee(timeStart, timeEnd, null, aLong,null), BigDecimal.ZERO);//押金退款 24795
BigDecimal depositRefundFee = defaultIfNull(etOrderMapper.getDepositRefundFee(timeStart, timeEnd, null, aLong,3L), BigDecimal.ZERO);//押金退款 24795
BigDecimal serviceFee = defaultIfNull(etCapitalFlowMapper.getHandlingFee(timeStart, timeEnd, null, aLong,null,null),BigDecimal.ZERO);//手续费,扣除掉退款部分的
BigDecimal platformServiceFee = defaultIfNull(etCapitalFlowMapper.getServiceFee(timeStart, timeEnd, null,aLong,null,null),BigDecimal.ZERO);//平台服务费 ,扣除掉退款部分的
BigDecimal totalExpenditure = defaultIfNull(refundFee.add(depositRefundFee).add(serviceFee).add(platformServiceFee), BigDecimal.ZERO);
income.setOrderRefund(refundFee);
income.setDepositRefund(depositRefundFee);
income.setDepositRefund(depositRefundFee);//押金退款
income.setHandlingFee(serviceFee);
income.setPlatformServiceFee(platformServiceFee);
income.setTotalExpenditure(totalExpenditure);