From 9fb72e5ac01760c2b4a750eb454bd4562c9cb99c Mon Sep 17 00:00:00 2001 From: daiyongfei <974332738@qq.com> Date: Fri, 8 Aug 2025 09:49:08 +0800 Subject: [PATCH 01/28] =?UTF-8?q?=E8=AE=BE=E5=A4=87=E5=88=86=E7=BB=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/DeviceGroupController.java | 105 ++++++++++++++ .../DeviceRepairRecordsController.java | 105 ++++++++++++++ .../equipment/domain/DeviceGroup.java | 56 ++++++++ .../equipment/domain/DeviceRepairRecords.java | 58 ++++++++ .../equipment/domain/bo/DeviceGroupBo.java | 56 ++++++++ .../domain/bo/DeviceRepairRecordsBo.java | 60 ++++++++ .../equipment/domain/vo/DeviceGroupVo.java | 68 +++++++++ .../domain/vo/DeviceRepairRecordsVo.java | 70 +++++++++ .../equipment/mapper/DeviceGroupMapper.java | 15 ++ .../mapper/DeviceRepairRecordsMapper.java | 15 ++ .../service/IDeviceGroupService.java | 58 ++++++++ .../service/IDeviceRepairRecordsService.java | 68 +++++++++ .../service/impl/DeviceGroupServiceImpl.java | 120 ++++++++++++++++ .../impl/DeviceRepairRecordsServiceImpl.java | 135 ++++++++++++++++++ .../mapper/equipment/DeviceGroupMapper.xml | 7 + .../equipment/DeviceRepairRecordsMapper.xml | 7 + 16 files changed, 1003 insertions(+) create mode 100644 fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/controller/DeviceGroupController.java create mode 100644 fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/controller/DeviceRepairRecordsController.java create mode 100644 fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/domain/DeviceGroup.java create mode 100644 fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/domain/DeviceRepairRecords.java create mode 100644 fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/domain/bo/DeviceGroupBo.java create mode 100644 fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/domain/bo/DeviceRepairRecordsBo.java create mode 100644 fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/domain/vo/DeviceGroupVo.java create mode 100644 fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/domain/vo/DeviceRepairRecordsVo.java create mode 100644 fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/mapper/DeviceGroupMapper.java create mode 100644 fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/mapper/DeviceRepairRecordsMapper.java create mode 100644 fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/service/IDeviceGroupService.java create mode 100644 fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/service/IDeviceRepairRecordsService.java create mode 100644 fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/service/impl/DeviceGroupServiceImpl.java create mode 100644 fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/service/impl/DeviceRepairRecordsServiceImpl.java create mode 100644 fys-modules/fys-equipment/src/main/resources/mapper/equipment/DeviceGroupMapper.xml create mode 100644 fys-modules/fys-equipment/src/main/resources/mapper/equipment/DeviceRepairRecordsMapper.xml diff --git a/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/controller/DeviceGroupController.java b/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/controller/DeviceGroupController.java new file mode 100644 index 0000000..7720b37 --- /dev/null +++ b/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/controller/DeviceGroupController.java @@ -0,0 +1,105 @@ +package com.fuyuanshen.equipment.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import com.fuyuanshen.common.idempotent.annotation.RepeatSubmit; +import com.fuyuanshen.common.log.annotation.Log; +import com.fuyuanshen.common.web.core.BaseController; +import com.fuyuanshen.common.mybatis.core.page.PageQuery; +import com.fuyuanshen.common.core.domain.R; +import com.fuyuanshen.common.core.validate.AddGroup; +import com.fuyuanshen.common.core.validate.EditGroup; +import com.fuyuanshen.common.log.enums.BusinessType; +import com.fuyuanshen.common.excel.utils.ExcelUtil; +import com.fuyuanshen.equipment.domain.vo.DeviceGroupVo; +import com.fuyuanshen.equipment.domain.bo.DeviceGroupBo; +import com.fuyuanshen.equipment.service.IDeviceGroupService; + +/** + * 设备分组 + * + * @author Lion Li + * @date 2025-08-08 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/fys-equipment/group") +public class DeviceGroupController extends BaseController { + + private final IDeviceGroupService deviceGroupService; + + /** + * 查询设备分组列表 + */ + @SaCheckPermission("fys-equipment:group:list") + @GetMapping("/list") + public R> list(DeviceGroupBo bo) { + List list = deviceGroupService.queryList(bo); + return R.ok(list); + } + + /** + * 导出设备分组列表 + */ + @SaCheckPermission("fys-equipment:group:export") + @Log(title = "设备分组", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(DeviceGroupBo bo, HttpServletResponse response) { + List list = deviceGroupService.queryList(bo); + ExcelUtil.exportExcel(list, "设备分组", DeviceGroupVo.class, response); + } + + /** + * 获取设备分组详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("fys-equipment:group:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(deviceGroupService.queryById(id)); + } + + /** + * 新增设备分组 + */ + @SaCheckPermission("fys-equipment:group:add") + @Log(title = "设备分组", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody DeviceGroupBo bo) { + return toAjax(deviceGroupService.insertByBo(bo)); + } + + /** + * 修改设备分组 + */ + @SaCheckPermission("fys-equipment:group:edit") + @Log(title = "设备分组", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody DeviceGroupBo bo) { + return toAjax(deviceGroupService.updateByBo(bo)); + } + + /** + * 删除设备分组 + * + * @param ids 主键串 + */ + @SaCheckPermission("fys-equipment:group:remove") + @Log(title = "设备分组", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(deviceGroupService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/controller/DeviceRepairRecordsController.java b/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/controller/DeviceRepairRecordsController.java new file mode 100644 index 0000000..1304daa --- /dev/null +++ b/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/controller/DeviceRepairRecordsController.java @@ -0,0 +1,105 @@ +package com.fuyuanshen.equipment.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import com.fuyuanshen.common.idempotent.annotation.RepeatSubmit; +import com.fuyuanshen.common.log.annotation.Log; +import com.fuyuanshen.common.web.core.BaseController; +import com.fuyuanshen.common.mybatis.core.page.PageQuery; +import com.fuyuanshen.common.core.domain.R; +import com.fuyuanshen.common.core.validate.AddGroup; +import com.fuyuanshen.common.core.validate.EditGroup; +import com.fuyuanshen.common.log.enums.BusinessType; +import com.fuyuanshen.common.excel.utils.ExcelUtil; +import com.fuyuanshen.equipment.domain.vo.DeviceRepairRecordsVo; +import com.fuyuanshen.equipment.domain.bo.DeviceRepairRecordsBo; +import com.fuyuanshen.equipment.service.IDeviceRepairRecordsService; +import com.fuyuanshen.common.mybatis.core.page.TableDataInfo; + +/** + * 设备维修记录 + * + * @author Lion Li + * @date 2025-08-08 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/equipment/repairRecords") +public class DeviceRepairRecordsController extends BaseController { + + private final IDeviceRepairRecordsService deviceRepairRecordsService; + + /** + * 查询设备维修记录列表 + */ + @SaCheckPermission("equipment:repairRecords:list") + @GetMapping("/list") + public TableDataInfo list(DeviceRepairRecordsBo bo, PageQuery pageQuery) { + return deviceRepairRecordsService.queryPageList(bo, pageQuery); + } + + /** + * 导出设备维修记录列表 + */ + @SaCheckPermission("equipment:repairRecords:export") + @Log(title = "设备维修记录", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(DeviceRepairRecordsBo bo, HttpServletResponse response) { + List list = deviceRepairRecordsService.queryList(bo); + ExcelUtil.exportExcel(list, "设备维修记录", DeviceRepairRecordsVo.class, response); + } + + /** + * 获取设备维修记录详细信息 + * + * @param recordId 主键 + */ + @SaCheckPermission("equipment:repairRecords:query") + @GetMapping("/{recordId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long recordId) { + return R.ok(deviceRepairRecordsService.queryById(recordId)); + } + + /** + * 新增设备维修记录 + */ + @SaCheckPermission("equipment:repairRecords:add") + @Log(title = "设备维修记录", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody DeviceRepairRecordsBo bo) { + return toAjax(deviceRepairRecordsService.insertByBo(bo)); + } + + /** + * 修改设备维修记录 + */ + @SaCheckPermission("equipment:repairRecords:edit") + @Log(title = "设备维修记录", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody DeviceRepairRecordsBo bo) { + return toAjax(deviceRepairRecordsService.updateByBo(bo)); + } + + /** + * 删除设备维修记录 + * + * @param recordIds 主键串 + */ + @SaCheckPermission("equipment:repairRecords:remove") + @Log(title = "设备维修记录", businessType = BusinessType.DELETE) + @DeleteMapping("/{recordIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] recordIds) { + return toAjax(deviceRepairRecordsService.deleteWithValidByIds(List.of(recordIds), true)); + } +} diff --git a/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/domain/DeviceGroup.java b/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/domain/DeviceGroup.java new file mode 100644 index 0000000..fa90f59 --- /dev/null +++ b/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/domain/DeviceGroup.java @@ -0,0 +1,56 @@ +package com.fuyuanshen.equipment.domain; + +import com.fuyuanshen.common.tenant.core.TenantEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 设备分组对象 device_group + * + * @author Lion Li + * @date 2025-08-08 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("device_group") +public class DeviceGroup extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(value = "id") + private Long id; + + /** + * 分组名称 + */ + private String groupName; + + /** + * 状态:0-禁用,1-正常 + */ + private Long status; + + /** + * 父分组ID + */ + private Long parentId; + + /** + * 完整分组路径 + */ + private String fullPath; + + /** + * 删除标记:0-未删除,1-已删除 + */ + private Long isDeleted; + + +} diff --git a/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/domain/DeviceRepairRecords.java b/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/domain/DeviceRepairRecords.java new file mode 100644 index 0000000..3fca3c4 --- /dev/null +++ b/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/domain/DeviceRepairRecords.java @@ -0,0 +1,58 @@ +package com.fuyuanshen.equipment.domain; + +import com.fuyuanshen.common.tenant.core.TenantEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 设备维修记录对象 device_repair_records + * + * @author Lion Li + * @date 2025-08-08 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("device_repair_records") +public class DeviceRepairRecords extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 维修记录ID + */ + @TableId(value = "record_id") + private Long recordId; + + /** + * 设备ID + */ + private String deviceId; + + /** + * 维修时间 + */ + private Date repairTime; + + /** + * 维修部位 + */ + private String repairPart; + + /** + * 维修原因 + */ + private String repairReason; + + /** + * 维修人员 + */ + private String repairPerson; + + +} diff --git a/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/domain/bo/DeviceGroupBo.java b/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/domain/bo/DeviceGroupBo.java new file mode 100644 index 0000000..187eb53 --- /dev/null +++ b/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/domain/bo/DeviceGroupBo.java @@ -0,0 +1,56 @@ +package com.fuyuanshen.equipment.domain.bo; + +import com.fuyuanshen.equipment.domain.DeviceGroup; +import com.fuyuanshen.common.mybatis.core.domain.BaseEntity; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 设备分组业务对象 device_group + * + * @author Lion Li + * @date 2025-08-08 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = DeviceGroup.class, reverseConvertGenerate = false) +public class DeviceGroupBo extends BaseEntity { + + /** + * 主键ID + */ + @NotNull(message = "主键ID不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 分组名称 + */ + @NotBlank(message = "分组名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String groupName; + + /** + * 状态:0-禁用,1-正常 + */ + @NotNull(message = "状态:0-禁用,1-正常不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long status; + + /** + * 父分组ID + */ + private Long parentId; + + /** + * 完整分组路径 + */ + private String fullPath; + + /** + * 删除标记:0-未删除,1-已删除 + */ + @NotNull(message = "删除标记:0-未删除,1-已删除不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long isDeleted; + + +} diff --git a/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/domain/bo/DeviceRepairRecordsBo.java b/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/domain/bo/DeviceRepairRecordsBo.java new file mode 100644 index 0000000..0c7529e --- /dev/null +++ b/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/domain/bo/DeviceRepairRecordsBo.java @@ -0,0 +1,60 @@ +package com.fuyuanshen.equipment.domain.bo; + +import com.fuyuanshen.equipment.domain.DeviceRepairRecords; +import com.fuyuanshen.common.mybatis.core.domain.BaseEntity; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 设备维修记录业务对象 device_repair_records + * + * @author Lion Li + * @date 2025-08-08 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = DeviceRepairRecords.class, reverseConvertGenerate = false) +public class DeviceRepairRecordsBo extends BaseEntity { + + /** + * 维修记录ID + */ + @NotNull(message = "维修记录ID不能为空", groups = { EditGroup.class }) + private Long recordId; + + /** + * 设备ID + */ + @NotBlank(message = "设备ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private String deviceId; + + /** + * 维修时间 + */ + @NotNull(message = "维修时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date repairTime; + + /** + * 维修部位 + */ + @NotBlank(message = "维修部位不能为空", groups = { AddGroup.class, EditGroup.class }) + private String repairPart; + + /** + * 维修原因 + */ + @NotBlank(message = "维修原因不能为空", groups = { AddGroup.class, EditGroup.class }) + private String repairReason; + + /** + * 维修人员 + */ + @NotBlank(message = "维修人员不能为空", groups = { AddGroup.class, EditGroup.class }) + private String repairPerson; + + +} diff --git a/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/domain/vo/DeviceGroupVo.java b/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/domain/vo/DeviceGroupVo.java new file mode 100644 index 0000000..fe45339 --- /dev/null +++ b/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/domain/vo/DeviceGroupVo.java @@ -0,0 +1,68 @@ +package com.fuyuanshen.equipment.domain.vo; + +import com.fuyuanshen.equipment.domain.DeviceGroup; +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; +import com.fuyuanshen.common.excel.annotation.ExcelDictFormat; +import com.fuyuanshen.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 设备分组视图对象 device_group + * + * @author Lion Li + * @date 2025-08-08 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = DeviceGroup.class) +public class DeviceGroupVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @ExcelProperty(value = "主键ID") + private Long id; + + /** + * 分组名称 + */ + @ExcelProperty(value = "分组名称") + private String groupName; + + /** + * 状态:0-禁用,1-正常 + */ + @ExcelProperty(value = "状态:0-禁用,1-正常") + private Long status; + + /** + * 父分组ID + */ + @ExcelProperty(value = "父分组ID") + private Long parentId; + + /** + * 完整分组路径 + */ + @ExcelProperty(value = "完整分组路径") + private String fullPath; + + /** + * 删除标记:0-未删除,1-已删除 + */ + @ExcelProperty(value = "删除标记:0-未删除,1-已删除") + private Long isDeleted; + + +} diff --git a/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/domain/vo/DeviceRepairRecordsVo.java b/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/domain/vo/DeviceRepairRecordsVo.java new file mode 100644 index 0000000..f66bb67 --- /dev/null +++ b/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/domain/vo/DeviceRepairRecordsVo.java @@ -0,0 +1,70 @@ +package com.fuyuanshen.equipment.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fuyuanshen.equipment.domain.DeviceRepairRecords; +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; +import com.fuyuanshen.common.excel.annotation.ExcelDictFormat; +import com.fuyuanshen.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 设备维修记录视图对象 device_repair_records + * + * @author Lion Li + * @date 2025-08-08 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = DeviceRepairRecords.class) +public class DeviceRepairRecordsVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 维修记录ID + */ + @ExcelProperty(value = "维修记录ID") + private Long recordId; + + /** + * 设备ID + */ + @ExcelProperty(value = "设备ID") + private String deviceId; + + /** + * 维修时间 + */ + @ExcelProperty(value = "维修时间") + private Date repairTime; + + /** + * 维修部位 + */ + @ExcelProperty(value = "维修部位") + private String repairPart; + + /** + * 维修原因 + */ + @ExcelProperty(value = "维修原因") + private String repairReason; + + /** + * 维修人员 + */ + @ExcelProperty(value = "维修人员") + private String repairPerson; + + +} diff --git a/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/mapper/DeviceGroupMapper.java b/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/mapper/DeviceGroupMapper.java new file mode 100644 index 0000000..a92cfad --- /dev/null +++ b/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/mapper/DeviceGroupMapper.java @@ -0,0 +1,15 @@ +package com.fuyuanshen.equipment.mapper; + +import com.fuyuanshen.equipment.domain.DeviceGroup; +import com.fuyuanshen.equipment.domain.vo.DeviceGroupVo; +import com.fuyuanshen.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 设备分组Mapper接口 + * + * @author Lion Li + * @date 2025-08-08 + */ +public interface DeviceGroupMapper extends BaseMapperPlus { + +} diff --git a/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/mapper/DeviceRepairRecordsMapper.java b/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/mapper/DeviceRepairRecordsMapper.java new file mode 100644 index 0000000..eb3cec2 --- /dev/null +++ b/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/mapper/DeviceRepairRecordsMapper.java @@ -0,0 +1,15 @@ +package com.fuyuanshen.equipment.mapper; + +import com.fuyuanshen.equipment.domain.DeviceRepairRecords; +import com.fuyuanshen.equipment.domain.vo.DeviceRepairRecordsVo; +import com.fuyuanshen.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 设备维修记录Mapper接口 + * + * @author Lion Li + * @date 2025-08-08 + */ +public interface DeviceRepairRecordsMapper extends BaseMapperPlus { + +} diff --git a/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/service/IDeviceGroupService.java b/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/service/IDeviceGroupService.java new file mode 100644 index 0000000..8cda9c8 --- /dev/null +++ b/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/service/IDeviceGroupService.java @@ -0,0 +1,58 @@ +package com.fuyuanshen.equipment.service; + +import com.fuyuanshen.equipment.domain.vo.DeviceGroupVo; +import com.fuyuanshen.equipment.domain.bo.DeviceGroupBo; + +import java.util.Collection; +import java.util.List; + +/** + * 设备分组Service接口 + * + * @author Lion Li + * @date 2025-08-08 + */ +public interface IDeviceGroupService { + + /** + * 查询设备分组 + * + * @param id 主键 + * @return 设备分组 + */ + DeviceGroupVo queryById(Long id); + + + /** + * 查询符合条件的设备分组列表 + * + * @param bo 查询条件 + * @return 设备分组列表 + */ + List queryList(DeviceGroupBo bo); + + /** + * 新增设备分组 + * + * @param bo 设备分组 + * @return 是否新增成功 + */ + Boolean insertByBo(DeviceGroupBo bo); + + /** + * 修改设备分组 + * + * @param bo 设备分组 + * @return 是否修改成功 + */ + Boolean updateByBo(DeviceGroupBo bo); + + /** + * 校验并批量删除设备分组信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/service/IDeviceRepairRecordsService.java b/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/service/IDeviceRepairRecordsService.java new file mode 100644 index 0000000..8fb838c --- /dev/null +++ b/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/service/IDeviceRepairRecordsService.java @@ -0,0 +1,68 @@ +package com.fuyuanshen.equipment.service; + +import com.fuyuanshen.equipment.domain.vo.DeviceRepairRecordsVo; +import com.fuyuanshen.equipment.domain.bo.DeviceRepairRecordsBo; +import com.fuyuanshen.common.mybatis.core.page.TableDataInfo; +import com.fuyuanshen.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 设备维修记录Service接口 + * + * @author Lion Li + * @date 2025-08-08 + */ +public interface IDeviceRepairRecordsService { + + /** + * 查询设备维修记录 + * + * @param recordId 主键 + * @return 设备维修记录 + */ + DeviceRepairRecordsVo queryById(Long recordId); + + /** + * 分页查询设备维修记录列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 设备维修记录分页列表 + */ + TableDataInfo queryPageList(DeviceRepairRecordsBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的设备维修记录列表 + * + * @param bo 查询条件 + * @return 设备维修记录列表 + */ + List queryList(DeviceRepairRecordsBo bo); + + /** + * 新增设备维修记录 + * + * @param bo 设备维修记录 + * @return 是否新增成功 + */ + Boolean insertByBo(DeviceRepairRecordsBo bo); + + /** + * 修改设备维修记录 + * + * @param bo 设备维修记录 + * @return 是否修改成功 + */ + Boolean updateByBo(DeviceRepairRecordsBo bo); + + /** + * 校验并批量删除设备维修记录信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/service/impl/DeviceGroupServiceImpl.java b/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/service/impl/DeviceGroupServiceImpl.java new file mode 100644 index 0000000..3f64a2a --- /dev/null +++ b/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/service/impl/DeviceGroupServiceImpl.java @@ -0,0 +1,120 @@ +package com.fuyuanshen.equipment.service.impl; + +import com.fuyuanshen.common.core.utils.MapstructUtils; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; +import com.fuyuanshen.equipment.domain.bo.DeviceGroupBo; +import com.fuyuanshen.equipment.domain.vo.DeviceGroupVo; +import com.fuyuanshen.equipment.domain.DeviceGroup; +import com.fuyuanshen.equipment.mapper.DeviceGroupMapper; +import com.fuyuanshen.equipment.service.IDeviceGroupService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 设备分组Service业务层处理 + * + * @author Lion Li + * @date 2025-08-08 + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class DeviceGroupServiceImpl implements IDeviceGroupService { + + private final DeviceGroupMapper baseMapper; + + /** + * 查询设备分组 + * + * @param id 主键 + * @return 设备分组 + */ + @Override + public DeviceGroupVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + + /** + * 查询符合条件的设备分组列表 + * + * @param bo 查询条件 + * @return 设备分组列表 + */ + @Override + public List queryList(DeviceGroupBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(DeviceGroupBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.orderByAsc(DeviceGroup::getId); + lqw.like(StringUtils.isNotBlank(bo.getGroupName()), DeviceGroup::getGroupName, bo.getGroupName()); + lqw.eq(bo.getStatus() != null, DeviceGroup::getStatus, bo.getStatus()); + lqw.eq(bo.getParentId() != null, DeviceGroup::getParentId, bo.getParentId()); + lqw.eq(StringUtils.isNotBlank(bo.getFullPath()), DeviceGroup::getFullPath, bo.getFullPath()); + lqw.eq(bo.getIsDeleted() != null, DeviceGroup::getIsDeleted, bo.getIsDeleted()); + return lqw; + } + + /** + * 新增设备分组 + * + * @param bo 设备分组 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(DeviceGroupBo bo) { + DeviceGroup add = MapstructUtils.convert(bo, DeviceGroup.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改设备分组 + * + * @param bo 设备分组 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(DeviceGroupBo bo) { + DeviceGroup update = MapstructUtils.convert(bo, DeviceGroup.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(DeviceGroup entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除设备分组信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/service/impl/DeviceRepairRecordsServiceImpl.java b/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/service/impl/DeviceRepairRecordsServiceImpl.java new file mode 100644 index 0000000..48569e3 --- /dev/null +++ b/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/service/impl/DeviceRepairRecordsServiceImpl.java @@ -0,0 +1,135 @@ +package com.fuyuanshen.equipment.service.impl; + +import com.fuyuanshen.common.core.utils.MapstructUtils; +import com.fuyuanshen.common.mybatis.core.page.TableDataInfo; +import com.fuyuanshen.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.fuyuanshen.equipment.domain.bo.DeviceRepairRecordsBo; +import com.fuyuanshen.equipment.domain.vo.DeviceRepairRecordsVo; +import com.fuyuanshen.equipment.domain.DeviceRepairRecords; +import com.fuyuanshen.equipment.mapper.DeviceRepairRecordsMapper; +import com.fuyuanshen.equipment.service.IDeviceRepairRecordsService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 设备维修记录Service业务层处理 + * + * @author Lion Li + * @date 2025-08-08 + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class DeviceRepairRecordsServiceImpl implements IDeviceRepairRecordsService { + + private final DeviceRepairRecordsMapper baseMapper; + + /** + * 查询设备维修记录 + * + * @param recordId 主键 + * @return 设备维修记录 + */ + @Override + public DeviceRepairRecordsVo queryById(Long recordId){ + return baseMapper.selectVoById(recordId); + } + + /** + * 分页查询设备维修记录列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 设备维修记录分页列表 + */ + @Override + public TableDataInfo queryPageList(DeviceRepairRecordsBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的设备维修记录列表 + * + * @param bo 查询条件 + * @return 设备维修记录列表 + */ + @Override + public List queryList(DeviceRepairRecordsBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(DeviceRepairRecordsBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.orderByAsc(DeviceRepairRecords::getRecordId); + lqw.eq(StringUtils.isNotBlank(bo.getDeviceId()), DeviceRepairRecords::getDeviceId, bo.getDeviceId()); + lqw.eq(bo.getRepairTime() != null, DeviceRepairRecords::getRepairTime, bo.getRepairTime()); + lqw.eq(StringUtils.isNotBlank(bo.getRepairPart()), DeviceRepairRecords::getRepairPart, bo.getRepairPart()); + lqw.eq(StringUtils.isNotBlank(bo.getRepairReason()), DeviceRepairRecords::getRepairReason, bo.getRepairReason()); + lqw.eq(StringUtils.isNotBlank(bo.getRepairPerson()), DeviceRepairRecords::getRepairPerson, bo.getRepairPerson()); + return lqw; + } + + /** + * 新增设备维修记录 + * + * @param bo 设备维修记录 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(DeviceRepairRecordsBo bo) { + DeviceRepairRecords add = MapstructUtils.convert(bo, DeviceRepairRecords.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setRecordId(add.getRecordId()); + } + return flag; + } + + /** + * 修改设备维修记录 + * + * @param bo 设备维修记录 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(DeviceRepairRecordsBo bo) { + DeviceRepairRecords update = MapstructUtils.convert(bo, DeviceRepairRecords.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(DeviceRepairRecords entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除设备维修记录信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/fys-modules/fys-equipment/src/main/resources/mapper/equipment/DeviceGroupMapper.xml b/fys-modules/fys-equipment/src/main/resources/mapper/equipment/DeviceGroupMapper.xml new file mode 100644 index 0000000..36cd5e2 --- /dev/null +++ b/fys-modules/fys-equipment/src/main/resources/mapper/equipment/DeviceGroupMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/fys-modules/fys-equipment/src/main/resources/mapper/equipment/DeviceRepairRecordsMapper.xml b/fys-modules/fys-equipment/src/main/resources/mapper/equipment/DeviceRepairRecordsMapper.xml new file mode 100644 index 0000000..46af59f --- /dev/null +++ b/fys-modules/fys-equipment/src/main/resources/mapper/equipment/DeviceRepairRecordsMapper.xml @@ -0,0 +1,7 @@ + + + + + From 3abee42b0726d6a26086f669c74987cc11c79a37 Mon Sep 17 00:00:00 2001 From: daiyongfei <974332738@qq.com> Date: Fri, 8 Aug 2025 10:43:53 +0800 Subject: [PATCH 02/28] =?UTF-8?q?=E8=AE=BE=E5=A4=87=E6=8E=A7=E5=88=B6?= =?UTF-8?q?=E4=B8=AD=E5=BF=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../device/DeviceControlCenterController.java | 210 ++++++++++++++++++ 1 file changed, 210 insertions(+) create mode 100644 fys-admin/src/main/java/com/fuyuanshen/web/controller/device/DeviceControlCenterController.java diff --git a/fys-admin/src/main/java/com/fuyuanshen/web/controller/device/DeviceControlCenterController.java b/fys-admin/src/main/java/com/fuyuanshen/web/controller/device/DeviceControlCenterController.java new file mode 100644 index 0000000..0f4079c --- /dev/null +++ b/fys-admin/src/main/java/com/fuyuanshen/web/controller/device/DeviceControlCenterController.java @@ -0,0 +1,210 @@ +package com.fuyuanshen.web.controller.device; + +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author: 默苍璃 + * @date: 2025-08-0810:40 + */ +@Slf4j +@Tag(name = "web后台:设备控制中心", description = "web后台:设备控制中心") +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/device") +public class DeviceControlCenterController { + + /** + * 获取设备基本信息 + * @param deviceId 设备ID + * @return 设备基本信息 + */ + @GetMapping("/info/{deviceId}") + public ResponseEntity> getDeviceInfo(@PathVariable String deviceId) { + // 实际应用中这里会从数据库查询设备信息 + Map deviceInfo = new HashMap<>(); + deviceInfo.put("deviceName", "6170零零一"); + deviceInfo.put("deviceModel", "BJQ6170"); + deviceInfo.put("deviceId", deviceId); + deviceInfo.put("status", "在线"); + deviceInfo.put("batteryLevel", 85); + + return ResponseEntity.ok(deviceInfo); + } + + /** + * 设置灯光模式 + * @param lightModeRequest 灯光模式请求 + * @return 操作结果 + */ + @PostMapping("/light-mode") + public ResponseEntity> setLightMode(@RequestBody LightModeRequest lightModeRequest) { + // 实际应用中这里会控制设备灯光 + Map response = new HashMap<>(); + response.put("code", 200); + // response.put("message", "灯光模式已设置为: " + lightModeRequest.getMode()); + // response.put("deviceId", lightModeRequest.getDeviceId()); + // response.put("mode", lightModeRequest.getMode()); + + return ResponseEntity.ok(response); + } + + /** + * 更新人员信息 + * @param personInfo 人员信息 + * @return 操作结果 + */ + @PostMapping("/person-info") + public ResponseEntity> updatePersonInfo(@RequestBody PersonInfo personInfo) { + // 实际应用中这里会更新数据库 + Map response = new HashMap<>(); + response.put("code", 200); + response.put("message", "人员信息已更新"); + // response.put("unit", personInfo.getUnit()); + // response.put("position", personInfo.getPosition()); + + return ResponseEntity.ok(response); + } + + /** + * 管理开机画面内容 + * @param bootScreenRequest 开机画面请求 + * @return 操作结果 + */ + @PostMapping("/boot-screen") + public ResponseEntity> manageBootScreen(@RequestBody BootScreenRequest bootScreenRequest) { + // 实际应用中这里会更新设备开机画面 + Map response = new HashMap<>(); + response.put("code", 200); + response.put("message", "开机画面内容已更新"); + // response.put("deviceId", bootScreenRequest.getDeviceId()); + // response.put("screens", bootScreenRequest.getScreens()); + + return ResponseEntity.ok(response); + } + + /** + * 设置灯光亮度 + * @param brightnessRequest 亮度请求 + * @return 操作结果 + */ + @PostMapping("/brightness") + public ResponseEntity> setBrightness(@RequestBody BrightnessRequest brightnessRequest) { + // 实际应用中这里会控制设备亮度 + Map response = new HashMap<>(); + response.put("code", 200); + // response.put("message", "灯光亮度已设置为: " + brightnessRequest.getBrightness() + "%"); + // response.put("deviceId", brightnessRequest.getDeviceId()); + // response.put("brightness", brightnessRequest.getBrightness()); + // response.put("forceAlarm", brightnessRequest.isForceAlarm()); + + return ResponseEntity.ok(response); + } + + /** + * 获取设备位置信息 + * @param deviceId 设备ID + * @return 位置信息 + */ + @GetMapping("/location/{deviceId}") + public ResponseEntity> getLocation(@PathVariable String deviceId) { + // 实际应用中这里会从设备获取实时位置 + Map locationInfo = new HashMap<>(); + locationInfo.put("deviceId", deviceId); + locationInfo.put("longitude", "114°7'E"); + locationInfo.put("latitude", "30'28'N"); + locationInfo.put("address", "湖北省武汉市洪山区光谷大道国际企业中心"); + locationInfo.put("timestamp", new Date()); + + return ResponseEntity.ok(locationInfo); + } + + /** + * 发送紧急消息 + * @param messageRequest 消息请求 + * @return 操作结果 + */ + @PostMapping("/send-message") + public ResponseEntity> sendMessage(@RequestBody MessageRequest messageRequest) { + // 实际应用中这里会向设备发送消息 + Map response = new HashMap<>(); + response.put("code", 200); + response.put("message", "消息已发送"); + // response.put("deviceId", messageRequest.getDeviceId()); + // response.put("content", messageRequest.getContent()); + response.put("timestamp", new Date()); + + return ResponseEntity.ok(response); + } + + /** + * 管理操作视频 + * @param videoRequest 视频请求 + * @return 操作结果 + */ + @PostMapping("/operation-video") + public ResponseEntity> manageOperationVideo(@RequestBody VideoRequest videoRequest) { + // 实际应用中这里会更新设备操作视频 + Map response = new HashMap<>(); + response.put("code", 200); + response.put("message", "操作视频已更新"); + // response.put("deviceId", videoRequest.getDeviceId()); + // response.put("videoUrl", videoRequest.getVideoUrl()); + + return ResponseEntity.ok(response); + } + + // 请求对象类定义 + public static class LightModeRequest { + private String deviceId; + private String mode; // 强光、弱光、爆闪、泛光、激光 + + // Getters and Setters + } + + public static class PersonInfo { + private String deviceId; + private String unit; // 单位 + private String position; // 职位 + + // Getters and Setters + } + + public static class BootScreenRequest { + private String deviceId; + private List screens; // 产品参数、操作说明等 + + // Getters and Setters + } + + public static class BrightnessRequest { + private String deviceId; + private int brightness; // 0-100 + private boolean forceAlarm; // 强制报警 + + // Getters and Setters + } + + public static class MessageRequest { + private String deviceId; + private String content; // 消息内容 + + // Getters and Setters + } + + public static class VideoRequest { + private String deviceId; + private String videoUrl; // 视频链接 + + // Getters and Setters + } + +} From 72cab138a7b1775e609d6d9199cad812078bd748 Mon Sep 17 00:00:00 2001 From: daiyongfei <974332738@qq.com> Date: Fri, 8 Aug 2025 10:44:49 +0800 Subject: [PATCH 03/28] =?UTF-8?q?=E8=AE=BE=E5=A4=87=E6=8E=A7=E5=88=B6?= =?UTF-8?q?=E4=B8=AD=E5=BF=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/controller/device/DeviceControlCenterController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fys-admin/src/main/java/com/fuyuanshen/web/controller/device/DeviceControlCenterController.java b/fys-admin/src/main/java/com/fuyuanshen/web/controller/device/DeviceControlCenterController.java index 0f4079c..13b3471 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/web/controller/device/DeviceControlCenterController.java +++ b/fys-admin/src/main/java/com/fuyuanshen/web/controller/device/DeviceControlCenterController.java @@ -19,7 +19,7 @@ import java.util.Map; @Tag(name = "web后台:设备控制中心", description = "web后台:设备控制中心") @RestController @RequiredArgsConstructor -@RequestMapping("/api/device") +@RequestMapping("/api/device/controlCenter") public class DeviceControlCenterController { /** From 47dbd33d568c0c92f2a157712a87979ff4835ad5 Mon Sep 17 00:00:00 2001 From: chenyouting <514333061@qq.com> Date: Fri, 8 Aug 2025 15:09:59 +0800 Subject: [PATCH 04/28] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=9C=A8=E7=BA=BF?= =?UTF-8?q?=E4=B8=8A=E6=8A=A5=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../device/AppDeviceBJQBizService.java | 6 +- .../CustomMqttInboundConfiguration.java | 122 ++-- .../mqtt/DeviceReceiverMessageHandler.java | 636 +++++++++--------- .../web/listener/UserActionListener.java | 326 ++++----- .../src/main/resources/application-prod.yml | 21 +- 5 files changed, 557 insertions(+), 554 deletions(-) diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/service/device/AppDeviceBJQBizService.java b/fys-admin/src/main/java/com/fuyuanshen/app/service/device/AppDeviceBJQBizService.java index 8dd1a96..db998b6 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/app/service/device/AppDeviceBJQBizService.java +++ b/fys-admin/src/main/java/com/fuyuanshen/app/service/device/AppDeviceBJQBizService.java @@ -134,13 +134,13 @@ public class AppDeviceBJQBizService { vo.setPersonnelInfo(personnelInfoVo); } //设备在线状态 - String onlineStatus = RedisUtils.getCacheObject(GLOBAL_REDIS_KEY+DeviceRedisKeyConstants.DEVICE_ONLINE_STATUS_KEY_PREFIX + device.getDeviceImei()); + String onlineStatus = RedisUtils.getCacheObject(GLOBAL_REDIS_KEY+ DEVICE_KEY_PREFIX + device.getDeviceImei()+ DeviceRedisKeyConstants.DEVICE_ONLINE_STATUS_KEY_PREFIX); if(StringUtils.isNotBlank(onlineStatus)){ vo.setOnlineStatus(1); }else{ vo.setOnlineStatus(0); } - String deviceStatus = RedisUtils.getCacheObject(GLOBAL_REDIS_KEY+DeviceRedisKeyConstants.DEVICE_STATUS_KEY_PREFIX + device.getDeviceImei()); + String deviceStatus = RedisUtils.getCacheObject(GLOBAL_REDIS_KEY+ DEVICE_KEY_PREFIX + device.getDeviceImei() + DeviceRedisKeyConstants.DEVICE_STATUS_KEY_PREFIX); // 获取电量 if(StringUtils.isNotBlank(deviceStatus)){ JSONObject jsonObject = JSONObject.parseObject(deviceStatus); @@ -154,7 +154,7 @@ public class AppDeviceBJQBizService { } // 获取经度纬度 - String locationKey = GlobalConstants.GLOBAL_REDIS_KEY+DeviceRedisKeyConstants.DEVICE_LOCATION_KEY_PREFIX + device.getDeviceImei(); + String locationKey = GlobalConstants.GLOBAL_REDIS_KEY+ DEVICE_KEY_PREFIX + device.getDeviceImei() + DeviceRedisKeyConstants.DEVICE_LOCATION_KEY_PREFIX; String locationInfo = RedisUtils.getCacheObject(locationKey); if(StringUtils.isNotBlank(locationInfo)){ JSONObject jsonObject = JSONObject.parseObject(locationInfo); diff --git a/fys-admin/src/main/java/com/fuyuanshen/web/config/CustomMqttInboundConfiguration.java b/fys-admin/src/main/java/com/fuyuanshen/web/config/CustomMqttInboundConfiguration.java index faa8cb5..afefa34 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/web/config/CustomMqttInboundConfiguration.java +++ b/fys-admin/src/main/java/com/fuyuanshen/web/config/CustomMqttInboundConfiguration.java @@ -1,61 +1,61 @@ -package com.fuyuanshen.web.config; - -import cn.hutool.core.lang.UUID; -import com.fuyuanshen.global.mqtt.config.MqttPropertiesConfig; -import com.fuyuanshen.web.handler.mqtt.DeviceReceiverMessageHandler; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.integration.annotation.ServiceActivator; -import org.springframework.integration.channel.DirectChannel; -import org.springframework.integration.core.MessageProducer; -import org.springframework.integration.mqtt.core.MqttPahoClientFactory; -import org.springframework.integration.mqtt.inbound.MqttPahoMessageDrivenChannelAdapter; -import org.springframework.integration.mqtt.support.DefaultPahoMessageConverter; -import org.springframework.messaging.MessageChannel; -import org.springframework.messaging.MessageHandler; - -/** - * @author: 默苍璃 - * @date: 2025-08-0110:46 - */ -@Configuration -public class CustomMqttInboundConfiguration { - - @Autowired - private MqttPropertiesConfig mqttPropertiesConfig; - @Autowired - private MqttPahoClientFactory mqttPahoClientFactory; - @Autowired - private DeviceReceiverMessageHandler deviceReceiverMessageHandler; - - - @Bean - public MessageChannel customMqttChannel(){ - return new DirectChannel(); - } - - - @Bean - public MessageProducer customMessageProducer(){ - String clientId = "custom_client_" + UUID.fastUUID(); - MqttPahoMessageDrivenChannelAdapter adapter = new MqttPahoMessageDrivenChannelAdapter( - mqttPropertiesConfig.getUrl(), - clientId, - mqttPahoClientFactory, - "A/#", "B/#" // 直接指定这两个主题 - ); - adapter.setQos(1); - adapter.setConverter(new DefaultPahoMessageConverter()); - adapter.setOutputChannel(customMqttChannel()); - return adapter; - } - - - @Bean - @ServiceActivator(inputChannel = "customMqttChannel") - public MessageHandler customMessageHandler(){ - return deviceReceiverMessageHandler; - } - -} +//package com.fuyuanshen.web.config; +// +//import cn.hutool.core.lang.UUID; +//import com.fuyuanshen.global.mqtt.config.MqttPropertiesConfig; +//import com.fuyuanshen.web.handler.mqtt.DeviceReceiverMessageHandler; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.context.annotation.Bean; +//import org.springframework.context.annotation.Configuration; +//import org.springframework.integration.annotation.ServiceActivator; +//import org.springframework.integration.channel.DirectChannel; +//import org.springframework.integration.core.MessageProducer; +//import org.springframework.integration.mqtt.core.MqttPahoClientFactory; +//import org.springframework.integration.mqtt.inbound.MqttPahoMessageDrivenChannelAdapter; +//import org.springframework.integration.mqtt.support.DefaultPahoMessageConverter; +//import org.springframework.messaging.MessageChannel; +//import org.springframework.messaging.MessageHandler; +// +///** +// * @author: 默苍璃 +// * @date: 2025-08-0110:46 +// */ +//@Configuration +//public class CustomMqttInboundConfiguration { +// +// @Autowired +// private MqttPropertiesConfig mqttPropertiesConfig; +// @Autowired +// private MqttPahoClientFactory mqttPahoClientFactory; +// @Autowired +// private DeviceReceiverMessageHandler deviceReceiverMessageHandler; +// +// +// @Bean +// public MessageChannel customMqttChannel(){ +// return new DirectChannel(); +// } +// +// +// @Bean +// public MessageProducer customMessageProducer(){ +// String clientId = "custom_client_" + UUID.fastUUID(); +// MqttPahoMessageDrivenChannelAdapter adapter = new MqttPahoMessageDrivenChannelAdapter( +// mqttPropertiesConfig.getUrl(), +// clientId, +// mqttPahoClientFactory, +// "A/#", "B/#" // 直接指定这两个主题 +// ); +// adapter.setQos(1); +// adapter.setConverter(new DefaultPahoMessageConverter()); +// adapter.setOutputChannel(customMqttChannel()); +// return adapter; +// } +// +// +// @Bean +// @ServiceActivator(inputChannel = "customMqttChannel") +// public MessageHandler customMessageHandler(){ +// return deviceReceiverMessageHandler; +// } +// +//} diff --git a/fys-admin/src/main/java/com/fuyuanshen/web/handler/mqtt/DeviceReceiverMessageHandler.java b/fys-admin/src/main/java/com/fuyuanshen/web/handler/mqtt/DeviceReceiverMessageHandler.java index b43d75f..ad080ac 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/web/handler/mqtt/DeviceReceiverMessageHandler.java +++ b/fys-admin/src/main/java/com/fuyuanshen/web/handler/mqtt/DeviceReceiverMessageHandler.java @@ -1,318 +1,318 @@ -package com.fuyuanshen.web.handler.mqtt; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fuyuanshen.common.satoken.utils.LoginHelper; -import com.fuyuanshen.equipment.domain.Device; -import com.fuyuanshen.equipment.domain.DeviceLog; -import com.fuyuanshen.equipment.mapper.DeviceLogMapper; -import com.fuyuanshen.equipment.mapper.DeviceMapper; -import com.fuyuanshen.equipment.utils.map.GetAddressFromLatUtil; -import com.fuyuanshen.equipment.utils.map.LngLonUtil; -import com.fuyuanshen.global.mqtt.constants.TenantsConstant; -import com.fuyuanshen.web.enums.InstructType6170; -import com.fuyuanshen.web.enums.LightModeEnum6170; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.extern.slf4j.Slf4j; -import org.springframework.messaging.Message; -import org.springframework.messaging.MessageHandler; -import org.springframework.messaging.MessageHeaders; -import org.springframework.messaging.MessagingException; -import org.springframework.stereotype.Component; - -/** - * 定义监听主题消息的处理器 - * - * @author: 默苍璃 - * @date: 2025-08-0110:19 - */ -@Component -@Data -@AllArgsConstructor -@Slf4j -public class DeviceReceiverMessageHandler implements MessageHandler { - - private final DeviceMapper deviceMapper; - private final DeviceLogMapper deviceLogMapper; - - // 使用Jackson解析JSON - private static final ObjectMapper objectMapper = new ObjectMapper(); - - - /** - * 处理接收的消息 - * - * @param message - * @throws MessagingException - */ - @Override - public void handleMessage(Message message) throws MessagingException { - // System.out.println("接收到的消息:" + message.getPayload()); - MessageHeaders headers = message.getHeaders(); - String receivedTopicName = (String) headers.get("mqtt_receivedTopic"); - System.out.println("消息来自主题:" + receivedTopicName); - - // String tenantId = LoginHelper.getTenantId(); - String tenantId = TenantsConstant.FU_YUAN_SHENG; - String payload = message.getPayload().toString(); - - if (receivedTopicName != null) { - // 1. 提取设备ID (从主题中获取) - String deviceImei = extractDeviceId(receivedTopicName); - Device device = deviceMapper.selectOne(new QueryWrapper() - .eq("tenant_id", tenantId) - .eq("device_imei", deviceImei)); - if (device == null) { - log.info("不存在的设备IMEI: {}", deviceImei); - } else { - - try { - JsonNode root = objectMapper.readTree(payload); - - DeviceLog record = new DeviceLog(); - // 手动设置租户ID - record.setTenantId(device.getTenantId()); // 从设备信息中获取租户ID - // 设备ID - record.setDeviceId(device.getId()); - // 设备名称 - record.setDeviceName(device.getDeviceName()); - - // 2. 处理instruct消息 - if (root.has("instruct")) { - JsonNode instructNode = root.get("instruct"); - if (instructNode.isArray()) { - boolean b = receivedTopicName.startsWith("B/"); - record = parseInstruct(device, instructNode, b); - // 根据不同主题进行不同处理 - if (receivedTopicName.startsWith("A/")) { - // 处理A主题的消息(设备上传) - record.setDataSource("设备上报"); - } else if (receivedTopicName.startsWith("B/")) { - // 处理B主题的消息 (手动上传) - record.setDataSource("客户端操作"); - } - } - // 确保在插入前设置tenantId和deviceId - record.setTenantId(device.getTenantId()); - record.setDeviceId(device.getId()); - deviceLogMapper.insert(record); - } - - // 2. 处理 state 消息 - if (root.has("state")) { - JsonNode instructNode = root.get("state"); - if (instructNode.isArray()) { - boolean b = receivedTopicName.startsWith("B/"); - record = parseState(device, instructNode, b); - // 根据不同主题进行不同处理 - if (receivedTopicName.startsWith("A/")) { - // 处理A主题的消息(设备上传) - record.setDataSource("设备上报"); - } else if (receivedTopicName.startsWith("B/")) { - // 处理B主题的消息 (手动上传) - record.setDataSource("客户端操作"); - } - } - // 确保在插入前设置tenantId和deviceId - record.setTenantId(device.getTenantId()); - record.setDeviceId(device.getId()); - deviceLogMapper.insert(record); - } - - if (root.has("imei")) { - // 设备行为 - record.setDeviceAction(InstructType6170.fromCode(0).getDescription()); - record.setDataSource("设备上报"); - record.setContent("设备启动"); - // 确保在插入前设置tenantId和deviceId - record.setTenantId(device.getTenantId()); - record.setDeviceId(device.getId()); - deviceLogMapper.insert(record); - } - - - // 3. 处理state消息 - // else if (root.has("state")) { - // JsonNode stateNode = root.get("state"); - // if (stateNode.isArray()) { - // StateRecord record = parseState(device, stateNode); - // stateRepo.save(record); - // } - // } - } catch (Exception e) { - log.error("消息解析失败: {}", payload, e); - } - - } - - } - } - - - /** - * 从主题中提取设备ID(IMEI) - * - * @param topic - * @return - */ - private String extractDeviceId(String topic) { - // 处理 A/# 或 B/# 格式的主题,例如 B/861556078765285 或 A/861556078765285 - String[] segments = topic.split("/"); - if (segments.length >= 2) { - // 返回第二个段,即 / 后面的部分 - return segments[1]; - } - // 如果格式不符合预期,返回原主题 - return topic; - } - - - /** - * 解析instruct消息 - * - * @param device - * @param array - * @param b - * @return - */ - private DeviceLog parseInstruct(Device device, JsonNode array, boolean b) { - DeviceLog record = new DeviceLog(); - record.setDeviceName(device.getDeviceName()); - // 设备行为 - record.setDeviceAction(InstructType6170.fromCode(array.get(0).asInt()).getDescription()); - - switch (array.get(0).asInt()) { - case 1: // 灯光模式 - LightModeEnum6170 lightModeEnum6170 = LightModeEnum6170.fromCode(array.get(1).asInt()); - record.setContent(lightModeEnum6170.getDescription()); - break; - - case 2: // 单位/姓名/职位 - byte[] unitBytes = new byte[480]; - for (int i = 1; i <= 480; i++) { - unitBytes[i - 1] = (byte) array.get(i).asInt(); - } - // record.setUnitData(unitBytes); - break; - - case 3: // 开机图片 - // record.setImagePage(array.get(1).asInt()); - byte[] imageBytes = new byte[512]; - for (int i = 2; i <= 513; i++) { - imageBytes[i - 2] = (byte) array.get(i).asInt(); - } - // record.setImageData(imageBytes); - break; - - case 4: // 激光灯 - int anInt = array.get(1).asInt(); - if (anInt == 0) { - record.setContent("关闭激光灯"); - } else if (anInt == 1) { - record.setContent("开启激光灯"); - } else { - record.setContent("未知操作"); - } - break; - - case 5: // 亮度调节 - record.setContent(+array.get(1).asInt() + "%"); - break; - - case 11: // 定位数据 - if (b) { - break; - } - int i1 = array.get(1).asInt(); - int i2 = array.get(2).asInt(); - int i3 = array.get(3).asInt(); - int i4 = array.get(4).asInt(); - - // 优雅的转换方式 Longitude and latitude - double latitude = i1 + i2 / 10.0; - double Longitude = i3 + i4 / 10.0; - // 84 ==》 高德 - double[] doubles = LngLonUtil.gps84_To_Gcj02(latitude, Longitude); - String address = GetAddressFromLatUtil.getAdd(String.valueOf(doubles[1]), String.valueOf(doubles[0])); - record.setContent(address); - break; - } - return record; - } - - - /** - * 解析 state 消息 - * - * @param device - * @param array - * @return - */ - private DeviceLog parseState(Device device, JsonNode array, boolean b) { - DeviceLog record = new DeviceLog(); - record.setDeviceName(device.getDeviceName()); - // 设备行为 - record.setDeviceAction(InstructType6170.fromCode(array.get(0).asInt()).getDescription()); - - switch (array.get(0).asInt()) { - case 1: // 灯光模式 - LightModeEnum6170 lightModeEnum6170 = LightModeEnum6170.fromCode(array.get(1).asInt()); - record.setContent(lightModeEnum6170.getDescription()); - break; - - case 2: // 单位/姓名/职位 - byte[] unitBytes = new byte[480]; - for (int i = 1; i <= 480; i++) { - unitBytes[i - 1] = (byte) array.get(i).asInt(); - } - // record.setUnitData(unitBytes); - break; - - case 3: // 开机图片 - // record.setImagePage(array.get(1).asInt()); - byte[] imageBytes = new byte[512]; - for (int i = 2; i <= 513; i++) { - imageBytes[i - 2] = (byte) array.get(i).asInt(); - } - // record.setImageData(imageBytes); - break; - - case 4: // 激光灯 - int anInt = array.get(1).asInt(); - if (anInt == 0) { - record.setContent("关闭激光灯"); - } else if (anInt == 1) { - record.setContent("开启激光灯"); - } else { - record.setContent("未知操作"); - } - break; - - case 5: // 亮度调节 - record.setContent(+array.get(1).asInt() + "%"); - break; - - case 11: // 定位数据 - if (b) { - break; - } - int i1 = array.get(1).asInt(); - int i2 = array.get(2).asInt(); - int i3 = array.get(3).asInt(); - int i4 = array.get(4).asInt(); - - // 优雅的转换方式 Longitude and latitude - double latitude = i1 + i2 / 10.0; - double Longitude = i3 + i4 / 10.0; - // 84 ==》 高德 - double[] doubles = LngLonUtil.gps84_To_Gcj02(latitude, Longitude); - String address = GetAddressFromLatUtil.getAdd(String.valueOf(doubles[1]), String.valueOf(doubles[0])); - record.setContent(address); - break; - } - return record; - } - -} +//package com.fuyuanshen.web.handler.mqtt; +// +//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +//import com.fasterxml.jackson.databind.JsonNode; +//import com.fasterxml.jackson.databind.ObjectMapper; +//import com.fuyuanshen.common.satoken.utils.LoginHelper; +//import com.fuyuanshen.equipment.domain.Device; +//import com.fuyuanshen.equipment.domain.DeviceLog; +//import com.fuyuanshen.equipment.mapper.DeviceLogMapper; +//import com.fuyuanshen.equipment.mapper.DeviceMapper; +//import com.fuyuanshen.equipment.utils.map.GetAddressFromLatUtil; +//import com.fuyuanshen.equipment.utils.map.LngLonUtil; +//import com.fuyuanshen.global.mqtt.constants.TenantsConstant; +//import com.fuyuanshen.web.enums.InstructType6170; +//import com.fuyuanshen.web.enums.LightModeEnum6170; +//import lombok.AllArgsConstructor; +//import lombok.Data; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.messaging.Message; +//import org.springframework.messaging.MessageHandler; +//import org.springframework.messaging.MessageHeaders; +//import org.springframework.messaging.MessagingException; +//import org.springframework.stereotype.Component; +// +///** +// * 定义监听主题消息的处理器 +// * +// * @author: 默苍璃 +// * @date: 2025-08-0110:19 +// */ +//@Component +//@Data +//@AllArgsConstructor +//@Slf4j +//public class DeviceReceiverMessageHandler implements MessageHandler { +// +// private final DeviceMapper deviceMapper; +// private final DeviceLogMapper deviceLogMapper; +// +// // 使用Jackson解析JSON +// private static final ObjectMapper objectMapper = new ObjectMapper(); +// +// +// /** +// * 处理接收的消息 +// * +// * @param message +// * @throws MessagingException +// */ +// @Override +// public void handleMessage(Message message) throws MessagingException { +// // System.out.println("接收到的消息:" + message.getPayload()); +// MessageHeaders headers = message.getHeaders(); +// String receivedTopicName = (String) headers.get("mqtt_receivedTopic"); +// System.out.println("消息来自主题:" + receivedTopicName); +// +// // String tenantId = LoginHelper.getTenantId(); +// String tenantId = TenantsConstant.FU_YUAN_SHENG; +// String payload = message.getPayload().toString(); +// +// if (receivedTopicName != null) { +// // 1. 提取设备ID (从主题中获取) +// String deviceImei = extractDeviceId(receivedTopicName); +// Device device = deviceMapper.selectOne(new QueryWrapper() +// .eq("tenant_id", tenantId) +// .eq("device_imei", deviceImei)); +// if (device == null) { +// log.info("不存在的设备IMEI: {}", deviceImei); +// } else { +// +// try { +// JsonNode root = objectMapper.readTree(payload); +// +// DeviceLog record = new DeviceLog(); +// // 手动设置租户ID +// record.setTenantId(device.getTenantId()); // 从设备信息中获取租户ID +// // 设备ID +// record.setDeviceId(device.getId()); +// // 设备名称 +// record.setDeviceName(device.getDeviceName()); +// +// // 2. 处理instruct消息 +// if (root.has("instruct")) { +// JsonNode instructNode = root.get("instruct"); +// if (instructNode.isArray()) { +// boolean b = receivedTopicName.startsWith("B/"); +// record = parseInstruct(device, instructNode, b); +// // 根据不同主题进行不同处理 +// if (receivedTopicName.startsWith("A/")) { +// // 处理A主题的消息(设备上传) +// record.setDataSource("设备上报"); +// } else if (receivedTopicName.startsWith("B/")) { +// // 处理B主题的消息 (手动上传) +// record.setDataSource("客户端操作"); +// } +// } +// // 确保在插入前设置tenantId和deviceId +// record.setTenantId(device.getTenantId()); +// record.setDeviceId(device.getId()); +// deviceLogMapper.insert(record); +// } +// +// // 2. 处理 state 消息 +// if (root.has("state")) { +// JsonNode instructNode = root.get("state"); +// if (instructNode.isArray()) { +// boolean b = receivedTopicName.startsWith("B/"); +// record = parseState(device, instructNode, b); +// // 根据不同主题进行不同处理 +// if (receivedTopicName.startsWith("A/")) { +// // 处理A主题的消息(设备上传) +// record.setDataSource("设备上报"); +// } else if (receivedTopicName.startsWith("B/")) { +// // 处理B主题的消息 (手动上传) +// record.setDataSource("客户端操作"); +// } +// } +// // 确保在插入前设置tenantId和deviceId +// record.setTenantId(device.getTenantId()); +// record.setDeviceId(device.getId()); +// deviceLogMapper.insert(record); +// } +// +// if (root.has("imei")) { +// // 设备行为 +// record.setDeviceAction(InstructType6170.fromCode(0).getDescription()); +// record.setDataSource("设备上报"); +// record.setContent("设备启动"); +// // 确保在插入前设置tenantId和deviceId +// record.setTenantId(device.getTenantId()); +// record.setDeviceId(device.getId()); +// deviceLogMapper.insert(record); +// } +// +// +// // 3. 处理state消息 +// // else if (root.has("state")) { +// // JsonNode stateNode = root.get("state"); +// // if (stateNode.isArray()) { +// // StateRecord record = parseState(device, stateNode); +// // stateRepo.save(record); +// // } +// // } +// } catch (Exception e) { +// log.error("消息解析失败: {}", payload, e); +// } +// +// } +// +// } +// } +// +// +// /** +// * 从主题中提取设备ID(IMEI) +// * +// * @param topic +// * @return +// */ +// private String extractDeviceId(String topic) { +// // 处理 A/# 或 B/# 格式的主题,例如 B/861556078765285 或 A/861556078765285 +// String[] segments = topic.split("/"); +// if (segments.length >= 2) { +// // 返回第二个段,即 / 后面的部分 +// return segments[1]; +// } +// // 如果格式不符合预期,返回原主题 +// return topic; +// } +// +// +// /** +// * 解析instruct消息 +// * +// * @param device +// * @param array +// * @param b +// * @return +// */ +// private DeviceLog parseInstruct(Device device, JsonNode array, boolean b) { +// DeviceLog record = new DeviceLog(); +// record.setDeviceName(device.getDeviceName()); +// // 设备行为 +// record.setDeviceAction(InstructType6170.fromCode(array.get(0).asInt()).getDescription()); +// +// switch (array.get(0).asInt()) { +// case 1: // 灯光模式 +// LightModeEnum6170 lightModeEnum6170 = LightModeEnum6170.fromCode(array.get(1).asInt()); +// record.setContent(lightModeEnum6170.getDescription()); +// break; +// +// case 2: // 单位/姓名/职位 +// byte[] unitBytes = new byte[480]; +// for (int i = 1; i <= 480; i++) { +// unitBytes[i - 1] = (byte) array.get(i).asInt(); +// } +// // record.setUnitData(unitBytes); +// break; +// +// case 3: // 开机图片 +// // record.setImagePage(array.get(1).asInt()); +// byte[] imageBytes = new byte[512]; +// for (int i = 2; i <= 513; i++) { +// imageBytes[i - 2] = (byte) array.get(i).asInt(); +// } +// // record.setImageData(imageBytes); +// break; +// +// case 4: // 激光灯 +// int anInt = array.get(1).asInt(); +// if (anInt == 0) { +// record.setContent("关闭激光灯"); +// } else if (anInt == 1) { +// record.setContent("开启激光灯"); +// } else { +// record.setContent("未知操作"); +// } +// break; +// +// case 5: // 亮度调节 +// record.setContent(+array.get(1).asInt() + "%"); +// break; +// +// case 11: // 定位数据 +// if (b) { +// break; +// } +// int i1 = array.get(1).asInt(); +// int i2 = array.get(2).asInt(); +// int i3 = array.get(3).asInt(); +// int i4 = array.get(4).asInt(); +// +// // 优雅的转换方式 Longitude and latitude +// double latitude = i1 + i2 / 10.0; +// double Longitude = i3 + i4 / 10.0; +// // 84 ==》 高德 +// double[] doubles = LngLonUtil.gps84_To_Gcj02(latitude, Longitude); +// String address = GetAddressFromLatUtil.getAdd(String.valueOf(doubles[1]), String.valueOf(doubles[0])); +// record.setContent(address); +// break; +// } +// return record; +// } +// +// +// /** +// * 解析 state 消息 +// * +// * @param device +// * @param array +// * @return +// */ +// private DeviceLog parseState(Device device, JsonNode array, boolean b) { +// DeviceLog record = new DeviceLog(); +// record.setDeviceName(device.getDeviceName()); +// // 设备行为 +// record.setDeviceAction(InstructType6170.fromCode(array.get(0).asInt()).getDescription()); +// +// switch (array.get(0).asInt()) { +// case 1: // 灯光模式 +// LightModeEnum6170 lightModeEnum6170 = LightModeEnum6170.fromCode(array.get(1).asInt()); +// record.setContent(lightModeEnum6170.getDescription()); +// break; +// +// case 2: // 单位/姓名/职位 +// byte[] unitBytes = new byte[480]; +// for (int i = 1; i <= 480; i++) { +// unitBytes[i - 1] = (byte) array.get(i).asInt(); +// } +// // record.setUnitData(unitBytes); +// break; +// +// case 3: // 开机图片 +// // record.setImagePage(array.get(1).asInt()); +// byte[] imageBytes = new byte[512]; +// for (int i = 2; i <= 513; i++) { +// imageBytes[i - 2] = (byte) array.get(i).asInt(); +// } +// // record.setImageData(imageBytes); +// break; +// +// case 4: // 激光灯 +// int anInt = array.get(1).asInt(); +// if (anInt == 0) { +// record.setContent("关闭激光灯"); +// } else if (anInt == 1) { +// record.setContent("开启激光灯"); +// } else { +// record.setContent("未知操作"); +// } +// break; +// +// case 5: // 亮度调节 +// record.setContent(+array.get(1).asInt() + "%"); +// break; +// +// case 11: // 定位数据 +// if (b) { +// break; +// } +// int i1 = array.get(1).asInt(); +// int i2 = array.get(2).asInt(); +// int i3 = array.get(3).asInt(); +// int i4 = array.get(4).asInt(); +// +// // 优雅的转换方式 Longitude and latitude +// double latitude = i1 + i2 / 10.0; +// double Longitude = i3 + i4 / 10.0; +// // 84 ==》 高德 +// double[] doubles = LngLonUtil.gps84_To_Gcj02(latitude, Longitude); +// String address = GetAddressFromLatUtil.getAdd(String.valueOf(doubles[1]), String.valueOf(doubles[0])); +// record.setContent(address); +// break; +// } +// return record; +// } +// +//} diff --git a/fys-admin/src/main/java/com/fuyuanshen/web/listener/UserActionListener.java b/fys-admin/src/main/java/com/fuyuanshen/web/listener/UserActionListener.java index 9105a5d..49762cb 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/web/listener/UserActionListener.java +++ b/fys-admin/src/main/java/com/fuyuanshen/web/listener/UserActionListener.java @@ -1,163 +1,163 @@ -package com.fuyuanshen.web.listener; - -import cn.dev33.satoken.listener.SaTokenListener; -import cn.dev33.satoken.stp.StpUtil; -import cn.dev33.satoken.stp.parameter.SaLoginParameter; -import cn.hutool.core.convert.Convert; -import cn.hutool.http.useragent.UserAgent; -import cn.hutool.http.useragent.UserAgentUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import com.fuyuanshen.common.core.constant.CacheConstants; -import com.fuyuanshen.common.core.constant.Constants; -import com.fuyuanshen.common.core.domain.dto.UserOnlineDTO; -import com.fuyuanshen.common.core.utils.MessageUtils; -import com.fuyuanshen.common.core.utils.ServletUtils; -import com.fuyuanshen.common.core.utils.SpringUtils; -import com.fuyuanshen.common.core.utils.ip.AddressUtils; -import com.fuyuanshen.common.log.event.LogininforEvent; -import com.fuyuanshen.common.redis.utils.RedisUtils; -import com.fuyuanshen.common.satoken.utils.LoginHelper; -import com.fuyuanshen.common.tenant.helper.TenantHelper; -import com.fuyuanshen.web.service.SysLoginService; -import org.springframework.stereotype.Component; - -import java.time.Duration; - -/** - * 用户行为 侦听器的实现 - * - * @author Lion Li - */ -@RequiredArgsConstructor -@Component -@Slf4j -public class UserActionListener implements SaTokenListener { - - private final SysLoginService loginService; - - /** - * 每次登录时触发 - */ - @Override - public void doLogin(String loginType, Object loginId, String tokenValue, SaLoginParameter loginParameter) { - UserAgent userAgent = UserAgentUtil.parse(ServletUtils.getRequest().getHeader("User-Agent")); - String ip = ServletUtils.getClientIP(); - UserOnlineDTO dto = new UserOnlineDTO(); - dto.setIpaddr(ip); - dto.setLoginLocation(AddressUtils.getRealAddressByIP(ip)); - dto.setBrowser(userAgent.getBrowser().getName()); - dto.setOs(userAgent.getOs().getName()); - dto.setLoginTime(System.currentTimeMillis()); - dto.setTokenId(tokenValue); - String username = (String) loginParameter.getExtra(LoginHelper.USER_NAME_KEY); - String tenantId = (String) loginParameter.getExtra(LoginHelper.TENANT_KEY); - dto.setUserName(username); - dto.setClientKey((String) loginParameter.getExtra(LoginHelper.CLIENT_KEY)); - dto.setDeviceType(loginParameter.getDeviceType()); - dto.setDeptName((String) loginParameter.getExtra(LoginHelper.DEPT_NAME_KEY)); - TenantHelper.dynamic(tenantId, () -> { - if(loginParameter.getTimeout() == -1) { - RedisUtils.setCacheObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue, dto); - } else { - RedisUtils.setCacheObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue, dto, Duration.ofSeconds(loginParameter.getTimeout())); - } - }); - // 记录登录日志 - LogininforEvent logininforEvent = new LogininforEvent(); - logininforEvent.setTenantId(tenantId); - logininforEvent.setUsername(username); - logininforEvent.setStatus(Constants.LOGIN_SUCCESS); - logininforEvent.setMessage(MessageUtils.message("user.login.success")); - logininforEvent.setRequest(ServletUtils.getRequest()); - SpringUtils.context().publishEvent(logininforEvent); - // 更新登录信息 - loginService.recordLoginInfo((Long) loginParameter.getExtra(LoginHelper.USER_KEY), ip); - log.info("user doLogin, userId:{}, token:{}", loginId, tokenValue); - } - - /** - * 每次注销时触发 - */ - @Override - public void doLogout(String loginType, Object loginId, String tokenValue) { - String tenantId = Convert.toStr(StpUtil.getExtra(tokenValue, LoginHelper.TENANT_KEY)); - TenantHelper.dynamic(tenantId, () -> { - RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue); - }); - log.info("user doLogout, userId:{}, token:{}", loginId, tokenValue); - } - - /** - * 每次被踢下线时触发 - */ - @Override - public void doKickout(String loginType, Object loginId, String tokenValue) { - String tenantId = Convert.toStr(StpUtil.getExtra(tokenValue, LoginHelper.TENANT_KEY)); - TenantHelper.dynamic(tenantId, () -> { - RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue); - }); - log.info("user doKickout, userId:{}, token:{}", loginId, tokenValue); - } - - /** - * 每次被顶下线时触发 - */ - @Override - public void doReplaced(String loginType, Object loginId, String tokenValue) { - String tenantId = Convert.toStr(StpUtil.getExtra(tokenValue, LoginHelper.TENANT_KEY)); - TenantHelper.dynamic(tenantId, () -> { - RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue); - }); - log.info("user doReplaced, userId:{}, token:{}", loginId, tokenValue); - } - - /** - * 每次被封禁时触发 - */ - @Override - public void doDisable(String loginType, Object loginId, String service, int level, long disableTime) { - } - - /** - * 每次被解封时触发 - */ - @Override - public void doUntieDisable(String loginType, Object loginId, String service) { - } - - /** - * 每次打开二级认证时触发 - */ - @Override - public void doOpenSafe(String loginType, String tokenValue, String service, long safeTime) { - } - - /** - * 每次创建Session时触发 - */ - @Override - public void doCloseSafe(String loginType, String tokenValue, String service) { - } - - /** - * 每次创建Session时触发 - */ - @Override - public void doCreateSession(String id) { - } - - /** - * 每次注销Session时触发 - */ - @Override - public void doLogoutSession(String id) { - } - - /** - * 每次Token续期时触发 - */ - @Override - public void doRenewTimeout(String tokenValue, Object loginId, long timeout) { - } -} +//package com.fuyuanshen.web.listener; +// +//import cn.dev33.satoken.listener.SaTokenListener; +//import cn.dev33.satoken.stp.StpUtil; +//import cn.dev33.satoken.stp.parameter.SaLoginParameter; +//import cn.hutool.core.convert.Convert; +//import cn.hutool.http.useragent.UserAgent; +//import cn.hutool.http.useragent.UserAgentUtil; +//import lombok.RequiredArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import com.fuyuanshen.common.core.constant.CacheConstants; +//import com.fuyuanshen.common.core.constant.Constants; +//import com.fuyuanshen.common.core.domain.dto.UserOnlineDTO; +//import com.fuyuanshen.common.core.utils.MessageUtils; +//import com.fuyuanshen.common.core.utils.ServletUtils; +//import com.fuyuanshen.common.core.utils.SpringUtils; +//import com.fuyuanshen.common.core.utils.ip.AddressUtils; +//import com.fuyuanshen.common.log.event.LogininforEvent; +//import com.fuyuanshen.common.redis.utils.RedisUtils; +//import com.fuyuanshen.common.satoken.utils.LoginHelper; +//import com.fuyuanshen.common.tenant.helper.TenantHelper; +//import com.fuyuanshen.web.service.SysLoginService; +//import org.springframework.stereotype.Component; +// +//import java.time.Duration; +// +///** +// * 用户行为 侦听器的实现 +// * +// * @author Lion Li +// */ +//@RequiredArgsConstructor +//@Component +//@Slf4j +//public class UserActionListener implements SaTokenListener { +// +// private final SysLoginService loginService; +// +// /** +// * 每次登录时触发 +// */ +// @Override +// public void doLogin(String loginType, Object loginId, String tokenValue, SaLoginParameter loginParameter) { +// UserAgent userAgent = UserAgentUtil.parse(ServletUtils.getRequest().getHeader("User-Agent")); +// String ip = ServletUtils.getClientIP(); +// UserOnlineDTO dto = new UserOnlineDTO(); +// dto.setIpaddr(ip); +// dto.setLoginLocation(AddressUtils.getRealAddressByIP(ip)); +// dto.setBrowser(userAgent.getBrowser().getName()); +// dto.setOs(userAgent.getOs().getName()); +// dto.setLoginTime(System.currentTimeMillis()); +// dto.setTokenId(tokenValue); +// String username = (String) loginParameter.getExtra(LoginHelper.USER_NAME_KEY); +// String tenantId = (String) loginParameter.getExtra(LoginHelper.TENANT_KEY); +// dto.setUserName(username); +// dto.setClientKey((String) loginParameter.getExtra(LoginHelper.CLIENT_KEY)); +// dto.setDeviceType(loginParameter.getDeviceType()); +// dto.setDeptName((String) loginParameter.getExtra(LoginHelper.DEPT_NAME_KEY)); +// TenantHelper.dynamic(tenantId, () -> { +// if(loginParameter.getTimeout() == -1) { +// RedisUtils.setCacheObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue, dto); +// } else { +// RedisUtils.setCacheObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue, dto, Duration.ofSeconds(loginParameter.getTimeout())); +// } +// }); +// // 记录登录日志 +// LogininforEvent logininforEvent = new LogininforEvent(); +// logininforEvent.setTenantId(tenantId); +// logininforEvent.setUsername(username); +// logininforEvent.setStatus(Constants.LOGIN_SUCCESS); +// logininforEvent.setMessage(MessageUtils.message("user.login.success")); +// logininforEvent.setRequest(ServletUtils.getRequest()); +// SpringUtils.context().publishEvent(logininforEvent); +// // 更新登录信息 +// loginService.recordLoginInfo((Long) loginParameter.getExtra(LoginHelper.USER_KEY), ip); +// log.info("user doLogin, userId:{}, token:{}", loginId, tokenValue); +// } +// +// /** +// * 每次注销时触发 +// */ +// @Override +// public void doLogout(String loginType, Object loginId, String tokenValue) { +// String tenantId = Convert.toStr(StpUtil.getExtra(tokenValue, LoginHelper.TENANT_KEY)); +// TenantHelper.dynamic(tenantId, () -> { +// RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue); +// }); +// log.info("user doLogout, userId:{}, token:{}", loginId, tokenValue); +// } +// +// /** +// * 每次被踢下线时触发 +// */ +// @Override +// public void doKickout(String loginType, Object loginId, String tokenValue) { +// String tenantId = Convert.toStr(StpUtil.getExtra(tokenValue, LoginHelper.TENANT_KEY)); +// TenantHelper.dynamic(tenantId, () -> { +// RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue); +// }); +// log.info("user doKickout, userId:{}, token:{}", loginId, tokenValue); +// } +// +// /** +// * 每次被顶下线时触发 +// */ +// @Override +// public void doReplaced(String loginType, Object loginId, String tokenValue) { +// String tenantId = Convert.toStr(StpUtil.getExtra(tokenValue, LoginHelper.TENANT_KEY)); +// TenantHelper.dynamic(tenantId, () -> { +// RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue); +// }); +// log.info("user doReplaced, userId:{}, token:{}", loginId, tokenValue); +// } +// +// /** +// * 每次被封禁时触发 +// */ +// @Override +// public void doDisable(String loginType, Object loginId, String service, int level, long disableTime) { +// } +// +// /** +// * 每次被解封时触发 +// */ +// @Override +// public void doUntieDisable(String loginType, Object loginId, String service) { +// } +// +// /** +// * 每次打开二级认证时触发 +// */ +// @Override +// public void doOpenSafe(String loginType, String tokenValue, String service, long safeTime) { +// } +// +// /** +// * 每次创建Session时触发 +// */ +// @Override +// public void doCloseSafe(String loginType, String tokenValue, String service) { +// } +// +// /** +// * 每次创建Session时触发 +// */ +// @Override +// public void doCreateSession(String id) { +// } +// +// /** +// * 每次注销Session时触发 +// */ +// @Override +// public void doLogoutSession(String id) { +// } +// +// /** +// * 每次Token续期时触发 +// */ +// @Override +// public void doRenewTimeout(String tokenValue, Object loginId, long timeout) { +// } +//} diff --git a/fys-admin/src/main/resources/application-prod.yml b/fys-admin/src/main/resources/application-prod.yml index 8f210fb..67cca4f 100644 --- a/fys-admin/src/main/resources/application-prod.yml +++ b/fys-admin/src/main/resources/application-prod.yml @@ -4,7 +4,7 @@ spring.servlet.multipart.location: /fys/server/temp --- # 监控中心配置 spring.boot.admin.client: # 增加客户端开关 - enabled: true + enabled: false url: http://localhost:9090/admin instance: service-host-type: IP @@ -16,7 +16,7 @@ spring.boot.admin.client: --- # snail-job 配置 snail-job: - enabled: true + enabled: false # 需要在 SnailJob 后台组管理创建对应名称的组,然后创建任务的时候选择对应的组,才能正确分派任务 group: "fys_group" # SnailJob 接入验证令牌 详见 script/sql/ry_job.sql `sj_group_config`表 @@ -52,9 +52,9 @@ spring: driverClassName: com.mysql.cj.jdbc.Driver # jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562 # rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题) - url: jdbc:mysql://localhost:3306/fys_vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true + url: jdbc:mysql://47.120.79.150:3306/fys-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true username: root - password: Jz_5623_cl1 + password: Jq_123456# # # 从库数据源 # slave: # lazy: true @@ -101,7 +101,7 @@ spring: spring.data: redis: # 地址 - host: localhost + host: 47.120.79.150 # 端口,默认为6379 port: 6379 # 数据库索引 @@ -177,11 +177,14 @@ sms: # 框架定义的厂商名称标识,标定此配置是哪个厂商,详细请看厂商标识介绍部分 supplier: alibaba # 有些称为accessKey有些称之为apiKey,也有称为sdkKey或者appId。 - access-key-id: 您的accessKey + access-key-id: LTAI5tJdDNpZootsPQ5hdELx # 称为accessSecret有些称之为apiSecret - access-key-secret: 您的accessKeySecret - signature: 您的短信签名 - sdk-app-id: 您的sdkAppId + access-key-secret: mU4WtffcCXpHPz5tLwQpaGtLsJXONt + #模板ID 非必须配置,如果使用sendMessage的快速发送需此配置 + template-id: SMS_322180518 + #模板变量 上述模板的变量 + templateName: code + signature: 湖北星汉研创科技 config2: # 厂商标识,标定此配置是哪个厂商,详细请看厂商标识介绍部分 supplier: tencent From 0c932c686d5dcb9691b5d8317741c1f1a9d7bbe5 Mon Sep 17 00:00:00 2001 From: chenyouting <514333061@qq.com> Date: Fri, 8 Aug 2025 16:32:40 +0800 Subject: [PATCH 05/28] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=88=86=E4=BA=AB?= =?UTF-8?q?=E6=9F=A5=E7=9C=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fuyuanshen/app/service/AppDeviceShareService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/service/AppDeviceShareService.java b/fys-admin/src/main/java/com/fuyuanshen/app/service/AppDeviceShareService.java index 996c97c..ea5e1f6 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/app/service/AppDeviceShareService.java +++ b/fys-admin/src/main/java/com/fuyuanshen/app/service/AppDeviceShareService.java @@ -47,7 +47,7 @@ public class AppDeviceShareService { public AppDeviceShareDetailVo getInfo(Long id) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AppDeviceShare::getDeviceId, id); + queryWrapper.eq(AppDeviceShare::getId, id); List appDeviceShareVos = appDeviceShareMapper.selectVoList(queryWrapper); if(appDeviceShareVos==null || appDeviceShareVos.isEmpty()){ return null; From af64984623873b8e8ceb0aee7ec8508f8874dd7d Mon Sep 17 00:00:00 2001 From: chenyouting <514333061@qq.com> Date: Sat, 9 Aug 2025 08:49:37 +0800 Subject: [PATCH 06/28] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=88=86=E4=BA=AB?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/AppDeviceShareController.java | 2 +- .../app/service/AppDeviceShareService.java | 54 +++++++++++++++++++ .../app/domain/vo/AppDeviceShareVo.java | 25 +++++++++ 3 files changed, 80 insertions(+), 1 deletion(-) diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/controller/AppDeviceShareController.java b/fys-admin/src/main/java/com/fuyuanshen/app/controller/AppDeviceShareController.java index 581c934..09efc62 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/app/controller/AppDeviceShareController.java +++ b/fys-admin/src/main/java/com/fuyuanshen/app/controller/AppDeviceShareController.java @@ -52,7 +52,7 @@ public class AppDeviceShareController extends BaseController { */ @GetMapping("/deviceShareList") public TableDataInfo list(AppDeviceShareBo bo, PageQuery pageQuery) { - return deviceShareService.queryPageList(bo, pageQuery); + return appDeviceShareService.queryPageList(bo, pageQuery); } /** diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/service/AppDeviceShareService.java b/fys-admin/src/main/java/com/fuyuanshen/app/service/AppDeviceShareService.java index ea5e1f6..15dc7de 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/app/service/AppDeviceShareService.java +++ b/fys-admin/src/main/java/com/fuyuanshen/app/service/AppDeviceShareService.java @@ -1,7 +1,9 @@ package com.fuyuanshen.app.service; +import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fuyuanshen.app.domain.AppDeviceShare; import com.fuyuanshen.app.domain.AppPersonnelInfo; import com.fuyuanshen.app.domain.bo.AppDeviceShareBo; @@ -16,12 +18,15 @@ import com.fuyuanshen.common.core.exception.ServiceException; import com.fuyuanshen.common.core.exception.user.CaptchaExpireException; import com.fuyuanshen.common.core.utils.MessageUtils; import com.fuyuanshen.common.core.utils.StringUtils; +import com.fuyuanshen.common.mybatis.core.page.PageQuery; +import com.fuyuanshen.common.mybatis.core.page.TableDataInfo; import com.fuyuanshen.common.redis.utils.RedisUtils; import com.fuyuanshen.common.satoken.utils.AppLoginHelper; import com.fuyuanshen.equipment.domain.Device; import com.fuyuanshen.equipment.domain.DeviceType; import com.fuyuanshen.equipment.mapper.DeviceMapper; import com.fuyuanshen.equipment.mapper.DeviceTypeMapper; +import com.fuyuanshen.global.mqtt.constants.DeviceRedisKeyConstants; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -30,6 +35,9 @@ import java.util.Arrays; import java.util.Date; import java.util.List; +import static com.fuyuanshen.common.core.constant.GlobalConstants.GLOBAL_REDIS_KEY; +import static com.fuyuanshen.global.mqtt.constants.DeviceRedisKeyConstants.*; + @RequiredArgsConstructor @Slf4j @@ -44,6 +52,52 @@ public class AppDeviceShareService { private final AppPersonnelInfoMapper appPersonnelInfoMapper; + public TableDataInfo queryPageList(AppDeviceShareBo bo, PageQuery pageQuery) { + Long userId = AppLoginHelper.getUserId(); + bo.setCreateBy(userId); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + Page result = appDeviceShareMapper.selectVoPage(pageQuery.build(), lqw); + List records = result.getRecords(); + records.forEach(item-> { + Device device = deviceMapper.selectById(item.getDeviceId()); + if(device != null){ + item.setDevicePic(device.getDevicePic()); + item.setDeviceName(device.getDeviceName()); + item.setDeviceImei(device.getDeviceImei()); + } + + //设备在线状态 + String onlineStatus = RedisUtils.getCacheObject(GLOBAL_REDIS_KEY+ DEVICE_KEY_PREFIX+ item.getDeviceImei() + DeviceRedisKeyConstants.DEVICE_ONLINE_STATUS_KEY_PREFIX); + if(StringUtils.isNotBlank(onlineStatus)){ + + item.setOnlineStatus(1); + }else{ + item.setOnlineStatus(0); + } + String deviceStatus = RedisUtils.getCacheObject(GLOBAL_REDIS_KEY + DEVICE_KEY_PREFIX+ item.getDeviceImei() + DEVICE_STATUS_KEY_PREFIX); + // 获取电量 + if(StringUtils.isNotBlank(deviceStatus)){ + JSONObject jsonObject = JSONObject.parseObject(deviceStatus); + item.setBattery(jsonObject.getString("batteryPercentage")); + }else{ + item.setBattery("0"); + } + + String location = RedisUtils.getCacheObject(GLOBAL_REDIS_KEY +DEVICE_KEY_PREFIX+ item.getDeviceImei()+ DEVICE_LOCATION_KEY_PREFIX); + if(StringUtils.isNotBlank(location)){ + JSONObject jsonObject = JSONObject.parseObject(location); + item.setLatitude(jsonObject.getString("latitude")); + item.setLongitude(jsonObject.getString("longitude")); + } + + String alarmStatus = RedisUtils.getCacheObject(GLOBAL_REDIS_KEY +DEVICE_KEY_PREFIX+ item.getDeviceImei()+ DEVICE_ALARM_KEY_PREFIX); + if(StringUtils.isNotBlank(alarmStatus)){ + item.setAlarmStatus(alarmStatus); + } + }); + return TableDataInfo.build(result); + } + public AppDeviceShareDetailVo getInfo(Long id) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); diff --git a/fys-modules/fys-app/src/main/java/com/fuyuanshen/app/domain/vo/AppDeviceShareVo.java b/fys-modules/fys-app/src/main/java/com/fuyuanshen/app/domain/vo/AppDeviceShareVo.java index b9ea67d..d1f2055 100644 --- a/fys-modules/fys-app/src/main/java/com/fuyuanshen/app/domain/vo/AppDeviceShareVo.java +++ b/fys-modules/fys-app/src/main/java/com/fuyuanshen/app/domain/vo/AppDeviceShareVo.java @@ -73,4 +73,29 @@ public class AppDeviceShareVo implements Serializable { // 设备图片 private String devicePic; + + /** + * 在线状态(0离线,1在线) + */ + private Integer onlineStatus; + + /** + * 电量 百分比 + */ + private String battery; + + /** + * 纬度 + */ + private String latitude; + + /** + * 经度 + */ + private String longitude; + + /** + * 告警状态(0解除告警,1告警) + */ + private String alarmStatus; } From bc165f5d60de979f1a7e6507366a482a379680ab Mon Sep 17 00:00:00 2001 From: chenyouting <514333061@qq.com> Date: Sat, 9 Aug 2025 17:09:26 +0800 Subject: [PATCH 07/28] =?UTF-8?q?=E5=88=86=E4=BA=AB=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/AppDeviceShareController.java | 2 +- .../app/service/AppDeviceShareService.java | 116 ++++++++++++------ .../app/domain/vo/AppDeviceShareDetailVo.java | 34 +++++ .../app/domain/vo/AppDeviceShareVo.java | 6 + .../app/mapper/AppDeviceShareMapper.java | 3 + .../mapper/app/AppDeviceShareMapper.xml | 43 ++++++- 6 files changed, 163 insertions(+), 41 deletions(-) diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/controller/AppDeviceShareController.java b/fys-admin/src/main/java/com/fuyuanshen/app/controller/AppDeviceShareController.java index 09efc62..4c74320 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/app/controller/AppDeviceShareController.java +++ b/fys-admin/src/main/java/com/fuyuanshen/app/controller/AppDeviceShareController.java @@ -60,7 +60,7 @@ public class AppDeviceShareController extends BaseController { */ @GetMapping("/otherDeviceShareList") public TableDataInfo otherDeviceShareList(AppDeviceShareBo bo, PageQuery pageQuery) { - return deviceShareService.otherDeviceShareList(bo, pageQuery); + return appDeviceShareService.otherDeviceShareList(bo, pageQuery); } /** diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/service/AppDeviceShareService.java b/fys-admin/src/main/java/com/fuyuanshen/app/service/AppDeviceShareService.java index 15dc7de..be5986c 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/app/service/AppDeviceShareService.java +++ b/fys-admin/src/main/java/com/fuyuanshen/app/service/AppDeviceShareService.java @@ -2,7 +2,9 @@ package com.fuyuanshen.app.service; import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fuyuanshen.app.domain.AppDeviceShare; import com.fuyuanshen.app.domain.AppPersonnelInfo; @@ -55,49 +57,44 @@ public class AppDeviceShareService { public TableDataInfo queryPageList(AppDeviceShareBo bo, PageQuery pageQuery) { Long userId = AppLoginHelper.getUserId(); bo.setCreateBy(userId); - LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); - Page result = appDeviceShareMapper.selectVoPage(pageQuery.build(), lqw); + Page page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()); + Page result = appDeviceShareMapper.selectAppDeviceShareList(bo, page); List records = result.getRecords(); - records.forEach(item-> { - Device device = deviceMapper.selectById(item.getDeviceId()); - if(device != null){ - item.setDevicePic(device.getDevicePic()); - item.setDeviceName(device.getDeviceName()); - item.setDeviceImei(device.getDeviceImei()); - } - - //设备在线状态 - String onlineStatus = RedisUtils.getCacheObject(GLOBAL_REDIS_KEY+ DEVICE_KEY_PREFIX+ item.getDeviceImei() + DeviceRedisKeyConstants.DEVICE_ONLINE_STATUS_KEY_PREFIX); - if(StringUtils.isNotBlank(onlineStatus)){ - - item.setOnlineStatus(1); - }else{ - item.setOnlineStatus(0); - } - String deviceStatus = RedisUtils.getCacheObject(GLOBAL_REDIS_KEY + DEVICE_KEY_PREFIX+ item.getDeviceImei() + DEVICE_STATUS_KEY_PREFIX); - // 获取电量 - if(StringUtils.isNotBlank(deviceStatus)){ - JSONObject jsonObject = JSONObject.parseObject(deviceStatus); - item.setBattery(jsonObject.getString("batteryPercentage")); - }else{ - item.setBattery("0"); - } - - String location = RedisUtils.getCacheObject(GLOBAL_REDIS_KEY +DEVICE_KEY_PREFIX+ item.getDeviceImei()+ DEVICE_LOCATION_KEY_PREFIX); - if(StringUtils.isNotBlank(location)){ - JSONObject jsonObject = JSONObject.parseObject(location); - item.setLatitude(jsonObject.getString("latitude")); - item.setLongitude(jsonObject.getString("longitude")); - } - - String alarmStatus = RedisUtils.getCacheObject(GLOBAL_REDIS_KEY +DEVICE_KEY_PREFIX+ item.getDeviceImei()+ DEVICE_ALARM_KEY_PREFIX); - if(StringUtils.isNotBlank(alarmStatus)){ - item.setAlarmStatus(alarmStatus); - } - }); + records.forEach(AppDeviceShareService::buildDeviceStatus); return TableDataInfo.build(result); } + private static void buildDeviceStatus(AppDeviceShareVo item) { + //设备在线状态 + String onlineStatus = RedisUtils.getCacheObject(GLOBAL_REDIS_KEY+ DEVICE_KEY_PREFIX+ item.getDeviceImei() + DeviceRedisKeyConstants.DEVICE_ONLINE_STATUS_KEY_PREFIX); + if(StringUtils.isNotBlank(onlineStatus)){ + + item.setOnlineStatus(1); + }else{ + item.setOnlineStatus(0); + } + String deviceStatus = RedisUtils.getCacheObject(GLOBAL_REDIS_KEY + DEVICE_KEY_PREFIX+ item.getDeviceImei() + DEVICE_STATUS_KEY_PREFIX); + // 获取电量 + if(StringUtils.isNotBlank(deviceStatus)){ + JSONObject jsonObject = JSONObject.parseObject(deviceStatus); + item.setBattery(jsonObject.getString("batteryPercentage")); + }else{ + item.setBattery("0"); + } + + String location = RedisUtils.getCacheObject(GLOBAL_REDIS_KEY +DEVICE_KEY_PREFIX+ item.getDeviceImei()+ DEVICE_LOCATION_KEY_PREFIX); + if(StringUtils.isNotBlank(location)){ + JSONObject jsonObject = JSONObject.parseObject(location); + item.setLatitude(jsonObject.getString("latitude")); + item.setLongitude(jsonObject.getString("longitude")); + } + + String alarmStatus = RedisUtils.getCacheObject(GLOBAL_REDIS_KEY +DEVICE_KEY_PREFIX+ item.getDeviceImei()+ DEVICE_ALARM_KEY_PREFIX); + if(StringUtils.isNotBlank(alarmStatus)){ + item.setAlarmStatus(alarmStatus); + } + } + public AppDeviceShareDetailVo getInfo(Long id) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); @@ -135,7 +132,35 @@ public class AppDeviceShareService { if(appPersonnelInfoVos!=null && !appPersonnelInfoVos.isEmpty()){ shareDetailVo.setPersonnelInfo(appPersonnelInfoVos.get(0)); } + //设备在线状态 + String onlineStatus = RedisUtils.getCacheObject(GLOBAL_REDIS_KEY+ DEVICE_KEY_PREFIX + device.getDeviceImei()+ DeviceRedisKeyConstants.DEVICE_ONLINE_STATUS_KEY_PREFIX); + if(StringUtils.isNotBlank(onlineStatus)){ + shareDetailVo.setOnlineStatus(1); + }else{ + shareDetailVo.setOnlineStatus(0); + } + String deviceStatus = RedisUtils.getCacheObject(GLOBAL_REDIS_KEY+ DEVICE_KEY_PREFIX + device.getDeviceImei() + DeviceRedisKeyConstants.DEVICE_STATUS_KEY_PREFIX); + // 获取电量 + if(StringUtils.isNotBlank(deviceStatus)){ + JSONObject jsonObject = JSONObject.parseObject(deviceStatus); + shareDetailVo.setMainLightMode(jsonObject.getString("mainLightMode")); + shareDetailVo.setLaserLightMode(jsonObject.getString("laserLightMode")); + shareDetailVo.setBatteryPercentage(jsonObject.getString("batteryPercentage")); + shareDetailVo.setChargeState(jsonObject.getString("chargeState")); + shareDetailVo.setBatteryRemainingTime(jsonObject.getString("batteryRemainingTime")); + }else{ + shareDetailVo.setBatteryPercentage("0"); + } + // 获取经度纬度 + String locationKey = GlobalConstants.GLOBAL_REDIS_KEY+ DEVICE_KEY_PREFIX + device.getDeviceImei() + DeviceRedisKeyConstants.DEVICE_LOCATION_KEY_PREFIX; + String locationInfo = RedisUtils.getCacheObject(locationKey); + if(StringUtils.isNotBlank(locationInfo)){ + JSONObject jsonObject = JSONObject.parseObject(locationInfo); + shareDetailVo.setLongitude(jsonObject.get("longitude").toString()); + shareDetailVo.setLatitude(jsonObject.get("latitude").toString()); + shareDetailVo.setAddress((String)jsonObject.get("address")); + } return shareDetailVo; } /** @@ -186,4 +211,17 @@ public class AppDeviceShareService { public int remove(Long[] ids) { return appDeviceShareMapper.deleteByIds(Arrays.asList(ids)); } + + public TableDataInfo otherDeviceShareList(AppDeviceShareBo bo, PageQuery pageQuery) { + String username = AppLoginHelper.getUsername(); + bo.setPhonenumber(username); + Page page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()); + IPage result = appDeviceShareMapper.otherDeviceShareList(bo, page); + List records = result.getRecords(); + + records.forEach(AppDeviceShareService::buildDeviceStatus); + return TableDataInfo.build(result); + } + + } diff --git a/fys-modules/fys-app/src/main/java/com/fuyuanshen/app/domain/vo/AppDeviceShareDetailVo.java b/fys-modules/fys-app/src/main/java/com/fuyuanshen/app/domain/vo/AppDeviceShareDetailVo.java index d11d657..89716f6 100644 --- a/fys-modules/fys-app/src/main/java/com/fuyuanshen/app/domain/vo/AppDeviceShareDetailVo.java +++ b/fys-modules/fys-app/src/main/java/com/fuyuanshen/app/domain/vo/AppDeviceShareDetailVo.java @@ -104,4 +104,38 @@ public class AppDeviceShareDetailVo implements Serializable { * 发送信息 */ private String sendMsg; + + //设备主灯档位 + private String mainLightMode; + + //激光灯档位 + private String laserLightMode; + + //电量百分比 + private String batteryPercentage; + + //充电状态(0没有充电,1正在充电,2为已充满) + private String chargeState; + + //电池剩余续航时间200分钟 + private String batteryRemainingTime; + + /** + * 在线状态(0离线,1在线) + */ + private Integer onlineStatus; + + // 经度 + private String longitude; + + // 纬度 + private String latitude; + + // 逆解析地址 + private String address; + + /** + * 告警状态(0解除告警,1告警) + */ + private String alarmStatus; } diff --git a/fys-modules/fys-app/src/main/java/com/fuyuanshen/app/domain/vo/AppDeviceShareVo.java b/fys-modules/fys-app/src/main/java/com/fuyuanshen/app/domain/vo/AppDeviceShareVo.java index d1f2055..e5aef58 100644 --- a/fys-modules/fys-app/src/main/java/com/fuyuanshen/app/domain/vo/AppDeviceShareVo.java +++ b/fys-modules/fys-app/src/main/java/com/fuyuanshen/app/domain/vo/AppDeviceShareVo.java @@ -57,6 +57,12 @@ public class AppDeviceShareVo implements Serializable { @ExcelProperty(value = "手机号") private String phonenumber; + /** + * 他人分享手机号 + */ + @ExcelProperty(value = "手机号") + private String otherPhonenumber; + /** * 功能权限(1:灯光模式;2:激光模式;3:开机画面;4:人员信息登记;5:发送信息;6:产品信息) 以逗号分隔 diff --git a/fys-modules/fys-app/src/main/java/com/fuyuanshen/app/mapper/AppDeviceShareMapper.java b/fys-modules/fys-app/src/main/java/com/fuyuanshen/app/mapper/AppDeviceShareMapper.java index 01dbf1a..1de4c14 100644 --- a/fys-modules/fys-app/src/main/java/com/fuyuanshen/app/mapper/AppDeviceShareMapper.java +++ b/fys-modules/fys-app/src/main/java/com/fuyuanshen/app/mapper/AppDeviceShareMapper.java @@ -1,5 +1,6 @@ package com.fuyuanshen.app.mapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fuyuanshen.app.domain.AppDeviceShare; @@ -16,4 +17,6 @@ import org.apache.ibatis.annotations.Param; */ public interface AppDeviceShareMapper extends BaseMapperPlus { IPage otherDeviceShareList(@Param("bo") AppDeviceShareBo bo, Page page); + + Page selectAppDeviceShareList(@Param("bo") AppDeviceShareBo bo,Page page); } diff --git a/fys-modules/fys-app/src/main/resources/mapper/app/AppDeviceShareMapper.xml b/fys-modules/fys-app/src/main/resources/mapper/app/AppDeviceShareMapper.xml index 2202eae..9b3b29c 100644 --- a/fys-modules/fys-app/src/main/resources/mapper/app/AppDeviceShareMapper.xml +++ b/fys-modules/fys-app/src/main/resources/mapper/app/AppDeviceShareMapper.xml @@ -5,6 +5,47 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + From 61ed9f01549a66b11c631fce075f0337ca77f3ea Mon Sep 17 00:00:00 2001 From: chenyouting <514333061@qq.com> Date: Tue, 12 Aug 2025 17:03:11 +0800 Subject: [PATCH 08/28] =?UTF-8?q?=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/controller/AppDeviceController.java | 18 ++ .../device/AppDeviceBJQController.java | 18 +- .../domain/dto/AppDeviceLogoUploadDto.java | 1 + .../app/domain/dto/AppRealTimeStatusDto.java | 30 +++ .../app/service/AppDeviceBizService.java | 32 ++- .../device/AppDeviceBJQBizService.java | 9 +- .../device/status/DeviceStatusRule.java | 20 ++ .../status/constants/DeviceTypeConstants.java | 6 + .../device/status/jbq/AlarmStatusRule.java | 50 +++++ .../device/status/jbq/BootLogoStatusRule.java | 49 +++++ .../jbq/LaserModeSettingsStatusRule.java | 48 +++++ .../device/status/jbq/ModeStatusRule.java | 47 +++++ .../jbq/RegisterPersonInfoStatusRule.java | 47 +++++ .../status/jbq/SendMessageStatusRule.java | 48 +++++ .../global/mqtt/rule/bjq/BjqBootLogoRule.java | 2 +- .../global/mqtt/rule/bjq/BjqModeRule.java | 5 + .../common/core/constant/GlobalConstants.java | 3 + .../annotation/FunctionAccessAnnotation.java | 11 ++ .../FunctionAccessBatcAnnotation.java | 11 ++ .../aspectj/FunctionAccessAspect.java | 103 ++++++++++ .../aspectj/FunctionAccessBatchAspect.java | 184 ++++++++++++++++++ .../app/domain/bo/AppPersonnelInfoBo.java | 5 + .../mapper/app/AppDeviceShareMapper.xml | 7 +- .../domain/dto/AppDeviceSendMsgBo.java | 7 + 24 files changed, 742 insertions(+), 19 deletions(-) create mode 100644 fys-admin/src/main/java/com/fuyuanshen/app/domain/dto/AppRealTimeStatusDto.java create mode 100644 fys-admin/src/main/java/com/fuyuanshen/app/service/device/status/DeviceStatusRule.java create mode 100644 fys-admin/src/main/java/com/fuyuanshen/app/service/device/status/constants/DeviceTypeConstants.java create mode 100644 fys-admin/src/main/java/com/fuyuanshen/app/service/device/status/jbq/AlarmStatusRule.java create mode 100644 fys-admin/src/main/java/com/fuyuanshen/app/service/device/status/jbq/BootLogoStatusRule.java create mode 100644 fys-admin/src/main/java/com/fuyuanshen/app/service/device/status/jbq/LaserModeSettingsStatusRule.java create mode 100644 fys-admin/src/main/java/com/fuyuanshen/app/service/device/status/jbq/ModeStatusRule.java create mode 100644 fys-admin/src/main/java/com/fuyuanshen/app/service/device/status/jbq/RegisterPersonInfoStatusRule.java create mode 100644 fys-admin/src/main/java/com/fuyuanshen/app/service/device/status/jbq/SendMessageStatusRule.java create mode 100644 fys-common/fys-common-ratelimiter/src/main/java/com/fuyuanshen/common/ratelimiter/annotation/FunctionAccessAnnotation.java create mode 100644 fys-common/fys-common-ratelimiter/src/main/java/com/fuyuanshen/common/ratelimiter/annotation/FunctionAccessBatcAnnotation.java create mode 100644 fys-common/fys-common-ratelimiter/src/main/java/com/fuyuanshen/common/ratelimiter/aspectj/FunctionAccessAspect.java create mode 100644 fys-common/fys-common-ratelimiter/src/main/java/com/fuyuanshen/common/ratelimiter/aspectj/FunctionAccessBatchAspect.java diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/controller/AppDeviceController.java b/fys-admin/src/main/java/com/fuyuanshen/app/controller/AppDeviceController.java index beb899e..d414cff 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/app/controller/AppDeviceController.java +++ b/fys-admin/src/main/java/com/fuyuanshen/app/controller/AppDeviceController.java @@ -1,12 +1,14 @@ package com.fuyuanshen.app.controller; import com.fuyuanshen.app.domain.dto.APPReNameDTO; +import com.fuyuanshen.app.domain.dto.AppRealTimeStatusDto; import com.fuyuanshen.app.domain.vo.APPDeviceTypeVo; import com.fuyuanshen.app.service.AppDeviceBizService; import com.fuyuanshen.common.core.domain.R; import com.fuyuanshen.common.mybatis.core.page.PageQuery; import com.fuyuanshen.common.mybatis.core.page.TableDataInfo; import com.fuyuanshen.common.web.core.BaseController; +import com.fuyuanshen.equipment.domain.Device; import com.fuyuanshen.equipment.domain.dto.AppDeviceBo; import com.fuyuanshen.equipment.domain.query.DeviceQueryCriteria; import com.fuyuanshen.equipment.domain.vo.AppDeviceVo; @@ -15,6 +17,7 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.util.List; +import java.util.Map; /** * APP设备信息管理 @@ -72,4 +75,19 @@ public class AppDeviceController extends BaseController { appDeviceService.reName(reNameDTO); return R.ok("重命名成功!!!"); } + + + @GetMapping("/realTimeStatus") + public R> getRealTimeStatus(AppRealTimeStatusDto statusDto) { + Map status = appDeviceService.getRealTimeStatus(statusDto); + return R.ok(status); + } + + /** + * 根据mac查询设备信息 + */ + @GetMapping("/getDeviceInfoByDeviceMac") + public R getDeviceInfo(String deviceMac) { + return R.ok(appDeviceService.getDeviceInfo(deviceMac)); + } } diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/controller/device/AppDeviceBJQController.java b/fys-admin/src/main/java/com/fuyuanshen/app/controller/device/AppDeviceBJQController.java index 2f7caf8..7427f8e 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/app/controller/device/AppDeviceBJQController.java +++ b/fys-admin/src/main/java/com/fuyuanshen/app/controller/device/AppDeviceBJQController.java @@ -7,6 +7,8 @@ import com.fuyuanshen.app.domain.vo.AppDeviceDetailVo; import com.fuyuanshen.app.service.device.AppDeviceBJQBizService; import com.fuyuanshen.common.core.domain.R; import com.fuyuanshen.common.core.validate.AddGroup; +import com.fuyuanshen.common.ratelimiter.annotation.FunctionAccessAnnotation; +import com.fuyuanshen.common.ratelimiter.annotation.FunctionAccessBatcAnnotation; import com.fuyuanshen.common.web.core.BaseController; import com.fuyuanshen.equipment.domain.dto.AppDeviceSendMsgBo; import jakarta.validation.constraints.NotNull; @@ -41,6 +43,7 @@ public class AppDeviceBJQController extends BaseController { * 人员信息登记 */ @PostMapping(value = "/registerPersonInfo") + @FunctionAccessAnnotation("registerPersonInfo") public R registerPersonInfo(@Validated(AddGroup.class) @RequestBody AppPersonnelInfoBo bo) { return toAjax(appDeviceService.registerPersonInfo(bo)); } @@ -49,6 +52,7 @@ public class AppDeviceBJQController extends BaseController { * 发送信息 */ @PostMapping(value = "/sendMessage") + @FunctionAccessBatcAnnotation("sendMessage") public R sendMessage(@RequestBody AppDeviceSendMsgBo bo) { return toAjax(appDeviceService.sendMessage(bo)); } @@ -57,6 +61,7 @@ public class AppDeviceBJQController extends BaseController { * 发送报警信息 */ @PostMapping(value = "/sendAlarmMessage") + @FunctionAccessBatcAnnotation("sendAlarmMessage") public R sendAlarmMessage(@RequestBody AppDeviceSendMsgBo bo) { return toAjax(appDeviceService.sendAlarmMessage(bo)); } @@ -65,6 +70,7 @@ public class AppDeviceBJQController extends BaseController { * 上传设备logo图片 */ @PostMapping("/uploadLogo") + @FunctionAccessAnnotation("uploadLogo") public R upload(@Validated @ModelAttribute AppDeviceLogoUploadDto bo) { MultipartFile file = bo.getFile(); @@ -80,6 +86,7 @@ public class AppDeviceBJQController extends BaseController { * 灯光模式 * 0(关灯),1(强光模式),2(弱光模式), 3(爆闪模式), 4(泛光模式) */ + @FunctionAccessAnnotation("lightModeSettings") @PostMapping("/lightModeSettings") public R lightModeSettings(@RequestBody DeviceInstructDto params) { // params 转 JSONObject @@ -91,6 +98,7 @@ public class AppDeviceBJQController extends BaseController { * 灯光亮度设置 * */ + @FunctionAccessAnnotation("lightBrightnessSettings") @PostMapping("/lightBrightnessSettings") public R lightBrightnessSettings(@RequestBody DeviceInstructDto params) { appDeviceService.lightBrightnessSettings(params); @@ -102,18 +110,10 @@ public class AppDeviceBJQController extends BaseController { * */ @PostMapping("/laserModeSettings") + @FunctionAccessAnnotation("laserModeSettings") public R laserModeSettings(@RequestBody DeviceInstructDto params) { appDeviceService.laserModeSettings(params); return R.ok(); } - /** - * 地图逆解析 - * - */ - @PostMapping("/mapReverseGeocoding") - public R mapReverseGeocoding(@RequestBody DeviceInstructDto params) { - String mapJson = appDeviceService.mapReverseGeocoding(params); - return R.ok(mapJson); - } } diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/domain/dto/AppDeviceLogoUploadDto.java b/fys-admin/src/main/java/com/fuyuanshen/app/domain/dto/AppDeviceLogoUploadDto.java index 76dc5e2..26db3c1 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/app/domain/dto/AppDeviceLogoUploadDto.java +++ b/fys-admin/src/main/java/com/fuyuanshen/app/domain/dto/AppDeviceLogoUploadDto.java @@ -8,6 +8,7 @@ public class AppDeviceLogoUploadDto { private Long deviceId; + private String deviceImei; /** * 文件 */ diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/domain/dto/AppRealTimeStatusDto.java b/fys-admin/src/main/java/com/fuyuanshen/app/domain/dto/AppRealTimeStatusDto.java new file mode 100644 index 0000000..01a13d3 --- /dev/null +++ b/fys-admin/src/main/java/com/fuyuanshen/app/domain/dto/AppRealTimeStatusDto.java @@ -0,0 +1,30 @@ +package com.fuyuanshen.app.domain.dto; + +import lombok.Data; + +/** + * 设备实时状态 + */ +@Data +public class AppRealTimeStatusDto { + + /** + * 设备IMEI + */ + private String deviceImei; + + /** + * 设备类型 + */ + private String typeName; + + /** + * 功能类型 + */ + private String functionMode; + + /** + * 批次号 + */ + private String batchId; +} diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/service/AppDeviceBizService.java b/fys-admin/src/main/java/com/fuyuanshen/app/service/AppDeviceBizService.java index 80e74f1..93ea7c2 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/app/service/AppDeviceBizService.java +++ b/fys-admin/src/main/java/com/fuyuanshen/app/service/AppDeviceBizService.java @@ -11,6 +11,7 @@ import com.fuyuanshen.app.domain.AppPersonnelInfo; import com.fuyuanshen.app.domain.bo.AppPersonnelInfoBo; import com.fuyuanshen.app.domain.dto.APPReNameDTO; import com.fuyuanshen.app.domain.dto.AppDeviceLogoUploadDto; +import com.fuyuanshen.app.domain.dto.AppRealTimeStatusDto; import com.fuyuanshen.app.domain.dto.DeviceInstructDto; import com.fuyuanshen.app.domain.vo.APPDeviceTypeVo; import com.fuyuanshen.app.domain.vo.AppDeviceDetailVo; @@ -18,6 +19,8 @@ import com.fuyuanshen.app.domain.vo.AppPersonnelInfoVo; import com.fuyuanshen.app.mapper.AppDeviceBindRecordMapper; import com.fuyuanshen.app.mapper.AppPersonnelInfoMapper; import com.fuyuanshen.app.mapper.equipment.APPDeviceMapper; +import com.fuyuanshen.app.service.device.status.DeviceStatusRule; +import com.fuyuanshen.app.service.device.status.RealTimeStatusEngine; import com.fuyuanshen.common.core.constant.GlobalConstants; import com.fuyuanshen.common.core.exception.ServiceException; import com.fuyuanshen.common.core.utils.*; @@ -35,7 +38,7 @@ import com.fuyuanshen.equipment.enums.BindingStatusEnum; import com.fuyuanshen.equipment.enums.CommunicationModeEnum; import com.fuyuanshen.equipment.mapper.DeviceMapper; import com.fuyuanshen.equipment.mapper.DeviceTypeMapper; -import com.fuyuanshen.equipment.utils.c.ReliableTextToBitmap; +import com.fuyuanshen.equipment.service.DeviceService; import com.fuyuanshen.global.mqtt.config.MqttGateway; import com.fuyuanshen.global.mqtt.constants.DeviceRedisKeyConstants; import com.fuyuanshen.global.mqtt.constants.MqttConstants; @@ -68,6 +71,9 @@ public class AppDeviceBizService { private final DeviceTypeMapper deviceTypeMapper; private final MqttGateway mqttGateway; private final AppDeviceBindRecordMapper appDeviceBindRecordMapper; + private final RealTimeStatusEngine realTimeStatusEngine; + private final DeviceService deviceService; + public List getTypeList() { @@ -602,4 +608,28 @@ public class AppDeviceBizService { } return 1; } + + public Map getRealTimeStatus(AppRealTimeStatusDto statusDto) { + try { + String commandType = statusDto.getTypeName()+"_" + statusDto.getFunctionMode(); + DeviceStatusRule rule = realTimeStatusEngine.getDeviceStatusRule(commandType); + if(rule == null){ + throw new ServiceException("未匹配到处理命令"); + } + return rule.getStatus(statusDto); + } catch (Exception e){ + e.printStackTrace(); + } + return null; + } + + public Device getDeviceInfo(String deviceMac) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("device_mac", deviceMac); + List devices = deviceMapper.selectList(queryWrapper); + if(ObjectUtils.length(devices) ==0){ + return null; + } + return devices.get(0); + } } diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/service/device/AppDeviceBJQBizService.java b/fys-admin/src/main/java/com/fuyuanshen/app/service/device/AppDeviceBJQBizService.java index db998b6..026ee4f 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/app/service/device/AppDeviceBJQBizService.java +++ b/fys-admin/src/main/java/com/fuyuanshen/app/service/device/AppDeviceBJQBizService.java @@ -14,6 +14,7 @@ import com.fuyuanshen.app.mapper.AppPersonnelInfoMapper; import com.fuyuanshen.common.core.constant.GlobalConstants; import com.fuyuanshen.common.core.exception.ServiceException; import com.fuyuanshen.common.core.utils.*; +import com.fuyuanshen.common.ratelimiter.annotation.FunctionAccessAnnotation; import com.fuyuanshen.common.redis.utils.RedisUtils; import com.fuyuanshen.common.satoken.utils.AppLoginHelper; import com.fuyuanshen.equipment.domain.Device; @@ -62,12 +63,10 @@ public class AppDeviceBJQBizService { if (device == null) { throw new ServiceException("设备不存在" + deviceId); } - try { ClassPathResource resource = new ClassPathResource("image/background.png"); InputStream inputStream = resource.getInputStream(); -// String backgroundImagePath = "D:\\background.png"; // 替换为实际背景图片路径 byte[] largeData = ImageWithTextGenerate.generate160x80ImageWithText2(bo.getSendMsg(), inputStream, 25600); int[] ints = convertHexToDecimal(largeData); RedisUtils.setCacheObject(GLOBAL_REDIS_KEY+ DEVICE_KEY_PREFIX + device.getDeviceImei() + ":app_send_message_data" , Arrays.toString(ints), Duration.ofSeconds(30 * 60L)); @@ -77,7 +76,6 @@ public class AppDeviceBJQBizService { byte[] arr = ImageToCArrayConverter.convertStringToByteArray(data); byte[] specificChunk = ImageToCArrayConverter.getChunk(arr, 0, 512); log.info("发送信息第0块数据大小: {} 字节",specificChunk.length); -// log.info("第0块数据: {}", Arrays.toString(specificChunk)); ArrayList intData = new ArrayList<>(); intData.add(6); @@ -167,6 +165,7 @@ public class AppDeviceBJQBizService { } + public boolean registerPersonInfo(AppPersonnelInfoBo bo) { Long deviceId = bo.getDeviceId(); Device deviceObj = deviceMapper.selectById(deviceId); @@ -212,6 +211,7 @@ public class AppDeviceBJQBizService { } + @FunctionAccessAnnotation("uploadDeviceLogo") public void uploadDeviceLogo(AppDeviceLogoUploadDto bo) { try { Device device = deviceMapper.selectById(bo.getDeviceId()); @@ -256,6 +256,7 @@ public class AppDeviceBJQBizService { * 灯光模式 * 0(关灯),1(强光模式),2(弱光模式), 3(爆闪模式), 4(泛光模式) */ + public void lightModeSettings(DeviceInstructDto params) { try { Long deviceId = params.getDeviceId(); @@ -280,6 +281,7 @@ public class AppDeviceBJQBizService { } //灯光亮度设置 + @FunctionAccessAnnotation("lightBrightnessSettings") public void lightBrightnessSettings(DeviceInstructDto params) { try { Long deviceId = params.getDeviceId(); @@ -312,6 +314,7 @@ public class AppDeviceBJQBizService { } //激光模式设置 + @FunctionAccessAnnotation("laserModeSettings") public void laserModeSettings(DeviceInstructDto params) { try { Long deviceId = params.getDeviceId(); diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/service/device/status/DeviceStatusRule.java b/fys-admin/src/main/java/com/fuyuanshen/app/service/device/status/DeviceStatusRule.java new file mode 100644 index 0000000..2c83a36 --- /dev/null +++ b/fys-admin/src/main/java/com/fuyuanshen/app/service/device/status/DeviceStatusRule.java @@ -0,0 +1,20 @@ +package com.fuyuanshen.app.service.device.status; + +import com.fuyuanshen.app.domain.dto.AppRealTimeStatusDto; +import com.fuyuanshen.equipment.domain.Device; + +import java.util.Map; + +// 规则接口 +public interface DeviceStatusRule { + + /** + * 获取命令类型 + * @return 命令类型 + */ + String getCommandType(); + + boolean supports(String deviceType); + + Map getStatus(AppRealTimeStatusDto statusDto); +} \ No newline at end of file diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/service/device/status/constants/DeviceTypeConstants.java b/fys-admin/src/main/java/com/fuyuanshen/app/service/device/status/constants/DeviceTypeConstants.java new file mode 100644 index 0000000..271f633 --- /dev/null +++ b/fys-admin/src/main/java/com/fuyuanshen/app/service/device/status/constants/DeviceTypeConstants.java @@ -0,0 +1,6 @@ +package com.fuyuanshen.app.service.device.status.constants; + +public class DeviceTypeConstants { + public static final String TYPE_BJQ6170 = "BJQ6170"; + +} diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/service/device/status/jbq/AlarmStatusRule.java b/fys-admin/src/main/java/com/fuyuanshen/app/service/device/status/jbq/AlarmStatusRule.java new file mode 100644 index 0000000..14956de --- /dev/null +++ b/fys-admin/src/main/java/com/fuyuanshen/app/service/device/status/jbq/AlarmStatusRule.java @@ -0,0 +1,50 @@ +package com.fuyuanshen.app.service.device.status.jbq; + +import com.fuyuanshen.app.domain.dto.AppRealTimeStatusDto; +import com.fuyuanshen.app.service.device.status.DeviceStatusRule; +import com.fuyuanshen.app.service.device.status.constants.DeviceTypeConstants; +import com.fuyuanshen.common.redis.utils.RedisUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; + +import static com.fuyuanshen.common.core.constant.GlobalConstants.FUNCTION_ACCESS_KEY; + + +@Slf4j +@Component +public class AlarmStatusRule implements DeviceStatusRule { + @Override + public String getCommandType() { + return DeviceTypeConstants.TYPE_BJQ6170+"_5"; + } + + @Override + public boolean supports(String deviceType) { + return true; // 适用于所有设备类型 + } + + @Override + public Map getStatus(AppRealTimeStatusDto dto) { + Map status = new HashMap<>(); + String functionAccess = RedisUtils.getCacheObject( + + FUNCTION_ACCESS_KEY + dto.getDeviceImei()); + if(functionAccess==null){ + status.put("functionAccess", "OK"); + }else{ + status.put("functionAccess", "ACTIVE"); + } + // + +// String alarmStatus = RedisUtils.getCacheObject( +// GLOBAL_REDIS_KEY + DEVICE_KEY_PREFIX + dto.getDeviceImei() + DEVICE_ALARM_KEY_PREFIX); +// +// if (StringUtils.isNotBlank(alarmStatus)) { +// status.put("alarmStatus", alarmStatus); +// } + return status; + } +} \ No newline at end of file diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/service/device/status/jbq/BootLogoStatusRule.java b/fys-admin/src/main/java/com/fuyuanshen/app/service/device/status/jbq/BootLogoStatusRule.java new file mode 100644 index 0000000..6eea5b3 --- /dev/null +++ b/fys-admin/src/main/java/com/fuyuanshen/app/service/device/status/jbq/BootLogoStatusRule.java @@ -0,0 +1,49 @@ +package com.fuyuanshen.app.service.device.status.jbq; + +import com.fuyuanshen.app.domain.dto.AppRealTimeStatusDto; +import com.fuyuanshen.app.service.device.status.DeviceStatusRule; +import com.fuyuanshen.app.service.device.status.constants.DeviceTypeConstants; +import com.fuyuanshen.common.redis.utils.RedisUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; + +import static com.fuyuanshen.common.core.constant.GlobalConstants.FUNCTION_ACCESS_KEY; + +// 上传开机图片 +@Slf4j +@Component +public class BootLogoStatusRule implements DeviceStatusRule { + @Override + public String getCommandType() { + return DeviceTypeConstants.TYPE_BJQ6170+"_3"; + } + + @Override + public boolean supports(String deviceType) { + return true; // 适用于所有设备类型 + } + + @Override + public Map getStatus(AppRealTimeStatusDto dto) { + Map status = new HashMap<>(); + String functionAccess = RedisUtils.getCacheObject( + FUNCTION_ACCESS_KEY + dto.getDeviceImei()); + if(functionAccess==null){ + status.put("functionAccess", "OK"); + }else{ + status.put("functionAccess", "ACTIVE"); + } +// String location = RedisUtils.getCacheObject( +// GLOBAL_REDIS_KEY + DEVICE_KEY_PREFIX + dto.getDeviceImei() + DEVICE_LOCATION_KEY_PREFIX); +// +// if (StringUtils.isNotBlank(location)) { +// JSONObject jsonObject = JSONObject.parseObject(location); +// status.put("latitude", jsonObject.getString("latitude")); +// status.put("longitude", jsonObject.getString("longitude")); +// } + return status; + } +} \ No newline at end of file diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/service/device/status/jbq/LaserModeSettingsStatusRule.java b/fys-admin/src/main/java/com/fuyuanshen/app/service/device/status/jbq/LaserModeSettingsStatusRule.java new file mode 100644 index 0000000..1004dba --- /dev/null +++ b/fys-admin/src/main/java/com/fuyuanshen/app/service/device/status/jbq/LaserModeSettingsStatusRule.java @@ -0,0 +1,48 @@ +package com.fuyuanshen.app.service.device.status.jbq; + +import com.fuyuanshen.app.domain.dto.AppRealTimeStatusDto; +import com.fuyuanshen.app.service.device.status.DeviceStatusRule; +import com.fuyuanshen.app.service.device.status.constants.DeviceTypeConstants; +import com.fuyuanshen.common.redis.utils.RedisUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; + +import static com.fuyuanshen.common.core.constant.GlobalConstants.FUNCTION_ACCESS_KEY; + +// 激光模式设置 +@Slf4j +@Component +public class LaserModeSettingsStatusRule implements DeviceStatusRule { + @Override + public String getCommandType() { + return DeviceTypeConstants.TYPE_BJQ6170+"_2"; + } + + @Override + public boolean supports(String deviceType) { + return true; // 适用于所有设备类型 + } + + /** + * @param dto + * @return + */ + @Override + public Map getStatus(AppRealTimeStatusDto dto) { + Map status = new HashMap<>(); + String functionAccess = RedisUtils.getCacheObject( + FUNCTION_ACCESS_KEY + dto.getDeviceImei()); + if(functionAccess==null){ + status.put("functionAccess", "OK"); + }else{ + status.put("functionAccess", "ACTIVE"); + } +// String onlineStatus = RedisUtils.getCacheObject( +// GLOBAL_REDIS_KEY + DEVICE_KEY_PREFIX + dto.getDeviceImei() + DEVICE_ONLINE_STATUS_KEY_PREFIX); +// status.put("onlineStatus", StringUtils.isNotBlank(onlineStatus) ? 1 : 0); + return status; + } +} \ No newline at end of file diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/service/device/status/jbq/ModeStatusRule.java b/fys-admin/src/main/java/com/fuyuanshen/app/service/device/status/jbq/ModeStatusRule.java new file mode 100644 index 0000000..a20c024 --- /dev/null +++ b/fys-admin/src/main/java/com/fuyuanshen/app/service/device/status/jbq/ModeStatusRule.java @@ -0,0 +1,47 @@ +package com.fuyuanshen.app.service.device.status.jbq; + +import com.fuyuanshen.app.domain.dto.AppRealTimeStatusDto; +import com.fuyuanshen.app.service.device.status.DeviceStatusRule; +import com.fuyuanshen.app.service.device.status.constants.DeviceTypeConstants; +import com.fuyuanshen.common.redis.utils.RedisUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; + +import static com.fuyuanshen.common.core.constant.GlobalConstants.FUNCTION_ACCESS_KEY; + +// 灯光状态 +@Slf4j +@Component +public class ModeStatusRule implements DeviceStatusRule { + + @Override + public String getCommandType() { + return DeviceTypeConstants.TYPE_BJQ6170+"_1"; + } + + @Override + public boolean supports(String deviceType) { + return true; // 适用于所有设备类型 + } + + @Override + public Map getStatus(AppRealTimeStatusDto dto) { + Map status = new HashMap<>(); + String functionAccess = RedisUtils.getCacheObject( + FUNCTION_ACCESS_KEY + dto.getDeviceImei()); + status.put("functionAccess", functionAccess); +// String deviceStatus = RedisUtils.getCacheObject( +// GLOBAL_REDIS_KEY + DEVICE_KEY_PREFIX + dto.getDeviceImei() + DEVICE_STATUS_KEY_PREFIX); +// +// if (StringUtils.isNotBlank(deviceStatus)) { +// JSONObject jsonObject = JSONObject.parseObject(deviceStatus); +// status.put("battery", jsonObject.getString("batteryPercentage")); +// } else { +// status.put("battery", "0"); +// } + return status; + } +} \ No newline at end of file diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/service/device/status/jbq/RegisterPersonInfoStatusRule.java b/fys-admin/src/main/java/com/fuyuanshen/app/service/device/status/jbq/RegisterPersonInfoStatusRule.java new file mode 100644 index 0000000..f7288fa --- /dev/null +++ b/fys-admin/src/main/java/com/fuyuanshen/app/service/device/status/jbq/RegisterPersonInfoStatusRule.java @@ -0,0 +1,47 @@ +package com.fuyuanshen.app.service.device.status.jbq; + +import com.fuyuanshen.app.domain.dto.AppRealTimeStatusDto; +import com.fuyuanshen.app.service.device.status.DeviceStatusRule; +import com.fuyuanshen.app.service.device.status.constants.DeviceTypeConstants; +import com.fuyuanshen.common.redis.utils.RedisUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; + +import static com.fuyuanshen.common.core.constant.GlobalConstants.FUNCTION_ACCESS_KEY; + + +@Slf4j +@Component +public class RegisterPersonInfoStatusRule implements DeviceStatusRule { + @Override + public String getCommandType() { + return DeviceTypeConstants.TYPE_BJQ6170+"_4"; + } + + @Override + public boolean supports(String deviceType) { + return true; // 适用于所有设备类型 + } + + @Override + public Map getStatus(AppRealTimeStatusDto dto) { + Map status = new HashMap<>(); + String functionAccess = RedisUtils.getCacheObject( + FUNCTION_ACCESS_KEY + dto.getDeviceImei()); + if(functionAccess==null){ + status.put("functionAccess", "OK"); + }else{ + status.put("functionAccess", "ACTIVE"); + } +// String alarmStatus = RedisUtils.getCacheObject( +// GLOBAL_REDIS_KEY + DEVICE_KEY_PREFIX + dto.getDeviceImei() + DEVICE_ALARM_KEY_PREFIX); +// +// if (StringUtils.isNotBlank(alarmStatus)) { +// status.put("alarmStatus", alarmStatus); +// } + return status; + } +} \ No newline at end of file diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/service/device/status/jbq/SendMessageStatusRule.java b/fys-admin/src/main/java/com/fuyuanshen/app/service/device/status/jbq/SendMessageStatusRule.java new file mode 100644 index 0000000..d4382ec --- /dev/null +++ b/fys-admin/src/main/java/com/fuyuanshen/app/service/device/status/jbq/SendMessageStatusRule.java @@ -0,0 +1,48 @@ +package com.fuyuanshen.app.service.device.status.jbq; + +import com.fuyuanshen.app.domain.dto.AppRealTimeStatusDto; +import com.fuyuanshen.app.service.device.status.DeviceStatusRule; +import com.fuyuanshen.app.service.device.status.constants.DeviceTypeConstants; +import com.fuyuanshen.common.redis.utils.RedisUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static com.fuyuanshen.common.core.constant.GlobalConstants.FUNCTION_ACCESS_KEY; + + +@Slf4j +@Component +public class SendMessageStatusRule implements DeviceStatusRule { + @Override + public String getCommandType() { + return DeviceTypeConstants.TYPE_BJQ6170+"_6"; + } + + @Override + public boolean supports(String deviceType) { + return true; // 适用于所有设备类型 + } + + @Override + public Map getStatus(AppRealTimeStatusDto dto) { + Map status = new HashMap<>(); + List functionAccess = RedisUtils.getCacheObject( + FUNCTION_ACCESS_KEY + dto.getBatchId()); + if(functionAccess==null){ + status.put("functionAccess", "OK"); + }else{ + status.put("functionAccess", "ACTIVE"); + } +// String alarmStatus = RedisUtils.getCacheObject( +// GLOBAL_REDIS_KEY + DEVICE_KEY_PREFIX + dto.getDeviceImei() + DEVICE_ALARM_KEY_PREFIX); +// +// if (StringUtils.isNotBlank(alarmStatus)) { +// status.put("alarmStatus", alarmStatus); +// } + return status; + } +} \ No newline at end of file diff --git a/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/bjq/BjqBootLogoRule.java b/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/bjq/BjqBootLogoRule.java index 97fd0f3..309d20b 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/bjq/BjqBootLogoRule.java +++ b/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/bjq/BjqBootLogoRule.java @@ -23,7 +23,7 @@ import static com.fuyuanshen.global.mqtt.constants.DeviceRedisKeyConstants.DEVIC import static com.fuyuanshen.global.mqtt.constants.DeviceRedisKeyConstants.DEVICE_KEY_PREFIX; /** - * 人员信息命令处理 + * 上传开机图片命令处理 */ @Component @RequiredArgsConstructor diff --git a/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/bjq/BjqModeRule.java b/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/bjq/BjqModeRule.java index 09aeacc..6904edb 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/bjq/BjqModeRule.java +++ b/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/bjq/BjqModeRule.java @@ -14,6 +14,7 @@ import org.springframework.stereotype.Component; import java.time.Duration; import java.util.concurrent.CompletableFuture; +import static com.fuyuanshen.common.core.constant.GlobalConstants.FUNCTION_ACCESS_KEY; import static com.fuyuanshen.global.mqtt.constants.DeviceRedisKeyConstants.DEVICE_KEY_PREFIX; import static com.fuyuanshen.global.mqtt.constants.DeviceRedisKeyConstants.DEVICE_LIGHT_MODE_KEY_PREFIX; @@ -47,6 +48,10 @@ public class BjqModeRule implements MqttMessageRule { } catch (Exception e) { log.error("处理灯光模式命令时出错", e); + }finally { + log.info("处理灯光模式命令完成"); + String functionAccess = FUNCTION_ACCESS_KEY + context.getDeviceImei(); + RedisUtils.deleteObject(functionAccess); } } diff --git a/fys-common/fys-common-core/src/main/java/com/fuyuanshen/common/core/constant/GlobalConstants.java b/fys-common/fys-common-core/src/main/java/com/fuyuanshen/common/core/constant/GlobalConstants.java index ccec371..305b5b0 100644 --- a/fys-common/fys-common-core/src/main/java/com/fuyuanshen/common/core/constant/GlobalConstants.java +++ b/fys-common/fys-common-core/src/main/java/com/fuyuanshen/common/core/constant/GlobalConstants.java @@ -36,4 +36,7 @@ public interface GlobalConstants { * 三方认证 redis key */ String SOCIAL_AUTH_CODE_KEY = GLOBAL_REDIS_KEY + "social_auth_codes:"; + + + String FUNCTION_ACCESS_KEY = GLOBAL_REDIS_KEY + "device:function_access:"; } diff --git a/fys-common/fys-common-ratelimiter/src/main/java/com/fuyuanshen/common/ratelimiter/annotation/FunctionAccessAnnotation.java b/fys-common/fys-common-ratelimiter/src/main/java/com/fuyuanshen/common/ratelimiter/annotation/FunctionAccessAnnotation.java new file mode 100644 index 0000000..635b5b9 --- /dev/null +++ b/fys-common/fys-common-ratelimiter/src/main/java/com/fuyuanshen/common/ratelimiter/annotation/FunctionAccessAnnotation.java @@ -0,0 +1,11 @@ +package com.fuyuanshen.common.ratelimiter.annotation;// DeviceRedisKeyAnnotation.java +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface FunctionAccessAnnotation { + String value() default ""; +} diff --git a/fys-common/fys-common-ratelimiter/src/main/java/com/fuyuanshen/common/ratelimiter/annotation/FunctionAccessBatcAnnotation.java b/fys-common/fys-common-ratelimiter/src/main/java/com/fuyuanshen/common/ratelimiter/annotation/FunctionAccessBatcAnnotation.java new file mode 100644 index 0000000..3f59cd9 --- /dev/null +++ b/fys-common/fys-common-ratelimiter/src/main/java/com/fuyuanshen/common/ratelimiter/annotation/FunctionAccessBatcAnnotation.java @@ -0,0 +1,11 @@ +package com.fuyuanshen.common.ratelimiter.annotation;// DeviceRedisKeyAnnotation.java +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface FunctionAccessBatcAnnotation { + String value() default ""; +} diff --git a/fys-common/fys-common-ratelimiter/src/main/java/com/fuyuanshen/common/ratelimiter/aspectj/FunctionAccessAspect.java b/fys-common/fys-common-ratelimiter/src/main/java/com/fuyuanshen/common/ratelimiter/aspectj/FunctionAccessAspect.java new file mode 100644 index 0000000..a46a17f --- /dev/null +++ b/fys-common/fys-common-ratelimiter/src/main/java/com/fuyuanshen/common/ratelimiter/aspectj/FunctionAccessAspect.java @@ -0,0 +1,103 @@ +package com.fuyuanshen.common.ratelimiter.aspectj;// DeviceRedisKeyAspect.java +import com.fuyuanshen.common.core.exception.ServiceException; +import com.fuyuanshen.common.core.utils.StringUtils; +import com.fuyuanshen.common.ratelimiter.annotation.FunctionAccessAnnotation; +import com.fuyuanshen.common.redis.utils.RedisUtils; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.springframework.stereotype.Component; + +import java.time.Duration; + +import static com.fuyuanshen.common.core.constant.GlobalConstants.FUNCTION_ACCESS_KEY; + +@Slf4j +@Aspect +@Component +public class FunctionAccessAspect { + + // 定义切点,拦截带有DeviceRedisKeyAnnotation注解的方法 + @Around("@annotation(functionAccessAnnotation)") + public Object addDeviceRedisKey(ProceedingJoinPoint joinPoint, FunctionAccessAnnotation functionAccessAnnotation) throws Throwable { + Object result; + String deviceImei = null; + + // 获取方法参数,查找设备ID + Object[] args = joinPoint.getArgs(); + deviceImei = extractDeviceImei(args); + + if (StringUtils.isNotBlank(deviceImei)) { + // 生成全局Redis key + String redisKey = generateDeviceRedisKey(deviceImei); + String cacheKey = RedisUtils.getCacheObject(redisKey); + if(StringUtils.isNotBlank(cacheKey) && "ACTIVE".equals(cacheKey)){ + throw new ServiceException("设备已存在访问限制,请稍后再试", 500); + } + // 存储到Redis中,设置过期时间 + RedisUtils.setCacheObject(redisKey, "ACTIVE", Duration.ofMinutes(30)); + log.info("设备Redis key已添加: {}", redisKey); + } + + // 执行原方法 + result = joinPoint.proceed(); + + return result; + } + + /** + * 从方法参数中提取设备ID + */ + private String extractDeviceImei(Object[] args) { + if (args == null || args.length == 0) { + return null; + } + + for (Object arg : args) { + if (arg == null) continue; + + // 如果参数本身就是设备ID (Long类型) + if (arg instanceof Long) { + return arg.toString(); + } + + // 如果参数是对象,尝试获取deviceId字段 + try { + // 使用反射获取deviceId字段 + java.lang.reflect.Field[] fields = arg.getClass().getDeclaredFields(); + for (java.lang.reflect.Field field : fields) { + if ("deviceImei".equalsIgnoreCase(field.getName()) || + "device_imei".equalsIgnoreCase(field.getName())) { + field.setAccessible(true); + Object value = field.get(arg); + if (value != null) { + return value.toString(); + } + } + } + + // 尝试获取getId方法 + try { + java.lang.reflect.Method getIdMethod = arg.getClass().getMethod("getDeviceImei"); + Object value = getIdMethod.invoke(arg); + if (value != null) { + return value.toString(); + } + } catch (Exception ignored) {} + + } catch (Exception e) { + log.debug("从参数中提取设备ID时出错: {}", e.getMessage()); + } + } + + return null; + } + + /** + * 生成设备的全局Redis key + */ + private String generateDeviceRedisKey(String deviceImei) { + return FUNCTION_ACCESS_KEY + deviceImei; + } +} diff --git a/fys-common/fys-common-ratelimiter/src/main/java/com/fuyuanshen/common/ratelimiter/aspectj/FunctionAccessBatchAspect.java b/fys-common/fys-common-ratelimiter/src/main/java/com/fuyuanshen/common/ratelimiter/aspectj/FunctionAccessBatchAspect.java new file mode 100644 index 0000000..0d6f79b --- /dev/null +++ b/fys-common/fys-common-ratelimiter/src/main/java/com/fuyuanshen/common/ratelimiter/aspectj/FunctionAccessBatchAspect.java @@ -0,0 +1,184 @@ +package com.fuyuanshen.common.ratelimiter.aspectj;// DeviceRedisKeyAspect.java +import cn.hutool.json.JSON; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.fuyuanshen.common.core.exception.ServiceException; +import com.fuyuanshen.common.core.utils.StringUtils; +import com.fuyuanshen.common.ratelimiter.annotation.FunctionAccessAnnotation; +import com.fuyuanshen.common.ratelimiter.annotation.FunctionAccessBatcAnnotation; +import com.fuyuanshen.common.redis.utils.RedisUtils; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.springframework.stereotype.Component; + +import java.time.Duration; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import static com.fuyuanshen.common.core.constant.GlobalConstants.FUNCTION_ACCESS_KEY; + +@Slf4j +@Aspect +@Component +public class FunctionAccessBatchAspect { + + // 定义切点,拦截带有DeviceRedisKeyAnnotation注解的方法 + @Around("@annotation(functionAccessBatchAspect)") + public Object addDeviceRedisKey(ProceedingJoinPoint joinPoint, FunctionAccessBatcAnnotation functionAccessBatchAspect) throws Throwable { + Object result; + String batchId = null; + List deviceImeiList = null; + + // 获取方法参数,查找设备ID + Object[] args = joinPoint.getArgs(); + batchId = extractDeviceBatchId(args); + deviceImeiList = extractDeviceImeiList(args); + if (StringUtils.isNotBlank(batchId)) { + // 生成全局Redis key + String redisKey = generateDeviceRedisKey(batchId); + String cacheKey = RedisUtils.getCacheObject(redisKey); + if(StringUtils.isNotBlank(cacheKey) && "ACTIVE".equals(cacheKey)){ + throw new ServiceException("设备已存在访问限制,请稍后再试", 500); + } + // 存储到Redis中,设置过期时间 + RedisUtils.setCacheObject(redisKey, JSONUtil.toJsonStr(deviceImeiList), Duration.ofMinutes(30)); + log.info("设备Redis key已添加: {}", redisKey); + } + + // 执行原方法 + result = joinPoint.proceed(); + + return result; + } + + /** + * 从方法参数中提取设备IMEI列表 + */ + private List extractDeviceImeiList(Object[] args) { + if (args == null || args.length == 0) { + return null; + } + + for (Object arg : args) { + if (arg == null) continue; + + // 如果参数本身就是List类型 + if (arg instanceof List) { + List list = (List) arg; + if (!list.isEmpty() && list.get(0) instanceof String) { + // 检查是否为deviceImeiList + return (List) list; + } + } + + // 如果参数是对象,尝试获取deviceImeiList字段 + try { + // 使用反射获取deviceImeiList字段 + java.lang.reflect.Field[] fields = arg.getClass().getDeclaredFields(); + for (java.lang.reflect.Field field : fields) { + if ("deviceImeiList".equalsIgnoreCase(field.getName()) || + "device_imei_list".equalsIgnoreCase(field.getName()) || + "deviceImeis".equalsIgnoreCase(field.getName()) || + "device_imeis".equalsIgnoreCase(field.getName())) { + field.setAccessible(true); + Object value = field.get(arg); + if (value instanceof List) { + List list = (List) value; + if (!list.isEmpty() && list.get(0) instanceof String) { + return (List) list; + } + } + } + } + + // 尝试获取getDeviceImeiList方法 + try { + java.lang.reflect.Method getDeviceImeiListMethod = arg.getClass().getMethod("getDeviceImeiList"); + Object value = getDeviceImeiListMethod.invoke(arg); + if (value instanceof List) { + List list = (List) value; + if (!list.isEmpty() && list.get(0) instanceof String) { + return (List) list; + } + } + } catch (Exception ignored) {} + + // 尝试获取getDeviceImeis方法 + try { + java.lang.reflect.Method getDeviceImeisMethod = arg.getClass().getMethod("getDeviceImeis"); + Object value = getDeviceImeisMethod.invoke(arg); + if (value instanceof List) { + List list = (List) value; + if (!list.isEmpty() && list.get(0) instanceof String) { + return (List) list; + } + } + } catch (Exception ignored) {} + + } catch (Exception e) { + log.debug("从参数中提取设备IMEI列表时出错: {}", e.getMessage()); + } + } + + return null; + } + + + /** + * 从方法参数中提取设备ID + */ + private String extractDeviceBatchId(Object[] args) { + if (args == null || args.length == 0) { + return null; + } + + for (Object arg : args) { + if (arg == null) continue; + + // 如果参数本身就是设备ID (Long类型) + if (arg instanceof Long) { + return arg.toString(); + } + + // 如果参数是对象,尝试获取deviceId字段 + try { + // 使用反射获取deviceId字段 + java.lang.reflect.Field[] fields = arg.getClass().getDeclaredFields(); + for (java.lang.reflect.Field field : fields) { + if ("batchId".equalsIgnoreCase(field.getName()) || + "batch_id".equalsIgnoreCase(field.getName())) { + field.setAccessible(true); + Object value = field.get(arg); + if (value != null) { + return value.toString(); + } + } + } + + // 尝试获取getId方法 + try { + java.lang.reflect.Method getIdMethod = arg.getClass().getMethod("batchId"); + Object value = getIdMethod.invoke(arg); + if (value != null) { + return value.toString(); + } + } catch (Exception ignored) {} + + } catch (Exception e) { + log.debug("从参数中提取批次号时出错: {}", e.getMessage()); + } + } + + return null; + } + + /** + * 生成设备的全局Redis key + */ + private String generateDeviceRedisKey(String batchId) { + return FUNCTION_ACCESS_KEY + batchId; + } +} diff --git a/fys-modules/fys-app/src/main/java/com/fuyuanshen/app/domain/bo/AppPersonnelInfoBo.java b/fys-modules/fys-app/src/main/java/com/fuyuanshen/app/domain/bo/AppPersonnelInfoBo.java index da469ac..70a7918 100644 --- a/fys-modules/fys-app/src/main/java/com/fuyuanshen/app/domain/bo/AppPersonnelInfoBo.java +++ b/fys-modules/fys-app/src/main/java/com/fuyuanshen/app/domain/bo/AppPersonnelInfoBo.java @@ -25,6 +25,11 @@ public class AppPersonnelInfoBo extends BaseEntity { */ private Long id; + /** + * 设备IMEI + */ + private String deviceImei; + /** * 设备id */ diff --git a/fys-modules/fys-app/src/main/resources/mapper/app/AppDeviceShareMapper.xml b/fys-modules/fys-app/src/main/resources/mapper/app/AppDeviceShareMapper.xml index 9b3b29c..b3b69d3 100644 --- a/fys-modules/fys-app/src/main/resources/mapper/app/AppDeviceShareMapper.xml +++ b/fys-modules/fys-app/src/main/resources/mapper/app/AppDeviceShareMapper.xml @@ -5,8 +5,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + SELECT * FROM device_group + WHERE parent_id IS NULL + + AND group_name LIKE CONCAT('%', #{bo.groupName}, '%') + + + AND status = #{bo.status} + + ORDER BY create_time DESC + + + + + From a189d0d0f91d5f438e19b0c73b91c0e65f8a8a1a Mon Sep 17 00:00:00 2001 From: chenyouting <514333061@qq.com> Date: Thu, 14 Aug 2025 15:07:58 +0800 Subject: [PATCH 14/28] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=91=8A=E8=AD=A6?= =?UTF-8?q?=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/controller/AppDeviceController.java | 4 +-- .../device/AppDeviceBJQController.java | 4 +-- .../device/AppDeviceHBYController.java | 4 +-- .../LightingCommandTypeConstants.java | 6 ++++ .../global/mqtt/rule/bjq/BjqAlarmRule.java | 32 +++++-------------- .../service/device/DeviceBJQBizService.java} | 20 +++++++++--- .../service/device/DeviceBizService.java} | 11 ++++--- .../status/FunctionAccessBatchStatusRule.java | 8 ++--- .../status/FunctionAccessStatusRule.java | 6 ++-- .../device/status/base/DeviceStatusRule.java | 2 +- .../status/base/RealTimeStatusEngine.java | 2 +- .../status/constants/DeviceTypeConstants.java | 2 +- .../service/impl/WEBDeviceServiceImpl.java | 4 +-- 13 files changed, 52 insertions(+), 53 deletions(-) rename fys-admin/src/main/java/com/fuyuanshen/{app/service/device/AppDeviceBJQBizService.java => web/service/device/DeviceBJQBizService.java} (95%) rename fys-admin/src/main/java/com/fuyuanshen/{app/service/AppDeviceBizService.java => web/service/device/DeviceBizService.java} (98%) rename fys-admin/src/main/java/com/fuyuanshen/{app => web}/service/device/status/FunctionAccessBatchStatusRule.java (90%) rename fys-admin/src/main/java/com/fuyuanshen/{app => web}/service/device/status/FunctionAccessStatusRule.java (91%) rename fys-admin/src/main/java/com/fuyuanshen/{app => web}/service/device/status/base/DeviceStatusRule.java (86%) rename fys-admin/src/main/java/com/fuyuanshen/{app => web}/service/device/status/base/RealTimeStatusEngine.java (90%) rename fys-admin/src/main/java/com/fuyuanshen/{app => web}/service/device/status/constants/DeviceTypeConstants.java (61%) diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/controller/AppDeviceController.java b/fys-admin/src/main/java/com/fuyuanshen/app/controller/AppDeviceController.java index d414cff..3a4bf25 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/app/controller/AppDeviceController.java +++ b/fys-admin/src/main/java/com/fuyuanshen/app/controller/AppDeviceController.java @@ -3,7 +3,6 @@ package com.fuyuanshen.app.controller; import com.fuyuanshen.app.domain.dto.APPReNameDTO; import com.fuyuanshen.app.domain.dto.AppRealTimeStatusDto; import com.fuyuanshen.app.domain.vo.APPDeviceTypeVo; -import com.fuyuanshen.app.service.AppDeviceBizService; import com.fuyuanshen.common.core.domain.R; import com.fuyuanshen.common.mybatis.core.page.PageQuery; import com.fuyuanshen.common.mybatis.core.page.TableDataInfo; @@ -12,6 +11,7 @@ import com.fuyuanshen.equipment.domain.Device; import com.fuyuanshen.equipment.domain.dto.AppDeviceBo; import com.fuyuanshen.equipment.domain.query.DeviceQueryCriteria; import com.fuyuanshen.equipment.domain.vo.AppDeviceVo; +import com.fuyuanshen.web.service.device.DeviceBizService; import lombok.RequiredArgsConstructor; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -28,7 +28,7 @@ import java.util.Map; @RequestMapping("/app/device") public class AppDeviceController extends BaseController { - private final AppDeviceBizService appDeviceService; + private final DeviceBizService appDeviceService; /** diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/controller/device/AppDeviceBJQController.java b/fys-admin/src/main/java/com/fuyuanshen/app/controller/device/AppDeviceBJQController.java index 7427f8e..8a26cdd 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/app/controller/device/AppDeviceBJQController.java +++ b/fys-admin/src/main/java/com/fuyuanshen/app/controller/device/AppDeviceBJQController.java @@ -4,13 +4,13 @@ import com.fuyuanshen.app.domain.bo.AppPersonnelInfoBo; import com.fuyuanshen.app.domain.dto.AppDeviceLogoUploadDto; import com.fuyuanshen.app.domain.dto.DeviceInstructDto; import com.fuyuanshen.app.domain.vo.AppDeviceDetailVo; -import com.fuyuanshen.app.service.device.AppDeviceBJQBizService; import com.fuyuanshen.common.core.domain.R; import com.fuyuanshen.common.core.validate.AddGroup; import com.fuyuanshen.common.ratelimiter.annotation.FunctionAccessAnnotation; import com.fuyuanshen.common.ratelimiter.annotation.FunctionAccessBatcAnnotation; import com.fuyuanshen.common.web.core.BaseController; import com.fuyuanshen.equipment.domain.dto.AppDeviceSendMsgBo; +import com.fuyuanshen.web.service.device.DeviceBJQBizService; import jakarta.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; import org.springframework.validation.annotation.Validated; @@ -26,7 +26,7 @@ import org.springframework.web.multipart.MultipartFile; @RequestMapping("/app/bjq/device") public class AppDeviceBJQController extends BaseController { - private final AppDeviceBJQBizService appDeviceService; + private final DeviceBJQBizService appDeviceService; /** * 获取设备详细信息 diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/controller/device/AppDeviceHBYController.java b/fys-admin/src/main/java/com/fuyuanshen/app/controller/device/AppDeviceHBYController.java index 93a2204..9cd3d40 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/app/controller/device/AppDeviceHBYController.java +++ b/fys-admin/src/main/java/com/fuyuanshen/app/controller/device/AppDeviceHBYController.java @@ -4,11 +4,11 @@ import com.fuyuanshen.app.domain.bo.AppPersonnelInfoBo; import com.fuyuanshen.app.domain.dto.AppDeviceLogoUploadDto; import com.fuyuanshen.app.domain.dto.DeviceInstructDto; import com.fuyuanshen.app.domain.vo.AppDeviceDetailVo; -import com.fuyuanshen.app.service.AppDeviceBizService; import com.fuyuanshen.common.core.domain.R; import com.fuyuanshen.common.core.validate.AddGroup; import com.fuyuanshen.common.web.core.BaseController; import com.fuyuanshen.equipment.domain.dto.AppDeviceSendMsgBo; +import com.fuyuanshen.web.service.device.DeviceBizService; import jakarta.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; import org.springframework.validation.annotation.Validated; @@ -24,7 +24,7 @@ import org.springframework.web.multipart.MultipartFile; @RequestMapping("/app/hby/device") public class AppDeviceHBYController extends BaseController { - private final AppDeviceBizService appDeviceService; + private final DeviceBizService appDeviceService; /** diff --git a/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/constants/LightingCommandTypeConstants.java b/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/constants/LightingCommandTypeConstants.java index c0f1ee7..de4e6b3 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/constants/LightingCommandTypeConstants.java +++ b/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/constants/LightingCommandTypeConstants.java @@ -35,6 +35,12 @@ public class LightingCommandTypeConstants { * 设备发送消息 */ public static final String SEND_MESSAGE = "Light_6"; + + + /** + * 报警模式 + */ + public static final String ALARM_MESSAGE = "Light_7"; /** * 定位数据 (Location Data) diff --git a/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/bjq/BjqAlarmRule.java b/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/bjq/BjqAlarmRule.java index 737070b..759f15b 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/bjq/BjqAlarmRule.java +++ b/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/bjq/BjqAlarmRule.java @@ -28,7 +28,7 @@ public class BjqAlarmRule implements MqttMessageRule { @Override public String getCommandType() { - return LightingCommandTypeConstants.LIGHT_MODE; + return LightingCommandTypeConstants.ALARM_MESSAGE; } @Override @@ -37,10 +37,13 @@ public class BjqAlarmRule implements MqttMessageRule { try { Object[] convertArr = context.getConvertArr(); - String mainLightMode = convertArr[1].toString(); - if(StringUtils.isNotBlank(mainLightMode)){ - // 发送设备状态和位置信息到Redis - syncSendDeviceDataToRedisWithFuture(context.getDeviceImei(),mainLightMode); + String convertValue = convertArr[1].toString(); + if(StringUtils.isNotBlank(convertValue)){ + // 将设备状态信息存储到Redis中 + String deviceRedisKey = GlobalConstants.GLOBAL_REDIS_KEY+DeviceRedisKeyConstants.DEVICE_KEY_PREFIX + context.getDeviceImei() + DEVICE_ALARM_KEY_PREFIX; + + // 存储到Redis + RedisUtils.setCacheObject(deviceRedisKey, convertValue); } RedisUtils.setCacheObject(functionAccess, FunctionAccessStatus.OK.getCode(), Duration.ofSeconds(20)); } catch (Exception e) { @@ -49,24 +52,5 @@ public class BjqAlarmRule implements MqttMessageRule { } } - /** - * 发送设备状态信息和位置信息到Redis(使用CompletableFuture) - * - * @param deviceImei 设备IMEI - */ - public void syncSendDeviceDataToRedisWithFuture(String deviceImei,Object convertValue) { - try { - // 将设备状态信息存储到Redis中 - String deviceRedisKey = GlobalConstants.GLOBAL_REDIS_KEY+DeviceRedisKeyConstants.DEVICE_KEY_PREFIX + deviceImei + DEVICE_ALARM_KEY_PREFIX; - - // 存储到Redis - RedisUtils.setCacheObject(deviceRedisKey, convertValue.toString()); - - } catch (Exception e) { - log.error("异步发送设备信息到Redis时出错: device={}, error={}", deviceImei, e.getMessage(), e); - } - } - - } diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/service/device/AppDeviceBJQBizService.java b/fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceBJQBizService.java similarity index 95% rename from fys-admin/src/main/java/com/fuyuanshen/app/service/device/AppDeviceBJQBizService.java rename to fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceBJQBizService.java index c74b558..888b1fe 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/app/service/device/AppDeviceBJQBizService.java +++ b/fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceBJQBizService.java @@ -1,4 +1,4 @@ -package com.fuyuanshen.app.service.device; +package com.fuyuanshen.web.service.device; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; @@ -14,7 +14,6 @@ import com.fuyuanshen.app.mapper.AppPersonnelInfoMapper; import com.fuyuanshen.common.core.constant.GlobalConstants; import com.fuyuanshen.common.core.exception.ServiceException; import com.fuyuanshen.common.core.utils.*; -import com.fuyuanshen.common.ratelimiter.annotation.FunctionAccessAnnotation; import com.fuyuanshen.common.redis.utils.RedisUtils; import com.fuyuanshen.common.satoken.utils.AppLoginHelper; import com.fuyuanshen.equipment.domain.Device; @@ -39,14 +38,13 @@ import static com.fuyuanshen.common.core.constant.GlobalConstants.GLOBAL_REDIS_K import static com.fuyuanshen.common.core.utils.Bitmap80x12Generator.buildArr; import static com.fuyuanshen.common.core.utils.Bitmap80x12Generator.generateFixedBitmapData; import static com.fuyuanshen.common.core.utils.ImageToCArrayConverter.convertHexToDecimal; -import static com.fuyuanshen.global.mqtt.constants.DeviceRedisKeyConstants.DEVICE_BOOT_LOGO_KEY_PREFIX; -import static com.fuyuanshen.global.mqtt.constants.DeviceRedisKeyConstants.DEVICE_KEY_PREFIX; +import static com.fuyuanshen.global.mqtt.constants.DeviceRedisKeyConstants.*; @Slf4j @Service @RequiredArgsConstructor -public class AppDeviceBJQBizService { +public class DeviceBJQBizService { private final DeviceMapper deviceMapper; private final AppPersonnelInfoMapper appPersonnelInfoMapper; @@ -97,6 +95,7 @@ public class AppDeviceBJQBizService { deviceMapper.update(updateWrapper); } catch (Exception e) { log.info("发送信息设备发送信息失败:{}" ,deviceId); + throw new ServiceException("发送指令失败"); } } @@ -161,6 +160,11 @@ public class AppDeviceBJQBizService { vo.setAddress((String)jsonObject.get("address")); } + String alarmStatus = RedisUtils.getCacheObject(GLOBAL_REDIS_KEY +DEVICE_KEY_PREFIX+ device.getDeviceImei()+ DEVICE_ALARM_KEY_PREFIX); + if(StringUtils.isNotBlank(alarmStatus)){ + vo.setAlarmStatus(alarmStatus); + } + return vo; } @@ -248,6 +252,7 @@ public class AppDeviceBJQBizService { log.info("发送点阵数据到设备消息=>topic:{},payload:{}", MqttConstants.GLOBAL_PUB_KEY+device.getDeviceImei(),JSON.toJSONString(map)); } catch (Exception e){ e.printStackTrace(); + throw new ServiceException("发送指令失败"); } } @@ -276,6 +281,7 @@ public class AppDeviceBJQBizService { log.info("发送点阵数据到设备消息=>topic:{},payload:{}", MqttConstants.GLOBAL_PUB_KEY+device.getDeviceImei(),JSON.toJSONString(map)); } catch (Exception e){ e.printStackTrace(); + throw new ServiceException("发送指令失败"); } } @@ -308,6 +314,7 @@ public class AppDeviceBJQBizService { log.info("发送点阵数据到设备消息=>topic:{},payload:{}", MqttConstants.GLOBAL_PUB_KEY+device.getDeviceImei(),JSON.toJSONString(map)); } catch (Exception e){ e.printStackTrace(); + throw new ServiceException("发送指令失败"); } } @@ -332,6 +339,7 @@ public class AppDeviceBJQBizService { log.info("发送点阵数据到设备消息=>topic:{},payload:{}", MqttConstants.GLOBAL_PUB_KEY+device.getDeviceImei(),JSON.toJSONString(map)); } catch (Exception e){ e.printStackTrace(); + throw new ServiceException("发送指令失败"); } } @@ -377,11 +385,13 @@ public class AppDeviceBJQBizService { deviceMapper.update(updateWrapper); } catch (Exception e) { log.info("设备发送信息失败:{}" ,deviceId); + throw new ServiceException("设备发送信息失败"); } } } catch (Exception e){ e.printStackTrace(); + throw new ServiceException("发送指令失败"); } return 1; } diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/service/AppDeviceBizService.java b/fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceBizService.java similarity index 98% rename from fys-admin/src/main/java/com/fuyuanshen/app/service/AppDeviceBizService.java rename to fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceBizService.java index b614aec..6dc6aea 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/app/service/AppDeviceBizService.java +++ b/fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceBizService.java @@ -1,4 +1,4 @@ -package com.fuyuanshen.app.service; +package com.fuyuanshen.web.service.device; import cn.hutool.core.collection.CollectionUtil; import com.alibaba.fastjson2.JSON; @@ -19,8 +19,6 @@ import com.fuyuanshen.app.domain.vo.AppPersonnelInfoVo; import com.fuyuanshen.app.mapper.AppDeviceBindRecordMapper; import com.fuyuanshen.app.mapper.AppPersonnelInfoMapper; import com.fuyuanshen.app.mapper.equipment.APPDeviceMapper; -import com.fuyuanshen.app.service.device.status.base.DeviceStatusRule; -import com.fuyuanshen.app.service.device.status.base.RealTimeStatusEngine; import com.fuyuanshen.common.core.constant.GlobalConstants; import com.fuyuanshen.common.core.exception.ServiceException; import com.fuyuanshen.common.core.utils.*; @@ -36,12 +34,15 @@ import com.fuyuanshen.equipment.domain.query.DeviceQueryCriteria; import com.fuyuanshen.equipment.domain.vo.AppDeviceVo; import com.fuyuanshen.equipment.enums.BindingStatusEnum; import com.fuyuanshen.equipment.enums.CommunicationModeEnum; +import com.fuyuanshen.equipment.mapper.DeviceLogMapper; import com.fuyuanshen.equipment.mapper.DeviceMapper; import com.fuyuanshen.equipment.mapper.DeviceTypeMapper; import com.fuyuanshen.equipment.service.DeviceService; import com.fuyuanshen.global.mqtt.config.MqttGateway; import com.fuyuanshen.global.mqtt.constants.DeviceRedisKeyConstants; import com.fuyuanshen.global.mqtt.constants.MqttConstants; +import com.fuyuanshen.web.service.device.status.base.DeviceStatusRule; +import com.fuyuanshen.web.service.device.status.base.RealTimeStatusEngine; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.core.io.ClassPathResource; @@ -63,7 +64,7 @@ import static com.fuyuanshen.global.mqtt.constants.DeviceRedisKeyConstants.*; @Slf4j @Service @RequiredArgsConstructor -public class AppDeviceBizService { +public class DeviceBizService { private final APPDeviceMapper appDeviceMapper; private final DeviceMapper deviceMapper; @@ -72,7 +73,7 @@ public class AppDeviceBizService { private final MqttGateway mqttGateway; private final AppDeviceBindRecordMapper appDeviceBindRecordMapper; private final RealTimeStatusEngine realTimeStatusEngine; - private final DeviceService deviceService; + private final DeviceLogMapper deviceLogMapper; diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/service/device/status/FunctionAccessBatchStatusRule.java b/fys-admin/src/main/java/com/fuyuanshen/web/service/device/status/FunctionAccessBatchStatusRule.java similarity index 90% rename from fys-admin/src/main/java/com/fuyuanshen/app/service/device/status/FunctionAccessBatchStatusRule.java rename to fys-admin/src/main/java/com/fuyuanshen/web/service/device/status/FunctionAccessBatchStatusRule.java index 8127fbb..116b5c9 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/app/service/device/status/FunctionAccessBatchStatusRule.java +++ b/fys-admin/src/main/java/com/fuyuanshen/web/service/device/status/FunctionAccessBatchStatusRule.java @@ -1,13 +1,12 @@ -package com.fuyuanshen.app.service.device.status; +package com.fuyuanshen.web.service.device.status; -import cn.hutool.json.JSONArray; import cn.hutool.json.JSONUtil; import com.fuyuanshen.app.domain.dto.AppRealTimeStatusDto; -import com.fuyuanshen.app.service.device.status.base.DeviceStatusRule; -import com.fuyuanshen.app.service.device.status.constants.DeviceTypeConstants; import com.fuyuanshen.common.core.utils.StringUtils; import com.fuyuanshen.common.redis.utils.RedisUtils; import com.fuyuanshen.global.mqtt.listener.domain.FunctionAccessStatus; +import com.fuyuanshen.web.service.device.status.base.DeviceStatusRule; +import com.fuyuanshen.web.service.device.status.constants.DeviceTypeConstants; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -16,7 +15,6 @@ import java.util.List; import java.util.Map; import static com.fuyuanshen.common.core.constant.GlobalConstants.FUNCTION_ACCESS_KEY; -import static com.fuyuanshen.common.core.constant.GlobalConstants.FUNCTION_ACCESS_TIMEOUT_KEY; @Slf4j diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/service/device/status/FunctionAccessStatusRule.java b/fys-admin/src/main/java/com/fuyuanshen/web/service/device/status/FunctionAccessStatusRule.java similarity index 91% rename from fys-admin/src/main/java/com/fuyuanshen/app/service/device/status/FunctionAccessStatusRule.java rename to fys-admin/src/main/java/com/fuyuanshen/web/service/device/status/FunctionAccessStatusRule.java index 8f12bcb..6b6f094 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/app/service/device/status/FunctionAccessStatusRule.java +++ b/fys-admin/src/main/java/com/fuyuanshen/web/service/device/status/FunctionAccessStatusRule.java @@ -1,11 +1,11 @@ -package com.fuyuanshen.app.service.device.status; +package com.fuyuanshen.web.service.device.status; import com.fuyuanshen.app.domain.dto.AppRealTimeStatusDto; -import com.fuyuanshen.app.service.device.status.base.DeviceStatusRule; -import com.fuyuanshen.app.service.device.status.constants.DeviceTypeConstants; import com.fuyuanshen.common.core.utils.StringUtils; import com.fuyuanshen.common.redis.utils.RedisUtils; import com.fuyuanshen.global.mqtt.listener.domain.FunctionAccessStatus; +import com.fuyuanshen.web.service.device.status.base.DeviceStatusRule; +import com.fuyuanshen.web.service.device.status.constants.DeviceTypeConstants; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/service/device/status/base/DeviceStatusRule.java b/fys-admin/src/main/java/com/fuyuanshen/web/service/device/status/base/DeviceStatusRule.java similarity index 86% rename from fys-admin/src/main/java/com/fuyuanshen/app/service/device/status/base/DeviceStatusRule.java rename to fys-admin/src/main/java/com/fuyuanshen/web/service/device/status/base/DeviceStatusRule.java index 9bc3235..57e1fd8 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/app/service/device/status/base/DeviceStatusRule.java +++ b/fys-admin/src/main/java/com/fuyuanshen/web/service/device/status/base/DeviceStatusRule.java @@ -1,4 +1,4 @@ -package com.fuyuanshen.app.service.device.status.base; +package com.fuyuanshen.web.service.device.status.base; import com.fuyuanshen.app.domain.dto.AppRealTimeStatusDto; diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/service/device/status/base/RealTimeStatusEngine.java b/fys-admin/src/main/java/com/fuyuanshen/web/service/device/status/base/RealTimeStatusEngine.java similarity index 90% rename from fys-admin/src/main/java/com/fuyuanshen/app/service/device/status/base/RealTimeStatusEngine.java rename to fys-admin/src/main/java/com/fuyuanshen/web/service/device/status/base/RealTimeStatusEngine.java index 4eae567..d374eb5 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/app/service/device/status/base/RealTimeStatusEngine.java +++ b/fys-admin/src/main/java/com/fuyuanshen/web/service/device/status/base/RealTimeStatusEngine.java @@ -1,4 +1,4 @@ -package com.fuyuanshen.app.service.device.status.base; +package com.fuyuanshen.web.service.device.status.base; import org.springframework.stereotype.Component; diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/service/device/status/constants/DeviceTypeConstants.java b/fys-admin/src/main/java/com/fuyuanshen/web/service/device/status/constants/DeviceTypeConstants.java similarity index 61% rename from fys-admin/src/main/java/com/fuyuanshen/app/service/device/status/constants/DeviceTypeConstants.java rename to fys-admin/src/main/java/com/fuyuanshen/web/service/device/status/constants/DeviceTypeConstants.java index 271f633..1e0f0cc 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/app/service/device/status/constants/DeviceTypeConstants.java +++ b/fys-admin/src/main/java/com/fuyuanshen/web/service/device/status/constants/DeviceTypeConstants.java @@ -1,4 +1,4 @@ -package com.fuyuanshen.app.service.device.status.constants; +package com.fuyuanshen.web.service.device.status.constants; public class DeviceTypeConstants { public static final String TYPE_BJQ6170 = "BJQ6170"; diff --git a/fys-admin/src/main/java/com/fuyuanshen/web/service/impl/WEBDeviceServiceImpl.java b/fys-admin/src/main/java/com/fuyuanshen/web/service/impl/WEBDeviceServiceImpl.java index 9f8e041..f38a2e8 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/web/service/impl/WEBDeviceServiceImpl.java +++ b/fys-admin/src/main/java/com/fuyuanshen/web/service/impl/WEBDeviceServiceImpl.java @@ -1,12 +1,12 @@ package com.fuyuanshen.web.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.fuyuanshen.app.service.AppDeviceBizService; import com.fuyuanshen.equipment.domain.Device; import com.fuyuanshen.equipment.domain.DeviceAssignments; import com.fuyuanshen.equipment.mapper.DeviceAssignmentsMapper; import com.fuyuanshen.equipment.mapper.DeviceMapper; import com.fuyuanshen.web.service.WEBDeviceService; +import com.fuyuanshen.web.service.device.DeviceBizService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -21,7 +21,7 @@ import org.springframework.stereotype.Service; @RequiredArgsConstructor public class WEBDeviceServiceImpl extends ServiceImpl implements WEBDeviceService { - private final AppDeviceBizService appDeviceService; + private final DeviceBizService appDeviceService; private final DeviceAssignmentsMapper deviceAssignmentsMapper; From 3145b494d949a4239088f28fda4fd8cef93920ae Mon Sep 17 00:00:00 2001 From: chenyouting <514333061@qq.com> Date: Thu, 14 Aug 2025 15:56:10 +0800 Subject: [PATCH 15/28] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=91=8A=E8=AD=A6?= =?UTF-8?q?=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=912?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/controller/device/AppDeviceBJQController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/controller/device/AppDeviceBJQController.java b/fys-admin/src/main/java/com/fuyuanshen/app/controller/device/AppDeviceBJQController.java index 8a26cdd..d6bf411 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/app/controller/device/AppDeviceBJQController.java +++ b/fys-admin/src/main/java/com/fuyuanshen/app/controller/device/AppDeviceBJQController.java @@ -98,7 +98,7 @@ public class AppDeviceBJQController extends BaseController { * 灯光亮度设置 * */ - @FunctionAccessAnnotation("lightBrightnessSettings") +// @FunctionAccessAnnotation("lightBrightnessSettings") @PostMapping("/lightBrightnessSettings") public R lightBrightnessSettings(@RequestBody DeviceInstructDto params) { appDeviceService.lightBrightnessSettings(params); From 51741adc69ad5cbc76652f5b1bc875394ab4ce11 Mon Sep 17 00:00:00 2001 From: chenyouting <514333061@qq.com> Date: Thu, 14 Aug 2025 16:25:14 +0800 Subject: [PATCH 16/28] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=91=8A=E8=AD=A6?= =?UTF-8?q?=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=913?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../device/AppDeviceHBYController.java | 112 ------ .../web/service/device/DeviceBizService.java | 365 +----------------- 2 files changed, 5 insertions(+), 472 deletions(-) delete mode 100644 fys-admin/src/main/java/com/fuyuanshen/app/controller/device/AppDeviceHBYController.java diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/controller/device/AppDeviceHBYController.java b/fys-admin/src/main/java/com/fuyuanshen/app/controller/device/AppDeviceHBYController.java deleted file mode 100644 index 9cd3d40..0000000 --- a/fys-admin/src/main/java/com/fuyuanshen/app/controller/device/AppDeviceHBYController.java +++ /dev/null @@ -1,112 +0,0 @@ -package com.fuyuanshen.app.controller.device; - -import com.fuyuanshen.app.domain.bo.AppPersonnelInfoBo; -import com.fuyuanshen.app.domain.dto.AppDeviceLogoUploadDto; -import com.fuyuanshen.app.domain.dto.DeviceInstructDto; -import com.fuyuanshen.app.domain.vo.AppDeviceDetailVo; -import com.fuyuanshen.common.core.domain.R; -import com.fuyuanshen.common.core.validate.AddGroup; -import com.fuyuanshen.common.web.core.BaseController; -import com.fuyuanshen.equipment.domain.dto.AppDeviceSendMsgBo; -import com.fuyuanshen.web.service.device.DeviceBizService; -import jakarta.validation.constraints.NotNull; -import lombok.RequiredArgsConstructor; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.multipart.MultipartFile; - -/** - * HBY210设备控制类 - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/app/hby/device") -public class AppDeviceHBYController extends BaseController { - - private final DeviceBizService appDeviceService; - - - /** - * 获取设备详细信息 - * - * @param id 主键 - */ - @GetMapping("/{id}") - public R getInfo(@NotNull(message = "主键不能为空") - @PathVariable Long id) { - return R.ok(appDeviceService.getInfo(id)); - } - - /** - * 人员信息登记 - */ - @PostMapping(value = "/registerPersonInfo") - public R registerPersonInfo(@Validated(AddGroup.class) @RequestBody AppPersonnelInfoBo bo) { - return toAjax(appDeviceService.registerPersonInfo(bo)); - } - - /** - * 发送信息 - */ - @PostMapping(value = "/sendMessage") - public R sendMessage(@RequestBody AppDeviceSendMsgBo bo) { - return toAjax(appDeviceService.sendMessage(bo)); - } - - /** - * 上传设备logo图片 - */ - @PostMapping("/uploadLogo") - public R upload(@Validated @ModelAttribute AppDeviceLogoUploadDto bo) { - - MultipartFile file = bo.getFile(); - if(file.getSize()>1024*1024*2){ - return R.warn("图片不能大于2M"); - } - appDeviceService.uploadDeviceLogo(bo); - - return R.ok(); - } - - /** - * 灯光模式 - * 0(关灯),1(强光模式),2(弱光模式), 3(爆闪模式), 4(泛光模式) - */ - @PostMapping("/lightModeSettings") - public R lightModeSettings(@RequestBody DeviceInstructDto params) { - // params 转 JSONObject - appDeviceService.lightModeSettings(params); - return R.ok(); - } - - /** - * 灯光亮度设置 - * - */ - @PostMapping("/lightBrightnessSettings") - public R lightBrightnessSettings(@RequestBody DeviceInstructDto params) { - appDeviceService.lightBrightnessSettings(params); - return R.ok(); - } - - /** - * 激光模式设置 - * - */ - @PostMapping("/laserModeSettings") - public R laserModeSettings(@RequestBody DeviceInstructDto params) { - appDeviceService.laserModeSettings(params); - return R.ok(); - } - - /** - * 地图逆解析 - * - */ - @PostMapping("/mapReverseGeocoding") - public R mapReverseGeocoding(@RequestBody DeviceInstructDto params) { - String mapJson = appDeviceService.mapReverseGeocoding(params); - return R.ok(mapJson); - } -} diff --git a/fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceBizService.java b/fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceBizService.java index 6dc6aea..82a4964 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceBizService.java +++ b/fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceBizService.java @@ -1,35 +1,27 @@ package com.fuyuanshen.web.service.device; import cn.hutool.core.collection.CollectionUtil; -import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fuyuanshen.app.domain.AppDeviceBindRecord; -import com.fuyuanshen.app.domain.AppPersonnelInfo; -import com.fuyuanshen.app.domain.bo.AppPersonnelInfoBo; import com.fuyuanshen.app.domain.dto.APPReNameDTO; -import com.fuyuanshen.app.domain.dto.AppDeviceLogoUploadDto; import com.fuyuanshen.app.domain.dto.AppRealTimeStatusDto; import com.fuyuanshen.app.domain.dto.DeviceInstructDto; import com.fuyuanshen.app.domain.vo.APPDeviceTypeVo; -import com.fuyuanshen.app.domain.vo.AppDeviceDetailVo; -import com.fuyuanshen.app.domain.vo.AppPersonnelInfoVo; import com.fuyuanshen.app.mapper.AppDeviceBindRecordMapper; import com.fuyuanshen.app.mapper.AppPersonnelInfoMapper; import com.fuyuanshen.app.mapper.equipment.APPDeviceMapper; -import com.fuyuanshen.common.core.constant.GlobalConstants; import com.fuyuanshen.common.core.exception.ServiceException; -import com.fuyuanshen.common.core.utils.*; +import com.fuyuanshen.common.core.utils.ObjectUtils; +import com.fuyuanshen.common.core.utils.StringUtils; import com.fuyuanshen.common.mybatis.core.page.PageQuery; import com.fuyuanshen.common.mybatis.core.page.TableDataInfo; import com.fuyuanshen.common.redis.utils.RedisUtils; import com.fuyuanshen.common.satoken.utils.AppLoginHelper; import com.fuyuanshen.equipment.domain.Device; -import com.fuyuanshen.equipment.domain.DeviceType; import com.fuyuanshen.equipment.domain.dto.AppDeviceBo; -import com.fuyuanshen.equipment.domain.dto.AppDeviceSendMsgBo; import com.fuyuanshen.equipment.domain.query.DeviceQueryCriteria; import com.fuyuanshen.equipment.domain.vo.AppDeviceVo; import com.fuyuanshen.equipment.enums.BindingStatusEnum; @@ -37,27 +29,19 @@ import com.fuyuanshen.equipment.enums.CommunicationModeEnum; import com.fuyuanshen.equipment.mapper.DeviceLogMapper; import com.fuyuanshen.equipment.mapper.DeviceMapper; import com.fuyuanshen.equipment.mapper.DeviceTypeMapper; -import com.fuyuanshen.equipment.service.DeviceService; import com.fuyuanshen.global.mqtt.config.MqttGateway; import com.fuyuanshen.global.mqtt.constants.DeviceRedisKeyConstants; -import com.fuyuanshen.global.mqtt.constants.MqttConstants; import com.fuyuanshen.web.service.device.status.base.DeviceStatusRule; import com.fuyuanshen.web.service.device.status.base.RealTimeStatusEngine; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.core.io.ClassPathResource; import org.springframework.stereotype.Service; -import org.springframework.web.multipart.MultipartFile; -import java.io.IOException; -import java.io.InputStream; -import java.time.Duration; -import java.util.*; +import java.util.Date; +import java.util.List; +import java.util.Map; import static com.fuyuanshen.common.core.constant.GlobalConstants.GLOBAL_REDIS_KEY; -import static com.fuyuanshen.common.core.utils.Bitmap80x12Generator.buildArr; -import static com.fuyuanshen.common.core.utils.Bitmap80x12Generator.generateFixedBitmapData; -import static com.fuyuanshen.common.core.utils.ImageToCArrayConverter.convertHexToDecimal; import static com.fuyuanshen.global.mqtt.constants.DeviceRedisKeyConstants.*; @@ -68,9 +52,6 @@ public class DeviceBizService { private final APPDeviceMapper appDeviceMapper; private final DeviceMapper deviceMapper; - private final AppPersonnelInfoMapper appPersonnelInfoMapper; - private final DeviceTypeMapper deviceTypeMapper; - private final MqttGateway mqttGateway; private final AppDeviceBindRecordMapper appDeviceBindRecordMapper; private final RealTimeStatusEngine realTimeStatusEngine; private final DeviceLogMapper deviceLogMapper; @@ -91,60 +72,6 @@ public class DeviceBizService { } - public int sendMessage(AppDeviceSendMsgBo bo) { - List deviceIds = bo.getDeviceIds(); - if (deviceIds == null || deviceIds.isEmpty()) { - throw new ServiceException("请选择设备"); - } - for (Long deviceId : deviceIds) { - Device device = deviceMapper.selectById(deviceId); - if (device == null) { - throw new ServiceException("设备不存在" + deviceId); - } - - try { - ClassPathResource resource = new ClassPathResource("image/background.png"); - InputStream inputStream = resource.getInputStream(); - -// String backgroundImagePath = "D:\\background.png"; // 替换为实际背景图片路径 - byte[] largeData = ImageWithTextGenerate.generate160x80ImageWithText2(bo.getSendMsg(), inputStream, 25600); - int[] ints = convertHexToDecimal(largeData); - RedisUtils.setCacheObject(GLOBAL_REDIS_KEY+ DEVICE_KEY_PREFIX + device.getDeviceImei() + DEVICE_SEND_MESSAGE_KEY_PREFIX , Arrays.toString(ints), Duration.ofSeconds(30 * 60L)); - - String data = RedisUtils.getCacheObject(GLOBAL_REDIS_KEY+ DEVICE_KEY_PREFIX + device.getDeviceImei() + DEVICE_SEND_MESSAGE_KEY_PREFIX); - - byte[] arr = ImageToCArrayConverter.convertStringToByteArray(data); - byte[] specificChunk = ImageToCArrayConverter.getChunk(arr, 0, 512); - log.info("发送信息第0块数据大小: {} 字节",specificChunk.length); -// log.info("第0块数据: {}", Arrays.toString(specificChunk)); - - ArrayList intData = new ArrayList<>(); - intData.add(6); - intData.add(1); - ImageToCArrayConverter.buildArr(convertHexToDecimal(specificChunk),intData); - intData.add(0); - intData.add(0); - intData.add(0); - intData.add(0); - Map map = new HashMap<>(); - map.put("instruct", intData); - mqttGateway.sendMsgToMqtt(MqttConstants.GLOBAL_PUB_KEY+device.getDeviceImei(), 1 , JSON.toJSONString(map)); - log.info("发送信息点阵数据到设备消息=>topic:{},payload:{}", MqttConstants.GLOBAL_PUB_KEY+device.getDeviceImei(),JSON.toJSONString(map)); - - UpdateWrapper updateWrapper = new UpdateWrapper<>(); - updateWrapper.eq("id", deviceId) - .eq("binding_user_id", AppLoginHelper.getUserId()) - .set("send_msg", bo.getSendMsg()); - deviceMapper.update(updateWrapper); - } catch (Exception e) { - log.info("发送信息设备发送信息失败:{}" ,deviceId); - } - - } - return 1; - } - - public TableDataInfo queryAppDeviceList(DeviceQueryCriteria bo, PageQuery pageQuery) { if (bo.getBindingUserId() == null) { Long userId = AppLoginHelper.getUserId(); @@ -316,247 +243,6 @@ public class DeviceBizService { return 1; } - - public AppDeviceDetailVo getInfo(Long id) { - Device device = deviceMapper.selectById(id); - if (device == null) { - throw new RuntimeException("请先将设备入库!!!"); - } - AppDeviceDetailVo vo = new AppDeviceDetailVo(); - vo.setDeviceId(device.getId()); - vo.setDeviceName(device.getDeviceName()); - vo.setDevicePic(device.getDevicePic()); - vo.setDeviceImei(device.getDeviceImei()); - vo.setDeviceMac(device.getDeviceMac()); - vo.setDeviceStatus(device.getDeviceStatus()); - DeviceType deviceType = deviceTypeMapper.selectById(device.getDeviceType()); - if (deviceType != null) { - vo.setCommunicationMode(Integer.valueOf(deviceType.getCommunicationMode())); - vo.setTypeName(deviceType.getTypeName()); - } - vo.setBluetoothName(device.getBluetoothName()); - - vo.setSendMsg(device.getSendMsg()); - - QueryWrapper qw = new QueryWrapper() - .eq("device_id", device.getId()); - AppPersonnelInfo appPersonnelInfo = appPersonnelInfoMapper.selectOne(qw); - if (appPersonnelInfo != null) { - AppPersonnelInfoVo personnelInfoVo = MapstructUtils.convert(appPersonnelInfo, AppPersonnelInfoVo.class); - vo.setPersonnelInfo(personnelInfoVo); - } - //设备在线状态 - String onlineStatus = RedisUtils.getCacheObject(GLOBAL_REDIS_KEY+ DEVICE_KEY_PREFIX + device.getDeviceImei() + DeviceRedisKeyConstants.DEVICE_ONLINE_STATUS_KEY_PREFIX); - if(StringUtils.isNotBlank(onlineStatus)){ - vo.setOnlineStatus(1); - }else{ - vo.setOnlineStatus(0); - } - String deviceStatus = RedisUtils.getCacheObject(GLOBAL_REDIS_KEY+ DEVICE_KEY_PREFIX + device.getDeviceImei() + DeviceRedisKeyConstants.DEVICE_ONLINE_STATUS_KEY_PREFIX); - // 获取电量 - if(StringUtils.isNotBlank(deviceStatus)){ - JSONObject jsonObject = JSONObject.parseObject(deviceStatus); - vo.setMainLightMode(jsonObject.getString("mainLightMode")); - vo.setLaserLightMode(jsonObject.getString("laserLightMode")); - vo.setBatteryPercentage(jsonObject.getString("batteryPercentage")); - vo.setChargeState(jsonObject.getString("chargeState")); - vo.setBatteryRemainingTime(jsonObject.getString("batteryRemainingTime")); - }else{ - vo.setBatteryPercentage("0"); - } - - // 获取经度纬度 - String locationKey = GlobalConstants.GLOBAL_REDIS_KEY+ DEVICE_KEY_PREFIX + device.getDeviceImei() + DEVICE_LOCATION_KEY_PREFIX; - String locationInfo = RedisUtils.getCacheObject(locationKey); - if(StringUtils.isNotBlank(locationInfo)){ - JSONObject jsonObject = JSONObject.parseObject(locationInfo); - vo.setLongitude(jsonObject.get("longitude").toString()); - vo.setLatitude(jsonObject.get("latitude").toString()); - vo.setAddress((String)jsonObject.get("address")); - } - - return vo; - } - - - public boolean registerPersonInfo(AppPersonnelInfoBo bo) { - Long deviceId = bo.getDeviceId(); - Device deviceObj = deviceMapper.selectById(deviceId); - if (deviceObj == null) { - throw new RuntimeException("请先将设备入库!!!"); - } - QueryWrapper qw = new QueryWrapper() - .eq("device_id", deviceId); - List appPersonnelInfoVos = appPersonnelInfoMapper.selectVoList(qw); -// unitName,position,name,id - byte[] unitName = generateFixedBitmapData(bo.getUnitName(), 120); - byte[] position = generateFixedBitmapData(bo.getPosition(), 120); - byte[] name = generateFixedBitmapData(bo.getName(), 120); - byte[] id = generateFixedBitmapData(bo.getCode(), 120); - ArrayList intData = new ArrayList<>(); - intData.add(2); - buildArr(convertHexToDecimal(unitName), intData); - buildArr(convertHexToDecimal(position), intData); - buildArr(convertHexToDecimal(name), intData); - buildArr(convertHexToDecimal(id), intData); - intData.add(0); - intData.add(0); - intData.add(0); - intData.add(0); - Map map = new HashMap<>(); - map.put("instruct", intData); - mqttGateway.sendMsgToMqtt(MqttConstants.GLOBAL_PUB_KEY + deviceObj.getDeviceImei(), 1, JSON.toJSONString(map)); - log.info("发送点阵数据到设备消息=>topic:{},payload:{}", MqttConstants.GLOBAL_PUB_KEY + deviceObj.getDeviceImei(), bo); - - if (ObjectUtils.length(appPersonnelInfoVos) == 0) { - AppPersonnelInfo appPersonnelInfo = MapstructUtils.convert(bo, AppPersonnelInfo.class); - return appPersonnelInfoMapper.insertOrUpdate(appPersonnelInfo); - } else { - UpdateWrapper uw = new UpdateWrapper<>(); - uw.eq("device_id", deviceId) - .set("name", bo.getName()) - .set("position", bo.getPosition()) - .set("unit_name", bo.getUnitName()) - .set("code", bo.getCode()); - return appPersonnelInfoMapper.update(null, uw) > 0; - } - - - } - - public static void main(String[] args) throws IOException { - byte[] largeData = ImageToCArrayConverter.convertImageToCArray("E:\\workspace\\demo.png", 160, 80, 25600); - System.out.println("长度:" + largeData.length); - - System.out.println("原始数据大小: " + largeData.length + " 字节"); - - int[] ints = convertHexToDecimal(largeData); - System.out.println("转换后的数据: " + Arrays.toString(ints)); - } - - public void uploadDeviceLogo(AppDeviceLogoUploadDto bo) { - try { - Device device = deviceMapper.selectById(bo.getDeviceId()); - if (device == null) { - throw new ServiceException("设备不存在"); - } - MultipartFile file = bo.getFile(); - - byte[] largeData = ImageToCArrayConverter.convertImageToCArray(file.getInputStream(), 160, 80, 25600); - log.info("长度:" + largeData.length); - - log.info("原始数据大小: {} 字节", largeData.length); - - int[] ints = convertHexToDecimal(largeData); - RedisUtils.setCacheObject(GLOBAL_REDIS_KEY+ DEVICE_KEY_PREFIX + device.getDeviceImei() + DEVICE_BOOT_LOGO_KEY_PREFIX, Arrays.toString(ints), Duration.ofSeconds(30 * 60L)); - - String data = RedisUtils.getCacheObject(GLOBAL_REDIS_KEY+ DEVICE_KEY_PREFIX + device.getDeviceImei() + DEVICE_BOOT_LOGO_KEY_PREFIX); - - byte[] arr = ImageToCArrayConverter.convertStringToByteArray(data); - byte[] specificChunk = ImageToCArrayConverter.getChunk(arr, 0, 512); - log.info("第0块数据大小: {} 字节", specificChunk.length); -// log.info("第0块数据: {}", Arrays.toString(specificChunk)); - - ArrayList intData = new ArrayList<>(); - intData.add(3); - intData.add(1); - ImageToCArrayConverter.buildArr(convertHexToDecimal(specificChunk),intData); - intData.add(0); - intData.add(0); - intData.add(0); - intData.add(0); - Map map = new HashMap<>(); - map.put("instruct", intData); - mqttGateway.sendMsgToMqtt(MqttConstants.GLOBAL_PUB_KEY+device.getDeviceImei(), 1 , JSON.toJSONString(map)); - log.info("发送点阵数据到设备消息=>topic:{},payload:{}", MqttConstants.GLOBAL_PUB_KEY+device.getDeviceImei(),JSON.toJSONString(map)); - } catch (Exception e){ - e.printStackTrace(); - } - } - - /** - * 灯光模式 - * 0(关灯),1(强光模式),2(弱光模式), 3(爆闪模式), 4(泛光模式) - */ - public void lightModeSettings(DeviceInstructDto params) { - try { - Long deviceId = params.getDeviceId(); - Device device = deviceMapper.selectById(deviceId); - if(device == null){ - throw new ServiceException("设备不存在"); - } - Integer instructValue = Integer.parseInt(params.getInstructValue()); - ArrayList intData = new ArrayList<>(); - intData.add(1); - intData.add(instructValue); - intData.add(0); - intData.add(0); - intData.add(0); - Map map = new HashMap<>(); - map.put("instruct", intData); - mqttGateway.sendMsgToMqtt(MqttConstants.GLOBAL_PUB_KEY+device.getDeviceImei(), 1 , JSON.toJSONString(map)); - log.info("发送点阵数据到设备消息=>topic:{},payload:{}", MqttConstants.GLOBAL_PUB_KEY+device.getDeviceImei(),JSON.toJSONString(map)); - } catch (Exception e){ - e.printStackTrace(); - } - } - - //灯光亮度设置 - public void lightBrightnessSettings(DeviceInstructDto params) { - try { - Long deviceId = params.getDeviceId(); - Device device = deviceMapper.selectById(deviceId); - if(device == null){ - throw new ServiceException("设备不存在"); - } - String instructValue = params.getInstructValue(); - ArrayList intData = new ArrayList<>(); - intData.add(5); - String[] values = instructValue.split("\\."); - String value1 = values[0]; - String value2 = values[1]; - if(StringUtils.isNoneBlank(value1)){ - intData.add(Integer.parseInt(value1)); - } - if(StringUtils.isNoneBlank(value2)){ - intData.add(Integer.parseInt(value2)); - } - intData.add(0); - intData.add(0); - intData.add(0); - Map map = new HashMap<>(); - map.put("instruct", intData); - mqttGateway.sendMsgToMqtt(MqttConstants.GLOBAL_PUB_KEY+device.getDeviceImei(), 1 , JSON.toJSONString(map)); - log.info("发送点阵数据到设备消息=>topic:{},payload:{}", MqttConstants.GLOBAL_PUB_KEY+device.getDeviceImei(),JSON.toJSONString(map)); - } catch (Exception e){ - e.printStackTrace(); - } - } - - //激光模式设置 - public void laserModeSettings(DeviceInstructDto params) { - try { - Long deviceId = params.getDeviceId(); - Device device = deviceMapper.selectById(deviceId); - if(device == null){ - throw new ServiceException("设备不存在"); - } - Integer instructValue = Integer.parseInt(params.getInstructValue()); - ArrayList intData = new ArrayList<>(); - intData.add(4); - intData.add(instructValue); - intData.add(0); - intData.add(0); - intData.add(0); - Map map = new HashMap<>(); - map.put("instruct", intData); - mqttGateway.sendMsgToMqtt(MqttConstants.GLOBAL_PUB_KEY+device.getDeviceImei(), 1 , JSON.toJSONString(map)); - log.info("发送点阵数据到设备消息=>topic:{},payload:{}", MqttConstants.GLOBAL_PUB_KEY+device.getDeviceImei(),JSON.toJSONString(map)); - } catch (Exception e){ - e.printStackTrace(); - } - } - public String mapReverseGeocoding(DeviceInstructDto params) { // Long deviceId = params.getDeviceId(); // Device device = deviceMapper.selectById(deviceId); @@ -569,47 +255,6 @@ public class DeviceBizService { return RedisUtils.getCacheObject("device:location:" + devices.get(0).getDeviceImei()); } - public int sendAlarmMessage(AppDeviceSendMsgBo bo) { - try { - List deviceIds = bo.getDeviceIds(); - if (deviceIds == null || deviceIds.isEmpty()) { - throw new ServiceException("请选择设备"); - } - for (Long deviceId : deviceIds) { - Device device = deviceMapper.selectById(deviceId); - if (device == null) { - throw new ServiceException("设备不存在" + deviceId); - } - - try { - ArrayList intData = new ArrayList<>(); - intData.add(7); - intData.add(Integer.parseInt(bo.getInstructValue())); - intData.add(0); - intData.add(0); - intData.add(0); - intData.add(0); - Map map = new HashMap<>(); - map.put("instruct", intData); - mqttGateway.sendMsgToMqtt(MqttConstants.GLOBAL_PUB_KEY+device.getDeviceImei(), 1 , JSON.toJSONString(map)); - log.info("发送点阵数据到设备消息=>topic:{},payload:{}", MqttConstants.GLOBAL_PUB_KEY+device.getDeviceImei(),JSON.toJSONString(map)); - - UpdateWrapper updateWrapper = new UpdateWrapper<>(); - updateWrapper.eq("id", deviceId) - .eq("binding_user_id", AppLoginHelper.getUserId()) - .set("send_msg", bo.getSendMsg()); - deviceMapper.update(updateWrapper); - } catch (Exception e) { - log.info("设备发送信息失败:{}" ,deviceId); - } - - } - } catch (Exception e){ - e.printStackTrace(); - } - return 1; - } - public Map getRealTimeStatus(AppRealTimeStatusDto statusDto) { try { String commandType = statusDto.getTypeName()+"_" + statusDto.getFunctionMode(); From 9e24e3daafd149a64e50bae6ec84951ec7d50e2b Mon Sep 17 00:00:00 2001 From: chenyouting <514333061@qq.com> Date: Thu, 14 Aug 2025 17:38:07 +0800 Subject: [PATCH 17/28] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=91=8A=E8=AD=A6?= =?UTF-8?q?=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=914?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mqtt/rule/bjq/BjqLightBrightnessRule.java | 51 +++++++++++++++++++ .../service/device/DeviceBJQBizService.java | 5 ++ .../app/domain/vo/AppDeviceDetailVo.java | 3 ++ 3 files changed, 59 insertions(+) create mode 100644 fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/bjq/BjqLightBrightnessRule.java diff --git a/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/bjq/BjqLightBrightnessRule.java b/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/bjq/BjqLightBrightnessRule.java new file mode 100644 index 0000000..0fc6dd8 --- /dev/null +++ b/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/bjq/BjqLightBrightnessRule.java @@ -0,0 +1,51 @@ +package com.fuyuanshen.global.mqtt.rule.bjq; + +import com.fuyuanshen.common.core.constant.GlobalConstants; +import com.fuyuanshen.common.core.utils.StringUtils; +import com.fuyuanshen.common.redis.utils.RedisUtils; +import com.fuyuanshen.global.mqtt.base.MqttMessageRule; +import com.fuyuanshen.global.mqtt.base.MqttRuleContext; +import com.fuyuanshen.global.mqtt.constants.DeviceRedisKeyConstants; +import com.fuyuanshen.global.mqtt.constants.LightingCommandTypeConstants; +import com.fuyuanshen.global.mqtt.listener.domain.FunctionAccessStatus; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.time.Duration; + +import static com.fuyuanshen.common.core.constant.GlobalConstants.FUNCTION_ACCESS_KEY; +import static com.fuyuanshen.global.mqtt.constants.DeviceRedisKeyConstants.*; + +/** + * 灯光模式订阅设备回传消息 + */ +@Component +@RequiredArgsConstructor +@Slf4j +public class BjqLightBrightnessRule implements MqttMessageRule { + + @Override + public String getCommandType() { + return LightingCommandTypeConstants.MAIN_LIGHT_BRIGHTNESS; + } + + @Override + public void execute(MqttRuleContext context) { + String functionAccess = FUNCTION_ACCESS_KEY + context.getDeviceImei(); + try { + Object[] convertArr = context.getConvertArr(); + + String convertValue = convertArr[1].toString(); + // 将设备状态信息存储到Redis中 + String deviceRedisKey = GlobalConstants.GLOBAL_REDIS_KEY+DeviceRedisKeyConstants.DEVICE_KEY_PREFIX + context.getDeviceImei() + DEVICE_LIGHT_BRIGHTNESS_KEY_PREFIX; + + // 存储到Redis + RedisUtils.setCacheObject(deviceRedisKey, convertValue); + RedisUtils.setCacheObject(functionAccess, FunctionAccessStatus.OK.getCode(), Duration.ofSeconds(20)); + } catch (Exception e) { + log.error("处理灯光亮度命令时出错", e); + RedisUtils.setCacheObject(functionAccess, FunctionAccessStatus.FAILED.getCode(), Duration.ofSeconds(20)); + } + } +} diff --git a/fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceBJQBizService.java b/fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceBJQBizService.java index 888b1fe..671fe8e 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceBJQBizService.java +++ b/fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceBJQBizService.java @@ -165,6 +165,11 @@ public class DeviceBJQBizService { vo.setAlarmStatus(alarmStatus); } + String lightBrightness = RedisUtils.getCacheObject(GLOBAL_REDIS_KEY +DEVICE_KEY_PREFIX+ device.getDeviceImei()+ DEVICE_LIGHT_BRIGHTNESS_KEY_PREFIX); + if(StringUtils.isNotBlank(lightBrightness)){ + vo.setLightBrightness(lightBrightness); + } + return vo; } diff --git a/fys-modules/fys-app/src/main/java/com/fuyuanshen/app/domain/vo/AppDeviceDetailVo.java b/fys-modules/fys-app/src/main/java/com/fuyuanshen/app/domain/vo/AppDeviceDetailVo.java index 230a2c4..c172809 100644 --- a/fys-modules/fys-app/src/main/java/com/fuyuanshen/app/domain/vo/AppDeviceDetailVo.java +++ b/fys-modules/fys-app/src/main/java/com/fuyuanshen/app/domain/vo/AppDeviceDetailVo.java @@ -104,4 +104,7 @@ public class AppDeviceDetailVo { * 告警状态(0解除告警,1告警) */ private String alarmStatus; + + // 灯光亮度 + private String lightBrightness; } From f1a3a0325bfb0ce2141503007be2204b5af87413 Mon Sep 17 00:00:00 2001 From: chenyouting <514333061@qq.com> Date: Thu, 14 Aug 2025 18:28:55 +0800 Subject: [PATCH 18/28] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=91=8A=E8=AD=A6?= =?UTF-8?q?=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=916?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fuyuanshen/app/domain/vo/AppDeviceShareVo.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/fys-modules/fys-app/src/main/java/com/fuyuanshen/app/domain/vo/AppDeviceShareVo.java b/fys-modules/fys-app/src/main/java/com/fuyuanshen/app/domain/vo/AppDeviceShareVo.java index e5aef58..224ca8c 100644 --- a/fys-modules/fys-app/src/main/java/com/fuyuanshen/app/domain/vo/AppDeviceShareVo.java +++ b/fys-modules/fys-app/src/main/java/com/fuyuanshen/app/domain/vo/AppDeviceShareVo.java @@ -71,6 +71,11 @@ public class AppDeviceShareVo implements Serializable { @ExcelDictFormat(readConverterExp = "1=:灯光模式;2:激光模式;3:开机画面;4:人员信息登记;5:发送信息;6:产品信息") private String permission; + /** + * 设备类型 + */ + private String typeName; + /** * 备注 */ From 48e972166fe9ad0e8512f52ba2aa5e699957c208 Mon Sep 17 00:00:00 2001 From: daiyongfei <974332738@qq.com> Date: Thu, 14 Aug 2025 18:55:53 +0800 Subject: [PATCH 19/28] =?UTF-8?q?=E5=9E=8B=E5=8F=B7=E5=AD=97=E5=85=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fuyuanshen/equipment/domain/DeviceType.java | 7 +++++++ .../equipment/domain/form/DeviceTypeForm.java | 13 ++++++------- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/domain/DeviceType.java b/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/domain/DeviceType.java index 76e554e..4ed8380 100644 --- a/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/domain/DeviceType.java +++ b/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/domain/DeviceType.java @@ -65,4 +65,11 @@ public class DeviceType extends TenantEntity { BeanUtil.copyProperties(source, this, CopyOptions.create().setIgnoreNullValue(true)); } + /** + * 型号字典用于APP页面跳转 + */ + @Schema(name = "型号字典用于APP页面跳转") + private Integer modelDictionary; + + } diff --git a/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/domain/form/DeviceTypeForm.java b/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/domain/form/DeviceTypeForm.java index d416718..5a8617a 100644 --- a/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/domain/form/DeviceTypeForm.java +++ b/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/domain/form/DeviceTypeForm.java @@ -1,13 +1,6 @@ package com.fuyuanshen.equipment.domain.form; -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.bean.copier.CopyOptions; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import com.fuyuanshen.common.tenant.core.TenantEntity; import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotBlank; import lombok.Data; /** @@ -36,4 +29,10 @@ public class DeviceTypeForm { @Schema(name = "通讯方式", example = "0:4G;1:蓝牙") private String communicationMode; + /** + * 型号字典用于APP页面跳转 + */ + @Schema(name = "型号字典用于APP页面跳转") + private Integer modelDictionary; + } From c587ef738935bfd0271939d4558bb39ecd9fe03e Mon Sep 17 00:00:00 2001 From: chenyouting <514333061@qq.com> Date: Thu, 14 Aug 2025 18:57:50 +0800 Subject: [PATCH 20/28] =?UTF-8?q?=E8=A7=A3=E7=BB=91=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/service/device/DeviceBizService.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceBizService.java b/fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceBizService.java index 82a4964..4d9a8de 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceBizService.java +++ b/fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceBizService.java @@ -6,12 +6,16 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fuyuanshen.app.domain.AppDeviceBindRecord; +import com.fuyuanshen.app.domain.AppDeviceShare; import com.fuyuanshen.app.domain.dto.APPReNameDTO; import com.fuyuanshen.app.domain.dto.AppRealTimeStatusDto; import com.fuyuanshen.app.domain.dto.DeviceInstructDto; import com.fuyuanshen.app.domain.vo.APPDeviceTypeVo; +import com.fuyuanshen.app.domain.vo.AppUserVo; import com.fuyuanshen.app.mapper.AppDeviceBindRecordMapper; +import com.fuyuanshen.app.mapper.AppDeviceShareMapper; import com.fuyuanshen.app.mapper.AppPersonnelInfoMapper; +import com.fuyuanshen.app.mapper.AppUserMapper; import com.fuyuanshen.app.mapper.equipment.APPDeviceMapper; import com.fuyuanshen.common.core.exception.ServiceException; import com.fuyuanshen.common.core.utils.ObjectUtils; @@ -55,6 +59,8 @@ public class DeviceBizService { private final AppDeviceBindRecordMapper appDeviceBindRecordMapper; private final RealTimeStatusEngine realTimeStatusEngine; private final DeviceLogMapper deviceLogMapper; + private final AppDeviceShareMapper appDeviceShareMapper; + private final AppUserMapper appUserMapper;; @@ -240,6 +246,15 @@ public class DeviceBizService { appDeviceBindRecordMapper.deleteById(appDeviceBindRecord.getId())); } + AppUserVo appUserVo = appUserMapper.selectVoById(userId); + QueryWrapper appDeviceShareQueryWrapper = new QueryWrapper<>(); + appDeviceShareQueryWrapper.eq("device_id", device.getId()); + appDeviceShareQueryWrapper.eq("phonenumber", appUserVo.getPhonenumber()); + List appDeviceShareList = appDeviceShareMapper.selectList(appDeviceShareQueryWrapper); + if (CollectionUtil.isNotEmpty(appDeviceShareList)) { + appDeviceShareList.forEach(appDeviceShare -> + appDeviceShareMapper.deleteById(appDeviceShare.getId())); + } return 1; } From 77542f5e763eae4443a25f5e53ed17d596d1af62 Mon Sep 17 00:00:00 2001 From: chenyouting <514333061@qq.com> Date: Fri, 15 Aug 2025 09:32:54 +0800 Subject: [PATCH 21/28] commit --- .../mqtt/receiver/ReceiverMessageHandler.java | 2 +- .../service/device/DeviceBJQBizService.java | 36 +++++++++++++++++-- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/receiver/ReceiverMessageHandler.java b/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/receiver/ReceiverMessageHandler.java index 618758f..811acd5 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/receiver/ReceiverMessageHandler.java +++ b/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/receiver/ReceiverMessageHandler.java @@ -49,7 +49,7 @@ public class ReceiverMessageHandler implements MessageHandler { if(StringUtils.isNotBlank(deviceImei)){ //在线状态 String deviceOnlineStatusRedisKey = GlobalConstants.GLOBAL_REDIS_KEY+ DEVICE_KEY_PREFIX+ deviceImei + DeviceRedisKeyConstants.DEVICE_ONLINE_STATUS_KEY_PREFIX ; - RedisUtils.setCacheObject(deviceOnlineStatusRedisKey, "1", Duration.ofSeconds(60*15)); + RedisUtils.setCacheObject(deviceOnlineStatusRedisKey, "1", Duration.ofSeconds(62)); } String state = payloadDict.getStr("state"); diff --git a/fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceBJQBizService.java b/fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceBJQBizService.java index 671fe8e..7038c8e 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceBJQBizService.java +++ b/fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceBJQBizService.java @@ -19,6 +19,7 @@ import com.fuyuanshen.common.satoken.utils.AppLoginHelper; import com.fuyuanshen.equipment.domain.Device; import com.fuyuanshen.equipment.domain.DeviceType; import com.fuyuanshen.equipment.domain.dto.AppDeviceSendMsgBo; +import com.fuyuanshen.equipment.mapper.DeviceLogMapper; import com.fuyuanshen.equipment.mapper.DeviceMapper; import com.fuyuanshen.equipment.mapper.DeviceTypeMapper; import com.fuyuanshen.global.mqtt.config.MqttGateway; @@ -50,6 +51,7 @@ public class DeviceBJQBizService { private final AppPersonnelInfoMapper appPersonnelInfoMapper; private final DeviceTypeMapper deviceTypeMapper; private final MqttGateway mqttGateway; + private final DeviceLogMapper deviceLogMapper; public int sendMessage(AppDeviceSendMsgBo bo) { List deviceIds = bo.getDeviceIds(); @@ -93,15 +95,43 @@ public class DeviceBJQBizService { .eq("binding_user_id", AppLoginHelper.getUserId()) .set("send_msg", bo.getSendMsg()); deviceMapper.update(updateWrapper); + recordDeviceLog(deviceId, device.getDeviceName(), "发送信息", bo.getSendMsg(), AppLoginHelper.getUserId()); } catch (Exception e) { log.info("发送信息设备发送信息失败:{}" ,deviceId); throw new ServiceException("发送指令失败"); } } + + return 1; } + /** + * 记录设备操作日志 + * @param deviceId 设备ID + * @param content 日志内容 + * @param operator 操作人 + */ + private void recordDeviceLog(Long deviceId,String deviceName, String deviceAction, String content, Long operator) { + try { + // 创建设备日志实体 + com.fuyuanshen.equipment.domain.DeviceLog deviceLog = new com.fuyuanshen.equipment.domain.DeviceLog(); + deviceLog.setDeviceId(deviceId); + deviceLog.setDeviceAction(deviceAction); + deviceLog.setContent(content); + deviceLog.setCreateBy(operator); + deviceLog.setDeviceName(deviceName); + deviceLog.setCreateTime(new Date()); + + // 插入日志记录 + deviceLogMapper.insert(deviceLog); + } catch (Exception e) { + log.error("记录设备操作日志失败: {}", e.getMessage(), e); + } + } + + public AppDeviceDetailVo getInfo(Long id) { Device device = deviceMapper.selectById(id); if (device == null) { @@ -203,7 +233,7 @@ public class DeviceBJQBizService { map.put("instruct", intData); mqttGateway.sendMsgToMqtt(MqttConstants.GLOBAL_PUB_KEY + deviceObj.getDeviceImei(), 1, JSON.toJSONString(map)); log.info("发送点阵数据到设备消息=>topic:{},payload:{}", MqttConstants.GLOBAL_PUB_KEY + deviceObj.getDeviceImei(), bo); - + recordDeviceLog(deviceId, deviceObj.getDeviceName(), "人员信息登记", JSON.toJSONString(bo), AppLoginHelper.getUserId()); if (ObjectUtils.length(appPersonnelInfoVos) == 0) { AppPersonnelInfo appPersonnelInfo = MapstructUtils.convert(bo, AppPersonnelInfo.class); return appPersonnelInfoMapper.insertOrUpdate(appPersonnelInfo); @@ -216,8 +246,6 @@ public class DeviceBJQBizService { .set("code", bo.getCode()); return appPersonnelInfoMapper.update(null, uw) > 0; } - - } public void uploadDeviceLogo(AppDeviceLogoUploadDto bo) { @@ -255,6 +283,8 @@ public class DeviceBJQBizService { map.put("instruct", intData); mqttGateway.sendMsgToMqtt(MqttConstants.GLOBAL_PUB_KEY+device.getDeviceImei(), 1 , JSON.toJSONString(map)); log.info("发送点阵数据到设备消息=>topic:{},payload:{}", MqttConstants.GLOBAL_PUB_KEY+device.getDeviceImei(),JSON.toJSONString(map)); + + recordDeviceLog(device.getId(), device.getDeviceName(), "上传开机画面", "上传开机画面", AppLoginHelper.getUserId()); } catch (Exception e){ e.printStackTrace(); throw new ServiceException("发送指令失败"); From f65a8cdc8c64030c5ee386caafd7df0583f17102 Mon Sep 17 00:00:00 2001 From: daiyongfei <974332738@qq.com> Date: Fri, 15 Aug 2025 09:40:33 +0800 Subject: [PATCH 22/28] =?UTF-8?q?=E5=9E=8B=E5=8F=B7=E5=AD=97=E5=85=B8=20mo?= =?UTF-8?q?delDictionary?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/fuyuanshen/equipment/domain/DeviceType.java | 2 +- .../com/fuyuanshen/equipment/domain/form/DeviceTypeForm.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/domain/DeviceType.java b/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/domain/DeviceType.java index 4ed8380..32bd32e 100644 --- a/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/domain/DeviceType.java +++ b/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/domain/DeviceType.java @@ -69,7 +69,7 @@ public class DeviceType extends TenantEntity { * 型号字典用于APP页面跳转 */ @Schema(name = "型号字典用于APP页面跳转") - private Integer modelDictionary; + private String modelDictionary; } diff --git a/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/domain/form/DeviceTypeForm.java b/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/domain/form/DeviceTypeForm.java index 5a8617a..7fc8a10 100644 --- a/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/domain/form/DeviceTypeForm.java +++ b/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/domain/form/DeviceTypeForm.java @@ -33,6 +33,6 @@ public class DeviceTypeForm { * 型号字典用于APP页面跳转 */ @Schema(name = "型号字典用于APP页面跳转") - private Integer modelDictionary; + private String modelDictionary; } From 33f3cb5989d867fe0c818a1510cd33f7e8cd3a03 Mon Sep 17 00:00:00 2001 From: chenyouting <514333061@qq.com> Date: Fri, 15 Aug 2025 10:14:35 +0800 Subject: [PATCH 23/28] =?UTF-8?q?app=E5=A2=9E=E5=8A=A0=E5=AD=97=E5=85=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/mapper/app/AppDeviceShareMapper.xml | 2 ++ .../java/com/fuyuanshen/equipment/domain/vo/AppDeviceVo.java | 5 +++++ .../src/main/resources/mapper/equipment/DeviceMapper.xml | 2 ++ 3 files changed, 9 insertions(+) diff --git a/fys-modules/fys-app/src/main/resources/mapper/app/AppDeviceShareMapper.xml b/fys-modules/fys-app/src/main/resources/mapper/app/AppDeviceShareMapper.xml index 9b3b29c..c1d1b75 100644 --- a/fys-modules/fys-app/src/main/resources/mapper/app/AppDeviceShareMapper.xml +++ b/fys-modules/fys-app/src/main/resources/mapper/app/AppDeviceShareMapper.xml @@ -13,6 +13,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" d.device_pic, dt.type_name, dt.communication_mode, + dt.model_dictionary detailPageUrl, d.bluetooth_name, c.binding_time, ad.*,u.user_name otherPhonenumber @@ -34,6 +35,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" dt.type_name, dt.communication_mode, d.bluetooth_name, + dt.model_dictionary detailPageUrl, c.binding_time, ad.*,u.user_name otherPhonenumber from diff --git a/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/domain/vo/AppDeviceVo.java b/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/domain/vo/AppDeviceVo.java index 1d0ec23..aafc6fc 100644 --- a/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/domain/vo/AppDeviceVo.java +++ b/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/domain/vo/AppDeviceVo.java @@ -81,4 +81,9 @@ public class AppDeviceVo implements Serializable { * 告警状态(0解除告警,1告警) */ private String alarmStatus; + + /** + * 设备详情页面 + */ + private String detailPageUrl; } diff --git a/fys-modules/fys-equipment/src/main/resources/mapper/equipment/DeviceMapper.xml b/fys-modules/fys-equipment/src/main/resources/mapper/equipment/DeviceMapper.xml index 8af7215..37b0192 100644 --- a/fys-modules/fys-equipment/src/main/resources/mapper/equipment/DeviceMapper.xml +++ b/fys-modules/fys-equipment/src/main/resources/mapper/equipment/DeviceMapper.xml @@ -148,6 +148,7 @@ dt.type_name, dt.communication_mode, d.bluetooth_name, + dt.model_dictionary detailPageUrl, c.binding_time from device d inner join device_type dt on d.device_type = dt.id @@ -177,6 +178,7 @@ d.device_pic, dt.type_name, dt.communication_mode, + dt.model_dictionary detailPageUrl, d.bluetooth_name from device d inner join device_type dt on d.device_type = dt.id From f8c53451c05ae277c1b4231c31bcc1b32affd3e9 Mon Sep 17 00:00:00 2001 From: chenyouting <514333061@qq.com> Date: Fri, 15 Aug 2025 18:16:37 +0800 Subject: [PATCH 24/28] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=81=AF=E5=85=89?= =?UTF-8?q?=E4=B8=8A=E6=8A=A5=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fuyuanshen/global/mqtt/base/MqttRuleEngine.java | 11 +++++++++-- .../mqtt/rule/bjq/BjqLaserModeSettingsRule.java | 2 +- .../fuyuanshen/global/mqtt/rule/bjq/BjqModeRule.java | 8 ++++++-- fys-admin/src/main/resources/application.yml | 2 +- 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/base/MqttRuleEngine.java b/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/base/MqttRuleEngine.java index 66ea4dc..b27d57a 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/base/MqttRuleEngine.java +++ b/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/base/MqttRuleEngine.java @@ -1,5 +1,9 @@ package com.fuyuanshen.global.mqtt.base; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.core.task.TaskExecutor; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.stereotype.Component; import java.util.Comparator; @@ -11,7 +15,10 @@ import java.util.List; */ @Component public class MqttRuleEngine { - + + @Autowired + @Qualifier("threadPoolTaskExecutor") + private ThreadPoolTaskExecutor threadPoolTaskExecutor; private final LinkedHashMap rulesMap = new LinkedHashMap<>(); public MqttRuleEngine(List rules) { @@ -30,7 +37,7 @@ public class MqttRuleEngine { int commandType = context.getCommandType(); MqttMessageRule mqttMessageRule = rulesMap.get("Light_"+commandType); if (mqttMessageRule != null) { - mqttMessageRule.execute(context); + threadPoolTaskExecutor.execute(() -> mqttMessageRule.execute(context)); return true; } diff --git a/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/bjq/BjqLaserModeSettingsRule.java b/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/bjq/BjqLaserModeSettingsRule.java index f255b10..b2bb339 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/bjq/BjqLaserModeSettingsRule.java +++ b/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/bjq/BjqLaserModeSettingsRule.java @@ -49,7 +49,7 @@ public class BjqLaserModeSettingsRule implements MqttMessageRule { RedisUtils.setCacheObject(functionAccess, FunctionAccessStatus.OK.getCode(), Duration.ofSeconds(30)); } catch (Exception e) { - log.error("处理灯光模式命令时出错", e); + log.error("处理激光模式命令时出错", e); RedisUtils.setCacheObject(functionAccess, FunctionAccessStatus.FAILED.getCode(), Duration.ofSeconds(30)); } } diff --git a/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/bjq/BjqModeRule.java b/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/bjq/BjqModeRule.java index 7c53d20..f16b77e 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/bjq/BjqModeRule.java +++ b/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/bjq/BjqModeRule.java @@ -16,8 +16,7 @@ import java.time.Duration; import java.util.concurrent.CompletableFuture; import static com.fuyuanshen.common.core.constant.GlobalConstants.FUNCTION_ACCESS_KEY; -import static com.fuyuanshen.global.mqtt.constants.DeviceRedisKeyConstants.DEVICE_KEY_PREFIX; -import static com.fuyuanshen.global.mqtt.constants.DeviceRedisKeyConstants.DEVICE_LIGHT_MODE_KEY_PREFIX; +import static com.fuyuanshen.global.mqtt.constants.DeviceRedisKeyConstants.*; /** * 灯光模式订阅设备回传消息 @@ -39,6 +38,7 @@ public class BjqModeRule implements MqttMessageRule { Object[] convertArr = context.getConvertArr(); String mainLightMode = convertArr[1].toString(); + String batteryRemainingTime = convertArr[2].toString(); if(StringUtils.isNotBlank(mainLightMode)){ if("0".equals(mainLightMode)){ String deviceOnlineStatusRedisKey = GlobalConstants.GLOBAL_REDIS_KEY+ DEVICE_KEY_PREFIX+ context.getDeviceImei() + DeviceRedisKeyConstants.DEVICE_ONLINE_STATUS_KEY_PREFIX ; @@ -46,6 +46,10 @@ public class BjqModeRule implements MqttMessageRule { } // 发送设备状态和位置信息到Redis syncSendDeviceDataToRedisWithFuture(context.getDeviceImei(),mainLightMode); + String deviceRedisKey = GlobalConstants.GLOBAL_REDIS_KEY+DeviceRedisKeyConstants.DEVICE_KEY_PREFIX + context.getDeviceImei() + DEVICE_LIGHT_BRIGHTNESS_KEY_PREFIX; + + // 存储到Redis + RedisUtils.setCacheObject(deviceRedisKey, batteryRemainingTime); } RedisUtils.setCacheObject(functionAccess, FunctionAccessStatus.OK.getCode(), Duration.ofSeconds(20)); } catch (Exception e) { diff --git a/fys-admin/src/main/resources/application.yml b/fys-admin/src/main/resources/application.yml index c413dff..3b4dce1 100644 --- a/fys-admin/src/main/resources/application.yml +++ b/fys-admin/src/main/resources/application.yml @@ -232,7 +232,7 @@ xss: # 如使用JDK21请直接使用虚拟线程 不要开启此配置 thread-pool: # 是否开启线程池 - enabled: false + enabled: true # 队列最大长度 queueCapacity: 128 # 线程池维护线程所允许的空闲时间 From 6d6db190b97fb67ad0307279272cdca41b0fc233 Mon Sep 17 00:00:00 2001 From: chenyouting <514333061@qq.com> Date: Sat, 16 Aug 2025 11:30:06 +0800 Subject: [PATCH 25/28] =?UTF-8?q?=E8=AE=BE=E5=A4=87=E5=88=86=E4=BA=AB2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../device/AppDeviceBJQController.java | 8 +-- .../app/service/AppDeviceShareService.java | 12 ++++ .../service/device/DeviceBJQBizService.java | 24 +++++-- .../app/domain/vo/AppDeviceShareDetailVo.java | 3 + .../equipment/enums/LightModeEnum.java | 72 +++++++++++++++++++ 5 files changed, 110 insertions(+), 9 deletions(-) create mode 100644 fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/enums/LightModeEnum.java diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/controller/device/AppDeviceBJQController.java b/fys-admin/src/main/java/com/fuyuanshen/app/controller/device/AppDeviceBJQController.java index d6bf411..51fb810 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/app/controller/device/AppDeviceBJQController.java +++ b/fys-admin/src/main/java/com/fuyuanshen/app/controller/device/AppDeviceBJQController.java @@ -43,7 +43,7 @@ public class AppDeviceBJQController extends BaseController { * 人员信息登记 */ @PostMapping(value = "/registerPersonInfo") - @FunctionAccessAnnotation("registerPersonInfo") +// @FunctionAccessAnnotation("registerPersonInfo") public R registerPersonInfo(@Validated(AddGroup.class) @RequestBody AppPersonnelInfoBo bo) { return toAjax(appDeviceService.registerPersonInfo(bo)); } @@ -61,7 +61,7 @@ public class AppDeviceBJQController extends BaseController { * 发送报警信息 */ @PostMapping(value = "/sendAlarmMessage") - @FunctionAccessBatcAnnotation("sendAlarmMessage") +// @FunctionAccessBatcAnnotation("sendAlarmMessage") public R sendAlarmMessage(@RequestBody AppDeviceSendMsgBo bo) { return toAjax(appDeviceService.sendAlarmMessage(bo)); } @@ -86,7 +86,7 @@ public class AppDeviceBJQController extends BaseController { * 灯光模式 * 0(关灯),1(强光模式),2(弱光模式), 3(爆闪模式), 4(泛光模式) */ - @FunctionAccessAnnotation("lightModeSettings") +// @FunctionAccessAnnotation("lightModeSettings") @PostMapping("/lightModeSettings") public R lightModeSettings(@RequestBody DeviceInstructDto params) { // params 转 JSONObject @@ -110,7 +110,7 @@ public class AppDeviceBJQController extends BaseController { * */ @PostMapping("/laserModeSettings") - @FunctionAccessAnnotation("laserModeSettings") +// @FunctionAccessAnnotation("laserModeSettings") public R laserModeSettings(@RequestBody DeviceInstructDto params) { appDeviceService.laserModeSettings(params); return R.ok(); diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/service/AppDeviceShareService.java b/fys-admin/src/main/java/com/fuyuanshen/app/service/AppDeviceShareService.java index be5986c..1b60ce6 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/app/service/AppDeviceShareService.java +++ b/fys-admin/src/main/java/com/fuyuanshen/app/service/AppDeviceShareService.java @@ -161,6 +161,18 @@ public class AppDeviceShareService { shareDetailVo.setLatitude(jsonObject.get("latitude").toString()); shareDetailVo.setAddress((String)jsonObject.get("address")); } + + + String alarmStatus = RedisUtils.getCacheObject(GLOBAL_REDIS_KEY +DEVICE_KEY_PREFIX+ device.getDeviceImei()+ DEVICE_ALARM_KEY_PREFIX); + if(StringUtils.isNotBlank(alarmStatus)){ + shareDetailVo.setAlarmStatus(alarmStatus); + } + + String lightBrightness = RedisUtils.getCacheObject(GLOBAL_REDIS_KEY +DEVICE_KEY_PREFIX+ device.getDeviceImei()+ DEVICE_LIGHT_BRIGHTNESS_KEY_PREFIX); + if(StringUtils.isNotBlank(lightBrightness)){ + shareDetailVo.setLightBrightness(lightBrightness); + } + return shareDetailVo; } /** diff --git a/fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceBJQBizService.java b/fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceBJQBizService.java index 7038c8e..1488ed5 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceBJQBizService.java +++ b/fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceBJQBizService.java @@ -19,6 +19,7 @@ import com.fuyuanshen.common.satoken.utils.AppLoginHelper; import com.fuyuanshen.equipment.domain.Device; import com.fuyuanshen.equipment.domain.DeviceType; import com.fuyuanshen.equipment.domain.dto.AppDeviceSendMsgBo; +import com.fuyuanshen.equipment.enums.LightModeEnum; import com.fuyuanshen.equipment.mapper.DeviceLogMapper; import com.fuyuanshen.equipment.mapper.DeviceMapper; import com.fuyuanshen.equipment.mapper.DeviceTypeMapper; @@ -69,7 +70,7 @@ public class DeviceBJQBizService { byte[] largeData = ImageWithTextGenerate.generate160x80ImageWithText2(bo.getSendMsg(), inputStream, 25600); int[] ints = convertHexToDecimal(largeData); - RedisUtils.setCacheObject(GLOBAL_REDIS_KEY+ DEVICE_KEY_PREFIX + device.getDeviceImei() + ":app_send_message_data" , Arrays.toString(ints), Duration.ofSeconds(30 * 60L)); + RedisUtils.setCacheObject(GLOBAL_REDIS_KEY+ DEVICE_KEY_PREFIX + device.getDeviceImei() + ":app_send_message_data" , Arrays.toString(ints), Duration.ofSeconds(5 * 60L)); String data = RedisUtils.getCacheObject(GLOBAL_REDIS_KEY+ DEVICE_KEY_PREFIX + device.getDeviceImei() + ":app_send_message_data"); @@ -95,6 +96,7 @@ public class DeviceBJQBizService { .eq("binding_user_id", AppLoginHelper.getUserId()) .set("send_msg", bo.getSendMsg()); deviceMapper.update(updateWrapper); + recordDeviceLog(deviceId, device.getDeviceName(), "发送信息", bo.getSendMsg(), AppLoginHelper.getUserId()); } catch (Exception e) { log.info("发送信息设备发送信息失败:{}" ,deviceId); @@ -211,6 +213,7 @@ public class DeviceBJQBizService { if (deviceObj == null) { throw new RuntimeException("请先将设备入库!!!"); } + QueryWrapper qw = new QueryWrapper() .eq("device_id", deviceId); List appPersonnelInfoVos = appPersonnelInfoMapper.selectVoList(qw); @@ -233,6 +236,7 @@ public class DeviceBJQBizService { map.put("instruct", intData); mqttGateway.sendMsgToMqtt(MqttConstants.GLOBAL_PUB_KEY + deviceObj.getDeviceImei(), 1, JSON.toJSONString(map)); log.info("发送点阵数据到设备消息=>topic:{},payload:{}", MqttConstants.GLOBAL_PUB_KEY + deviceObj.getDeviceImei(), bo); + recordDeviceLog(deviceId, deviceObj.getDeviceName(), "人员信息登记", JSON.toJSONString(bo), AppLoginHelper.getUserId()); if (ObjectUtils.length(appPersonnelInfoVos) == 0) { AppPersonnelInfo appPersonnelInfo = MapstructUtils.convert(bo, AppPersonnelInfo.class); @@ -262,7 +266,7 @@ public class DeviceBJQBizService { log.info("原始数据大小: {} 字节", largeData.length); int[] ints = convertHexToDecimal(largeData); - RedisUtils.setCacheObject(GLOBAL_REDIS_KEY+ DEVICE_KEY_PREFIX + device.getDeviceImei() +DEVICE_BOOT_LOGO_KEY_PREFIX, Arrays.toString(ints), Duration.ofSeconds(30 * 60L)); + RedisUtils.setCacheObject(GLOBAL_REDIS_KEY+ DEVICE_KEY_PREFIX + device.getDeviceImei() +DEVICE_BOOT_LOGO_KEY_PREFIX, Arrays.toString(ints), Duration.ofSeconds(5 * 60L)); String data = RedisUtils.getCacheObject(GLOBAL_REDIS_KEY+ DEVICE_KEY_PREFIX + device.getDeviceImei() + DEVICE_BOOT_LOGO_KEY_PREFIX); @@ -314,6 +318,8 @@ public class DeviceBJQBizService { map.put("instruct", intData); mqttGateway.sendMsgToMqtt(MqttConstants.GLOBAL_PUB_KEY+device.getDeviceImei(), 1 , JSON.toJSONString(map)); log.info("发送点阵数据到设备消息=>topic:{},payload:{}", MqttConstants.GLOBAL_PUB_KEY+device.getDeviceImei(),JSON.toJSONString(map)); + LightModeEnum modeEnum = LightModeEnum.getByCode(instructValue); + recordDeviceLog(device.getId(), device.getDeviceName(), "灯光模式", modeEnum!=null?modeEnum.getName():null, AppLoginHelper.getUserId()); } catch (Exception e){ e.printStackTrace(); throw new ServiceException("发送指令失败"); @@ -347,6 +353,7 @@ public class DeviceBJQBizService { map.put("instruct", intData); mqttGateway.sendMsgToMqtt(MqttConstants.GLOBAL_PUB_KEY+device.getDeviceImei(), 1 , JSON.toJSONString(map)); log.info("发送点阵数据到设备消息=>topic:{},payload:{}", MqttConstants.GLOBAL_PUB_KEY+device.getDeviceImei(),JSON.toJSONString(map)); + } catch (Exception e){ e.printStackTrace(); throw new ServiceException("发送指令失败"); @@ -372,6 +379,12 @@ public class DeviceBJQBizService { map.put("instruct", intData); mqttGateway.sendMsgToMqtt(MqttConstants.GLOBAL_PUB_KEY+device.getDeviceImei(), 1 , JSON.toJSONString(map)); log.info("发送点阵数据到设备消息=>topic:{},payload:{}", MqttConstants.GLOBAL_PUB_KEY+device.getDeviceImei(),JSON.toJSONString(map)); + // 1代表开启激光灯,此时主灯关闭,主灯控件为关机状态,为0代表关闭激光灯 + if("1".equals(params.getInstructValue())){ + recordDeviceLog(device.getId(), device.getDeviceName(), "激光模式设置", "开启激光灯", AppLoginHelper.getUserId()); + }else{ + recordDeviceLog(device.getId(), device.getDeviceName(), "激光模式设置", "关闭激光灯", AppLoginHelper.getUserId()); + } } catch (Exception e){ e.printStackTrace(); throw new ServiceException("发送指令失败"); @@ -418,15 +431,16 @@ public class DeviceBJQBizService { .eq("binding_user_id", AppLoginHelper.getUserId()) .set("send_msg", bo.getSendMsg()); deviceMapper.update(updateWrapper); + recordDeviceLog(device.getId(), device.getDeviceName(), "发送告警信息", bo.getSendMsg(), AppLoginHelper.getUserId()); } catch (Exception e) { - log.info("设备发送信息失败:{}" ,deviceId); - throw new ServiceException("设备发送信息失败"); + log.info("设备发送告警信息信息失败:{}" ,deviceId); + throw new ServiceException("设备发送告警信息信息失败"); } } } catch (Exception e){ e.printStackTrace(); - throw new ServiceException("发送指令失败"); + throw new ServiceException("发送告警信息指令失败"); } return 1; } diff --git a/fys-modules/fys-app/src/main/java/com/fuyuanshen/app/domain/vo/AppDeviceShareDetailVo.java b/fys-modules/fys-app/src/main/java/com/fuyuanshen/app/domain/vo/AppDeviceShareDetailVo.java index 89716f6..f9e8483 100644 --- a/fys-modules/fys-app/src/main/java/com/fuyuanshen/app/domain/vo/AppDeviceShareDetailVo.java +++ b/fys-modules/fys-app/src/main/java/com/fuyuanshen/app/domain/vo/AppDeviceShareDetailVo.java @@ -138,4 +138,7 @@ public class AppDeviceShareDetailVo implements Serializable { * 告警状态(0解除告警,1告警) */ private String alarmStatus; + + // 灯光亮度 + private String lightBrightness; } diff --git a/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/enums/LightModeEnum.java b/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/enums/LightModeEnum.java new file mode 100644 index 0000000..7394a08 --- /dev/null +++ b/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/enums/LightModeEnum.java @@ -0,0 +1,72 @@ +package com.fuyuanshen.equipment.enums; + +/** + * 灯光模式枚举 + */ +public enum LightModeEnum { + + /** + * 关灯模式 + */ + OFF(0, "关灯"), + + /** + * 强光模式 + */ + HIGH_BEAM(1, "开启强光模式"), + + /** + * 弱光模式 + */ + LOW_BEAM(2, "开启弱光模式"), + + /** + * 爆闪模式 + */ + STROBE(3, "开启爆闪模式"), + + /** + * 泛光模式 + */ + FLOOD(4, "开启泛光模式"); + + private final Integer code; + private final String name; + + LightModeEnum(Integer code, String name) { + this.code = code; + this.name = name; + } + + public Integer getCode() { + return code; + } + + public String getName() { + return name; + } + + /** + * 根据编号获取枚举 + * @param code 编号 + * @return 对应的枚举值 + */ + public static LightModeEnum getByCode(Integer code) { + for (LightModeEnum mode : LightModeEnum.values()) { + if (mode.getCode().equals(code)) { + return mode; + } + } + return null; + } + + /** + * 根据编号获取名称 + * @param code 编号 + * @return 对应的名称 + */ + public static String getNameByCode(Integer code) { + LightModeEnum mode = getByCode(code); + return mode != null ? mode.getName() : null; + } +} From b51e88052fe66074fb1148bb754d85101596ebc5 Mon Sep 17 00:00:00 2001 From: chenyouting <514333061@qq.com> Date: Sat, 16 Aug 2025 16:40:58 +0800 Subject: [PATCH 26/28] =?UTF-8?q?=E8=AE=BE=E5=A4=87=E5=88=86=E4=BA=AB3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/AppDeviceShareController.java | 4 +-- .../device/AppDeviceBJQController.java | 4 +-- .../service/DeviceShareService.java} | 12 +++---- .../service/device/DeviceBJQBizService.java | 31 +++++++++++++++++-- .../annotation/FunctionAccessAnnotation.java | 1 + .../FunctionAccessBatcAnnotation.java | 2 ++ .../aspectj/FunctionAccessAspect.java | 3 +- .../aspectj/FunctionAccessBatchAspect.java | 4 +-- 8 files changed, 44 insertions(+), 17 deletions(-) rename fys-admin/src/main/java/com/fuyuanshen/{app/service/AppDeviceShareService.java => web/service/DeviceShareService.java} (95%) diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/controller/AppDeviceShareController.java b/fys-admin/src/main/java/com/fuyuanshen/app/controller/AppDeviceShareController.java index 4c74320..613bb7e 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/app/controller/AppDeviceShareController.java +++ b/fys-admin/src/main/java/com/fuyuanshen/app/controller/AppDeviceShareController.java @@ -5,7 +5,6 @@ import cn.hutool.core.util.RandomUtil; import com.fuyuanshen.app.domain.bo.AppDeviceShareBo; import com.fuyuanshen.app.domain.vo.AppDeviceShareDetailVo; import com.fuyuanshen.app.domain.vo.AppDeviceShareVo; -import com.fuyuanshen.app.service.AppDeviceShareService; import com.fuyuanshen.app.service.IAppDeviceShareService; import com.fuyuanshen.common.core.constant.Constants; import com.fuyuanshen.common.core.domain.R; @@ -16,6 +15,7 @@ import com.fuyuanshen.common.mybatis.core.page.TableDataInfo; import com.fuyuanshen.common.ratelimiter.annotation.RateLimiter; import com.fuyuanshen.common.redis.utils.RedisUtils; import com.fuyuanshen.common.web.core.BaseController; +import com.fuyuanshen.web.service.DeviceShareService; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; @@ -45,7 +45,7 @@ public class AppDeviceShareController extends BaseController { private final IAppDeviceShareService deviceShareService; - private final AppDeviceShareService appDeviceShareService; + private final DeviceShareService appDeviceShareService; /** * 分享管理列表 diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/controller/device/AppDeviceBJQController.java b/fys-admin/src/main/java/com/fuyuanshen/app/controller/device/AppDeviceBJQController.java index 51fb810..3cc71f8 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/app/controller/device/AppDeviceBJQController.java +++ b/fys-admin/src/main/java/com/fuyuanshen/app/controller/device/AppDeviceBJQController.java @@ -52,7 +52,7 @@ public class AppDeviceBJQController extends BaseController { * 发送信息 */ @PostMapping(value = "/sendMessage") - @FunctionAccessBatcAnnotation("sendMessage") + @FunctionAccessBatcAnnotation(value = "sendMessage", timeOut = 30, batchMaxTimeOut = 40) public R sendMessage(@RequestBody AppDeviceSendMsgBo bo) { return toAjax(appDeviceService.sendMessage(bo)); } @@ -61,7 +61,7 @@ public class AppDeviceBJQController extends BaseController { * 发送报警信息 */ @PostMapping(value = "/sendAlarmMessage") -// @FunctionAccessBatcAnnotation("sendAlarmMessage") + @FunctionAccessBatcAnnotation(value = "sendAlarmMessage", timeOut = 5, batchMaxTimeOut = 10) public R sendAlarmMessage(@RequestBody AppDeviceSendMsgBo bo) { return toAjax(appDeviceService.sendAlarmMessage(bo)); } diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/service/AppDeviceShareService.java b/fys-admin/src/main/java/com/fuyuanshen/web/service/DeviceShareService.java similarity index 95% rename from fys-admin/src/main/java/com/fuyuanshen/app/service/AppDeviceShareService.java rename to fys-admin/src/main/java/com/fuyuanshen/web/service/DeviceShareService.java index 1b60ce6..d73eaa7 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/app/service/AppDeviceShareService.java +++ b/fys-admin/src/main/java/com/fuyuanshen/web/service/DeviceShareService.java @@ -1,8 +1,7 @@ -package com.fuyuanshen.app.service; +package com.fuyuanshen.web.service; import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -14,11 +13,8 @@ import com.fuyuanshen.app.domain.vo.AppDeviceShareVo; import com.fuyuanshen.app.domain.vo.AppPersonnelInfoVo; import com.fuyuanshen.app.mapper.AppDeviceShareMapper; import com.fuyuanshen.app.mapper.AppPersonnelInfoMapper; -import com.fuyuanshen.common.core.constant.Constants; import com.fuyuanshen.common.core.constant.GlobalConstants; import com.fuyuanshen.common.core.exception.ServiceException; -import com.fuyuanshen.common.core.exception.user.CaptchaExpireException; -import com.fuyuanshen.common.core.utils.MessageUtils; import com.fuyuanshen.common.core.utils.StringUtils; import com.fuyuanshen.common.mybatis.core.page.PageQuery; import com.fuyuanshen.common.mybatis.core.page.TableDataInfo; @@ -44,7 +40,7 @@ import static com.fuyuanshen.global.mqtt.constants.DeviceRedisKeyConstants.*; @RequiredArgsConstructor @Slf4j @Service -public class AppDeviceShareService { +public class DeviceShareService { private final AppDeviceShareMapper appDeviceShareMapper; @@ -60,7 +56,7 @@ public class AppDeviceShareService { Page page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()); Page result = appDeviceShareMapper.selectAppDeviceShareList(bo, page); List records = result.getRecords(); - records.forEach(AppDeviceShareService::buildDeviceStatus); + records.forEach(DeviceShareService::buildDeviceStatus); return TableDataInfo.build(result); } @@ -231,7 +227,7 @@ public class AppDeviceShareService { IPage result = appDeviceShareMapper.otherDeviceShareList(bo, page); List records = result.getRecords(); - records.forEach(AppDeviceShareService::buildDeviceStatus); + records.forEach(DeviceShareService::buildDeviceStatus); return TableDataInfo.build(result); } diff --git a/fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceBJQBizService.java b/fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceBJQBizService.java index 1488ed5..60c80d7 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceBJQBizService.java +++ b/fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceBJQBizService.java @@ -64,6 +64,9 @@ public class DeviceBJQBizService { if (device == null) { throw new ServiceException("设备不存在" + deviceId); } + if(getDeviceStatus(device.getDeviceImei())){ + throw new ServiceException(device.getDeviceName()+",设备已断开连接"); + } try { ClassPathResource resource = new ClassPathResource("image/background.png"); InputStream inputStream = resource.getInputStream(); @@ -139,6 +142,7 @@ public class DeviceBJQBizService { if (device == null) { throw new RuntimeException("请先将设备入库!!!"); } + AppDeviceDetailVo vo = new AppDeviceDetailVo(); vo.setDeviceId(device.getId()); vo.setDeviceName(device.getDeviceName()); @@ -213,7 +217,9 @@ public class DeviceBJQBizService { if (deviceObj == null) { throw new RuntimeException("请先将设备入库!!!"); } - + if(getDeviceStatus(deviceObj.getDeviceImei())){ + throw new ServiceException(deviceObj.getDeviceName()+",设备已断开连接"); + } QueryWrapper qw = new QueryWrapper() .eq("device_id", deviceId); List appPersonnelInfoVos = appPersonnelInfoMapper.selectVoList(qw); @@ -258,6 +264,9 @@ public class DeviceBJQBizService { if (device == null) { throw new ServiceException("设备不存在"); } + if(getDeviceStatus(device.getDeviceImei())){ + throw new ServiceException(device.getDeviceName()+",设备已断开连接"); + } MultipartFile file = bo.getFile(); byte[] largeData = ImageToCArrayConverter.convertImageToCArray(file.getInputStream(), 160, 80, 25600); @@ -307,6 +316,9 @@ public class DeviceBJQBizService { if(device == null){ throw new ServiceException("设备不存在"); } + if(getDeviceStatus(device.getDeviceImei())){ + throw new ServiceException(device.getDeviceName()+",设备已断开连接"); + } Integer instructValue = Integer.parseInt(params.getInstructValue()); ArrayList intData = new ArrayList<>(); intData.add(1); @@ -334,6 +346,9 @@ public class DeviceBJQBizService { if(device == null){ throw new ServiceException("设备不存在"); } + if(getDeviceStatus(device.getDeviceImei())){ + throw new ServiceException(device.getDeviceName()+",设备已断开连接"); + } String instructValue = params.getInstructValue(); ArrayList intData = new ArrayList<>(); intData.add(5); @@ -368,6 +383,9 @@ public class DeviceBJQBizService { if(device == null){ throw new ServiceException("设备不存在"); } + if(getDeviceStatus(device.getDeviceImei())){ + throw new ServiceException(device.getDeviceName()+",设备已断开连接"); + } Integer instructValue = Integer.parseInt(params.getInstructValue()); ArrayList intData = new ArrayList<>(); intData.add(4); @@ -407,13 +425,17 @@ public class DeviceBJQBizService { if (deviceIds == null || deviceIds.isEmpty()) { throw new ServiceException("请选择设备"); } + for (Long deviceId : deviceIds) { Device device = deviceMapper.selectById(deviceId); if (device == null) { throw new ServiceException("设备不存在" + deviceId); } - + if(getDeviceStatus(device.getDeviceImei())){ + throw new ServiceException(device.getDeviceName()+",设备已断开连接"); + } try { + ArrayList intData = new ArrayList<>(); intData.add(7); intData.add(Integer.parseInt(bo.getInstructValue())); @@ -444,4 +466,9 @@ public class DeviceBJQBizService { } return 1; } + + private boolean getDeviceStatus(String deviceImei) { + String deviceOnlineStatusRedisKey = GlobalConstants.GLOBAL_REDIS_KEY+ DEVICE_KEY_PREFIX+ deviceImei + DeviceRedisKeyConstants.DEVICE_ONLINE_STATUS_KEY_PREFIX ; + return StringUtils.isBlank(deviceOnlineStatusRedisKey); + } } diff --git a/fys-common/fys-common-ratelimiter/src/main/java/com/fuyuanshen/common/ratelimiter/annotation/FunctionAccessAnnotation.java b/fys-common/fys-common-ratelimiter/src/main/java/com/fuyuanshen/common/ratelimiter/annotation/FunctionAccessAnnotation.java index 635b5b9..ab211b2 100644 --- a/fys-common/fys-common-ratelimiter/src/main/java/com/fuyuanshen/common/ratelimiter/annotation/FunctionAccessAnnotation.java +++ b/fys-common/fys-common-ratelimiter/src/main/java/com/fuyuanshen/common/ratelimiter/annotation/FunctionAccessAnnotation.java @@ -8,4 +8,5 @@ import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) public @interface FunctionAccessAnnotation { String value() default ""; + long timeOut() default 30; } diff --git a/fys-common/fys-common-ratelimiter/src/main/java/com/fuyuanshen/common/ratelimiter/annotation/FunctionAccessBatcAnnotation.java b/fys-common/fys-common-ratelimiter/src/main/java/com/fuyuanshen/common/ratelimiter/annotation/FunctionAccessBatcAnnotation.java index 3f59cd9..ef0934e 100644 --- a/fys-common/fys-common-ratelimiter/src/main/java/com/fuyuanshen/common/ratelimiter/annotation/FunctionAccessBatcAnnotation.java +++ b/fys-common/fys-common-ratelimiter/src/main/java/com/fuyuanshen/common/ratelimiter/annotation/FunctionAccessBatcAnnotation.java @@ -8,4 +8,6 @@ import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) public @interface FunctionAccessBatcAnnotation { String value() default ""; + long timeOut() default 30; + long batchMaxTimeOut() default 40; } diff --git a/fys-common/fys-common-ratelimiter/src/main/java/com/fuyuanshen/common/ratelimiter/aspectj/FunctionAccessAspect.java b/fys-common/fys-common-ratelimiter/src/main/java/com/fuyuanshen/common/ratelimiter/aspectj/FunctionAccessAspect.java index 1d884f1..41ecd7e 100644 --- a/fys-common/fys-common-ratelimiter/src/main/java/com/fuyuanshen/common/ratelimiter/aspectj/FunctionAccessAspect.java +++ b/fys-common/fys-common-ratelimiter/src/main/java/com/fuyuanshen/common/ratelimiter/aspectj/FunctionAccessAspect.java @@ -28,6 +28,7 @@ public class FunctionAccessAspect { // 获取方法参数,查找设备ID Object[] args = joinPoint.getArgs(); deviceImei = extractDeviceImei(args); + long timeout = functionAccessAnnotation.timeOut(); if (StringUtils.isNotBlank(deviceImei)) { // 生成全局Redis key @@ -37,7 +38,7 @@ public class FunctionAccessAspect { throw new ServiceException("设备已存在访问限制,请稍后再试", 500); } // - RedisUtils.setCacheObject(redisKey, "ACTIVE", Duration.ofSeconds(30)); + RedisUtils.setCacheObject(redisKey, "ACTIVE", Duration.ofSeconds(timeout)); } // 执行原方法 diff --git a/fys-common/fys-common-ratelimiter/src/main/java/com/fuyuanshen/common/ratelimiter/aspectj/FunctionAccessBatchAspect.java b/fys-common/fys-common-ratelimiter/src/main/java/com/fuyuanshen/common/ratelimiter/aspectj/FunctionAccessBatchAspect.java index c2c571c..5a901ff 100644 --- a/fys-common/fys-common-ratelimiter/src/main/java/com/fuyuanshen/common/ratelimiter/aspectj/FunctionAccessBatchAspect.java +++ b/fys-common/fys-common-ratelimiter/src/main/java/com/fuyuanshen/common/ratelimiter/aspectj/FunctionAccessBatchAspect.java @@ -41,10 +41,10 @@ public class FunctionAccessBatchAspect { throw new ServiceException("设备已存在访问限制,请稍后再试", 500); } deviceImeiList.forEach(item->{ - RedisUtils.setCacheObject(FUNCTION_ACCESS_KEY + item, "ACTIVE", Duration.ofSeconds(30)); + RedisUtils.setCacheObject(FUNCTION_ACCESS_KEY + item, "ACTIVE", Duration.ofSeconds(functionAccessBatchAspect.timeOut())); }); String deviceImeiListStr = JSONUtil.toJsonStr(deviceImeiList); - RedisUtils.setCacheObject(redisKey, deviceImeiListStr , Duration.ofSeconds(40)); + RedisUtils.setCacheObject(redisKey, deviceImeiListStr , Duration.ofSeconds(functionAccessBatchAspect.batchMaxTimeOut())); } // 执行原方法 From 9a6bf05c4b00c2e9302bcc8749c1b2dcd44f64d0 Mon Sep 17 00:00:00 2001 From: chenyouting <514333061@qq.com> Date: Mon, 18 Aug 2025 11:04:23 +0800 Subject: [PATCH 27/28] =?UTF-8?q?=E6=A0=B9=E6=8D=AEmac=E5=9C=B0=E5=9D=80?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E8=AE=BE=E5=A4=87=E8=AF=A6=E6=83=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/controller/AppDeviceController.java | 2 +- .../web/service/device/DeviceBizService.java | 13 +++++-------- .../equipment/mapper/DeviceMapper.java | 1 + .../resources/mapper/equipment/DeviceMapper.xml | 17 +++++++++++++++++ 4 files changed, 24 insertions(+), 9 deletions(-) diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/controller/AppDeviceController.java b/fys-admin/src/main/java/com/fuyuanshen/app/controller/AppDeviceController.java index 3a4bf25..d4b1695 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/app/controller/AppDeviceController.java +++ b/fys-admin/src/main/java/com/fuyuanshen/app/controller/AppDeviceController.java @@ -87,7 +87,7 @@ public class AppDeviceController extends BaseController { * 根据mac查询设备信息 */ @GetMapping("/getDeviceInfoByDeviceMac") - public R getDeviceInfo(String deviceMac) { + public R getDeviceInfo(String deviceMac) { return R.ok(appDeviceService.getDeviceInfo(deviceMac)); } } diff --git a/fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceBizService.java b/fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceBizService.java index 4d9a8de..3c0d9be 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceBizService.java +++ b/fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceBizService.java @@ -284,13 +284,10 @@ public class DeviceBizService { return null; } - public Device getDeviceInfo(String deviceMac) { - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("device_mac", deviceMac); - List devices = deviceMapper.selectList(queryWrapper); - if(ObjectUtils.length(devices) ==0){ - return null; - } - return devices.get(0); + public AppDeviceVo getDeviceInfo(String deviceMac) { +// QueryWrapper queryWrapper = new QueryWrapper<>(); +// queryWrapper.eq("device_mac", deviceMac); +// List devices = deviceMapper.selectList(queryWrapper); + return deviceMapper.getDeviceInfo(deviceMac); } } diff --git a/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/mapper/DeviceMapper.java b/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/mapper/DeviceMapper.java index d767a99..96bbfce 100644 --- a/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/mapper/DeviceMapper.java +++ b/fys-modules/fys-equipment/src/main/java/com/fuyuanshen/equipment/mapper/DeviceMapper.java @@ -67,4 +67,5 @@ public interface DeviceMapper extends BaseMapper { */ List findByOriginalDeviceId(Long originalDeviceId); + AppDeviceVo getDeviceInfo(@Param("deviceMac") String deviceMac); } diff --git a/fys-modules/fys-equipment/src/main/resources/mapper/equipment/DeviceMapper.xml b/fys-modules/fys-equipment/src/main/resources/mapper/equipment/DeviceMapper.xml index 37b0192..615c86a 100644 --- a/fys-modules/fys-equipment/src/main/resources/mapper/equipment/DeviceMapper.xml +++ b/fys-modules/fys-equipment/src/main/resources/mapper/equipment/DeviceMapper.xml @@ -212,5 +212,22 @@ FROM device WHERE original_device_id = #{originalDeviceId} + \ No newline at end of file From 34ee4ccecae9f7698832cff3e514c8e0679cd55f Mon Sep 17 00:00:00 2001 From: chenyouting <514333061@qq.com> Date: Tue, 19 Aug 2025 13:58:48 +0800 Subject: [PATCH 28/28] =?UTF-8?q?web=E7=AB=AF=E6=8E=A7=E5=88=B6=E4=B8=AD?= =?UTF-8?q?=E5=BF=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../device/DeviceBJQController.java | 119 ++++++++++++++++++ .../device/WEBDeviceController.java | 80 +++++++++++- .../mapper/equipment/DeviceMapper.xml | 4 +- 3 files changed, 196 insertions(+), 7 deletions(-) create mode 100644 fys-admin/src/main/java/com/fuyuanshen/web/controller/device/DeviceBJQController.java diff --git a/fys-admin/src/main/java/com/fuyuanshen/web/controller/device/DeviceBJQController.java b/fys-admin/src/main/java/com/fuyuanshen/web/controller/device/DeviceBJQController.java new file mode 100644 index 0000000..d42d522 --- /dev/null +++ b/fys-admin/src/main/java/com/fuyuanshen/web/controller/device/DeviceBJQController.java @@ -0,0 +1,119 @@ +package com.fuyuanshen.web.controller.device; + +import com.fuyuanshen.app.domain.bo.AppPersonnelInfoBo; +import com.fuyuanshen.app.domain.dto.AppDeviceLogoUploadDto; +import com.fuyuanshen.app.domain.dto.DeviceInstructDto; +import com.fuyuanshen.app.domain.vo.AppDeviceDetailVo; +import com.fuyuanshen.common.core.domain.R; +import com.fuyuanshen.common.core.validate.AddGroup; +import com.fuyuanshen.common.ratelimiter.annotation.FunctionAccessAnnotation; +import com.fuyuanshen.common.ratelimiter.annotation.FunctionAccessBatcAnnotation; +import com.fuyuanshen.common.web.core.BaseController; +import com.fuyuanshen.equipment.domain.dto.AppDeviceSendMsgBo; +import com.fuyuanshen.web.service.device.DeviceBJQBizService; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +/** + * BJQ6170设备控制类 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/api/bjq/device") +public class DeviceBJQController extends BaseController { + + private final DeviceBJQBizService appDeviceService; + + /** + * 获取设备详细信息 + * + * @param id 主键 + */ + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(appDeviceService.getInfo(id)); + } + + /** + * 人员信息登记 + */ + @PostMapping(value = "/registerPersonInfo") +// @FunctionAccessAnnotation("registerPersonInfo") + public R registerPersonInfo(@Validated(AddGroup.class) @RequestBody AppPersonnelInfoBo bo) { + return toAjax(appDeviceService.registerPersonInfo(bo)); + } + + /** + * 发送信息 + */ + @PostMapping(value = "/sendMessage") + @FunctionAccessBatcAnnotation(value = "sendMessage", timeOut = 30, batchMaxTimeOut = 40) + public R sendMessage(@RequestBody AppDeviceSendMsgBo bo) { + return toAjax(appDeviceService.sendMessage(bo)); + } + + /** + * 发送报警信息 + */ + @PostMapping(value = "/sendAlarmMessage") + @FunctionAccessBatcAnnotation(value = "sendAlarmMessage", timeOut = 5, batchMaxTimeOut = 10) + public R sendAlarmMessage(@RequestBody AppDeviceSendMsgBo bo) { + return toAjax(appDeviceService.sendAlarmMessage(bo)); + } + + /** + * 上传设备logo图片 + */ + @PostMapping("/uploadLogo") + @FunctionAccessAnnotation("uploadLogo") + public R upload(@Validated @ModelAttribute AppDeviceLogoUploadDto bo) { + + MultipartFile file = bo.getFile(); + if(file.getSize()>1024*1024*2){ + return R.warn("图片不能大于2M"); + } + appDeviceService.uploadDeviceLogo(bo); + + return R.ok(); + } + + /** + * 灯光模式 + * 0(关灯),1(强光模式),2(弱光模式), 3(爆闪模式), 4(泛光模式) + */ +// @FunctionAccessAnnotation("lightModeSettings") + @PostMapping("/lightModeSettings") + public R lightModeSettings(@RequestBody DeviceInstructDto params) { + // params 转 JSONObject + appDeviceService.lightModeSettings(params); + return R.ok(); + } + + /** + * 灯光亮度设置 + * + */ +// @FunctionAccessAnnotation("lightBrightnessSettings") + @PostMapping("/lightBrightnessSettings") + public R lightBrightnessSettings(@RequestBody DeviceInstructDto params) { + appDeviceService.lightBrightnessSettings(params); + return R.ok(); + } + + /** + * 激光模式设置 + * + */ + @PostMapping("/laserModeSettings") +// @FunctionAccessAnnotation("laserModeSettings") + public R laserModeSettings(@RequestBody DeviceInstructDto params) { + appDeviceService.laserModeSettings(params); + return R.ok(); + } + +} diff --git a/fys-admin/src/main/java/com/fuyuanshen/web/controller/device/WEBDeviceController.java b/fys-admin/src/main/java/com/fuyuanshen/web/controller/device/WEBDeviceController.java index eadb157..0d19676 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/web/controller/device/WEBDeviceController.java +++ b/fys-admin/src/main/java/com/fuyuanshen/web/controller/device/WEBDeviceController.java @@ -1,16 +1,27 @@ package com.fuyuanshen.web.controller.device; +import com.fuyuanshen.app.domain.dto.APPReNameDTO; +import com.fuyuanshen.app.domain.dto.AppRealTimeStatusDto; +import com.fuyuanshen.app.domain.vo.APPDeviceTypeVo; import com.fuyuanshen.common.core.domain.R; +import com.fuyuanshen.common.mybatis.core.page.PageQuery; +import com.fuyuanshen.common.mybatis.core.page.TableDataInfo; import com.fuyuanshen.common.web.core.BaseController; +import com.fuyuanshen.equipment.domain.dto.AppDeviceBo; +import com.fuyuanshen.equipment.domain.query.DeviceQueryCriteria; +import com.fuyuanshen.equipment.domain.vo.AppDeviceVo; import com.fuyuanshen.web.service.WEBDeviceService; +import com.fuyuanshen.web.service.device.DeviceBizService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; /** * @Description: @@ -25,7 +36,7 @@ import org.springframework.web.bind.annotation.RestController; public class WEBDeviceController extends BaseController { private final WEBDeviceService deviceService; - + private final DeviceBizService appDeviceService; /** * @param id @@ -41,6 +52,67 @@ public class WEBDeviceController extends BaseController { } + + + /** + * 查询设备列表 + */ + @GetMapping("/list") + public TableDataInfo list(DeviceQueryCriteria bo, PageQuery pageQuery) { + return appDeviceService.queryAppDeviceList(bo,pageQuery); + } + + /** + * 绑定设备 + */ + @PostMapping("/bind") + public R bind(@RequestBody AppDeviceBo bo) { + return toAjax(appDeviceService.bindDevice(bo)); + } + + + /** + * 解绑设备 + */ + @DeleteMapping("/unBind") + public R unBind(Long id) { + return toAjax(appDeviceService.unBindDevice(id)); + } + + /** + * 查询设备类型列表 + */ + @GetMapping(value = "/typeList") + public R> getTypeList() { + List typeList = appDeviceService.getTypeList(); + return R.ok(typeList); + } + + /** + * 重命名设备 + * @param reNameDTO + * @return + */ + @PostMapping(value = "/reName") + public R reName(@Validated @RequestBody APPReNameDTO reNameDTO) { + appDeviceService.reName(reNameDTO); + return R.ok("重命名成功!!!"); + } + + + @GetMapping("/realTimeStatus") + public R> getRealTimeStatus(AppRealTimeStatusDto statusDto) { + Map status = appDeviceService.getRealTimeStatus(statusDto); + return R.ok(status); + } + + /** + * 根据mac查询设备信息 + */ + @GetMapping("/getDeviceInfoByDeviceMac") + public R getDeviceInfo(String deviceMac) { + return R.ok(appDeviceService.getDeviceInfo(deviceMac)); + } } diff --git a/fys-modules/fys-equipment/src/main/resources/mapper/equipment/DeviceMapper.xml b/fys-modules/fys-equipment/src/main/resources/mapper/equipment/DeviceMapper.xml index 615c86a..e5c95a3 100644 --- a/fys-modules/fys-equipment/src/main/resources/mapper/equipment/DeviceMapper.xml +++ b/fys-modules/fys-equipment/src/main/resources/mapper/equipment/DeviceMapper.xml @@ -222,11 +222,9 @@ dt.type_name, dt.communication_mode, d.bluetooth_name, - dt.model_dictionary detailPageUrl, - c.binding_time + dt.model_dictionary detailPageUrl from device d inner join device_type dt on d.device_type = dt.id - inner join app_device_bind_record c on d.id = c.device_id where d.device_mac = #{deviceMac}