18339543638 5 miesięcy temu
rodzic
commit
c5afc12cb5
26 zmienionych plików z 973 dodań i 20 usunięć
  1. 6 0
      tr-modules-api/tr-module-system-api/pom.xml
  2. 2 1
      tr-modules-api/tr-module-system-api/src/main/java/cn/tr/module/api/sys/storage/SysStorageApi.java
  3. 38 0
      tr-modules/tr-modeul-airway/src/main/java/cn/tr/module/airway/controller/AliOssController.java
  4. 80 0
      tr-modules/tr-modeul-airway/src/main/java/cn/tr/module/airway/controller/BizDeviceController.java
  5. 80 0
      tr-modules/tr-modeul-airway/src/main/java/cn/tr/module/airway/controller/BizVideoController.java
  6. 37 0
      tr-modules/tr-modeul-airway/src/main/java/cn/tr/module/airway/dto/AliOSSInitiateMultipartUploadDTO.java
  7. 56 0
      tr-modules/tr-modeul-airway/src/main/java/cn/tr/module/airway/dto/BizDeviceDTO.java
  8. 19 0
      tr-modules/tr-modeul-airway/src/main/java/cn/tr/module/airway/dto/BizDeviceQueryDTO.java
  9. 59 0
      tr-modules/tr-modeul-airway/src/main/java/cn/tr/module/airway/dto/BizVideoDTO.java
  10. 19 0
      tr-modules/tr-modeul-airway/src/main/java/cn/tr/module/airway/dto/BizVideoQueryDTO.java
  11. 28 0
      tr-modules/tr-modeul-airway/src/main/java/cn/tr/module/airway/mapper/BizDeviceMapper.java
  12. 28 0
      tr-modules/tr-modeul-airway/src/main/java/cn/tr/module/airway/mapper/BizVideoMapper.java
  13. 60 0
      tr-modules/tr-modeul-airway/src/main/java/cn/tr/module/airway/po/BizDevicePO.java
  14. 67 0
      tr-modules/tr-modeul-airway/src/main/java/cn/tr/module/airway/po/BizVideoPO.java
  15. 16 0
      tr-modules/tr-modeul-airway/src/main/java/cn/tr/module/airway/repository/BizDeviceRepository.java
  16. 16 0
      tr-modules/tr-modeul-airway/src/main/java/cn/tr/module/airway/repository/BizVideoRepository.java
  17. 54 0
      tr-modules/tr-modeul-airway/src/main/java/cn/tr/module/airway/service/IBizDeviceService.java
  18. 62 0
      tr-modules/tr-modeul-airway/src/main/java/cn/tr/module/airway/service/IBizVideoService.java
  19. 92 0
      tr-modules/tr-modeul-airway/src/main/java/cn/tr/module/airway/service/impl/BizDeviceServiceImpl.java
  20. 117 0
      tr-modules/tr-modeul-airway/src/main/java/cn/tr/module/airway/service/impl/BizVideoServiceImpl.java
  21. 5 1
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/provider/SysStorageApiProvider.java
  22. 2 1
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/service/IStorageFileService.java
  23. 12 2
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/service/impl/StorageFileServiceImpl.java
  24. 4 0
      tr-plugins/tr-spring-boot-starter-plugin-file/src/main/java/cn/tr/plugin/file/config/FileClient.java
  25. 12 0
      tr-plugins/tr-spring-boot-starter-plugin-file/src/main/java/cn/tr/plugin/file/config/ali/AliFileClient.java
  26. 2 15
      tr-test/src/main/resources/application-dev.yml

+ 6 - 0
tr-modules-api/tr-module-system-api/pom.xml

@@ -17,6 +17,12 @@
             <artifactId>tr-framework</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>cn.tr</groupId>
+            <artifactId>tr-spring-boot-starter-plugin-doc</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
     </dependencies>
 
 </project>

+ 2 - 1
tr-modules-api/tr-module-system-api/src/main/java/cn/tr/module/api/sys/storage/SysStorageApi.java

@@ -2,7 +2,6 @@ package cn.tr.module.api.sys.storage;
 
 import java.util.Collection;
 import java.util.Map;
-import java.util.concurrent.TimeUnit;
 
 /**
  * @ClassName : SysStorageApi
@@ -50,4 +49,6 @@ public interface SysStorageApi {
      * @return
      */
     Map<String,StoragePojo> findStorage(Collection<String> storageIds);
+
+    String generationInitiateMultipartUpload(String filename);
 }

+ 38 - 0
tr-modules/tr-modeul-airway/src/main/java/cn/tr/module/airway/controller/AliOssController.java

@@ -0,0 +1,38 @@
+package cn.tr.module.airway.controller;
+
+import cn.dev33.satoken.annotation.SaIgnore;
+import cn.tr.core.pojo.CommonResult;
+import cn.tr.module.airway.dto.AliOSSInitiateMultipartUploadDTO;
+import cn.tr.module.airway.service.IBizVideoService;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @ClassName : 阿里云OSS操作接口
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年05月10日
+ */
+@Api(tags = "阿里云OSS影像相关操作接口")
+@RestController
+@RequestMapping("/ali/oss")
+@AllArgsConstructor
+public class AliOssController {
+    private final IBizVideoService videoService;
+    @ApiOperationSupport(author = "lf",order = 1)
+    @PostMapping("/initiateMultipartUpload")
+    @ApiOperation( value = "影像分片上传初始化接口",notes = "权限:无")
+    @SaIgnore
+    public CommonResult<String> initiateMultipartUpload(@RequestBody@Validated AliOSSInitiateMultipartUploadDTO source) throws Exception {
+        //todo 检验签名
+
+        //todo 解析签名
+
+        //todo 生成预上传链接
+        return CommonResult.success(videoService.generationInitiateMultipartUpload(source));
+    }
+}

