Browse Source

作者:张哲
时间:2023/02/03
类型:开发
描述:知识地图开发

ZizgZh 2 years ago
parent
commit
b929398117
24 changed files with 786 additions and 135 deletions
  1. 17 2
      src/main/java/com/redxun/config/Swagger2Config.java
  2. 28 0
      src/main/java/com/redxun/config/ThreadPoolConfig.java
  3. 70 0
      src/main/java/com/redxun/knowledge/album/entity/vo/AlbumCategoryVo.java
  4. 4 4
      src/main/java/com/redxun/knowledge/common/UserService.java
  5. 52 1
      src/main/java/com/redxun/knowledge/map/controller/MapController.java
  6. 2 1
      src/main/java/com/redxun/knowledge/map/controller/MapGroupPurviewUserController.java
  7. 0 3
      src/main/java/com/redxun/knowledge/map/entity/dao/MapContent.java
  8. 82 0
      src/main/java/com/redxun/knowledge/map/entity/dao/MapLearning.java
  9. 0 3
      src/main/java/com/redxun/knowledge/map/entity/dao/MapRoute.java
  10. 34 0
      src/main/java/com/redxun/knowledge/map/entity/vo/MapPcVo.java
  11. 3 0
      src/main/java/com/redxun/knowledge/map/entity/vo/MapRouteVo.java
  12. 38 0
      src/main/java/com/redxun/knowledge/map/entity/vo/OsUserVo.java
  13. 3 0
      src/main/java/com/redxun/knowledge/map/mapper/MapGroupPurviewUserMapper.java
  14. 19 0
      src/main/java/com/redxun/knowledge/map/mapper/MapLearningMapper.java
  15. 18 2
      src/main/java/com/redxun/knowledge/map/mapper/MapMapper.java
  16. 17 6
      src/main/java/com/redxun/knowledge/map/service/MapGroupPurviewUserServiceImpl.java
  17. 30 0
      src/main/java/com/redxun/knowledge/map/service/MapLearningServiceImpl.java
  18. 20 33
      src/main/java/com/redxun/knowledge/map/service/MapRouteServiceImpl.java
  19. 232 72
      src/main/java/com/redxun/knowledge/map/service/MapServiceImpl.java
  20. 2 3
      src/main/resources/mapper/knowledge/map/MapContentMapper.xml
  21. 10 1
      src/main/resources/mapper/knowledge/map/MapGroupPurviewUserMapper.xml
  22. 38 0
      src/main/resources/mapper/knowledge/map/MapLearningMapper.xml
  23. 65 1
      src/main/resources/mapper/knowledge/map/MapMapper.xml
  24. 2 3
      src/main/resources/mapper/knowledge/map/MapRouteMapper.xml

+ 17 - 2
src/main/java/com/redxun/config/Swagger2Config.java

@@ -18,7 +18,7 @@ import java.util.List;
 /**
  * 文件名: Swagger2Config
  * 作者: Zizg
- * 时间: 2022/01/06
+ * 时间: 2023/01/06
  * 描述: 接口文档配置
  * 修改人:
  * 修改时间:
@@ -47,7 +47,7 @@ public class Swagger2Config {
     public Docket knowledgeTwoApiConfig(){
 
         return new Docket(DocumentationType.SWAGGER_2)
-                .groupName("知识管理系统(里程碑2)")
+                .groupName("知识管理系统(里程碑2地图)")
                 .apiInfo(knowledgeApiInfo())
                 .select()
                 //只显示admin路径下的页面
@@ -58,6 +58,21 @@ public class Swagger2Config {
 
     }
 
+    @Bean
+    public Docket knowledgeTwoApiConfig2(){
+
+        return new Docket(DocumentationType.SWAGGER_2)
+                .groupName("知识管理系统(里程碑2专辑)")
+                .apiInfo(knowledgeApiInfo())
+                .select()
+                //只显示admin路径下的页面
+                .paths(Predicates.and(PathSelectors.regex("/api-knowledge/album/.*")))
+                .build()
+                .securityContexts(Arrays.asList(securityContexts()))
+                .securitySchemes(unifiedAuth());
+
+    }
+
     @Bean
     public Docket searchApiConfig(){
         return new Docket(DocumentationType.SWAGGER_2)

+ 28 - 0
src/main/java/com/redxun/config/ThreadPoolConfig.java

@@ -0,0 +1,28 @@
+package com.redxun.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+@Configuration
+public class ThreadPoolConfig {
+
+    @Bean
+    public ThreadPoolExecutor threadPoolExecutor() {
+        /**
+         * 核心线程数
+         * 拥有最多线程数
+         * 表示空闲线程的存活时间
+         * 存活时间单位
+         * 用于缓存任务的阻塞队列
+         * 省略:
+         *  threadFactory:指定创建线程的工厂
+         *  handler:表示当workQueue已满,且池中的线程数达到maximumPoolSize时,线程池拒绝添加新任务时采取的策略。
+         */
+        return new ThreadPoolExecutor(50, 500, 30,
+                TimeUnit.SECONDS, new ArrayBlockingQueue<>(10000));
+    }
+}

+ 70 - 0
src/main/java/com/redxun/knowledge/album/entity/vo/AlbumCategoryVo.java

@@ -0,0 +1,70 @@
+package com.redxun.knowledge.album.entity.vo;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.apache.ibatis.type.JdbcType;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 文件名: AlbumCategoryVo
+ * 作者: Zizg
+ * 时间: 2023/1/31
+ * 描述:
+ * 修改人:
+ * 修改时间:
+ * 修改内容:
+ */
+@ApiModel("专辑分类Vo")
+@Data
+public class AlbumCategoryVo implements Serializable {
+
+    //主键
+    @ApiModelProperty("分类Id")
+    private String pkId;
+
+    //分类名称
+    @ApiModelProperty("分类名称")
+    private String name;
+
+    @ApiModelProperty("父类Id")
+    private String parent;
+
+    //GRADE
+    @ApiModelProperty("层级")
+    private Long grade;
+
+    //SORT
+    @ApiModelProperty("排序")
+    private Integer sort;
+
+    @ApiModelProperty("修改人")
+    private String updateBy;
+
+    @ApiModelProperty("操作人")
+    private String operator;
+
+    @DateTimeFormat(
+            pattern = "yyyy-MM-dd HH:mm:ss"
+    )
+    @JSONField(
+            format = "yyyy-MM-dd HH:mm:ss"
+    )
+    @JsonFormat(
+            pattern = "yyyy-MM-dd HH:mm:ss",
+            timezone = "GMT+8"
+    )
+    @ApiModelProperty("操作时间")
+    private Date updateTime;
+
+    @ApiModelProperty("下级节点")
+    private List<AlbumCategoryVo> children;
+
+}

+ 4 - 4
src/main/java/com/redxun/knowledge/common/UserService.java

@@ -143,13 +143,13 @@ public class UserService {
     }
 
     /**
-     * 根据部门id查询全部员工信息
+     * 根据部门id(公司Id)查询部门对象
      * @param deptId
      * @return
      */
