Ver código fonte

Merge remote-tracking branch 'origin/master'

lipenghui 6 dias atrás
pai
commit
de11a950d7
19 arquivos alterados com 441 adições e 41 exclusões
  1. 33 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/IotDeviceController.java
  2. 2 2
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotprojectinfo/IotProjectInfoController.java
  3. 21 22
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotprojecttask/IotProjectTaskController.java
  4. 15 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotprojecttaskschedule/IotProjectTaskScheduleController.java
  5. 3 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/vo/IotDevicePageReqVO.java
  6. 1 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/IotDeviceMapper.java
  7. 15 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotprojecttaskschedule/IotProjectTaskScheduleMapper.java
  8. 8 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/IotDeviceService.java
  9. 12 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/IotDeviceServiceImpl.java
  10. 13 5
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotprojectinfo/IotProjectInfoService.java
  11. 106 4
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotprojectinfo/IotProjectInfoServiceImpl.java
  12. 17 7
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotprojecttask/IotProjectTaskServiceImpl.java
  13. 16 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotprojecttaskschedule/IotProjectTaskScheduleService.java
  14. 38 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotprojecttaskschedule/IotProjectTaskScheduleServiceImpl.java
  15. 18 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/DeptController.java
  16. 5 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/dept/DeptListReqVO.java
  17. 5 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/DeptMapper.java
  18. 16 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptService.java
  19. 97 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptServiceImpl.java

+ 33 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/IotDeviceController.java

@@ -7,6 +7,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageParam;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.pojo.SortablePageParam;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.datapermission.core.util.DataPermissionUtils;
 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
 import cn.iocoder.yudao.module.pms.ThingsModelDTO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotdeviceallotlog.vo.IotDeviceAllotSaveReqVO;
@@ -49,6 +50,7 @@ import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 import java.io.IOException;
 import java.util.*;
+import java.util.concurrent.atomic.AtomicReference;
 import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
@@ -239,6 +241,14 @@ public class IotDeviceController {
                 pageResult.getTotal()));
     }
 
+    @GetMapping("/getDevicesByDepts")
+    @Operation(summary = "项目-任务 根据选择的部门筛选设备 忽略数据权限")
+    public CommonResult<List<IotDeviceSimpleRespVO>> getDevicesByDepts(@Valid IotDevicePageReqVO reqVO) {
+        List<IotDeviceDO> list = iotDeviceService.getDevicesByDepts(reqVO);
+        // 查询设备的所有责任人列表
+        return success(new ArrayList<>(buildDeviceSimpleListNoPermission(list)));
+    }
+
     @GetMapping({"/list-all-simple", "/simple-list"})
     @Operation(summary = "获取设备精简信息列表", description = "只包含被开启的设备,主要用于前端的下拉选项")
     public CommonResult<List<IotDeviceSimpleRespVO>> getSimpleDeviceList(@Valid IotDevicePageReqVO reqVO) {
@@ -413,6 +423,29 @@ public class IotDeviceController {
         });
     }
 