+ 80 - 0
tr-modules/tr-modeul-airway/src/main/java/cn/tr/module/airway/controller/BizDeviceController.java

@@ -0,0 +1,80 @@
+package cn.tr.module.airway.controller;
+
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.tr.core.validation.Insert;
+import cn.tr.core.validation.Update;
+import cn.tr.core.pojo.CommonResult;
+import lombok.AllArgsConstructor;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+import cn.tr.module.airway.dto.BizDeviceDTO;
+import cn.tr.module.airway.service.IBizDeviceService;
+import cn.tr.module.airway.dto.BizDeviceQueryDTO;
+import java.util.*;
+import cn.tr.plugin.mybatis.base.BaseController;
+import org.springframework.web.bind.annotation.*;
+import cn.tr.module.api.sys.log.annotation.OperateLog;
+import cn.tr.core.pojo.TableDataInfo;
+/**
+ * 安卓设备控制器
+ *
+ * @author lf
+ * @date  2025/06/30 13:36
+ */
+@Api(tags = "安卓设备")
+@RestController
+@RequestMapping("/airway/device")
+@AllArgsConstructor
+public class BizDeviceController extends BaseController{
+
+    private final IBizDeviceService bizDeviceService;
+
+    @ApiOperationSupport(author = "lf",order = 1)
+    @ApiOperation(value="根据条件查询安卓设备",notes = "权限: 无")
+    @PostMapping("/query/page")
+    public TableDataInfo<BizDeviceDTO> selectList(@RequestBody BizDeviceQueryDTO query) {
+        startPage();
+        return getDataTable(bizDeviceService.selectBizDeviceList(query));
+    }
+
+    @ApiOperationSupport(author = "lf",order = 2)
+    @ApiOperation(value = "根据id查询安卓设备",notes = "权限: airway:device:query")
+    @GetMapping("/detail/{id}")
+    @SaCheckPermission("airway:device:query")
+    public CommonResult<BizDeviceDTO> findById(@PathVariable("id") String id){
+        return CommonResult.success(bizDeviceService.selectBizDeviceById(id));
+    }
+
+    @ApiOperationSupport(author = "lf",order = 3)
+    @ApiOperation(value="添加安卓设备",notes = "权限: airway:device:add")
+    @PostMapping("/add")
+    @OperateLog
+    @SaCheckPermission("airway:device:add")
+    public CommonResult<Boolean> add(@RequestBody@Validated(Insert.class) BizDeviceDTO source) {
+        return CommonResult.success(bizDeviceService.insertBizDevice(source));
+    }
+
+    @ApiOperationSupport(author = "lf",order = 4)
+    @ApiOperation(value="通过主键id编辑安卓设备",notes = "权限: airway:device:edit")
+    @PostMapping("/edit")
+    @OperateLog
+    @SaCheckPermission("airway:device:edit")
+    public CommonResult<Boolean> edit(@RequestBody@Validated(Update.class) BizDeviceDTO source) {
+        return CommonResult.success(bizDeviceService.updateBizDeviceById(source));
+    }
+
+    @ApiOperationSupport(author = "lf",order = 5)
+    @ApiOperation(value="删除安卓设备",notes = "权限: airway:device:remove")
+    @PostMapping("/removeByIds")
+    @OperateLog
+    @SaCheckPermission("airway:device:remove")
+    public CommonResult<Integer> delete(@RequestBody Collection<String> ids) {
+        return CommonResult.success(bizDeviceService.removeBizDeviceByIds(ids));
+    }
+}

+ 80 - 0
tr-modules/tr-modeul-airway/src/main/java/cn/tr/module/airway/controller/BizVideoController.java

