diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/device/domain/enums/DeviceStatus.java b/ruoyi-service/src/main/java/com/ruoyi/bst/device/domain/enums/DeviceStatus.java index db400ff..f17ae5f 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/device/domain/enums/DeviceStatus.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/device/domain/enums/DeviceStatus.java @@ -77,4 +77,9 @@ public enum DeviceStatus { public static List canQLock() { return canAdminLock(); } + + // 不允许处理定位BUG的设备状态 + public static List notHandleLocationBug() { + return CollectionUtils.map(DeviceStatus::getCode, STORAGE, DISABLED); + } } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/device/utils/DeviceUtil.java b/ruoyi-service/src/main/java/com/ruoyi/bst/device/utils/DeviceUtil.java index 7839cb9..8e4694a 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/device/utils/DeviceUtil.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/device/utils/DeviceUtil.java @@ -35,6 +35,10 @@ public class DeviceUtil { device.setLatitude(coordinates.get(0)); device.setLastLocationTime(at); } + } else { + device.setLongitude(null); + device.setLatitude(null); + device.setLastLocationTime(null); } device.setLastTime(at); diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/order/domain/query/OrderStatQuery.java b/ruoyi-service/src/main/java/com/ruoyi/bst/order/domain/query/OrderStatQuery.java index c2ecd16..12e1333 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/order/domain/query/OrderStatQuery.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/order/domain/query/OrderStatQuery.java @@ -1,8 +1,16 @@ package com.ruoyi.bst.order.domain.query; +import java.util.List; + +import com.ruoyi.bst.order.domain.OrderQuery; + +import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data -public class OrderStatQuery { +public class OrderStatQuery extends OrderQuery { + + @ApiModelProperty("查询键值") + private List keys; } diff --git a/ruoyi-service/src/main/java/com/ruoyi/dashboard/domain/revenueStat/RevenueStatVO.java b/ruoyi-service/src/main/java/com/ruoyi/dashboard/domain/revenueStat/RevenueStatVO.java index 1416e3c..5f645bb 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/dashboard/domain/revenueStat/RevenueStatVO.java +++ b/ruoyi-service/src/main/java/com/ruoyi/dashboard/domain/revenueStat/RevenueStatVO.java @@ -111,6 +111,8 @@ public class RevenueStatVO { private BigDecimal userBalance; @ApiModelProperty("运营商数量") private Integer userMchCount; + @ApiModelProperty("用户数量") + private Integer userCount; @ApiModelProperty("车型数量") private Integer modelCount; diff --git a/ruoyi-service/src/main/java/com/ruoyi/dashboard/service/DashboardService.java b/ruoyi-service/src/main/java/com/ruoyi/dashboard/service/DashboardService.java index c4b5498..4f172f5 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/dashboard/service/DashboardService.java +++ b/ruoyi-service/src/main/java/com/ruoyi/dashboard/service/DashboardService.java @@ -281,6 +281,10 @@ public class DashboardService { if (keys.contains(StatKeys.USER_BALANCE)) { vo.setUserBalance(userDashboard.selectSumOfBalance(query.toUserQuery())); } + // 用户数量 + if (keys.contains(StatKeys.USER_COUNT)) { + vo.setUserCount(userDashboard.selectCount(query.toUserQuery())); + } // 运营商数量 if (keys.contains(StatKeys.USER_MCH_COUNT)) { vo.setUserMchCount(userDashboard.selectMchCount(query.toUserQuery())); diff --git a/ruoyi-service/src/main/java/com/ruoyi/iot/service/impl/IotReceiveServiceImpl.java b/ruoyi-service/src/main/java/com/ruoyi/iot/service/impl/IotReceiveServiceImpl.java index d768357..f49362b 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/iot/service/impl/IotReceiveServiceImpl.java +++ b/ruoyi-service/src/main/java/com/ruoyi/iot/service/impl/IotReceiveServiceImpl.java @@ -1,7 +1,6 @@ package com.ruoyi.iot.service.impl; import java.math.BigDecimal; -import java.math.RoundingMode; import java.time.Duration; import java.time.LocalDateTime; import java.util.List; @@ -26,7 +25,6 @@ import com.ruoyi.bst.device.service.DeviceService; import com.ruoyi.bst.device.utils.DeviceUtil; import com.ruoyi.bst.locationLog.domain.LocationLog; import com.ruoyi.bst.locationLog.service.LocationLogConverter; -import com.ruoyi.bst.orderDevice.domain.enums.OrderDeviceStatus; import com.ruoyi.common.constant.CacheConstants; import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.utils.DateUtils; @@ -102,6 +100,12 @@ public class IotReceiveServiceImpl implements IotReceiveService { log.error("更新设备信息失败: {}", msg.getDevName()); } + // 定位无效,不处理 + if (device.getLongitude() == null || device.getLatitude() == null) { + log.info("设备{}定位无效,不处理", device.getMac()); + return; + } + // 处理设备定位BUG,若出现BUG则重启设备 int handle = this.handleDeviceLocationBug(device, at, lastLocationTime, oldLon, oldLat); if (handle == 1) { @@ -145,21 +149,15 @@ public class IotReceiveServiceImpl implements IotReceiveService { if (duration.getSeconds() > 60) { return 0; } - // 0,0定位不处理 - if (MathUtils.equals(device.getLongitude(), BigDecimal.ZERO) && MathUtils.equals(device.getLatitude(), BigDecimal.ZERO)) { - log.info("设备{}定位异常:{},{},不处理", device.getMac(), device.getLongitude(), device.getLatitude()); + // 若设备禁用或者入库,则不处理 + if (DeviceStatus.notHandleLocationBug().contains(device.getStatus())) { return 0; } + boolean isOpen = DeviceQuality.OPEN.getCode().equals(device.getQuality()); // 电门是否开启 // 需要在设备未启动的时候做,否则可能有安全问题 if (!isOpen) { // 若当前数据点的上报时间和设备内上次上报的时间不一样,但是定位一样,则重启设备 - log.info("当前定位:{},{},上次定位:{},{}", - device.getLongitude(), - device.getLatitude(), - oldLon, - oldLat - ); if (at.isAfter(lastLocationTime) && MathUtils.equals(device.getLongitude(), oldLon) && MathUtils.equals(device.getLatitude(), oldLat)) { String reason = String.format("设备不同时间的两次定位一样,重启设备。新定位:%s,%s,旧定位:%s,%s", device.getLongitude(), device.getLatitude(), oldLon, oldLat); deviceIotService.reboot(device, reason, true); @@ -187,11 +185,6 @@ public class IotReceiveServiceImpl implements IotReceiveService { log.error("卫星数量小于5,不处理: {}", device.getMac()); return; } - // 0,0定位不处理 - if (MathUtils.equals(device.getLongitude(), BigDecimal.ZERO) && MathUtils.equals(device.getLatitude(), BigDecimal.ZERO)) { - log.info("设备{}定位异常:{},{},不处理", device.getMac(), device.getLongitude(), device.getLatitude()); - return; - } // 若处理过,则不处理 String key = CacheConstants.DEVICE_AREA_HANDLE_KEY + device.getMac(); Integer isHandle = redisCache.getCacheObject(key); @@ -293,17 +286,11 @@ public class IotReceiveServiceImpl implements IotReceiveService { // 定位日志处理 private void handleLocationLog(DeviceVO device) { - - // 卫星数量小于5,不处理设备操作 + // 卫星数量小于5,不保存定位日志 if (device.getSatellites() == null || device.getSatellites() < 5) { log.error("卫星数量小于5,不处理: {}", device.getMac()); return; } - // 0,0定位不处理 - if (MathUtils.equals(device.getLongitude(), BigDecimal.ZERO) && MathUtils.equals(device.getLatitude(), BigDecimal.ZERO)) { - log.info("设备{}定位异常:{},{},不处理", device.getMac(), device.getLongitude(), device.getLatitude()); - return; - } // 转换定位日志 LocationLog po = locationLogConverter.toPo(device); if (po == null) { diff --git a/ruoyi-web/src/main/java/com/ruoyi/web/app/AppOrderController.java b/ruoyi-web/src/main/java/com/ruoyi/web/app/AppOrderController.java index fc9899c..22e6076 100644 --- a/ruoyi-web/src/main/java/com/ruoyi/web/app/AppOrderController.java +++ b/ruoyi-web/src/main/java/com/ruoyi/web/app/AppOrderController.java @@ -122,9 +122,9 @@ public class AppOrderController extends BaseController { return success(fee); } - @ApiOperation("操作订单设备开启") + @ApiOperation("订单开锁") @PutMapping("/openDevice") - @Log(title = "操作订单设备开启", businessType = BusinessType.OTHER, bizIdName = "arg0", bizType = LogBizType.ORDER) + @Log(title = "订单开锁", businessType = BusinessType.OTHER, bizIdName = "arg0", bizType = LogBizType.ORDER) public AjaxResult openDevice(Long orderId) { OrderVO order = orderService.selectOrderById(orderId); ServiceUtil.assertion(order == null, "订单不存在"); @@ -133,9 +133,9 @@ public class AppOrderController extends BaseController { return success(orderService.openDevice(order, true)); } - @ApiOperation("操作订单设备关闭") + @ApiOperation("临时锁车") @PutMapping("/closeDevice") - @Log(title = "操作订单设备关闭", businessType = BusinessType.OTHER, bizIdName = "arg0", bizType = LogBizType.ORDER) + @Log(title = "临时锁车", businessType = BusinessType.OTHER, bizIdName = "arg0", bizType = LogBizType.ORDER) public AjaxResult closeDevice(@Validated OrderCloseDeviceDTO dto) { OrderVO order = orderService.selectOrderById(dto.getOrderId()); ServiceUtil.assertion(order == null, "订单不存在"); @@ -145,9 +145,9 @@ public class AppOrderController extends BaseController { return success(orderService.closeDevice(dto)); } - @ApiOperation("订单换车") + @ApiOperation("换车") @PutMapping("/changeDevice") - @Log(title = "订单换车", businessType = BusinessType.OTHER, bizIdName = "arg0", bizType = LogBizType.ORDER) + @Log(title = "换车", businessType = BusinessType.OTHER, bizIdName = "arg0", bizType = LogBizType.ORDER) public AjaxResult changeDevice(@RequestBody @Validated OrderChangeDeviceDTO dto) { OrderVO order = orderService.selectOrderById(dto.getOrderId()); ServiceUtil.assertion(!orderValidator.canChangeDevice(order, getUserId()), "您无权操作ID为%s的订单换车", order.getId()); diff --git a/ruoyi-web/src/main/java/com/ruoyi/web/dashboard/DashboardOrderController.java b/ruoyi-web/src/main/java/com/ruoyi/web/dashboard/DashboardOrderController.java index 5cc79c5..a84edb8 100644 --- a/ruoyi-web/src/main/java/com/ruoyi/web/dashboard/DashboardOrderController.java +++ b/ruoyi-web/src/main/java/com/ruoyi/web/dashboard/DashboardOrderController.java @@ -14,6 +14,7 @@ import com.ruoyi.bst.order.constants.OrderDailyKeys; import com.ruoyi.bst.order.domain.OrderQuery; import com.ruoyi.bst.order.domain.enums.OrderStatus; import com.ruoyi.bst.order.domain.query.OrderRefundQuery; +import com.ruoyi.bst.order.domain.query.OrderStatQuery; import com.ruoyi.bst.order.domain.vo.OrderDailyRefundStatVO; import com.ruoyi.bst.order.domain.vo.OrderDailyStatVO; import com.ruoyi.bst.order.domain.vo.OrderRankVO; @@ -78,10 +79,10 @@ public class DashboardOrderController extends BaseController { return success(list); } - // @PreAuthorize("@ss.hasPermi('dashboard:order:stat')") - // @GetMapping("/stat") - // public AjaxResult getStat(OrderStatQuery query) { - // query.setScope(true); - // return success(orderDashboard.selectStat(query)); - // } + @PreAuthorize("@ss.hasPermi('dashboard:order:stat')") + @GetMapping("/stat") + public AjaxResult getStat(OrderStatQuery query) { + query.setScope(true); + return success(orderDashboard.selectStat(query, query.getKeys())); + } }