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