@@ -0,0 +1,80 @@
+package cn.tr.module.airway.controller;
+
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.tr.core.validation.Insert;
+import cn.tr.core.validation.Update;
+import cn.tr.core.pojo.CommonResult;
+import lombok.AllArgsConstructor;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+import cn.tr.module.airway.dto.BizVideoDTO;
+import cn.tr.module.airway.service.IBizVideoService;
+import cn.tr.module.airway.dto.BizVideoQueryDTO;
+import java.util.*;
+import cn.tr.plugin.mybatis.base.BaseController;
+import org.springframework.web.bind.annotation.*;
+import cn.tr.module.api.sys.log.annotation.OperateLog;
+import cn.tr.core.pojo.TableDataInfo;
+/**
+ * 影像视频控制器
+ *
+ * @author lf
+ * @date  2025/06/30 13:43
+ */
+@Api(tags = "影像视频")
+@RestController
+@RequestMapping("/airway/video")
+@AllArgsConstructor
+public class BizVideoController extends BaseController{
+
+    private final IBizVideoService bizVideoService;
+
+    @ApiOperationSupport(author = "lf",order = 1)
+    @ApiOperation(value="根据条件查询影像视频",notes = "权限: 无")
+    @PostMapping("/query/page")
+    public TableDataInfo<BizVideoDTO> selectList(@RequestBody BizVideoQueryDTO query) {
+        startPage();
+        return getDataTable(bizVideoService.selectBizVideoList(query));
+    }
+
+    @ApiOperationSupport(author = "lf",order = 2)
+    @ApiOperation(value = "根据id查询影像视频",notes = "权限: airway:video:query")
+    @GetMapping("/detail/{id}")
+    @SaCheckPermission("airway:video:query")
+    public CommonResult<BizVideoDTO> findById(@PathVariable("id") String id){
+        return CommonResult.success(bizVideoService.selectBizVideoById(id));
+    }
+
+    @ApiOperationSupport(author = "lf",order = 3)
+    @ApiOperation(value="添加影像视频",notes = "权限: airway:video:add")
+    @PostMapping("/add")
+    @OperateLog
+    @SaCheckPermission("airway:video:add")
+    public CommonResult<Boolean> add(@RequestBody@Validated(Insert.class) BizVideoDTO source) {
+        return CommonResult.success(bizVideoService.insertBizVideo(source));
+    }
+
+    @ApiOperationSupport(author = "lf",order = 4)
+    @ApiOperation(value="通过主键id编辑影像视频",notes = "权限: airway:video:edit")
+    @PostMapping("/edit")
+    @OperateLog
+    @SaCheckPermission("airway:video:edit")
+    public CommonResult<Boolean> edit(@RequestBody@Validated(Update.class) BizVideoDTO source) {
+        return CommonResult.success(bizVideoService.updateBizVideoById(source));
+    }
+
+    @ApiOperationSupport(author = "lf",order = 5)
+    @ApiOperation(value="删除影像视频",notes = "权限: airway:video:remove")
+    @PostMapping("/removeByIds")
+    @OperateLog
+    @SaCheckPermission("airway:video:remove")
+    public CommonResult<Integer> delete(@RequestBody Collection<String> ids) {
+        return CommonResult.success(bizVideoService.removeBizVideoByIds(ids));
+    }
+}

+ 37 - 0
tr-modules/tr-modeul-airway/src/main/java/cn/tr/module/airway/dto/AliOSSInitiateMultipartUploadDTO.java

@@ -0,0 +1,37 @@
+package cn.tr.module.airway.dto;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+@Data
+@ApiModel("阿里云分片上传初始化接受对象")
+public class AliOSSInitiateMultipartUploadDTO {
+    @ApiModelProperty(value = "医院编码",required = true)
+    @NotBlank(message = "医院编码不能为空")
+    private String hospitalCode;
+
+    @ApiModelProperty(value = "设备唯一编码",required = true)
+    @NotBlank(message = "设备唯一编码不能为空")
+    private String deviceCode;
+
+    @ApiModelProperty(value = "文件名称",required = true)
+    @NotBlank(message = "文件名称不能为空")
+    private String filename;
+
+    @ApiModelProperty(value = "文件大小",required = true)
+    @NotNull(message = "文件大小不能为空")
+    private Integer filesize;
+
+    @ApiModelProperty(value = "文件内容md5值",required = true)
+    @NotBlank(message = "文件内容md5值不能为空")
+    private String contentMd5;
+
+    @ApiModelProperty(value = "医院id",hidden = true)
+    @JsonIgnore
+    private String hospitalId;
+}

+ 56 - 0
tr-modules/tr-modeul-airway/src/main/java/cn/tr/module/airway/dto/BizDeviceDTO.java

@@ -0,0 +1,56 @@
+package cn.tr.module.airway.dto;
+
+import cn.tr.plugin.mybatis.pojo.BaseDTO;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import cn.tr.core.validation.Insert;
+import cn.tr.core.validation.Update;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import javax.validation.constraints.*;
+import java.util.*;
+/**
+ * 安卓设备传输对象
+ *
+ * @author lf
+ * @date  2025/06/30 13:36
+ **/
+@Data
+@ApiModel("安卓设备传输对象")
+@EqualsAndHashCode(callSuper = true)
+@ToString
+public class BizDeviceDTO extends BaseDTO  {
+    private static final long serialVersionUID = 1L;
+    @ApiModelProperty(value = "id", position = 1)
+     @NotBlank  (message = "主键不能为空",groups = {Update.class})
+    private String id;
+
+    @ApiModelProperty(value = "设备唯一标识", position = 2)
+    private String deviceCode;
+
+    @ApiModelProperty(value = "安卓版本号", position = 3)
+    private String androidType;
+
+    @ApiModelProperty(value = "气道软件版本号", position = 4)
+    private String airwayType;
+
+    @ApiModelProperty(value = "设备型号", position = 5)
+    private String deviceType;
+
+    @ApiModelProperty(value = "经度", position = 6)
+    private String latitude;
+
+    @ApiModelProperty(value = "维度", position = 7)
+    private String longtitude;
+
+    @ApiModelProperty(value = "设备别名", position = 8)
+    private String alias;
+
+    @ApiModelProperty(value = "备注", position = 9)
+    private String remark;
+
+    @ApiModelProperty(value = "上传文件数量", position = 15)
+    private Integer count;
+
+}

