diff --git a/dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/ManageDevicePayloadCustomController.java b/dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/ManageDevicePayloadCustomController.java new file mode 100644 index 0000000..9b79d25 --- /dev/null +++ b/dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/ManageDevicePayloadCustomController.java @@ -0,0 +1,113 @@ +package org.dromara.sample.manage.controller; + +import java.util.List; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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 org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.sample.manage.domain.vo.ManageDevicePayloadCustomVo; +import org.dromara.sample.manage.domain.bo.ManageDevicePayloadCustomBo; +import org.dromara.sample.manage.service.IManageDevicePayloadCustomService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 设备自定义/第三方载荷信息 + * 前端访问路由地址为:/sample/DevicePayloadCustom + * + * @author szs + * @date 2025-06-18 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/DevicePayloadCustom") +public class ManageDevicePayloadCustomController extends BaseController { + + private final IManageDevicePayloadCustomService manageDevicePayloadCustomService; + + /** + * 查询设备自定义/第三方载荷信息列表 + */ + @SaCheckPermission("sample:DevicePayloadCustom:list") + @GetMapping("/list") + public TableDataInfo list(ManageDevicePayloadCustomBo bo, PageQuery pageQuery) { + return manageDevicePayloadCustomService.queryPageList(bo, pageQuery); + } + + @SaCheckPermission("sample:DevicePayloadCustom:list") + @GetMapping("/listAll") + public List listAll(ManageDevicePayloadCustomBo bo) { + return manageDevicePayloadCustomService.queryList(bo); + } + + /** + * 导出设备自定义/第三方载荷信息列表 + */ + @SaCheckPermission("sample:DevicePayloadCustom:export") + @Log(title = "设备自定义/第三方载荷信息", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(ManageDevicePayloadCustomBo bo, HttpServletResponse response) { + List list = manageDevicePayloadCustomService.queryList(bo); + ExcelUtil.exportExcel(list, "设备自定义/第三方载荷信息", ManageDevicePayloadCustomVo.class, response); + } + + /** + * 获取设备自定义/第三方载荷信息详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("sample:DevicePayloadCustom:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(manageDevicePayloadCustomService.queryById(id)); + } + + /** + * 新增设备自定义/第三方载荷信息 + */ + @SaCheckPermission("sample:DevicePayloadCustom:add") + @Log(title = "设备自定义/第三方载荷信息", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody ManageDevicePayloadCustomBo bo) { + return toAjax(manageDevicePayloadCustomService.insertByBo(bo)); + } + + /** + * 修改设备自定义/第三方载荷信息 + */ + @SaCheckPermission("sample:DevicePayloadCustom:edit") + @Log(title = "设备自定义/第三方载荷信息", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody ManageDevicePayloadCustomBo bo) { + return toAjax(manageDevicePayloadCustomService.updateByBo(bo)); + } + + /** + * 删除设备自定义/第三方载荷信息 + * + * @param ids 主键串 + */ + @SaCheckPermission("sample:DevicePayloadCustom:remove") + @Log(title = "设备自定义/第三方载荷信息", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(manageDevicePayloadCustomService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/dk-modules/sample/src/main/java/org/dromara/sample/manage/domain/ManageDevicePayloadCustom.java b/dk-modules/sample/src/main/java/org/dromara/sample/manage/domain/ManageDevicePayloadCustom.java new file mode 100644 index 0000000..f25a306 --- /dev/null +++ b/dk-modules/sample/src/main/java/org/dromara/sample/manage/domain/ManageDevicePayloadCustom.java @@ -0,0 +1,110 @@ +package org.dromara.sample.manage.domain; + +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import org.apache.ibatis.type.Alias; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 设备自定义/第三方载荷信息对象 manage_device_payload_custom + * + * @author szs + * @date 2025-06-18 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@TableName("manage_device_payload_custom") +public class ManageDevicePayloadCustom implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id") + private Long id; + + /** + * 载荷sn码 + */ + @TableField("payload_sn") + private String payloadSn; + + /** + * 载荷名称 + */ + @TableField("payload_name") + private String payloadName; + + /** + * 载荷类型 + */ + @TableField("payload_type") + private String payloadType; + + /** + * 父级Id + */ + @TableField("parent_id") + private Long parentId; + + /** + * 设备版本 + */ + @TableField("firmware_version") + private String firmwareVersion; + + /** + * 所属机场 + */ + @TableField("dock_sn") + private String dockSn; + + /** + * 所属设备 + */ + @TableField("device_sn") + private String deviceSn; + + /** + * 所属无人机 + */ + @TableField("drone_sn") + private String droneSn; + + /** + * 设备中位置编号 + */ + @TableField("payload_index") + private Long payloadIndex; + + /** + * 是否启动(1启用,0关闭) + */ + @TableField("enable_flag") + private Long enableFlag; + + /** + * 设备描述 + */ + @TableField("payload_desc") + private String payloadDesc; + + @TableField(value = "create_time", fill = FieldFill.INSERT) + private Date createTime; + + @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + + +} diff --git a/dk-modules/sample/src/main/java/org/dromara/sample/manage/domain/bo/ManageDevicePayloadCustomBo.java b/dk-modules/sample/src/main/java/org/dromara/sample/manage/domain/bo/ManageDevicePayloadCustomBo.java new file mode 100644 index 0000000..08c04df --- /dev/null +++ b/dk-modules/sample/src/main/java/org/dromara/sample/manage/domain/bo/ManageDevicePayloadCustomBo.java @@ -0,0 +1,99 @@ +package org.dromara.sample.manage.domain.bo; + +import com.fasterxml.jackson.annotation.JsonAlias; +import com.fasterxml.jackson.annotation.JsonValue; +import org.dromara.sample.manage.domain.ManageDevicePayloadCustom; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 设备自定义/第三方载荷信息业务对象 manage_device_payload_custom + * + * @author szs + * @date 2025-06-18 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = ManageDevicePayloadCustom.class, reverseConvertGenerate = false) +public class ManageDevicePayloadCustomBo extends BaseEntity { + + /** + * ID + */ +// @NotNull(message = "ID不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 载荷sn码 + */ +// @NotBlank(message = "载荷sn码不能为空", groups = { AddGroup.class, EditGroup.class }) +// @JsonValue("payloadSn") + @JsonAlias({"payload_sn"}) + private String payloadSn; + + /** + * 载荷名称 + */ +// @NotBlank(message = "载荷名称不能为空", groups = { AddGroup.class, EditGroup.class }) + @JsonAlias({"payload_name"}) + private String payloadName; + + /** + * 载荷类型 + */ +// @NotBlank(message = "载荷类型不能为空", groups = { AddGroup.class, EditGroup.class }) + @JsonAlias({"payload_type"}) + private String payloadType; + + /** + * 父级Id + */ + @JsonAlias({"parent_id"}) + private Long parentId; + + /** + * 设备版本 + */ + @JsonAlias({"firmware_version"}) + private String firmwareVersion; + + /** + * 所属机场 + */ +// @NotBlank(message = "所属机场不能为空", groups = { AddGroup.class, EditGroup.class }) + @JsonAlias({"dock_sn"}) + private String dockSn; + + /** + * 所属设备 + */ + @JsonAlias({"device_sn"}) + private String deviceSn; + + /** + * 所属无人机 + */ + private String droneSn; + + /** + * 设备中位置编号 + */ + private Long payloadIndex; + + /** + * 是否启动(1启用,0关闭) + */ + private Long enableFlag; + + /** + * 设备描述 + */ + private String payloadDesc; + + +} diff --git a/dk-modules/sample/src/main/java/org/dromara/sample/manage/domain/vo/ManageDevicePayloadCustomVo.java b/dk-modules/sample/src/main/java/org/dromara/sample/manage/domain/vo/ManageDevicePayloadCustomVo.java new file mode 100644 index 0000000..d1d4863 --- /dev/null +++ b/dk-modules/sample/src/main/java/org/dromara/sample/manage/domain/vo/ManageDevicePayloadCustomVo.java @@ -0,0 +1,100 @@ +package org.dromara.sample.manage.domain.vo; + +import org.dromara.sample.manage.domain.ManageDevicePayloadCustom; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 设备自定义/第三方载荷信息视图对象 manage_device_payload_custom + * + * @author szs + * @date 2025-06-18 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = ManageDevicePayloadCustom.class) +public class ManageDevicePayloadCustomVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @ExcelProperty(value = "ID") + private Long id; + + /** + * 载荷sn码 + */ + @ExcelProperty(value = "载荷sn码") + private String payloadSn; + + /** + * 载荷名称 + */ + @ExcelProperty(value = "载荷名称") + private String payloadName; + + /** + * 载荷类型 + */ + @ExcelProperty(value = "载荷类型") + private String payloadType; + + /** + * 父级Id + */ + @ExcelProperty(value = "父级Id") + private Long parentId; + + /** + * 设备版本 + */ + @ExcelProperty(value = "设备版本") + private String firmwareVersion; + + /** + * 所属机场 + */ + @ExcelProperty(value = "所属机场") + private String dockSn; + + /** + * 所属设备 + */ + @ExcelProperty(value = "所属设备") + private String deviceSn; + + /** + * 所属无人机 + */ + @ExcelProperty(value = "所属无人机") + private String droneSn; + + /** + * 设备中位置编号 + */ + @ExcelProperty(value = "设备中位置编号") + private Long payloadIndex; + + /** + * 是否启动(1启用,0关闭) + */ + @ExcelProperty(value = "是否启动(1启用,0关闭)") + private Long enableFlag; + + /** + * 设备描述 + */ + @ExcelProperty(value = "设备描述") + private String payloadDesc; + + +} diff --git a/dk-modules/sample/src/main/java/org/dromara/sample/manage/mapper/ManageDevicePayloadCustomMapper.java b/dk-modules/sample/src/main/java/org/dromara/sample/manage/mapper/ManageDevicePayloadCustomMapper.java new file mode 100644 index 0000000..14863eb --- /dev/null +++ b/dk-modules/sample/src/main/java/org/dromara/sample/manage/mapper/ManageDevicePayloadCustomMapper.java @@ -0,0 +1,15 @@ +package org.dromara.sample.manage.mapper; + +import org.dromara.sample.manage.domain.ManageDevicePayloadCustom; +import org.dromara.sample.manage.domain.vo.ManageDevicePayloadCustomVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 设备自定义/第三方载荷信息Mapper接口 + * + * @author szs + * @date 2025-06-18 + */ +public interface ManageDevicePayloadCustomMapper extends BaseMapperPlus { + +} diff --git a/dk-modules/sample/src/main/java/org/dromara/sample/manage/model/param/DeviceSubscribeParam.java b/dk-modules/sample/src/main/java/org/dromara/sample/manage/model/param/DeviceSubscribeParam.java new file mode 100644 index 0000000..7f837e9 --- /dev/null +++ b/dk-modules/sample/src/main/java/org/dromara/sample/manage/model/param/DeviceSubscribeParam.java @@ -0,0 +1,17 @@ +package org.dromara.sample.manage.model.param; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; +import org.springframework.web.bind.annotation.RequestParam; + +@Data +public class DeviceSubscribeParam { + + @JsonProperty("action") + private String action; + @JsonProperty("token") + private String token; + @JsonProperty("dock_sn") + private String dockSn; + +} diff --git a/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/IManageDevicePayloadCustomService.java b/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/IManageDevicePayloadCustomService.java new file mode 100644 index 0000000..ac1dde8 --- /dev/null +++ b/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/IManageDevicePayloadCustomService.java @@ -0,0 +1,68 @@ +package org.dromara.sample.manage.service; + +import org.dromara.sample.manage.domain.vo.ManageDevicePayloadCustomVo; +import org.dromara.sample.manage.domain.bo.ManageDevicePayloadCustomBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 设备自定义/第三方载荷信息Service接口 + * + * @author szs + * @date 2025-06-18 + */ +public interface IManageDevicePayloadCustomService { + + /** + * 查询设备自定义/第三方载荷信息 + * + * @param id 主键 + * @return 设备自定义/第三方载荷信息 + */ + ManageDevicePayloadCustomVo queryById(Long id); + + /** + * 分页查询设备自定义/第三方载荷信息列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 设备自定义/第三方载荷信息分页列表 + */ + TableDataInfo queryPageList(ManageDevicePayloadCustomBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的设备自定义/第三方载荷信息列表 + * + * @param bo 查询条件 + * @return 设备自定义/第三方载荷信息列表 + */ + List queryList(ManageDevicePayloadCustomBo bo); + + /** + * 新增设备自定义/第三方载荷信息 + * + * @param bo 设备自定义/第三方载荷信息 + * @return 是否新增成功 + */ + Boolean insertByBo(ManageDevicePayloadCustomBo bo); + + /** + * 修改设备自定义/第三方载荷信息 + * + * @param bo 设备自定义/第三方载荷信息 + * @return 是否修改成功 + */ + Boolean updateByBo(ManageDevicePayloadCustomBo bo); + + /** + * 校验并批量删除设备自定义/第三方载荷信息信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/ManageDevicePayloadCustomServiceImpl.java b/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/ManageDevicePayloadCustomServiceImpl.java new file mode 100644 index 0000000..0bc2edb --- /dev/null +++ b/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/ManageDevicePayloadCustomServiceImpl.java @@ -0,0 +1,139 @@ +package org.dromara.sample.manage.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.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 org.springframework.stereotype.Service; +import org.dromara.sample.manage.domain.bo.ManageDevicePayloadCustomBo; +import org.dromara.sample.manage.domain.vo.ManageDevicePayloadCustomVo; +import org.dromara.sample.manage.domain.ManageDevicePayloadCustom; +import org.dromara.sample.manage.mapper.ManageDevicePayloadCustomMapper; +import org.dromara.sample.manage.service.IManageDevicePayloadCustomService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 设备自定义/第三方载荷信息Service业务层处理 + * + * @author szs + * @date 2025-06-18 + */ +@RequiredArgsConstructor +@Service +public class ManageDevicePayloadCustomServiceImpl implements IManageDevicePayloadCustomService { + + private final ManageDevicePayloadCustomMapper baseMapper; + + /** + * 查询设备自定义/第三方载荷信息 + * + * @param id 主键 + * @return 设备自定义/第三方载荷信息 + */ + @Override + public ManageDevicePayloadCustomVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 分页查询设备自定义/第三方载荷信息列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 设备自定义/第三方载荷信息分页列表 + */ + @Override + public TableDataInfo queryPageList(ManageDevicePayloadCustomBo 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(ManageDevicePayloadCustomBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(ManageDevicePayloadCustomBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getPayloadSn()), ManageDevicePayloadCustom::getPayloadSn, bo.getPayloadSn()); + lqw.like(StringUtils.isNotBlank(bo.getPayloadName()), ManageDevicePayloadCustom::getPayloadName, bo.getPayloadName()); + lqw.eq(StringUtils.isNotBlank(bo.getPayloadType()), ManageDevicePayloadCustom::getPayloadType, bo.getPayloadType()); + lqw.eq(bo.getParentId() != null, ManageDevicePayloadCustom::getParentId, bo.getParentId()); + lqw.eq(StringUtils.isNotBlank(bo.getFirmwareVersion()), ManageDevicePayloadCustom::getFirmwareVersion, bo.getFirmwareVersion()); + lqw.eq(StringUtils.isNotBlank(bo.getDockSn()), ManageDevicePayloadCustom::getDockSn, bo.getDockSn()); + lqw.eq(StringUtils.isNotBlank(bo.getDeviceSn()), ManageDevicePayloadCustom::getDeviceSn, bo.getDeviceSn()); + lqw.eq(StringUtils.isNotBlank(bo.getDroneSn()), ManageDevicePayloadCustom::getDroneSn, bo.getDroneSn()); + lqw.eq(bo.getPayloadIndex() != null, ManageDevicePayloadCustom::getPayloadIndex, bo.getPayloadIndex()); + lqw.eq(bo.getEnableFlag() != null, ManageDevicePayloadCustom::getEnableFlag, bo.getEnableFlag()); + lqw.eq(StringUtils.isNotBlank(bo.getPayloadDesc()), ManageDevicePayloadCustom::getPayloadDesc, bo.getPayloadDesc()); + return lqw; + } + + /** + * 新增设备自定义/第三方载荷信息 + * + * @param bo 设备自定义/第三方载荷信息 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(ManageDevicePayloadCustomBo bo) { + ManageDevicePayloadCustom add = MapstructUtils.convert(bo, ManageDevicePayloadCustom.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改设备自定义/第三方载荷信息 + * + * @param bo 设备自定义/第三方载荷信息 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(ManageDevicePayloadCustomBo bo) { + ManageDevicePayloadCustom update = MapstructUtils.convert(bo, ManageDevicePayloadCustom.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(ManageDevicePayloadCustom 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/dk-modules/sample/src/main/java/org/dromara/sample/websocket/config/WebSocketSubscriptionManager.java b/dk-modules/sample/src/main/java/org/dromara/sample/websocket/config/WebSocketSubscriptionManager.java new file mode 100644 index 0000000..3cf36e9 --- /dev/null +++ b/dk-modules/sample/src/main/java/org/dromara/sample/websocket/config/WebSocketSubscriptionManager.java @@ -0,0 +1,104 @@ +package org.dromara.sample.websocket.config; + +import org.dromara.common.redis.config.RedisConst; +import org.dromara.common.redis.utils.RedisOpsUtils; +import org.springframework.stereotype.Component; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; + +@Component +public class WebSocketSubscriptionManager { + + /** + * 存储结构: + * key = bizCode + ":" + dockSn + * 内部Map = token -> (sessionId -> session) + */ +// private final ConcurrentHashMap> > subs = new ConcurrentHashMap<>(); + + // token -> Set + private final ConcurrentHashMap> tokenToDockSet = new ConcurrentHashMap<>(); + // token -> sessionId -> session + private final ConcurrentHashMap> tokenSessions = new ConcurrentHashMap<>(); + + + + private String buildOuterKey(String bizCode, String dockSn) { + return bizCode + ":" + dockSn; + } + + /** 订阅设备 */ + public void subscribe(String token, String dockSn, MyConcurrentWebSocketSession session) { +// 保存用户到redis,案例数据: ,超时:30分钟 + String key = RedisConst.DEVICE_ONLINE_USER_PREFIX + token; + RedisOpsUtils.setWithExpire(key, dockSn ,RedisConst.ONLINE_REDIS_USER_ALIVE_SECOND); + +// tokenToDockSet.computeIfAbsent(token, k -> ConcurrentHashMap.newKeySet()).add(dockSn); +// tokenSessions.computeIfAbsent(key, k -> new ConcurrentHashMap<>()).put(session.getId(), session); + } + + + /** 取消订阅设备 */ + public void unsubscribe(String token, String dockSn, String sessionId) { + + RedisOpsUtils.del(RedisConst.DEVICE_ONLINE_USER_PREFIX+token); + +// Set docks = tokenToDockSet.get(token); +// if (docks != null) { +// docks.remove(dockSn); +// if (docks.isEmpty()) { +// tokenToDockSet.remove(token); +// } +// } +// +// var sessionMap = tokenSessions.get(token); +// if (sessionMap != null) { +// sessionMap.remove(sessionId); +// if (sessionMap.isEmpty()) { +// tokenSessions.remove(token); +// } +// } + } + + /** 获取所有订阅了该 dockSn 的用户的 session */ + public Collection getSessionsForDock(String dockSn) { + List result = new ArrayList<>(); + for (Map.Entry> entry : tokenToDockSet.entrySet()) { + String token = entry.getKey(); + Set dockSnSet = entry.getValue(); + if (dockSnSet.contains(dockSn)) { + var sessionMap = tokenSessions.get(token); + if (sessionMap != null) { + result.addAll(sessionMap.values()); + } + } + } + return result; + } + + + // bizCode -> sessionId -> MyConcurrentWebSocketSession +// private final ConcurrentHashMap> subs = new ConcurrentHashMap<>(); + +// /** 订阅 */ +// public void subscribe(String bizCode, MyConcurrentWebSocketSession session) { +// subs.computeIfAbsent(bizCode, k -> new ConcurrentHashMap<>()) +// .put(session.getId(), session); +// } +// +// /** 取消订阅 */ +// public void unsubscribe(String bizCode, String sessionId) { +// var map = subs.get(bizCode); +// if (map != null) { +// map.remove(sessionId); +// if (map.isEmpty()) subs.remove(bizCode); +// } +// } +// +// /** 获取所有对该 bizCode 感兴趣的 sessions */ +// public Collection getSubscribers(String bizCode) { +// var map = subs.get(bizCode); +// return map == null ? Collections.emptyList() : map.values(); +// } +} diff --git a/dk-modules/sample/src/main/resources/mapper/ManageDevicePayloadCustomMapper.xml b/dk-modules/sample/src/main/resources/mapper/ManageDevicePayloadCustomMapper.xml new file mode 100644 index 0000000..7f5f825 --- /dev/null +++ b/dk-modules/sample/src/main/resources/mapper/ManageDevicePayloadCustomMapper.xml @@ -0,0 +1,7 @@ + + + + +