新在线课逻辑优化2

This commit is contained in:
xiaozhequ
2024-07-03 16:30:19 +08:00
parent f2be349301
commit 7eb578127d
2 changed files with 1720 additions and 1646 deletions

View File

@@ -125,11 +125,11 @@ public class CourseManageApi extends ApiBaseController{
List<String> orgIds = userOrgIds.getIds(); List<String> orgIds = userOrgIds.getIds();
// if(userOrgIds.getPermissions().containsKey(UserOrgIds.IsSystemAdminKey)){ if(userOrgIds.getPermissions().containsKey(UserOrgIds.IsSystemAdminKey)){
// dto.setIsSystemAdmin(userOrgIds.getPermissions().get(UserOrgIds.IsSystemAdminKey)); dto.setIsSystemAdmin(userOrgIds.getPermissions().get(UserOrgIds.IsSystemAdminKey));
// }else { }else {
// dto.setIsSystemAdmin(false); dto.setIsSystemAdmin(false);
// } }
String ids=""; String ids="";
if(userOrgIds.getIds()!=null && !userOrgIds.getIds().isEmpty()) if(userOrgIds.getIds()!=null && !userOrgIds.getIds().isEmpty())
{ {
@@ -137,11 +137,7 @@ public class CourseManageApi extends ApiBaseController{
} }
//log.info("获取到的用户的组织机构权限ids",ids); //log.info("获取到的用户的组织机构权限ids",ids);
String aid=getCurrent().getAccountId(); String aid=getCurrent().getAccountId();
if(Objects.equals(aid, "965342027497607168")||Objects.equals(aid, "1739115608332701697")){ // String aid="1706272694871445506";
dto.setIsSystemAdmin(true);
}else {
dto.setIsSystemAdmin(false);
}
//如果前端查询当前人的,这里去掉 //如果前端查询当前人的,这里去掉
if(StringUtils.isNotBlank(dto.getAid())) { if(StringUtils.isNotBlank(dto.getAid())) {
dto.setAid(null); dto.setAid(null);

View File

@@ -5,6 +5,7 @@ import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.*; import java.util.*;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
import java.util.function.Function; import java.util.function.Function;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -21,6 +22,7 @@ import com.xboe.school.study.entity.StudyCourse;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.hibernate.mapping.IdGenerator; import org.hibernate.mapping.IdGenerator;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@@ -118,6 +120,7 @@ public class CourseServiceImpl implements ICourseService {
/** /**
* 生成过滤条件 * 生成过滤条件
*
* @param dto * @param dto
* @return * @return
*/ */
@@ -258,73 +261,131 @@ public class CourseServiceImpl implements ICourseService {
return courseDao.findList(query.builder()); 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 @Override
public PageList<Course> findPage(int pageIndex, int pageSize, CourseQueryDto dto) { 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); List<IFieldFilter> filters2 = createFilters(dto);
List<String> list1 = getProject(dto);
List<String> list2 = getRouter(dto);
//需要设置为隐藏的课程id
Set<String> list = new HashSet<>();
//有受众权限的课程
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);
//有权限的查询,也同时查询出创建人的数据,在权限上
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)); filters2.add(FieldFilters.eq("deleted", false));
//同时查出所有项目内课程 //同时查出所有项目内课程
OrderCondition oc = null; OrderCondition oc = null;
@@ -337,58 +398,70 @@ public class CourseServiceImpl implements ICourseService {
} else { } else {
oc = OrderCondition.desc("id"); oc = OrderCondition.desc("id");
} }
List<Course> listByFilters = new ArrayList<>(); //组织id
//根据组织筛选 List<String> strings = new ArrayList<>();
if (StringUtil.isNotBlank(dto.getOrgIds())) { if (StringUtil.isNotBlank(dto.getOrgIds())) {
listByFilters = courseDao.findListByFilters(oc, filters); if (dto.getOrgIds().contains(",")) {
} String[] split = dto.getOrgIds().split(",");
//根据创建人筛选 strings = Arrays.asList(split);
List<Course> listByFilters1;
if(!list.isEmpty()){
listByFilters1 = courseDao.findListByFilters(oc, filters1);
} else { } else {
listByFilters1 = new ArrayList<>(); strings.add(dto.getOrgIds());
} }
//根据list筛选 }
Set<String> seache = getSeache(dto);
//查出全部的课程
List<Course> listByFilters2 = courseDao.findListByFilters(oc, filters2); List<Course> listByFilters2 = courseDao.findListByFilters(oc, filters2);
//去除根据组织和创建人筛选的课程id if (TempFilterConfig.Manager_CourseFile_ByOrgIds) {
List<Course> finalListByFilters = listByFilters; if (dto.getIsSystemAdmin() == null || !dto.getIsSystemAdmin()) {
List<Course> collect = listByFilters2.stream() List<String> finalStrings = strings;
.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(Stream.concat(listByFilters.stream(), listByFilters1.stream()),collect.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->{ listByFilters2.removeIf(e -> {
if(!e.getPublished()&&courseIds.contains(e.getId())){ if (!e.getPublished() && seache.contains(e.getId()) && !finalStrings.contains(e.getOrgId()) && !dto.getOrgAid().equals(e.getSysCreateAid())) {
return true; return true;
} }
return false; return false;
}); });
//将需要隐藏的做标记 //将需要隐藏的做标记
mergedList.forEach(e->{ listByFilters2.forEach(e -> {
if(courseIds.contains(e.getId())){ if (seache.contains(e.getId()) && !finalStrings.contains(e.getOrgId()) && !dto.getOrgAid().equals(e.getSysCreateAid())) {
e.setIsPermission(false); e.setIsPermission(false);
} else { } else {
e.setIsPermission(true); e.setIsPermission(true);
} }
}); });
} }
List<Course> paginate = paginate(mergedList, pageIndex, pageSize); }
List<Course> paginate = paginate(listByFilters2, pageIndex, pageSize);
PageList<Course> rs = new PageList<>(); PageList<Course> rs = new PageList<>();
rs.setCount(mergedList.size()); rs.setCount(listByFilters2.size());
rs.setList(paginate); rs.setList(paginate);
return rs; 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) { private List<String> getRouter(CourseQueryDto dto) {
String sql = "SELECT DISTINCT\n" + String sql = "SELECT DISTINCT\n" +
"rt.course_id\n" + "rt.course_id\n" +
@@ -411,6 +484,7 @@ public class CourseServiceImpl implements ICourseService {
return list1; return list1;
} }
private List<String> getProject(CourseQueryDto dto) { private List<String> getProject(CourseQueryDto dto) {
String sql = "SELECT DISTINCT\n" + String sql = "SELECT DISTINCT\n" +
"pt.course_id\n" + "pt.course_id\n" +
@@ -432,6 +506,7 @@ public class CourseServiceImpl implements ICourseService {
} }
return list1; return list1;
} }
private List<String> getAudiences(CourseQueryDto dto) { private List<String> getAudiences(CourseQueryDto dto) {
List<String> s = Arrays.asList(dto.getAudiences().split(",")); List<String> s = Arrays.asList(dto.getAudiences().split(","));
String sql = "SELECT DISTINCT\n" + String sql = "SELECT DISTINCT\n" +
@@ -450,21 +525,23 @@ public class CourseServiceImpl implements ICourseService {
return list1; return list1;
} }
private List<String> getNoAudiences(CourseQueryDto dto) { private List<String> getNoAudiences(CourseQueryDto dto) {
String sql = "SELECT DISTINCT\n" + String sql = "SELECT\n" +
"\tc.id \n" + "\tc.id \n" +
"FROM\n" + "FROM\n" +
"\tboe_base.boe_course c \n" + "\tboe_base.boe_course c \n" +
"WHERE\n" + "WHERE\n" +
"\t NOT EXISTS ( SELECT 1 FROM boe_base.boe_course_crowd cc where cc.course_id = c.id ) \n" + "\t NOT EXISTS ( SELECT 1 FROM boe_base.boe_course_crowd cc where cc.course_id = c.id ) \n" +
"\tAND c.deleted =0 \n"; "\tAND c.deleted =0 \n";
List<Long>list = courseTeacherDao.sqlFindList(sql); List<Course> list = courseDao.sqlFindList(sql);
List<String> list1 = new ArrayList<>(); List<String> list1 = new ArrayList<>();
for (Object obj : list) { for (Object obj : list) {
list1.add(obj.toString()); list1.add(obj.toString());
} }
return list1; return list1;
} }
private List<String> getGrow(CourseQueryDto dto) { private List<String> getGrow(CourseQueryDto dto) {
String sql = "SELECT DISTINCT\n" + String sql = "SELECT DISTINCT\n" +
"\tc.id \n" + "\tc.id \n" +
@@ -486,6 +563,7 @@ public class CourseServiceImpl implements ICourseService {
} }
return list1; return list1;
} }
private List<String> getEnroll(CourseQueryDto dto) { private List<String> getEnroll(CourseQueryDto dto) {
String sql = "SELECT DISTINCT\n" + String sql = "SELECT DISTINCT\n" +
"\tsc.course_id \n" + "\tsc.course_id \n" +
@@ -503,6 +581,7 @@ public class CourseServiceImpl implements ICourseService {
return list1; return list1;
} }
public static <T> List<T> paginate(List<T> list, int pageNumber, int pageSize) { public static <T> List<T> paginate(List<T> list, int pageNumber, int pageSize) {
if (list == null || list.isEmpty() || pageNumber <= 0 || pageSize <= 0) { if (list == null || list.isEmpty() || pageNumber <= 0 || pageSize <= 0) {
return null; return null;
@@ -518,10 +597,12 @@ public class CourseServiceImpl implements ICourseService {
return list.subList(fromIndex, toIndex); return list.subList(fromIndex, toIndex);
} }
private static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) { private static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
Set<Object> seen = ConcurrentHashMap.newKeySet(); Set<Object> seen = ConcurrentHashMap.newKeySet();
return t -> seen.add(keyExtractor.apply(t)); return t -> seen.add(keyExtractor.apply(t));
} }
@Override @Override
public List<Course> findList(CourseQueryDto dto) { public List<Course> findList(CourseQueryDto dto) {
List<IFieldFilter> filters = createFilters(dto); List<IFieldFilter> filters = createFilters(dto);
@@ -765,6 +846,7 @@ public class CourseServiceImpl implements ICourseService {
//记录删除日志信息 //记录删除日志信息
} }
@Override @Override
public Course get(String id) { public Course get(String id) {
Course c = courseDao.get(id); Course c = courseDao.get(id);
@@ -821,6 +903,7 @@ public class CourseServiceImpl implements ICourseService {
/** /**
* 追加修改日志,共用方法,在其它的修改的地方也可能调用 * 追加修改日志,共用方法,在其它的修改的地方也可能调用
*
* @param old * @param old
* @param now * @param now
*/ */
@@ -1104,7 +1187,6 @@ public class CourseServiceImpl implements ICourseService {
// log.error("课程发布全文检索失败",e); // log.error("课程发布全文检索失败",e);
// } // }
// } // }
@Override @Override
public void audit(String auditId, String courseId, Boolean pass, String aid, String name, String remark, boolean publish, Integer from) { public void audit(String auditId, String courseId, Boolean pass, String aid, String name, String remark, boolean publish, Integer from) {
@@ -1250,9 +1332,10 @@ public class CourseServiceImpl implements ICourseService {
} }
} }
/** /**
* 赋值赞踩数 * 赋值赞踩数
* */ */
@Override @Override
public void updateTrampleCount(String id, Integer trampleCount) { public void updateTrampleCount(String id, Integer trampleCount) {
courseDao.updateMultiFieldById(id, UpdateBuilder.create("trampleCount", trampleCount)); courseDao.updateMultiFieldById(id, UpdateBuilder.create("trampleCount", trampleCount));
@@ -1261,7 +1344,7 @@ public class CourseServiceImpl implements ICourseService {
/** /**
* 赋值点赞数 * 赋值点赞数
* */ */
@Override @Override
public List<CourseTeacher> findTeachersByCourseId(String courseId) { public List<CourseTeacher> findTeachersByCourseId(String courseId) {
@@ -1318,7 +1401,6 @@ public class CourseServiceImpl implements ICourseService {
} }
@Override @Override
public List<RankingDto> scoreList(int num, int index) { public List<RankingDto> scoreList(int num, int index) {
QueryBuilder builder = QueryBuilder.from(Course.class); QueryBuilder builder = QueryBuilder.from(Course.class);
@@ -1472,7 +1554,6 @@ public class CourseServiceImpl implements ICourseService {
} }
@Override @Override
public int countWaitAudit(String aid) { public int countWaitAudit(String aid) {
//查询待审核的课程 //查询待审核的课程
@@ -1712,7 +1793,7 @@ public class CourseServiceImpl implements ICourseService {
/** /**
* 返回当前课程名字 * 返回当前课程名字
* */ */
private String courseName(String id) { private String courseName(String id) {
Course course = courseDao.get(id); Course course = courseDao.get(id);
return course.getName(); return course.getName();
@@ -1859,8 +1940,7 @@ public class CourseServiceImpl implements ICourseService {
"teacher_name from boe_course_teacher where course_id=?1"; "teacher_name from boe_course_teacher where course_id=?1";
courseTeacherDao.sqlUpdate(sqlTeacher, id); courseTeacherDao.sqlUpdate(sqlTeacher, id);
} } else {
else{
mess = "长度超出范围"; mess = "长度超出范围";
} }
return mess; return mess;
@@ -1885,6 +1965,4 @@ public class CourseServiceImpl implements ICourseService {
} }
} }