Sfoglia il codice sorgente

计量器具及证书字段调整

Zimo 1 settimana fa
parent
commit
5c37bb9a0e
27 ha cambiato i file con 1587 aggiunte e 4 eliminazioni
  1. 1 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/IotTreeController.java
  2. 157 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/qhse/file/QhseFileTreeController.java
  3. 153 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/qhse/file/QhseInfoController.java
  4. 52 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/qhse/file/vo/QhseFileTreePageReqVO.java
  5. 63 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/qhse/file/vo/QhseFileTreeRespVO.java
  6. 47 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/qhse/file/vo/QhseFileTreeSaveReqVO.java
  7. 54 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/qhse/file/vo/QhseInfoPageReqVO.java
  8. 64 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/qhse/file/vo/QhseInfoRespVO.java
  9. 49 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/qhse/file/vo/QhseInfoSaveReqVO.java
  10. 5 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/qhse/measure/vo/IotMeasureBookPageReqVO.java
  11. 5 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/qhse/measure/vo/IotMeasureBookRespVO.java
  12. 6 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/qhse/measure/vo/IotMeasureBookSaveReqVO.java
  13. 6 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/qhse/measure/vo/IotMeasureDetectPageReqVO.java
  14. 7 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/qhse/measure/vo/IotMeasureDetectRespVO.java
  15. 6 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/qhse/measure/vo/IotMeasureDetectSaveReqVO.java
  16. 2 2
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/qhse/safe/QhseSafeDayController.java
  17. 70 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/qhse/file/QhseFileTreeDO.java
  18. 70 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/qhse/file/QhseInfoDO.java
  19. 11 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/qhse/measure/IotMeasureBookDO.java
  20. 9 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/qhse/measure/IotMeasureDetectDO.java
  21. 56 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/qhse/file/QhseFileTreeMapper.java
  22. 33 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/qhse/file/QhseInfoMapper.java
  23. 1 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/qhse/measure/IotMeasureBookMapper.java
  24. 70 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/qhse/file/QhseFileTreeService.java
  25. 202 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/qhse/file/QhseFileTreeServiceImpl.java
  26. 58 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/qhse/file/QhseInfoService.java
  27. 330 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/qhse/file/QhseInfoServiceImpl.java

+ 1 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/IotTreeController.java

@@ -18,7 +18,6 @@ import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
-import org.apache.commons.collections4.map.LinkedMap;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
@@ -73,6 +72,7 @@ public class IotTreeController {
         return success(true);
     }
 
+
     @DeleteMapping("/delete")
     @Operation(summary = "删除pms树")
     @Parameter(name = "id", description = "编号", required = true)

+ 157 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/qhse/file/QhseFileTreeController.java