+    private List<IotDeviceSimpleRespVO> buildDeviceSimpleListNoPermission(List<IotDeviceDO> devices) {
+        if (CollUtil.isEmpty(devices)) {
+            return Collections.emptyList();
+        }
+        AtomicReference<Map<Long, DeptDO>> deptMap = new AtomicReference<>(new HashMap<>());
+        AtomicReference<Map<Long, String>> devicePersonNames = new AtomicReference<>(new HashMap<>());
+        DataPermissionUtils.executeIgnore(() -> {
+            // 设备部门信息
+            deptMap.set(deptService.getDeptMap(
+                    convertList(devices, IotDeviceDO::getDeptId)));
+            // 查询设备关联的 负责人
+            devicePersonNames.set(iotDevicePersonService.getIotDevicePerson(convertList(devices, IotDeviceDO::getId)));
+        });
+        // 2. 拼接数据
+        return BeanUtils.toBean(devices, IotDeviceSimpleRespVO.class, (deviceVO) -> {
+            deviceVO.setDeviceStatusName(IotDeviceStatusEnum.nameOf(deviceVO.getDeviceStatus()).getMsg());
+            // 2.1 拼接部门信息
+            findAndThen(deptMap.get(), deviceVO.getDeptId(), dept -> deviceVO.setDeptName(dept.getName()));
+            // 2.2 设备关联的负责人姓名
+            findAndThen(devicePersonNames.get(), deviceVO.getId(), person -> deviceVO.setDevicePersons(person));
+        });
+    }
+
     private List<IotDeviceSimpleRespVO> buildDeviceSimpleList(List<IotDeviceDO> devices) {
         if (CollUtil.isEmpty(devices)) {
             return Collections.emptyList();

+ 2 - 2
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotprojectinfo/IotProjectInfoController.java

@@ -92,10 +92,10 @@ public class IotProjectInfoController {
     public CommonResult<PageResult<IotProjectInfoRespVO>> getIotProjectInfoPage(@Valid IotProjectInfoPageReqVO pageReqVO) {
 
         Set<Long> idList = new HashSet<>();
-        if(Objects.nonNull(pageReqVO.getDeptId())){
+        /* if(Objects.nonNull(pageReqVO.getDeptId())){
             idList =  deptService.getChildDeptIdListFromCache(pageReqVO.getDeptId());
             idList.add(pageReqVO.getDeptId());
-        }
+        } */
 
         PageResult<IotProjectInfoDO> pageResult = iotProjectInfoService.getIotProjectInfoPage1(pageReqVO,idList);
         return success(BeanUtils.toBean(pageResult, IotProjectInfoRespVO.class));

+ 21 - 22
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotprojecttask/IotProjectTaskController.java

@@ -1,37 +1,36 @@
 package cn.iocoder.yudao.module.pms.controller.admin.iotprojecttask;
 
+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.iotprojecttask.vo.IotProjectTaskPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotprojecttask.vo.IotProjectTaskRespVO;
-import cn.iocoder.yudao.module.pms.controller.admin.iotprojecttask.vo.IotProjectTaskSaveReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotprojecttask.vo.IotTaskSaveVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojecttask.IotProjectTaskDO;
 import cn.iocoder.yudao.module.pms.service.iotprojecttask.IotProjectTaskService;
 import cn.iocoder.yudao.module.system.service.dept.DeptService;
-import org.springframework.web.bind.annotation.*;
-import javax.annotation.Resource;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.security.access.prepost.PreAuthorize;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import io.swagger.v3.oas.annotations.Parameter;
 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.validation.constraints.*;
-import javax.validation.*;
-import javax.servlet.http.*;
-import java.util.*;
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
 import java.io.IOException;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
 
-import cn.iocoder.yudao.framework.common.pojo.PageParam;
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.common.pojo.CommonResult;
-import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 
-import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
-
-import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
-import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
-
 
 @Tag(name = "管理后台 - 项目信息任务拆分")
 @RestController
@@ -95,10 +94,10 @@ public class IotProjectTaskController {
     @PreAuthorize("@ss.hasPermission('rq:iot-project-task:query')")
     public CommonResult<PageResult<IotProjectTaskRespVO>> getTaskList( IotProjectTaskPageReqVO pageReqVO) {
         Set<Long> idList = new HashSet<>();
-        if(Objects.nonNull(pageReqVO.getDeptId())){
+        /* if(Objects.nonNull(pageReqVO.getDeptId())){
             idList =  deptService.getChildDeptIdListFromCache(pageReqVO.getDeptId());
             idList.add(pageReqVO.getDeptId());
-        }
+        } */
         PageResult<IotProjectTaskDO> taskList = iotProjectTaskService.taskList(pageReqVO,idList);
         return success(BeanUtils.toBean(taskList, IotProjectTaskRespVO.class));
     }

+ 15 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotprojecttaskschedule/IotProjectTaskScheduleController.java

@@ -43,6 +43,13 @@ public class IotProjectTaskScheduleController {
         return success(iotProjectTaskScheduleService.createIotProjectTaskSchedule(createReqVO));
     }
 
+    @PostMapping("/saveTaskSchedule")
+    @Operation(summary = "保存项目日报 任务进度表")
+    @PreAuthorize("@ss.hasPermission('rq:iot-project-task-schedule:create')")
+    public CommonResult<Long> saveTaskSchedule(@Valid @RequestBody List<IotProjectTaskScheduleSaveReqVO> schedule) {
+        return success(iotProjectTaskScheduleService.saveTaskSchedule(schedule));
+    }
+
     @PutMapping("/update")
     @Operation(summary = "更新项目任务时间表/施工进度")
     @PreAuthorize("@ss.hasPermission('rq:iot-project-task-schedule:update')")
@@ -77,6 +84,14 @@ public class IotProjectTaskScheduleController {
         return success(BeanUtils.toBean(pageResult, IotProjectTaskScheduleRespVO.class));
     }
 
+    @GetMapping("/list")
+    @Operation(summary = "获得项目任务时间表/施工进度列表")
+    @PreAuthorize("@ss.hasPermission('rq:iot-project-task-schedule:query')")
+    public CommonResult<List<IotProjectTaskScheduleRespVO>> getIotProjectTaskSchedules(@Valid IotProjectTaskSchedulePageReqVO pageReqVO) {
+        List<IotProjectTaskScheduleDO> projectTaskSchedules = iotProjectTaskScheduleService.getIotProjectTaskSchedules(pageReqVO);
+        return success(BeanUtils.toBean(projectTaskSchedules, IotProjectTaskScheduleRespVO.class));
+    }
+
     @GetMapping("/export-excel")
     @Operation(summary = "导出项目任务时间表/施工进度 Excel")
     @PreAuthorize("@ss.hasPermission('rq:iot-project-task-schedule:export')")

+ 3 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/vo/IotDevicePageReqVO.java

@@ -140,4 +140,7 @@ public class IotDevicePageReqVO extends PageParam {
     private Integer ifInline;
 
     private String brandName;
+
+    @Schema(description = "部门id集合 项目-任务 根据选择的部门筛选设备")
+    private List<Long> deptIds;
 }

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

@@ -148,6 +148,7 @@ public interface IotDeviceMapper extends BaseMapperX<IotDeviceDO> {
     }
     default List<IotDeviceDO> selectSimpleList(IotDevicePageReqVO reqVO, Collection<Long> deptIds) {
         return selectList(new LambdaQueryWrapperX<IotDeviceDO>()
+                .inIfPresent(IotDeviceDO::getDeptId, reqVO.getDeptIds())
                 .likeIfPresent(IotDeviceDO::getDeviceCode, reqVO.getDeviceCode())
                 .likeIfPresent(IotDeviceDO::getDeviceName, reqVO.getDeviceName())
                 .inIfPresent(IotDeviceDO::getDeptId, deptIds));

+ 15 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotprojecttaskschedule/IotProjectTaskScheduleMapper.java

@@ -7,6 +7,8 @@ import cn.iocoder.yudao.module.pms.controller.admin.iotprojecttaskschedule.vo.Io
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojecttaskschedule.IotProjectTaskScheduleDO;
 import org.apache.ibatis.annotations.Mapper;
 
+import java.util.List;
+
 /**
  * 项目任务时间表/施工进度 Mapper
  *
@@ -28,4 +30,17 @@ public interface IotProjectTaskScheduleMapper extends BaseMapperX<IotProjectTask
                 .orderByDesc(IotProjectTaskScheduleDO::getId));
     }
 
+    default List<IotProjectTaskScheduleDO> selectList(IotProjectTaskSchedulePageReqVO reqVO) {
+        return selectList(new LambdaQueryWrapperX<IotProjectTaskScheduleDO>()
+                .eqIfPresent(IotProjectTaskScheduleDO::getProjectId, reqVO.getProjectId())
+                .eqIfPresent(IotProjectTaskScheduleDO::getTaskId, reqVO.getTaskId())
+                .eqIfPresent(IotProjectTaskScheduleDO::getStatus, reqVO.getStatus())
+                .eqIfPresent(IotProjectTaskScheduleDO::getDescription, reqVO.getDescription())
+                .betweenIfPresent(IotProjectTaskScheduleDO::getStartTime, reqVO.getStartTime())
+                .betweenIfPresent(IotProjectTaskScheduleDO::getEndTime, reqVO.getEndTime())
+                .eqIfPresent(IotProjectTaskScheduleDO::getRemark, reqVO.getRemark())
+                .betweenIfPresent(IotProjectTaskScheduleDO::getCreateTime, reqVO.getCreateTime())
+                .orderByAsc(IotProjectTaskScheduleDO::getStatus));
+    }
+
 }

+ 8 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/IotDeviceService.java

@@ -8,7 +8,6 @@ import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDevicePageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceRespVO;
 import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceSaveReqVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.IotDeviceDO;
-import cn.iocoder.yudao.module.pms.dal.dataobject.yanfan.ThingsModelDO;
 
 import javax.validation.Valid;
 import java.util.Collection;
@@ -72,6 +71,14 @@ public interface IotDeviceService {
      */
     List<IotDeviceDO> getSimpleDeviceList(IotDevicePageReqVO reqVO);
 
+    /**
+     * 项目-任务 根据选择的部门筛选设备 忽略数据权限
+     *
+     * @param reqVO 查询参数
+     * @return 设备台账列表
+     */
+    List<IotDeviceDO> getDevicesByDepts(IotDevicePageReqVO reqVO);
+
     PageResult<IotDeviceDO> getIotDeviceTdPage(IotDevicePageReqVO pageReqVO, List<String> codes);
     PageResult<IotDeviceDO> getIotDeviceTdPageApp(IotDevicePageReqVO pageReqVO, List<String> codes);
 

+ 12 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/IotDeviceServiceImpl.java

@@ -9,6 +9,7 @@ import cn.iocoder.yudao.framework.common.pojo.SortablePageParam;
 import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.common.util.object.PageUtils;
+import cn.iocoder.yudao.framework.datapermission.core.util.DataPermissionUtils;
 import cn.iocoder.yudao.module.pms.ThingsModelDTO;
 import cn.iocoder.yudao.module.pms.controller.admin.TableDataInfo;
 import cn.iocoder.yudao.module.pms.controller.admin.iotdeviceperson.vo.IotDevicePersonPageReqVO;
@@ -62,6 +63,7 @@ import org.springframework.web.client.RestTemplate;
 
 import javax.annotation.Resource;
 import java.util.*;
+import java.util.concurrent.atomic.AtomicReference;
 import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
@@ -364,6 +366,16 @@ public class IotDeviceServiceImpl implements IotDeviceService {
         return iotDeviceMapper.selectSimpleList(reqVO, ids);
     }
 
+    @Override
+    public List<IotDeviceDO> getDevicesByDepts(IotDevicePageReqVO reqVO) {
+        AtomicReference<List<IotDeviceDO>> devices = new AtomicReference<>(new ArrayList<>());
+        // 忽略数据权限
+        DataPermissionUtils.executeIgnore(() -> {
+            devices.set(iotDeviceMapper.selectSimpleList(reqVO, null));
+        });
+        return devices.get();
+    }
+
     @Override
     public PageResult<IotDeviceDO> getIotDeviceTdPage(IotDevicePageReqVO pageReqVO, List<String> codes) {
         Set<Long> ids = new HashSet<>();

+ 13 - 5
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotprojectinfo/IotProjectInfoService.java

@@ -1,13 +1,14 @@
 package cn.iocoder.yudao.module.pms.service.iotprojectinfo;
 
-import java.util.*;
-import javax.validation.*;
-
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.module.pms.controller.admin.iotprojectinfo.vo.IotProjectInfoPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotprojectinfo.vo.IotProjectInfoSaveReqVO;
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.common.pojo.PageParam;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojectinfo.IotProjectInfoDO;
+import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
+
+import javax.validation.Valid;
+import java.util.Collection;
+import java.util.List;
 
 /**
  * 项目信息 Service 接口
@@ -56,6 +57,13 @@ public interface IotProjectInfoService {
 
     PageResult<IotProjectInfoDO> getIotProjectInfoPage1(IotProjectInfoPageReqVO pageReqVO,Collection<Long> deptIds);
 
+    /**
+     * 获得项目信息列表
+     *
+     * @return 筛选当前登录人所属公司级部门下的项目信息
+     */
     List<IotProjectInfoDO> projectList();
 
+    List<DeptDO> companyLevelDepts();
+
 }

+ 106 - 4
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotprojectinfo/IotProjectInfoServiceImpl.java

@@ -1,17 +1,23 @@
 package cn.iocoder.yudao.module.pms.service.iotprojectinfo;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.datapermission.core.util.DataPermissionUtils;
+import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
 import cn.iocoder.yudao.module.pms.controller.admin.iotprojectinfo.vo.IotProjectInfoPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotprojectinfo.vo.IotProjectInfoSaveReqVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojectinfo.IotProjectInfoDO;
 import cn.iocoder.yudao.module.pms.dal.mysql.iotprojectinfo.IotProjectInfoMapper;
+import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
+import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
+import cn.iocoder.yudao.module.system.dal.mysql.dept.DeptMapper;
+import cn.iocoder.yudao.module.system.dal.mysql.user.AdminUserMapper;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
-import java.util.Collection;
-import java.util.List;
+import java.util.*;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant.IOT_PROJECT_INFO_NOT_EXISTS;
@@ -27,6 +33,10 @@ public class IotProjectInfoServiceImpl implements IotProjectInfoService {
 
     @Resource
     private IotProjectInfoMapper iotProjectInfoMapper;
+    @Resource
+    private DeptMapper deptMapper;
+    @Resource
+    private AdminUserMapper userMapper;
 
     @Override
     public Long createIotProjectInfo(IotProjectInfoSaveReqVO createReqVO) {
@@ -72,12 +82,104 @@ public class IotProjectInfoServiceImpl implements IotProjectInfoService {
 
     @Override
     public PageResult<IotProjectInfoDO> getIotProjectInfoPage1(IotProjectInfoPageReqVO pageReqVO, Collection<Long> deptIds) {
-        return iotProjectInfoMapper.selectPage1(pageReqVO,deptIds);
+        // 查询当前人所属公司级组织的数据
+        List<DeptDO> depts = companyLevelDepts();
+        Set<Long> departmentIds = new HashSet<>();
+        if (CollUtil.isNotEmpty(depts)) {
+            depts.forEach(dept -> {
+                departmentIds.add(dept.getId());
+            });
+        }
+        return iotProjectInfoMapper.selectPage1(pageReqVO,departmentIds);
     }
 
     @Override
     public List<IotProjectInfoDO> projectList() {
-        return iotProjectInfoMapper.projectList();
+        // 查询当前用户所属部门的公司级组织
+        List<DeptDO> companyLevelDepts = companyLevelDepts();
+        Set<Long> deptIds = new HashSet<>();
+        if (CollUtil.isNotEmpty(companyLevelDepts)) {
+            companyLevelDepts.forEach(dept -> {
+                deptIds.add(dept.getId());
+            });
+        }
+        List<IotProjectInfoDO> allProjects = iotProjectInfoMapper.projectList();
+        List<IotProjectInfoDO> resultProjects = new ArrayList<>();
+        if (CollUtil.isNotEmpty(allProjects)) {
+            allProjects.forEach(project -> {
+                if (deptIds.contains(project.getDeptId())) {
+                    resultProjects.add(project);
+                }
+            });
+        }
+        return resultProjects;
+    }
+
+    /**
+     * 查询当前登录人所属部门的公司级组织
+     * @return
+     */
+    public List<DeptDO> companyLevelDepts() {
+        Set<Long> parentIds = new HashSet<>();
+        parentIds.add(DeptDO.PARENT_ID_ROOT);
+
+        // 查询当前登录人所属部门
+        Long userId = SecurityFrameworkUtils.getLoginUserId();
+        AdminUserDO user = userMapper.selectById(userId);
+        Long deptId = user.getDeptId();
+        DeptDO dept = deptMapper.selectById(deptId);
+        System.out.println("当前登录用户所属部门:" + dept.getName());
+
+        // 用于存储最终需要返回的部门列表
+        List<DeptDO> resultDepts = new ArrayList<>();
+
+        DataPermissionUtils.executeIgnore(() -> {
+            // 一级部门
+            List<DeptDO> theFirstLevelDepts = deptMapper.selectListByParentId(parentIds);
+            System.out.println("顶级部门数量:" + theFirstLevelDepts.size());
+            if (CollUtil.isNotEmpty(theFirstLevelDepts)) {
+                theFirstLevelDepts.forEach(department -> {
+                    if (dept.getId().equals(department.getId())) {
+                        // 当前登录人所属部门是 一级部门
+                        // 此时需要返回一级部门的二级公司子部门
+                        parentIds.clear();
+                        parentIds.add(department.getId());
+                        List<DeptDO> theSecondLevelDepts = deptMapper.selectListByParentId(parentIds);
+                        System.out.println("二级部门数量:" + theSecondLevelDepts.size());
+                        resultDepts.addAll(theSecondLevelDepts);
+                    }
+                    // 当前登录人所属部门是二级部门或二级部门的子部门
+                    if (!dept.getId().equals(department.getId())) {
+                        // 查询当前登录人所属部门的父部门 追溯到二级部门
+                        // 递归查询当前登录人所属部门的父部门 直到找到 二级部门(parentId=department.getId())
+                        // 如果 parentDept.getParentId().equals(department.getId()) 说明parentDept部门已经是二级部门了
+                        DeptDO currentDept = dept;
+                        if (currentDept.getParentId().equals(department.getId())) {
+                            // 当前部门是二级部门(父部门是一级部门)
+                            if (!resultDepts.contains(dept)) {
+                                resultDepts.add(dept);
+                            }
+                        }
+                        while (currentDept != null && !currentDept.getParentId().equals(DeptDO.PARENT_ID_ROOT)) {
+                            DeptDO tempParentDept = deptMapper.selectById(currentDept.getParentId());
+                            if (tempParentDept == null) {
+                                break;
+                            }
+                            if (currentDept.getParentId().equals(department.getId())) {
+                                // 当前部门是二级部门(父部门是一级部门)
+                                if (!resultDepts.contains(dept)) {
+                                    resultDepts.add(currentDept);
+                                }
+                                break;
+                            }
+                            currentDept = tempParentDept;
+                        }
+                    }
+                });
+            }
+
+        });
+        return resultDepts;
     }
 
 }

+ 17 - 7
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotprojecttask/IotProjectTaskServiceImpl.java

@@ -1,22 +1,22 @@
 package cn.iocoder.yudao.module.pms.service.iotprojecttask;
 
 
+import cn.hutool.core.collection.CollUtil;
+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.iotprojecttask.vo.IotProjectTaskPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotprojecttask.vo.IotProjectTaskSaveReqVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojecttask.IotProjectTaskDO;
 import cn.iocoder.yudao.module.pms.dal.mysql.iotprojecttask.IotProjectTaskMapper;
+import cn.iocoder.yudao.module.pms.service.iotprojectinfo.IotProjectInfoService;
+import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import org.springframework.stereotype.Service;
-import javax.annotation.Resource;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.transaction.annotation.Transactional;
 
+import javax.annotation.Resource;
 import java.util.*;
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.common.pojo.PageParam;
-import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
-
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant.IOT_PROJECT_TASK_NOT_EXISTS;
@@ -32,6 +32,8 @@ public class IotProjectTaskServiceImpl implements IotProjectTaskService {
 
     @Resource
     private IotProjectTaskMapper iotProjectTaskMapper;
+    @Resource
+    private IotProjectInfoService iotProjectInfoService;
 
     @Override
     public Long createIotProjectTask(IotProjectTaskSaveReqVO createReqVO) {
@@ -102,13 +104,21 @@ public class IotProjectTaskServiceImpl implements IotProjectTaskService {
 
     @Override
     public PageResult<IotProjectTaskDO> taskList(IotProjectTaskPageReqVO vo,Collection<Long> deptIds) {
+        // 查询当前登录人所属性部门的公司级组织 根据组织 查询组织下的项目任务
+        List<DeptDO> depts = iotProjectInfoService.companyLevelDepts();
+        Set<Long> departmentIds = new HashSet<>();
+        if (CollUtil.isNotEmpty(depts)) {
+            depts.forEach(dept -> {
+                departmentIds.add(dept.getId());
+            });
+        }
         IPage<IotProjectTaskDO> taskDOIPage = iotProjectTaskMapper.taskList(Page.of(vo.getPageNo(), vo.getPageSize()),
                 vo.getManufactureName(),
                 vo.getContractName(),
                 vo.getContractCode(),
                 vo.getWellName(),
                 vo.getCreateTime(),
-                deptIds);
+                departmentIds);
         return new PageResult<>(taskDOIPage.getRecords(),taskDOIPage.getTotal());
     }
 

+ 16 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotprojecttaskschedule/IotProjectTaskScheduleService.java

@@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.pms.controller.admin.iotprojecttaskschedule.vo.Io
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojecttaskschedule.IotProjectTaskScheduleDO;
 
 import javax.validation.Valid;
+import java.util.List;
 
 /**
  * 项目任务时间表/施工进度 Service 接口
@@ -52,4 +53,19 @@ public interface IotProjectTaskScheduleService {
      */
     PageResult<IotProjectTaskScheduleDO> getIotProjectTaskSchedulePage(IotProjectTaskSchedulePageReqVO pageReqVO);
 
+    /**
+     * 保存任务进度计划表
+     *
+     * @param schedule 任务进度表
+     * @return 更新记录数量
+     */
+    Long saveTaskSchedule(List<IotProjectTaskScheduleSaveReqVO> schedule);
+
+    /**
+     * 查询任务进度计划表
+     *
+     * @param pageReqVO 请求参数
+     * @return 任务进度计划列表
+     */
+    List<IotProjectTaskScheduleDO> getIotProjectTaskSchedules(IotProjectTaskSchedulePageReqVO pageReqVO);
 }

+ 38 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotprojecttaskschedule/IotProjectTaskScheduleServiceImpl.java

@@ -1,16 +1,23 @@
 package cn.iocoder.yudao.module.pms.service.iotprojecttaskschedule;
 
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
 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.iotprojecttaskschedule.vo.IotProjectTaskSchedulePageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotprojecttaskschedule.vo.IotProjectTaskScheduleSaveReqVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojecttaskschedule.IotProjectTaskScheduleDO;
 import cn.iocoder.yudao.module.pms.dal.mysql.iotprojecttaskschedule.IotProjectTaskScheduleMapper;
+import com.google.common.collect.ImmutableMap;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
 
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant.IOT_PROJECT_TASK_SCHEDULE_NOT_EXISTS;
 
@@ -68,4 +75,35 @@ public class IotProjectTaskScheduleServiceImpl implements IotProjectTaskSchedule
         return iotProjectTaskScheduleMapper.selectPage(pageReqVO);
     }
 
+    @Override
+    public Long saveTaskSchedule(List<IotProjectTaskScheduleSaveReqVO> schedules) {
+        // 先删除已有的进度计划记录 再新增
+        if (CollUtil.isNotEmpty(schedules)) {
+            Long taskId = schedules.get(0).getTaskId();
+            iotProjectTaskScheduleMapper.deleteByMap(ImmutableMap.of(
+                    "task_id", taskId
+            ));
+            List<IotProjectTaskScheduleDO> tobeAddedSchedules = new ArrayList<>();
+            // 使用 Java8 Stream 转换,并忽略 id
+            tobeAddedSchedules = schedules.stream()
+                    .map(vo -> {
+                        IotProjectTaskScheduleDO entity = new IotProjectTaskScheduleDO();
+                        // 拷贝属性时忽略 id
+                        BeanUtil.copyProperties(vo, entity, "id");
+                        return entity;
+                    })
+                    .collect(Collectors.toList());
+            // 批量保存
+            if (CollUtil.isNotEmpty(tobeAddedSchedules)) {
+                iotProjectTaskScheduleMapper.insertBatch(tobeAddedSchedules);
+            }
+        }
+        return 1l;
+    }
+
+    @Override
+    public List<IotProjectTaskScheduleDO> getIotProjectTaskSchedules(IotProjectTaskSchedulePageReqVO pageReqVO) {
+        return iotProjectTaskScheduleMapper.selectList(pageReqVO);
+    }
+
 }

+ 18 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/DeptController.java

@@ -65,6 +65,24 @@ public class DeptController {
         return success(BeanUtils.toBean(list, DeptRespVO.class));
     }
 
+    @GetMapping("/companyLevelDepts")
+    @Operation(summary = "获取公司层级的部门", description = "查询公司层级的部门列表")
+    @PermitAll
+    public CommonResult<List<DeptSimpleRespVO>> companyLevelDepts() {
+        List<DeptDO> list = deptService.companyLevelDepts(
+                new DeptListReqVO().setStatus(CommonStatusEnum.ENABLE.getStatus()));
+        return success(BeanUtils.toBean(list, DeptSimpleRespVO.class));
+    }
+
+    @GetMapping("/companyLevelChildrenDepts")
+    @Operation(summary = "获取公司层级的部门 及所有子部门", description = "查询公司层级的部门及所有子部门列表")
+    @PermitAll
+    public CommonResult<List<DeptSimpleRespVO>> companyLevelChildrenDepts() {
+        List<DeptDO> list = deptService.companyLevelChildrenDepts(
+                new DeptListReqVO().setStatus(CommonStatusEnum.ENABLE.getStatus()));
+        return success(BeanUtils.toBean(list, DeptSimpleRespVO.class));
+    }
+
     @GetMapping(value = {"/list-all-simple", "/simple-list"})
     @Operation(summary = "获取部门精简信息列表", description = "只包含被开启的部门,主要用于前端的下拉选项")
     @PermitAll

+ 5 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/dept/DeptListReqVO.java

@@ -3,6 +3,8 @@ package cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
+import java.util.Collection;
+
 @Schema(description = "管理后台 - 部门列表 Request VO")
 @Data
 public class DeptListReqVO {
@@ -13,4 +15,7 @@ public class DeptListReqVO {
     @Schema(description = "展示状态,参见 CommonStatusEnum 枚举类", example = "1")
     private Integer status;
 
+    @Schema(description = "部门id集合", example = "[12,14]")
+    private Collection<Long> deptIds;
+
 }

+ 5 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/DeptMapper.java

@@ -15,6 +15,7 @@ public interface DeptMapper extends BaseMapperX<DeptDO> {
     default List<DeptDO> selectList(DeptListReqVO reqVO) {
         return selectList(new LambdaQueryWrapperX<DeptDO>()
                 .likeIfPresent(DeptDO::getName, reqVO.getName())
+                .inIfPresent(DeptDO::getId, reqVO.getDeptIds())
                 .eqIfPresent(DeptDO::getStatus, reqVO.getStatus()));
     }
 
@@ -30,6 +31,10 @@ public interface DeptMapper extends BaseMapperX<DeptDO> {
         return selectList(DeptDO::getParentId, parentIds);
     }
 
+    default DeptDO selectByParentId(Long parentId) {
+        return selectOne(DeptDO::getParentId, parentId);
+    }
+
     default List<DeptDO> selectListByLeaderUserId(Long id) {
         return selectList(DeptDO::getLeaderUserId, id);
     }

+ 16 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptService.java

@@ -59,6 +59,15 @@ public interface DeptService {
      * @return 部门列表
      */
     List<DeptDO> getDeptList(DeptListReqVO reqVO);
+
+    /**
+     * 筛选公司层级的部门列表
+     *
+     * @param reqVO 筛选条件请求 VO
+     * @return 部门列表
+     */
+    List<DeptDO> companyLevelDepts(DeptListReqVO reqVO);
+
     List<DeptDO> getDeptByName(String deptName);
     /**
      * 获得指定编号的部门 Map
@@ -114,4 +123,11 @@ public interface DeptService {
      */
     void validateDeptList(Collection<Long> ids);
 
+    /**
+     * 查询所有公司级别部门及子部门
+     *
+     * @param id 父部门编号
+     * @return 子部门列表
+     */
+    List<DeptDO> companyLevelChildrenDepts(DeptListReqVO deptListReqVO);
 }

+ 97 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptServiceImpl.java

@@ -6,12 +6,16 @@ import cn.hutool.core.util.ObjectUtil;
 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.datapermission.core.annotation.DataPermission;
+import cn.iocoder.yudao.framework.datapermission.core.util.DataPermissionUtils;
+import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
 import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptListReqVO;
 import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptSaveReqVO;
 import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
 import cn.iocoder.yudao.module.system.dal.dataobject.deptsaporg.DeptSapOrgDO;
+import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
 import cn.iocoder.yudao.module.system.dal.mysql.dept.DeptMapper;
 import cn.iocoder.yudao.module.system.dal.mysql.deptsaporg.DeptSapOrgMapper;
+import cn.iocoder.yudao.module.system.dal.mysql.user.AdminUserMapper;
 import cn.iocoder.yudao.module.system.dal.redis.RedisKeyConstants;
 import com.google.common.annotations.VisibleForTesting;
 import lombok.extern.slf4j.Slf4j;
@@ -43,6 +47,8 @@ public class DeptServiceImpl implements DeptService {
     private DeptMapper deptMapper;
     @Resource
     private DeptSapOrgMapper deptSapOrgMapper;
+    @Resource
+    private AdminUserMapper userMapper;
 
     @Override
     @CacheEvict(cacheNames = RedisKeyConstants.DEPT_CHILDREN_ID_LIST,
@@ -250,6 +256,69 @@ public class DeptServiceImpl implements DeptService {
         return list;
     }
 
+    @Override
+    public List<DeptDO> companyLevelDepts(DeptListReqVO reqVO) {
+        Set<Long> parentIds = new HashSet<>();
+        parentIds.add(DeptDO.PARENT_ID_ROOT);
+
+        // 查询当前登录人所属部门
+        Long userId = SecurityFrameworkUtils.getLoginUserId();
+        AdminUserDO user = userMapper.selectById(userId);
+        Long deptId = user.getDeptId();
+        DeptDO dept = getDept(deptId);
+        System.out.println("当前登录用户所属部门:" + dept.getName());
+
+        // 用于存储最终需要返回的部门列表
+        List<DeptDO> resultDepts = new ArrayList<>();
+
+        DataPermissionUtils.executeIgnore(() -> {
+            // 一级部门
+            List<DeptDO> theFirstLevelDepts = deptMapper.selectListByParentId(parentIds);
+            System.out.println("顶级部门数量:" + theFirstLevelDepts.size());
+            if (CollUtil.isNotEmpty(theFirstLevelDepts)) {
+                theFirstLevelDepts.forEach(department -> {
+                    if (dept.getId().equals(department.getId())) {
+                        // 当前登录人所属部门是 一级部门
+                        // 此时需要返回一级部门的二级公司子部门
+                        parentIds.clear();
+                        parentIds.add(department.getId());
+                        List<DeptDO> theSecondLevelDepts = deptMapper.selectListByParentId(parentIds);
+                        System.out.println("二级部门数量:" + theSecondLevelDepts.size());
+                        resultDepts.addAll(theSecondLevelDepts);
+                    }
+                    // 当前登录人所属部门是二级部门或二级部门的子部门
+                    if (!dept.getId().equals(department.getId())) {
+                        // 查询当前登录人所属部门的父部门 追溯到二级部门
+                        // 递归查询当前登录人所属部门的父部门 直到找到 二级部门(parentId=department.getId())
+                        // 如果 parentDept.getParentId().equals(department.getId()) 说明parentDept部门已经是二级部门了
+                        DeptDO currentDept = dept;
+                        if (currentDept.getParentId().equals(department.getId())) {
+                            // 当前部门是二级部门(父部门是一级部门)
+                            if (!resultDepts.contains(dept)) {
+                                resultDepts.add(dept);
+                            }
+                        }
+                        while (currentDept != null && !currentDept.getParentId().equals(DeptDO.PARENT_ID_ROOT)) {
+                            DeptDO tempParentDept = deptMapper.selectById(currentDept.getParentId());
+                            if (tempParentDept == null) {
+                                break;
+                            }
+                            if (currentDept.getParentId().equals(department.getId())) {
+                                // 当前部门是二级部门(父部门是一级部门)
+                                if (!resultDepts.contains(dept)) {
+                                    resultDepts.add(currentDept);
+                                }
+                                break;
+                            }
+                            currentDept = tempParentDept;
+                        }
+                    }
+                });
+            }
+        });
+        return resultDepts;
+    }
+
     @Override
     public List<DeptDO> getDeptByName(String deptName) {
         DeptListReqVO reqVO = new DeptListReqVO();
@@ -308,4 +377,32 @@ public class DeptServiceImpl implements DeptService {
         });
     }
 
+    @Override
+    public List<DeptDO> companyLevelChildrenDepts(DeptListReqVO deptListReqVO) {
+        List<DeptDO> companyLevelDepts = companyLevelDepts(null);
+        List<DeptDO> resultDepts = new ArrayList<>();
+        // 查询每个公司级部门下的所有子部门
+        if (CollUtil.isNotEmpty(companyLevelDepts)) {
+            Set<Long> allDeptIds = new HashSet<>();
+            resultDepts.addAll(companyLevelDepts);
+            companyLevelDepts.forEach(dept -> {
+                DataPermissionUtils.executeIgnore(() -> {
+                    // 查询当前部门dept的所有子部门
+                    Set<Long> tempDeptIds = getChildDeptIdListFromCache(dept.getId());
+                    allDeptIds.addAll(tempDeptIds);
+                });
+            });
+            // 查询 allDeptIds 对应的部门信息
+            if (CollUtil.isNotEmpty(allDeptIds)) {
+                DataPermissionUtils.executeIgnore(() -> {
+                    DeptListReqVO reqVO = new DeptListReqVO();
+                    reqVO.setDeptIds(allDeptIds);
+                    List<DeptDO> childrenDepts = deptMapper.selectList(reqVO);
+                    resultDepts.addAll(childrenDepts);
+                });
+            }
+        }
+        return resultDepts;
+    }
+
 }