-    public List<OsUserDto> findUserListByDeptId(String deptId){
-        List<OsUserDto> osUserDtoList = orgClient.getByGroupId(deptId);
-        return osUserDtoList;
+    public OsGroupDto findDeptByDeptId(String deptId){
+        OsGroupDto osGroupDto = orgClient.getGroupById(deptId);
+        return osGroupDto;
     }
 
 

+ 52 - 1
src/main/java/com/redxun/knowledge/map/controller/MapController.java

@@ -1,20 +1,30 @@
 
 package com.redxun.knowledge.map.controller;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.redxun.common.annotation.ClassDefine;
 import com.redxun.common.annotation.MethodDefine;
 import com.redxun.common.annotation.ParamDefine;
 import com.redxun.common.base.db.BaseService;
+import com.redxun.common.base.entity.JsonPageResult;
 import com.redxun.common.base.entity.JsonResult;
+import com.redxun.common.base.entity.QueryData;
+import com.redxun.common.base.search.QueryFilter;
+import com.redxun.common.base.search.QueryFilterBuilder;
 import com.redxun.common.constant.HttpMethodConstants;
+import com.redxun.common.utils.ContextUtil;
+import com.redxun.common.utils.ExceptionUtil;
+import com.redxun.knowledge.map.entity.vo.OsUserVo;
 import com.redxun.knowledge.map.entity.dao.Map;
 import com.redxun.knowledge.map.entity.dto.MapDto;
+import com.redxun.knowledge.map.entity.vo.MapPcVo;
 import com.redxun.knowledge.map.entity.vo.MapVo;
 import com.redxun.knowledge.map.service.MapServiceImpl;
 import com.redxun.log.annotation.AuditLog;
 import com.redxun.web.controller.BaseController;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
@@ -92,7 +102,7 @@ public class MapController extends BaseController<Map> {
         return jsonResult.setData(pkId);
     }
 
-    @ApiOperation("根据地图类型字典值获取知识地图列表")
+    @ApiOperation("根据地图类型字典值获取知识地图列表(PC)")
     @GetMapping("listOfType")
     public JsonResult listOfType(@RequestParam("type") Integer type){
         JsonResult jsonResult = JsonResult.getSuccessResult("");
@@ -112,5 +122,46 @@ public class MapController extends BaseController<Map> {
         }
     }
 
+    @ApiOperation("设置地图学习内容学习状态")
+    @GetMapping("updateLearningState")
+    public JsonResult updateLearningState(@RequestParam("pkId")String pkId){
+        JsonResult jsonResult = JsonResult.getSuccessResult("");
+        mapService.updateLearningState(pkId);
+        return jsonResult.setData("");
+    }
+
+    @ApiOperation("根据知识地图ID获取知识地图详情数据(PC)")
+    @GetMapping("info")
+    public JsonResult info(@RequestParam("pkId")String pkId){
+        JsonResult jsonResult = JsonResult.getSuccessResult("");
+        MapPcVo mapPcVo = mapService.info(pkId);
+        if (mapPcVo != null){
+            return jsonResult.setData(mapPcVo);
+        }else {
+            return jsonResult.setData("您没有访问权限");
+        }
+    }
+
+    @ApiOperation("查看该用户组及子组的用户")
+    @PostMapping({"queryGroupUsers"})
+    public JsonPageResult queryGroupUsers(@ApiParam @RequestBody QueryData queryData) {
+        JsonPageResult jsonResult = JsonPageResult.getSuccess("返回数据成功!");
+
+        try {
+            java.util.Map<String, String> params = queryData.getParams();
+            QueryFilter filter = QueryFilterBuilder.createQueryFilter(queryData);
+            params.put("tenantId", ContextUtil.getCurrentTenantId());
+            IPage<OsUserVo> osUserIPage = mapService.queryGroupUsers(filter, params);
+            jsonResult.setPageData(osUserIPage);
+        } catch (Exception var6) {
+            jsonResult.setSuccess(false);
+            this.logger.error(ExceptionUtil.getExceptionMessage(var6));
+            jsonResult.setMessage(ExceptionUtil.getExceptionMessage(var6));
+        }
+
+        return jsonResult;
+    }
+
+
 }
 

+ 2 - 1
src/main/java/com/redxun/knowledge/map/controller/MapGroupPurviewUserController.java

@@ -17,7 +17,7 @@ import java.util.List;
 
 @Slf4j
 @RestController
-@RequestMapping("/api-knowledge/map/mapGroupPurviewUserController")
+@RequestMapping("/api-knowledge/map/purview")
 @Api(tags = "业务--知识地图组织可阅读者表")
 @ClassDefine(title = "业务--知识地图组织可阅读者表", alias = "MapGroupPurviewUserController", path = "/api-knowledge/map/mapGroupPurviewUserController",
         packages = "knowledge", packageName = "子系统名称")
@@ -37,5 +37,6 @@ public class MapGroupPurviewUserController extends BaseController<MapGroupPurvie
         return "业务--知识地图组织可阅读者表";
     }
 
+
 }
 

+ 0 - 3
src/main/java/com/redxun/knowledge/map/entity/dao/MapContent.java

