29 Commits

Author SHA1 Message Date
cde34cab6c Merge branch '6170' into prod 2025-12-26 16:22:57 +08:00
dff37b245a Merge branch 'dyf-device' into 6170 2025-12-26 16:22:00 +08:00
d7c4d22de3 该设备类型下已有设备,无法修改设备类型名称!!! 2025-12-26 16:21:33 +08:00
6a058318f2 设备记录列表显示问题修改 2025-12-26 15:54:14 +08:00
f2d74b8f17 Merge branch 'dyf-device' into 6170 2025-12-22 15:09:39 +08:00
af42a2199c 根据用户ID查询菜单 2025-12-22 15:09:07 +08:00
aaf142ca67 提交 2025-12-19 17:55:48 +08:00
7d256df790 Merge branch 'dyf-device' into prod 2025-12-19 16:22:55 +08:00
3d1c2f4e56 Merge branch 'dyf-device' into prod 2025-12-19 14:08:03 +08:00
ccadcb8d4e Merge branch '6170' into prod 2025-12-12 14:59:50 +08:00
b8cb663bbf Merge branch 'jingquan' into prod 2025-12-03 16:56:49 +08:00
56e86b070d Merge branch 'dyf-device' into prod 2025-12-01 13:33:59 +08:00
0898855108 Merge branch '6170' into prod 2025-11-28 10:18:54 +08:00
92b65ce6df Merge branch 'dyf-device' into prod 2025-11-27 11:01:58 +08:00
82399cffed Merge branch 'dyf-device' into prod 2025-08-25 14:33:52 +08:00
5538ac96e5 晶全日志配置 2025-08-06 09:48:00 +08:00
b703f80355 晶全日志配置 2025-08-06 09:44:52 +08:00
b3b249ea07 日志配置 2025-08-06 09:20:41 +08:00
aff424e73b Merge branch 'main' into prod 2025-08-06 09:18:43 +08:00
dc513a858a Merge branch 'main' into prod 2025-08-04 09:08:34 +08:00
df5ce7ddd9 Merge branch 'main' into prod 2025-07-31 09:21:10 +08:00
2174dfdb4d Merge branch 'main' into prod 2025-07-23 19:24:27 +08:00
2800b89e06 Merge branch 'main' into prod 2025-07-23 10:55:30 +08:00
637e46c510 Merge branch 'main' into prod 2025-07-21 08:40:34 +08:00
31c2158c8e Merge branch 'main' into prod 2025-07-19 10:22:33 +08:00
c7c21dc358 Merge branch 'main' into prod 2025-07-18 15:17:54 +08:00
a7e0803b00 Merge branch 'main' into prod 2025-07-17 16:42:14 +08:00
55cacbd322 Merge branch 'main' into prod 2025-07-17 09:24:45 +08:00
99ec6eaff0 prod 2025-07-15 08:40:20 +08:00
21 changed files with 54 additions and 51 deletions

View File

