From 7c3496ec22ac85609e2d0d8dc55afb1d5996cbde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A3=B7=E5=8F=B6?= <14103883+leaf-phos@user.noreply.gitee.com> Date: Mon, 19 May 2025 20:49:55 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E6=9B=B4=E6=96=B0=EF=BC=8C=E6=8E=A8?= =?UTF-8?q?=E9=80=81=E4=B8=BA=E4=B8=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/DeviceIotServiceImpl.java | 41 +++++++++++-------- .../service/impl/OrderConverterImpl.java | 8 +++- .../order/service/impl/OrderServiceImpl.java | 12 +++--- 3 files changed, 37 insertions(+), 24 deletions(-) diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/impl/DeviceIotServiceImpl.java b/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/impl/DeviceIotServiceImpl.java index 9cef352..fd8034b 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/impl/DeviceIotServiceImpl.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/impl/DeviceIotServiceImpl.java @@ -5,6 +5,7 @@ import java.util.List; import java.util.Objects; import java.util.concurrent.ScheduledExecutorService; +import com.ruoyi.bst.device.service.DeviceAssembler; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.support.TransactionTemplate; @@ -78,6 +79,9 @@ public class DeviceIotServiceImpl implements DeviceIotService { @Autowired private OperLogService operLogService; + @Autowired + private DeviceAssembler deviceAssembler; + private final static Integer SUB_FAST = 5; // 上报频率(快) private final static Integer SUB_SLOW = 300; // 上报频率(慢) private final static Integer SUB_X_SLOW = 50; // 上报频率(X开头硬件) @@ -280,22 +284,25 @@ public class DeviceIotServiceImpl implements DeviceIotService { } // 获取物联网信息 - List iotList = iotService.getDeviceInfo(deviceList); - if (CollectionUtils.isEmptyElement(iotList)) { - return; - } +// List iotList = iotService.getDeviceInfo(deviceList); +// if (CollectionUtils.isEmptyElement(iotList)) { +// return; +// } +// +// // 更新设备信息 +// for (DeviceVO device : deviceList) { +// if (device == null || StringUtils.isBlank(device.getMac())) { +// continue; +// } +// IotDeviceInfo iot = iotList.stream() +// .filter(item -> Objects.equals(item.getMac(), device.getMac())) +// .findFirst().orElse(null); +// DeviceUtil.setIotInfo(device, iot); +// this.updateIot(device); +// } - // 更新设备信息 - for (DeviceVO device : deviceList) { - if (device == null || StringUtils.isBlank(device.getMac())) { - continue; - } - IotDeviceInfo iot = iotList.stream() - .filter(item -> Objects.equals(item.getMac(), device.getMac())) - .findFirst().orElse(null); - DeviceUtil.setIotInfo(device, iot); - this.updateIot(device); - } + // 拼接物联网信息 + deviceAssembler.assembleIot(deviceList); // 异步发送命令,强制设备上报数据 if (onlineType != null) { @@ -432,7 +439,7 @@ public class DeviceIotServiceImpl implements DeviceIotService { try { // 获取设备最新信息 DeviceVO device = deviceMapper.selectDeviceById(deviceId); - this.refresh(device, null); + deviceAssembler.assembleIot(device); this.monitor(device); } catch (Exception e) { log.error("监控设备id={}出错:{}", deviceId, e.getMessage()); @@ -472,7 +479,7 @@ public class DeviceIotServiceImpl implements DeviceIotService { @Override public void monitor(String mac) { DeviceVO device = deviceService.selectByMac(mac); - this.refresh(device, null); + deviceAssembler.assembleIot(device); this.monitor(device); } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/order/service/impl/OrderConverterImpl.java b/ruoyi-service/src/main/java/com/ruoyi/bst/order/service/impl/OrderConverterImpl.java index 1830abf..e32ee77 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/order/service/impl/OrderConverterImpl.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/order/service/impl/OrderConverterImpl.java @@ -5,6 +5,7 @@ import java.util.Collections; import java.util.List; import java.util.Objects; +import com.ruoyi.bst.device.service.DeviceAssembler; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -112,6 +113,9 @@ public class OrderConverterImpl implements OrderConverter{ @Autowired private ModelAssembler modelAssembler; + @Autowired + private DeviceAssembler deviceAssembler; + @Override public OrderPrePriceVO toOrderPrePriceVO(OrderCalcPrePriceDTO dto) { if (dto == null) { @@ -364,7 +368,7 @@ public class OrderConverterImpl implements OrderConverter{ if (orderDevice != null) { // 获取当前设备信息 DeviceVO device = deviceService.selectDeviceById(orderDevice.getDeviceId()); - deviceIotService.refresh(device, null); + deviceAssembler.assembleIot(device); bo.setDevice(device); } @@ -448,7 +452,7 @@ public class OrderConverterImpl implements OrderConverter{ // 查询旧设备 DeviceVO oldDevice = deviceService.selectDeviceById(oldOrderDevice.getDeviceId()); - deviceIotService.refresh(oldDevice, null); + deviceAssembler.assembleIot(oldDevice); ServiceUtil.assertion(oldDevice == null, "ID为%s的旧设备不存在", oldOrderDevice.getDeviceId()); bo.setOldDevice(oldDevice); diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/order/service/impl/OrderServiceImpl.java b/ruoyi-service/src/main/java/com/ruoyi/bst/order/service/impl/OrderServiceImpl.java index 9df764f..2c23da9 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/order/service/impl/OrderServiceImpl.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/order/service/impl/OrderServiceImpl.java @@ -7,6 +7,7 @@ import java.util.List; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; +import com.ruoyi.bst.device.service.DeviceAssembler; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.support.TransactionTemplate; @@ -159,6 +160,9 @@ public class OrderServiceImpl implements OrderService { @Autowired private RedisCache redisCache; + @Autowired + private DeviceAssembler deviceAssembler; + /** * 查询订单 * @@ -478,8 +482,6 @@ public class OrderServiceImpl implements OrderService { /** * 设置日志参数 - * @param lon 手机定位经度 - * @param lat 手机定位纬度 * @param device 设备信息 */ private void setLogParam(DeviceVO device) { @@ -652,7 +654,7 @@ public class OrderServiceImpl implements OrderService { // 设备信息 DeviceVO device = deviceService.selectDeviceById(order.getDeviceId()); - deviceIotService.refresh(device, null); + deviceAssembler.assembleIot(device); if (device == null) { return null; } @@ -710,7 +712,7 @@ public class OrderServiceImpl implements OrderService { // 查询设备 DeviceVO device = deviceService.selectDeviceById(orderDevice.getDeviceId()); ServiceUtil.assertion(device == null, "ID为%s的设备不存在", orderDevice.getDeviceId()); - deviceIotService.refresh(device, null); + deviceAssembler.assembleIot(device); // 设置日志参数 this.setLogParam(device); // 异步使用手机定位更新设备定位 @@ -736,7 +738,7 @@ public class OrderServiceImpl implements OrderService { // 查询设备 DeviceVO device = deviceService.selectDeviceById(orderDevice.getDeviceId()); ServiceUtil.assertion(device == null, "ID为%s的设备不存在", orderDevice.getDeviceId()); - deviceIotService.refresh(device, null); + deviceAssembler.assembleIot(device); // 设置日志参数 this.setLogParam(device); // 异步使用手机定位更新设备定位 From 5b7f48b344ef14593a215f3522760923d5655ba4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A3=B7=E5=8F=B6?= <14103883+leaf-phos@user.noreply.gitee.com> Date: Mon, 19 May 2025 21:16:28 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/ruoyi/web/app/AppOrderController.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 32e2849..bee5b60 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 @@ -169,7 +169,7 @@ public class AppOrderController extends BaseController { OrderVO order = orderService.selectOrderById(dto.getOrderId()); ServiceUtil.assertion(order == null, "订单不存在"); ServiceUtil.assertion(!orderValidator.canOpenDevice(order, getUserId()), "您无权操作ID为%s的订单设备开启", order.getId()); - ServiceUtil.assertion(orderValidator.isTimeout(order), "当前订单已超时,请在安全的区域还车"); + ServiceUtil.assertion(orderValidator.isTimeout(order), "预存款已完用,请还车后再扫码骑行,或联系客服人员处理!"); if (dto.getRequiredIot() == null) { dto.setRequiredIot(true); } @@ -189,7 +189,7 @@ public class AppOrderController extends BaseController { OrderVO order = orderService.selectOrderById(dto.getOrderId()); ServiceUtil.assertion(order == null, "订单不存在"); ServiceUtil.assertion(!orderValidator.canCloseDevice(order, getUserId()), "您无权操作ID为%s的订单设备关闭", order.getId()); - ServiceUtil.assertion(orderValidator.isTimeout(order), "当前订单已超时,请在安全的区域还车"); + ServiceUtil.assertion(orderValidator.isTimeout(order), "预存款已完用,请还车后再扫码骑行,或联系客服人员处理!"); if (dto.getRequiredIot() == null) { dto.setRequiredIot(true); } @@ -208,7 +208,7 @@ public class AppOrderController extends BaseController { OrderVO order = orderService.selectOrderById(dto.getOrderId()); ServiceUtil.assertion(!orderValidator.canChangeDevice(order, getUserId()), "您无权操作ID为%s的订单换车", order.getId()); - ServiceUtil.assertion(orderValidator.isTimeout(order), "当前订单已超时,请在安全的区域还车"); + ServiceUtil.assertion(orderValidator.isTimeout(order), "预存款已完用,请还车后再扫码骑行,或联系客服人员处理!"); dto.setUserId(getUserId()); dto.setUserName(getNickName()); return toAjax(orderService.changeDevice(dto)); From 18bd326d0f22a7b1864860fc9059b93cfea9f3b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A3=B7=E5=8F=B6?= <14103883+leaf-phos@user.noreply.gitee.com> Date: Tue, 20 May 2025 09:58:20 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E5=9D=90=E5=9E=AB=E9=94=81=E3=80=81?= =?UTF-8?q?=E8=AE=BE=E5=A4=87=E8=BF=98=E8=BD=A6=E5=AE=9A=E4=BD=8Ddebug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/AreaSubServiceImpl.java | 2 +- .../com/ruoyi/bst/device/domain/DeviceVO.java | 2 + .../ruoyi/bst/device/mapper/DeviceMapper.xml | 2 + .../ruoyi/bst/device/utils/DeviceUtil.java | 10 ++++ .../com/ruoyi/bst/model/domain/Model.java | 4 ++ .../ruoyi/bst/model/mapper/ModelMapper.xml | 5 ++ .../bst/order/domain/dto/OrderSeatDTO.java | 23 +++++++++ .../ruoyi/bst/order/service/OrderService.java | 9 ++++ .../bst/order/service/OrderValidator.java | 5 ++ .../service/impl/OrderConverterImpl.java | 2 +- .../order/service/impl/OrderServiceImpl.java | 51 ++++++++++++++----- .../service/impl/OrderValidatorImpl.java | 7 +-- .../com/ruoyi/bst/order/utils/OrderUtil.java | 2 +- .../bst/orderDevice/domain/OrderDeviceVO.java | 2 + .../orderDevice/mapper/OrderDeviceMapper.xml | 4 +- .../com/ruoyi/web/app/AppOrderController.java | 14 +++++ 16 files changed, 125 insertions(+), 19 deletions(-) create mode 100644 ruoyi-service/src/main/java/com/ruoyi/bst/order/domain/dto/OrderSeatDTO.java diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/areaSub/service/impl/AreaSubServiceImpl.java b/ruoyi-service/src/main/java/com/ruoyi/bst/areaSub/service/impl/AreaSubServiceImpl.java index d89f6f3..02a20d1 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/areaSub/service/impl/AreaSubServiceImpl.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/areaSub/service/impl/AreaSubServiceImpl.java @@ -3,7 +3,6 @@ package com.ruoyi.bst.areaSub.service.impl; import java.util.Collections; import java.util.List; -import com.ruoyi.common.utils.ServiceUtil; import org.locationtech.jts.geom.Geometry; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -19,6 +18,7 @@ import com.ruoyi.bst.areaSub.service.AreaSubService; import com.ruoyi.common.constant.CacheConstants; import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.ServiceUtil; import com.ruoyi.common.utils.collection.CollectionUtils; import com.ruoyi.common.utils.map.GeoUtils; diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/device/domain/DeviceVO.java b/ruoyi-service/src/main/java/com/ruoyi/bst/device/domain/DeviceVO.java index 3038847..30e2c61 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/device/domain/DeviceVO.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/device/domain/DeviceVO.java @@ -29,6 +29,8 @@ public class DeviceVO extends Device { private BigDecimal modelLowVoltage; @ApiModelProperty("车型续航") private BigDecimal modelFullEndurance; + @ApiModelProperty("车型是否允许用户打开坐垫锁") + private Boolean modelEnableSeat; // 运营区 @ApiModelProperty("运营区名称") diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/device/mapper/DeviceMapper.xml b/ruoyi-service/src/main/java/com/ruoyi/bst/device/mapper/DeviceMapper.xml index 55df5ef..58cc941 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/device/mapper/DeviceMapper.xml +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/device/mapper/DeviceMapper.xml @@ -51,6 +51,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" bm.full_voltage as model_full_voltage, bm.low_voltage as model_low_voltage, bm.full_endurance as model_full_endurance, + bm.enable_seat as model_enable_seat, ba.name as area_name, ba.user_id as area_user_id, ba.undercharge as area_undercharge, @@ -132,6 +133,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and bd.last_time >= #{query.lastTimeStart} and bd.location_type = #{query.locationType} and bd.order_device_id = #{query.orderDeviceId} + and bm.enable_seat = #{query.modelEnableSeat} and ( bd.sn like concat('%', #{query.keyword}, '%') 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 57b9db9..650cc70 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 @@ -205,4 +205,14 @@ public class DeviceUtil { device.setOnlineStatus(DeviceOnlineStatus.ONLINE.getStatus()); device.setLastOnlineTime(at); } + + /** + * 判断设备是否离线 + * + * @param device 设备 + * @return 是否离线 + */ + public static boolean isOffline(DeviceVO device) { + return device != null && device.getOnlineStatus() != null && DeviceOnlineStatus.OFFLINE.getStatus().equals(device.getOnlineStatus()); + } } \ No newline at end of file diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/model/domain/Model.java b/ruoyi-service/src/main/java/com/ruoyi/bst/model/domain/Model.java index 243748a..3917ffd 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/model/domain/Model.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/model/domain/Model.java @@ -71,6 +71,10 @@ public class Model extends BaseEntity implements LogBizParam @Min(value = 0, message = "骑行低电量提醒不能小于0") private Integer lowBatteryReminder; + @Excel(name = "是否允许用户打开坐垫锁") + @ApiModelProperty("是否允许用户打开坐垫锁") + private Boolean enableSeat; + @Override public Object logBizId() { return id; diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/model/mapper/ModelMapper.xml b/ruoyi-service/src/main/java/com/ruoyi/bst/model/mapper/ModelMapper.xml index 23ec1dd..c4c8510 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/model/mapper/ModelMapper.xml +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/model/mapper/ModelMapper.xml @@ -19,6 +19,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" bm.deleted, bm.low_battery_reminder_switch, bm.low_battery_reminder, + bm.enable_seat, su.nick_name as user_name from @@ -36,6 +37,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and bm.deleted = false and bm.low_battery_reminder_switch = #{query.lowBatteryReminderSwitch} and su.nick_name like concat('%', #{query.userName}, '%') + and bm.enable_seat = #{query.enableSeat} and bm.id in @@ -86,6 +88,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" remark, low_battery_reminder_switch, low_battery_reminder, + enable_seat, #{areaId}, @@ -98,6 +101,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{remark}, #{lowBatteryReminderSwitch}, #{lowBatteryReminder}, + #{enableSeat}, @@ -119,6 +123,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" remark = #{data.remark}, low_battery_reminder_switch = #{data.lowBatteryReminderSwitch}, low_battery_reminder = #{data.lowBatteryReminder}, + enable_seat = #{data.enableSeat}, diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/order/domain/dto/OrderSeatDTO.java b/ruoyi-service/src/main/java/com/ruoyi/bst/order/domain/dto/OrderSeatDTO.java new file mode 100644 index 0000000..efe7824 --- /dev/null +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/order/domain/dto/OrderSeatDTO.java @@ -0,0 +1,23 @@ +package com.ruoyi.bst.order.domain.dto; + +import java.math.BigDecimal; + +import javax.validation.constraints.NotNull; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class OrderSeatDTO { + + @ApiModelProperty("订单ID") + @NotNull(message = "订单ID不能为空") + private Long orderId; + + @ApiModelProperty("手机经度") + private BigDecimal lon; + + @ApiModelProperty("手机纬度") + private BigDecimal lat; + +} diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/order/service/OrderService.java b/ruoyi-service/src/main/java/com/ruoyi/bst/order/service/OrderService.java index 82e3c3c..d0f5d6a 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/order/service/OrderService.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/order/service/OrderService.java @@ -14,6 +14,7 @@ import com.ruoyi.bst.order.domain.dto.OrderCreateDTO; import com.ruoyi.bst.order.domain.dto.OrderEndDTO; import com.ruoyi.bst.order.domain.dto.OrderOpenDeviceDTO; import com.ruoyi.bst.order.domain.dto.OrderRefundDTO; +import com.ruoyi.bst.order.domain.dto.OrderSeatDTO; import com.ruoyi.bst.order.domain.dto.OrderVerifyDTO; import com.ruoyi.bst.order.domain.vo.OrderEndVO; import com.ruoyi.bst.order.domain.vo.OrderFeeVO; @@ -209,4 +210,12 @@ public interface OrderService { * @param distance 距离 */ public int updateDisatance(Long id, BigDecimal distance); + + /** + * 打开坐垫锁 + * + * @param dto 参数 + * @return 结果 + */ + public boolean seat(OrderSeatDTO dto); } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/order/service/OrderValidator.java b/ruoyi-service/src/main/java/com/ruoyi/bst/order/service/OrderValidator.java index e8afc76..2fea2d9 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/order/service/OrderValidator.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/order/service/OrderValidator.java @@ -101,4 +101,9 @@ public interface OrderValidator { * 是否是用户 */ boolean isUser(Long orderId, Long userId); + + /** + * 是否是用户 + */ + boolean isUser(OrderVO order, Long userId); } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/order/service/impl/OrderConverterImpl.java b/ruoyi-service/src/main/java/com/ruoyi/bst/order/service/impl/OrderConverterImpl.java index e32ee77..2928464 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/order/service/impl/OrderConverterImpl.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/order/service/impl/OrderConverterImpl.java @@ -5,7 +5,6 @@ import java.util.Collections; import java.util.List; import java.util.Objects; -import com.ruoyi.bst.device.service.DeviceAssembler; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -21,6 +20,7 @@ import com.ruoyi.bst.areaSub.service.AreaSubService; import com.ruoyi.bst.channel.domain.ChannelVO; import com.ruoyi.bst.channel.service.ChannelService; import com.ruoyi.bst.device.domain.DeviceVO; +import com.ruoyi.bst.device.service.DeviceAssembler; import com.ruoyi.bst.device.service.DeviceIotService; import com.ruoyi.bst.device.service.DeviceService; import com.ruoyi.bst.locationLog.domain.vo.LocationLogPositionVO; diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/order/service/impl/OrderServiceImpl.java b/ruoyi-service/src/main/java/com/ruoyi/bst/order/service/impl/OrderServiceImpl.java index 2c23da9..22b62a1 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/order/service/impl/OrderServiceImpl.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/order/service/impl/OrderServiceImpl.java @@ -7,7 +7,6 @@ import java.util.List; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; -import com.ruoyi.bst.device.service.DeviceAssembler; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.support.TransactionTemplate; @@ -27,6 +26,7 @@ import com.ruoyi.bst.device.domain.DeviceVO; import com.ruoyi.bst.device.domain.enums.DeviceLocationType; import com.ruoyi.bst.device.domain.enums.DeviceUnLockType; import com.ruoyi.bst.device.domain.vo.DeviceIotVO; +import com.ruoyi.bst.device.service.DeviceAssembler; import com.ruoyi.bst.device.service.DeviceIotService; import com.ruoyi.bst.device.service.DeviceService; import com.ruoyi.bst.device.utils.DeviceUtil; @@ -49,6 +49,7 @@ import com.ruoyi.bst.order.domain.dto.OrderCreateDTO; import com.ruoyi.bst.order.domain.dto.OrderEndDTO; import com.ruoyi.bst.order.domain.dto.OrderOpenDeviceDTO; import com.ruoyi.bst.order.domain.dto.OrderRefundDTO; +import com.ruoyi.bst.order.domain.dto.OrderSeatDTO; import com.ruoyi.bst.order.domain.dto.OrderVerifyDTO; import com.ruoyi.bst.order.domain.enums.OrderReturnType; import com.ruoyi.bst.order.domain.enums.OrderStatus; @@ -83,6 +84,7 @@ import com.ruoyi.common.utils.MathUtils; import com.ruoyi.common.utils.ServiceUtil; import com.ruoyi.common.utils.SnowFlakeUtil; import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.bean.BeanUtils; import com.ruoyi.common.utils.collection.CollectionUtils; import com.ruoyi.system.user.service.UserService; @@ -498,18 +500,14 @@ public class OrderServiceImpl implements OrderService { private void handleDeviceLocationAsync(DeviceVO device, BigDecimal lon, BigDecimal lat) { if (device != null && device.getId() != null && StringUtils.isNotBlank(device.getMac()) && DeviceUtil.validLocation(lon, lat)) { scheduledExecutorService.execute(() -> { - device.setLongitude(lon); - device.setLatitude(lat); - device.setLocationType(DeviceLocationType.PHONE.getCode()); - device.setLastLocationTime(LocalDateTime.now()); - // 若卫星信号弱,则更新设备定位 - if (DeviceUtil.isLowSatelliteSignal(device)) { + // 若卫星信号弱或者离线,则更新设备定位 + if (DeviceUtil.isLowSatelliteSignal(device) || DeviceUtil.isOffline(device)) { Device data = new Device(); data.setMac(device.getMac()); - data.setLongitude(device.getLongitude()); - data.setLatitude(device.getLatitude()); - data.setLocationType(device.getLocationType()); + data.setLongitude(lon); + data.setLatitude(lat); + data.setLocationType(DeviceLocationType.PHONE.getCode()); data.setLastLocationTime(LocalDateTime.now()); int rows = deviceIotService.updateIot(data); if (rows != 1) { @@ -517,12 +515,19 @@ public class OrderServiceImpl implements OrderService { } } - // 直接保存定位日志 - LocationLog locationLog = locationLogConverter.toPo(device); + // 直接保存手机定位日志 + DeviceVO vo = new DeviceVO(); + BeanUtils.copyProperties(device, vo); + vo.setLongitude(lon); + vo.setLatitude(lat); + vo.setLocationType(DeviceLocationType.PHONE.getCode()); + vo.setLastLocationTime(LocalDateTime.now()); + LocationLog locationLog = locationLogConverter.toPo(vo); if (locationLog == null) { log.error("通过手机定位转换定位日志失败: {}", device.getMac()); return; } + // 暂存到Redis缓存 redisCache.rightPush(CacheConstants.LOCATION_LOG_QUEUE, locationLog); @@ -890,4 +895,26 @@ public class OrderServiceImpl implements OrderService { return orderMapper.updateOrder(data); } + @Override + public boolean seat(OrderSeatDTO dto) { + OrderVO order = this.selectOrderById(dto.getOrderId()); + ServiceUtil.assertion(order == null, "ID为%s的订单不存在", dto.getOrderId()); + ServiceUtil.assertion(!OrderStatus.inUse().contains(order.getStatus()), "ID为%s的订单当前状态不允许打开坐垫锁", dto.getOrderId()); + + // 查询设备 + DeviceVO device = deviceService.selectDeviceById(order.getDeviceId()); + ServiceUtil.assertion(device == null, "ID为%s的设备不存在", order.getDeviceId()); + boolean enableSeat = device.getModelEnableSeat() != null && device.getModelEnableSeat(); + ServiceUtil.assertion(!enableSeat, "ID为%s的设备不允许用户打开坐垫锁", order.getDeviceId()); + deviceAssembler.assembleIot(device); + + // 设置日志参数 + this.setLogParam(device); + + // 异步使用手机定位更新设备定位 + this.handleDeviceLocationAsync(device, dto.getLon(), dto.getLat()); + + return deviceIotService.unlockSeat(device, "订单打开坐垫锁:" + order.getNo(), false); + } + } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/order/service/impl/OrderValidatorImpl.java b/ruoyi-service/src/main/java/com/ruoyi/bst/order/service/impl/OrderValidatorImpl.java index 8a3239e..199d8a9 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/order/service/impl/OrderValidatorImpl.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/order/service/impl/OrderValidatorImpl.java @@ -7,8 +7,6 @@ import java.util.HashSet; import java.util.List; import java.util.Objects; -import com.ruoyi.bst.device.utils.DeviceUtil; -import com.ruoyi.bst.orderDevice.domain.enums.OrderDeviceStatus; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -21,6 +19,7 @@ import com.ruoyi.bst.device.domain.DeviceQuery; import com.ruoyi.bst.device.domain.DeviceVO; import com.ruoyi.bst.device.domain.enums.DeviceStatus; import com.ruoyi.bst.device.service.DeviceService; +import com.ruoyi.bst.device.utils.DeviceUtil; import com.ruoyi.bst.model.domain.ModelVO; import com.ruoyi.bst.order.domain.OrderQuery; import com.ruoyi.bst.order.domain.OrderVO; @@ -121,7 +120,8 @@ public class OrderValidatorImpl implements OrderValidator{ } // 是否是下单用户 - private boolean isUser(OrderVO order, Long userId) { + @Override + public boolean isUser(OrderVO order, Long userId) { return order != null && userId != null && Objects.equals(order.getUserId(), userId); } @@ -244,4 +244,5 @@ public class OrderValidatorImpl implements OrderValidator{ OrderVO order = orderMapper.selectOrderById(orderId); return isUser(order, userId); } + } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/order/utils/OrderUtil.java b/ruoyi-service/src/main/java/com/ruoyi/bst/order/utils/OrderUtil.java index 6f19b62..0b6c3d1 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/order/utils/OrderUtil.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/order/utils/OrderUtil.java @@ -141,7 +141,7 @@ public class OrderUtil { vo.setMobileAreaSub(mobileAreaSub); // 是否在停车点 boolean inParking = deviceAreaSub != null || mobileAreaSub != null; - vo.setInParking(inParking); + vo.setInParking(inParking); // 实际停车点 if (deviceAreaSub != null) { diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/orderDevice/domain/OrderDeviceVO.java b/ruoyi-service/src/main/java/com/ruoyi/bst/orderDevice/domain/OrderDeviceVO.java index d7366f9..8b7378d 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/orderDevice/domain/OrderDeviceVO.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/orderDevice/domain/OrderDeviceVO.java @@ -46,6 +46,8 @@ public class OrderDeviceVO extends OrderDevice{ // 车型 @ApiModelProperty("车型") private String deviceModelName; + @ApiModelProperty("车型是否允许用户打开坐垫锁") + private Boolean deviceModelEnableSeat; // 设备剩余续航(公里) public BigDecimal getDeviceRemainEndurance() { diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/orderDevice/mapper/OrderDeviceMapper.xml b/ruoyi-service/src/main/java/com/ruoyi/bst/orderDevice/mapper/OrderDeviceMapper.xml index ce54822..e6ad75c 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/orderDevice/mapper/OrderDeviceMapper.xml +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/orderDevice/mapper/OrderDeviceMapper.xml @@ -44,7 +44,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" bd.latitude as device_latitude, su.nick_name as order_user_name, mch.nick_name as device_mch_name, - bm.name as device_model_name + bm.name as device_model_name, + bm.enable_seat as device_model_eanble_seat from bst_order_device bod left join bst_order bo on bo.id = bod.order_id left join bst_device bd on bd.id = bod.device_id @@ -75,6 +76,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and bod.end_area_sub_name like concat('%', #{query.endAreaSubName}, '%') and bod.return_mode = #{query.returnMode} and bm.name like concat('%', #{query.deviceModelName}, '%') + and bm.enable_seat = #{query.deviceModelEnableSeat} and bod.status in 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 bee5b60..8eab379 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 @@ -21,6 +21,7 @@ import com.ruoyi.bst.order.domain.dto.OrderCloseDeviceDTO; import com.ruoyi.bst.order.domain.dto.OrderCreateDTO; import com.ruoyi.bst.order.domain.dto.OrderEndDTO; import com.ruoyi.bst.order.domain.dto.OrderOpenDeviceDTO; +import com.ruoyi.bst.order.domain.dto.OrderSeatDTO; import com.ruoyi.bst.order.domain.enums.OrderReturnType; import com.ruoyi.bst.order.domain.enums.OrderStatus; import com.ruoyi.bst.order.domain.vo.OrderEndVO; @@ -214,4 +215,17 @@ public class AppOrderController extends BaseController { return toAjax(orderService.changeDevice(dto)); } + @ApiOperation("打开坐垫锁") + @PutMapping("/seat") + @Log(title = "打开坐垫锁", businessType = BusinessType.OTHER, bizIdName = "arg0", bizType = LogBizType.ORDER) + public AjaxResult seat(@RequestBody @Validated OrderSeatDTO dto) { + // 设置日志参数 + LogParamHolder.set(LogParamHolder.PARAM_LON, dto.getLon()); + LogParamHolder.set(LogParamHolder.PARAM_LAT, dto.getLat()); + + OrderVO order = orderService.selectOrderById(dto.getOrderId()); + ServiceUtil.assertion(!orderValidator.isUser(order, getUserId()), "您无权操作ID为%s的订单打开坐垫锁", order.getId()); + return success(orderService.seat(dto)); + } + }