diff --git a/modules/boe-module-course/src/main/java/com/xboe/module/course/dto/CourseFullText.java b/modules/boe-module-course/src/main/java/com/xboe/module/course/dto/CourseFullText.java index efe63344..a4df8a62 100644 --- a/modules/boe-module-course/src/main/java/com/xboe/module/course/dto/CourseFullText.java +++ b/modules/boe-module-course/src/main/java/com/xboe/module/course/dto/CourseFullText.java @@ -10,115 +10,115 @@ import java.util.List; */ @Data public class CourseFullText { - + /**id,对于原系统是kid*/ private String id; - + /**es中的id*/ private String esId; - + /**名称*/ private String name; - - + + /**来源,1表来源老系统,2表来源新系统*/ private Integer source; - + private String keywords; - + private String summary; - + /**10无目录录播课,20 有目录录播课,30:面授课;40学习项目*/ private Integer type; /**多个时用到*/ private String types; - + /**原系统的企业id,对应sass模式的字段*/ private String companyId; - + /**封面图片*/ private String coverImg; - + /**课程的评分*/ private Float score; - + /**学习人数*/ private Integer studies; /** 格式化学习人数 **/ private Integer studiesFormat; - + private String teacher; - + private String teacherCode; - + /**发布时间*/ private Long publishTime; - + /**课程的时长,秒*/ private Integer duration; - + /**是否置顶*/ private Integer isTop; - + /**置顶时间*/ private Long topTime; - + /**系统的一级*/ - private String sysType1; - - /**系统的二级*/ - private String sysType2; - - /**系统的三级*/ - private String sysType3; - + private String sysType1; + + /**系统的二级*/ + private String sysType2; + + /**系统的三级*/ + private String sysType3; + /**课程的标签*/ private String tags; - + /** * 是否有受众 */ private Integer isSetAudience; - + /**受众,受众的id,多个使用逗号分隔*/ //private String audience; - + private String[] audiences; - + /**资源归属*/ private String resOwner; - + /**新系统无此字段*/ private Integer startTime; - + /**新系统无此字段*/ private Integer endTime; - + /**创建*/ private Long createdAt; - + /***/ private String domainIds; - + /**用于查询*/ private Integer maxDuration; - + /**用于查询排序处理,1表最新,2表最热,不做存储*/ private Integer orderType; - + /**设备 1:PC端可见;2:移动端可见;3:多端可见*/ private Integer device; - + /** - * 是否公开课,0表非公开课,1表公开课 - */ - private Integer openCourse; - - /** - * 是否公开0表非公开报名,1表公开报名-字段需新增,按管理端需求增加 - */ - private Integer openEnroll; + * 是否公开课,0表非公开课,1表公开课 + */ + private Integer openCourse; + + /** + * 是否公开0表非公开报名,1表公开报名-字段需新增,按管理端需求增加 + */ + private Integer openEnroll; /** @@ -141,4 +141,14 @@ public class CourseFullText { * 受众 */ private String audience; -} + + /** + * 剔除的面授课id + */ + private String[] offCourseId; + + /** + * 在线课id + */ + private String[] courseId; +} \ No newline at end of file diff --git a/modules/boe-module-es/src/main/java/com/xboe/module/elasticsearc/CourseElasticsearchImpl.java b/modules/boe-module-es/src/main/java/com/xboe/module/elasticsearc/CourseElasticsearchImpl.java index f8425791..8602968d 100644 --- a/modules/boe-module-es/src/main/java/com/xboe/module/elasticsearc/CourseElasticsearchImpl.java +++ b/modules/boe-module-es/src/main/java/com/xboe/module/elasticsearc/CourseElasticsearchImpl.java @@ -57,13 +57,13 @@ import lombok.extern.slf4j.Slf4j; @Slf4j @Service public class CourseElasticsearchImpl implements ICourseFullTextSearch{ - + @Resource - private RestHighLevelClient restHighLevelClient; - + private RestHighLevelClient restHighLevelClient; + @Resource ElasticsearchUtil esUtil; - + /** * 创建新的索引 * @param indexName @@ -81,144 +81,81 @@ public class CourseElasticsearchImpl implements ICourseFullTextSearch{ } return true; } - + /** * 创建索引 * @param name * @return * @throws Exception */ - public boolean createIndex(String name) throws Exception{ - - XContentBuilder settingBuilder= XContentFactory.jsonBuilder(); - settingBuilder.startObject(); - settingBuilder.field("index").startObject().field("number_of_replicas",5).endObject(); - settingBuilder.field("analysis").startObject() - .field("analyzer").startObject() - .field("comma").startObject() - .field("type","pattern") - .field("pattern",",") - .endObject() - .endObject() - .endObject(); - settingBuilder.endObject(); - - XContentBuilder builder = XContentFactory.jsonBuilder(); - builder.startObject(); - builder.field("properties").startObject(); - builder.field("id").startObject().field("index", "true").field("type", "keyword").endObject(); - //builder.field("name").startObject().field("type", "text").field("analyzer", "ik_max_word").field("search_analyzer","ik_smart").endObject(); - builder.field("name").startObject().field("type", "keyword").endObject(); - builder.field("keywords").startObject().field("type", "text").field("analyzer", "ik_max_word").field("search_analyzer","ik_smart").endObject(); - builder.field("type").startObject().field("type", "integer").endObject(); - builder.field("source").startObject().field("type", "integer").endObject(); - builder.field("summary").startObject().field("type", "text").field("analyzer", "ik_max_word").field("search_analyzer","ik_smart").endObject(); - builder.field("companyId").startObject().field("type", "keyword").endObject(); - builder.field("coverImg").startObject().field("type", "keyword").endObject(); - builder.field("score").startObject().field("type", "keyword").endObject(); - builder.field("studies").startObject().field("type", "integer").endObject(); - builder.field("teacher").startObject().field("type", "text").field("analyzer","comma").endObject(); - builder.field("teacherCode").startObject().field("type", "text").field("analyzer","comma").endObject(); - builder.field("publishTime").startObject().field("type", "integer").endObject(); - builder.field("startTime").startObject().field("type", "integer").endObject(); - builder.field("endTime").startObject().field("type", "integer").endObject(); - builder.field("duration").startObject().field("type", "integer").endObject(); - builder.field("tags").startObject().field("type", "text").endObject(); - builder.field("sysType1").startObject().field("type", "keyword").endObject(); - builder.field("sysType2").startObject().field("type", "keyword").endObject(); - builder.field("sysType3").startObject().field("type", "keyword").endObject(); - builder.field("isTop").startObject().field("type", "integer").endObject(); - builder.field("topTime").startObject().field("type", "integer").endObject(); - builder.field("resOwner").startObject().field("type", "keyword").endObject(); - builder.field("isSetAudience").startObject().field("type", "keyword").endObject(); - builder.field("createdAt").startObject().field("type", "integer").endObject(); - builder.field("openCourse").startObject().field("type", "integer").endObject(); - //builder.field("audience").startObject().field("type", "text").field("analyzer","comma").endObject(); - builder.field("audiences").startObject().field("type", "keyword").endObject(); - builder.field("device").startObject().field("type", "integer").endObject(); - builder.field("openEnroll").startObject().field("type", "integer").endObject(); - builder.endObject(); - builder.endObject(); - - CreateIndexRequest createIndexRequest = new CreateIndexRequest(name); - createIndexRequest.settings(settingBuilder); - createIndexRequest.mapping(builder); - CreateIndexResponse createIndexResponse = restHighLevelClient.indices().create(createIndexRequest, RequestOptions.DEFAULT); - boolean acknowledged = createIndexResponse.isAcknowledged(); - if (acknowledged) { - return true; - } else { - return false; - } - - } + public boolean createIndex(String name) throws Exception{ + + XContentBuilder settingBuilder= XContentFactory.jsonBuilder(); + settingBuilder.startObject(); + settingBuilder.field("index").startObject().field("number_of_replicas",5).endObject(); + settingBuilder.field("analysis").startObject() + .field("analyzer").startObject() + .field("comma").startObject() + .field("type","pattern") + .field("pattern",",") + .endObject() + .endObject() + .endObject(); + settingBuilder.endObject(); + + XContentBuilder builder = XContentFactory.jsonBuilder(); + builder.startObject(); + builder.field("properties").startObject(); + builder.field("id").startObject().field("index", "true").field("type", "keyword").endObject(); + //builder.field("name").startObject().field("type", "text").field("analyzer", "ik_max_word").field("search_analyzer","ik_smart").endObject(); + builder.field("name").startObject().field("type", "keyword").endObject(); + builder.field("keywords").startObject().field("type", "text").field("analyzer", "ik_max_word").field("search_analyzer","ik_smart").endObject(); + builder.field("type").startObject().field("type", "integer").endObject(); + builder.field("source").startObject().field("type", "integer").endObject(); + builder.field("summary").startObject().field("type", "text").field("analyzer", "ik_max_word").field("search_analyzer","ik_smart").endObject(); + builder.field("companyId").startObject().field("type", "keyword").endObject(); + builder.field("coverImg").startObject().field("type", "keyword").endObject(); + builder.field("score").startObject().field("type", "keyword").endObject(); + builder.field("studies").startObject().field("type", "integer").endObject(); + builder.field("teacher").startObject().field("type", "text").field("analyzer","comma").endObject(); + builder.field("teacherCode").startObject().field("type", "text").field("analyzer","comma").endObject(); + builder.field("publishTime").startObject().field("type", "integer").endObject(); + builder.field("startTime").startObject().field("type", "integer").endObject(); + builder.field("endTime").startObject().field("type", "integer").endObject(); + builder.field("duration").startObject().field("type", "integer").endObject(); + builder.field("tags").startObject().field("type", "text").endObject(); + builder.field("sysType1").startObject().field("type", "keyword").endObject(); + builder.field("sysType2").startObject().field("type", "keyword").endObject(); + builder.field("sysType3").startObject().field("type", "keyword").endObject(); + builder.field("isTop").startObject().field("type", "integer").endObject(); + builder.field("topTime").startObject().field("type", "integer").endObject(); + builder.field("resOwner").startObject().field("type", "keyword").endObject(); + builder.field("isSetAudience").startObject().field("type", "keyword").endObject(); + builder.field("createdAt").startObject().field("type", "integer").endObject(); + builder.field("openCourse").startObject().field("type", "integer").endObject(); + //builder.field("audience").startObject().field("type", "text").field("analyzer","comma").endObject(); + builder.field("audiences").startObject().field("type", "keyword").endObject(); + builder.field("device").startObject().field("type", "integer").endObject(); + builder.field("openEnroll").startObject().field("type", "integer").endObject(); + builder.endObject(); + builder.endObject(); + + CreateIndexRequest createIndexRequest = new CreateIndexRequest(name); + createIndexRequest.settings(settingBuilder); + createIndexRequest.mapping(builder); + CreateIndexResponse createIndexResponse = restHighLevelClient.indices().create(createIndexRequest, RequestOptions.DEFAULT); + boolean acknowledged = createIndexResponse.isAcknowledged(); + if (acknowledged) { + return true; + } else { + return false; + } + + } @Override public String publish(String indexName, CourseFullText cf) throws Exception{ - - boolean isExists = esUtil.isIndexExists(indexName); - if(!isExists) { - boolean ok =createIndex(indexName); - if(!ok) { - log.error("创建索引【"+indexName+"】失败"); - return null; - } - } - if(cf.getOpenEnroll()==null) { - cf.setOpenEnroll(0); - } - //检查是否已存在 - IndexRequest indexRequest = new IndexRequest(indexName); - ObjectMapper mapper=new ObjectMapper(); - String textJson =mapper.writeValueAsString(cf); - - indexRequest.source(textJson, XContentType.JSON); - IndexResponse indexResponse = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT); - if (indexResponse != null) { - String id = indexResponse.getId(); - String index = indexResponse.getIndex(); - long version = indexResponse.getVersion(); - if (indexResponse.getResult() == DocWriteResponse.Result.CREATED) { - log.info("新增全文索引文档成功! " + index + "-" + id + "-" + version); - return id; - } else if (indexResponse.getResult() == DocWriteResponse.Result.UPDATED) { - log.info("修改文档成功!"); - return id; - } - - // 分片处理信息 - ReplicationResponse.ShardInfo shardInfo = indexResponse.getShardInfo(); - if (shardInfo.getTotal() != shardInfo.getSuccessful()) { - log.info("分片处理信息....."); - } - // 如果有分片副本失败,可以获得失败原因信息 - if (shardInfo.getFailed() > 0) { - for (ReplicationResponse.ShardInfo.Failure failure : shardInfo.getFailures()) { - String reason = failure.reason(); - log.info("副本失败原因:" + reason); - } - } - } - - return null; - } - - @Override - public boolean checkHas(String indexName,String id) { - GetRequest getRequest=new GetRequest(indexName,id); - try { - boolean exists = restHighLevelClient.exists(getRequest, RequestOptions.DEFAULT); - return exists; - } catch (IOException e) { - log.info("检查文档是否存在错误",e); - } - return false; - } - - @Override - public String republish(String indexName, CourseFullText item, String fullTextId) throws Exception{ - boolean isExists = esUtil.isIndexExists(indexName); if(!isExists) { boolean ok =createIndex(indexName); @@ -227,13 +164,76 @@ public class CourseElasticsearchImpl implements ICourseFullTextSearch{ return null; } } - + if(cf.getOpenEnroll()==null) { + cf.setOpenEnroll(0); + } + //检查是否已存在 + IndexRequest indexRequest = new IndexRequest(indexName); + ObjectMapper mapper=new ObjectMapper(); + String textJson =mapper.writeValueAsString(cf); + + indexRequest.source(textJson, XContentType.JSON); + IndexResponse indexResponse = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT); + if (indexResponse != null) { + String id = indexResponse.getId(); + String index = indexResponse.getIndex(); + long version = indexResponse.getVersion(); + if (indexResponse.getResult() == DocWriteResponse.Result.CREATED) { + log.info("新增全文索引文档成功! " + index + "-" + id + "-" + version); + return id; + } else if (indexResponse.getResult() == DocWriteResponse.Result.UPDATED) { + log.info("修改文档成功!"); + return id; + } + + // 分片处理信息 + ReplicationResponse.ShardInfo shardInfo = indexResponse.getShardInfo(); + if (shardInfo.getTotal() != shardInfo.getSuccessful()) { + log.info("分片处理信息....."); + } + // 如果有分片副本失败,可以获得失败原因信息 + if (shardInfo.getFailed() > 0) { + for (ReplicationResponse.ShardInfo.Failure failure : shardInfo.getFailures()) { + String reason = failure.reason(); + log.info("副本失败原因:" + reason); + } + } + } + + return null; + + } + + @Override + public boolean checkHas(String indexName,String id) { + GetRequest getRequest=new GetRequest(indexName,id); + try { + boolean exists = restHighLevelClient.exists(getRequest, RequestOptions.DEFAULT); + return exists; + } catch (IOException e) { + log.info("检查文档是否存在错误",e); + } + return false; + } + + @Override + public String republish(String indexName, CourseFullText item, String fullTextId) throws Exception{ + + boolean isExists = esUtil.isIndexExists(indexName); + if(!isExists) { + boolean ok =createIndex(indexName); + if(!ok) { + log.error("创建索引【"+indexName+"】失败"); + return null; + } + } + String fullId=fullTextId; - + if(item.getOpenEnroll()==null) { item.setOpenEnroll(0); } - + boolean exists=false; if(StringUtils.isNotBlank(fullTextId)) { GetRequest getRequest=new GetRequest(indexName,fullTextId); @@ -241,195 +241,206 @@ public class CourseElasticsearchImpl implements ICourseFullTextSearch{ } //System.out.println(item.getName()+"="+item.getType()); if(exists) { - UpdateRequest updateRequest = new UpdateRequest(indexName, fullTextId); + UpdateRequest updateRequest = new UpdateRequest(indexName, fullTextId); ObjectMapper mapper=new ObjectMapper(); - - String textJson =mapper.writeValueAsString(item); - updateRequest.doc(textJson, XContentType.JSON); - UpdateResponse updateResponse = restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT); - int ok=updateResponse.status().getStatus(); - if (ok==200) { - log.info("更新【"+fullTextId+"】成功!"); - } else { - log.error("更新【"+fullTextId+"】失败",updateResponse); - } - + + String textJson =mapper.writeValueAsString(item); + updateRequest.doc(textJson, XContentType.JSON); + UpdateResponse updateResponse = restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT); + int ok=updateResponse.status().getStatus(); + if (ok==200) { + log.info("更新【"+fullTextId+"】成功!"); + } else { + log.error("更新【"+fullTextId+"】失败",updateResponse); + } + }else { fullId=publish(indexName,item); } - + return fullId; - + } - + @Override public void updateField(String indexName, String field,Object value, String fullTextId) throws Exception{ - UpdateRequest updateRequest = new UpdateRequest(indexName, fullTextId); + UpdateRequest updateRequest = new UpdateRequest(indexName, fullTextId); ObjectMapper mapper=new ObjectMapper(); - + Map map=new HashMap(); map.put(field, value); String textJson =mapper.writeValueAsString(map); - - updateRequest.doc(textJson, XContentType.JSON); - UpdateResponse updateResponse = restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT); - if (updateResponse.getResult() == DocWriteResponse.Result.UPDATED) { - log.info("更新【"+fullTextId+"】成功!"); - } else { - log.error("更新【"+fullTextId+"】失败"); - } - - - } - - private BoolQueryBuilder createQuery(CourseFullText params) { - BoolQueryBuilder boolQuery= QueryBuilders.boolQuery(); - if(params.getType()!=null) { - - if(params.getType()==20) { - RangeQueryBuilder typeQuery = QueryBuilders.rangeQuery("type"); - typeQuery.lte(20); - boolQuery.filter(typeQuery); - }else { - boolQuery.filter(QueryBuilders.termQuery("type", params.getType())); - } - }else if(StringUtils.isNotBlank(params.getTypes())) { - List typeList=new ArrayList<>(); - if(params.getTypes().indexOf("20")>-1) { - typeList.add(10); - } - String[] typeArray=params.getTypes().split("-"); - for(String s:typeArray) { - typeList.add(Integer.valueOf(s)); - } - boolQuery.filter(QueryBuilders.termsQuery("type", typeList)); - } - - - - if(params.getSource()!=null) { - boolQuery.filter(QueryBuilders.termQuery("source", params.getSource())); - } - if(params.getOpenCourse()!=null && params.getOpenCourse()==1) { - boolQuery.filter(QueryBuilders.termQuery("openCourse", params.getOpenCourse())); - } - if(StringUtils.isNotBlank(params.getSysType1())) { - if(params.getSysType1().indexOf("-")>-1) { - String[] typeArray=params.getSysType1().split("-"); - boolQuery.filter(QueryBuilders.termsQuery("sysType1", typeArray)); - }else { - boolQuery.filter(QueryBuilders.termQuery("sysType1", params.getSysType1())); - } - - } - if(StringUtils.isNotBlank(params.getSysType2())) { - if(params.getSysType2().indexOf("-")>-1) { - String[] typeArray=params.getSysType2().split("-"); - boolQuery.filter(QueryBuilders.termsQuery("sysType2", typeArray)); - }else { - boolQuery.filter(QueryBuilders.termQuery("sysType2", params.getSysType2())); - } - } - if(StringUtils.isNotBlank(params.getSysType3())) { - if(params.getSysType3().indexOf("-")>-1) { - String[] typeArray=params.getSysType3().split("-"); - boolQuery.filter(QueryBuilders.termsQuery("sysType3", typeArray)); - }else { - boolQuery.filter(QueryBuilders.termQuery("sysType3", params.getSysType3())); - } - } - //增加companyId过滤 - if(StringUtils.isNotBlank(params.getCompanyId())) { - BoolQueryBuilder companyFilter= QueryBuilders.boolQuery(); - companyFilter.should(QueryBuilders.termQuery("source",2));//新系统的数据 - - BoolQueryBuilder old= QueryBuilders.boolQuery(); - old.must(QueryBuilders.termQuery("source",1));//必须是老系统的数据 - old.must(QueryBuilders.termQuery("companyId",params.getCompanyId()));//必须是老系统的数据 - companyFilter.should(old); - - companyFilter.minimumShouldMatch(1); - boolQuery.filter(companyFilter); - } - - + updateRequest.doc(textJson, XContentType.JSON); + UpdateResponse updateResponse = restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT); + if (updateResponse.getResult() == DocWriteResponse.Result.UPDATED) { + log.info("更新【"+fullTextId+"】成功!"); + } else { + log.error("更新【"+fullTextId+"】失败"); + } + + + } + + private BoolQueryBuilder createQuery(CourseFullText params) { + BoolQueryBuilder boolQuery= QueryBuilders.boolQuery(); + + if(params.getType()!=null) { + + if(params.getType()==20) { + RangeQueryBuilder typeQuery = QueryBuilders.rangeQuery("type"); + typeQuery.lte(20); + boolQuery.filter(typeQuery); + }else { + boolQuery.filter(QueryBuilders.termQuery("type", params.getType())); + } + }else if(StringUtils.isNotBlank(params.getTypes())) { + List typeList=new ArrayList<>(); + if(params.getTypes().indexOf("20")>-1) { + typeList.add(10); + } + String[] typeArray=params.getTypes().split("-"); + for(String s:typeArray) { + typeList.add(Integer.valueOf(s)); + } + boolQuery.filter(QueryBuilders.termsQuery("type", typeList)); + } + + + + if(params.getSource()!=null) { + boolQuery.filter(QueryBuilders.termQuery("source", params.getSource())); + } + if(params.getOpenCourse()!=null && params.getOpenCourse()==1) { + boolQuery.filter(QueryBuilders.termQuery("openCourse", params.getOpenCourse())); + } + if(StringUtils.isNotBlank(params.getSysType1())) { + if(params.getSysType1().indexOf("-")>-1) { + String[] typeArray=params.getSysType1().split("-"); + boolQuery.filter(QueryBuilders.termsQuery("sysType1", typeArray)); + }else { + boolQuery.filter(QueryBuilders.termQuery("sysType1", params.getSysType1())); + } + + } + if(StringUtils.isNotBlank(params.getSysType2())) { + if(params.getSysType2().indexOf("-")>-1) { + String[] typeArray=params.getSysType2().split("-"); + boolQuery.filter(QueryBuilders.termsQuery("sysType2", typeArray)); + }else { + boolQuery.filter(QueryBuilders.termQuery("sysType2", params.getSysType2())); + } + } + if(StringUtils.isNotBlank(params.getSysType3())) { + if(params.getSysType3().indexOf("-")>-1) { + String[] typeArray=params.getSysType3().split("-"); + boolQuery.filter(QueryBuilders.termsQuery("sysType3", typeArray)); + }else { + boolQuery.filter(QueryBuilders.termQuery("sysType3", params.getSysType3())); + } + } + //增加companyId过滤 + if(StringUtils.isNotBlank(params.getCompanyId())) { + BoolQueryBuilder companyFilter= QueryBuilders.boolQuery(); + companyFilter.should(QueryBuilders.termQuery("source",2));//新系统的数据 + + BoolQueryBuilder old= QueryBuilders.boolQuery(); + old.must(QueryBuilders.termQuery("source",1));//必须是老系统的数据 + old.must(QueryBuilders.termQuery("companyId",params.getCompanyId()));//必须是老系统的数据 + companyFilter.should(old); + + companyFilter.minimumShouldMatch(1); + boolQuery.filter(companyFilter); + } + + /* 2023-08-08 不管是否是此课程受众 ,都可以搜索到 但点进课程详情提示无权限*/ //加上Source判断,是为了应对后台查询,后台查询时,不需要权限,但是需要指定数据来源 - /* 20231030 暂时不上线, - if(params.getSource()==null || params.getSource()==0 ) { - //受众权限条件,必须是有受众的课程并且受众条件不为空 - if(params.getAudiences()!=null && params.getAudiences().length>0) { - //if(StringUtils.isNotBlank(params.getAudience())) { - BoolQueryBuilder audience= QueryBuilders.boolQuery(); - audience.should(QueryBuilders.termQuery("isSetAudience",0)); + if(params.getSource()==null || params.getSource()==0 ) { + //受众权限条件,必须是有受众的课程并且受众条件不为空 + if(params.getAudiences()!=null && params.getAudiences().length>0) { + //if(StringUtils.isNotBlank(params.getAudience())) { + BoolQueryBuilder audience= QueryBuilders.boolQuery(); + BoolQueryBuilder offCourse= QueryBuilders.boolQuery(); + audience.should(offCourse); + offCourse.must(QueryBuilders.termQuery("isSetAudience",0)); + offCourse.mustNot(QueryBuilders.termsQuery("id", params.getOffCourseId())); - BoolQueryBuilder has= QueryBuilders.boolQuery(); - //String[] ids=params.getAudience().split(","); - has.must(QueryBuilders.termQuery("isSetAudience",1)); - //has.must(QueryBuilders.termsQuery("audience", ids)); - has.must(QueryBuilders.termsQuery("audiences", params.getAudiences())); - //查询出例外人员创建的课程 - if(params.getSysCreateAids()!=null && params.getSysCreateAids().length>0) { - BoolQueryBuilder exception =QueryBuilders.boolQuery(); - exception.must(QueryBuilders.termsQuery("sysCreateAid",params.getSysCreateAids())); - audience.should(exception); - } - audience.should(has); - audience.minimumShouldMatch(1); - boolQuery.filter(audience); - //log.error("audience="+audience.toString()); - }else { - //如果当前用户无受众,只能查询未设置受众的课程 - boolQuery.should(QueryBuilders.termQuery("isSetAudience",0)); - if(params.getSysCreateAids()!=null && params.getSysCreateAids().length>0) { - boolQuery.should(QueryBuilders.termsQuery("sysCreateAid",params.getSysCreateAids())); - } - boolQuery.minimumShouldMatch(1); - } - }*/ - - //在哪端显示 - if(params.getDevice()!=null) { - BoolQueryBuilder deviceQuery = QueryBuilders.boolQuery(); - if(params.getDevice()==1) { //pc端可见的课程,以及又端都可见的课程 - deviceQuery.should(QueryBuilders.termQuery("device", 1)); - deviceQuery.should(QueryBuilders.termQuery("device", 3)); - }else if(params.getDevice()==2) { //移动端可见的课程 - deviceQuery.should(QueryBuilders.termQuery("device", 2)); - deviceQuery.should(QueryBuilders.termQuery("device", 3)); - } - if(deviceQuery.hasClauses()) { - boolQuery.must(deviceQuery); - } - - } + BoolQueryBuilder has= QueryBuilders.boolQuery(); + //String[] ids=params.getAudience().split(","); + has.must(QueryBuilders.termQuery("isSetAudience",1)); + //has.must(QueryBuilders.termsQuery("audience", ids)); + has.must(QueryBuilders.termsQuery("audiences", params.getAudiences())); + //查询出例外人员创建的课程 + if(params.getSysCreateAids()!=null && params.getSysCreateAids().length>0) { + BoolQueryBuilder exception =QueryBuilders.boolQuery(); + exception.must(QueryBuilders.termsQuery("sysCreateAid",params.getSysCreateAids())); + audience.should(exception); + } + //查询报名的课程 + if(params.getCourseId()!=null && params.getCourseId().length>0) { + BoolQueryBuilder exception =QueryBuilders.boolQuery(); + exception.must(QueryBuilders.termsQuery("id",params.getCourseId())); + audience.should(exception); + } + audience.should(has); + audience.minimumShouldMatch(1); + boolQuery.filter(audience); + //log.error("audience="+audience.toString()); + }else { + //如果当前用户无受众,只能查询未设置受众的课程 + BoolQueryBuilder builder=QueryBuilders.boolQuery(); + builder.must(QueryBuilders.termQuery("isSetAudience",0)); + builder.mustNot(QueryBuilders.termsQuery("id", params.getOffCourseId())); + boolQuery.should(builder); + if(params.getSysCreateAids()!=null && params.getSysCreateAids().length>0) { + boolQuery.should(QueryBuilders.termsQuery("sysCreateAid",params.getSysCreateAids())); + } + boolQuery.minimumShouldMatch(1); + } + } + + //在哪端显示 + if(params.getDevice()!=null) { + BoolQueryBuilder deviceQuery = QueryBuilders.boolQuery(); + if(params.getDevice()==1) { //pc端可见的课程,以及又端都可见的课程 + deviceQuery.should(QueryBuilders.termQuery("device", 1)); + deviceQuery.should(QueryBuilders.termQuery("device", 3)); + }else if(params.getDevice()==2) { //移动端可见的课程 + deviceQuery.should(QueryBuilders.termQuery("device", 2)); + deviceQuery.should(QueryBuilders.termQuery("device", 3)); + } + if(deviceQuery.hasClauses()) { + boolQuery.must(deviceQuery); + } + + } + + if(StringUtils.isNotBlank(params.getKeywords())) { + + String words=QueryParser.escape(params.getKeywords()); - if(StringUtils.isNotBlank(params.getKeywords())) { - - String words=QueryParser.escape(params.getKeywords()); - // System.out.println(params.getKeywords()); // System.out.println(words); - - BoolQueryBuilder keywordQuery = QueryBuilders.boolQuery(); - keywordQuery.should(QueryBuilders.wildcardQuery("name", "*"+words+"*").boost(9f)); - keywordQuery.should(QueryBuilders.wildcardQuery("teacher", "*"+words+"*").boost(7f)); + + BoolQueryBuilder keywordQuery = QueryBuilders.boolQuery(); + keywordQuery.should(QueryBuilders.wildcardQuery("name", "*"+words+"*").boost(9f)); + keywordQuery.should(QueryBuilders.wildcardQuery("teacher", "*"+words+"*").boost(7f)); // keywordQuery.should(QueryBuilders.queryStringQuery("*" + words + "*").field("keywords")); // keywordQuery.should(QueryBuilders.queryStringQuery(words).field("keywords")); - keywordQuery.should(QueryBuilders.matchPhraseQuery("keywords", words)); - keywordQuery.should(QueryBuilders.fuzzyQuery("keywords", words)); - //keywordQuery.should(QueryBuilders.queryStringQuery(words).field("name", 9f));//用此方法无法查询出有转义符的处理 - //keywordQuery.should(QueryBuilders.queryStringQuery(words).field("teacher", 8f)); - - keywordQuery.minimumShouldMatch(1); - boolQuery.must(keywordQuery); - //boolQuery.must(QueryBuilders.wildcardQuery("name", "*"+params.getKeywords()+"*").boost(9f)); - //teacher - -// + keywordQuery.should(QueryBuilders.matchPhraseQuery("keywords", words)); + keywordQuery.should(QueryBuilders.fuzzyQuery("keywords", words)); + //keywordQuery.should(QueryBuilders.queryStringQuery(words).field("name", 9f));//用此方法无法查询出有转义符的处理 + //keywordQuery.should(QueryBuilders.queryStringQuery(words).field("teacher", 8f)); + + keywordQuery.minimumShouldMatch(1); + boolQuery.must(keywordQuery); + //boolQuery.must(QueryBuilders.wildcardQuery("name", "*"+params.getKeywords()+"*").boost(9f)); + //teacher + +// // BoolQueryBuilder keywordQuery = QueryBuilders.boolQuery(); -// +// //// //相当于 like查询, 它的权重最高 8位权重 //// boolQuery.should(QueryBuilders.queryStringQuery(params.getKeywords()).field("name", 8f)); //// //其它是教师,教师也是 like查询, 它只是2位权重 @@ -440,24 +451,24 @@ public class CourseElasticsearchImpl implements ICourseFullTextSearch{ //// //boolQuery.should(QueryBuilders.fuzzyQuery("keywords",params.getKeywords()).boost(3f)); //// //分词查询,权重是1,默念 //// boolQuery.should(QueryBuilders.multiMatchQuery(params.getKeywords(),"summary")); -// +// // //相当于 like查询, 它的权重最高 8位权重 // keywordQuery.should(QueryBuilders.queryStringQuery(params.getKeywords()).field("name", 8f)); // //其它是教师,教师也是 like查询, 它只是5权重 // //keywordQuery.should(QueryBuilders.queryStringQuery(params.getKeywords()).field("teacher", 5f)); // //关键词查询 like查询, 它只是3权重 // //keywordQuery.should(QueryBuilders.queryStringQuery(params.getKeywords()).field("keywords", 3f)); -// +// // //boolQuery.should(QueryBuilders.fuzzyQuery("keywords",params.getKeywords()).boost(3f)); // //分词查询,权重是1, // //keywordQuery.should(QueryBuilders.multiMatchQuery(params.getKeywords(),"summary")); -// +// // //最少也能匹配到一个 // keywordQuery.minimumShouldMatch(1); // boolQuery.must(keywordQuery); - } - - //课程时长查询 + } + + //课程时长查询 // if(params.getDuration()!=null || params.getMaxDuration()!=null) { // RangeQueryBuilder durationQuery = QueryBuilders.rangeQuery("duration"); // if(params.getDuration()!=null) { @@ -468,96 +479,96 @@ public class CourseElasticsearchImpl implements ICourseFullTextSearch{ // } // boolQuery.filter(durationQuery); // } - - //加入条件, 排序最热,无关键词查询时才进行搜索 - if(StringUtils.isBlank(params.getKeywords()) && params.getOrderType()!=null && params.getOrderType()==2) { - RangeQueryBuilder timeLimit = QueryBuilders.rangeQuery("publishTime"); - Long second = LocalDateTime.of(2022,1, 1, 0, 0).toEpochSecond(ZoneOffset.of("+8")); - timeLimit.gte(second); - boolQuery.filter(timeLimit); - } - //System.out.println(boolQuery.toString()); - return boolQuery; + + //加入条件, 排序最热,无关键词查询时才进行搜索 + if(StringUtils.isBlank(params.getKeywords()) && params.getOrderType()!=null && params.getOrderType()==2) { + RangeQueryBuilder timeLimit = QueryBuilders.rangeQuery("publishTime"); + Long second = LocalDateTime.of(2022,1, 1, 0, 0).toEpochSecond(ZoneOffset.of("+8")); + timeLimit.gte(second); + boolQuery.filter(timeLimit); + } + //System.out.println(boolQuery.toString()); + return boolQuery; } @Override public List search(String indexNames, int num, CourseFullText paras) throws Exception{ - SearchRequest searchRequest = new SearchRequest(); - if(StringUtils.isNotBlank(indexNames)) { - String[] names=indexNames.split(","); - searchRequest.indices(names); - } - SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); - if(num==0) { - num=10; - } - sourceBuilder.size(num); - - BoolQueryBuilder boolQuery=createQuery(paras); - - sourceBuilder.query(boolQuery); - - //排序 - if(StringUtils.isBlank(paras.getKeywords())) { - sourceBuilder.sort("isTop",SortOrder.DESC); - sourceBuilder.sort("topTime",SortOrder.DESC); - } - if(paras.getOrderType()!=null) { - if(paras.getOrderType()==1) { - sourceBuilder.sort("publishTime",SortOrder.DESC); - }else if(paras.getOrderType()==2) { - sourceBuilder.sort("studies",SortOrder.DESC); - sourceBuilder.sort("publishTime",SortOrder.DESC); - } - } - //sourceBuilder.sort("isTop",SortOrder.DESC); - //sourceBuilder.sort("publishTime",SortOrder.DESC); - sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS)); - - //name - HighlightBuilder highlightBuilder = new HighlightBuilder(); - - highlightBuilder.requireFieldMatch(true);//是否多个字段都高亮 - highlightBuilder.preTags("");//前缀后缀 - highlightBuilder.postTags(""); - - HighlightBuilder.Field nameHighlight=new HighlightBuilder.Field("name"); - HighlightBuilder.Field summaryHighlight=new HighlightBuilder.Field("summary"); - HighlightBuilder.Field teacherHighlight=new HighlightBuilder.Field("teacher"); - HighlightBuilder.Field keywordsHighlight=new HighlightBuilder.Field("keywords"); - highlightBuilder.field(nameHighlight); - highlightBuilder.field(teacherHighlight); - highlightBuilder.field(keywordsHighlight); - highlightBuilder.field(summaryHighlight); - - - sourceBuilder.highlighter(highlightBuilder); - - searchRequest.source(sourceBuilder); - - List list=new ArrayList<>(); - - ObjectMapper mapper=new ObjectMapper(); - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - - SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT); - SearchHits hits = response.getHits(); - log.info("共查询到 : "+hits.getTotalHits()); - for (SearchHit hit : hits) { - - Map highlightFields = hit.getHighlightFields(); - HighlightField name = highlightFields.get("name"); - HighlightField summary = highlightFields.get("summary"); - HighlightField teacher = highlightFields.get("teacher"); - HighlightField keywords = highlightFields.get("keywords"); - //Map sourceAsMap = hit.getSourceAsMap();//原来的结果 - - String sourceAsString = hit.getSourceAsString(); - //log.info(sourceAsString); - try { - CourseFullText cft =mapper.readValue(sourceAsString, CourseFullText.class); - cft.setEsId(hit.getId()); - //以下不再加高亮显,高亮显在页面中去实现 + SearchRequest searchRequest = new SearchRequest(); + if(StringUtils.isNotBlank(indexNames)) { + String[] names=indexNames.split(","); + searchRequest.indices(names); + } + SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); + if(num==0) { + num=10; + } + sourceBuilder.size(num); + + BoolQueryBuilder boolQuery=createQuery(paras); + + sourceBuilder.query(boolQuery); + + //排序 + if(StringUtils.isBlank(paras.getKeywords())) { + sourceBuilder.sort("isTop",SortOrder.DESC); + sourceBuilder.sort("topTime",SortOrder.DESC); + } + if(paras.getOrderType()!=null) { + if(paras.getOrderType()==1) { + sourceBuilder.sort("publishTime",SortOrder.DESC); + }else if(paras.getOrderType()==2) { + sourceBuilder.sort("studies",SortOrder.DESC); + sourceBuilder.sort("publishTime",SortOrder.DESC); + } + } + //sourceBuilder.sort("isTop",SortOrder.DESC); + //sourceBuilder.sort("publishTime",SortOrder.DESC); + sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS)); + + //name + HighlightBuilder highlightBuilder = new HighlightBuilder(); + + highlightBuilder.requireFieldMatch(true);//是否多个字段都高亮 + highlightBuilder.preTags("");//前缀后缀 + highlightBuilder.postTags(""); + + HighlightBuilder.Field nameHighlight=new HighlightBuilder.Field("name"); + HighlightBuilder.Field summaryHighlight=new HighlightBuilder.Field("summary"); + HighlightBuilder.Field teacherHighlight=new HighlightBuilder.Field("teacher"); + HighlightBuilder.Field keywordsHighlight=new HighlightBuilder.Field("keywords"); + highlightBuilder.field(nameHighlight); + highlightBuilder.field(teacherHighlight); + highlightBuilder.field(keywordsHighlight); + highlightBuilder.field(summaryHighlight); + + + sourceBuilder.highlighter(highlightBuilder); + + searchRequest.source(sourceBuilder); + + List list=new ArrayList<>(); + + ObjectMapper mapper=new ObjectMapper(); + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + + SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT); + SearchHits hits = response.getHits(); + log.info("共查询到 : "+hits.getTotalHits()); + for (SearchHit hit : hits) { + + Map highlightFields = hit.getHighlightFields(); + HighlightField name = highlightFields.get("name"); + HighlightField summary = highlightFields.get("summary"); + HighlightField teacher = highlightFields.get("teacher"); + HighlightField keywords = highlightFields.get("keywords"); + //Map sourceAsMap = hit.getSourceAsMap();//原来的结果 + + String sourceAsString = hit.getSourceAsString(); + //log.info(sourceAsString); + try { + CourseFullText cft =mapper.readValue(sourceAsString, CourseFullText.class); + cft.setEsId(hit.getId()); + //以下不再加高亮显,高亮显在页面中去实现 // if(name!= null){ // Text[] fragments = name.fragments(); // StringBuffer fmtStr = new StringBuffer(""); @@ -566,7 +577,7 @@ public class CourseElasticsearchImpl implements ICourseFullTextSearch{ // } // cft.setName(fmtStr.toString()); // } -// +// // if(summary!= null){ // Text[] fragments = summary.fragments(); // StringBuffer fmtStr = new StringBuffer(""); @@ -575,7 +586,7 @@ public class CourseElasticsearchImpl implements ICourseFullTextSearch{ // } // cft.setSummary(fmtStr.toString()); // } - //去掉老师的高亮显 + //去掉老师的高亮显 // if(teacher!= null){ // Text[] fragments = teacher.fragments(); // StringBuffer fmtStr = new StringBuffer(""); @@ -584,7 +595,7 @@ public class CourseElasticsearchImpl implements ICourseFullTextSearch{ // } // cft.setTeacher(fmtStr.toString()); // } - + // if(keywords!= null){ // Text[] fragments = keywords.fragments(); // StringBuffer fmtStr = new StringBuffer(""); @@ -593,43 +604,43 @@ public class CourseElasticsearchImpl implements ICourseFullTextSearch{ // } // cft.setKeywords(fmtStr.toString()); // } - - list.add(cft); - }catch(Exception ee) { - log.error("转化查询结果错误",ee); - //ee.printStackTrace(); - } - - } - return list; - + + list.add(cft); + }catch(Exception ee) { + log.error("转化查询结果错误",ee); + //ee.printStackTrace(); + } + + } + return list; + } @Override public PageList search(String indexNames, int startRow, int pageSize, CourseFullText paras) throws Exception{ SearchRequest searchRequest = new SearchRequest(); - if(StringUtils.isNotBlank(indexNames)) { - String[] names=indexNames.split(","); - searchRequest.indices(names); - } - SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); - sourceBuilder.from(startRow); - sourceBuilder.size(pageSize); + if(StringUtils.isNotBlank(indexNames)) { + String[] names=indexNames.split(","); + searchRequest.indices(names); + } + SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); + sourceBuilder.from(startRow); + sourceBuilder.size(pageSize); - BoolQueryBuilder boolQuery=createQuery(paras); - if(boolQuery.hasClauses()) { - sourceBuilder.query(boolQuery); - } + BoolQueryBuilder boolQuery=createQuery(paras); + if(boolQuery.hasClauses()) { + sourceBuilder.query(boolQuery); + } - //排序 - if(StringUtils.isBlank(paras.getKeywords()) && paras.getOrderType()!=3) { - sourceBuilder.sort("isTop",SortOrder.DESC); - //sourceBuilder.sort("topTime",SortOrder.DESC); - } - if(paras.getOrderType()!=null) { + //排序 + if(StringUtils.isBlank(paras.getKeywords()) && paras.getOrderType()!=3) { + sourceBuilder.sort("isTop",SortOrder.DESC); + //sourceBuilder.sort("topTime",SortOrder.DESC); + } + if(paras.getOrderType()!=null) { if (paras.getOrderType() == 1) { sourceBuilder.sort("publishTime", SortOrder.DESC); } else if (paras.getOrderType() == 2) { @@ -639,50 +650,50 @@ public class CourseElasticsearchImpl implements ICourseFullTextSearch{ } } - sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS)); - - //name - HighlightBuilder highlightBuilder = new HighlightBuilder(); - - highlightBuilder.requireFieldMatch(true);//是否多个字段都高亮 - highlightBuilder.preTags("");//前缀后缀 - highlightBuilder.postTags(""); - - HighlightBuilder.Field nameHighlight=new HighlightBuilder.Field("name"); - HighlightBuilder.Field summaryHighlight=new HighlightBuilder.Field("summary"); - HighlightBuilder.Field teacherHighlight=new HighlightBuilder.Field("teacher"); + sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS)); + + //name + HighlightBuilder highlightBuilder = new HighlightBuilder(); + + highlightBuilder.requireFieldMatch(true);//是否多个字段都高亮 + highlightBuilder.preTags("");//前缀后缀 + highlightBuilder.postTags(""); + + HighlightBuilder.Field nameHighlight=new HighlightBuilder.Field("name"); + HighlightBuilder.Field summaryHighlight=new HighlightBuilder.Field("summary"); + HighlightBuilder.Field teacherHighlight=new HighlightBuilder.Field("teacher"); // HighlightBuilder.Field keywordsHighlight=new HighlightBuilder.Field("keywords"); - highlightBuilder.field(nameHighlight); - highlightBuilder.field(teacherHighlight); + highlightBuilder.field(nameHighlight); + highlightBuilder.field(teacherHighlight); // highlightBuilder.field(keywordsHighlight); - highlightBuilder.field(summaryHighlight); - - - sourceBuilder.highlighter(highlightBuilder); - - searchRequest.source(sourceBuilder); - - List list=new ArrayList<>(); - - ObjectMapper mapper=new ObjectMapper(); - - - - SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT); - SearchHits hits = response.getHits(); - //log.info("共查询到 : "+hits.getTotalHits()); - for (SearchHit hit : hits) { - - Map highlightFields = hit.getHighlightFields(); - HighlightField name = highlightFields.get("name"); - HighlightField summary = highlightFields.get("summary"); - HighlightField teacher = highlightFields.get("teacher"); + highlightBuilder.field(summaryHighlight); + + + sourceBuilder.highlighter(highlightBuilder); + + searchRequest.source(sourceBuilder); + + List list=new ArrayList<>(); + + ObjectMapper mapper=new ObjectMapper(); + + + + SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT); + SearchHits hits = response.getHits(); + //log.info("共查询到 : "+hits.getTotalHits()); + for (SearchHit hit : hits) { + + Map highlightFields = hit.getHighlightFields(); + HighlightField name = highlightFields.get("name"); + HighlightField summary = highlightFields.get("summary"); + HighlightField teacher = highlightFields.get("teacher"); // HighlightField keywords = highlightFields.get("keywords"); - String sourceAsString = hit.getSourceAsString(); - try { - CourseFullText cft =mapper.readValue(sourceAsString, CourseFullText.class); - - cft.setEsId(hit.getId()); + String sourceAsString = hit.getSourceAsString(); + try { + CourseFullText cft =mapper.readValue(sourceAsString, CourseFullText.class); + + cft.setEsId(hit.getId()); // if(name!= null){ // Text[] fragments = name.fragments(); // StringBuffer fmtStr = new StringBuffer(""); @@ -691,24 +702,24 @@ public class CourseElasticsearchImpl implements ICourseFullTextSearch{ // } // cft.setName(fmtStr.toString()); // } - - if(summary!= null){ - Text[] fragments = summary.fragments(); - StringBuffer fmtStr = new StringBuffer(""); - for (Text fragment : fragments) { - fmtStr.append(fragment); - } - cft.setSummary(fmtStr.toString()); - } - - if(teacher!= null){ - Text[] fragments = teacher.fragments(); - StringBuffer fmtStr = new StringBuffer(""); - for (Text fragment : fragments) { - fmtStr.append(fragment); - } - cft.setTeacher(fmtStr.toString()); - } + + if(summary!= null){ + Text[] fragments = summary.fragments(); + StringBuffer fmtStr = new StringBuffer(""); + for (Text fragment : fragments) { + fmtStr.append(fragment); + } + cft.setSummary(fmtStr.toString()); + } + + if(teacher!= null){ + Text[] fragments = teacher.fragments(); + StringBuffer fmtStr = new StringBuffer(""); + for (Text fragment : fragments) { + fmtStr.append(fragment); + } + cft.setTeacher(fmtStr.toString()); + } /*if(keywords!= null){ Text[] fragments = keywords.fragments(); @@ -718,49 +729,49 @@ public class CourseElasticsearchImpl implements ICourseFullTextSearch{ } cft.setKeywords(fmtStr.toString()); }*/ - list.add(cft); - }catch(Exception ee) { - log.error("转化json到对应失败"); - } - - } - PageList rs=new PageList(); - rs.setCount((int)hits.getTotalHits().value); - rs.setPageSize(pageSize); - rs.setList(list); - return rs; - + list.add(cft); + }catch(Exception ee) { + log.error("转化json到对应失败"); + } + + } + PageList rs=new PageList(); + rs.setCount((int)hits.getTotalHits().value); + rs.setPageSize(pageSize); + rs.setList(list); + return rs; + } @Override public void removeByDocId(String indexName, String id) { DeleteRequest deleteRequest = new DeleteRequest(indexName); - deleteRequest.id(id); - try { - DeleteResponse deleteResponse = restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT); - if (deleteResponse.getResult() == DocWriteResponse.Result.NOT_FOUND) { - log.error("删除失败,未找到索引id是【"+id+"】的文档"); - } - //restHighLevelClient.close(); - } catch (IOException e) { - log.error("删除异常:"+e.getMessage()); - } + deleteRequest.id(id); + try { + DeleteResponse deleteResponse = restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT); + if (deleteResponse.getResult() == DocWriteResponse.Result.NOT_FOUND) { + log.error("删除失败,未找到索引id是【"+id+"】的文档"); + } + //restHighLevelClient.close(); + } catch (IOException e) { + log.error("删除异常:"+e.getMessage()); + } } - + @Override public boolean deleteById(String indexName, String id) throws IOException { DeleteByQueryRequest deleteRequest=new DeleteByQueryRequest(indexName); - deleteRequest.setQuery(new TermQueryBuilder("id",id)); - BulkByScrollResponse response = restHighLevelClient.deleteByQuery(deleteRequest, RequestOptions.DEFAULT); - long n=response.getStatus().getTotal(); - - if(n==0) { - log.error("按id删除失败",response); - return true; - }else { - return false; - } - //restHighLevelClient.close(); - + deleteRequest.setQuery(new TermQueryBuilder("id",id)); + BulkByScrollResponse response = restHighLevelClient.deleteByQuery(deleteRequest, RequestOptions.DEFAULT); + long n=response.getStatus().getTotal(); + + if(n==0) { + log.error("按id删除失败",response); + return true; + }else { + return false; + } + //restHighLevelClient.close(); + } } diff --git a/servers/boe-server-all/src/main/java/com/xboe/api/ThirdApi.java b/servers/boe-server-all/src/main/java/com/xboe/api/ThirdApi.java index a0b631b7..cacccc14 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/api/ThirdApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/api/ThirdApi.java @@ -46,13 +46,16 @@ public class ThirdApi { @Value("${infrasApi.dict}") private String infarasApiUrl; + @Value("${manageApi.stu.offcourse}") + private String manageApiStu; + @Value("${audience.getOrgUsers}") + private String searchOrgUsersUrl; //获取例外人员的id public List getUserId(){ log.info("正在获取例外人员工号"); -// String s ="{\"show\":false,\"version\":\"1.1.0\",\"code\":200,\"msg\":\"请求成功!\",\"data\":{\"records\":[{\"id\":129,\"deleted\":null,\"createTime\":\"2023-10-16T10:03:25\",\"createId\":0,\"createName\":\"管理员\",\"updateTime\":\"2023-10-16T10:03:25\",\"updateId\":0,\"updateName\":\"管理员\",\"name\":\"李玉冰\",\"pid\":128,\"code\":\"00004409\",\"description\":null,\"value\":\"00004409\",\"img\":null,\"type\":1,\"level\":0,\"status\":0,\"sort\":0,\"children\":[]}],\"total\":0,\"size\":10,\"current\":1,\"orders\":[],\"id\":null,\"pid\":128,\"type\":1,\"status\":null,\"code\":null,\"name\":null,\"searchCount\":true,\"pages\":0},\"success\":true}"; - String s = Optional.ofNullable(HttpRequest.get(infarasApiUrl).execute() //"current",1,"type",1,"pid",128) + String s = Optional.ofNullable(HttpRequest.get(infarasApiUrl).execute() .body()).orElseThrow(() -> new RuntimeException("token校验失败")); List dictDtos = Opt.ofBlankAble(s).map(t -> JSONUtil.toBean(t, DictResult.class)).map(DictResult::getData).orElseThrow(); ListuserNo=new ArrayList<>(); @@ -61,9 +64,13 @@ public class ThirdApi { } return userDao.getListByUserNos(userNo).stream().map(User::getId).collect(Collectors.toList()); } - @Value("${audience.getOrgUsers}") - private String searchOrgUsersUrl; - + //获取面授课id + public ListgetOffCourseId(String userId,String token){ + log.info("正在获取面授课id"); + String s = Optional.ofNullable(HttpRequest.get(manageApiStu+"?userId="+userId).header("token", token).execute() + .body()).orElseThrow(() -> new RuntimeException("token校验失败")); + return Opt.ofBlankAble(s).map(t -> JSONUtil.toBean(t, StringResult.class)).map(StringResult::getData).orElseThrow(); + } public List getAllUserList(UserListParam userListParam, String token) { log.info("获取用户:url:{}", searchOrgUsersUrl); @@ -91,11 +98,7 @@ public class ThirdApi { private void nextPage(UserListParam userListParam, String token, List userInfoLists, UserInfoListRootBean.ResultData t) { - log.info("nextPage 1 获取用户:" + userListParam + ",TotalPage=" + t.getTotalPage()); - if (t.getTotalPage() == 0){ - t.setTotalPage((int)Math.ceil(Double.parseDouble(String.valueOf(t.getTotal()))/Double.parseDouble(String.valueOf(userListParam.getPageSize())))); - } - log.info("nextPage 2 获取用户:" + userListParam + ",TotalPage=" + t.getTotalPage()); + log.info("nextPage 获取用户--" + userListParam.getPageNo()); if (t.getTotalPage() > userListParam.getPageNo()) { REQUEST_TASK.submit(() -> IntStream.range(userListParam.getPageNo(), t.getTotalPage()).parallel().forEach(i -> getAllUserList(userListParam.withPageNo(i + 1), token, userInfoLists))).join(); } diff --git a/servers/boe-server-all/src/main/java/com/xboe/api/vo/StringResult.java b/servers/boe-server-all/src/main/java/com/xboe/api/vo/StringResult.java new file mode 100644 index 00000000..22e65268 --- /dev/null +++ b/servers/boe-server-all/src/main/java/com/xboe/api/vo/StringResult.java @@ -0,0 +1,15 @@ +package com.xboe.api.vo; + +import com.xboe.module.dict.entity.DictDto; +import lombok.Data; + +import java.util.List; +@Data +public class StringResult { + private Boolean show; + private String version; + private String code; + private String msg; + private List data; + private String success; +} diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseFullTextApi.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseFullTextApi.java index 3390e9c0..7eb15d5d 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseFullTextApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseFullTextApi.java @@ -6,14 +6,8 @@ import java.util.List; import java.util.stream.Collectors; import com.xboe.api.ThirdApi; -import com.xboe.common.utils.StringUtil; -import com.xboe.module.boecase.dao.CasesRecordDao; -import com.xboe.old.dto.OrganizationDto; -import com.xboe.system.organization.api.OrganizationApi; -import com.xboe.system.organization.entity.Organization; +import com.xboe.school.study.service.IStudyCourseService; import com.xboe.system.organization.service.IOrganizationService; -import com.xboe.system.organization.service.impl.OrganizationServiceImpl; -import com.xboe.system.user.dao.UserDao; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; @@ -40,46 +34,50 @@ import com.xboe.module.course.service.ICourseTeacherService; import lombok.extern.slf4j.Slf4j; import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; @Slf4j @RestController @RequestMapping(value="/xboe/m/course/fulltext") public class CourseFullTextApi extends ApiBaseController{ - + @Autowired ICourseService courseService; - + @Autowired ICourseTeacherService courseTeacherService; - + @Autowired ICourseContentService ccourseService; - + @Autowired(required = false) ICourseFullTextSearch fullTextSearch; @Resource IOrganizationService organizationService; + @Resource + IStudyCourseService IStudyCourseService; + @Autowired ThirdApi thirdApi; - + /** * 课程的初始化 * @return */ @GetMapping("/init") public JsonResponse initAllCourse(String flag) throws Exception{ - + if(fullTextSearch==null) { return error("初始化失败:未实现全文检索功能"); } //重新创建索引,如果已经存在,不会重新建 fullTextSearch.reCreateIndex(ICourseFullTextSearch.DEFAULT_INDEX_NAME); - + //提取课程信息,因为现在课程没有太多,所以一次性全部查出来, CourseQueryDto dto =new CourseQueryDto(); dto.setPublish(true);//必须是已发布的 - + List clist = courseService.findList(dto); for(Course c:clist) { CourseFullText cft=CourseToCourseFullText.convert(c); @@ -89,7 +87,7 @@ public class CourseFullTextApi extends ApiBaseController{ //计算课程时长 int duration=ccourseService.sumDurationByCourseId(c.getId()); cft.setDuration(duration); - + //查询教师 CourseTeacherDto teacherDto = courseTeacherService.getTeacherByCourseId(c.getId()); if(teacherDto!=null && !teacherDto.getNames().isEmpty()) { @@ -110,23 +108,23 @@ public class CourseFullTextApi extends ApiBaseController{ }else { cft.setIsSetAudience(0);//无受众 } - + String fullTextId=fullTextSearch.republish(ICourseFullTextSearch.DEFAULT_INDEX_NAME, cft,c.getFullTextId()); log.info("发布课程全文检索成功:"+fullTextId); c.setFullTextId(fullTextId); if(StringUtils.isNotBlank(fullTextId)) { courseService.updateFieldById(c.getId(),"fullTextId", fullTextId); } - + }catch(Exception e) { log.error("发布课程【"+c.getName()+"("+c.getId()+")】全文检索及更新数据库失败",e); } - - + + } return success(true); } - + @PostMapping("/delete-by-id") public JsonResponse deleteById(String id) throws Exception{ if(fullTextSearch==null){ @@ -145,7 +143,7 @@ public class CourseFullTextApi extends ApiBaseController{ } @PostMapping("/republish") public JsonResponse republish(String id) throws Exception{ - + if(fullTextSearch==null) { return error("初始化失败:未实现全文检索功能"); } @@ -157,13 +155,13 @@ public class CourseFullTextApi extends ApiBaseController{ if(c.getPublished()==null || !c.getPublished()) { return error("此课程还未发布,请发布课程,不用在这里重新发布"); } - + CourseFullText cft=CourseToCourseFullText.convert(c); try { //计算课程时长 int duration=ccourseService.sumDurationByCourseId(c.getId()); cft.setDuration(duration); - + //查询教师 CourseTeacherDto teacherDto = courseTeacherService.getTeacherByCourseId(c.getId()); if(teacherDto!=null && !teacherDto.getNames().isEmpty()) { @@ -187,14 +185,14 @@ public class CourseFullTextApi extends ApiBaseController{ }else { cft.setIsSetAudience(0);//无受众 } - + String fullTextId=fullTextSearch.republish(ICourseFullTextSearch.DEFAULT_INDEX_NAME, cft,c.getFullTextId()); log.info("发布课程全文检索成功:"+fullTextId); c.setFullTextId(fullTextId); if(StringUtils.isNotBlank(fullTextId)) { courseService.updateFieldById(c.getId(),"fullTextId", fullTextId); } - + }catch(Exception e) { log.error("发布课程【"+c.getName()+"("+c.getId()+")】全文检索及更新数据库失败",e); return error("重新发布失败",e.getMessage()); @@ -202,8 +200,8 @@ public class CourseFullTextApi extends ApiBaseController{ return success(true); } - - + + /** * 全文检索查询 * @param pager @@ -211,17 +209,29 @@ public class CourseFullTextApi extends ApiBaseController{ * @return */ @PostMapping("/search") - public JsonResponse> search(Pagination pager,CourseQueryDto dto,Integer minDuration,Integer maxDuration){ - //获取例外人员id + public JsonResponse> search(Pagination pager, CourseQueryDto dto, Integer minDuration, Integer maxDuration, HttpServletRequest request){ + //获取例外人员id List userId = thirdApi.getUserId(); String userIds = String.join(",", userId); +// String userIds="132,123"; + //获取没报名课程的id + String token = request.getHeader("Xboe-Access-Token"); + if (StringUtils.isEmpty(token)) { + token = request.getHeader("token"); + } + List offCourseId = thirdApi.getOffCourseId(dto.getUserId(),token); + String offCourseIds = String.join(",", offCourseId); +// String offCourseIds="123.311"; + //根据userId查询报名的课程 + ListcourseId=IStudyCourseService.getCourseId(dto.getUserId()); + String courseIds = String.join(",", courseId); //只是查询已发布的 dto.setPublish(true); if(this.fullTextSearch==null) { log.error("未实现全文检索的接口 ICourseFullTextSearch"); return badRequest("当前查询不可用,未实现检索接口"); } - + CourseFullText paras=new CourseFullText(); //paras.setAudience("");//权限查询,先不处理 paras.setDuration(minDuration); @@ -241,7 +251,13 @@ public class CourseFullTextApi extends ApiBaseController{ if(StringUtils.isNotBlank(userIds)) { paras.setSysCreateAids(userIds.split(",")); } - + if(StringUtils.isNotBlank(offCourseIds)) { + paras.setOffCourseId(offCourseIds.split(",")); + } + if(StringUtils.isNotBlank(courseIds)) { + paras.setCourseId(courseIds.split(",")); + } + paras.setOpenCourse(dto.getOpenCourse()); if(StringUtils.isNotBlank(dto.getOrderField())) { if(dto.getOrderField().equals("studys")) { @@ -252,9 +268,9 @@ public class CourseFullTextApi extends ApiBaseController{ paras.setOrderType(3);//好评 } } - + paras.setDevice(dto.getDevice()); - + try { //后续会根据当前用户的资源归属查询 PageList coursePageList = fullTextSearch.search(ICourseFullTextSearch.DEFAULT_INDEX_NAME,pager.getStartRow(), pager.getPageSize(),paras); @@ -301,12 +317,12 @@ public class CourseFullTextApi extends ApiBaseController{ } } - + return success(coursePageList); }catch(Exception e) { log.error("课程全文检索错误",e); return error("查询失败",e.getMessage()); } - + } } diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/dto/CourseQueryDto.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/dto/CourseQueryDto.java index a8befd3d..8599c13c 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/dto/CourseQueryDto.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/dto/CourseQueryDto.java @@ -7,72 +7,67 @@ import lombok.Data; */ @Data public class CourseQueryDto { - - /** - * 分隔符 - */ - public static final String SEPARATE="-"; - - /**资源归属一级*/ + + /** + * 分隔符 + */ + public static final String SEPARATE="-"; + + /**资源归属一级*/ private String resOwner1; - + /**资源归属二级*/ private String resOwner2; - + /**资源归属三级*/ private String resOwner3; - + /**授课方式,多个使用 - 分隔*/ private String types; - + /**应用场景,多个使用 - 分隔*/ private String scenes; - + /**是否发布,无就是全部*/ private Boolean publish; - - /** - * 是否启用 - */ - private Boolean enabled; - + /**创建人*/ private String createUser; - + /**创建人*/ private String aid; - + /**查询关键词*/ private String keyword; - + /**显示设备1表pc。2表移动端*/ private Integer device; - - + + /**系统的一级*/ private String sysType1; - + /**系统的二级*/ private String sysType2; - + /**系统的三级*/ private String sysType3; - - + + /**排序字段 */ private String orderField; - + /**排序顺序*/ private Boolean orderAsc; - + /**companyId 主要是老系统的权限*/ private String companyId; - + /** * 置顶 */ private Boolean topOrder; - + /** 状态,多个使用 - 分隔*/ private String status; @@ -83,10 +78,10 @@ public class CourseQueryDto { /**课程名称*/ private String name; - + /**课程类型*/ private Integer type; - + /** * 是否过滤2022年之前的数据 */ @@ -96,7 +91,7 @@ public class CourseQueryDto { * 学习时长 * */ private Integer studyTime; - + /** * 是否公开课,0表非公开课,1表公开课 */ @@ -106,17 +101,17 @@ public class CourseQueryDto { * 表资源归属的in查询,多个使用逗号分隔 * */ private String orgIds; - + /**用户权限的查询*/ private String orgAid; - + /** * 是否是超级管理员 */ private Boolean isSystemAdmin; - + private Boolean visible; - + private String refId; private String refType; @@ -124,4 +119,9 @@ public class CourseQueryDto { * 创建人id */ private String sysCreateAids; + + /** + * 登录人id + */ + private String userId; } diff --git a/servers/boe-server-all/src/main/java/com/xboe/school/study/service/IStudyCourseService.java b/servers/boe-server-all/src/main/java/com/xboe/school/study/service/IStudyCourseService.java index 69775d0a..9feb60ad 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/school/study/service/IStudyCourseService.java +++ b/servers/boe-server-all/src/main/java/com/xboe/school/study/service/IStudyCourseService.java @@ -13,7 +13,7 @@ import com.xboe.school.study.entity.StudyCourseItem; import com.xboe.school.study.entity.StudySignup; public interface IStudyCourseService { - + /** * 课程自动报名,返回学习的课程 * @param signup @@ -28,7 +28,7 @@ public interface IStudyCourseService { * @return */ StudyCourse has(String courseId,String aid); - + /** * 根据课程id和账户id查询学习的课程信息 * @param courseId @@ -36,7 +36,7 @@ public interface IStudyCourseService { * @return */ StudyCourse findByCourseIdAndAid(String courseId,String aid); - + /** * 为ES初始化的处理 * @param pageIndex @@ -44,7 +44,7 @@ public interface IStudyCourseService { * @return */ PageList findByES(int pageIndex,int pageSize) throws Exception; - + /** * 分页查询课程学习记录,用户的课程学习记录 * @param pageIndex @@ -79,7 +79,7 @@ public interface IStudyCourseService { * 二次查询 个人/他人 * */ List ids(StudyCourseQuery studyCourseQuery); - + /** * 配合ES中二次查询显示一些信息 * @param ids @@ -101,7 +101,8 @@ public interface IStudyCourseService { * 查询课程最新学习记录的进度 * */ List progress(String aid,List courseIds); - + List findByCourseAndUsers(String courseId,List aids) throws Exception; -} + List getCourseId(String userId); +} \ No newline at end of file diff --git a/servers/boe-server-all/src/main/java/com/xboe/school/study/service/impl/StudyCourseServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/school/study/service/impl/StudyCourseServiceImpl.java index fa3c03bc..723b6d26 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/school/study/service/impl/StudyCourseServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/school/study/service/impl/StudyCourseServiceImpl.java @@ -1,4 +1,3 @@ - package com.xboe.school.study.service.impl; import java.time.LocalDate; @@ -6,6 +5,7 @@ import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; import javax.transaction.Transactional; @@ -48,19 +48,19 @@ import lombok.extern.slf4j.Slf4j; @Service @Transactional public class StudyCourseServiceImpl implements IStudyCourseService{ - + @Autowired StudySignupDao signupDao; - + @Autowired IStudySignupService signupService; - + @Autowired StudyCourseDao studyCourseDao; - + @Autowired CourseContentDao courseContentDao; - + @Autowired StudyCourseItemDao scItemDao; @@ -225,7 +225,7 @@ public class StudyCourseServiceImpl implements IStudyCourseService{ query.addFilter(FieldFilters.eqField("sc.courseId","c.id")); query.addFilter(FieldFilters.eq("c.enabled",true)); query.addFilter(FieldFilters.eq("c.deleted",false)); - + query.addField("sc"); if(oc==null) { @@ -293,11 +293,11 @@ public class StudyCourseServiceImpl implements IStudyCourseService{ @Override public List ids(StudyCourseQuery studyCourseQuery) { - + //分两次查询,查询课程,查询学习记录 String courseHql="Select id,coverImg,score from "+Course.class.getSimpleName()+" where id in(?1)"; String studyHql="Select courseId,addTime,progress,aid from "+StudyCourse.class.getSimpleName()+" where aid=?1 and courseId in(?2)"; - + List rs=new ArrayList<>(); try { List clist= studyCourseDao.findListFields(courseHql,studyCourseQuery.getIds()); @@ -308,7 +308,7 @@ public class StudyCourseServiceImpl implements IStudyCourseService{ sc.setCourseId(ConvertUtil.toStr(sobjs[0])); sc.setAddTime((LocalDateTime)sobjs[1]); sc.setProgress(ConvertUtil.toFloat(sobjs[2])); - sc.setAid(ConvertUtil.toStr(sobjs[3])); + sc.setAid(ConvertUtil.toStr(sobjs[3])); for(Object[] cobjs : clist) { String cid=ConvertUtil.toStr(cobjs[0]); if(cid!=null && cid.equals(sc.getCourseId())) { @@ -326,9 +326,9 @@ public class StudyCourseServiceImpl implements IStudyCourseService{ log.error("查询错误",e); e.printStackTrace(); } - + return rs; - + //// List studyCouseDtos = new ArrayList<>(); //// QueryBuilder builder = QueryBuilder.from(StudyCourse.class.getSimpleName()+" sc,"+ Course.class.getSimpleName()+" c"); //// builder.addFilter(FieldFilters.eqField("sc.courseId","c.id")); @@ -434,7 +434,7 @@ public class StudyCourseServiceImpl implements IStudyCourseService{ //分两次查询,查询课程,查询学习记录 String courseHql="Select id,coverImg,score,name,sysType1,sysType2,sysType3,deleted,enabled from "+Course.class.getSimpleName()+" where id in(?1)"; String studyHql="Select courseId,addTime,progress,aid from "+StudyCourse.class.getSimpleName()+" where aid in(?1) and courseId in(?2)"; - + List rs=new ArrayList<>(); try { List clist= studyCourseDao.findListFields(courseHql,studyCourseQuery.getIds()); @@ -447,7 +447,7 @@ public class StudyCourseServiceImpl implements IStudyCourseService{ sc.setAddTime((LocalDateTime)sobjs[1]); sc.setProgress(ConvertUtil.toFloat(sobjs[2])); sc.setAid(ConvertUtil.toStr(sobjs[3])); - + for(Object[] cobjs : clist) { String cid=ConvertUtil.toStr(cobjs[0]); if(cid!=null && cid.equals(sc.getCourseId())) { @@ -492,16 +492,16 @@ public class StudyCourseServiceImpl implements IStudyCourseService{ sc.setEnabled(ConvertUtil.toBool(cobjs[8])); rs.add(sc); } - + } - + }catch(Exception e) { log.error("查询错误",e); e.printStackTrace(); } - + return rs; - + //当前先这样查询,以后要修改,只查询需要的字段,另外 ,需要按课程分组,不然一门课程会查出很多记录出来 // QueryBuilder builder = QueryBuilder.from(StudyCourse.class.getSimpleName()+" sc,"+ Course.class.getSimpleName()+" c"); // builder.addFilter(FieldFilters.eqField("sc.courseId","c.id")); @@ -641,7 +641,7 @@ public class StudyCourseServiceImpl implements IStudyCourseService{ @Override public StudyCourse autoSignup(StudySignup signup) { - + signup.setSignType(StudySignup.SIGNTYPE_SELF); StudyCourse sc=signupService.addSignup(signup); //更新课程学习人数 @@ -675,7 +675,7 @@ public class StudyCourseServiceImpl implements IStudyCourseService{ @Override public List findByCourseAndUsers(String courseId, List aids) throws Exception { - + QueryBuilder query=QueryBuilder.from(StudyCourse.class.getSimpleName()+" sc,"+ Course.class.getSimpleName()+" c"); query.addFields("sc.id","sc.aid","sc.aname","sc.progress","sc.status","sc.addTime"); query.addFields("c.id","c.name","c.sysType1","c.sysType2","c.sysType3","sc.finishTime"); @@ -693,7 +693,7 @@ public class StudyCourseServiceImpl implements IStudyCourseService{ item.setStudentName((String)objs[2]); item.setProgress((Float)objs[3]); item.setStatus((Integer)objs[4]); - + item.setStartTime((LocalDateTime)objs[5]); item.setCourseId((String)objs[6]); item.setCourseName((String)objs[7]); @@ -703,13 +703,18 @@ public class StudyCourseServiceImpl implements IStudyCourseService{ item.setFinishTime((LocalDateTime)objs[11]); rslist.add(item); } - + return rslist; } + @Override + public List getCourseId(String userId) { + return studyCourseDao.findList(FieldFilters.eq("aid", userId)).stream().map(StudyCourse::getCourseId).collect(Collectors.toList()); + } + @Override public List findByIds(List ids) { return studyCourseDao.findList(FieldFilters.in("id", ids)); } -} +} \ No newline at end of file