+ 19 - 0
tr-modules/tr-modeul-airway/src/main/java/cn/tr/module/airway/dto/BizDeviceQueryDTO.java

@@ -0,0 +1,19 @@
+package cn.tr.module.airway.dto;
+
+import lombok.ToString;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.util.*;
+/**
+ * 安卓设备查询参数
+ *
+ * @author lf
+ * @date  2025/06/30 13:36
+ **/
+@Data
+@ApiModel("安卓设备查询参数")
+@ToString
+public class BizDeviceQueryDTO  {
+    private static final long serialVersionUID = 1L;
+}

+ 59 - 0
tr-modules/tr-modeul-airway/src/main/java/cn/tr/module/airway/dto/BizVideoDTO.java

@@ -0,0 +1,59 @@
+package cn.tr.module.airway.dto;
+
+import cn.tr.plugin.mybatis.pojo.BaseDTO;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import cn.tr.core.validation.Insert;
+import cn.tr.core.validation.Update;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import javax.validation.constraints.*;
+import java.util.*;
+/**
+ * 影像视频传输对象
+ *
+ * @author lf
+ * @date  2025/06/30 13:43
+ **/
+@Data
+@ApiModel("影像视频传输对象")
+@EqualsAndHashCode(callSuper = true)
+@ToString
+public class BizVideoDTO extends BaseDTO  {
+    private static final long serialVersionUID = 1L;
+    @ApiModelProperty(value = "id", position = 1)
+     @NotBlank  (message = "主键不能为空",groups = {Update.class})
+    private String id;
+
+    @ApiModelProperty(value = "文件名称", position = 2)
+    private String filename;
+
+    @ApiModelProperty(value = "文件大小", position = 3)
+    private Integer filesize;
+
+    @ApiModelProperty(value = "文件后缀", position = 4)
+    private String suffix;
+
+    @ApiModelProperty(value = "文件完整路径", position = 5)
+    private String absolutePath;
+
+    @ApiModelProperty(value = "设备编码", position = 6)
+    private String deviceCode;
+
+    @ApiModelProperty(value = "开始上传时间", position = 7)
+    private Date startTime;
+
+    @ApiModelProperty(value = "状态", position = 8)
+    private String status;
+
+    @ApiModelProperty(value = "结束上传时间", position = 9)
+    private Date endTime;
+
+    @ApiModelProperty(value = "文件的MD5值", position = 10)
+    private String contentMd5;
+
+    @ApiModelProperty(value = "分片上传id", position = 11)
+    private String uploadId;
+
+}

+ 19 - 0
tr-modules/tr-modeul-airway/src/main/java/cn/tr/module/airway/dto/BizVideoQueryDTO.java

@@ -0,0 +1,19 @@
+package cn.tr.module.airway.dto;
+
+import lombok.ToString;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.util.*;
+/**
+ * 影像视频查询参数
+ *
+ * @author lf
+ * @date  2025/06/30 13:43
+ **/
+@Data
+@ApiModel("影像视频查询参数")
+@ToString
+public class BizVideoQueryDTO  {
+    private static final long serialVersionUID = 1L;
+}

+ 28 - 0
tr-modules/tr-modeul-airway/src/main/java/cn/tr/module/airway/mapper/BizDeviceMapper.java

@@ -0,0 +1,28 @@
+package cn.tr.module.airway.mapper;
+
+import cn.tr.module.airway.po.BizDevicePO;
+import cn.tr.module.airway.dto.BizDeviceDTO;
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+import java.util.List;
+
+/**
+* 安卓设备映射工具
+*
+* @author lf
+* @date  2025/06/30 13:36
+**/
+@Mapper
+public interface BizDeviceMapper {
+    BizDeviceMapper INSTANCE = Mappers.getMapper(BizDeviceMapper.class);
+
+    BizDevicePO convertPO(BizDeviceDTO source);
+
+    BizDeviceDTO convertDto(BizDevicePO source);
+
+    List<BizDeviceDTO> convertDtoList(List<BizDevicePO> source);
+
+    List<BizDevicePO> convertPOList(List<BizDeviceDTO> source);
+
+}

+ 28 - 0
tr-modules/tr-modeul-airway/src/main/java/cn/tr/module/airway/mapper/BizVideoMapper.java

@@ -0,0 +1,28 @@
+package cn.tr.module.airway.mapper;
+
+import cn.tr.module.airway.po.BizVideoPO;
+import cn.tr.module.airway.dto.BizVideoDTO;
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+import java.util.List;
+
+/**
+* 影像视频映射工具
+*
+* @author lf
+* @date  2025/06/30 13:43
+**/
+@Mapper
+public interface BizVideoMapper {
+    BizVideoMapper INSTANCE = Mappers.getMapper(BizVideoMapper.class);
+
+    BizVideoPO convertPO(BizVideoDTO source);
+
+    BizVideoDTO convertDto(BizVideoPO source);
+
+    List<BizVideoDTO> convertDtoList(List<BizVideoPO> source);
+
+    List<BizVideoPO> convertPOList(List<BizVideoDTO> source);
+
+}

