89 changed files with 2736 additions and 221 deletions
@ -0,0 +1,22 @@ |
|||
package org.dromara.sample.control.service.impl; |
|||
|
|||
|
|||
import org.dromara.sample.control.model.param.DronePayloadParam; |
|||
|
|||
/** |
|||
* @author sean |
|||
* @version 1.4 |
|||
* @date 2023/4/23 |
|||
*/ |
|||
public class IrMeteringAreaSetImpl extends PayloadCommandsHandler { |
|||
|
|||
public IrMeteringAreaSetImpl(DronePayloadParam param) { |
|||
super(param); |
|||
} |
|||
|
|||
@Override |
|||
public boolean canPublish(String deviceSn) { |
|||
super.canPublish(deviceSn); |
|||
return true; |
|||
} |
|||
} |
|||
@ -0,0 +1,23 @@ |
|||
package org.dromara.sample.control.service.impl; |
|||
|
|||
|
|||
import org.dromara.common.sdk.cloudapi.device.CameraStateEnum; |
|||
import org.dromara.sample.control.model.param.DronePayloadParam; |
|||
|
|||
/** |
|||
* @author sean |
|||
* @version 1.4 |
|||
* @date 2023/4/23 |
|||
*/ |
|||
public class IrMeteringModeSetImpl extends PayloadCommandsHandler { |
|||
|
|||
public IrMeteringModeSetImpl(DronePayloadParam param) { |
|||
super(param); |
|||
} |
|||
|
|||
@Override |
|||
public boolean canPublish(String deviceSn) { |
|||
super.canPublish(deviceSn); |
|||
return true; |
|||
} |
|||
} |
|||
@ -0,0 +1,22 @@ |
|||
package org.dromara.sample.control.service.impl; |
|||
|
|||
|
|||
import org.dromara.sample.control.model.param.DronePayloadParam; |
|||
|
|||
/** |
|||
* @author sean |
|||
* @version 1.4 |
|||
* @date 2023/4/23 |
|||
*/ |
|||
public class IrMeteringPointSetImpl extends PayloadCommandsHandler { |
|||
|
|||
public IrMeteringPointSetImpl(DronePayloadParam param) { |
|||
super(param); |
|||
} |
|||
|
|||
@Override |
|||
public boolean canPublish(String deviceSn) { |
|||
super.canPublish(deviceSn); |
|||
return true; |
|||
} |
|||
} |
|||
@ -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<ManageDevicePayloadCustomVo> list(ManageDevicePayloadCustomBo bo, PageQuery pageQuery) { |
|||
return manageDevicePayloadCustomService.queryPageList(bo, pageQuery); |
|||
} |
|||
|
|||
@SaCheckPermission("sample:DevicePayloadCustom:list") |
|||
@GetMapping("/listAll") |
|||
public List<ManageDevicePayloadCustomVo> 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<ManageDevicePayloadCustomVo> list = manageDevicePayloadCustomService.queryList(bo); |
|||
ExcelUtil.exportExcel(list, "设备自定义/第三方载荷信息", ManageDevicePayloadCustomVo.class, response); |
|||
} |
|||
|
|||
/** |
|||
* 获取设备自定义/第三方载荷信息详细信息 |
|||
* |
|||
* @param id 主键 |
|||
*/ |
|||
@SaCheckPermission("sample:DevicePayloadCustom:query") |
|||
@GetMapping("/{id}") |
|||
public R<ManageDevicePayloadCustomVo> 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<Void> 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<Void> 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<Void> remove(@NotEmpty(message = "主键不能为空") |
|||
@PathVariable Long[] ids) { |
|||
return toAjax(manageDevicePayloadCustomService.deleteWithValidByIds(List.of(ids), true)); |
|||
} |
|||
} |
|||
@ -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; |
|||
|
|||
|
|||
|
|||
} |
|||
@ -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; |
|||
|
|||
|
|||
} |
|||
@ -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; |
|||
|
|||
|
|||
} |
|||
@ -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<ManageDevicePayloadCustom, ManageDevicePayloadCustomVo> { |
|||
|
|||
} |
|||
@ -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; |
|||
|
|||
} |
|||
@ -0,0 +1,41 @@ |
|||
package org.dromara.sample.manage.model.receiver; |
|||
|
|||
import com.fasterxml.jackson.annotation.JsonValue; |
|||
import lombok.AllArgsConstructor; |
|||
import lombok.Data; |
|||
import lombok.EqualsAndHashCode; |
|||
import lombok.NoArgsConstructor; |
|||
import org.dromara.common.sdk.cloudapi.device.OsdDockDrone; |
|||
import org.dromara.common.sdk.cloudapi.device.PayloadIndex; |
|||
import org.dromara.common.sdk.cloudapi.device.ThermalPaletteStyleEnum; |
|||
import org.dromara.common.sdk.cloudapi.property.ThermalCurrentPaletteStyleSet; |
|||
|
|||
import java.util.Map; |
|||
import java.util.Objects; |
|||
|
|||
/** |
|||
* @author sean.zhou |
|||
* @date 2021/11/18 |
|||
* @version 0.1 |
|||
*/ |
|||
@EqualsAndHashCode(callSuper = true) |
|||
@Data |
|||
@AllArgsConstructor |
|||
@NoArgsConstructor |
|||
public class ThermalCurrentPaletteStyleReceiver extends BasicDeviceProperty { |
|||
|
|||
private String payloadIndex; |
|||
|
|||
private int thermalCurrentPaletteStyle; |
|||
|
|||
@Override |
|||
public boolean valid() { |
|||
return Objects.nonNull(payloadIndex) && Objects.nonNull(thermalCurrentPaletteStyle); |
|||
} |
|||
|
|||
@Override |
|||
public boolean canPublish(OsdDockDrone osd) { |
|||
return true; |
|||
} |
|||
|
|||
} |
|||
@ -0,0 +1,36 @@ |
|||
package org.dromara.sample.manage.model.receiver; |
|||
|
|||
import lombok.AllArgsConstructor; |
|||
import lombok.Data; |
|||
import lombok.EqualsAndHashCode; |
|||
import lombok.NoArgsConstructor; |
|||
import org.dromara.common.sdk.cloudapi.device.OsdDockDrone; |
|||
|
|||
import java.util.Objects; |
|||
|
|||
/** |
|||
* @author sean.zhou |
|||
* @date 2021/11/18 |
|||
* @version 0.1 |
|||
*/ |
|||
@EqualsAndHashCode(callSuper = true) |
|||
@Data |
|||
@AllArgsConstructor |
|||
@NoArgsConstructor |
|||
public class ThermalGaiModeReceiver extends BasicDeviceProperty { |
|||
|
|||
private String payloadIndex; |
|||
|
|||
private int thermalGainMde; |
|||
|
|||
@Override |
|||
public boolean valid() { |
|||
return Objects.nonNull(payloadIndex) && Objects.nonNull(thermalGainMde); |
|||
} |
|||
|
|||
@Override |
|||
public boolean canPublish(OsdDockDrone osd) { |
|||
return true; |
|||
} |
|||
|
|||
} |
|||
@ -0,0 +1,36 @@ |
|||
package org.dromara.sample.manage.model.receiver; |
|||
|
|||
import lombok.AllArgsConstructor; |
|||
import lombok.Data; |
|||
import lombok.EqualsAndHashCode; |
|||
import lombok.NoArgsConstructor; |
|||
import org.dromara.common.sdk.cloudapi.device.OsdDockDrone; |
|||
|
|||
import java.util.Objects; |
|||
|
|||
/** |
|||
* @author sean.zhou |
|||
* @date 2021/11/18 |
|||
* @version 0.1 |
|||
*/ |
|||
@EqualsAndHashCode(callSuper = true) |
|||
@Data |
|||
@AllArgsConstructor |
|||
@NoArgsConstructor |
|||
public class ThermalIsothermLowerLimitReceiver extends BasicDeviceProperty { |
|||
|
|||
private String payloadIndex; |
|||
|
|||
private int thermalIsothermLowerLimit; |
|||
|
|||
@Override |
|||
public boolean valid() { |
|||
return Objects.nonNull(payloadIndex) && Objects.nonNull(thermalIsothermLowerLimit); |
|||
} |
|||
|
|||
@Override |
|||
public boolean canPublish(OsdDockDrone osd) { |
|||
return true; |
|||
} |
|||
|
|||
} |
|||
@ -0,0 +1,36 @@ |
|||
package org.dromara.sample.manage.model.receiver; |
|||
|
|||
import lombok.AllArgsConstructor; |
|||
import lombok.Data; |
|||
import lombok.EqualsAndHashCode; |
|||
import lombok.NoArgsConstructor; |
|||
import org.dromara.common.sdk.cloudapi.device.OsdDockDrone; |
|||
|
|||
import java.util.Objects; |
|||
|
|||
/** |
|||
* @author sean.zhou |
|||
* @date 2021/11/18 |
|||
* @version 0.1 |
|||
*/ |
|||
@EqualsAndHashCode(callSuper = true) |
|||
@Data |
|||
@AllArgsConstructor |
|||
@NoArgsConstructor |
|||
public class ThermalIsothermStateReceiver extends BasicDeviceProperty { |
|||
|
|||
private String payloadIndex; |
|||
|
|||
private int thermalIsothermState; |
|||
|
|||
@Override |
|||
public boolean valid() { |
|||
return Objects.nonNull(payloadIndex) && Objects.nonNull(thermalIsothermState); |
|||
} |
|||
|
|||
@Override |
|||
public boolean canPublish(OsdDockDrone osd) { |
|||
return true; |
|||
} |
|||
|
|||
} |
|||
@ -0,0 +1,36 @@ |
|||
package org.dromara.sample.manage.model.receiver; |
|||
|
|||
import lombok.AllArgsConstructor; |
|||
import lombok.Data; |
|||
import lombok.EqualsAndHashCode; |
|||
import lombok.NoArgsConstructor; |
|||
import org.dromara.common.sdk.cloudapi.device.OsdDockDrone; |
|||
|
|||
import java.util.Objects; |
|||
|
|||
/** |
|||
* @author sean.zhou |
|||
* @date 2021/11/18 |
|||
* @version 0.1 |
|||
*/ |
|||
@EqualsAndHashCode(callSuper = true) |
|||
@Data |
|||
@AllArgsConstructor |
|||
@NoArgsConstructor |
|||
public class ThermalIsothermUpperLimitReceiver extends BasicDeviceProperty { |
|||
|
|||
private String payloadIndex; |
|||
|
|||
private int thermalIsothermUpperLimit; |
|||
|
|||
@Override |
|||
public boolean valid() { |
|||
return Objects.nonNull(payloadIndex) && Objects.nonNull(thermalIsothermUpperLimit); |
|||
} |
|||
|
|||
@Override |
|||
public boolean canPublish(OsdDockDrone osd) { |
|||
return true; |
|||
} |
|||
|
|||
} |
|||
@ -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<ManageDevicePayloadCustomVo> queryPageList(ManageDevicePayloadCustomBo bo, PageQuery pageQuery); |
|||
|
|||
/** |
|||
* 查询符合条件的设备自定义/第三方载荷信息列表 |
|||
* |
|||
* @param bo 查询条件 |
|||
* @return 设备自定义/第三方载荷信息列表 |
|||
*/ |
|||
List<ManageDevicePayloadCustomVo> 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<Long> ids, Boolean isValid); |
|||
} |
|||
@ -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<ManageDevicePayloadCustomVo> queryPageList(ManageDevicePayloadCustomBo bo, PageQuery pageQuery) { |
|||
LambdaQueryWrapper<ManageDevicePayloadCustom> lqw = buildQueryWrapper(bo); |
|||
Page<ManageDevicePayloadCustomVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw); |
|||
return TableDataInfo.build(result); |
|||
} |
|||
|
|||
/** |
|||
* 查询符合条件的设备自定义/第三方载荷信息列表 |
|||
* |
|||
* @param bo 查询条件 |
|||
* @return 设备自定义/第三方载荷信息列表 |
|||
*/ |
|||
@Override |
|||
public List<ManageDevicePayloadCustomVo> queryList(ManageDevicePayloadCustomBo bo) { |
|||
LambdaQueryWrapper<ManageDevicePayloadCustom> lqw = buildQueryWrapper(bo); |
|||
return baseMapper.selectVoList(lqw); |
|||
} |
|||
|
|||
private LambdaQueryWrapper<ManageDevicePayloadCustom> buildQueryWrapper(ManageDevicePayloadCustomBo bo) { |
|||
Map<String, Object> params = bo.getParams(); |
|||
LambdaQueryWrapper<ManageDevicePayloadCustom> 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<Long> ids, Boolean isValid) { |
|||
if(isValid){ |
|||
//TODO 做一些业务上的校验,判断是否需要校验
|
|||
} |
|||
return baseMapper.deleteByIds(ids) > 0; |
|||
} |
|||
} |
|||
@ -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<String, ConcurrentHashMap<String, ConcurrentHashMap<String, MyConcurrentWebSocketSession>> > subs = new ConcurrentHashMap<>();
|
|||
|
|||
// token -> Set<dockSn>
|
|||
private final ConcurrentHashMap<String, Set<String>> tokenToDockSet = new ConcurrentHashMap<>(); |
|||
// token -> sessionId -> session
|
|||
private final ConcurrentHashMap<String, ConcurrentHashMap<String, MyConcurrentWebSocketSession>> tokenSessions = new ConcurrentHashMap<>(); |
|||
|
|||
|
|||
|
|||
private String buildOuterKey(String bizCode, String dockSn) { |
|||
return bizCode + ":" + dockSn; |
|||
} |
|||
|
|||
/** 订阅设备 */ |
|||
public void subscribe(String token, String dockSn, MyConcurrentWebSocketSession session) { |
|||
// 保存用户到redis,案例数据: <onlineuser:eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ, 7CTDM7H00BQ6W3> ,超时: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<String> 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<MyConcurrentWebSocketSession> getSessionsForDock(String dockSn) { |
|||
List<MyConcurrentWebSocketSession> result = new ArrayList<>(); |
|||
for (Map.Entry<String, Set<String>> entry : tokenToDockSet.entrySet()) { |
|||
String token = entry.getKey(); |
|||
Set<String> 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<String, ConcurrentHashMap<String, MyConcurrentWebSocketSession>> 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<MyConcurrentWebSocketSession> getSubscribers(String bizCode) {
|
|||
// var map = subs.get(bizCode);
|
|||
// return map == null ? Collections.emptyList() : map.values();
|
|||
// }
|
|||
} |
|||
@ -0,0 +1,7 @@ |
|||
<?xml version="1.0" encoding="UTF-8" ?> |
|||
<!DOCTYPE mapper |
|||
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" |
|||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
|||
<mapper namespace="org.dromara.sample.manage.mapper.ManageDevicePayloadCustomMapper"> |
|||
|
|||
</mapper> |
|||
@ -0,0 +1,23 @@ |
|||
<?xml version="1.0" encoding="UTF-8" ?> |
|||
<!DOCTYPE mapper |
|||
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" |
|||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
|||
<mapper namespace="org.dromara.sample.wayline.mapper.IWaylineJobMapper"> |
|||
|
|||
|
|||
<select id="getPage" |
|||
resultType="org.dromara.sample.wayline.model.entity.WaylineJobEntity"> |
|||
SELECT |
|||
* |
|||
FROM |
|||
wayline_file wf |
|||
LEFT JOIN wayline_device wd ON wd.wayline_id = wf.wayline_id |
|||
LEFT JOIN manage_device md ON md.device_sn = wd.device_sn |
|||
where 1=1 |
|||
<if test="param.deviceSn != null and param.deviceSn != ''"> |
|||
AND wd.device_sn = #{param.deviceSn} |
|||
</if> |
|||
GROUP BY wf.wayline_id |
|||
</select> |
|||
|
|||
</mapper> |
|||
Loading…
Reference in new issue