@@ -0,0 +1,157 @@
+package cn.iocoder.yudao.module.pms.controller.admin.qhse.file;
+
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+import cn.iocoder.yudao.module.pms.controller.admin.qhse.file.vo.QhseFileTreePageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.qhse.file.vo.QhseFileTreeRespVO;
+import cn.iocoder.yudao.module.pms.controller.admin.qhse.file.vo.QhseFileTreeSaveReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.vo.IotTreeListReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.qhse.file.QhseFileTreeDO;
+import cn.iocoder.yudao.module.pms.service.qhse.file.QhseFileTreeService;
+import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptSimpleRespVO;
+import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.annotation.security.PermitAll;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+
+@Tag(name = "管理后台 - QHSE文件树")
+@RestController
+@RequestMapping("/rq/qhse-file-tree")
+@Validated
+public class QhseFileTreeController {
+
+    @Resource
+    private QhseFileTreeService qhseFileTreeService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建QHSE文件树")
+    @PreAuthorize("@ss.hasPermission('rq:qhse-file-tree:create')")
+    public CommonResult<Long> createQhseFileTree(@Valid @RequestBody QhseFileTreeSaveReqVO createReqVO) {
+        return success(qhseFileTreeService.createQhseFileTree(createReqVO));
+    }
+
+    @PostMapping("/add-dept-deal")
+    public void createDeptDeal(@RequestBody DeptDO dept) {
+        qhseFileTreeService.addDeptDeal(dept);
+    }
+    @PostMapping("/update-dept-deal")
+    public void updateDeptDeal(@RequestBody DeptDO dept) {
+        qhseFileTreeService.updateDeptDeal(dept);
+    }
+    @PostMapping("/delete-dept-deal")
+    public void updateDeptDeal(String id) {
+        qhseFileTreeService.deleteDeptDeal(id);
+    }
+
+
+    @PutMapping("/update")
+    @Operation(summary = "更新QHSE文件树")
+    @PreAuthorize("@ss.hasPermission('rq:qhse-file-tree:update')")
+    public CommonResult<Boolean> updateQhseFileTree(@Valid @RequestBody QhseFileTreeSaveReqVO updateReqVO) {
+        qhseFileTreeService.updateQhseFileTree(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除QHSE文件树")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('rq:qhse-file-tree:delete')")
+    public CommonResult<Boolean> deleteQhseFileTree(@RequestParam("id") Long id) {
+        qhseFileTreeService.deleteQhseFileTree(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得QHSE文件树")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('rq:qhse-file-tree:query')")
+    public CommonResult<QhseFileTreeRespVO> getQhseFileTree(@RequestParam("id") Long id) {
+        QhseFileTreeDO qhseFileTree = qhseFileTreeService.getQhseFileTree(id);
+        return success(BeanUtils.toBean(qhseFileTree, QhseFileTreeRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得QHSE文件树分页")
+    @PreAuthorize("@ss.hasPermission('rq:qhse-file-tree:query')")
+    public CommonResult<PageResult<QhseFileTreeRespVO>> getQhseFileTreePage(@Valid QhseFileTreePageReqVO pageReqVO) {
+        PageResult<QhseFileTreeDO> pageResult = qhseFileTreeService.getQhseFileTreePage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, QhseFileTreeRespVO.class));
+    }
+
+    @GetMapping(value = {"/list-all-simple", "/simple-list"})
+    @Operation(summary = "获取部门精简信息列表", description = "只包含被开启的部门,主要用于前端的下拉选项")
+    @PermitAll
+    public CommonResult<List<DeptSimpleRespVO>> getSimpleDeptList() {
+        List<QhseFileTreeDO> list = qhseFileTreeService.getQhseTreeList(new IotTreeListReqVO());
+        return success(BeanUtils.toBean(list, DeptSimpleRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出QHSE文件树 Excel")
+    @PreAuthorize("@ss.hasPermission('rq:qhse-file-tree:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportQhseFileTreeExcel(@Valid QhseFileTreePageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<QhseFileTreeDO> list = qhseFileTreeService.getQhseFileTreePage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "QHSE文件树.xls", "数据", QhseFileTreeRespVO.class,
+                        BeanUtils.toBean(list, QhseFileTreeRespVO.class));
+    }
+
+
+    @GetMapping("/ids/{id}")
+    @Operation(summary = "获取某个节点的所有上级节点")
+    public CommonResult<LinkedList<Map<String, Object>>> getTreeIds(@PathVariable("id") Long id) {
+        List<QhseFileTreeDO> allParentIds = qhseFileTreeService.getAllParentIds(id);
+        LinkedList<Map<String, Object>> list = new LinkedList<>();
+        allParentIds.forEach(e -> {
+            Map<String, Object> map = new HashMap<>();
+            map.put("id", e.getId());
+            map.put("name", e.getName());
+            if (e.getName().contains("科瑞石油技术")) {
+                map.put("type", "root");
+            }
+            list.add(map);
+        });
+        QhseFileTreeDO iotTree = qhseFileTreeService.getQhseFileTree(id);
+        Map<String, Object> map = new HashMap<>();
+        map.put("id", iotTree.getId());
+        map.put("name", iotTree.getName());
+        if (iotTree.getName().contains("科瑞石油技术")){
+            map.put("type", "root");
+        }
+        list.add(map);
+        return success(list);
+    }
+
+
+    @GetMapping("/init/tree")
+    @PermitAll
+    public void initTree() {
+        qhseFileTreeService.initTree();
+    }
+
+
+}

+ 153 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/qhse/file/QhseInfoController.java

@@ -0,0 +1,153 @@
+package cn.iocoder.yudao.module.pms.controller.admin.qhse.file;
+
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+import cn.iocoder.yudao.module.pms.controller.admin.qhse.file.vo.QhseInfoPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.qhse.file.vo.QhseInfoRespVO;
+import cn.iocoder.yudao.module.pms.controller.admin.qhse.file.vo.QhseInfoSaveReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.vo.IotInfoPageReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.qhse.file.QhseInfoDO;
+import cn.iocoder.yudao.module.pms.service.qhse.file.QhseInfoService;
+import cn.iocoder.yudao.module.system.api.dept.DeptApi;
+import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
+import com.xingyuv.captcha.util.StringUtils;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.io.IOException;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+
+@Tag(name = "管理后台 - QHSE文件资料")
+@RestController
+@RequestMapping("/rq/qhse-info")
+@Validated
+public class QhseInfoController {
+
+    @Resource
+    private QhseInfoService qhseInfoService;
+    @Autowired
+    private DeptApi deptApi;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建QHSE文件资料")
+    @PreAuthorize("@ss.hasPermission('rq:qhse-info:create')")
+    public CommonResult<Boolean> createQhseInfo(@Valid @RequestBody QhseInfoSaveReqVO createReqVO) {
+        qhseInfoService.createQhseInfo(createReqVO);
+        return success(true);
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新QHSE文件资料")
+    @PreAuthorize("@ss.hasPermission('rq:qhse-info:update')")
+    public CommonResult<Boolean> updateQhseInfo(@Valid @RequestBody QhseInfoSaveReqVO updateReqVO) {
+        qhseInfoService.updateQhseInfo(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除QHSE文件资料")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('rq:qhse-info:delete')")
+    public CommonResult<Boolean> deleteQhseInfo(@RequestParam("id") Long id) {
+        qhseInfoService.deleteQhseInfo(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得QHSE文件资料")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('rq:qhse-info:query')")
+    public CommonResult<QhseInfoRespVO> getQhseInfo(@RequestParam("id") Long id) {
+        QhseInfoDO qhseInfo = qhseInfoService.getQhseInfo(id);
+        return success(BeanUtils.toBean(qhseInfo, QhseInfoRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得QHSE文件资料分页")
+    @PreAuthorize("@ss.hasPermission('rq:qhse-info:query')")
+    public CommonResult<PageResult<QhseInfoRespVO>> getQhseInfoPage(@Valid QhseInfoPageReqVO pageReqVO) {
+        PageResult<QhseInfoDO> pageResult = qhseInfoService.getQhseInfoPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, QhseInfoRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出QHSE文件资料 Excel")
+    @PreAuthorize("@ss.hasPermission('rq:qhse-info:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportQhseInfoExcel(@Valid QhseInfoPageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<QhseInfoDO> list = qhseInfoService.getQhseInfoPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "QHSE文件资料.xls", "数据", QhseInfoRespVO.class,
+                        BeanUtils.toBean(list, QhseInfoRespVO.class));
+    }
+
+    @PostMapping("/file/page")
+    @Operation(summary = "获得资料分页")
+    @PreAuthorize("@ss.hasPermission('rq:qhse-info:query')")
+    public CommonResult<PageResult<QhseInfoRespVO>> getIotInfoFilePage(@Valid QhseInfoPageReqVO pageReqVO) {
+        PageResult<QhseInfoDO> pageResult = qhseInfoService.getQhseInfoPage(pageReqVO);
+        List<QhseInfoDO> list = pageResult.getList();
+        List<QhseInfoRespVO> collect = list.stream().map(e -> {
+            QhseInfoRespVO vo = BeanUtils.toBean(e, QhseInfoRespVO.class);
+            if (Objects.nonNull(e.getDeptId())) {
+                DeptRespDTO dept = deptApi.getDept(e.getDeptId());
+                if (Objects.nonNull(dept)) {
+                    vo.setDeptName(dept.getName());
+                }
+            }
+            return vo;
+        }).collect(Collectors.toList());
+        return success(new PageResult<>(collect, pageResult.getTotal()));
+    }
+
+
+    @PostMapping("/child/content-file")
+    @Operation(summary = "获得资料库的分类目录及文件")
+    @PreAuthorize("@ss.hasPermission('rq:iot-info:query')")
+    public CommonResult<List<QhseInfoRespVO>> getChildContentFile(@Valid IotInfoPageReqVO pageReqVO) {
+        Long classId = pageReqVO.getClassId();
+        List<QhseInfoRespVO> contentFiles = qhseInfoService.getChildContentFile(classId).stream().filter(e ->{
+            if (StringUtils.isNotBlank(pageReqVO.getFilename())) {
+                return e.getFilename().contains(pageReqVO.getFilename());
+            } else {
+                return true;
+            }
+        }).collect(Collectors.toList());
+        return success(contentFiles);
+    }
+
+    @PostMapping("/all/content-file")
+    @Operation(summary = "获得QHSE资料库下的所有分类目录及文件")
+    @PreAuthorize("@ss.hasPermission('rq:iot-info:query')")
+    public CommonResult<List<QhseInfoRespVO>> getAllContentFile(@Valid IotInfoPageReqVO pageReqVO) {
+        Long classId = pageReqVO.getClassId();
+        List<QhseInfoRespVO> contentFiles = qhseInfoService.getAllChildContentFile(classId).stream().filter(e ->{
+            if (StringUtils.isNotBlank(pageReqVO.getAllName())) {
+                return e.getFilename().contains(pageReqVO.getAllName());
+            } else {
+                return true;
+            }
+        }).collect(Collectors.toList());
+        return success(contentFiles);
+    }
+}

+ 52 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/qhse/file/vo/QhseFileTreePageReqVO.java

@@ -0,0 +1,52 @@
+package cn.iocoder.yudao.module.pms.controller.admin.qhse.file.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - QHSE文件树分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class QhseFileTreePageReqVO extends PageParam {
+
+    @Schema(description = "原id", example = "8327")
+    private Long originId;
+
+    @Schema(description = "父分类id", example = "16668")
+    private Long parentId;
+
+    @Schema(description = "分类名称", example = "芋艿")
+    private String name;
+
+    @Schema(description = "类型", example = "2")
+    private String type;
+
+    @Schema(description = "分类排序")
+    private Integer sort;
+
+    @Schema(description = "开启状态", example = "2")
+    private Integer status;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+    @Schema(description = "备注", example = "你猜")
+    private String remark;
+
+    @Schema(description = "设备id", example = "4356")
+    private Integer deptId;
+
+    @Schema(description = "设备编码")
+    private String deviceCode;
+
+    @Schema(description = "部门名称", example = "赵六")
+    private String deptName;
+
+}

+ 63 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/qhse/file/vo/QhseFileTreeRespVO.java

@@ -0,0 +1,63 @@
+package cn.iocoder.yudao.module.pms.controller.admin.qhse.file.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - QHSE文件树 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class QhseFileTreeRespVO {
+
+    @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "22972")
+    @ExcelProperty("主键id")
+    private Long id;
+
+    @Schema(description = "原id", example = "8327")
+    @ExcelProperty("原id")
+    private Long originId;
+
+    @Schema(description = "父分类id", example = "16668")
+    @ExcelProperty("父分类id")
+    private Long parentId;
+
+    @Schema(description = "分类名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
+    @ExcelProperty("分类名称")
+    private String name;
+
+    @Schema(description = "类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+    @ExcelProperty("类型")
+    private String type;
+
+    @Schema(description = "分类排序")
+    @ExcelProperty("分类排序")
+    private Integer sort;
+
+    @Schema(description = "开启状态", example = "2")
+    @ExcelProperty("开启状态")
+    private Integer status;
+
+    @Schema(description = "创建时间")
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+    @Schema(description = "备注", example = "你猜")
+    @ExcelProperty("备注")
+    private String remark;
+
+    @Schema(description = "设备id", example = "4356")
+    @ExcelProperty("设备id")
+    private Integer deptId;
+
+    @Schema(description = "设备编码")
+    @ExcelProperty("设备编码")
+    private String deviceCode;
+
+    @Schema(description = "部门名称", example = "赵六")
+    @ExcelProperty("部门名称")
+    private String deptName;
+
+}

+ 47 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/qhse/file/vo/QhseFileTreeSaveReqVO.java

@@ -0,0 +1,47 @@
+package cn.iocoder.yudao.module.pms.controller.admin.qhse.file.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+
+@Schema(description = "管理后台 - QHSE文件树新增/修改 Request VO")
+@Data
+public class QhseFileTreeSaveReqVO {
+
+    @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "22972")
+    private Long id;
+
+    @Schema(description = "原id", example = "8327")
+    private Long originId;
+
+    @Schema(description = "父分类id", example = "16668")
+    private Long parentId;
+
+    @Schema(description = "分类名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
+    @NotEmpty(message = "分类名称不能为空")
+    private String name;
+
+    @Schema(description = "类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+    @NotEmpty(message = "类型不能为空")
+    private String type;
+
+    @Schema(description = "分类排序")
+    private Integer sort;
+
+    @Schema(description = "开启状态", example = "2")
+    private Integer status;
+
+    @Schema(description = "备注", example = "你猜")
+    private String remark;
+
+    @Schema(description = "设备id", example = "4356")
+    private Integer deptId;
+
+    @Schema(description = "设备编码")
+    private String deviceCode;
+
+    @Schema(description = "部门名称", example = "赵六")
+    private String deptName;
+
+}

+ 54 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/qhse/file/vo/QhseInfoPageReqVO.java

@@ -0,0 +1,54 @@
+package cn.iocoder.yudao.module.pms.controller.admin.qhse.file.vo;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - QHSE文件资料分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class QhseInfoPageReqVO extends PageParam {
+
+    @Schema(description = "设备id", example = "18091")
+    private Long deviceId;
+
+    @Schema(description = "部门id", example = "17933")
+    private Long deptId;
+
+    @Schema(description = "文件名称", example = "李四")
+    private String filename;
+
+    @Schema(description = "文件类型", example = "1")
+    private String fileType;
+
+    @Schema(description = "文件路径")
+    private String filePath;
+
+    @Schema(description = "备注", example = "随便")
+    private String remark;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+    @Schema(description = "类型id", example = "18744")
+    private Long classId;
+
+    @Schema(description = "文件大小")
+    private String fileSize;
+
+    @Schema(description = "设备编码")
+    private String deviceCode;
+
+    @Schema(description = "设备名称", example = "李四")
+    private String deptName;
+
+}

+ 64 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/qhse/file/vo/QhseInfoRespVO.java

@@ -0,0 +1,64 @@
+package cn.iocoder.yudao.module.pms.controller.admin.qhse.file.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - QHSE文件资料 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class QhseInfoRespVO {
+
+    @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "32190")
+    @ExcelProperty("主键id")
+    private Long id;
+
+    @Schema(description = "设备id", example = "18091")
+    @ExcelProperty("设备id")
+    private Long deviceId;
+
+    @Schema(description = "部门id", example = "17933")
+    @ExcelProperty("部门id")
+    private Long deptId;
+
+    @Schema(description = "文件名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四")
+    @ExcelProperty("文件名称")
+    private String filename;
+
+    @Schema(description = "文件类型", example = "1")
+    @ExcelProperty("文件类型")
+    private String fileType;
+
+    @Schema(description = "文件路径", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("文件路径")
+    private String filePath;
+
+    @Schema(description = "备注", example = "随便")
+    @ExcelProperty("备注")
+    private String remark;
+
+    @Schema(description = "创建时间")
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+    @Schema(description = "类型id", example = "18744")
+    @ExcelProperty("类型id")
+    private Long classId;
+
+    @Schema(description = "文件大小")
+    @ExcelProperty("文件大小")
+    private String fileSize;
+
+    @Schema(description = "设备编码")
+    @ExcelProperty("设备编码")
+    private String deviceCode;
+
+    @Schema(description = "设备名称", example = "李四")
+    @ExcelProperty("设备名称")
+    private String deptName;
+
+    private String fileClassify;
+}

+ 49 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/qhse/file/vo/QhseInfoSaveReqVO.java

@@ -0,0 +1,49 @@
+package cn.iocoder.yudao.module.pms.controller.admin.qhse.file.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+
+@Schema(description = "管理后台 - QHSE文件资料新增/修改 Request VO")
+@Data
+public class QhseInfoSaveReqVO {
+
+    @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "32190")
+    private Long id;
+
+    @Schema(description = "设备id", example = "18091")
+    private Long deviceId;
+
+    @Schema(description = "部门id", example = "17933")
+    private Long deptId;
+
+    @Schema(description = "文件名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四")
+    @NotEmpty(message = "文件名称不能为空")
+    private String filename;
+
+    @Schema(description = "文件类型", example = "1")
+    private String fileType;
+
+    @Schema(description = "文件路径", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotEmpty(message = "文件路径不能为空")
+    private String filePath;
+
+    @Schema(description = "备注", example = "随便")
+    private String remark;
+
+    @Schema(description = "类型id", example = "18744")
+    private Long classId;
+
+    @Schema(description = "文件大小")
+    private String fileSize;
+
+    @Schema(description = "设备编码")
+    private String deviceCode;
+
+    @Schema(description = "设备名称", example = "李四")
+    private String deptName;
+
+
+    private String folderJson;
+}

+ 5 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/qhse/measure/vo/IotMeasureBookPageReqVO.java

@@ -26,6 +26,9 @@ public class IotMeasureBookPageReqVO extends PageParam {
     @Schema(description = "计量器具名称", example = "王五")
     private String measureName;
 
+    @Schema(description = "状态")
+    private String status;
+
     @Schema(description = "分类")
     private String classify;
 
@@ -70,4 +73,6 @@ public class IotMeasureBookPageReqVO extends PageParam {
 
     @Schema(description = "是否90天预警")
     private Boolean alertWarn;
+
+    private LocalDateTime offTime;
 }

+ 5 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/qhse/measure/vo/IotMeasureBookRespVO.java

@@ -27,6 +27,9 @@ public class IotMeasureBookRespVO {
     @ExcelProperty("计量器具名称")
     private String measureName;
 
+    @Schema(description = "状态")
+    private String status;
+
     @Schema(description = "分类", requiredMode = Schema.RequiredMode.REQUIRED)
     @ExcelProperty("分类")
     private String classify;
@@ -82,4 +85,6 @@ public class IotMeasureBookRespVO {
     private Boolean expired;
     @Schema(description = "是否90天预警")
     private Boolean alertWarn;
+
+    private LocalDateTime offTime;
 }

+ 6 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/qhse/measure/vo/IotMeasureBookSaveReqVO.java

@@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
 import javax.validation.constraints.NotEmpty;
+import java.time.LocalDateTime;
 
 @Schema(description = "管理后台 - 计量器具台账新增/修改 Request VO")
 @Data
@@ -24,6 +25,9 @@ public class IotMeasureBookSaveReqVO {
     @NotEmpty(message = "计量器具名称不能为空")
     private String measureName;
 
+    @Schema(description = "状态")
+    private String status;
+
     @Schema(description = "分类", requiredMode = Schema.RequiredMode.REQUIRED)
     @NotEmpty(message = "分类不能为空")
     private String classify;
@@ -58,4 +62,6 @@ public class IotMeasureBookSaveReqVO {
 
     @Schema(description = "部门id", example = "26945")
     private Long deptId;
+
+    private LocalDateTime offTime;
 }

+ 6 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/qhse/measure/vo/IotMeasureDetectPageReqVO.java

@@ -49,4 +49,10 @@ public class IotMeasureDetectPageReqVO extends PageParam {
     private String detectStandard;
     @Schema(description = "计量器具编码")
     private String measureCode;
+
+    @Schema(description = "精度")
+    private String precisions;
+
+    @Schema(description = "监测周期")
+    private String detectCycle;
 }

+ 7 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/qhse/measure/vo/IotMeasureDetectRespVO.java

@@ -58,5 +58,12 @@ public class IotMeasureDetectRespVO {
     @Schema(description = "检测附件")
     private String file;
 
+    @Schema(description = "序列号")
     private String serialNo;
+
+    @Schema(description = "精度")
+    private String precisions;
+
+    @Schema(description = "监测周期")
+    private String detectCycle;
 }

+ 6 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/qhse/measure/vo/IotMeasureDetectSaveReqVO.java

@@ -47,4 +47,10 @@ public class IotMeasureDetectSaveReqVO {
 
     @Schema(description = "检测附件")
     private String file;
+
+    @Schema(description = "精度")
+    private String precisions;
+
+    @Schema(description = "监测周期")
+    private String detectCycle;
 }

+ 2 - 2
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/qhse/safe/QhseSafeDayController.java

@@ -132,11 +132,11 @@ public class QhseSafeDayController {
                 .min() // 取最小值
                 .orElse(0); // 集合为空时默认 0,可自己改
         List<QhseSafeDayDO> rq = qhseSafeDayService.getByName("瑞气能源");
-        List<QhseSafeDayDO> rl = qhseSafeDayService.getByName("瑞霖能源");
+        List<QhseSafeDayDO> rl = qhseSafeDayService.getByName("瑞霖技术");
         List<QhseSafeDayDO> five = qhseSafeDayService.getByName("5#项目");
 
         return success(ImmutableMap.of("气体增产", rhMinDayNumber,"钻修井",ryMinDayNumber,"酸化压裂",rdMinDayNumber,"瑞气能源",rq.get(0).getDayNumber(),
-                "瑞霖能源",rl.get(0).getDayNumber(),"5#项目",five.get(0).getDayNumber()));
+                "瑞霖技术",rl.get(0).getDayNumber(),"5#项目",five.get(0).getDayNumber()));
     }
 
 }

+ 70 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/qhse/file/QhseFileTreeDO.java

@@ -0,0 +1,70 @@
+package cn.iocoder.yudao.module.pms.dal.dataobject.qhse.file;
+
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+/**
+ * QHSE文件树 DO
+ *
+ * @author 超级管理员
+ */
+@TableName("rq_qhse_file_tree")
+@KeySequence("rq_qhse_file_tree_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class QhseFileTreeDO extends BaseDO {
+
+    /**
+     * 主键id
+     */
+    @TableId
+    private Long id;
+    /**
+     * 原id
+     */
+    private Long originId;
+    /**
+     * 父分类id
+     */
+    private Long parentId;
+    /**
+     * 分类名称
+     */
+    private String name;
+    /**
+     * 类型
+     */
+    private String type;
+    /**
+     * 分类排序
+     */
+    private Integer sort;
+    /**
+     * 开启状态
+     */
+    private Integer status;
+    /**
+     * 备注
+     */
+    private String remark;
+    /**
+     * 设备id
+     */
+    private Integer deptId;
+    /**
+     * 设备编码
+     */
+    private String deviceCode;
+    /**
+     * 部门名称
+     */
+    private String deptName;
+
+}

+ 70 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/qhse/file/QhseInfoDO.java

@@ -0,0 +1,70 @@
+package cn.iocoder.yudao.module.pms.dal.dataobject.qhse.file;
+
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+/**
+ * QHSE文件资料 DO
+ *
+ * @author 超级管理员
+ */
+@TableName("rq_qhse_info")
+@KeySequence("rq_qhse_info_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class QhseInfoDO extends BaseDO {
+
+    /**
+     * 主键id
+     */
+    @TableId
+    private Long id;
+    /**
+     * 设备id
+     */
+    private Long deviceId;
+    /**
+     * 部门id
+     */
+    private Long deptId;
+    /**
+     * 文件名称
+     */
+    private String filename;
+    /**
+     * 文件类型
+     */
+    private String fileType;
+    /**
+     * 文件路径
+     */
+    private String filePath;
+    /**
+     * 备注
+     */
+    private String remark;
+    /**
+     * 类型id
+     */
+    private Long classId;
+    /**
+     * 文件大小
+     */
+    private String fileSize;
+    /**
+     * 设备编码
+     */
+    private String deviceCode;
+    /**
+     * 设备名称
+     */
+    private String deptName;
+
+}

+ 11 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/qhse/measure/IotMeasureBookDO.java

@@ -6,6 +6,8 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.*;
 
+import java.time.LocalDateTime;
+
 /**
  * 计量器具台账 DO
  *
@@ -34,6 +36,10 @@ public class IotMeasureBookDO extends BaseDO {
      * 计量器具名称
      */
     private String measureName;
+    /**
+     * 计量器具状态
+     */
+    private String status;
     /**
      * 分类
      */
@@ -88,6 +94,10 @@ public class IotMeasureBookDO extends BaseDO {
      * 预警告警
      */
     private Boolean alertWarn;
-
+    /**
+     * 序列号
+     */
     private String serialNo;
+
+    private LocalDateTime offTime;
 }

+ 9 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/qhse/measure/IotMeasureDetectDO.java

@@ -66,4 +66,13 @@ public class IotMeasureDetectDO extends BaseDO {
     private String measureCertNo;
 
     private String file;
+    /**
+     * 精度
+     */
+    private String precisions;
+
+    /**
+     * 监测周期
+     */
+    private String detectCycle;
 }

+ 56 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/qhse/file/QhseFileTreeMapper.java

@@ -0,0 +1,56 @@
+package cn.iocoder.yudao.module.pms.dal.mysql.qhse.file;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.module.pms.controller.admin.qhse.file.vo.QhseFileTreePageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.vo.IotTreeListReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.qhse.file.QhseFileTreeDO;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * QHSE文件树 Mapper
+ *
+ * @author 超级管理员
+ */
+@Mapper
+public interface QhseFileTreeMapper extends BaseMapperX<QhseFileTreeDO> {
+
+    default PageResult<QhseFileTreeDO> selectPage(QhseFileTreePageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<QhseFileTreeDO>()
+                .eqIfPresent(QhseFileTreeDO::getOriginId, reqVO.getOriginId())
+                .eqIfPresent(QhseFileTreeDO::getParentId, reqVO.getParentId())
+                .likeIfPresent(QhseFileTreeDO::getName, reqVO.getName())
+                .eqIfPresent(QhseFileTreeDO::getType, reqVO.getType())
+                .eqIfPresent(QhseFileTreeDO::getSort, reqVO.getSort())
+                .eqIfPresent(QhseFileTreeDO::getStatus, reqVO.getStatus())
+                .betweenIfPresent(QhseFileTreeDO::getCreateTime, reqVO.getCreateTime())
+                .eqIfPresent(QhseFileTreeDO::getRemark, reqVO.getRemark())
+                .eqIfPresent(QhseFileTreeDO::getDeptId, reqVO.getDeptId())
+                .eqIfPresent(QhseFileTreeDO::getDeviceCode, reqVO.getDeviceCode())
+                .likeIfPresent(QhseFileTreeDO::getDeptName, reqVO.getDeptName())
+                .orderByDesc(QhseFileTreeDO::getId));
+    }
+
+    default List<QhseFileTreeDO> selectListByParentId(Collection<Long> parentIds) {
+        return selectList(QhseFileTreeDO::getParentId, parentIds);
+    }
+
+    default List<QhseFileTreeDO> selectListByOriginId(Long originId, String type) {
+        return selectList(new LambdaQueryWrapperX<QhseFileTreeDO>()
+                .eq(QhseFileTreeDO::getOriginId, originId)
+                .eq(QhseFileTreeDO::getType, type)
+        );
+    }
+
+    default List<QhseFileTreeDO> selectList(IotTreeListReqVO reqVO) {
+        return selectList(new LambdaQueryWrapperX<QhseFileTreeDO>()
+                .likeIfPresent(QhseFileTreeDO::getName, reqVO.getName())
+                .eqIfPresent(QhseFileTreeDO::getOriginId, reqVO.getOriginId())
+                .eqIfPresent(QhseFileTreeDO::getType, reqVO.getType())
+                .eqIfPresent(QhseFileTreeDO::getStatus, reqVO.getStatus()));
+    }
+}

+ 33 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/qhse/file/QhseInfoMapper.java

@@ -0,0 +1,33 @@
+package cn.iocoder.yudao.module.pms.dal.mysql.qhse.file;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.module.pms.controller.admin.qhse.file.vo.QhseInfoPageReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.qhse.file.QhseInfoDO;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.Collection;
+
+/**
+ * QHSE文件资料 Mapper
+ *
+ * @author 超级管理员
+ */
+@Mapper
+public interface QhseInfoMapper extends BaseMapperX<QhseInfoDO> {
+
+    default PageResult<QhseInfoDO> selectPage(QhseInfoPageReqVO reqVO, Collection<Long> classIds ) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<QhseInfoDO>()
+                .eqIfPresent(QhseInfoDO::getDeviceId, reqVO.getDeviceId())
+                .eqIfPresent(QhseInfoDO::getDeptId, reqVO.getDeptId())
+                .likeIfPresent(QhseInfoDO::getFilename, reqVO.getFilename())
+                .eqIfPresent(QhseInfoDO::getFileType, reqVO.getFileType())
+                .eqIfPresent(QhseInfoDO::getFilePath, reqVO.getFilePath())
+                .inIfPresent(QhseInfoDO::getClassId, classIds)
+                .eqIfPresent(QhseInfoDO::getRemark, reqVO.getRemark())
+                .betweenIfPresent(QhseInfoDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(QhseInfoDO::getId));
+    }
+
+}

+ 1 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/qhse/measure/IotMeasureBookMapper.java

@@ -23,6 +23,7 @@ public interface IotMeasureBookMapper extends BaseMapperX<IotMeasureBookDO> {
                 .eqIfPresent(IotMeasureBookDO::getMeasureCode, reqVO.getMeasureCode())
                 .likeIfPresent(IotMeasureBookDO::getMeasureName, reqVO.getMeasureName())
                 .eqIfPresent(IotMeasureBookDO::getClassify, reqVO.getClassify())
+                .eqIfPresent(IotMeasureBookDO::getStatus, reqVO.getStatus())
                 .eqIfPresent(IotMeasureBookDO::getDutyPerson, reqVO.getDutyPerson())
                 .betweenIfPresent(IotMeasureBookDO::getBuyDate, reqVO.getBuyDate())
                 .eqIfPresent(IotMeasureBookDO::getBrand, reqVO.getBrand())

+ 70 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/qhse/file/QhseFileTreeService.java

@@ -0,0 +1,70 @@
+package cn.iocoder.yudao.module.pms.service.qhse.file;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.pms.controller.admin.qhse.file.vo.QhseFileTreePageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.qhse.file.vo.QhseFileTreeSaveReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.vo.IotTreeListReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.qhse.file.QhseFileTreeDO;
+import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
+
+import javax.validation.Valid;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * QHSE文件树 Service 接口
+ *
+ * @author 超级管理员
+ */
+public interface QhseFileTreeService {
+    List<QhseFileTreeDO> getQhseTreeList(IotTreeListReqVO reqVO);
+    void addDeptDeal(DeptDO deptDO);
+    void updateDeptDeal(DeptDO deptDO);
+    void deleteDeptDeal(String id);
+    /**
+     * 创建QHSE文件树
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createQhseFileTree(@Valid QhseFileTreeSaveReqVO createReqVO);
+
+    /**
+     * 更新QHSE文件树
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateQhseFileTree(@Valid QhseFileTreeSaveReqVO updateReqVO);
+
+    /**
+     * 删除QHSE文件树
+     *
+     * @param id 编号
+     */
+    void deleteQhseFileTree(Long id);
+
+    /**
+     * 获得QHSE文件树
+     *
+     * @param id 编号
+     * @return QHSE文件树
+     */
+    QhseFileTreeDO getQhseFileTree(Long id);
+
+    /**
+     * 获得QHSE文件树分页
+     *
+     * @param pageReqVO 分页查询
+     * @return QHSE文件树分页
+     */
+    PageResult<QhseFileTreeDO> getQhseFileTreePage(QhseFileTreePageReqVO pageReqVO);
+
+
+    default List<QhseFileTreeDO> getChildTreeList(Long id) {
+        return getChildTreeList(Collections.singleton(id));
+    }
+    List<QhseFileTreeDO> getChildTreeList(Collection<Long> ids);
+    List<QhseFileTreeDO> getAllParentIds(Long classId);
+    void initTree();
+}

+ 202 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/qhse/file/QhseFileTreeServiceImpl.java

@@ -0,0 +1,202 @@
+package cn.iocoder.yudao.module.pms.service.qhse.file;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.iocoder.yudao.framework.common.exception.ErrorCode;
+import cn.iocoder.yudao.framework.common.exception.ServiceException;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.pms.controller.admin.qhse.file.vo.QhseFileTreePageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.qhse.file.vo.QhseFileTreeSaveReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.vo.IotTreeListReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.qhse.file.QhseFileTreeDO;
+import cn.iocoder.yudao.module.pms.dal.mysql.qhse.file.QhseFileTreeMapper;
+import cn.iocoder.yudao.module.system.api.dept.DeptApi;
+import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
+import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
+import cn.iocoder.yudao.module.system.enums.ErrorCodeConstants;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
+
+/**
+ * QHSE文件树 Service 实现类
+ *
+ * @author 超级管理员
+ */
+@Service
+@Validated
+public class QhseFileTreeServiceImpl implements QhseFileTreeService {
+
+    @Resource
+    private QhseFileTreeMapper qhseFileTreeMapper;
+    @Autowired
+    private DeptApi deptApi;
+
+    @Override
+    public Long createQhseFileTree(QhseFileTreeSaveReqVO createReqVO) {
+        // 插入
+        QhseFileTreeDO qhseFileTree = BeanUtils.toBean(createReqVO, QhseFileTreeDO.class);
+        qhseFileTree.setDeleted(false);
+        qhseFileTreeMapper.insert(qhseFileTree);
+        // 返回
+        return qhseFileTree.getId();
+    }
+
+    @Override
+    public List<QhseFileTreeDO> getQhseTreeList(IotTreeListReqVO reqVO) {
+        List<QhseFileTreeDO> list = qhseFileTreeMapper.selectList(reqVO);
+        list.sort(Comparator.comparing(QhseFileTreeDO::getSort));
+        return list;
+    }
+
+    @Override
+    public void updateQhseFileTree(QhseFileTreeSaveReqVO updateReqVO) {
+        // 校验存在
+        validateQhseFileTreeExists(updateReqVO.getId());
+        // 更新
+        QhseFileTreeDO updateObj = BeanUtils.toBean(updateReqVO, QhseFileTreeDO.class);
+        qhseFileTreeMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void addDeptDeal(DeptDO dept) {
+        //插入pms树
+        QhseFileTreeDO iotTreeDO = new QhseFileTreeDO();
+        iotTreeDO.setType("dept");
+        iotTreeDO.setOriginId(dept.getId());
+        iotTreeDO.setName(dept.getName());
+        iotTreeDO.setDeptId(Math.toIntExact(dept.getId()));
+        List<QhseFileTreeDO> iotTreeDOS = qhseFileTreeMapper.selectListByOriginId(dept.getParentId(),"dept");
+//        if (CollUtil.isNotEmpty(iotTreeDOS)) {
+        iotTreeDO.setParentId(CollUtil.isNotEmpty(iotTreeDOS) ? iotTreeDOS.get(0).getId() : 0);
+        qhseFileTreeMapper.insert(iotTreeDO);
+    }
+
+    @Override
+    public void updateDeptDeal(DeptDO updateObj) {
+        //更新pms树
+        List<QhseFileTreeDO> iotTreeDOS = qhseFileTreeMapper.selectListByOriginId(updateObj.getId(),"dept");
+        if (org.apache.commons.collections4.CollectionUtils.isEmpty(iotTreeDOS)) {
+            throw new ServiceException(ErrorCodeConstants.DEPT_NOT_FOUND.getCode(),"无该部门");
+        }
+        QhseFileTreeDO iotTreeDO = iotTreeDOS.get(0);
+        iotTreeDO.setName(updateObj.getName());
+        iotTreeDO.setDeptId(Math.toIntExact(updateObj.getId()));
+        qhseFileTreeMapper.updateById(iotTreeDO);
+    }
+
+    @Override
+    public void deleteDeptDeal(String id) {
+        //删除pms树
+        qhseFileTreeMapper.deleteByMap(ImmutableMap.of("origin_id", id));
+    }
+
+    @Override
+    public void deleteQhseFileTree(Long id) {
+        // 校验存在
+        validateQhseFileTreeExists(id);
+        List<Long> childIds = getChildTreeList(ImmutableList.of(id)).stream().map(QhseFileTreeDO::getId).collect(Collectors.toList());
+        childIds.add(id);
+        //删除iot的树形结构
+        qhseFileTreeMapper.deleteByIds(childIds);
+
+    }
+
+    @Override
+    public List<QhseFileTreeDO> getChildTreeList(Collection<Long> ids) {
+        List<QhseFileTreeDO> children = new LinkedList<>();
+        // 遍历每一层
+        Collection<Long> parentIds = ids;
+        for (int i = 0; i < Short.MAX_VALUE; i++) { // 使用 Short.MAX_VALUE 避免 bug 场景下,存在死循环
+            // 查询当前层,所有的子产品分类
+            List<QhseFileTreeDO> depts = qhseFileTreeMapper.selectListByParentId(parentIds);
+            // 1. 如果没有子产品分类,则结束遍历
+            if (CollUtil.isEmpty(depts)) {
+                break;
+            }
+            // 2. 如果有子产品分类,继续遍历
+            children.addAll(depts);
+            parentIds = convertSet(depts, QhseFileTreeDO::getId);
+        }
+        return children;
+    }
+
+    private void validateQhseFileTreeExists(Long id) {
+        if (qhseFileTreeMapper.selectById(id) == null) {
+            throw exception(new ErrorCode(5, "不存在"));
+        }
+    }
+
+    @Override
+    public QhseFileTreeDO getQhseFileTree(Long id) {
+        return qhseFileTreeMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<QhseFileTreeDO> getQhseFileTreePage(QhseFileTreePageReqVO pageReqVO) {
+        return qhseFileTreeMapper.selectPage(pageReqVO);
+    }
+
+
+    @Override
+    public List<QhseFileTreeDO> getAllParentIds(Long nodeId) {
+        List<QhseFileTreeDO> parents = new ArrayList<>();
+
+        // 从当前节点开始向上查找所有父节点
+        Long currentParentId = getParentId(nodeId);
+
+        while (currentParentId != null) {
+            QhseFileTreeDO parentNode = qhseFileTreeMapper.selectById(currentParentId);
+            if (Objects.isNull(parentNode)) {
+                break; // 父节点不存在时终止查找
+            }
+            parents.add(parentNode);
+            currentParentId = parentNode.getParentId();
+        }
+
+        // 反转列表,使顶级父节点排在最前面
+        Collections.reverse(parents);
+        return parents;
+    }
+
+    private Long getParentId(Long nodeId) {
+        QhseFileTreeDO nodeOpt = qhseFileTreeMapper.selectById(nodeId);
+        return Objects.isNull(nodeOpt) ? null : nodeOpt.getParentId();
+    }
+
+
+    @Override
+    public void initTree() {
+        List<DeptRespDTO> deptList = deptApi.getDeptList();
+        List<QhseFileTreeDO> treeDOS = new ArrayList<>();
+        deptList.forEach(dept -> {
+            QhseFileTreeDO iotTreeDO = new QhseFileTreeDO();
+            iotTreeDO.setOriginId(dept.getId());
+            iotTreeDO.setType("dept");
+            iotTreeDO.setName(dept.getName());
+            iotTreeDO.setDeleted(false);
+            iotTreeDO.setDeptId(Math.toIntExact(dept.getId()));
+            treeDOS.add(iotTreeDO);
+        });
+        qhseFileTreeMapper.insertBatch(treeDOS);
+
+//        List<IotTreeDO> iotTreeDOS = iotTreeMapper.selectList();
+        treeDOS.forEach(treeDO -> {
+            Long parentId = deptList.stream().filter(dept -> treeDO.getOriginId().equals(dept.getId())).findFirst().get().getParentId();
+            List<QhseFileTreeDO> iotTreeDOS1 = qhseFileTreeMapper.selectListByOriginId(parentId, "dept");
+            if (CollUtil.isNotEmpty(iotTreeDOS1)) {
+                treeDO.setParentId(iotTreeDOS1.get(0).getId());
+            }
+        });
+        qhseFileTreeMapper.updateBatch(treeDOS);
+    }
+}

+ 58 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/qhse/file/QhseInfoService.java

@@ -0,0 +1,58 @@
+package cn.iocoder.yudao.module.pms.service.qhse.file;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.pms.controller.admin.qhse.file.vo.QhseInfoPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.qhse.file.vo.QhseInfoRespVO;
+import cn.iocoder.yudao.module.pms.controller.admin.qhse.file.vo.QhseInfoSaveReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.qhse.file.QhseInfoDO;
+
+import javax.validation.Valid;
+import java.util.List;
+
+/**
+ * QHSE文件资料 Service 接口
+ *
+ * @author 超级管理员
+ */
+public interface QhseInfoService {
+    List<QhseInfoRespVO> getAllChildContentFile(Long classId);
+    List<QhseInfoRespVO> getChildContentFile(Long classId);
+    /**
+     * 创建QHSE文件资料
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    void createQhseInfo(@Valid QhseInfoSaveReqVO createReqVO);
+
+    /**
+     * 更新QHSE文件资料
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateQhseInfo(@Valid QhseInfoSaveReqVO updateReqVO);
+
+    /**
+     * 删除QHSE文件资料
+     *
+     * @param id 编号
+     */
+    void deleteQhseInfo(Long id);
+
+    /**
+     * 获得QHSE文件资料
+     *
+     * @param id 编号
+     * @return QHSE文件资料
+     */
+    QhseInfoDO getQhseInfo(Long id);
+
+    /**
+     * 获得QHSE文件资料分页
+     *
+     * @param pageReqVO 分页查询
+     * @return QHSE文件资料分页
+     */
+    PageResult<QhseInfoDO> getQhseInfoPage(QhseInfoPageReqVO pageReqVO);
+
+}

+ 330 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/qhse/file/QhseInfoServiceImpl.java

@@ -0,0 +1,330 @@
+package cn.iocoder.yudao.module.pms.service.qhse.file;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.iocoder.yudao.framework.common.exception.ErrorCode;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.pms.controller.admin.qhse.file.vo.QhseInfoPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.qhse.file.vo.QhseInfoRespVO;
+import cn.iocoder.yudao.module.pms.controller.admin.qhse.file.vo.QhseInfoSaveReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.vo.IotTreeListReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.qhse.file.QhseFileTreeDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.qhse.file.QhseInfoDO;
+import cn.iocoder.yudao.module.pms.dal.mysql.qhse.file.QhseFileTreeMapper;
+import cn.iocoder.yudao.module.pms.dal.mysql.qhse.file.QhseInfoMapper;
+import cn.iocoder.yudao.module.system.api.dept.DeptApi;
+import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.common.collect.ImmutableList;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+
+/**
+ * QHSE文件资料 Service 实现类
+ *
+ * @author 超级管理员
+ */
+@Service
+@Slf4j
+@Validated
+public class QhseInfoServiceImpl implements QhseInfoService {
+
+    @Resource
+    private QhseInfoMapper qhseInfoMapper;
+    @Autowired
+    private QhseFileTreeMapper qhseFileTreeMapper;
+    @Autowired
+    private QhseFileTreeService qhseFileTreeService;
+    @Autowired
+    private DeptApi deptApi;
+
+    @Override
+    public List<QhseInfoRespVO> getAllChildContentFile(Long classId) {
+        List<QhseFileTreeDO> contents = qhseFileTreeService.getChildTreeList(ImmutableList.of(classId));
+//        if (CollUtil.isNotEmpty(contents)) {
+        List<Long> contentIds = contents.stream().map(QhseFileTreeDO::getId).collect(Collectors.toList());
+        QhseInfoPageReqVO infoPageReqVO = new QhseInfoPageReqVO();
+        infoPageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<QhseInfoDO> files = qhseInfoMapper.selectPage(infoPageReqVO, contentIds).getList();
+//        }
+        List<QhseInfoRespVO> infoRespVOS = dealFileVo(contents, files);
+        return infoRespVOS;
+    }
+
+    @Override
+    public List<QhseInfoRespVO> getChildContentFile(Long classId) {
+        List<QhseFileTreeDO> contents = qhseFileTreeMapper.selectList("parent_id", classId);
+        List<QhseInfoDO> files = qhseInfoMapper.selectList("class_id", classId);
+        List<QhseInfoRespVO> contentVos = dealFileVo(contents, files);
+        return contentVos;
+    }
+
+    @Override
+    public void createQhseInfo(QhseInfoSaveReqVO createReqVO) {
+        Long deptId;
+        Long deviceId;
+        Long classId = createReqVO.getClassId();
+        String deviceCode = "";
+        String deptName = "";
+
+        QhseFileTreeDO iotTreeDO = qhseFileTreeMapper.selectById(createReqVO.getClassId());
+        deptId = Long.valueOf(iotTreeDO.getDeptId());
+        if (Objects.nonNull(deptId)) {
+            DeptRespDTO dept = deptApi.getDept(deptId);
+            if (Objects.nonNull(dept)) {
+                deptName = dept.getName();
+            }
+        }
+        importFileTree(createReqVO.getFolderJson(), classId, deptId, createReqVO.getDeviceId(), deviceCode, deptName);
+    }
+
+
+    private final ObjectMapper objectMapper = new ObjectMapper();
+    public void importFileTree(String jsonData, Long parentId, Long deptId, Long deviceId, String deviceCode, String deptName) {
+        try {
+            // 解析JSON数组
+            JsonNode rootNode = objectMapper.readTree(jsonData);
+
+            if (rootNode.isArray()) {
+                for (JsonNode itemNode : rootNode) {
+                    // 处理文件夹结构
+                    JsonNode folderStructureNode = itemNode.get("folderStructure");
+                    JsonNode files = itemNode.get("files");
+                    List<String> fileNames = new ArrayList<>();
+                    files.forEach(file -> {
+                        if (Objects.nonNull(file)&&Objects.nonNull(file.get("name"))) {
+                            String name = file.get("name").asText();
+                            fileNames.add(name);
+                        }
+                    });
+                    Long fileClassId = null;
+                    if (folderStructureNode != null) {
+                        fileClassId = processFolderStructure(folderStructureNode, parentId, deptId, deviceCode, deptName, fileNames);
+                    }
+
+                    // todo 处理文件
+                    JsonNode filesNode = itemNode.get("files");
+                    if (filesNode != null && filesNode.isArray()&&Objects.nonNull(fileClassId)) {
+                        processFiles(filesNode, parentId, fileClassId, deviceId, deptId, deviceCode, deptName);
+                    }
+                }
+            }
+        } catch (Exception e) {
+            log.error("导入文件树结构失败", e);
+            throw new RuntimeException("导入文件树结构失败", e);
+        }
+    }
+
+    /**
+     * 处理文件
+     */
+    private void processFiles(JsonNode filesNode, Long rootParentId,Long fileClassId, Long deviceId, Long deptId, String deviceCode, String deptName) {
+        for (JsonNode fileNode : filesNode) {
+            String path = fileNode.get("path").asText();
+            String filePath = fileNode.get("filePath").asText();
+            String fileName = fileNode.get("name").asText();
+            String size = fileNode.get("size").asText();
+
+            // 根据路径确定父文件夹ID
+            String[] pathParts = path.split("/");
+            Long parentId = rootParentId;
+
+            // 逐级查找或创建父文件夹
+            for (int i = 0; i < pathParts.length - 1; i++) {
+                String folderName = pathParts[i];
+                parentId = findOrCreateFolder(folderName, parentId);
+            }
+
+            // 检查文件是否已存在
+            QhseInfoDO iotInfoDO = qhseInfoMapper.selectOne("filename", fileName, "class_id", fileClassId);
+            if (iotInfoDO == null) {
+                QhseInfoDO info = new QhseInfoDO();
+                info.setDeviceId(deviceId);
+                info.setDeptId(deptId);
+                info.setClassId(fileClassId);
+                info.setFilename(fileName);
+                info.setDeleted(false);
+                info.setDeviceCode(deviceCode);
+                info.setDeptName(deptName);
+                info.setFileType("file");
+                if (fileName.contains("jpg")||fileName.contains("jpeg")||fileName.contains("png")||fileName.contains("gif")) {
+                    info.setFileType("pic");
+                }
+                info.setFilePath(filePath);
+                if (StringUtils.isNotBlank(size)&&!"null".equals(size)) {
+                    long fileSize = Long.parseLong(size);
+                    double mb = fileSize / (1024.0 * 1024.0);
+                    info.setFileSize(String.format("%.2f MB", mb));
+                }
+                qhseInfoMapper.insert(info);
+            }
+        }
+    }
+    /**
+     * 查找或创建文件夹
+     */
+    private Long findOrCreateFolder(String folderName, Long parentId) {
+        QhseFileTreeDO folder = qhseFileTreeMapper.selectOne("name", folderName, "parent_id", parentId);
+
+        if (folder == null) {
+            folder.setParentId(parentId);
+            folder.setName(folderName);
+            folder.setDeleted(false);
+            folder.setType("file");
+            qhseFileTreeMapper.insert(folder);
+        }
+
+        return folder.getId();
+    }
+
+    private Long processFolderStructure(JsonNode folderStructureNode, Long parentId, Long deptId, String deviceCode, String deptName, List<String> fileNames) {
+        Iterator<String> fieldNames = folderStructureNode.fieldNames();
+
+        while (fieldNames.hasNext()) {
+            String folderName = fieldNames.next();
+            JsonNode folderNode = folderStructureNode.get(folderName);
+
+            // 检查文件夹名是否包含".",如果是则返回当前parentId
+//            if (folderName.contains(".")) {
+//                return parentId; // 返回当前节点的父ID
+//            }
+            if (fileNames.contains(folderName)) {
+                return parentId;
+            }
+            // 查询是否已存在同名同父节点的记录
+            QhseFileTreeDO iotTreeDO = qhseFileTreeMapper.selectOne("name", folderName, "parent_id", parentId);
+
+            Long currentNodeId;
+            if (iotTreeDO != null) {
+                currentNodeId = iotTreeDO.getId();
+            } else {
+                // 创建新节点
+                QhseFileTreeDO folder = new QhseFileTreeDO();
+                folder.setParentId(parentId);
+                folder.setName(folderName);
+                folder.setDeleted(false);
+                folder.setType("file");
+                folder.setDeptId(Math.toIntExact(deptId));
+                folder.setDeviceCode(deviceCode);
+                folder.setDeptName(deptName);
+                qhseFileTreeMapper.insert(folder);
+                currentNodeId = folder.getId();
+            }
+
+            // 递归处理子文件夹
+            JsonNode childrenNode = folderNode.get("children");
+            if (childrenNode != null && !childrenNode.isNull() && !childrenNode.isEmpty()) {
+                // 递归调用,如果子节点处理中返回了parentId,则向上传递
+                Long result = processFolderStructure(childrenNode, currentNodeId, deptId, deviceCode, deptName, fileNames);
+                if (result != null) {
+                    return result; // 子节点处理中遇到了目标,返回结果
+                }
+            }
+        }
+
+        // 正常处理完所有节点,未遇到包含"."的文件夹
+        return null;
+    }
+
+
+    @Override
+    public void updateQhseInfo(QhseInfoSaveReqVO updateReqVO) {
+        // 校验存在
+        validateQhseInfoExists(updateReqVO.getId());
+        // 更新
+        QhseInfoDO updateObj = BeanUtils.toBean(updateReqVO, QhseInfoDO.class);
+        qhseInfoMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteQhseInfo(Long id) {
+        // 校验存在
+        validateQhseInfoExists(id);
+        // 删除
+        qhseInfoMapper.deleteById(id);
+    }
+
+    private void validateQhseInfoExists(Long id) {
+        if (qhseInfoMapper.selectById(id) == null) {
+            throw exception(new ErrorCode(2, "不存在"));
+        }
+    }
+
+    @Override
+    public QhseInfoDO getQhseInfo(Long id) {
+        return qhseInfoMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<QhseInfoDO> getQhseInfoPage(QhseInfoPageReqVO pageReqVO) {
+        IotTreeListReqVO reqVO = new IotTreeListReqVO();
+        List<QhseFileTreeDO> iotTreeList = qhseFileTreeService.getQhseTreeList(reqVO);
+        if (CollUtil.isNotEmpty(iotTreeList)) {
+            pageReqVO.setClassId(iotTreeList.get(0).getId());
+        }
+
+        Set<Long> sets = new HashSet<>();
+        return qhseInfoMapper.selectPage(pageReqVO, sets);
+    }
+
+//    private Set<Long> getInfoCondition(Long classId) {
+//        if (classId == null) {
+//            return Collections.emptySet();
+//        }
+//        Set<Long> deptIds = convertSet(iotInfoClassifyService.getChildInfoList(classId), IotInfoClassifyDO::getId);
+//        deptIds.add(classId); // 包括自身
+//        return deptIds;
+//    }
+
+    private List<QhseInfoRespVO> dealFileVo(List<QhseFileTreeDO> contents, List<QhseInfoDO> files){
+        List<QhseInfoRespVO> contentVos = contents.stream().map(e -> {
+            QhseInfoRespVO iotInfoRespVO = new QhseInfoRespVO();
+            iotInfoRespVO.setFilename(e.getName());
+            iotInfoRespVO.setId(e.getId());
+            iotInfoRespVO.setFileType("content");//设置为文件夹
+//            if (Objects.nonNull(e.getDeptId())) {
+//                DeptRespDTO dept = deptApi.getDept(e.getDeptId());
+//                if (Objects.nonNull(dept)) {
+//                    iotInfoRespVO.setDeptName(dept.getName());
+//                }
+//            }
+            iotInfoRespVO.setDeptName(e.getDeptName());
+            return iotInfoRespVO;
+        }).collect(Collectors.toList());
+        List<QhseInfoRespVO> fileVos = files.stream().map(e -> {
+            QhseInfoRespVO iotInfoRespVO = new QhseInfoRespVO();
+            BeanUtils.copyProperties(e, iotInfoRespVO);
+//            if (Objects.nonNull(e.getDeviceId())) {
+//                IotDeviceDO iotDevice = iotDeviceService.getIotDevice(e.getDeviceId());
+//                if (Objects.nonNull(iotDevice)) {
+//                    iotInfoRespVO.setDeviceName(iotDevice.getDeviceName());
+//                }
+//            }
+//            if (Objects.nonNull(e.getDeptId())) {
+//                DeptRespDTO dept = deptApi.getDept(e.getDeptId());
+//                if (Objects.nonNull(dept)) {
+//                    iotInfoRespVO.setDeptName(dept.getName());
+//                }
+//            }
+            iotInfoRespVO.setDeviceCode(e.getDeviceCode());
+            iotInfoRespVO.setDeptName(e.getDeptName());
+            String docOrPdf = StringUtils.substringAfterLast(iotInfoRespVO.getFilename(), ".");
+            iotInfoRespVO.setFileClassify(docOrPdf);
+            iotInfoRespVO.setFileType("file");
+            return iotInfoRespVO;
+        }).collect(Collectors.toList());
+        contentVos.addAll(fileVos);
+        return contentVos;
+    }
+}