From b6272765cb1ff41fce084382bffdfb0649508035 Mon Sep 17 00:00:00 2001 From: 18650502300 <18650502300@163.com> Date: Wed, 28 Aug 2024 16:47:44 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E5=AE=9A=E6=97=B6=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E6=8A=BC=E9=87=91=E6=8A=B5=E6=89=A3=202.=20=E5=8E=BB=E6=8E=89?= =?UTF-8?q?=E5=88=86=E9=A1=B5=E5=90=88=E7=90=86=E5=8C=96=203.=20=E5=8E=BB?= =?UTF-8?q?=E6=8E=89=E5=8F=96=E6=B6=88=E9=94=81=E5=8D=95=204.=20=E6=8A=BC?= =?UTF-8?q?=E9=87=91=E6=8A=B5=E6=89=A3=EF=BC=8C=E5=A6=82=E6=9E=9C=E6=9C=89?= =?UTF-8?q?outtradeNo=E5=88=99=E5=85=B3=E9=97=AD=E8=AE=A2=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/app/AppVerifyController.java | 15 ++-- .../ruoyi/common/core/page/PageDomain.java | 4 +- .../com/ruoyi/common/utils/PageUtils.java | 4 +- .../framework/config/SecurityConfig.java | 2 +- .../ruoyi/system/mapper/EtOrderMapper.java | 5 ++ .../ruoyi/system/mapper/EtRefundMapper.java | 10 +++ .../ruoyi/system/service/IEtOrderService.java | 2 +- .../system/service/IEtRefundService.java | 10 +++ .../ruoyi/system/service/IWxPayService.java | 7 ++ .../service/impl/AsDeviceServiceImpl.java | 65 ++++++++++++---- .../service/impl/EtOrderServiceImpl.java | 62 +++++++++++---- .../service/impl/EtRefundServiceImpl.java | 12 +++ .../system/service/impl/WxPayService.java | 41 +++++++--- .../java/com/ruoyi/system/task/EtTask.java | 78 +++++++++++++++++++ .../resources/mapper/system/EtOrderMapper.xml | 5 ++ .../mapper/system/EtRefundMapper.xml | 17 ++++ 16 files changed, 285 insertions(+), 54 deletions(-) diff --git a/electripper-admin/src/main/java/com/ruoyi/web/controller/app/AppVerifyController.java b/electripper-admin/src/main/java/com/ruoyi/web/controller/app/AppVerifyController.java index 6f2737b..5b7650c 100644 --- a/electripper-admin/src/main/java/com/ruoyi/web/controller/app/AppVerifyController.java +++ b/electripper-admin/src/main/java/com/ruoyi/web/controller/app/AppVerifyController.java @@ -1016,11 +1016,12 @@ public class AppVerifyController extends BaseController @PostMapping("/order/unlockOrder") public AjaxResult unlockOrder(String orderNo) { - logger.info("【取消锁单】:{}", orderNo); - EtOrder etOrder = new EtOrder(); - etOrder.setLocking("0"); - etOrder.setOrderNo(orderNo); - return toAjax(etOrderService.updateEtOrderByOrderNo(etOrder)); +// logger.info("【取消锁单】:{}", orderNo); +// EtOrder etOrder = new EtOrder(); +// etOrder.setLocking("0"); +// etOrder.setOrderNo(orderNo); +// return toAjax(etOrderService.updateEtOrderByOrderNo(etOrder)); + return success(); } /** @@ -1130,14 +1131,14 @@ public class AppVerifyController extends BaseController */ @Log(title = "换车关锁", businessType = BusinessType.CHANGELOCK) @PostMapping("/changeVehicle/lock") - public AjaxResult changeVehicleLock(String orderNo,String changeReason,String isBluetooth,String lon,String lat,String voltage) + public AjaxResult changeVehicleLock(String orderNo,String changeReason,String isBluetooth,String lon,String lat,String voltage,String newSn) { if (StrUtil.isBlank(orderNo)){ logger.info("没有orderNo参数:【orderNo={}】",orderNo); return error("请传orderNo号参数"+"【orderNo="+orderNo+"】"); } logger.info("【换车关锁请求】:orderNo={}",orderNo); - Boolean aBoolean = etOrderService.changeVehicleLock(orderNo,changeReason,isBluetooth,lon,lat,voltage); + Boolean aBoolean = etOrderService.changeVehicleLock(orderNo,changeReason,isBluetooth,lon,lat,voltage,newSn); return success(aBoolean); } diff --git a/electripper-common/src/main/java/com/ruoyi/common/core/page/PageDomain.java b/electripper-common/src/main/java/com/ruoyi/common/core/page/PageDomain.java index 8966cb4..5663410 100644 --- a/electripper-common/src/main/java/com/ruoyi/common/core/page/PageDomain.java +++ b/electripper-common/src/main/java/com/ruoyi/common/core/page/PageDomain.java @@ -4,7 +4,7 @@ import com.ruoyi.common.utils.StringUtils; /** * 分页数据 - * + * * @author ruoyi */ public class PageDomain @@ -22,7 +22,7 @@ public class PageDomain private String isAsc = "asc"; /** 分页参数合理化 */ - private Boolean reasonable = true; + private Boolean reasonable = false; public String getOrderBy() { diff --git a/electripper-common/src/main/java/com/ruoyi/common/utils/PageUtils.java b/electripper-common/src/main/java/com/ruoyi/common/utils/PageUtils.java index 7bce5da..c94c25f 100644 --- a/electripper-common/src/main/java/com/ruoyi/common/utils/PageUtils.java +++ b/electripper-common/src/main/java/com/ruoyi/common/utils/PageUtils.java @@ -21,8 +21,8 @@ public class PageUtils extends PageHelper Integer pageNum = pageDomain.getPageNum(); Integer pageSize = pageDomain.getPageSize(); String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy()); - Boolean reasonable = pageDomain.getReasonable(); - PageHelper.startPage(pageNum, pageSize, orderBy).setReasonable(reasonable); +// Boolean reasonable = pageDomain.getReasonable(); + PageHelper.startPage(pageNum, pageSize, orderBy).setReasonable(false); } /** diff --git a/electripper-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java b/electripper-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java index b1ab75c..5a7fe54 100644 --- a/electripper-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java +++ b/electripper-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java @@ -119,7 +119,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter "/appCaptcha", "/appCodeLogin", "/app/**", -// "/appVerify/**", + "/appVerify/**", "/common/upload", "/common/receive", "/payment/callback/**", diff --git a/electripper-system/src/main/java/com/ruoyi/system/mapper/EtOrderMapper.java b/electripper-system/src/main/java/com/ruoyi/system/mapper/EtOrderMapper.java index 161ddd1..174b420 100644 --- a/electripper-system/src/main/java/com/ruoyi/system/mapper/EtOrderMapper.java +++ b/electripper-system/src/main/java/com/ruoyi/system/mapper/EtOrderMapper.java @@ -307,4 +307,9 @@ public interface EtOrderMapper // * 判断当前是否有正在骑行中的订单 // */ // int getCurrentOrderNum(String sn); + + /** + * 7天前未支付的订单 + */ + List selectToBePaidEtOrderList(); } diff --git a/electripper-system/src/main/java/com/ruoyi/system/mapper/EtRefundMapper.java b/electripper-system/src/main/java/com/ruoyi/system/mapper/EtRefundMapper.java index e2da126..36365db 100644 --- a/electripper-system/src/main/java/com/ruoyi/system/mapper/EtRefundMapper.java +++ b/electripper-system/src/main/java/com/ruoyi/system/mapper/EtRefundMapper.java @@ -1,6 +1,8 @@ package com.ruoyi.system.mapper; import java.util.List; + +import com.ruoyi.system.domain.EtOrder; import com.ruoyi.system.domain.EtRefund; /** @@ -82,4 +84,12 @@ public interface EtRefundMapper * @return 退款订单 */ EtRefund selectEtRefundByRefundNo(String refundNo); + + /** + * 判断是否用户是否还有未退款的押金 + * + * @param userId 用户id + * @return 结果 + */ + List checkUserDeposit(Long userId); } diff --git a/electripper-system/src/main/java/com/ruoyi/system/service/IEtOrderService.java b/electripper-system/src/main/java/com/ruoyi/system/service/IEtOrderService.java index 1ea66c9..524d331 100644 --- a/electripper-system/src/main/java/com/ruoyi/system/service/IEtOrderService.java +++ b/electripper-system/src/main/java/com/ruoyi/system/service/IEtOrderService.java @@ -227,7 +227,7 @@ public interface IEtOrderService /** * 换车关锁 */ - Boolean changeVehicleLock(String orderNo,String changeReason,String isBluetooth,String lon,String lat,String voltage); + Boolean changeVehicleLock(String orderNo,String changeReason,String isBluetooth,String lon,String lat,String voltage,String newSn); /** * 换车开锁 diff --git a/electripper-system/src/main/java/com/ruoyi/system/service/IEtRefundService.java b/electripper-system/src/main/java/com/ruoyi/system/service/IEtRefundService.java index 4842528..c5e94cf 100644 --- a/electripper-system/src/main/java/com/ruoyi/system/service/IEtRefundService.java +++ b/electripper-system/src/main/java/com/ruoyi/system/service/IEtRefundService.java @@ -1,6 +1,8 @@ package com.ruoyi.system.service; import java.util.List; + +import com.ruoyi.system.domain.EtOrder; import com.ruoyi.system.domain.EtRefund; /** @@ -90,4 +92,12 @@ public interface IEtRefundService * @return 结果 */ public int updateEtRefundByRefundNo(EtRefund etRefund); + + /** + * 判断是否用户是否还有未退款的押金 + * + * @param userId 用户id + * @return 结果 + */ + List checkUserDeposit(Long userId); } diff --git a/electripper-system/src/main/java/com/ruoyi/system/service/IWxPayService.java b/electripper-system/src/main/java/com/ruoyi/system/service/IWxPayService.java index 70ce3f7..cd6c08a 100644 --- a/electripper-system/src/main/java/com/ruoyi/system/service/IWxPayService.java +++ b/electripper-system/src/main/java/com/ruoyi/system/service/IWxPayService.java @@ -50,6 +50,13 @@ public interface IWxPayService { */ Transaction queryOrderByOutTradeNo(String outTradeNo); + /** + * 关闭订单 + * @param outTradeNo 商户订单号 + * @return 订单信息 + */ + boolean closeOrder(String outTradeNo,SysDept sysDept); + /** * 根据订单号查询订单支付结果 * @param orderNo 订单号 diff --git a/electripper-system/src/main/java/com/ruoyi/system/service/impl/AsDeviceServiceImpl.java b/electripper-system/src/main/java/com/ruoyi/system/service/impl/AsDeviceServiceImpl.java index 2c9e5be..5c745c2 100644 --- a/electripper-system/src/main/java/com/ruoyi/system/service/impl/AsDeviceServiceImpl.java +++ b/electripper-system/src/main/java/com/ruoyi/system/service/impl/AsDeviceServiceImpl.java @@ -1047,7 +1047,7 @@ public class AsDeviceServiceImpl extends ServiceImpl i @Override public String getInOperationDevice(String timeStart, String timeEnd,String areaId) { if(ObjectUtil.isNotEmpty(timeStart)&&ObjectUtil.isNotEmpty(timeEnd)){ - QueryWrapper wrapper = new QueryWrapper().in("status", "1", "2", "3", "4"); + QueryWrapper wrapper = new QueryWrapper().in("status", "1", "2", "3", "4","6"); wrapper.eq("area_id", areaId); return asDeviceMapper.selectCount(wrapper)+""; } @@ -1327,7 +1327,7 @@ public class AsDeviceServiceImpl extends ServiceImpl i String token = Token.getToken(); Boolean execute = transactionTemplate.execute(e -> { /** 2.发送命令*/ - sendCommand(asDevice.getMac(), token,IotConstants.COMMAND_PLAY1,"重启设备",null,null); + sendCommand(asDevice.getMac(), token,IotConstants.COMMAND_REBOOT,"重启设备",null,null); return Boolean.TRUE; }); if(!execute)throw new ServiceException("重启设备失败"); @@ -2316,7 +2316,7 @@ public class AsDeviceServiceImpl extends ServiceImpl i List parkingAreas = parkingAreaService.selectEtParkingAreaList(parkingArea); if(ObjectUtil.isNull(parkingAreas) || parkingAreas.size() == 0){ log.info("运营区【{}】没有禁行区,",areaId); - throw new ServiceException("运营区【{}】没有禁行区"+areaId.toString()); +// throw new ServiceException("运营区【{}】没有禁行区"+areaId.toString()); } for (EtParkingArea etParkingArea : parkingAreas) { if(etParkingArea.getType().equals(ServiceConstants.PARKING_AREA_TYPE_BANNED_RIDING)){ @@ -2349,7 +2349,7 @@ public class AsDeviceServiceImpl extends ServiceImpl i List parkingAreas = parkingAreaService.selectEtParkingAreaList(parkingArea); if(ObjectUtil.isNull(parkingAreas) || parkingAreas.size() == 0){ log.info("运营区【{}】没有禁行区,",areaId); - throw new ServiceException("运营区【{}】没有禁行区"+areaId.toString()); +// throw new ServiceException("运营区【{}】没有禁行区"+areaId.toString()); } for (EtParkingArea etParkingArea : parkingAreas) { if(etParkingArea.getType().equals(ServiceConstants.PARKING_AREA_TYPE_BANNED_RIDING)){ @@ -2578,7 +2578,9 @@ public class AsDeviceServiceImpl extends ServiceImpl i for (EtLocationLog log : etLocationLogs) { double longitude = Double.parseDouble(log.getLongitude()); double latitude = Double.parseDouble(log.getLatitude()); - coordinatesList.add(new double[]{longitude, latitude}); + if(longitude != 0.0 && latitude != 0.0){ + coordinatesList.add(new double[]{longitude, latitude}); + } } StringBuilder trajectoryStr = new StringBuilder(); int size = coordinatesList.size(); @@ -2702,6 +2704,7 @@ public class AsDeviceServiceImpl extends ServiceImpl i for (Datapoint datapoint:datapointList) { if(datapoint.getId().equals(IotConstants.ONENET_LOCATION)){ String string = JSON.toJSONString(datapoint.getValue()); + String at = datapoint.getAt(); if(StrUtil.isNotBlank(string)){ LocationVo locationVo = JSONObject.parseObject(string, LocationVo.class); log.info("【手动更新】: locationVo---【{}】" , JSON.toJSONString(locationVo)); @@ -2709,14 +2712,18 @@ public class AsDeviceServiceImpl extends ServiceImpl i BigDecimal lat = new BigDecimal(doubles[0]).setScale(8, RoundingMode.HALF_UP); BigDecimal lon = new BigDecimal(doubles[1]).setScale(8, RoundingMode.HALF_UP); log.info("转换后的GCJ02经纬度:" + lon + "---" + lat); - /** 计算电量和里程后更新设备*/ - int i = updateDevice(locationVo, device, lon, lat); - if(i > 0){ - log.info("【手动更新】===>更新设备成功"); - return true; + if(BigDecimal.ZERO.compareTo(lon) != 0 && BigDecimal.ZERO.compareTo(lat) != 0){ + /** 计算电量和里程后更新设备*/ + int i = updateDevice(at,locationVo, device, lon, lat); + if(i > 0){ + log.info("【手动更新】===>更新设备成功"); + return true; + }else{ + log.info("【手动更新】===>更新设备失败"); + return false; + } }else{ - log.info("【手动更新】===>更新设备失败"); - return false; + noLocationUpdateDevice(at,locationVo,device); } } } @@ -2730,7 +2737,7 @@ public class AsDeviceServiceImpl extends ServiceImpl i } /** 计算电量和里程后更新设备*/ - public int updateDevice(LocationVo locationVo, AsDevice device, BigDecimal lon, BigDecimal lat) { + public int updateDevice(String at,LocationVo locationVo, AsDevice device, BigDecimal lon, BigDecimal lat) { device.setLatitude(lat.toString()); device.setLongitude(lon.toString()); Integer bat = locationVo.getBat(); @@ -2748,8 +2755,8 @@ public class AsDeviceServiceImpl extends ServiceImpl i device.setRemainingMileage(remainingMileage); device.setRemainingPower(electricQuantity.toString()); } - device.setLastTime(DateUtils.getNowDate()); - device.setLastLocationTime(DateUtils.getNowDate()); + device.setLastTime(DateUtils.parseDate(at)); + device.setLastLocationTime(DateUtils.parseDate(at)); device.setGps("1"); // 信号强度 device.setSignalStrength(locationVo.getCsq()); @@ -2759,6 +2766,34 @@ public class AsDeviceServiceImpl extends ServiceImpl i return i; } + /** 无定位更新设备 */ + private void noLocationUpdateDevice(String at,LocationVo locationVo, AsDevice device) { + Integer bat = locationVo.getBat(); + BigDecimal divide = new BigDecimal(bat).divide(new BigDecimal(10)); + log.info("保存电压:" + divide); + device.setVoltage(divide.toString());//电压 + EtModel model = etModelService.selectEtModelByModelId(device.getModelId()); + // 根据电压计算续航里程 + if(ObjectUtil.isNotNull(model)){ + Integer remainingMileage = 0; + if(StrUtil.isNotBlank(device.getVoltage())){ + remainingMileage = CommonUtil.getRemainingMileage(device.getVoltage(), model.getFullVoltage(), model.getLowVoltage(), model.getFullEndurance()); + } + Integer electricQuantity = CommonUtil.getElectricQuantity(device.getVoltage(), model.getFullVoltage(), model.getLowVoltage());//电量百分百 + device.setRemainingMileage(remainingMileage); + device.setRemainingPower(electricQuantity.toString()); + } + device.setLastTime(DateUtils.parseDate(at)); + device.setGps("0"); + device.setSignalStrength(locationVo.getCsq()); + device.setSatellites(0); + device.setQuality(locationVo.getQ()); + int i = updateLocation(device); + if(i>0){ + log.info("未获取到定位===============保存电压等数值成功===========>" + device.getSn()); + } + } + /** diff --git a/electripper-system/src/main/java/com/ruoyi/system/service/impl/EtOrderServiceImpl.java b/electripper-system/src/main/java/com/ruoyi/system/service/impl/EtOrderServiceImpl.java index 7b2a89a..9d7f5f8 100644 --- a/electripper-system/src/main/java/com/ruoyi/system/service/impl/EtOrderServiceImpl.java +++ b/electripper-system/src/main/java/com/ruoyi/system/service/impl/EtOrderServiceImpl.java @@ -22,6 +22,7 @@ import com.ruoyi.system.domain.vo.*; import com.ruoyi.system.mapper.*; import com.ruoyi.system.service.*; import com.wechat.pay.java.service.payments.jsapi.model.PrepayWithRequestPaymentResponse; +import com.wechat.pay.java.service.payments.model.Transaction; import com.wechat.pay.java.service.refund.model.Refund; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; @@ -436,6 +437,36 @@ public class EtOrderServiceImpl implements IEtOrderService if(!ServiceConstants.ORDER_STATUS_RIDING_END.equals(order.getStatus())){ throw new ServiceException("押金抵扣失败,订单非待支付状态,订单状态:"+order.getStatus()); } + // 押金抵扣时,判断是否有outtradeno + if(StrUtil.isNotBlank(order.getOutTradeNo())){ + String outTradeNo = order.getOutTradeNo(); + log.info("【押金抵扣】订单【{}】,有outTradeNo = 【{}】", order.getOrderNo(),outTradeNo); + // 如果原来有outtradeno,去查询一次,查询是否支付过 + Transaction transaction = wxPayService.queryOrderByOutTradeNo(outTradeNo); + if (Transaction.TradeStateEnum.SUCCESS.equals(transaction.getTradeState())) { + // 订单已支付 + order.setPaid(ServiceConstants.ORDER_PAY_STATUS_PAID); + order.setPayTime(DateUtils.getNowDate()); + order.setStatus(ServiceConstants.ORDER_STATUS_ORDER_END); + order.setPayType(ServiceConstants.PAY_TYPE_WX); + order.setMark("主动查询-骑行支付"); + try { + int updateEtOrder = etOrderMapper.updateEtOrder(order); + if (updateEtOrder == 0) { + // 抛出自定义异常来标识订单更新失败 + throw new ServiceException("押金抵扣失败,更新骑行订单失败"); + } + } finally { + // 无论订单更新是否成功,一定抛出异常来终止后续操作 + throw new ServiceException("订单已支付,请勿操作"); + } + }else{ + SysDept dept = wxPayService.getDeptObjByAreaId(order.getAreaId()); + // 没有支付,则关闭订单 + boolean b = wxPayService.closeOrder(outTradeNo, dept); + log.info("【押金抵扣】订单【{}】,有outTradeNo = 【{}】,查询订单未支付,关闭订单:{}", order.getOrderNo(),outTradeNo,b); + } + } EtOrder depositOrder = getDepositOrder(order.getUserId()); BigDecimal deposit = depositOrder.getTotalFee(); BigDecimal ridingFee = order.getTotalFee(); @@ -1205,13 +1236,12 @@ public class EtOrderServiceImpl implements IEtOrderService String totalRefund = etOrderMapper.getTotalRefund(timeStart, timeEnd, areaId);//已退款 income.setTotalPaid(totalPaid);//已支付 //handlingFee 手续费 = 0.0054 * 已支付金额 - SysDept sysDept = wxPayService.getDeptObjByAreaId(Long.parseLong(areaId)); - String handlingCharge = sysDept.getHandlingCharge(); - BigDecimal divide = new BigDecimal(handlingCharge).divide(new BigDecimal(1000), 4, RoundingMode.HALF_UP); - BigDecimal handlingFee = new BigDecimal(totalPaid).multiply(divide); - income.setHandlingFee(handlingFee.setScale(2, RoundingMode.HALF_UP).toString()); + BigDecimal handlingFee = etCapitalFlowMapper.getHandlingFee(timeStart, timeEnd, null, Long.parseLong(areaId));//手续费,扣除掉退款部分的 + BigDecimal platformServiceFee = etCapitalFlowMapper.getServiceFee(timeStart, timeEnd, null,Long.parseLong(areaId));//平台服务费 ,扣除掉退款部分的 + income.setHandlingFee(handlingFee.toString()); + // 总营收 = 已支付 - 已退款 - 手续费 - income.setTotalIncome(new BigDecimal(totalPaid).subtract(new BigDecimal(totalRefund)).subtract(handlingFee).setScale(2, RoundingMode.HALF_UP).toString());//总收入 etOrderMapper.getTotalIncome(timeStart,timeEnd,areaId) + income.setTotalIncome(new BigDecimal(totalPaid).subtract(new BigDecimal(totalRefund)).subtract(handlingFee).subtract(platformServiceFee).toString());//总收入 income.setTotalRefund(totalRefund);//已退款 income.setTotalFee(new BigDecimal(totalUnpaid).add(new BigDecimal(totalPaid)).toString());// 订单总金额 = 已支付+待支付 income.setTotalRidingFee(etOrderMapper.getTotalRidingFee(timeStart,timeEnd,areaId));//骑行已支付 @@ -1771,7 +1801,7 @@ public class EtOrderServiceImpl implements IEtOrderService @Override @Transactional @SneakyThrows - public Boolean changeVehicleLock(String orderNo,String changeReason,String isBluetooth,String lon,String lat,String voltage) { + public Boolean changeVehicleLock(String orderNo,String changeReason,String isBluetooth,String lon,String lat,String voltage,String newSn) { EtOrder order = etOrderMapper.selectEtOrderByOrderNo(orderNo); if(!ServiceConstants.ORDER_STATUS_RIDING.equals(order.getStatus())){ throw new ServiceException("该订单状态非骑行中"); @@ -1819,7 +1849,7 @@ public class EtOrderServiceImpl implements IEtOrderService usedSn = sn; } order.setUsedSn(usedSn); - order.setSn(""); + order.setSn(newSn); order.setChangeReason(changeReason); int i = etOrderMapper.updateEtOrderByOrderNo(order); if(i==0){ @@ -1865,8 +1895,8 @@ public class EtOrderServiceImpl implements IEtOrderService if(!"true".equals(isBluetooth)){ ResponseVo responseVo = asDeviceService.sendCommandWithResp(newDevice.getMac(), token, IotConstants.COMMAND_CLOSE + IotConstants.COMMAND_FREQUENCY_3600, "换车开锁",orderNo); if(responseVo.getCode()!=0){ - log.info("【还车关锁】远程关锁失败"); - throw new ServiceException("远程关锁失败"); + log.info("【换车开锁】远程关锁失败"); + throw new ServiceException("换车开锁失败"); } }else{ newDevice.setLongitude(lon); @@ -1891,15 +1921,15 @@ public class EtOrderServiceImpl implements IEtOrderService if(i>0){ log.info("管理员开锁,更新设备状态成功"); } + order.setSn(newSn); + int i2 = etOrderMapper.updateEtOrderByOrderNo(order); + if(i2==0){ + log.info("【换车开锁】更新订单sn失败"); + throw new ServiceException("【换车开锁】更新订单sn失败"); + } return Boolean.TRUE; }); if(!execute)throw new ServiceException("换车开锁失败"); - order.setSn(newSn); - int i = etOrderMapper.updateEtOrderByOrderNo(order); - if(i==0){ - log.info("【换车开锁】更新订单sn失败"); - throw new ServiceException("【换车开锁】更新订单sn失败"); - } return Boolean.TRUE; } } diff --git a/electripper-system/src/main/java/com/ruoyi/system/service/impl/EtRefundServiceImpl.java b/electripper-system/src/main/java/com/ruoyi/system/service/impl/EtRefundServiceImpl.java index 740a1d3..3bada6e 100644 --- a/electripper-system/src/main/java/com/ruoyi/system/service/impl/EtRefundServiceImpl.java +++ b/electripper-system/src/main/java/com/ruoyi/system/service/impl/EtRefundServiceImpl.java @@ -4,6 +4,7 @@ import java.util.List; import com.ruoyi.common.annotation.DataScope; import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.system.domain.EtOrder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.ruoyi.system.mapper.EtRefundMapper; @@ -142,4 +143,15 @@ public class EtRefundServiceImpl implements IEtRefundService public int updateEtRefundByRefundNo(EtRefund etRefund) { return etRefundMapper.updateEtRefundByRefundNo(etRefund); } + + /** + * 判断是否用户是否还有未退款的押金 + * + * @param userId 用户id + * @return 结果 + */ + @Override + public List checkUserDeposit(Long userId) { + return etRefundMapper.checkUserDeposit(userId); + } } diff --git a/electripper-system/src/main/java/com/ruoyi/system/service/impl/WxPayService.java b/electripper-system/src/main/java/com/ruoyi/system/service/impl/WxPayService.java index d6ac035..fb27a6a 100644 --- a/electripper-system/src/main/java/com/ruoyi/system/service/impl/WxPayService.java +++ b/electripper-system/src/main/java/com/ruoyi/system/service/impl/WxPayService.java @@ -184,6 +184,22 @@ public class WxPayService implements IWxPayService { } } + /** + * 关闭订单 + * @param outTradeNo 商户订单号 + * @return + */ + @Override + public boolean closeOrder(String outTradeNo, SysDept sysDept) { + JsapiServiceExtension jsapiServiceExtension = getJsapiServiceExtension(sysDept); + // 关闭订单 + CloseOrderRequest closeOrderRequest = new CloseOrderRequest(); + closeOrderRequest.setMchid(sysDept.getMerchantId()); + closeOrderRequest.setOutTradeNo(outTradeNo); + jsapiServiceExtension.closeOrder(closeOrderRequest); + return true; + } + /** * 根据订单号查询订单 * @param orderNo 商户订单号 @@ -196,6 +212,9 @@ public class WxPayService implements IWxPayService { log.info("获取到运营商对象:【{}】",JSON.toJSON(sysDept)); QueryOrderByOutTradeNoRequest request = new QueryOrderByOutTradeNoRequest(); request.setMchid(sysDept.getMerchantId()); + if(StrUtil.isBlank(order.getOutTradeNo())){ + return false; + } request.setOutTradeNo(order.getOutTradeNo()); JsapiService jsapiService = getJsapiService(sysDept); Transaction transaction = jsapiService.queryOrderByOutTradeNo(request); @@ -207,17 +226,19 @@ public class WxPayService implements IWxPayService { order.setPayType(ServiceConstants.PAY_TYPE_WX); log.info("【主动查询】押金支付"); order.setStatus(ServiceConstants.ORDER_STATUS_ORDER_END); - order.setMark("押金支付"); - - // 更新用户余额 - AsUser asUser = asUserMapper.selectUserById(order.getUserId()); - asUser.setBalance(order.getTotalFee()); - int updateUser = asUserMapper.updateUser(asUser); - if(updateUser==0){ - log.error("【微信支付回调】更新用户押金失败"); - throw new ServiceException("【微信支付回调】更新用户押金失败"); + if(ServiceConstants.ORDER_TYPE_RIDING.equals(order.getType())){ + order.setMark("主动查询-骑行支付"); + }else{ + order.setMark("押金支付"); + // 更新用户余额 + AsUser asUser = asUserMapper.selectUserById(order.getUserId()); + asUser.setBalance(order.getTotalFee()); + int updateUser = asUserMapper.updateUser(asUser); + if(updateUser==0){ + log.error("【微信支付回调】更新用户押金失败"); + throw new ServiceException("【微信支付回调】更新用户押金失败"); + } } - int updateEtOrder = orderService.updateEtOrder(order); if(updateEtOrder==0){ log.error("【微信支付回调】更新订单信息失败"); diff --git a/electripper-system/src/main/java/com/ruoyi/system/task/EtTask.java b/electripper-system/src/main/java/com/ruoyi/system/task/EtTask.java index e217250..7d27e38 100644 --- a/electripper-system/src/main/java/com/ruoyi/system/task/EtTask.java +++ b/electripper-system/src/main/java/com/ruoyi/system/task/EtTask.java @@ -15,6 +15,7 @@ import com.ruoyi.common.utils.uuid.IdUtils; import com.ruoyi.system.domain.*; import com.ruoyi.system.mapper.*; import com.ruoyi.system.service.*; +import com.wechat.pay.java.service.payments.model.Transaction; import com.wechat.pay.java.service.refund.model.Refund; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -407,4 +408,81 @@ public class EtTask { etLocationLogMapper.deleteLocationLogByCreateTime(); } + // 写一个定时,如果车辆是骑行中,没有现在骑行中的订单,则关闭车辆 + /** + * 自动押金抵扣 + * 写一个定时任务处理所有的 7天前待支付的订单用押金抵扣,如果已经退押金的直接改成结束订单 + * 1. 查询所有待支付的订单,根据还车时间7天前的订单 + * 2. 如果订单金额是0,直接结束订单,修改订单状态为已支付 + * 3. 查询用户是否还有未退款的押金,如果有,则进行押金抵扣,如果没有,则结束订单 + */ + public void autoDeduction(){ + log.info("-------------------【定时任务】自动押金抵扣-------------------"); + /** 1. 查询所有待支付的订单,根据还车时间7天前的订单 */ + List orders = etOrderMapper.selectToBePaidEtOrderList(); + if(ObjectUtil.isNotNull(orders) && orders.size()>0){ + for(EtOrder order:orders){ + if(order.getTotalFee().compareTo(BigDecimal.ZERO) == 0){ + // 结束订单,修改订单状态为已支付 + updateOrderPaid(order); + }else{ + etOrderService.deduction(order); +// if(StrUtil.isNotBlank(order.getOutTradeNo())){ +// String outTradeNo = order.getOutTradeNo(); +// log.info("【自动押金抵扣】订单【{}】,有outTradeNo = 【{}】", order.getOrderNo(),outTradeNo); +// // 如果原来有outtradeno,去查询一次,查询是否支付过 +// Transaction transaction = wxPayService.queryOrderByOutTradeNo(outTradeNo); +// if(Transaction.TradeStateEnum.SUCCESS.equals(transaction.getTradeState())) { +// // 订单已支付 +// order.setPaid(ServiceConstants.ORDER_PAY_STATUS_PAID); +// order.setPayTime(DateUtils.getNowDate()); +// order.setStatus(ServiceConstants.ORDER_STATUS_ORDER_END); +// order.setPayType(ServiceConstants.PAY_TYPE_WX); +// order.setMark("主动查询-骑行支付"); +// int updateEtOrder = etOrderMapper.updateEtOrder(order); +// if (updateEtOrder == 0) { +// throw new ServiceException("押金抵扣失败,更新骑行订单失败"); +// } +// }else{ +// updateOrderPaid(order); +// } +// }else{ +// // 3. 查询用户是否还有未退款的押金,如果有,则进行押金抵扣,如果没有,则结束订单 +// List yjOrders = etRefundService.checkUserDeposit(order.getUserId()); +// if(ObjectUtil.isNotNull(yjOrders) && yjOrders.size()>0){ +// // 取出最后一个订单对象 +// yjOrders.sort(Comparator.comparing(EtOrder::getCreateTime)); // 按create_time升序排序 +// EtOrder lastOrder = yjOrders.get(yjOrders.size() - 1); // 获取最后一个订单对象 +// etOrderService.deduction(); +// }else{ +// updateOrderPaid(order); +// } +// } + } + } + } + } + + /** 更新订单为已支付*/ + private void updateOrderPaid(EtOrder order) { + order.setPaid(ServiceConstants.ORDER_PAY_STATUS_PAID); + order.setPayTime(DateUtils.getNowDate()); + order.setStatus(ServiceConstants.ORDER_STATUS_ORDER_END); + order.setPayType(ServiceConstants.PAY_TYPE_YJ); + order.setMark("超过7天系统自动押金抵扣"); + order.setDepositDeduction(ServiceConstants.IS_DEPOSIT_DEDUCTION); + int updateEtOrder = etOrderMapper.updateEtOrder(order); + if(updateEtOrder == 0){ + throw new ServiceException("押金抵扣失败,更新骑行订单失败"); + } + } + + /** 如果还有未退款的押金,如果有,则进行押金抵扣 */ + private void autoDeductionHandle(EtOrder order){ + // select * from et_order o + // where o.status ='4' and o.paid = '1' and o.type = 1 and o.is_test = '0' + // GROUP BY o.user_id + + + } } diff --git a/electripper-system/src/main/resources/mapper/system/EtOrderMapper.xml b/electripper-system/src/main/resources/mapper/system/EtOrderMapper.xml index 144e5ae..76d2e73 100644 --- a/electripper-system/src/main/resources/mapper/system/EtOrderMapper.xml +++ b/electripper-system/src/main/resources/mapper/system/EtOrderMapper.xml @@ -869,5 +869,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + diff --git a/electripper-system/src/main/resources/mapper/system/EtRefundMapper.xml b/electripper-system/src/main/resources/mapper/system/EtRefundMapper.xml index e592e7f..f42b221 100644 --- a/electripper-system/src/main/resources/mapper/system/EtRefundMapper.xml +++ b/electripper-system/src/main/resources/mapper/system/EtRefundMapper.xml @@ -146,4 +146,21 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{id} + +