diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/commandLog/domain/CommandLog.java b/ruoyi-service/src/main/java/com/ruoyi/bst/commandLog/domain/CommandLog.java
index ce509e5..628f667 100644
--- a/ruoyi-service/src/main/java/com/ruoyi/bst/commandLog/domain/CommandLog.java
+++ b/ruoyi-service/src/main/java/com/ruoyi/bst/commandLog/domain/CommandLog.java
@@ -1,15 +1,15 @@
package com.ruoyi.bst.commandLog.domain;
+import java.math.BigDecimal;
import java.time.LocalDateTime;
-import java.util.Date;
-import com.fasterxml.jackson.annotation.JsonFormat;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-import org.apache.commons.lang3.builder.ToStringBuilder;
-import org.apache.commons.lang3.builder.ToStringStyle;
+
+import org.springframework.format.annotation.DateTimeFormat;
+
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
-import org.springframework.format.annotation.DateTimeFormat;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
/**
* 命令日志对象 bst_command_log
@@ -61,4 +61,11 @@ public class CommandLog extends BaseEntity
@ApiModelProperty("返回值code")
private Integer iotCode;
+ @Excel(name = "经度")
+ @ApiModelProperty("经度")
+ private BigDecimal longitude;
+
+ @Excel(name = "纬度")
+ @ApiModelProperty("纬度")
+ private BigDecimal latitude;
}
diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/commandLog/mapper/CommandLogMapper.xml b/ruoyi-service/src/main/java/com/ruoyi/bst/commandLog/mapper/CommandLogMapper.xml
index 49e0d51..3cd03ea 100644
--- a/ruoyi-service/src/main/java/com/ruoyi/bst/commandLog/mapper/CommandLogMapper.xml
+++ b/ruoyi-service/src/main/java/com/ruoyi/bst/commandLog/mapper/CommandLogMapper.xml
@@ -17,7 +17,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
bcl.user_id,
bcl.user_name,
bcl.opera_time,
- bcl.iot_code
+ bcl.iot_code,
+ bcl.longitude,
+ bcl.latitude
from bst_command_log bcl
@@ -59,6 +61,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
user_name,
opera_time,
iot_code,
+ longitude,
+ latitude
values
@@ -81,6 +85,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
default,
#{i.iotCode},
default,
+ #{i.longitude},
+ default,
+ #{i.latitude},
+ default,
@@ -97,6 +105,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
user_name,
opera_time,
iot_code,
+ longitude,
+ latitude,
#{type},
@@ -108,6 +118,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
#{userName},
#{operaTime},
#{iotCode},
+ #{longitude},
+ #{latitude},
@@ -129,6 +141,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
user_name = #{data.userName},
opera_time = #{data.operaTime},
iot_code = #{data.iotCode},
+ longitude = #{data.longitude},
+ latitude = #{data.latitude},
diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/commandLog/service/CommandLogService.java b/ruoyi-service/src/main/java/com/ruoyi/bst/commandLog/service/CommandLogService.java
index b7f9936..befd3b0 100644
--- a/ruoyi-service/src/main/java/com/ruoyi/bst/commandLog/service/CommandLogService.java
+++ b/ruoyi-service/src/main/java/com/ruoyi/bst/commandLog/service/CommandLogService.java
@@ -7,6 +7,7 @@ import com.ruoyi.bst.commandLog.domain.CommandLog;
import com.ruoyi.bst.commandLog.domain.CommandLogQuery;
import com.ruoyi.bst.commandLog.domain.CommandLogVO;
import com.ruoyi.common.core.domain.model.LoginUser;
+import com.ruoyi.iot.interfaces.IotDevice;
/**
* 命令日志Service接口
@@ -74,7 +75,7 @@ public interface CommandLogService
* @param loginUser
* @param iotCode
*/
- int addApiLog(String mac, String command, String result, String reason, LoginUser loginUser, Integer iotCode);
+ int addApiLog(IotDevice device, String command, String result, String reason, LoginUser loginUser, Integer iotCode);
/**
* 插入一条蓝牙命令日志
diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/commandLog/service/impl/CommandLogServiceImpl.java b/ruoyi-service/src/main/java/com/ruoyi/bst/commandLog/service/impl/CommandLogServiceImpl.java
index 93529fa..1b7c95c 100644
--- a/ruoyi-service/src/main/java/com/ruoyi/bst/commandLog/service/impl/CommandLogServiceImpl.java
+++ b/ruoyi-service/src/main/java/com/ruoyi/bst/commandLog/service/impl/CommandLogServiceImpl.java
@@ -4,20 +4,21 @@ import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
-import com.ruoyi.bst.commandLog.domain.enums.CommandLogType;
-import com.ruoyi.common.constant.CacheConstants;
-import com.ruoyi.common.core.domain.model.LoginUser;
-import com.ruoyi.common.core.redis.RedisCache;
-import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.common.utils.collection.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.bst.commandLog.domain.CommandLog;
import com.ruoyi.bst.commandLog.domain.CommandLogQuery;
import com.ruoyi.bst.commandLog.domain.CommandLogVO;
+import com.ruoyi.bst.commandLog.domain.enums.CommandLogType;
import com.ruoyi.bst.commandLog.mapper.CommandLogMapper;
import com.ruoyi.bst.commandLog.service.CommandLogService;
+import com.ruoyi.common.constant.CacheConstants;
+import com.ruoyi.common.core.domain.model.LoginUser;
+import com.ruoyi.common.core.redis.RedisCache;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.collection.CollectionUtils;
+import com.ruoyi.iot.interfaces.IotDevice;
/**
* 命令日志Service业务层处理
@@ -108,14 +109,16 @@ public class CommandLogServiceImpl implements CommandLogService
@Override
- public int addApiLog(String mac, String command, String result, String reason, LoginUser loginUser, Integer iotCode) {
+ public int addApiLog(IotDevice device, String command, String result, String reason, LoginUser loginUser, Integer iotCode) {
CommandLog po = new CommandLog();
po.setType(CommandLogType.API.getType());
- po.setMac(mac);
+ po.setMac(device.mac());
po.setCommand(command);
po.setResult(result);
po.setReason(reason);
po.setIotCode(iotCode);
+ po.setLongitude(device.longitude());
+ po.setLatitude(device.latitude());
return this.addLog(po, loginUser);
}
diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/device/domain/Device.java b/ruoyi-service/src/main/java/com/ruoyi/bst/device/domain/Device.java
index 558effd..05cb8c9 100644
--- a/ruoyi-service/src/main/java/com/ruoyi/bst/device/domain/Device.java
+++ b/ruoyi-service/src/main/java/com/ruoyi/bst/device/domain/Device.java
@@ -150,4 +150,14 @@ public class Device extends BaseEntity implements IotDevice
public String mac() {
return this.mac;
}
+
+ @Override
+ public BigDecimal longitude() {
+ return this.longitude;
+ }
+
+ @Override
+ public BigDecimal latitude() {
+ return this.latitude;
+ }
}
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 595409a..f3c1dca 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
@@ -52,14 +52,28 @@ public enum DeviceStatus {
return CollectionUtils.map(DeviceStatus::getCode, IN_USE, AVAILABLE, TEMP_LOCKED);
}
- // 允许锁车的设备状态
- public static List canLock() {
+ // 允许用户锁车的设备状态
+ public static List canUserLock() {
return CollectionUtils.map(DeviceStatus::getCode, AVAILABLE, TEMP_LOCKED, DISPATCHING, IN_USE);
}
+ // 允许管理员锁车的状态
+ public static List canAdminLock() {
+ return CollectionUtils.map(DeviceStatus::getCode, AVAILABLE, TEMP_LOCKED, DISPATCHING, IN_USE, Q_LOCKED);
+ }
+
// 允许用户使用的设备状态
public static List canUse() {
return CollectionUtils.map(DeviceStatus::getCode, AVAILABLE);
}
-}
\ No newline at end of file
+ // 允许返回运营区上电
+ public static List canBackUnlock() {
+ return CollectionUtils.map(DeviceStatus::getCode, Q_LOCKED);
+ }
+
+ // 允许强制锁车的状态
+ public static List canQLock() {
+ return canAdminLock();
+ }
+}
diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/device/domain/enums/DeviceUnLockType.java b/ruoyi-service/src/main/java/com/ruoyi/bst/device/domain/enums/DeviceUnLockType.java
new file mode 100644
index 0000000..6acf118
--- /dev/null
+++ b/ruoyi-service/src/main/java/com/ruoyi/bst/device/domain/enums/DeviceUnLockType.java
@@ -0,0 +1,15 @@
+package com.ruoyi.bst.device.domain.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public enum DeviceUnLockType {
+ ADMIN("ADMIN", "管理员开锁"),
+ USER("USER", "用户开锁"),
+ BACK_AREA("BACK_AREA", "返回运营区上电");
+
+ private final String code;
+ private final String name;
+}
diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/DeviceIotService.java b/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/DeviceIotService.java
index a74cc13..d209ff2 100644
--- a/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/DeviceIotService.java
+++ b/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/DeviceIotService.java
@@ -4,17 +4,19 @@ import java.util.Collections;
import java.util.List;
import com.ruoyi.bst.device.domain.DeviceVO;
+import com.ruoyi.bst.device.domain.enums.DeviceUnLockType;
public interface DeviceIotService {
/**
* 开锁
+ *
* @param device 设备
- * @param isAdmin 是否管理员操作
+ * @param type 是否管理员操作
* @param reason 原因
* @return 结果
*/
- int unlock(DeviceVO device, boolean isAdmin, String reason, boolean requiredIot);
+ int unlock(DeviceVO device, DeviceUnLockType type, String reason, boolean requiredIot);
/**
* 锁车
@@ -28,13 +30,13 @@ public interface DeviceIotService {
/**
* 强制断电
- * @param device 设备
- * @param isAdmin 是否管理员操作
- * @param reason 原因
+ *
+ * @param device 设备
+ * @param reason 原因
* @param requiredIot 是否IOT操作必须成功
* @return 结果
*/
- int qLock(DeviceVO device, boolean isAdmin, String reason, boolean requiredIot);
+ int qLock(DeviceVO device, String reason, boolean requiredIot);
/**
* 播放语音
@@ -45,7 +47,7 @@ public interface DeviceIotService {
*/
boolean play(DeviceVO device, String type, String reason);
- /**
+ /**
* 重启
* @param device 设备
* @param reason 原因
@@ -97,12 +99,13 @@ public interface DeviceIotService {
/**
* 开锁
- * @param id 设备ID
- * @param isAdmin 是否管理员操作
+ *
+ * @param id 设备ID
+ * @param type 是否管理员操作
* @param reason 原因
* @return 结果
*/
- int unlock(Long id, boolean isAdmin, String reason, boolean requiredIot);
+ int unlock(Long id, DeviceUnLockType type, String reason, boolean requiredIot);
/**
* 监控设备
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 b56d54a..72729a7 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
@@ -7,6 +7,7 @@ import java.util.Objects;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
+import com.ruoyi.bst.device.domain.enums.DeviceUnLockType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.support.TransactionTemplate;
@@ -53,33 +54,38 @@ public class DeviceIotServiceImpl implements DeviceIotService {
private final static Integer SUB_SLOW = 300; // 上报频率(慢)
@Override
- public int unlock(DeviceVO device, boolean isAdmin, String reason, boolean requiredIot) {
+ public int unlock(DeviceVO device, DeviceUnLockType type, String reason, boolean requiredIot) {
if (device == null || device.getId() == null) {
return 0;
}
- if (isAdmin) {
+ // 更新设备状态
+ Device data = new Device();
+ data.setLockStatus(DeviceLockStatus.OPEN.getCode());
+ DeviceQuery query = new DeviceQuery();
+ query.setId(device.getId());
+
+ // 管理员解锁
+ if (DeviceUnLockType.ADMIN.equals(type)) {
ServiceUtil.assertion(!DeviceStatus.canAdminUnlock().contains(device.getStatus()), "设备%s当前状态不允许管理员开锁", device.getSn());
- } else {
+ data.setStatus(DeviceStatus.DISPATCHING.getCode());
+ query.setStatusList(DeviceStatus.canAdminUnlock());
+ }
+ // 用户解锁
+ else if (DeviceUnLockType.USER.equals(type)) {
ServiceUtil.assertion(!DeviceStatus.canUserUnlock().contains(device.getStatus()), "设备%s当前状态不允许用户开锁", device.getSn());
+ data.setStatus(DeviceStatus.IN_USE.getCode());
+ query.setStatusList(DeviceStatus.canUserUnlock());
+ }
+ // 返回运营区上电
+ else if (DeviceUnLockType.BACK_AREA.equals(type)) {
+ ServiceUtil.assertion(!DeviceStatus.canBackUnlock().contains(device.getStatus()), "设备%s当前状态不允许返回运营区开锁", device.getSn());
+ data.setStatus(DeviceStatus.IN_USE.getCode());
+ query.setStatusList(DeviceStatus.canBackUnlock());
}
Integer result = transactionTemplate.execute(status -> {
- // 更新设备状态
- Device data = new Device();
- data.setLockStatus(DeviceLockStatus.OPEN.getCode());
- DeviceQuery query = new DeviceQuery();
- query.setId(device.getId());
- // 管理员开锁
- if (isAdmin) {
- data.setStatus(DeviceStatus.DISPATCHING.getCode());
- query.setStatusList(DeviceStatus.canAdminUnlock());
- }
- // 用户开锁
- else {
- data.setStatus(DeviceStatus.IN_USE.getCode());
- query.setStatusList(DeviceStatus.canUserUnlock());
- }
+ // 更新数据库
int rows = deviceMapper.updateByQuery(data, query);
if (rows > 0) {
@@ -104,20 +110,25 @@ public class DeviceIotServiceImpl implements DeviceIotService {
if (device == null || device.getId() == null) {
return 0;
}
-
- ServiceUtil.assertion(!DeviceStatus.canLock().contains(device.getStatus()), "设备%s当前状态不允许锁车", device.getSn());
-
// 是否有正在进行的订单
boolean hasOrder = device.getOrderDeviceId() != null && OrderDeviceStatus.inUse().contains(device.getOrderDeviceStatus());
+ // 构造数据
+ Device data = new Device();
+ data.setLockStatus(DeviceLockStatus.CLOSE.getCode());
+ data.setStatus(hasOrder ? DeviceStatus.TEMP_LOCKED.getCode() : DeviceStatus.AVAILABLE.getCode());
+ DeviceQuery query = new DeviceQuery();
+ query.setId(device.getId());
+ if (isAdmin) {
+ ServiceUtil.assertion(!DeviceStatus.canAdminLock().contains(device.getStatus()), "设备%s当前状态不允许管理员锁车", device.getSn());
+ query.setStatusList(DeviceStatus.canAdminLock());
+ } else {
+ ServiceUtil.assertion(!DeviceStatus.canUserLock().contains(device.getStatus()), "设备%s当前状态不允许用户锁车", device.getSn());
+ query.setStatusList(DeviceStatus.canUserLock());
+ }
+
Integer result = transactionTemplate.execute(status -> {
// 更新设备状态
- Device data = new Device();
- data.setLockStatus(DeviceLockStatus.CLOSE.getCode());
- data.setStatus(hasOrder ? DeviceStatus.TEMP_LOCKED.getCode() : DeviceStatus.AVAILABLE.getCode());
- DeviceQuery query = new DeviceQuery();
- query.setId(device.getId());
- query.setStatusList(DeviceStatus.canLock());
int rows = deviceMapper.updateByQuery(data, query);
if (rows > 0) {
@@ -138,11 +149,11 @@ public class DeviceIotServiceImpl implements DeviceIotService {
}
@Override
- public int qLock(DeviceVO device, boolean isAdmin, String reason, boolean requiredIot) {
+ public int qLock(DeviceVO device, String reason, boolean requiredIot) {
if (device == null || device.getId() == null) {
return 0;
}
- ServiceUtil.assertion(!DeviceStatus.canLock().contains(device.getStatus()), "设备%s当前状态不允许锁车", device.getSn());
+ ServiceUtil.assertion(!DeviceStatus.canQLock().contains(device.getStatus()), "设备%s当前状态不允许强制锁车", device.getSn());
// 是否有正在进行的订单
boolean hasOrder = device.getOrderDeviceId() != null && OrderDeviceStatus.inUse().contains(device.getOrderDeviceStatus());
@@ -154,7 +165,7 @@ public class DeviceIotServiceImpl implements DeviceIotService {
data.setStatus(hasOrder ? DeviceStatus.Q_LOCKED.getCode() : DeviceStatus.AVAILABLE.getCode());
DeviceQuery query = new DeviceQuery();
query.setId(device.getId());
- query.setStatusList(DeviceStatus.canLock());
+ query.setStatusList(DeviceStatus.canQLock());
int rows = deviceMapper.updateByQuery(data, query);
if (rows > 0) {
@@ -296,7 +307,7 @@ public class DeviceIotServiceImpl implements DeviceIotService {
}
@Override
- public int unlock(Long id, boolean isAdmin, String reason, boolean requiredIot) {
+ public int unlock(Long id, DeviceUnLockType type, String reason, boolean requiredIot) {
if (id == null) {
return 0;
}
@@ -304,7 +315,7 @@ public class DeviceIotServiceImpl implements DeviceIotService {
if (device == null) {
return 0;
}
- return this.unlock(device, isAdmin, reason, requiredIot);
+ return this.unlock(device, type, reason, requiredIot);
}
@Override
diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/order/domain/dto/OrderEndDTO.java b/ruoyi-service/src/main/java/com/ruoyi/bst/order/domain/dto/OrderEndDTO.java
index 87a2cbe..3264cc2 100644
--- a/ruoyi-service/src/main/java/com/ruoyi/bst/order/domain/dto/OrderEndDTO.java
+++ b/ruoyi-service/src/main/java/com/ruoyi/bst/order/domain/dto/OrderEndDTO.java
@@ -9,13 +9,13 @@ import lombok.Data;
@Data
public class OrderEndDTO {
-
+
@ApiModelProperty("订单ID")
@NotNull(message = "订单ID不能为空")
private Long orderId;
- @ApiModelProperty("是否忽略还车位置(辅助还车)")
- private Boolean ignoreInParking;
+ @ApiModelProperty("是否辅助还车(管理员还车)")
+ private Boolean isAdmin;
@ApiModelProperty("手机定位(经度)")
private BigDecimal lon;
diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/order/service/impl/OrderPayHandlerImpl.java b/ruoyi-service/src/main/java/com/ruoyi/bst/order/service/impl/OrderPayHandlerImpl.java
index 62cbd3a..a90b274 100644
--- a/ruoyi-service/src/main/java/com/ruoyi/bst/order/service/impl/OrderPayHandlerImpl.java
+++ b/ruoyi-service/src/main/java/com/ruoyi/bst/order/service/impl/OrderPayHandlerImpl.java
@@ -2,6 +2,7 @@ package com.ruoyi.bst.order.service.impl;
import java.time.LocalDateTime;
+import com.ruoyi.bst.device.domain.enums.DeviceUnLockType;
import com.ruoyi.bst.device.service.DeviceIotService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -73,7 +74,7 @@ public class OrderPayHandlerImpl implements PayHandler {
int start = orderDeviceService.start(orderDevice);
ServiceUtil.assertion(start != 1, "开始使用ID为%s的订单设备失败", orderDevice.getId());
- int unlock = deviceIotService.unlock(orderDevice.getDeviceId(), false, "订单支付成功开锁:" + order.getNo(), false);
+ int unlock = deviceIotService.unlock(orderDevice.getDeviceId(), DeviceUnLockType.USER, "订单支付成功开锁:" + order.getNo(), false);
ServiceUtil.assertion(unlock <= 0, "ID为%s的设备解锁失败", orderDevice.getDeviceId());
return rows;
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 5ec1b37..7d44196 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.domain.enums.DeviceUnLockType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.support.TransactionTemplate;
@@ -382,7 +383,7 @@ public class OrderServiceImpl implements OrderService
// 转为BO对象
OrderEndBO bo = orderConverter.toEndBO(dto);
// 校验参数
- boolean ignoreInParking = dto.getIgnoreInParking() != null && dto.getIgnoreInParking();
+ boolean ignoreInParking = dto.getIsAdmin() != null && dto.getIsAdmin();
orderValidator.validate(bo, ignoreInParking);
OrderVO order = bo.getOrder();
@@ -451,7 +452,7 @@ public class OrderServiceImpl implements OrderService
ServiceUtil.assertion(finish != 1, "结束ID为%s的订单设备失败", orderDevice.getId());
// 设备上锁(必须放最后,因为会操作设备)
- int lock = deviceIotService.lock(orderDevice.getDeviceId(), false, "订单结束上锁:" + orderDevice.getOrderNo(), false);
+ int lock = deviceIotService.lock(orderDevice.getDeviceId(), dto.getIsAdmin(), "订单结束上锁:" + orderDevice.getOrderNo(), false);
ServiceUtil.assertion(lock != 1, "ID为%s的设备上锁失败", orderDevice.getDeviceId());
return rows;
@@ -567,7 +568,7 @@ public class OrderServiceImpl implements OrderService
ServiceUtil.assertion(orderDevice == null, "ID为%s的订单设备不存在", order.getId());
ServiceUtil.assertion(!OrderDeviceStatus.inUse().contains(orderDevice.getStatus()), "ID为%s的订单设备当前状态并非使用中,无法操作设备", order.getId());
- return deviceIotService.unlock(orderDevice.getDeviceId(), false, "订单开锁:" + order.getNo(), requiredIot);
+ return deviceIotService.unlock(orderDevice.getDeviceId(), DeviceUnLockType.USER, "订单开锁:" + order.getNo(), requiredIot);
}
@Override
@@ -629,7 +630,7 @@ public class OrderServiceImpl implements OrderService
int lock = deviceIotService.lock(oldOrderDevice.getDeviceId(), false, "订单换车上锁:" + order.getNo(), false);
ServiceUtil.assertion(lock != 1, "ID为%s的旧设备上锁失败", oldOrderDevice.getDeviceId());
// 新设备解锁
- int unlock = deviceIotService.unlock(newOrderDevice.getDeviceId(), false, "订单换车开锁:" + order.getNo(), false);
+ int unlock = deviceIotService.unlock(newOrderDevice.getDeviceId(), DeviceUnLockType.USER, "订单换车开锁:" + order.getNo(), false);
ServiceUtil.assertion(unlock <= 0, "ID为%s的新设备解锁失败", newOrderDevice.getDeviceId());
return start;
diff --git a/ruoyi-service/src/main/java/com/ruoyi/iot/interfaces/IotDevice.java b/ruoyi-service/src/main/java/com/ruoyi/iot/interfaces/IotDevice.java
index 264e324..a928dff 100644
--- a/ruoyi-service/src/main/java/com/ruoyi/iot/interfaces/IotDevice.java
+++ b/ruoyi-service/src/main/java/com/ruoyi/iot/interfaces/IotDevice.java
@@ -1,5 +1,7 @@
package com.ruoyi.iot.interfaces;
+import java.math.BigDecimal;
+
/**
* @author wjh
* 2024/9/25
@@ -9,4 +11,10 @@ public interface IotDevice {
// 获取MAC-1
String mac();
+ // 定位(经度)
+ BigDecimal longitude();
+
+ // 定位(纬度)
+ BigDecimal latitude();
+
}
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 d4399fa..7baf7f8 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
@@ -6,6 +6,7 @@ import java.time.LocalDateTime;
import java.util.List;
import java.util.concurrent.TimeUnit;
+import com.ruoyi.bst.device.domain.enums.DeviceUnLockType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -161,9 +162,9 @@ public class IotReceiveServiceImpl implements IotReceiveService {
// 在运营区内,并且不在禁行区内,并且车辆为强制断电状态,为车辆上电
if (isInAreaMax && !isInNoRidingArea && isQLocked && !isOpen && hasOrder) {
- deviceIotService.unlock(device, false, "重新返回运营区上电", false);
+ deviceIotService.unlock(device, DeviceUnLockType.BACK_AREA, "重新返回运营区上电", false);
return 1;
- }
+ }
// 靠近运营区内边界,且车辆为开锁状态,播报语音警告
if(isOpen) {
@@ -172,7 +173,7 @@ public class IotReceiveServiceImpl implements IotReceiveService {
if (areaOutOutage) {
// 超出运营区最大边界,强制断电
if (!isInAreaMax) {
- deviceIotService.qLock(device, false, "超出运营区外边界最大值,强制断电", false);
+ deviceIotService.qLock(device, "超出运营区外边界最大值,强制断电", false);
return 1;
}
boolean isInArea = AreaUtil.isInArea(area, device.getLongitude(), device.getLatitude()); // 是否在运营区内
@@ -186,14 +187,14 @@ public class IotReceiveServiceImpl implements IotReceiveService {
if(!isInArea && isInAreaMax) {
deviceIotService.play(device, IotConstants.PLAY_BOUNDARY_OUT, "超出运营区外边界,还未到达断电距离");
return 1;
- }
+ }
}
boolean noRidingOutage = area.getNoRidingOutage() != null && area.getNoRidingOutage(); // 禁行区内断电
if (noRidingOutage) {
// 进入禁行区,强制断电
if (isInNoRidingArea) {
- deviceIotService.qLock(device, false, "进入禁行区,强制断电", false);
+ deviceIotService.qLock(device, "进入禁行区,强制断电", false);
return 1;
}
@@ -206,7 +207,7 @@ public class IotReceiveServiceImpl implements IotReceiveService {
return 1;
}
}
- }
+ }
return 0;
}
diff --git a/ruoyi-service/src/main/java/com/ruoyi/iot/service/impl/IotServiceImpl.java b/ruoyi-service/src/main/java/com/ruoyi/iot/service/impl/IotServiceImpl.java
index a4991d8..ae42a3e 100644
--- a/ruoyi-service/src/main/java/com/ruoyi/iot/service/impl/IotServiceImpl.java
+++ b/ruoyi-service/src/main/java/com/ruoyi/iot/service/impl/IotServiceImpl.java
@@ -111,7 +111,7 @@ public class IotServiceImpl implements IotService {
String status = redisCache.getCacheObject(cacheKey);
if (StringUtils.isBlank(status)) {
// 发送命令
- CommandResponse res = uploadData(deviceName, productId, "获取在线状态");
+ CommandResponse res = uploadData(device, "获取在线状态");
status = this.parseToOnlineStatus(res, deviceName, false);
}
@@ -251,15 +251,19 @@ public class IotServiceImpl implements IotService {
return paramsObj.getInteger("code");
}
- private CommandResponse sendCommand(String deviceName, String command, String productId, String reason) {
- return sendCommand(deviceName, command, null, productId, reason);
+ private CommandResponse sendCommand(IotDevice device, String command, String reason) {
+ return sendCommand(device, command, null, reason);
}
// 发送MQTT命令
- private CommandResponse sendCommand(String deviceName, String command, Integer timeout, String productId, String reason) {
+ private CommandResponse sendCommand(IotDevice device, String command, Integer timeout, String reason) {
+ if (device == null || StringUtils.isAnyBlank(device.mac(), command)) {
+ return null;
+ }
if (timeout == null) {
timeout = this.timeout;
}
+ String deviceName = device.mac();
String sendUrl = iotHost + IotConstants.ADDS_COMMAND;
String param = "device_name=" + deviceName + "&product_id=" + productId +"&timeout=" + timeout;
sendUrl = sendUrl + "?" + param;
@@ -271,7 +275,7 @@ public class IotServiceImpl implements IotService {
CommandResponse res = JSON.parseObject(result, CommandResponse.class);
// 记录成功日志
- this.addCommandLog(deviceName, command, res.getMsg(), reason, res.getCode());
+ this.addCommandLog(device, command, res.getMsg(), reason, res.getCode());
// 转为在线状态,并缓存结果30秒
String status = this.parseToOnlineStatus(res, deviceName, true);
@@ -286,77 +290,59 @@ public class IotServiceImpl implements IotService {
return res;
} catch (Exception e) {
- this.addCommandLog(deviceName, command, "操作失败:" + e.getMessage(), reason, null);
+ this.addCommandLog(device, command, "操作失败:" + e.getMessage(), reason, null);
throw e;
}
}
- // 异步添加日志
- private void addCommandLog(String deviceName, String command, String result, String reason, Integer iotCode) {
+ // 新增命令日志
+ private void addCommandLog(IotDevice device, String command, String result, String reason, Integer iotCode) {
LoginUser loginUser = null;
try {
loginUser = SecurityUtils.getLoginUser();
} catch (Exception e) {
log.error(e.getMessage());
}
- commandLogService.addApiLog(deviceName, command, result, reason, loginUser, iotCode);
+ commandLogService.addApiLog(device, command, result, reason, loginUser, iotCode);
}
- private CommandResponse uploadData(String deviceName, String productId, String reason) {
- if (StringUtils.isBlank(deviceName) || StringUtils.isBlank(productId)) {
- return null;
- }
- return sendCommand(deviceName, IotConstants.COMMAND_UPLOAD_DATA, productId, reason);
+ private CommandResponse uploadData(IotDevice device, String reason) {
+ return sendCommand(device, IotConstants.COMMAND_UPLOAD_DATA, reason);
}
@Override
public CommandResponse unlock(IotDevice device, int sub, String reason) {
- if (device == null) {
- return null;
- }
String command = IotConstants.COMMAND_UNLOCK + IotConstants.COMMAND_SUB + sub + IotConstants.COMMAND_SEPARATOR;
- return sendCommand(device.mac(), command, productId, reason);
+ return sendCommand(device, command, reason);
}
@Override
public CommandResponse lock(IotDevice device, int sub, String reason) {
- if (device == null) {
- return null;
- }
String command = IotConstants.COMMAND_LOCK + IotConstants.COMMAND_SUB + sub + IotConstants.COMMAND_SEPARATOR;
- return sendCommand(device.mac(), command, productId, reason);
+ return sendCommand(device, command, reason);
}
@Override
public CommandResponse qLock(IotDevice device, int sub, String reason) {
- if (device == null) {
- return null;
- }
String command = IotConstants.COMMAND_QLOSE + IotConstants.COMMAND_SUB + sub + IotConstants.COMMAND_SEPARATOR;
- return sendCommand(device.mac(), command, productId, reason);
+ return sendCommand(device, command, reason);
}
@Override
public CommandResponse play(IotDevice device, String type, String reason) {
- if (device == null || StringUtils.isBlank(type)) {
+ if (StringUtils.isBlank(type)) {
return null;
}
- return sendCommand(device.mac(), IotConstants.COMMAND_PLAY + type, productId, reason);
+ return sendCommand(device, IotConstants.COMMAND_PLAY + type, reason);
}
@Override
public CommandResponse reboot(IotDevice device, String reason) {
- if (device == null) {
- return null;
- }
- return sendCommand(device.mac(), IotConstants.COMMAND_REBOOT, productId, reason);
+ return sendCommand(device, IotConstants.COMMAND_REBOOT, reason);
}
@Override
public CommandResponse unlockSeat(IotDevice device, String reason) {
- if (device == null) {
- return null;
- }
- return sendCommand(device.mac(), IotConstants.COMMAND_HPEN, productId, reason);
+ return sendCommand(device, IotConstants.COMMAND_HPEN, reason);
}
}
diff --git a/ruoyi-web/src/main/java/com/ruoyi/task/order/OrderTask.java b/ruoyi-web/src/main/java/com/ruoyi/task/order/OrderTask.java
index e9f5477..d05db9f 100644
--- a/ruoyi-web/src/main/java/com/ruoyi/task/order/OrderTask.java
+++ b/ruoyi-web/src/main/java/com/ruoyi/task/order/OrderTask.java
@@ -63,9 +63,9 @@ public class OrderTask implements ApplicationRunner {
for (OrderVO order : orderList) {
try {
OrderEndDTO dto = new OrderEndDTO();
- dto.setIgnoreInParking(true);
+ dto.setIsAdmin(true);
dto.setOrderId(order.getId());
- dto.setEndReason("系统自动结束");
+ dto.setEndReason("超时系统自动结束");
orderService.endOrder(dto);
} catch (Exception e) {
log.error("结束订单失败,订单ID:{}", order.getId(), e);
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 fb2b921..4481e6d 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
@@ -104,7 +104,7 @@ public class AppOrderController extends BaseController {
public AjaxResult endOrder(@RequestBody @Validated OrderEndDTO dto) {
OrderVO order = orderService.selectOrderById(dto.getOrderId());
ServiceUtil.assertion(!orderValidator.canEnd(order, getUserId()), "您无权结束ID为%s的订单", order.getId());
- dto.setIgnoreInParking(false);
+ dto.setIsAdmin(false);
dto.setEndReason("用户【" + getNickName() + "】手动还车");
return success(orderService.endOrder(dto));
}
@@ -112,7 +112,7 @@ public class AppOrderController extends BaseController {
@ApiOperation("计算订单费用")
@PostMapping("/calcFee")
public AjaxResult calcFee(@RequestBody @Validated OrderEndDTO dto) {
- dto.setIgnoreInParking(false);
+ dto.setIsAdmin(false);
OrderFeeVO fee = orderService.calcOrderFee(dto);
ServiceUtil.assertion(fee == null, "价格计算失败");
return success(fee);
diff --git a/ruoyi-web/src/main/java/com/ruoyi/web/bst/DeviceIotController.java b/ruoyi-web/src/main/java/com/ruoyi/web/bst/DeviceIotController.java
index e8bac20..e8c0fda 100644
--- a/ruoyi-web/src/main/java/com/ruoyi/web/bst/DeviceIotController.java
+++ b/ruoyi-web/src/main/java/com/ruoyi/web/bst/DeviceIotController.java
@@ -1,5 +1,6 @@
package com.ruoyi.web.bst;
+import com.ruoyi.bst.device.domain.enums.DeviceUnLockType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.PutMapping;
@@ -42,7 +43,7 @@ public class DeviceIotController extends BaseController {
@PutMapping("/unlock")
public AjaxResult unlock(@RequestParam(required = false) Long id, @RequestParam(required = false) String sn) {
DeviceVO device = this.getDevice(id, sn);
- return toAjax(deviceIotService.unlock(device, true, "管理员开锁", true));
+ return toAjax(deviceIotService.unlock(device, DeviceUnLockType.ADMIN, "管理员开锁", true));
}
@PreAuthorize("@ss.hasPermi('bst:device:lock')")
diff --git a/ruoyi-web/src/main/java/com/ruoyi/web/bst/OrderController.java b/ruoyi-web/src/main/java/com/ruoyi/web/bst/OrderController.java
index e7f1f21..ba8c6e0 100644
--- a/ruoyi-web/src/main/java/com/ruoyi/web/bst/OrderController.java
+++ b/ruoyi-web/src/main/java/com/ruoyi/web/bst/OrderController.java
@@ -82,7 +82,7 @@ public class OrderController extends BaseController
*/
@PreAuthorize("@ss.hasPermi('bst:order:query')")
@GetMapping(value = "/{id}")
- public AjaxResult getInfo(@PathVariable("id") Long id,
+ public AjaxResult getInfo(@PathVariable("id") Long id,
@RequestParam(required = false, defaultValue = "false") Boolean assembleOrderDeviceList)
{
OrderVO order = orderService.selectOrderById(id, true);
@@ -100,7 +100,7 @@ public class OrderController extends BaseController
public AjaxResult end(@RequestBody @Validated OrderEndDTO dto) {
OrderVO order = orderService.selectOrderById(dto.getOrderId(), true);
ServiceUtil.assertion(order == null, "订单不存在");
- dto.setIgnoreInParking(true);
+ dto.setIsAdmin(true);
dto.setEndReason("管理员【" + getNickName() + "】手动还车");
return toAjax(orderService.endOrder(dto));
}