@@ -45,9 +45,6 @@ public class MapContent  extends BaseExtEntity<String> {
     //学习内容类型;1-外部系统   2-维基知识
     @TableField(value = "TYPE")
     private Integer type;
-    //状态;取值:0-未学习  1-已学习
-    @TableField(value = "STATE")
-    private Integer state;
     //知识ID
     @TableField(value = "KNOWLEDGE_ID")
     private String knowledgeId;

+ 82 - 0
src/main/java/com/redxun/knowledge/map/entity/dao/MapLearning.java

@@ -0,0 +1,82 @@
+
+/**
+ * <pre>
+ *
+ * 描述:业务--知识地图表实体类定义
+ * 表:KM_MAP
+ * 作者:Zizg
+ * 邮箱: ray@redxun.cn
+ * 日期:2023-01-13 09:56:02
+ * 版权:
+ * </pre>
+ */
+package com.redxun.knowledge.map.entity.dao;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.redxun.common.base.entity.BaseExtEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.experimental.Accessors;
+
+@ApiModel("知识学习记录表")
+@Setter
+@Getter
+@Accessors(chain = true)
+@TableName(value = "KM_MAP_LEARNING")
+public class MapLearning extends BaseExtEntity<String> {
+
+    @JsonCreator
+    public MapLearning() {
+    }
+
+    //主键
+    @ApiModelProperty("主键Id")
+    @TableId(value = "PK_ID",type = IdType.INPUT)
+	private String pkId;
+
+    @ApiModelProperty("学习者Id")
+    @TableField(value = "USER_ID")
+    private String userId;
+
+    @ApiModelProperty("地图Id")
+    @TableField(value = "MAP_ID")
+    private String mapId;
+
+    @ApiModelProperty("路径Id")
+    @TableField(value = "ROUTE_ID")
+    private String routeId;
+
+    @ApiModelProperty("学习内容Id")
+    @TableField(value = "CONTENT_ID")
+    private String contentId;
+
+    @ApiModelProperty("删除标记;删除状态:0-正常  1-删除")
+    //删除标记;删除状态:0-正常  1-删除
+    @TableField(value = "IS_DEL")
+    @TableLogic
+    private Integer isDel;
+
+
+
+    @Override
+    public String getPkId() {
+        return pkId;
+    }
+
+    @Override
+    public void setPkId(String pkId) {
+        this.pkId=pkId;
+    }
+
+
+    /**
+    生成子表属性的Array List
+    */
+
+}
+
+
+

+ 0 - 3
src/main/java/com/redxun/knowledge/map/entity/dao/MapRoute.java

@@ -42,9 +42,6 @@ public class MapRoute  extends BaseExtEntity<String> {
     //名称
     @TableField(value = "NAME")
     private String name;
-    //状态;去值:0-未完成  1-已完成
-    @TableField(value = "STATE")
-    private Integer state;
     //排序
     @TableField(value = "SORT")
     private Integer sort;

+ 34 - 0
src/main/java/com/redxun/knowledge/map/entity/vo/MapPcVo.java

@@ -0,0 +1,34 @@
+package com.redxun.knowledge.map.entity.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 文件名: MapPcVo
+ * 作者: Zizg
+ * 时间: 2023/1/19
+ * 描述:
+ * 修改人:
+ * 修改时间:
+ * 修改内容:
+ */
+@Data
+public class MapPcVo implements Serializable {
+    //主键
+    private String pkId;
+    //知识显示标题 地图类型名称+地图名称
+    private String title;
+    //地图类型;对应知识地图类型字典(KNOWLEDGE_MAP)
+    private Integer type;
+    //地图名称
+    private String name;
+    //学习路径
+    List<MapRouteVo> routes;
+    //学习内容总数
+    private Integer contentTotal;
+
+}

+ 3 - 0
src/main/java/com/redxun/knowledge/map/entity/vo/MapRouteVo.java

@@ -28,6 +28,9 @@ public class MapRouteVo implements Serializable {
     //排序
     private Integer sort;
 
+    //状态
+    private Integer state;
+
     //学习内容集合
     private List<MapContentVo> contents;
 }

+ 38 - 0
src/main/java/com/redxun/knowledge/map/entity/vo/OsUserVo.java

@@ -0,0 +1,38 @@
+package com.redxun.knowledge.map.entity.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.io.Serializable;
+
+/**
+ * 文件名: OsUserVo
+ * 作者: Zizg
+ * 时间: 2023/2/1
+ * 描述:
+ * 修改人:
+ * 修改时间:
+ * 修改内容:
+ */
+@ApiModel("员工信息Vo")
+@Data
+public class OsUserVo implements Serializable {
+
+    @ApiModelProperty("员工Id")
+    private String userId;
+
+    @ApiModelProperty("员工姓名")
+    private String fullName;
+
+    @ApiModelProperty("员工工号")
+    private String userNo;
+
+    @ApiModelProperty("所属组织")
+    private String groupSummary;
+
+    @ApiModelProperty("员工职位")
+    private String positionGrade;
+
+}

+ 3 - 0
src/main/java/com/redxun/knowledge/map/mapper/MapGroupPurviewUserMapper.java

@@ -17,4 +17,7 @@ import java.util.Map;
 public interface MapGroupPurviewUserMapper extends BaseDao<MapGroupPurviewUser> {
 
     IPage findAllMapGroupPurviewUser(IPage<Banner> page, @Param("params") java.util.Map<String, Object> params, @Param("order") java.util.Map<String, Object> order);
+
+    String findGroupSummary(String userId);
+
 }

+ 19 - 0
src/main/java/com/redxun/knowledge/map/mapper/MapLearningMapper.java

@@ -0,0 +1,19 @@
+package com.redxun.knowledge.map.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.redxun.common.base.db.BaseDao;
+import com.redxun.knowledge.map.entity.dao.MapLearning;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 文件名: MapLearningMapper
+ * 作者: Zizg
+ * 时间: 2023/1/30
+ * 描述:
+ * 修改人:
+ * 修改时间:
+ * 修改内容:
+ */
+@Mapper
+public interface MapLearningMapper extends BaseDao<MapLearning> {
+}

+ 18 - 2
src/main/java/com/redxun/knowledge/map/mapper/MapMapper.java

@@ -5,7 +5,9 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.redxun.common.base.db.BaseDao;
 import com.redxun.knowledge.entity.dao.Banner;
 import com.redxun.knowledge.map.entity.dao.Map;
+import com.redxun.knowledge.map.entity.vo.MapPcVo;
 import com.redxun.knowledge.map.entity.vo.MapVo;
+import com.redxun.knowledge.map.entity.vo.OsUserVo;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
@@ -15,7 +17,21 @@ import org.apache.ibatis.annotations.Param;
 @Mapper
 public interface MapMapper extends BaseDao<Map> {
 
-    IPage findAllMap(IPage<Banner> page, @Param("params") java.util.Map<String, Object> params, @Param("order") java.util.Map<String, Object> order);
+    IPage findAllMap(IPage<Map> page, @Param("params") java.util.Map<String, Object> params, @Param("order") java.util.Map<String, Object> order);
 
-    MapVo selectData(String pkId);
+
+    /**
+     * PC端查询详情
+     * @param pkId
+     * @return
+     */
+    MapPcVo info(String pkId);
+
+    /**
+     * 获取地图名称、所属组织、地图类型、操作人和操作时间)
+     * @param page
+     * @param params
+     * @return
+     */
+    IPage<OsUserVo> queryGroupUsers(IPage page, @Param("w") java.util.Map<String, String> params);
 }

+ 17 - 6
src/main/java/com/redxun/knowledge/map/service/MapGroupPurviewUserServiceImpl.java

@@ -7,16 +7,20 @@ import com.redxun.common.base.db.BaseDao;
 import com.redxun.common.base.db.BaseService;
 import com.redxun.common.base.db.PageHelper;
 import com.redxun.common.base.search.QueryFilter;
+import com.redxun.common.model.JPaasUser;
 import com.redxun.common.service.impl.SuperServiceImpl;
+import com.redxun.dto.user.OsUserDto;
 import com.redxun.knowledge.common.UserService;
 import com.redxun.knowledge.entity.vo.DicVo;
 import com.redxun.knowledge.map.entity.dao.MapGroupPurviewUser;
+import com.redxun.knowledge.map.entity.vo.MapGroupPurviewUserVo;
 import com.redxun.knowledge.map.entity.vo.MapVo;
 import com.redxun.knowledge.map.mapper.MapGroupPurviewUserMapper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 import javax.annotation.Resource;
 
 /**
@@ -45,13 +49,20 @@ public class MapGroupPurviewUserServiceImpl extends SuperServiceImpl<MapGroupPur
         java.util.Map<String, Object> params = PageHelper.constructParams(queryFilter);
         IPage page = mapGroupPurviewUserMapper.findAllMapGroupPurviewUser(queryFilter.getPage(), queryFilter.getParams(), params);
         List<MapGroupPurviewUser> records = page.getRecords();
-        records.forEach(e -> {
-            String userId = e.getUserId();
-            //userService.
-        });
+        List<MapGroupPurviewUserVo> result = records.parallelStream().map(mapGroupPurviewUser -> {
+            MapGroupPurviewUserVo mapGroupPurviewUserVo = new MapGroupPurviewUserVo();
+            mapGroupPurviewUserVo.setPkId(mapGroupPurviewUser.getPkId());
+            mapGroupPurviewUserVo.setUserId(mapGroupPurviewUser.getUserId());
+            OsUserDto osUserDto = userService.queryOsUserDto(mapGroupPurviewUser.getUserId());
+            mapGroupPurviewUserVo.setUserNo(osUserDto.getUserNo());
+            mapGroupPurviewUserVo.setGroupSummary(mapGroupPurviewUserMapper.findGroupSummary(mapGroupPurviewUser.getUserId()));
+            mapGroupPurviewUserVo.setPositionGrade(osUserDto.getPositionGrade());
+            mapGroupPurviewUserVo.setFullName(osUserDto.getFullName());
+            mapGroupPurviewUserVo.setCreateTime(mapGroupPurviewUser.getCreateTime());
+            return mapGroupPurviewUserVo;
+        }).collect(Collectors.toList());
+        page.setRecords(result);
         return page;
-
-
     }
 
 }

+ 30 - 0
src/main/java/com/redxun/knowledge/map/service/MapLearningServiceImpl.java

@@ -0,0 +1,30 @@
+
+package com.redxun.knowledge.map.service;
+
+
+import com.redxun.common.base.db.BaseDao;
+import com.redxun.common.base.db.BaseService;
+import com.redxun.common.service.impl.SuperServiceImpl;
+import com.redxun.knowledge.map.entity.dao.MapContent;
+import com.redxun.knowledge.map.entity.dao.MapLearning;
+import com.redxun.knowledge.map.mapper.MapContentMapper;
+import com.redxun.knowledge.map.mapper.MapLearningMapper;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+
+/**
+* 学习记录
+*/
+@Service
+public class MapLearningServiceImpl extends SuperServiceImpl<MapLearningMapper, MapLearning> implements BaseService<MapLearning> {
+
+    @Resource
+    private MapLearningMapper mapLearningMapper;
+
+    @Override
+    public BaseDao<MapLearning> getRepository() {
+        return mapLearningMapper;
+    }
+
+}

+ 20 - 33
src/main/java/com/redxun/knowledge/map/service/MapRouteServiceImpl.java

@@ -21,6 +21,7 @@ import com.redxun.knowledge.mapper.KnowledgeMapper;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
@@ -29,8 +30,8 @@ import java.util.stream.Collectors;
 import javax.annotation.Resource;
 
 /**
-* [业务--知识地图学习路径表]业务服务类
-*/
+ * [业务--知识地图学习路径表]业务服务类
+ */
 @Service
 public class MapRouteServiceImpl extends SuperServiceImpl<MapRouteMapper, MapRoute> implements BaseService<MapRoute> {
 
@@ -52,6 +53,9 @@ public class MapRouteServiceImpl extends SuperServiceImpl<MapRouteMapper, MapRou
     @Autowired
     private KnowledgeMapper knowledgeMapper;
 
+    @Autowired
+    private MapServiceImpl mapService;
+
     @Override
     public BaseDao<MapRoute> getRepository() {
         return mapRouteMapper;
@@ -59,6 +63,7 @@ public class MapRouteServiceImpl extends SuperServiceImpl<MapRouteMapper, MapRou
 
     /**
      * PC端根据知识地图路径ID获取知识地图学习内容,根据tops参数设置请求内容条数。(权限判断)
+     *
      * @param routeId
      * @param tops
      * @return
@@ -66,40 +71,22 @@ public class MapRouteServiceImpl extends SuperServiceImpl<MapRouteMapper, MapRou
     public List<MapContentVo> contentTops(String routeId, Integer tops) {
         // 获取地图
         Map map = mapMapper.selectById(mapRouteMapper.selectById(routeId).getMapId());
-        // 判断权限
-        //当前登录用户的部门Id
-        String deptId = userService.queryLoginUserDeptId();
-        String[] groupIds = map.getGroupId().split(",");
-        //包含登录人的部门
-        if (Arrays.asList(groupIds).contains(deptId)) {
-            if (map.getGroupPurview() == 1) {
-                return contentInfo(routeId,tops);
-            } else {
-                QueryWrapper<MapGroupPurviewUser> queryWrapper = new QueryWrapper<>();
-                queryWrapper.eq("MAP_ID", map.getPkId());
-                queryWrapper.eq("USER_ID", userService.queryLoginUser());
-                // 查询结果>0,说明该员工可见
-                Integer count = mapGroupPurviewUserMapper.selectCount(queryWrapper);
+        String userId = userService.queryLoginUser();
+        if (mapService.hasRole(map.getPkId())) {
+            List<MapContent> mapContentList = mapContentMapper.selectList(new LambdaQueryWrapper<MapContent>().eq(MapContent::getRouteId, routeId).orderByAsc(MapContent::getSort));
+            List<MapContentVo> result = mapContentList.stream().limit(tops).map(mapContent -> {
+                MapContentVo mapContentVo = new MapContentVo();
+                BeanUtils.copyProperties(mapContent, mapContentVo);
+                Integer count = mapService.updateState(userId, mapContent.getMapId(), mapContent.getRouteId(), mapContent.getPkId());
                 if (count > 0) {
-                    return contentInfo(routeId,tops);
+                    mapContentVo.setState(1);
+                } else {
+                    mapContentVo.setState(0);
                 }
-            }
+                return mapContentVo;
+            }).collect(Collectors.toList());
+            return result;
         }
         return null;
     }
-
-    /**
-     * PC端根据知识地图路径ID获取知识地图学习内容,根据tops参数设置请求内容条数(方法封装)
-     * @param routeId
-     * @return
-     */
-    private List<MapContentVo> contentInfo(String routeId,Integer tops) {
-        List<MapContent> mapContentList = mapContentMapper.selectList(new LambdaQueryWrapper<MapContent>().eq(MapContent::getRouteId, routeId).orderByAsc(MapContent::getSort));
-        List<MapContentVo> result = mapContentList.stream().limit(tops).map(mapContent -> {
-            MapContentVo mapContentVo = new MapContentVo();
-            BeanUtils.copyProperties(mapContent, mapContentVo);
-            return mapContentVo;
-        }).collect(Collectors.toList());
-        return result;
-    }
 }

+ 232 - 72
src/main/java/com/redxun/knowledge/map/service/MapServiceImpl.java

@@ -8,29 +8,27 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.redxun.common.base.db.BaseDao;
 import com.redxun.common.base.db.BaseService;
 import com.redxun.common.base.db.PageHelper;
+import com.redxun.common.base.entity.IUser;
 import com.redxun.common.base.search.QueryFilter;
 import com.redxun.common.service.impl.SuperServiceImpl;
 import com.redxun.common.tool.IdGenerator;
+import com.redxun.common.utils.ContextUtil;
 import com.redxun.knowledge.common.UserService;
 import com.redxun.knowledge.entity.dao.Knowledge;
 import com.redxun.knowledge.entity.vo.DicVo;
+import com.redxun.knowledge.entity.vo.KnowledgeCategoryAdminVo;
+import com.redxun.knowledge.map.entity.dao.*;
 import com.redxun.knowledge.map.entity.dao.Map;
-import com.redxun.knowledge.map.entity.dao.MapContent;
-import com.redxun.knowledge.map.entity.dao.MapGroupPurviewUser;
-import com.redxun.knowledge.map.entity.dao.MapRoute;
 import com.redxun.knowledge.map.entity.dto.MapContentDto;
 import com.redxun.knowledge.map.entity.dto.MapDto;
 import com.redxun.knowledge.map.entity.dto.MapRouteDto;
-import com.redxun.knowledge.map.entity.vo.KnowledgeVo;
-import com.redxun.knowledge.map.entity.vo.MapContentVo;
-import com.redxun.knowledge.map.entity.vo.MapRouteVo;
-import com.redxun.knowledge.map.entity.vo.MapVo;
-import com.redxun.knowledge.map.mapper.MapContentMapper;
-import com.redxun.knowledge.map.mapper.MapGroupPurviewUserMapper;
-import com.redxun.knowledge.map.mapper.MapMapper;
-import com.redxun.knowledge.map.mapper.MapRouteMapper;
+import com.redxun.knowledge.map.entity.vo.*;
+import com.redxun.knowledge.map.mapper.*;
 import com.redxun.knowledge.service.CommonServiceImpl;
+import com.redxun.knowledge.service.KnowledgeCategoryServiceImpl;
 import com.redxun.knowledge.service.KnowledgeServiceImpl;
+import org.apache.commons.lang.StringUtils;
+import org.owasp.esapi.util.CollectionsUtil;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -40,6 +38,8 @@ import org.springframework.util.CollectionUtils;
 import javax.annotation.Resource;
 import java.io.Serializable;
 import java.util.*;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ThreadPoolExecutor;
 import java.util.stream.Collectors;
 
 /**
@@ -60,6 +60,9 @@ public class MapServiceImpl extends SuperServiceImpl<MapMapper, Map> implements
     @Autowired
     private MapGroupPurviewUserMapper mapGroupPurviewUserMapper;
 
+    @Autowired
+    private MapLearningMapper mapLearningMapper;
+
     @Autowired
     private UserService userService;
 
@@ -69,13 +72,20 @@ public class MapServiceImpl extends SuperServiceImpl<MapMapper, Map> implements
     @Autowired
     private KnowledgeServiceImpl knowledgeService;
 
+    @Autowired
+    private ThreadPoolExecutor threadPoolExecutor;
+
+    @Autowired
+    private KnowledgeCategoryServiceImpl knowledgeCategoryService;
+
     @Override
     public BaseDao<Map> getRepository() {
         return mapMapper;
     }
 
     /**
-     * 添加地图
+     * 添加地图或修改地图
+     *
      * @param mapDto
      * @return
      */
@@ -84,24 +94,35 @@ public class MapServiceImpl extends SuperServiceImpl<MapMapper, Map> implements
         // 向地图表中添加数据
         Map map = new Map();
         BeanUtils.copyProperties(mapDto, map);
-        if (mapDto.getPkId() == null){
+        if (mapDto.getPkId() == null) {
             map.setPkId(IdGenerator.getIdStr());
+            map.setUpdateBy(userService.queryLoginUser());
+            mapMapper.insert(map);
+        } else {
+            mapMapper.updateById(map);
         }
-        map.setUpdateBy(userService.queryLoginUser());
-        mapMapper.insert(map);
         Map mapById = mapMapper.selectById(map.getPkId());
         //向可阅读者表中添加数据
         List<String> purviewUsers = mapDto.getPurviewUsers();
-        purviewUsers.forEach(purviewUser -> {
-            MapGroupPurviewUser mapGroupPurviewUser = new MapGroupPurviewUser();
-            mapGroupPurviewUser.setPkId(IdGenerator.getIdStr());
-            mapGroupPurviewUser.setMapId(mapById.getPkId());
-            mapGroupPurviewUser.setUserId(purviewUser);
-            mapGroupPurviewUser.setUpdateBy(userService.queryLoginUser());
-            mapGroupPurviewUserMapper.insert(mapGroupPurviewUser);
-        });
+        if (!CollectionUtils.isEmpty(purviewUsers)){
+            mapGroupPurviewUserMapper.deleteBatchIds(Arrays.asList(mapById.getPkId()));
+            purviewUsers.forEach(purviewUser -> {
+                MapGroupPurviewUser mapGroupPurviewUser = new MapGroupPurviewUser();
+                mapGroupPurviewUser.setPkId(IdGenerator.getIdStr());
+                mapGroupPurviewUser.setMapId(mapById.getPkId());
+                mapGroupPurviewUser.setUserId(purviewUser);
+                mapGroupPurviewUser.setUpdateBy(userService.queryLoginUser());
+                mapGroupPurviewUserMapper.insert(mapGroupPurviewUser);
+            });
+        } else {
+            mapGroupPurviewUserMapper.deleteBatchIds(Arrays.asList(mapById.getPkId()));
+        }
+
         // 向学习路径表中添加数据
         if (!CollectionUtils.isEmpty(mapDto.getRoutes())) {
+            mapRouteMapper.deleteBatchIds(Arrays.asList(mapById.getPkId()));
+            mapContentMapper.deleteBatchIds(Arrays.asList(mapById.getPkId()));
+            mapLearningMapper.deleteBatchIds(Arrays.asList(mapById.getPkId()));
             List<MapRouteDto> routes = mapDto.getRoutes();
             routes.forEach(route -> {
                 MapRoute mapRoute = new MapRoute();
@@ -113,6 +134,8 @@ public class MapServiceImpl extends SuperServiceImpl<MapMapper, Map> implements
                 MapRoute mapRouteById = mapRouteMapper.selectById(mapRoute.getPkId());
                 // 向学习内容表中添加数据
                 if (!CollectionUtils.isEmpty(route.getContents())) {
+                    mapContentMapper.deleteBatchIds(Arrays.asList(mapById.getPkId()));
+                    mapLearningMapper.deleteBatchIds(Arrays.asList(mapById.getPkId()));
                     List<MapContentDto> contents = route.getContents();
                     contents.forEach(content -> {
                         MapContent mapContent = new MapContent();
@@ -123,15 +146,22 @@ public class MapServiceImpl extends SuperServiceImpl<MapMapper, Map> implements
                         mapContent.setUpdateBy(userService.queryLoginUser());
                         mapContentMapper.insert(mapContent);
                     });
+                } else {
+                    mapContentMapper.deleteBatchIds(Arrays.asList(mapById.getPkId()));
+                    mapLearningMapper.deleteBatchIds(Arrays.asList(mapById.getPkId()));
                 }
             });
-
+        } else {
+            mapRouteMapper.deleteBatchIds(Arrays.asList(mapById.getPkId()));
+            mapContentMapper.deleteBatchIds(Arrays.asList(mapById.getPkId()));
+            mapLearningMapper.deleteBatchIds(Arrays.asList(mapById.getPkId()));
         }
         return mapById.getPkId();
     }
 
     /**
      * 分页查询地图列表
+     *
      * @param queryFilter
      * @return
      */
@@ -143,33 +173,32 @@ public class MapServiceImpl extends SuperServiceImpl<MapMapper, Map> implements
         records.forEach(e -> {
             String typeName = e.getTypeName();
             dicVoList.forEach(dicVo -> {
-                if (dicVo.getValue().equals(typeName)){
+                if (dicVo.getValue().equals(typeName)) {
                     e.setTypeName(dicVo.getName());
                 }
             });
         });
         return page;
-
-
     }
 
     /**
      * 管理端查看地图详情
+     *
      * @param pkId
      * @return
      */
     public MapVo data(String pkId) {
         MapVo mapVo = new MapVo();
         Map map = mapMapper.selectById(pkId);
-        BeanUtils.copyProperties(map,mapVo);
+        BeanUtils.copyProperties(map, mapVo);
         List<DicVo> dicVoList = commonService.queryDic("KNOWLEDGE_MAP");
         dicVoList.forEach(dicVo -> {
-            if (map.getType().toString().equals(dicVo.getValue())){
+            if (map.getType().toString().equals(dicVo.getValue())) {
                 mapVo.setTypeName(dicVo.getName());
             }
         });
         List<MapRoute> mapRouteList = mapRouteMapper.selectList(new LambdaQueryWrapper<MapRoute>().eq(MapRoute::getMapId, mapVo.getPkId()).orderByAsc(MapRoute::getSort));
-        if (!CollectionUtils.isEmpty(mapRouteList)){
+        if (!CollectionUtils.isEmpty(mapRouteList)) {
             List<MapRouteVo> mapRouteVoList = mapRouteList.stream().map(mapRoute -> {
                 MapRouteVo mapRouteVo = new MapRouteVo();
                 BeanUtils.copyProperties(mapRoute, mapRouteVo);
@@ -179,14 +208,14 @@ public class MapServiceImpl extends SuperServiceImpl<MapMapper, Map> implements
             mapRouteVoList.forEach(mapRouteVo -> {
                 List<MapContent> mapContentList = mapContentMapper.selectList(new LambdaQueryWrapper<MapContent>().
                         eq(MapContent::getRouteId, mapRouteVo.getPkId()).orderByAsc(MapContent::getSort));
-                if (!CollectionUtils.isEmpty(mapContentList)){
+                if (!CollectionUtils.isEmpty(mapContentList)) {
                     List<MapContentVo> mapContentVoList = mapContentList.stream().map(mapContent -> {
                         MapContentVo mapContentVo = new MapContentVo();
                         BeanUtils.copyProperties(mapContent, mapContentVo);
-                        if (mapContent.getKnowledgeId() != null){
+                        if (mapContent.getKnowledgeId() != null) {
                             KnowledgeVo knowledgeVo = new KnowledgeVo();
                             Knowledge knowledge = knowledgeService.get(mapContent.getKnowledgeId());
-                            BeanUtils.copyProperties(knowledge,knowledgeVo);
+                            BeanUtils.copyProperties(knowledge, knowledgeVo);
                             String photo = (String) userService.querySexAndPhoto(knowledge.getCreateBy()).get("photo");
                             knowledgeVo.setAuthorHead(photo);
                             // 有文件,截取文件名后缀
@@ -195,6 +224,11 @@ public class MapServiceImpl extends SuperServiceImpl<MapMapper, Map> implements
                             int suffixIndex = strArray.length - 1;
                             knowledgeVo.setAttachmentType(strArray[suffixIndex]);
                             mapContentVo.setKnowledgeVo(knowledgeVo);
+                            //添加分类信息
+                            KnowledgeCategoryAdminVo knowledgeCategoryAdminVo = knowledgeCategoryService.findAllParentByCategoryId(knowledge.getCategoryId());
+                            mapContentVo.getKnowledgeVo().setKnowledgeCategoryAdminVo(knowledgeCategoryAdminVo);
+                        } else {
+                            mapContentVo.setKnowledgeVo(null);
                         }
                         return mapContentVo;
                     }).collect(Collectors.toList());
@@ -207,6 +241,7 @@ public class MapServiceImpl extends SuperServiceImpl<MapMapper, Map> implements
 
     /**
      * 管理端删除地图
+     *
      * @param entities
      */
     @Transactional(rollbackFor = Exception.class)
@@ -218,12 +253,15 @@ public class MapServiceImpl extends SuperServiceImpl<MapMapper, Map> implements
         mapRouteMapper.deleteBatchIds(entities);
         //删除可查看员工表中数据
         mapGroupPurviewUserMapper.deleteBatchIds(entities);
+        //删除学习记录表中数据
+        mapLearningMapper.deleteBatchIds(entities);
         //删除地图表中数据
         this.getRepository().deleteBatchIds(entities);
     }
 
     /**
      * PC端根据地图类型字典值获取知识地图列表数据
+     *
      * @param type
      * @return
      */
@@ -232,29 +270,10 @@ public class MapServiceImpl extends SuperServiceImpl<MapMapper, Map> implements
         List<java.util.Map<String, Object>> listResult = new ArrayList<>();
         mapList.forEach(map -> {
             java.util.Map<String, Object> mapResult = new HashMap<>();
-            //当前登录用户的部门Id
-            String deptId = userService.queryLoginUserDeptId();
-            //权限判断
-            String[] groupIds = map.getGroupId().split(",");
-            //是否包含当前用户的部门Id,如果包含 判断该用户是否可见
-            if (Arrays.asList(groupIds).contains(deptId)){
-                // 阅读权限为1,部门下全体员工可见
-                if (map.getGroupPurview() == 1){
-                    mapResult.put("pkId", map.getPkId());
-                    mapResult.put("name", map.getName());
-                    listResult.add(mapResult);
-                } else {
-                    QueryWrapper<MapGroupPurviewUser> queryWrapper = new QueryWrapper<>();
-                    queryWrapper.eq("MAP_ID",map.getPkId());
-                    queryWrapper.eq("USER_ID",userService.queryLoginUser());
-                    // 查询结果>0,说明该员工可见
-                    Integer count = mapGroupPurviewUserMapper.selectCount(queryWrapper);
-                    if (count > 0){
-                        mapResult.put("pkId", map.getPkId());
-                        mapResult.put("name", map.getName());
-                        listResult.add(mapResult);
-                    }
-                }
+            if (hasRole(map.getPkId())) {
+                mapResult.put("pkId", map.getPkId());
+                mapResult.put("name", map.getName());
+                listResult.add(mapResult);
             }
         });
         return listResult;
@@ -262,46 +281,187 @@ public class MapServiceImpl extends SuperServiceImpl<MapMapper, Map> implements
 
     /**
      * PC端根据知识地图ID获取知识地图配置的学习路径列表数据(加入权限判断)
+     *
      * @param mapId
      * @return
      */
     public List<HashMap<String, Object>> routes(String mapId) {
+        if (hasRole(mapId)) {
+            List<MapRoute> mapRouteList = mapRouteMapper.selectList(new LambdaQueryWrapper<MapRoute>().eq(MapRoute::getMapId, mapId).orderByAsc(MapRoute::getSort));
+            List<HashMap<String, Object>> result = mapRouteList.stream().map(mapRoute -> {
+                HashMap<String, Object> hashMap = new HashMap<>();
+                hashMap.put("pkId", mapRoute.getPkId());
+                hashMap.put("name", mapRoute.getName());
+                return hashMap;
+            }).collect(Collectors.toList());
+            return result;
+        }
+        return null;
+    }
+
+    /**
+     * 设置地图学习内容学习状态-PC端
+     *
+     * @param pkId
+     */
+    public void updateLearningState(String pkId) {
+        String mapId = mapContentMapper.selectById(pkId).getMapId();
+        if (hasRole(mapId)) {
+            if (mapContentMapper.selectById(pkId) != null) {
+                MapLearning mapLearning = new MapLearning();
+                mapLearning.setPkId(IdGenerator.getIdStr());
+                mapLearning.setMapId(mapId);
+                mapLearning.setRouteId(mapContentMapper.selectById(pkId).getRouteId());
+                mapLearning.setContentId(pkId);
+                mapLearning.setUserId(userService.queryLoginUser());
+                mapLearningMapper.insert(mapLearning);
+            }
+        }
+    }
+
+    /**
+     * PC端根据知识地图ID获取知识地图详情数据
+     *
+     * @param pkId
+     * @return
+     */
+    public MapPcVo info(String pkId) {
+        if (hasRole(pkId)) {
+            String userId = userService.queryLoginUser();
+            CompletableFuture<MapPcVo> mapPcVoCompletableFuture = CompletableFuture.supplyAsync(() -> {
+                MapPcVo mapPcVo = mapMapper.info(pkId);
+                return mapPcVo;
+            }, threadPoolExecutor);
+            CompletableFuture<Void> titleCompletableFuture = mapPcVoCompletableFuture.thenAcceptAsync(mapPcVo -> {
+                List<DicVo> dicVoList = commonService.queryDic("KNOWLEDGE_MAP");
+                // 地图名称显示处理
+                Integer type = mapPcVo.getType();
+                dicVoList.forEach(dicVo -> {
+                    if (dicVo.getValue().equals(type.toString())) {
+                        mapPcVo.setTitle(dicVo.getName() + "-" + mapPcVo.getName());
+                    }
+                });
+            }, threadPoolExecutor);
+            CompletableFuture<Void> knowledgeCountCompletableFuture = mapPcVoCompletableFuture.thenAcceptAsync(mapPcVo -> {
+                //地图收录知识数量
+                Integer knowledgeCount = mapContentMapper.
+                        selectCount(new LambdaQueryWrapper<MapContent>().eq(MapContent::getMapId, pkId));
+                mapPcVo.setContentTotal(knowledgeCount);
+            }, threadPoolExecutor);
+            //查看相关知识
+            CompletableFuture<Void> knowledgeCompletableFuture = mapPcVoCompletableFuture.thenAcceptAsync(mapPcVo -> {
+                List<MapRouteVo> routes = mapPcVo.getRoutes();
+                routes.forEach(route -> {
+                    List<MapContentVo> contents = route.getContents();
+                    contents.forEach(content -> {
+                                //查看知识
+                                if (content.getKnowledgeId() != null) {
+                                    KnowledgeVo knowledgeVo = new KnowledgeVo();
+                                    Knowledge knowledge = knowledgeService.get(content.getKnowledgeId());
+                                    BeanUtils.copyProperties(knowledge, knowledgeVo);
+                                    String photo = (String) userService.querySexAndPhoto(knowledge.getCreateBy()).get("photo");
+                                    knowledgeVo.setAuthorHead(photo);
+                                    // 有文件,截取文件名后缀
+                                    String attachmentName = knowledge.getAttachmentName();
+                                    String[] strArray = attachmentName.split("\\.");
+                                    int suffixIndex = strArray.length - 1;
+                                    knowledgeVo.setAttachmentType(strArray[suffixIndex]);
+                                    content.setKnowledgeVo(knowledgeVo);
+                                    //添加分类信息
+                                    KnowledgeCategoryAdminVo knowledgeCategoryAdminVo = knowledgeCategoryService.findAllParentByCategoryId(knowledge.getCategoryId());
+                                    content.getKnowledgeVo().setKnowledgeCategoryAdminVo(knowledgeCategoryAdminVo);
+                                } else {
+                                    content.setKnowledgeVo(null);
+                                }
+                                //设置学习内容状态
+                                if (updateState(userId, pkId, route.getPkId(), content.getPkId()) > 0) {
+                                    content.setState(1);
+                                } else {
+                                    content.setState(0);
+                                }
+                            }
+                    );
+                    //设置学习路径状态
+                    if (contents.stream().allMatch(e -> e.getState() == 1)) {
+                        route.setState(1);
+                    } else {
+                        route.setState(0);
+                    }
+                });
+            }, threadPoolExecutor);
+            CompletableFuture.allOf(mapPcVoCompletableFuture,
+                    titleCompletableFuture,
+                    knowledgeCountCompletableFuture,
+                    knowledgeCompletableFuture).join();
+            return mapPcVoCompletableFuture.join();
+        }
+        return null;
+    }
+
+    //变更学习状态(逻辑变更)
+    public Integer updateState(String userId, String mapId, String routeId, String contentId) {
+        QueryWrapper<MapLearning> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("USER_ID", userId);
+        queryWrapper.eq("MAP_ID", mapId);
+        queryWrapper.eq("ROUTE_ID", routeId);
+        queryWrapper.eq("CONTENT_ID", contentId);
+        Integer count = mapLearningMapper.selectCount(queryWrapper);
+        return count;
+    }
+
+
+    /**
+     * 权限判断方法(知识地图PC端使用)
+     * @param mapId
+     * @return
+     */
+    public boolean hasRole(String mapId) {
         //权限判断
         Map map = mapMapper.selectById(mapId);
         //当前登录用户的部门Id
         String deptId = userService.queryLoginUserDeptId();
+        //地图对应的部门权限
         String[] groupIds = map.getGroupId().split(",");
         //包含登录人的部门
         if (Arrays.asList(groupIds).contains(deptId)) {
             if (map.getGroupPurview() == 1) {
-                return routesInfo(mapId);
+                return true;
             } else {
                 QueryWrapper<MapGroupPurviewUser> queryWrapper = new QueryWrapper<>();
                 queryWrapper.eq("MAP_ID", map.getPkId());
                 queryWrapper.eq("USER_ID", userService.queryLoginUser());
                 // 查询结果>0,说明该员工可见
                 Integer count = mapGroupPurviewUserMapper.selectCount(queryWrapper);
-                if (count > 0) {
-                    return routesInfo(mapId);
-                }
+                return count > 0;
             }
         }
-        return null;
+        return false;
     }
 
     /**
-     * PC端根据知识地图ID获取知识地图配置的学习路径列表数据(方法封装)
-     * @param mapId
+     * 根据搜索条件(地图名称、所属组织、地图类型、操作人和操作时间)分页查询地图列表数据
+     * @param filter
+     * @param params
      * @return
      */
-    private List<HashMap<String, Object>> routesInfo(String mapId) {
-        List<MapRoute> mapRouteList = mapRouteMapper.selectList(new LambdaQueryWrapper<MapRoute>().eq(MapRoute::getMapId, mapId).orderByAsc(MapRoute::getSort));
-        List<HashMap<String, Object>> result = mapRouteList.stream().map(mapRoute -> {
-            HashMap<String, Object> hashMap = new HashMap<>();
-            hashMap.put("pkId", mapRoute.getPkId());
-            hashMap.put("name", mapRoute.getName());
-            return hashMap;
-        }).collect(Collectors.toList());
-        return result;
+    public IPage<OsUserVo> queryGroupUsers(QueryFilter filter, java.util.Map params) {
+        String groupIds = (String)params.get("groupIds");
+        if (StringUtils.isNotEmpty(groupIds)) {
+            if ("curOrg".equals(groupIds)) {
+                IUser user = ContextUtil.getCurrentUser();
+                if (user != null) {
+                    groupIds = user.getDeptId();
+                }
+            }
+
+            String[] groupIdList = groupIds.split(",");
+            params.put("groupIdList", Arrays.asList(groupIdList));
+        }
+
+        IPage<OsUserVo> osUserIPage = mapMapper.queryGroupUsers(filter.getPage(), params);
+        List<OsUserVo> osUsers = osUserIPage.getRecords();
+        osUsers.forEach(e -> e.setGroupSummary(mapGroupPurviewUserMapper.findGroupSummary(e.getUserId())));
+        return osUserIPage;
     }
+
 }

+ 2 - 3
src/main/resources/mapper/knowledge/map/MapContentMapper.xml

@@ -7,7 +7,6 @@
                 <result property="mapId" column="MAP_ID" jdbcType="VARCHAR"/>
                 <result property="routeId" column="ROUTE_ID" jdbcType="VARCHAR"/>
                 <result property="type" column="TYPE" jdbcType="NUMERIC"/>
-                <result property="state" column="STATE" jdbcType="NUMERIC"/>
                 <result property="knowledgeId" column="KNOWLEDGE_ID" jdbcType="VARCHAR"/>
                 <result property="outerSystemName" column="OUTER_SYSTEM_NAME" jdbcType="VARCHAR"/>
                 <result property="outerContentName" column="OUTER_CONTENT_NAME" jdbcType="VARCHAR"/>
@@ -24,12 +23,12 @@
     </resultMap>
 
     <sql id="COLUMNS">
-        PK_ID,MAP_ID,ROUTE_ID,TYPE,STATE,
+        PK_ID,MAP_ID,ROUTE_ID,TYPE,
         KNOWLEDGE_ID,OUTER_SYSTEM_NAME,OUTER_CONTENT_NAME,OUTER_ACCESS_URL,SORT,IS_DEL,
         COMPANY_ID_,CREATE_DEP_ID_,TENANT_ID_,CREATE_BY_,CREATE_TIME_,UPDATE_BY_,UPDATE_TIME_
     </sql>
     <select id="query" resultType="com.redxun.knowledge.map.entity.dao.MapContent" parameterType="java.util.Map">
-        select PK_ID,MAP_ID,ROUTE_ID,TYPE,STATE,
+        select PK_ID,MAP_ID,ROUTE_ID,TYPE,
                KNOWLEDGE_ID,OUTER_SYSTEM_NAME,OUTER_CONTENT_NAME,OUTER_ACCESS_URL,SORT,IS_DEL,
                COMPANY_ID_,CREATE_DEP_ID_,TENANT_ID_,CREATE_BY_,CREATE_TIME_,UPDATE_BY_,UPDATE_TIME_
         from KM_MAP_CONTENT

+ 10 - 1
src/main/resources/mapper/knowledge/map/MapGroupPurviewUserMapper.xml

@@ -43,7 +43,7 @@
         SELECT
         <include refid="COLUMNS" />
         FROM KM_MAP_GROUP_PURVIEW_USER
-        where IS_DEL = 0
+        where IS_DEL = 0 and MAP_ID = #{params.pkId}
         ORDER BY UPDATE_TIME_ DESC
     </select>
 
@@ -57,6 +57,15 @@
         </foreach>
     </delete>
 
+    <select id="findGroupSummary" resultType="string">
+        SELECT
+            LISTAGG ( g.NAME_, '-' ) WITHIN GROUP ( ORDER BY g.PATH_ ) path
+        FROM
+            LEARNING_USER_DEV.OS_GROUP g START WITH GROUP_ID_ IN
+                                                  ( SELECT PARTY1_ FROM LEARNING_USER_DEV.os_rel_inst WHERE PARTY2_ = #{userId}
+                                                AND DIM1_ = '1' AND IS_MAIN_ = 'YES' ) CONNECT BY PRIOR g.PARENT_ID_ = g.GROUP_ID_
+    </select>
+
 </mapper>
 
 

+ 38 - 0
src/main/resources/mapper/knowledge/map/MapLearningMapper.xml

@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.redxun.knowledge.map.mapper.MapLearningMapper">
+
+    <resultMap id="MapLearning" type="com.redxun.knowledge.map.entity.dao.MapLearning">
+        <id property="pkId" column="PK_ID" jdbcType="VARCHAR"/>
+        <result property="mapId" column="MAP_ID" jdbcType="VARCHAR"/>
+        <result property="routeId" column="ROUTE_ID" jdbcType="VARCHAR"/>
+        <result property="userId" column="USER_ID" jdbcType="VARCHAR"/>
+        <result property="contentId" column="CONTENT_ID" jdbcType="VARCHAR"/>
+        <result property="isDel" column="IS_DEL" jdbcType="NUMERIC"/>
+        <result property="companyId" column="COMPANY_ID_" jdbcType="VARCHAR"/>
+        <result property="createDepId" column="CREATE_DEP_ID_" jdbcType="VARCHAR"/>
+        <result property="tenantId" column="TENANT_ID_" jdbcType="VARCHAR"/>
+        <result property="createBy" column="CREATE_BY_" jdbcType="VARCHAR"/>
+        <result property="createTime" column="CREATE_TIME_" jdbcType="DATE"/>
+        <result property="updateBy" column="UPDATE_BY_" jdbcType="VARCHAR"/>
+        <result property="updateTime" column="UPDATE_TIME_" jdbcType="DATE"/>
+    </resultMap>
+
+    <sql id="COLUMNS">
+        PK_ID,MAP_ID,ROUTE_ID,USER_ID,CONTENT_ID,IS_DEL,
+        COMPANY_ID_,CREATE_DEP_ID_,TENANT_ID_,CREATE_BY_,CREATE_TIME_,UPDATE_BY_,UPDATE_TIME_
+    </sql>
+
+    <delete id="deleteBatchIds">
+        update KM_MAP_LEARNING
+        set IS_DEL = 1
+        WHERE
+        MAP_ID in
+        <foreach collection="coll" item="item" open="(" separator="," close=")">
+            #{item}
+        </foreach>
+    </delete>
+
+</mapper>
+
+

+ 65 - 1
src/main/resources/mapper/knowledge/map/MapMapper.xml

@@ -52,7 +52,15 @@
                 map.NAME LIKE '%' || #{params.name} || '%'
             </if>
             <if test="@rx.Ognl@isNotEmpty(params.groupId)">
-                and map.GROUP_ID = #{params.groupId}
+                and map.PK_ID in (
+                select distinct (pk_id) from (SELECT DISTINCT
+                REGEXP_SUBSTR( m.GROUP_ID, '[^,]+', 1, LEVEL )  group_id,m.pk_id
+                FROM
+                KM_MAP m
+                CONNECT BY LEVEL &lt;= LENGTH( m.GROUP_ID ) - LENGTH( REPLACE ( m.GROUP_ID, ',', '' ) ) + 1) where group_id in
+                (SELECT os.GROUP_ID_ FROM LEARNING_USER_DEV.OS_GROUP os
+                START WITH os.GROUP_ID_ = #{params.groupId} CONNECT BY PRIOR os.GROUP_ID_ = os.PARENT_ID_)
+                )
             </if>
             <if test="@rx.Ognl@isNotEmpty(params.type)">
                 and map.TYPE = #{params.type}
@@ -81,6 +89,62 @@
         </foreach>
     </delete>
 
+    <resultMap id="info" type="com.redxun.knowledge.map.entity.vo.MapPcVo" autoMapping="true">
+        <id column="mapId" property="pkId"/>
+        <result column="mapName" property="name"/>
+        <result column="contentTotal" property="contentTotal"/>
+        <collection property="routes" resultMap="mapRouteMap" autoMapping="true"/>
+    </resultMap>
+
+    <resultMap id="mapRouteMap" type="com.redxun.knowledge.map.entity.vo.MapRouteVo" autoMapping="true">
+        <id column="routeId" property="pkId"/>
+        <result column="routeName" property="name"/>
+        <result column="routeSort" property="sort"/>
+        <collection property="contents" ofType="com.redxun.knowledge.map.entity.vo.MapContentVo" autoMapping="true">
+            <id column="contentId" property="pkId"/>
+            <result column="contentSort" property="sort"/>
+            <result column="contentType" property="type"/>
+            <association property="knowledgeVo" javaType="com.redxun.knowledge.map.entity.vo.KnowledgeVo" autoMapping="true">
+            </association>
+        </collection>
+    </resultMap>
+
+    <select id="info" resultMap="info">
+        select
+            km.PK_ID as mapId,km.TYPE as type,km.NAME as mapName,
+            kmr.PK_ID as routeId,kmr.NAME as routeName,kmr.sort as routeSort,
+            kmc.PK_ID as contentId,kmc.SORT as contentSort,kmc.TYPE as contentType,kmc.*
+        from KM_MAP km
+        join KM_MAP_ROUTE kmr
+        on km.PK_ID = kmr.MAP_ID
+        join KM_MAP_CONTENT kmc
+        on kmr.PK_ID = kmc.ROUTE_ID
+        where km.PK_ID = #{pkId} and km.IS_DEL = 0 and kmr.IS_DEL = 0 and kmc.IS_DEL = 0
+        order by kmr.sort,kmc.sort
+    </select>
+
+    <select id="queryGroupUsers" parameterType="java.util.Map" resultType="com.redxun.knowledge.map.entity.vo.OsUserVo">
+        <if test="@rx.Ognl@isNotEmpty(w.groupIdList)">
+            select DISTINCT u.* from LEARNING_USER_DEV.os_user u
+            inner join LEARNING_USER_DEV.os_inst_users os on os.USER_ID_=u.USER_ID_
+            left join LEARNING_USER_DEV.os_rel_inst i on u.user_id_=i.PARTY2_ where os.user_id_ in (
+            select party2_ from LEARNING_USER_DEV.os_rel_inst where party1_ in (
+            <foreach collection="w.groupIdList" index="index" item="groupId" open="" close="" separator="union">
+                select group_id_ from LEARNING_USER_DEV.os_group where path_ like CONCAT((
+                select path_ from LEARNING_USER_DEV.os_group where group_id_ =
+                #{groupId}
+                ),'%')
+            </foreach>
+            ) and dim1_ = '1' ) and os.tenant_id_= #{w.tenantId} and u.status_ = '1'
+            <if test="@rx.Ognl@isNotEmpty(w.name)">
+                and u.fullname_ like '%${w.name}%'
+            </if>
+            <if test="@rx.Ognl@isNotEmpty(w.userNo)">
+                and u.user_no_ like '%${w.userNo}%'
+            </if>
+        </if>
+    </select>
+
 </mapper>
 
 

+ 2 - 3
src/main/resources/mapper/knowledge/map/MapRouteMapper.xml

@@ -6,7 +6,6 @@
                 <id property="pkId" column="PK_ID" jdbcType="VARCHAR"/>
                 <result property="mapId" column="MAP_ID" jdbcType="VARCHAR"/>
                 <result property="name" column="NAME" jdbcType="VARCHAR"/>
-                <result property="state" column="STATE" jdbcType="NUMERIC"/>
                 <result property="sort" column="SORT" jdbcType="NUMERIC"/>
                 <result property="isDel" column="IS_DEL" jdbcType="NUMERIC"/>
                 <result property="companyId" column="COMPANY_ID_" jdbcType="VARCHAR"/>
@@ -19,12 +18,12 @@
     </resultMap>
 
     <sql id="COLUMNS">
-        PK_ID,MAP_ID,NAME,STATE,SORT,IS_DEL,COMPANY_ID_,CREATE_DEP_ID_,TENANT_ID_,
+        PK_ID,MAP_ID,NAME,SORT,IS_DEL,COMPANY_ID_,CREATE_DEP_ID_,TENANT_ID_,
         CREATE_BY_,CREATE_TIME_,UPDATE_BY_,UPDATE_TIME_
     </sql>
     <select id="query" resultType="com.redxun.knowledge.map.entity.dao.MapRoute" parameterType="java.util.Map">
         select
-               PK_ID,MAP_ID,NAME,STATE,SORT,IS_DEL,COMPANY_ID_,CREATE_DEP_ID_,TENANT_ID_,
+               PK_ID,MAP_ID,NAME,SORT,IS_DEL,COMPANY_ID_,CREATE_DEP_ID_,TENANT_ID_,
                CREATE_BY_,CREATE_TIME_,UPDATE_BY_,UPDATE_TIME_
         from KM_MAP_ROUTE
         <where>