+ 60 - 0
tr-modules/tr-modeul-airway/src/main/java/cn/tr/module/airway/po/BizDevicePO.java

@@ -0,0 +1,60 @@
+package cn.tr.module.airway.po;
+
+import cn.tr.plugin.mybatis.pojo.TenantPO;   
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import java.util.*;
+/**
+ * 安卓设备实体
+ *
+ * @author lf
+ * @date  2025/06/30 13:36
+ **/
+@Data
+@TableName(value="biz_device",autoResultMap = true)
+@EqualsAndHashCode(callSuper = true)
+@ToString
+public class BizDevicePO extends TenantPO {
+
+    /** id */
+    @TableId
+    @ApiModelProperty(value = "id", position = 1)
+    private String id;
+
+    /** 设备唯一标识 */
+    @ApiModelProperty(value = "设备唯一标识", position = 2)
+    private String deviceCode;
+
+    /** 安卓版本号 */
+    @ApiModelProperty(value = "安卓版本号", position = 3)
+    private String androidType;
+
+    /** 气道软件版本号 */
+    @ApiModelProperty(value = "气道软件版本号", position = 4)
+    private String airwayType;
+
+    /** 设备型号 */
+    @ApiModelProperty(value = "设备型号", position = 5)
+    private String deviceType;
+
+    /** 经度 */
+    @ApiModelProperty(value = "经度", position = 6)
+    private String latitude;
+
+    /** 维度 */
+    @ApiModelProperty(value = "维度", position = 7)
+    private String longtitude;
+
+    /** 设备别名 */
+    @ApiModelProperty(value = "设备别名", position = 8)
+    private String alias;
+
+    /** 备注 */
+    @ApiModelProperty(value = "备注", position = 9)
+    private String remark;
+
+}

+ 67 - 0
tr-modules/tr-modeul-airway/src/main/java/cn/tr/module/airway/po/BizVideoPO.java

@@ -0,0 +1,67 @@
+package cn.tr.module.airway.po;
+
+import cn.tr.plugin.mybatis.pojo.TenantPO;   
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import java.util.*;
+/**
+ * 影像视频实体
+ *
+ * @author lf
+ * @date  2025/06/30 13:43
+ **/
+@Data
+@TableName(value="biz_video",autoResultMap = true)
+@EqualsAndHashCode(callSuper = true)
+@ToString
+public class BizVideoPO extends TenantPO {
+
+    /** id */
+    @TableId
+    @ApiModelProperty(value = "id", position = 1)
+    private String id;
+
+    /** 文件名称 */
+    @ApiModelProperty(value = "文件名称", position = 2)
+    private String filename;
+
+    /** 文件大小 */
+    @ApiModelProperty(value = "文件大小", position = 3)
+    private Integer filesize;
+
+    /** 文件后缀 */
+    @ApiModelProperty(value = "文件后缀", position = 4)
+    private String suffix;
+
+    /** 文件完整路径 */
+    @ApiModelProperty(value = "文件完整路径", position = 5)
+    private String absolutePath;
+
+    /** 设备编码 */
+    @ApiModelProperty(value = "设备编码", position = 6)
+    private String deviceCode;
+
+    /** 开始上传时间 */
+    @ApiModelProperty(value = "开始上传时间", position = 7)
+    private Date startTime;
+
+    /** 状态 */
+    @ApiModelProperty(value = "状态", position = 8)
+    private String status;
+
+    /** 结束上传时间 */
+    @ApiModelProperty(value = "结束上传时间", position = 9)
+    private Date endTime;
+
+    /** 文件的MD5值 */
+    @ApiModelProperty(value = "文件的MD5值", position = 10)
+    private String contentMd5;
+
+    /** 分片上传id */
+    @ApiModelProperty(value = "分片上传id", position = 11)
+    private String uploadId;
+}

+ 16 - 0
tr-modules/tr-modeul-airway/src/main/java/cn/tr/module/airway/repository/BizDeviceRepository.java

@@ -0,0 +1,16 @@
+package cn.tr.module.airway.repository;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+import cn.tr.module.airway.po.BizDevicePO;
+/**
+ * 安卓设备Mapper接口
+ *
+ * @author lf
+ * @date  2025/06/30 13:36
+ **/
+@Repository
+@Mapper
+public interface BizDeviceRepository extends BaseMapper<BizDevicePO> {
+}

+ 16 - 0
tr-modules/tr-modeul-airway/src/main/java/cn/tr/module/airway/repository/BizVideoRepository.java

@@ -0,0 +1,16 @@
+package cn.tr.module.airway.repository;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+import cn.tr.module.airway.po.BizVideoPO;
+/**
+ * 影像视频Mapper接口
+ *
+ * @author lf
+ * @date  2025/06/30 13:43
+ **/
+@Repository
+@Mapper
+public interface BizVideoRepository extends BaseMapper<BizVideoPO> {
+}

+ 54 - 0
tr-modules/tr-modeul-airway/src/main/java/cn/tr/module/airway/service/IBizDeviceService.java