@ -227,7 +227,7 @@ public class AppDeviceShareService {
appDeviceShare.setPermission(bo.getPermission()); appDeviceShare.setPermission(bo.getPermission());
appDeviceShare.setCreateBy(userId); appDeviceShare.setCreateBy(userId);
return appDeviceShareMapper.insert(appDeviceShare); return appDeviceShareMapper.insert(appDeviceShare);
} }
} }
public int remove(Long[] ids) { public int remove(Long[] ids) {

View File

@ -15,11 +15,14 @@ import org.springframework.messaging.MessageHandler;
@Configuration @Configuration
@Slf4j @Slf4j
public class MqttOutboundConfiguration { public class MqttOutboundConfiguration {
@Autowired @Autowired
private MqttPropertiesConfig mqttPropertiesConfig; private MqttPropertiesConfig mqttPropertiesConfig;
@Autowired @Autowired
private MqttPahoClientFactory mqttPahoClientFactory; private MqttPahoClientFactory mqttPahoClientFactory;
// 消息通道 // 消息通道
@Bean @Bean
public MessageChannel mqttOutboundChannel(){ public MessageChannel mqttOutboundChannel(){

View File

@ -1,6 +1,7 @@
package com.fuyuanshen.global.mqtt.constants; package com.fuyuanshen.global.mqtt.constants;
public class DeviceRedisKeyConstants { public class DeviceRedisKeyConstants {
public static final String DEVICE_KEY_PREFIX = "device:"; public static final String DEVICE_KEY_PREFIX = "device:";
// 设备上报状态 // 设备上报状态
public static final String DEVICE_STATUS_KEY_PREFIX = ":status"; public static final String DEVICE_STATUS_KEY_PREFIX = ":status";
@ -52,4 +53,5 @@ public class DeviceRedisKeyConstants {
* 告警信息 * 告警信息
*/ */
public static final String DEVICE_ALARM_MESSAGE_KEY_PREFIX = ":alarmMessage"; public static final String DEVICE_ALARM_MESSAGE_KEY_PREFIX = ":alarmMessage";
} }

View File

@ -36,7 +36,6 @@ public class LightingCommandTypeConstants {
*/ */
public static final String SEND_MESSAGE = "Light_6"; public static final String SEND_MESSAGE = "Light_6";
/** /**
* 报警模式 * 报警模式
*/ */

View File

@ -57,12 +57,12 @@ public class BjqAlarmRule implements MqttMessageRule {
if (StringUtils.isNotBlank(convertValue)) { if (StringUtils.isNotBlank(convertValue)) {
// 将设备状态信息存储到Redis中 // 将设备状态信息存储到Redis中
String deviceRedisKey = GlobalConstants.GLOBAL_REDIS_KEY + DeviceRedisKeyConstants.DEVICE_KEY_PREFIX + context.getDeviceImei() + DEVICE_ALARM_KEY_PREFIX; String deviceRedisKey = GlobalConstants.GLOBAL_REDIS_KEY + DeviceRedisKeyConstants.DEVICE_KEY_PREFIX + context.getDeviceImei() + DEVICE_ALARM_KEY_PREFIX;
String sendMessageIng = GLOBAL_REDIS_KEY+ DEVICE_KEY_PREFIX + context.getDeviceImei() + ":messageSending"; String sendMessageIng = GLOBAL_REDIS_KEY + DEVICE_KEY_PREFIX + context.getDeviceImei() + ":messageSending";
if ("1".equals(convertValue)) { if ("1".equals(convertValue)) {
RedisUtils.setCacheObject(sendMessageIng, "1", Duration.ofDays(1)); RedisUtils.setCacheObject(sendMessageIng, "1", Duration.ofDays(1));
// 存储到Redis // 存储到Redis
RedisUtils.setCacheObject(deviceRedisKey, "1"); RedisUtils.setCacheObject(deviceRedisKey, "1");
}else if ("0".equals(convertValue)){ } else if ("0".equals(convertValue)) {
RedisUtils.deleteObject(sendMessageIng); RedisUtils.deleteObject(sendMessageIng);
RedisUtils.deleteObject(deviceRedisKey); RedisUtils.deleteObject(deviceRedisKey);
} }

View File

@ -71,5 +71,4 @@ public class BjqLaserModeSettingsRule implements MqttMessageRule {
} }
} }

View File

@ -45,6 +45,7 @@ public class BjqModeRule implements MqttMessageRule {
return LightingCommandTypeConstants.LIGHT_MODE; return LightingCommandTypeConstants.LIGHT_MODE;
} }
@Override @Override
public void execute(MqttRuleContext context) { public void execute(MqttRuleContext context) {
String functionAccess = FUNCTION_ACCESS_KEY + context.getDeviceImei(); String functionAccess = FUNCTION_ACCESS_KEY + context.getDeviceImei();

View File

@ -1,32 +1,18 @@
package com.fuyuanshen.global.mqtt.rule.bjq; package com.fuyuanshen.global.mqtt.rule.bjq;
import com.alibaba.fastjson2.JSONObject;
import com.fuyuanshen.common.core.constant.GlobalConstants;
import com.fuyuanshen.common.core.utils.StringUtils;
import com.fuyuanshen.common.json.utils.JsonUtils;
import com.fuyuanshen.common.redis.utils.RedisUtils; import com.fuyuanshen.common.redis.utils.RedisUtils;
import com.fuyuanshen.equipment.utils.map.GetAddressFromLatUtil;
import com.fuyuanshen.equipment.utils.map.LngLonUtil;
import com.fuyuanshen.global.mqtt.base.MqttMessageRule; import com.fuyuanshen.global.mqtt.base.MqttMessageRule;
import com.fuyuanshen.global.mqtt.base.MqttRuleContext; import com.fuyuanshen.global.mqtt.base.MqttRuleContext;
import com.fuyuanshen.global.mqtt.config.MqttGateway; import com.fuyuanshen.global.mqtt.config.MqttGateway;
import com.fuyuanshen.global.mqtt.constants.DeviceRedisKeyConstants;
import com.fuyuanshen.global.mqtt.constants.LightingCommandTypeConstants; import com.fuyuanshen.global.mqtt.constants.LightingCommandTypeConstants;
import com.fuyuanshen.global.mqtt.constants.MqttConstants;
import com.fuyuanshen.global.mqtt.listener.domain.FunctionAccessStatus; import com.fuyuanshen.global.mqtt.listener.domain.FunctionAccessStatus;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.time.Duration; import java.time.Duration;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import static com.fuyuanshen.common.core.constant.GlobalConstants.FUNCTION_ACCESS_KEY; import static com.fuyuanshen.common.core.constant.GlobalConstants.FUNCTION_ACCESS_KEY;
import static com.fuyuanshen.global.mqtt.constants.DeviceRedisKeyConstants.*;
/** /**
* 定位数据命令处理 * 定位数据命令处理
@ -55,4 +41,5 @@ public class BjqPersonnelInfoDataRule implements MqttMessageRule {
RedisUtils.setCacheObject(functionAccess, FunctionAccessStatus.FAILED.getCode(), Duration.ofSeconds(30)); RedisUtils.setCacheObject(functionAccess, FunctionAccessStatus.FAILED.getCode(), Duration.ofSeconds(30));
} }
} }
} }

View File

@ -27,11 +27,12 @@ public class MqttMessageConsumer {
@Autowired @Autowired
private DeviceMapper deviceMapper; private DeviceMapper deviceMapper;
// 创建两个线程池:一个用于消息获取,一个用于业务处理 // 创建两个线程池:一个用于消息获取,一个用于业务处理
private ExecutorService messageConsumerPool = Executors.newFixedThreadPool(3); private ExecutorService messageConsumerPool = Executors.newFixedThreadPool(3);
private ExecutorService messageProcessorPool = Executors.newFixedThreadPool(10); private ExecutorService messageProcessorPool = Executors.newFixedThreadPool(10);
// 初始化方法,启动消息监听 // 初始化方法,启动消息监听
@PostConstruct @PostConstruct
public void start() { public void start() {
@ -130,4 +131,5 @@ public class MqttMessageConsumer {
log.error("业务处理线程 {} 处理消息时发生错误: {}", threadName, message, e); log.error("业务处理线程 {} 处理消息时发生错误: {}", threadName, message, e);
} }
} }
} }

View File

@ -22,6 +22,8 @@ public class OnlineStatusTask {
@Autowired @Autowired
private DeviceMapper deviceMapper; private DeviceMapper deviceMapper;
// 使用cron表达式每分钟的第0秒执行 // 使用cron表达式每分钟的第0秒执行
@Scheduled(cron = "0 */3 * * * ?") @Scheduled(cron = "0 */3 * * * ?")
public void cronTask() { public void cronTask() {
@ -37,4 +39,5 @@ public class OnlineStatusTask {
} }
}); });
} }
} }

View File

@ -98,6 +98,7 @@ public class DeviceControlCenterController extends BaseController {
return R.ok(appDeviceService.getDeviceInfo(deviceMac)); return R.ok(appDeviceService.getDeviceInfo(deviceMac));
} }
/** /**
* 指令下发记录 * 指令下发记录
*/ */
@ -106,6 +107,7 @@ public class DeviceControlCenterController extends BaseController {
return appDeviceService.getInstructionRecord(dto, pageQuery); return appDeviceService.getInstructionRecord(dto, pageQuery);
} }
/** /**
* 导出 * 导出
*/ */

