目录
1、业务背景
最近在产品实现功能之中,有一个功能给课程之中各项评分项目【观看视频(整体算一项)、提交pdf作业(多项)、研讨(多项)、测验(多项)】设置在课程之中进行评分权重。整体权重100,规定每一项权重为0-100之间设定一个整数值,最后要求所有权重值的总和必须100。
目前实现方案如下:
- 在初次进入查询课程权重页面时,查询获得本课程之中所有参与权重计算内容项目
- 初次存入到本课程的权重项设置数据库表之中。
- 后面再次进入当前页面,可能出现新增权重计算项目(课程添加作业、研讨、测验)
- 此时情况是,数据权重表之中当前可能前期有5个权重项,最近有新增了三个权重项
- 页面需要完成的操作:直接新增新加入的三个权重项Insert到数据库之中,默认权重为0。
- 后续可能需要动态调整权重所在比例,此时仅仅只更新各个权重的值
2、代码实现
public List<ClazzCourseWeightVO> selectClazzCourseWeightList(Long clazzId, Long courseId, Long operateUserId) {
Long operateTime = DateUtils.getNowDate().getTime();
List<ClazzCourseWeightVO> clazzCourseWeightList = new ArrayList<>();
List<ClazzCourseWeightDTO> clazzCourseWeightDtoList = new ArrayList<>();
/**
* 显示之前获得对象的课程权重内容
*/
List<ClazzCourseWeightShowDTO> clazzCourseWeightShowList = new ArrayList<>();
setVideoWeight(clazzId, courseId, operateTime, operateUserId, clazzCourseWeightDtoList, clazzCourseWeightShowList);
List<ClazzCourseContentWeightDTO> assignmentWeightList = clazzCourseWeightExtendMapper.selectClazzCourseAssignmentWeightItemList(clazzId, courseId);
setClazzCourseContentWeightInfo(assignmentWeightList, clazzCourseWeightShowList, clazzCourseWeightDtoList, operateTime, operateUserId);
//课程测验权重
List<ClazzCourseContentWeightDTO> quizWeightList = clazzCourseWeightExtendMapper.selectClazzCourseQuizWeightItemList(clazzId, courseId);
setClazzCourseContentWeightInfo(quizWeightList, clazzCourseWeightShowList, clazzCourseWeightDtoList, operateTime, operateUserId);
//课程研讨权重
List<ClazzCourseContentWeightDTO> discussWeightList = clazzCourseWeightExtendMapper.selectClazzCourseDiscussWeightItemList(clazzId, courseId);
setClazzCourseContentWeightInfo(discussWeightList, clazzCourseWeightShowList, clazzCourseWeightDtoList, operateTime, operateUserId);
//2、查询是否已经给班级课程设置过权重
List<ClazzCourseContentWeightDTO> courseContentWeightList = clazzCourseWeightExtendMapper.selectClazzCourseHasWeightInfo(clazzId, courseId);
// 课程评分项目List--已经设置评分权重List 差集
List<ClazzCourseContentWeightDTO> tempCourseContentWeightList = courseContentWeightList;
List<ClazzCourseWeightShowDTO> notAssignWeightItemList = clazzCourseWeightShowList.stream()
.filter(contentItem -> !tempCourseContentWeightList.stream().map(contentHasWeightItem -> contentHasWeightItem.getTargetType() + "@##@" + contentHasWeightItem.getTargetId())
.collect(Collectors.toList()).contains(contentItem.getTargetType() + "@##@" + contentItem.getTargetId()))
.collect(Collectors.toList());
//标识已经添加或者设置过
if (notAssignWeightItemList.size() > 0) {
//获得权重表之中未添加 执行静默添加权重记录
List<ClazzCourseWeightDTO> addWeightDtoList = new ArrayList<>();
for (ClazzCourseWeightShowDTO addWeightShowDto : notAssignWeightItemList) {
ClazzCourseWeightDTO clazzCourseWeightDTO = new ClazzCourseWeightDTO();
BeanUtils.copyProperties(addWeightShowDto, clazzCourseWeightDTO);
clazzCourseWeightDTO.setClazzId(clazzId);
clazzCourseWeightDTO.setCourseId(courseId);
clazzCourseWeightDTO.setCreateTime(operateTime);
clazzCourseWeightDTO.setCreateBy(operateUserId);
clazzCourseWeightDTO.setUpdateTime(operateTime);
clazzCourseWeightDTO.setUpdateBy(operateUserId);
clazzCourseWeightDTO.setWeight(BusinessConstants.CONSTANT_INT_ZERO);
clazzCourseWeightDtoList.add(clazzCourseWeightDTO);
addWeightDtoList.add(clazzCourseWeightDTO);
}
addBatchClazzCourseWeight(addWeightDtoList);
//针对给出条件进行多条件筛选返回结果集合
courseContentWeightList = clazzCourseWeightExtendMapper.selectClazzCourseHasWeightInfo(clazzId, courseId);
//添加完毕后返回查询返回后显示对应的权重
}
setClazzCourseWeightResult(clazzCourseWeightShowList, courseContentWeightList, clazzCourseWeightList);
return clazzCourseWeightList;
}
3、成果展现
4、总结
方案1:在查询过程之中写入业务数据记录,如果有新增则插入记录、编辑的时候仅仅保存回显修改结果。
方案2:显示课程里面包含的权重项评分内容项初次仅仅回显结果,在点击提交按钮时候把已经设置权重记录和未设置权重值同时插入到数据库之中。后续再次显示本页面时候,需要查询出本课程下有效参与计算权重记录项目与已经存入权重表之中记录进行左连接(Left JOIN)或者Java程序除开后回显列表。
优缺点比较:
优点:
方案1:提交保存按钮仅仅只存储更新权重的记录
方案2:回显列表时候需要返回参与权重项目计算所有项,并与已经存在的权重项进行比对。不用每次显示列表的时候进行数据库写入操作。仅仅是在提交按钮时候进行 新增插入、更新记录
缺点:
方案1:每次返回显示列表的时候,就需要获得是否有新增评分项目,在查询操作之中实现新增权重项的新增插入操作。
方案2:需要在提交操作的时候的时候,对新增的权重计算项目和修改的权重分数内容进行新增或者编辑更新。