@@ -0,0 +1,54 @@
+package cn.tr.module.airway.service;
+
+import cn.tr.module.airway.dto.BizDeviceDTO;
+import cn.tr.module.airway.dto.BizDeviceQueryDTO;
+import java.util.*;
+
+/**
+ * 安卓设备Service接口
+ *
+ * @author lf
+ * @date  2025/06/30 13:36
+ **/
+public interface IBizDeviceService{
+
+    /**
+     * 根据条件查询安卓设备
+     * @param    query 查询参数
+     * @author   lf
+     * @date      2025/06/30 13:36
+     */
+    List<BizDeviceDTO> selectBizDeviceList(BizDeviceQueryDTO query);
+
+    /**
+     * 根据id查询安卓设备
+     * @param    id 主键id
+     * @author   lf
+     * @date      2025/06/30 13:36
+     */
+    BizDeviceDTO selectBizDeviceById(String id);
+
+    /**
+     * 编辑安卓设备
+     * @param   source 编辑实体类
+     * @author  lf
+     * @date     2025/06/30 13:36
+     */
+    boolean updateBizDeviceById(BizDeviceDTO source);
+
+    /**
+     * 新增安卓设备
+     * @param   source 新增实体类
+     * @author lf
+     * @date  2025/06/30 13:36
+     */
+    boolean insertBizDevice(BizDeviceDTO source);
+
+    /**
+     * 删除安卓设备详情
+     * @param  ids 删除主键集合
+     * @author lf
+     * @date    2025/06/30 13:36
+     */
+    int removeBizDeviceByIds(Collection<String> ids);
+}

+ 62 - 0
tr-modules/tr-modeul-airway/src/main/java/cn/tr/module/airway/service/IBizVideoService.java

@@ -0,0 +1,62 @@
+package cn.tr.module.airway.service;
+
+import cn.tr.module.airway.dto.AliOSSInitiateMultipartUploadDTO;
+import cn.tr.module.airway.dto.BizVideoDTO;
+import cn.tr.module.airway.dto.BizVideoQueryDTO;
+
+import java.util.*;
+
+/**
+ * 影像视频Service接口
+ *
+ * @author lf
+ * @date  2025/06/30 13:43
+ **/
+public interface IBizVideoService{
+
+    /**
+     * 根据条件查询影像视频
+     * @param    query 查询参数
+     * @author   lf
+     * @date      2025/06/30 13:43
+     */
+    List<BizVideoDTO> selectBizVideoList(BizVideoQueryDTO query);
+
+    /**
+     * 根据id查询影像视频
+     * @param    id 主键id
+     * @author   lf
+     * @date      2025/06/30 13:43
+     */
+    BizVideoDTO selectBizVideoById(String id);
+
+    /**
+     * 编辑影像视频
+     * @param   source 编辑实体类
+     * @author  lf
+     * @date     2025/06/30 13:43
+     */
+    boolean updateBizVideoById(BizVideoDTO source);
+
+    /**
+     * 新增影像视频
+     * @param   source 新增实体类
+     * @author lf
+     * @date  2025/06/30 13:43
+     */
+    boolean insertBizVideo(BizVideoDTO source);
+
+    /**
+     * 删除影像视频详情
+     * @param  ids 删除主键集合
+     * @author lf
+     * @date    2025/06/30 13:43
+     */
+    int removeBizVideoByIds(Collection<String> ids);
+
+    /**
+     * 生成分片上传初始化接口
+     * @param source
+     */
+    String generationInitiateMultipartUpload(AliOSSInitiateMultipartUploadDTO source);
+}

+ 92 - 0
tr-modules/tr-modeul-airway/src/main/java/cn/tr/module/airway/service/impl/BizDeviceServiceImpl.java

@@ -0,0 +1,92 @@
+package cn.tr.module.airway.service.impl;
+
+import cn.tr.core.exception.TRExcCode;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import cn.hutool.core.collection.CollectionUtil;
+import org.springframework.transaction.annotation.Transactional;
+import cn.tr.core.exception.ServiceException;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import cn.tr.module.airway.repository.BizDeviceRepository;
+import cn.tr.module.airway.po.BizDevicePO;
+import cn.tr.module.airway.dto.BizDeviceDTO;
+import cn.tr.module.airway.dto.BizDeviceQueryDTO;
+import java.util.*;
+import cn.tr.module.airway.service.IBizDeviceService;
+import cn.tr.module.airway.mapper.BizDeviceMapper;
+/**
+ * 安卓设备Service接口实现类
+ *
+ * @author lf
+ * @date  2025/06/30 13:36
+ **/
+@Service
+public class BizDeviceServiceImpl implements IBizDeviceService {
+    @Autowired
+    private BizDeviceRepository baseRepository;
+
+
+    /**
+    * 根据条件查询安卓设备
+    * @param    query 查询参数
+    * @author   lf
+    * @date      2025/06/30 13:36
+    */
+    @Override
+    public List<BizDeviceDTO> selectBizDeviceList(BizDeviceQueryDTO query){
+        return BizDeviceMapper.INSTANCE.convertDtoList(
+                baseRepository.selectList(new LambdaQueryWrapper<BizDevicePO>()
+                )
+        );
+    };
+
+    /**
+    * 根据id查询安卓设备
+    * @param    id 主键id
+    * @author   lf
+    * @date      2025/06/30 13:36
+    */
+    @Override
+    public BizDeviceDTO selectBizDeviceById(String id){
+        return BizDeviceMapper.INSTANCE.convertDto(baseRepository.selectById(id));
+    };
+
+    /**
+    * 编辑安卓设备
+    * @param   source 编辑实体类
+    * @author  lf
+    * @date     2025/06/30 13:36
+    */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public boolean updateBizDeviceById(BizDeviceDTO source){
+            return baseRepository.updateById(BizDeviceMapper.INSTANCE.convertPO(source))!=0;
+    };
+
+    /**
+    * 新增安卓设备
+    * @param   source 新增实体类
+    * @author lf
+    * @date  2025/06/30 13:36
+    */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean insertBizDevice(BizDeviceDTO source){
+        return baseRepository.insert(BizDeviceMapper.INSTANCE.convertPO(source))!=0;
+    };
+
+    /**
+    * 删除安卓设备详情
+    * @param  ids 删除主键集合
+    * @author lf
+    * @date    2025/06/30 13:36
+    */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int removeBizDeviceByIds(Collection<String> ids){
+        if(CollectionUtil.isEmpty(ids)){
+            throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001,"请选择要删除的数据");
+        }
+        return baseRepository.deleteBatchIds(ids);
+    };
+}