View File

@ -8,8 +8,8 @@ spring.boot.admin.client:
metadata: metadata:
username: ${spring.boot.admin.client.username} username: ${spring.boot.admin.client.username}
userpassword: ${spring.boot.admin.client.password} userpassword: ${spring.boot.admin.client.password}
username: @monitor.username@ username: ${monitor.username}
password: @monitor.password@ password: ${monitor.password}
--- # snail-job 配置 --- # snail-job 配置
snail-job: snail-job:

View File

@ -11,8 +11,8 @@ spring.boot.admin.client:
metadata: metadata:
username: ${spring.boot.admin.client.username} username: ${spring.boot.admin.client.username}
userpassword: ${spring.boot.admin.client.password} userpassword: ${spring.boot.admin.client.password}
username: @monitor.username@ username: ${monitor.username}
password: @monitor.password@ password: ${monitor.password}
--- # snail-job 配置 --- # snail-job 配置
snail-job: snail-job:

View File

@ -77,4 +77,9 @@ public interface SystemConstants {
*/ */
String ROOT_DEPT_ANCESTORS = "0"; String ROOT_DEPT_ANCESTORS = "0";
/**
* 菜单ID
*/
public static final Long RESTRICTED_MENU_ID = 102L;
} }

View File

@ -79,7 +79,6 @@ public class DeviceTypeController {
public R<DeviceType> getCommunicationMode(@Parameter(name = "设备类型ID", required = true) Long id) { public R<DeviceType> getCommunicationMode(@Parameter(name = "设备类型ID", required = true) Long id) {
DeviceType communicationMode = deviceTypeService.getCommunicationMode(id); DeviceType communicationMode = deviceTypeService.getCommunicationMode(id);
return R.ok(communicationMode); return R.ok(communicationMode);
} }
} }

