@@ -3,17 +3,26 @@ package com.xboe.module.course.service.impl;
import java.time.LocalDate ;
import java.time.LocalDateTime ;
import java.time.format.DateTimeFormatter ;
import java.util.ArrayList ;
import java.util.Arrays ;
import java.util.Lis t ;
import java.util.Map ;
import java.util.* ;
import java.util.concurrent.ConcurrentHashMap ;
import java.util.concurrent.TimeUni t ;
import java.util.function.Function ;
import java.util.function.Predicate ;
import java.util.stream.Collectors ;
import java.util.stream.Stream ;
import javax.annotation.Resource ;
import javax.management.Query ;
import com.xboe.api.ThirdApi ;
import com.xboe.core.orm.* ;
import com.xboe.data.dto.UserData ;
import com.xboe.school.study.dao.StudyCourseDao ;
import com.xboe.school.study.entity.StudyCourse ;
import org.apache.commons.lang3.StringUtils ;
import org.hibernate.mapping.IdGenerator ;
import org.springframework.beans.factory.annotation.Autowired ;
import org.springframework.data.redis.core.StringRedisTemplate ;
import org.springframework.stereotype.Service ;
import org.springframework.transaction.annotation.Propagation ;
import org.springframework.transaction.annotation.Transactional ;
@@ -26,11 +35,6 @@ import com.xboe.common.beans.KeyValue;
import com.xboe.common.utils.IDGenerator ;
import com.xboe.common.utils.StringUtil ;
import com.xboe.core.event.IEventDataSender ;
import com.xboe.core.orm.FieldFilters ;
import com.xboe.core.orm.IFieldFilter ;
import com.xboe.core.orm.LikeMatchMode ;
import com.xboe.core.orm.QueryBuilder ;
import com.xboe.core.orm.UpdateBuilder ;
import com.xboe.module.course.dao.CourseContentDao ;
import com.xboe.module.course.dao.CourseCrowdDao ;
import com.xboe.module.course.dao.CourseDao ;
@@ -112,8 +116,11 @@ public class CourseServiceImpl implements ICourseService {
@Autowired ( required = false )
private IEventDataSender eventSender ;
/**
* 生成过滤条件
*
* @param dto
* @return
*/
@@ -254,36 +261,133 @@ public class CourseServiceImpl implements ICourseService {
return courseDao . findList ( query . builder ( ) ) ;
}
// public PageList<Course> findPage(int pageIndex, int pageSize, CourseQueryDto dto) {
// List<IFieldFilter> filters = createFilters(dto);
// List<IFieldFilter> filters1 = createFilters(dto);
// List<IFieldFilter> filters2 = createFilters(dto);
//// String s = redisTemplate.opsForValue().get("course_search");
//// Set<String>list=new HashSet<>();
//// if(s!=null&&!s.isEmpty()){
//// list=Arrays.stream(s.split(",")).collect(Collectors.toSet());
//// }else {
//// Set<String> ss = getSeache(dto);
//// String courseSearch=String.join(",",ss);
//// redisTemplate.opsForValue().set("course_search",courseSearch);
//// //设置过期时间为1分钟
//// redisTemplate.expire("course_search", 1, TimeUnit.MINUTES);
//// }
// Set<String> list = getSeache(dto);
// //有权限的查询,也同时查询出创建人的数据,在权限上
// if(TempFilterConfig.Manager_CourseFile_ByOrgIds) {
// if(dto.getIsSystemAdmin()==null || !dto.getIsSystemAdmin()) {
// if(StringUtil.isNotBlank(dto.getOrgIds())){
// //log.info("【"+dto.getOrgAid()+"】 按机构过滤和自己创建的课程");
// //log.info(" orgids "+dto.getOrgIds());
// if(dto.getOrgIds().contains(",")){
// String[] split = dto.getOrgIds().split(",");
// List<String> strings = Arrays.asList(split);
//// filters.add(FieldFilters.or(FieldFilters.in("orgId",strings),FieldFilters.eq("sysCreateAid",dto.getOrgAid())));
// filters.add(FieldFilters.in("orgId",strings));
// filters1.add(FieldFilters.eq("sysCreateAid",dto.getOrgAid()));
// if(!list.isEmpty()){
// filters2.add(FieldFilters.in("id",list));
// }
// }else {
//// filters.add(FieldFilters.or(FieldFilters.eq("orgId",dto.getOrgIds()),FieldFilters.eq("sysCreateAid",dto.getOrgAid())));
// filters.add(FieldFilters.eq("orgId",dto.getOrgIds()));
// filters1.add(FieldFilters.eq("sysCreateAid",dto.getOrgAid()));
// if(!list.isEmpty()){
// filters2.add(FieldFilters.in("id",list));
// }
// }
// }
// if (!StringUtil.isNotBlank(dto.getOrgIds())){
// //log.info("【"+dto.getOrgAid()+"】 机构ids没有, 只查询自己创建的课程");
// //没有机构权限,只能查出自己创建的
//// filters.add(FieldFilters.eq("sysCreateAid",dto.getOrgAid()));
// filters1.add(FieldFilters.eq("sysCreateAid",dto.getOrgAid()));
// if(!list.isEmpty()){
// filters2.add(FieldFilters.in("id",list));
// }
// }
// }else {
// //log.info("【"+dto.getOrgAid()+"】IsSystemAdmin is true 不过机构过滤,查询全部");
// }
// }
//
// //自动添加过滤已删除
// filters.add(FieldFilters.eq("deleted",false));
// filters1.add(FieldFilters.eq("deleted",false));
// filters2.add(FieldFilters.eq("deleted",false));
// //同时查出所有项目内课程
// OrderCondition oc=null;
// if(StringUtils.isNotBlank(dto.getOrderField())) {
// if(dto.getOrderAsc()||dto.getOrderAsc()==null) {
// oc=OrderCondition.asc(dto.getOrderField());
// }else {
// oc=OrderCondition.desc(dto.getOrderField());
// }
// }else {
// oc=OrderCondition.desc("id");
// }
// List<Course> listByFilters = new ArrayList<>();
// //根据组织筛选
// if(StringUtil.isNotBlank(dto.getOrgIds())){
// listByFilters = courseDao.findListByFilters(oc, filters);
// }
// //根据创建人筛选
// List<Course> listByFilters1;
// if(!list.isEmpty()){
// listByFilters1 = courseDao.findListByFilters(oc, filters1);
// } else {
// listByFilters1 = new ArrayList<>();
// }
// //根据list筛选
//// List<Course> listByFilters2 = courseDao.findListByFilters(oc, filters2);
// //去除根据组织和创建人筛选的课程id
// List<Course> finalListByFilters = listByFilters;
//// List<Course> collect = list.stream()
//// .filter(element -> !finalListByFilters.contains(element))
//// .filter(element -> !listByFilters1.contains(element)).collect(Collectors.toList());
//// List<String> courseIds = collect.stream().map(Course::getId).collect(Collectors.toList());
// //合并
// List<Course> mergedList = Stream.concat(listByFilters.stream(), listByFilters1.stream())
// // 使用distinct()配合自定义的去重条件
// .filter(distinctByKey(c -> c.getId()))
// .collect(Collectors.toList());
//// PageList<Course> rs=courseDao.findPage(pageIndex, pageSize, filters, oc);
//// long endTime = System.nanoTime();
// //log.info("查询出的条数:"+rs.getCount());
// if(!mergedList.isEmpty()){
// //去掉未发布的课程
// mergedList.removeIf(e->{
// if(!e.getPublished()&&courseIds.contains(e.getId())){
// return true;
// }
// return false;
// });
// //
// //将需要隐藏的做标记
// mergedList.forEach(e->{
// if(courseIds.contains(e.getId())){
// e.setIsPermission(false);
// }else {
// e.setIsPermission(true);
// }
// });
// }
// List<Course> paginate = paginate(mergedList, pageIndex, pageSize);
// PageList<Course> rs=new PageList<>();
// rs.setCount(mergedList.size());
// rs.setList(paginate);
// return rs;
// }
@Override
public PageList < Course > findPage ( int pageIndex , int pageSize , CourseQueryDto dto ) {
List < IFieldFilter > filters = createFilters ( dto ) ;
//有权限的查询,也同时查询出创建人的数据,在权限上
if ( TempFilterConfig . Manager_CourseFile_ByOrgIds ) {
if ( dto . getIsSystemAdmin ( ) = = null | | ! dto . getIsSystemAdmin ( ) ) {
if ( StringUtil . isNotBlank ( dto . getOrgIds ( ) ) ) {
//log.info("【"+dto.getOrgAid()+"】 按机构过滤和自己创建的课程");
//log.info(" orgids "+dto.getOrgIds());
if ( dto . getOrgIds ( ) . contains ( " , " ) ) {
String [ ] split = dto . getOrgIds ( ) . split ( " , " ) ;
List < String > strings = Arrays . asList ( split ) ;
filters . add ( FieldFilters . or ( FieldFilters . in ( " orgId " , strings ) , FieldFilters . eq ( " sysCreateAid " , dto . getOrgAid ( ) ) ) ) ;
} else {
filters . add ( FieldFilters . or ( FieldFilters . eq ( " orgId " , dto . getOrgIds ( ) ) , FieldFilters . eq ( " sysCreateAid " , dto . getOrgAid ( ) ) ) ) ;
}
} else {
//log.info("【"+dto.getOrgAid()+"】 机构ids没有, 只查询自己创建的课程");
//没有机构权限,只能查出自己创建的
filters . add ( FieldFilters . eq ( " sysCreateAid " , dto . getOrgAid ( ) ) ) ;
}
} else {
//log.info("【"+dto.getOrgAid()+"】IsSystemAdmin is true 不过机构过滤,查询全部");
}
}
//自动添加过滤已删除
filters . add ( FieldFilters . eq ( " deleted " , false ) ) ;
List < IFieldFilter > filters2 = createFilters ( dto ) ;
filters2 . add ( FieldFilters . eq ( " deleted " , false ) ) ;
//同时查出所有项目内课程
OrderCondition oc = null ;
if ( StringUtils . isNotBlank ( dto . getOrderField ( ) ) ) {
if ( dto . getOrderAsc ( ) | | dto . getOrderAsc ( ) = = null ) {
@@ -294,11 +398,225 @@ public class CourseServiceImpl implements ICourseService {
} else {
oc = OrderCondition . desc ( " id " ) ;
}
Page List< Course > rs = courseDao . findPage ( pageIndex , pageSize , filters , oc ) ;
//log.info("查询出的条数:"+rs.getCount());
//组织id
List< String > strings = new ArrayList < > ( ) ;
if ( StringUtil . isNotBlank ( dto . getOrgIds ( ) ) ) {
if ( dto . getOrgIds ( ) . contains ( " , " ) ) {
String [ ] split = dto . getOrgIds ( ) . split ( " , " ) ;
strings = Arrays . asList ( split ) ;
} else {
strings . add ( dto . getOrgIds ( ) ) ;
}
}
Set < String > seache = getSeache ( dto ) ;
//查出全部的课程
List < Course > listByFilters2 = courseDao . findListByFilters ( oc , filters2 ) ;
if ( TempFilterConfig . Manager_CourseFile_ByOrgIds ) {
if ( dto . getIsSystemAdmin ( ) = = null | | ! dto . getIsSystemAdmin ( ) ) {
List < String > finalStrings = strings ;
log . info ( " dto为 " + dto ) ;
if ( dto . getIsCreateCourse ( ) ! = null & & dto . getIsCreateCourse ( ) ) {
listByFilters2 . removeIf ( e - > {
//去掉未发布的课程
if ( ! e . getPublished ( ) & & seache . contains ( e . getId ( ) ) & & ! finalStrings . contains ( e . getOrgId ( ) ) & & ! dto . getOrgAid ( ) . equals ( e . getSysCreateAid ( ) ) ) {
return true ;
}
//去掉所有条件都不符合的课程
if ( ! seache . contains ( e . getId ( ) ) & & ! dto . getReadIds ( ) . contains ( e . getId ( ) ) & & ! finalStrings . contains ( e . getOrgId ( ) ) & & ! dto . getOrgAid ( ) . equals ( e . getSysCreateAid ( ) ) ) {
return true ;
}
return false ;
} ) ;
//将需要隐藏的做标记
listByFilters2 . forEach ( e - > {
if ( ( seache . contains ( e . getId ( ) ) | | dto . getReadIds ( ) . contains ( e . getOrgId ( ) ) ) & & ! finalStrings . contains ( e . getOrgId ( ) ) & & ! dto . getOrgAid ( ) . equals ( e . getSysCreateAid ( ) ) ) {
e . setIsPermission ( false ) ;
} else {
e . setIsPermission ( true ) ;
}
} ) ;
listByFilters2 . sort ( Comparator . comparing ( Course : : getIsPermission ) . reversed ( ) ) ;
} else {
List < Course > collect = listByFilters2 . stream ( ) . filter ( e - > dto . getReadIds ( ) . contains ( e . getOrgId ( ) ) | | dto . getOrgAid ( ) . equals ( e . getSysCreateAid ( ) ) | | finalStrings . contains ( e . getOrgId ( ) ) ) . collect ( Collectors . toList ( ) ) ;
List < Course > paginate = paginate ( collect , pageIndex , pageSize ) ;
PageList < Course > rs = new PageList < > ( ) ;
rs . setCount ( collect . size ( ) ) ;
rs . setList ( paginate ) ;
return rs ;
}
}
}
List < Course > paginate = paginate ( listByFilters2 , pageIndex , pageSize ) ;
PageList < Course > rs = new PageList < > ( ) ;
rs . setCount ( listByFilters2 . size ( ) ) ;
rs . setList ( paginate ) ;
return rs ;
}
private Set < String > getSeache ( CourseQueryDto dto ) {
//需要设置为隐藏的课程id
Set < String > list = new HashSet < > ( ) ;
List < String > list1 = getProject ( dto ) ;
List < String > list2 = getRouter ( dto ) ;
// //有受众权限的课程
if ( dto . getAudiences ( ) ! = null & & ! dto . getAudiences ( ) . isEmpty ( ) ) {
List < String > audiences = getAudiences ( dto ) ;
list . addAll ( audiences ) ;
}
// //没有受众的课程
List < String > noAudiences = getNoAudiences ( dto ) ;
list . addAll ( noAudiences ) ;
// //成长路径的课
// List<String> grow = getGrow(dto);
// //已报名的课
List < String > enroll = getEnroll ( dto ) ;
// list.addAll(grow);
list . addAll ( enroll ) ;
list . addAll ( list1 ) ;
list . addAll ( list2 ) ;
return list ;
}
private List < String > getRouter ( CourseQueryDto dto ) {
String sql = " SELECT DISTINCT \ n " +
" rt.course_id \ n " +
" FROM \ n " +
" boe_new.student s INNER JOIN boe_new.router_task rt on s.pid=rt.router_id inner join boe_course c on c.id=rt.course_id \ n " +
" \ n " +
" WHERE \ n " +
" \ n " +
" s.deleted = 0 \ n " +
" and rt.deleted=0 \ n " +
" and rt.type=1 \ n " +
" and c.deleted=0 \ n " +
" AND s.type =2 \ n " +
" AND s.student_id = ?1 " ;
List < String > list = courseTeacherDao . sqlFindList ( sql , dto . getOrgAid ( ) ) ;
List < String > list1 = new ArrayList < > ( ) ;
for ( Object obj : list ) {
list1 . add ( obj . toString ( ) ) ;
}
return list1 ;
}
private List < String > getProject ( CourseQueryDto dto ) {
String sql = " SELECT DISTINCT \ n " +
" pt.course_id \ n " +
" FROM \ n " +
" boe_new.student s INNER JOIN boe_new.project_task pt on s.pid=pt.project_id inner join boe_course c on c.id=pt.course_id \ n " +
" \ n " +
" WHERE \ n " +
" \ n " +
" s.deleted = 0 \ n " +
" and pt.deleted=0 \ n " +
" and pt.type=1 \ n " +
" and c.deleted=0 \ n " +
" AND s.type =1 \ n " +
" AND s.student_id = ?1 \ n " ;
List < Long > list = courseTeacherDao . sqlFindList ( sql , dto . getOrgAid ( ) ) ;
List < String > list1 = new ArrayList < > ( ) ;
for ( Object obj : list ) {
list1 . add ( obj . toString ( ) ) ;
}
return list1 ;
}
private List < String > getAudiences ( CourseQueryDto dto ) {
List < String > s = Arrays . asList ( dto . getAudiences ( ) . split ( " , " ) ) ;
String sql = " SELECT DISTINCT \ n " +
" \ tcc.course_id \ n " +
" FROM \ n " +
" \ t`boe_course_crowd` cc \ n " +
" \ tINNER JOIN boe_course c ON cc.course_id = c.id \ n " +
" WHERE \ n " +
" \ tcc.group_id IN (?1) \ n " +
" \ tAND c.deleted =0 " ;
List < Long > list = courseTeacherDao . sqlFindList ( sql , s ) ;
List < String > list1 = new ArrayList < > ( ) ;
for ( Object obj : list ) {
list1 . add ( obj . toString ( ) ) ;
}
return list1 ;
}
private List < String > getNoAudiences ( CourseQueryDto dto ) {
String sql = " SELECT \ n " +
" \ tc.id \ n " +
" FROM \ n " +
" \ tboe_course c \ n " +
" WHERE \ n " +
" \ t NOT EXISTS ( SELECT 1 FROM boe_course_crowd cc where cc.course_id = c.id ) \ n " +
" \ tAND c.deleted =0 \ n " ;
List < Course > list = courseDao . sqlFindList ( sql ) ;
List < String > list1 = new ArrayList < > ( ) ;
for ( Object obj : list ) {
list1 . add ( obj . toString ( ) ) ;
}
return list1 ;
}
private List < String > getGrow ( CourseQueryDto dto ) {
String sql = " SELECT DISTINCT \ n " +
" \ tc.id \ n " +
" FROM \ n " +
" \ tboe_new.student s \ n " +
" \ tINNER JOIN boe_new.grow_task gt ON s.pid = gt.grow_id \ n " +
" \ tINNER JOIN boe_course c ON gt.course_id = c.id \ n " +
" WHERE \ n " +
" \ ts.type = 14 \ n " +
" \ tAND gt.type = 1 \ n " +
" \ tAND s.deleted = 0 \ n " +
" \ tAND gt.deleted = 0 \ n " +
" \ tAND c.deleted = 0 \ n " +
" \ tAND s.student_id = ?1 \ n " ;
List < Long > list = courseTeacherDao . sqlFindList ( sql , dto . getOrgAid ( ) ) ;
List < String > list1 = new ArrayList < > ( ) ;
for ( Object obj : list ) {
list1 . add ( obj . toString ( ) ) ;
}
return list1 ;
}
private List < String > getEnroll ( CourseQueryDto dto ) {
String sql = " SELECT DISTINCT \ n " +
" \ tsc.course_id \ n " +
" FROM \ n " +
" \ tboe_study_course sc \ n " +
" \ tINNER JOIN boe_course c ON sc.course_id = c.id \ n " +
" WHERE \ n " +
" \ tsc.aid = ?1 \ n " +
" \ tAND c.deleted =0 " ;
List < Long > list = courseTeacherDao . sqlFindList ( sql , dto . getOrgAid ( ) ) ;
List < String > list1 = new ArrayList < > ( ) ;
for ( Object obj : list ) {
list1 . add ( obj . toString ( ) ) ;
}
return list1 ;
}
public static < T > List < T > paginate ( List < T > list , int pageNumber , int pageSize ) {
if ( list = = null | | list . isEmpty ( ) | | pageNumber < = 0 | | pageSize < = 0 ) {
return null ;
}
int fromIndex = ( pageNumber - 1 ) * pageSize ;
int toIndex = Math . min ( fromIndex + pageSize , list . size ( ) ) ;
if ( fromIndex > = list . size ( ) ) {
// 请求的页码超过了最大页数,返回空列表
return null ;
}
return list . subList ( fromIndex , toIndex ) ;
}
private static < T > Predicate < T > distinctByKey ( Function < ? super T , ? > keyExtractor ) {
Set < Object > seen = ConcurrentHashMap . newKeySet ( ) ;
return t - > seen . add ( keyExtractor . apply ( t ) ) ;
}
@Override
public List < Course > findList ( CourseQueryDto dto ) {
@@ -543,6 +861,7 @@ public class CourseServiceImpl implements ICourseService {
//记录删除日志信息
}
@Override
public Course get ( String id ) {
Course c = courseDao . get ( id ) ;
@@ -599,6 +918,7 @@ public class CourseServiceImpl implements ICourseService {
/**
* 追加修改日志,共用方法,在其它的修改的地方也可能调用
*
* @param old
* @param now
*/
@@ -882,7 +1202,6 @@ public class CourseServiceImpl implements ICourseService {
// log.error("课程发布全文检索失败",e);
// }
// }
@Override
public void audit ( String auditId , String courseId , Boolean pass , String aid , String name , String remark , boolean publish , Integer from ) {
@@ -1028,9 +1347,10 @@ public class CourseServiceImpl implements ICourseService {
}
}
/**
* 赋值赞踩数
* */
*/
@Override
public void updateTrampleCount ( String id , Integer trampleCount ) {
courseDao . updateMultiFieldById ( id , UpdateBuilder . create ( " trampleCount " , trampleCount ) ) ;
@@ -1039,7 +1359,7 @@ public class CourseServiceImpl implements ICourseService {
/**
* 赋值点赞数
* */
*/
@Override
public List < CourseTeacher > findTeachersByCourseId ( String courseId ) {
@@ -1096,7 +1416,6 @@ public class CourseServiceImpl implements ICourseService {
}
@Override
public List < RankingDto > scoreList ( int num , int index ) {
QueryBuilder builder = QueryBuilder . from ( Course . class ) ;
@@ -1250,7 +1569,6 @@ public class CourseServiceImpl implements ICourseService {
}
@Override
public int countWaitAudit ( String aid ) {
//查询待审核的课程
@@ -1490,7 +1808,7 @@ public class CourseServiceImpl implements ICourseService {
/**
* 返回当前课程名字
* */
*/
private String courseName ( String id ) {
Course course = courseDao . get ( id ) ;
return course . getName ( ) ;
@@ -1637,8 +1955,7 @@ public class CourseServiceImpl implements ICourseService {
" teacher_name from boe_course_teacher where course_id=?1 " ;
courseTeacherDao . sqlUpdate ( sqlTeacher , id ) ;
}
else {
} else {
mess = " 长度超出范围 " ;
}
return mess ;
@@ -1663,6 +1980,4 @@ public class CourseServiceImpl implements ICourseService {
}
}