+ 117 - 0
tr-modules/tr-modeul-airway/src/main/java/cn/tr/module/airway/service/impl/BizVideoServiceImpl.java

@@ -0,0 +1,117 @@
+package cn.tr.module.airway.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import cn.tr.core.exception.TRExcCode;
+import cn.tr.module.airway.dto.AliOSSInitiateMultipartUploadDTO;
+import cn.tr.module.api.sys.storage.SysStorageApi;
+import cn.tr.module.api.sys.tenant.SysTenantApi;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import cn.hutool.core.collection.CollectionUtil;
+import org.springframework.transaction.annotation.Transactional;
+import cn.tr.core.exception.ServiceException;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import cn.tr.module.airway.repository.BizVideoRepository;
+import cn.tr.module.airway.po.BizVideoPO;
+import cn.tr.module.airway.dto.BizVideoDTO;
+import cn.tr.module.airway.dto.BizVideoQueryDTO;
+import java.util.*;
+import cn.tr.module.airway.service.IBizVideoService;
+import cn.tr.module.airway.mapper.BizVideoMapper;
+/**
+ * 影像视频Service接口实现类
+ *
+ * @author lf
+ * @date  2025/06/30 13:43
+ **/
+@Service
+public class BizVideoServiceImpl implements IBizVideoService {
+    @Autowired
+    private BizVideoRepository baseRepository;
+
+    @Autowired
+    private SysTenantApi sysTenantApi;
+
+    @Autowired
+    private SysStorageApi storageApi;
+    /**
+    * 根据条件查询影像视频
+    * @param    query 查询参数
+    * @author   lf
+    * @date      2025/06/30 13:43
+    */
+    @Override
+    public List<BizVideoDTO> selectBizVideoList(BizVideoQueryDTO query){
+        return BizVideoMapper.INSTANCE.convertDtoList(
+                baseRepository.selectList(new LambdaQueryWrapper<BizVideoPO>()
+                )
+        );
+    };
+
+    /**
+    * 根据id查询影像视频
+    * @param    id 主键id
+    * @author   lf
+    * @date      2025/06/30 13:43
+    */
+    @Override
+    public BizVideoDTO selectBizVideoById(String id){
+        return BizVideoMapper.INSTANCE.convertDto(baseRepository.selectById(id));
+    };
+
+    /**
+    * 编辑影像视频
+    * @param   source 编辑实体类
+    * @author  lf
+    * @date     2025/06/30 13:43
+    */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public boolean updateBizVideoById(BizVideoDTO source){
+            return baseRepository.updateById(BizVideoMapper.INSTANCE.convertPO(source))!=0;
+    };
+
+    /**
+    * 新增影像视频
+    * @param   source 新增实体类
+    * @author lf
+    * @date  2025/06/30 13:43
+    */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean insertBizVideo(BizVideoDTO source){
+        return baseRepository.insert(BizVideoMapper.INSTANCE.convertPO(source))!=0;
+    };
+
+    /**
+    * 删除影像视频详情
+    * @param  ids 删除主键集合
+    * @author lf
+    * @date    2025/06/30 13:43
+    */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int removeBizVideoByIds(Collection<String> ids){
+        if(CollectionUtil.isEmpty(ids)){
+            throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001,"请选择要删除的数据");
+        }
+        return baseRepository.deleteBatchIds(ids);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public String generationInitiateMultipartUpload(AliOSSInitiateMultipartUploadDTO source) {
+        BizVideoPO videoPo = baseRepository.selectOne(new LambdaQueryWrapper<BizVideoPO>()
+                .eq(BizVideoPO::getContentMd5, source.getContentMd5())
+                .eq(BizVideoPO::getDeviceCode, source.getDeviceCode())
+                .eq(BizVideoPO::getTenantId, source.getHospitalId())
+                .last("limit 1"));
+        if(ObjectUtil.isNotNull(videoPo)){
+            return videoPo.getUploadId();
+        }
+        videoPo = new BizVideoPO();
+        baseRepository.insert(videoPo);
+        String filename=source.getHospitalCode()+"/"+source.getDeviceCode()+"/"+source.getFilename();
+        return storageApi.generationInitiateMultipartUpload(filename);
+    }
+}