View File

@ -44,7 +44,7 @@ public class TrackServiceController extends BaseController {
/** /**
* 查询轨迹服务列表 * 查询轨迹服务列表
*/ */
@SaCheckPermission("equipment:trackService:list") // @SaCheckPermission("equipment:trackService:list")
@GetMapping("/list") @GetMapping("/list")
public TableDataInfo<TrackServiceVo> list(TrackServiceBo bo, PageQuery pageQuery) { public TableDataInfo<TrackServiceVo> list(TrackServiceBo bo, PageQuery pageQuery) {
return trackServiceService.queryPageList(bo, pageQuery); return trackServiceService.queryPageList(bo, pageQuery);
@ -53,7 +53,7 @@ public class TrackServiceController extends BaseController {
/** /**
* 轨迹服务列表 * 轨迹服务列表
*/ */
@SaCheckPermission("equipment:trackService:export") // @SaCheckPermission("equipment:trackService:export")
@Log(title = "轨迹服务", businessType = BusinessType.EXPORT) @Log(title = "轨迹服务", businessType = BusinessType.EXPORT)
@PostMapping("/export") @PostMapping("/export")
public void export(TrackServiceBo bo, HttpServletResponse response) { public void export(TrackServiceBo bo, HttpServletResponse response) {
@ -75,7 +75,7 @@ public class TrackServiceController extends BaseController {
/** /**
* 新增轨迹服务 * 新增轨迹服务
*/ */
@SaCheckPermission("equipment:trackService:add") // @SaCheckPermission("equipment:trackService:add")
@Log(title = "轨迹服务", businessType = BusinessType.INSERT) @Log(title = "轨迹服务", businessType = BusinessType.INSERT)
@PostMapping(value = "/add") @PostMapping(value = "/add")
public R<Void> add(@Validated(AddGroup.class) @RequestBody TrackServiceBo bo) { public R<Void> add(@Validated(AddGroup.class) @RequestBody TrackServiceBo bo) {
@ -85,7 +85,7 @@ public class TrackServiceController extends BaseController {
/** /**
* 修改轨迹服务 * 修改轨迹服务
*/ */
@SaCheckPermission("equipment:trackService:edit") // @SaCheckPermission("equipment:trackService:edit")
@Log(title = "轨迹服务", businessType = BusinessType.UPDATE) @Log(title = "轨迹服务", businessType = BusinessType.UPDATE)
@PostMapping(value = "/update") @PostMapping(value = "/update")
public R<Void> edit(@Validated(EditGroup.class) @RequestBody TrackServiceBo bo) { public R<Void> edit(@Validated(EditGroup.class) @RequestBody TrackServiceBo bo) {
@ -97,7 +97,7 @@ public class TrackServiceController extends BaseController {
* *
* @param ids 主键串 * @param ids 主键串
*/ */
@SaCheckPermission("equipment:trackService:remove") // @SaCheckPermission("equipment:trackService:remove")
@Log(title = "轨迹服务", businessType = BusinessType.DELETE) @Log(title = "轨迹服务", businessType = BusinessType.DELETE)
@DeleteMapping(value = "/delete") @DeleteMapping(value = "/delete")
public R<Void> remove(@NotEmpty(message = "主键不能为空") public R<Void> remove(@NotEmpty(message = "主键不能为空")

View File

@ -224,22 +224,13 @@ public class DeviceTypeServiceImpl extends ServiceImpl<DeviceTypeMapper, DeviceT
throw new RuntimeException("设备类型不存在"); throw new RuntimeException("设备类型不存在");
} }
if (!deviceType.getTypeName().equals(resources.getTypeName())) { if (!deviceType.getTypeName().equals(resources.getTypeName())) {
int count = deviceMapper.countByDeviceTypeId(deviceType.getId()); int count = deviceMapper.countByDeviceTypeId(deviceType.getId());
if (count > 0) { if (count > 0) {
throw new RuntimeException("该设备类型下已有绑定设备,无法修改设备类型名称!!!"); throw new RuntimeException("该设备类型下已有设备,无法修改设备类型名称!!!");
} }
} }
// List<Device> devices = deviceMapper.selectList(new QueryWrapper<Device>()
// .eq("device_type", deviceTypeGrants.getDeviceTypeId()));
// if (CollectionUtil.isNotEmpty(devices)) {
// throw new RuntimeException("该设备类型已绑定设备,无法修改!!!");
// }
// 校验设备类型名称 // 校验设备类型名称
DeviceType dt = deviceTypeMapper.selectOne(new QueryWrapper<DeviceType>().eq("type_name", resources.getTypeName())); DeviceType dt = deviceTypeMapper.selectOne(new QueryWrapper<DeviceType>().eq("type_name", resources.getTypeName()));
if (dt != null && !dt.getId().equals(deviceType.getId())) { if (dt != null && !dt.getId().equals(deviceType.getId())) {

View File

@ -13,8 +13,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
a.content, a.content,
a.create_time AS createTime a.create_time AS createTime
FROM FROM
device_log a left join device b on a.device_id = b.id device_log a inner join device b on a.device_id = b.id
left join device_type c on b.device_type = c.id inner join device_type c on b.device_type = c.id
WHERE 1 = 1 WHERE 1 = 1
<if test="bo.deviceType != null"> <if test="bo.deviceType != null">
AND c.id = #{bo.deviceType} AND c.id = #{bo.deviceType}

View File

@ -36,6 +36,7 @@ public class SysMenuController extends BaseController {
private final ISysMenuService menuService; private final ISysMenuService menuService;
/** /**
* 获取路由信息 * 获取路由信息
* *
@ -47,6 +48,7 @@ public class SysMenuController extends BaseController {
return R.ok(menuService.buildMenus(menus)); return R.ok(menuService.buildMenus(menus));
} }
/** /**
* 获取菜单列表 * 获取菜单列表
*/ */

View File

@ -31,6 +31,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.util.*; import java.util.*;
import java.util.stream.Collectors;
/** /**
* 菜单 业务层处理 * 菜单 业务层处理
@ -141,10 +142,17 @@ public class SysMenuServiceImpl implements ISysMenuService {
menus = baseMapper.selectMenuTreeAll(); menus = baseMapper.selectMenuTreeAll();
} else { } else {
menus = baseMapper.selectMenuTreeByUserId(userId); menus = baseMapper.selectMenuTreeByUserId(userId);
// 如果不是超级管理员且不是租户管理员,则过滤掉受限制的菜单
// if (!LoginHelper.isAdmin()) {
menus = menus.stream()
.filter(menu -> !SystemConstants.RESTRICTED_MENU_ID.equals(menu.getMenuId()))
.collect(Collectors.toList());
// }
} }
return getChildPerms(menus, 0); return getChildPerms(menus, 0);
} }
/** /**
* 根据角色ID查询菜单树信息 * 根据角色ID查询菜单树信息
* *

16
pom.xml
View File

@ -85,10 +85,10 @@
<monitor.username>fys</monitor.username> <monitor.username>fys</monitor.username>
<monitor.password>123456</monitor.password> <monitor.password>123456</monitor.password>
</properties> </properties>
<activation> <!-- <activation> -->
<!-- 默认环境 --> <!-- &lt;!&ndash; 默认环境 &ndash;&gt; -->
<activeByDefault>true</activeByDefault> <!-- <activeByDefault>true</activeByDefault> -->
</activation> <!-- </activation> -->
</profile> </profile>
<profile> <profile>
<id>prod</id> <id>prod</id>
@ -98,10 +98,10 @@
<monitor.username>fys</monitor.username> <monitor.username>fys</monitor.username>
<monitor.password>123456</monitor.password> <monitor.password>123456</monitor.password>
</properties> </properties>
<!-- <activation> --> <activation>
<!-- &lt;!&ndash; 默认环境 &ndash;&gt; --> <!-- 默认环境 -->
<!-- <activeByDefault>true</activeByDefault> --> <activeByDefault>true</activeByDefault>
<!-- </activation> --> </activation>
</profile> </profile>
<profile> <profile>
<id>jingquan</id> <id>jingquan</id>