+ 5 - 1
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/provider/SysStorageApiProvider.java

@@ -3,7 +3,6 @@ package cn.tr.module.sys.storage.provider;
 import cn.tr.module.api.sys.storage.StoragePojo;
 import cn.tr.module.api.sys.storage.SysStorageApi;
 import cn.tr.module.sys.storage.service.IStorageFileService;
-import lombok.AllArgsConstructor;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cache.annotation.CacheEvict;
 import org.springframework.cache.annotation.Cacheable;
@@ -49,6 +48,11 @@ public class SysStorageApiProvider implements SysStorageApi {
         return storageFileService.findStorageByIds(storageIds);
     }
 
+    @Override
+    public String generationInitiateMultipartUpload(String filename) {
+        return storageFileService.generationInitiateMultipartUpload(filename);
+    }
+
     @CacheEvict(key = "#recordId",value = "global:storage")
     public void delCache(String recordId){
 

+ 2 - 1
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/service/IStorageFileService.java

@@ -4,7 +4,6 @@ package cn.tr.module.sys.storage.service;
 import cn.tr.module.api.sys.storage.StoragePojo;
 import cn.tr.module.sys.storage.dto.SysStorageRecordDTO;
 
-import javax.annotation.PostConstruct;
 import java.util.*;
 
 /**
@@ -68,4 +67,6 @@ public interface IStorageFileService {
      * @return
      */
     String generationPreUploadUrl(String fileName);
+
+    String generationInitiateMultipartUpload(String filename);
 }

+ 12 - 2
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/service/impl/StorageFileServiceImpl.java

@@ -2,11 +2,9 @@ package cn.tr.module.sys.storage.service.impl;
 
 import cn.hutool.core.codec.Base64;
 import cn.hutool.core.collection.CollectionUtil;
-import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.io.FileUtil;
 import cn.hutool.core.map.MapUtil;
 import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.core.util.RandomUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.core.util.URLUtil;
 import cn.tr.core.exception.ServiceException;
@@ -188,6 +186,18 @@ public class StorageFileServiceImpl implements IStorageFileService {
         return preUploadUrl;
     }
 
+    /**
+     * todd
+     * @param filename
+     * @return
+     */
+    @Override
+    public String generationInitiateMultipartUpload(String filename) {
+        String configId=defaultConfig.getId();
+        FileClient fileClient = getClient(configId);
+        return fileClient.generationInitiateMultipartUpload(filename);
+    }
+
 
     private FileClient getClient(String id){
         FileClient fileClient = fileClientFactory.getFileClient(id);

+ 4 - 0
tr-plugins/tr-spring-boot-starter-plugin-file/src/main/java/cn/tr/plugin/file/config/FileClient.java

@@ -59,4 +59,8 @@ public interface FileClient {
     default String generationPreUploadUrl(String fileName){
         throw new UnsupportedOperationException("当前存储方式不支持该操作");
     };
+
+    default String generationInitiateMultipartUpload(String filename){
+        throw new UnsupportedOperationException("当前存储方式不支持该操作");
+    };
 }

+ 12 - 0
tr-plugins/tr-spring-boot-starter-plugin-file/src/main/java/cn/tr/plugin/file/config/ali/AliFileClient.java

@@ -102,4 +102,16 @@ public class AliFileClient extends AbstractFileClient<AliFileClientConfig> {
         URL url= ossClient.generatePresignedUrl(request);
         return url.toString();
     }
+
+    @Override
+    public String generationInitiateMultipartUpload(String filename) {
+        String bizPath=parseBizPath(filename);
+        // 使用FileClient获取实际的OSS客户端和相关配置
+        // 构造请求对象
+        InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(this.getConfig().getAliBucketName(), bizPath);
+        // 发起请求并获取结果
+        InitiateMultipartUploadResult result = ossClient.initiateMultipartUpload(request);
+        // 构造返回值
+        return result.getUploadId();
+    }
 }

+ 2 - 15
tr-test/src/main/resources/application-dev.yml

@@ -13,7 +13,7 @@ spring:
     # 端口,默认为6379
     port: 9736
     # 数据库索引
-    database: 3
+    database: 4
     # 密码
     password: 6E6985E1F7CB40F24A\.
     # 连接超时时间
@@ -27,17 +27,4 @@ spring:
         # 连接池的最大数据库连接数
         max-active: 16
         # #连接池最大阻塞等待时间(使用负值表示没有限制)
-        max-wait: -1ms
-  rabbitmq:
-    host: 192.168.100.32
-    port: 5672
-    username: guest
-    password: guest
-wx:
-  miniapp:
-    configs:
-      - appid: wxb8924b124a426c1b  #微信小程序的appid
-        secret: 90bbf63f5d88e3c2c443de105dd94fd5  #微信小程序的Secret
-        token: smart #微信小程序消息服务器配置的token
-        aesKey: 4ywJtjRvvpFONIVN8GxPhSpi2eQraoIDZgUwn8Jmm2C #微信小程序消息服务器配置的EncodingAESKey
-        msgDataFormat: JSON
+        max-wait: -1ms