课程增加字段

dev
zhaokai 2026-01-16 13:36:19 +08:00
parent 8c316c711b
commit 38ba8dbe41
13 changed files with 93 additions and 28 deletions

View File

@ -10,7 +10,9 @@ import com.zcloud.edu.domain.model.resource.CurriculumChapterE;
import com.zcloud.edu.domain.model.resource.CurriculumE; import com.zcloud.edu.domain.model.resource.CurriculumE;
import com.zcloud.edu.dto.resource.CurriculumAddCmd; import com.zcloud.edu.dto.resource.CurriculumAddCmd;
import com.zcloud.edu.dto.resource.CurriculumChapterAddCmd; import com.zcloud.edu.dto.resource.CurriculumChapterAddCmd;
import com.zcloud.edu.persistence.dataobject.QuestionDO;
import com.zcloud.edu.persistence.repository.resource.CurriculumChapterRepository; import com.zcloud.edu.persistence.repository.resource.CurriculumChapterRepository;
import com.zcloud.edu.persistence.repository.resource.CurriculumRepository;
import com.zcloud.edu.persistence.repository.resource.QuestionRepository; import com.zcloud.edu.persistence.repository.resource.QuestionRepository;
import com.zcloud.edu.persistence.repository.resource.VideoCoursewareRepository; import com.zcloud.edu.persistence.repository.resource.VideoCoursewareRepository;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
@ -18,6 +20,7 @@ import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -33,6 +36,7 @@ import java.util.stream.Collectors;
@AllArgsConstructor @AllArgsConstructor
public class CurriculumAddExe { public class CurriculumAddExe {
private final CurriculumGateway curriculumGateway; private final CurriculumGateway curriculumGateway;
private final CurriculumRepository curriculumRepository;
private final CurriculumChapterGateway curriculumChapterGateway; private final CurriculumChapterGateway curriculumChapterGateway;
private final CurriculumChapterCoConvertor curriculumChapterCoConvertor; private final CurriculumChapterCoConvertor curriculumChapterCoConvertor;
private final CurriculumChapterRepository curriculumChapterRepository; private final CurriculumChapterRepository curriculumChapterRepository;
@ -42,17 +46,7 @@ public class CurriculumAddExe {
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public boolean execute(CurriculumAddCmd cmd) { public boolean execute(CurriculumAddCmd cmd) {
CurriculumE curriculumE = new CurriculumE();
BeanUtils.copyProperties(cmd, curriculumE);
boolean res = false;
try {
res = curriculumGateway.add(curriculumE);
} catch (Exception e) {
throw new RuntimeException(e);
}
if (!res) {
throw new BizException("课程保存失败");
}
List<String> videoCoursewareIds =new ArrayList<>(); List<String> videoCoursewareIds =new ArrayList<>();
//判断课程习题数量大于5 //判断课程习题数量大于5
if(CatalogueLevelEnum.FIRST_LEVEL.getCode().equals(cmd.getCatalogueLevel())){ if(CatalogueLevelEnum.FIRST_LEVEL.getCode().equals(cmd.getCatalogueLevel())){
@ -64,7 +58,6 @@ public class CurriculumAddExe {
//二级目录 //二级目录
List<CurriculumChapterAddCmd> curriculumChapterAddCmdList = cmd.getCurriculumChapterAddCmdList(); List<CurriculumChapterAddCmd> curriculumChapterAddCmdList = cmd.getCurriculumChapterAddCmdList();
//curriculumChapterAddCmdList过滤掉"0".equals(curriculumChapterAddCmd.getParentId()) 的数据拿到videoCoursewareIds //curriculumChapterAddCmdList过滤掉"0".equals(curriculumChapterAddCmd.getParentId()) 的数据拿到videoCoursewareIds
// curriculumChapterAddCmdList.stream()
//curriculumChapterAddCmdList中curriculumChapterAddCmdList.get().getCurriculumChapterAddCmdList() 下所有的getVideoCoursewareId //curriculumChapterAddCmdList中curriculumChapterAddCmdList.get().getCurriculumChapterAddCmdList() 下所有的getVideoCoursewareId
List<String> finalVideoCoursewareIds = videoCoursewareIds; List<String> finalVideoCoursewareIds = videoCoursewareIds;
curriculumChapterAddCmdList.forEach(info->{ curriculumChapterAddCmdList.forEach(info->{
@ -80,8 +73,28 @@ public class CurriculumAddExe {
if(videoCoursewareCount<5){ if(videoCoursewareCount<5){
throw new BizException("课程习题数量不能小于5"); throw new BizException("课程习题数量不能小于5");
} }
CurriculumE curriculumE = new CurriculumE();
BeanUtils.copyProperties(cmd, curriculumE);
BigDecimal videoTotalTime = videoCoursewareRepository.getVideoTotalTime(videoCoursewareIds);
//videoCoursewareCount中所有videoTime相加去掉空值
//获取总时长
curriculumE.setVideoTotalTime(videoTotalTime);
boolean res = false;
try {
res = curriculumGateway.add(curriculumE);
} catch (Exception e) {
throw new RuntimeException(e);
}
if (!res) {
throw new BizException("课程保存失败");
}
//处理课程章节 //处理课程章节
List<CurriculumChapterAddCmd> curriculumChapterAddCmdList = cmd.getCurriculumChapterAddCmdList(); List<CurriculumChapterAddCmd> curriculumChapterAddCmdList = cmd.getCurriculumChapterAddCmdList();
List<String> videoCoursewareIds1 = videoCoursewareIds;
curriculumChapterAddCmdList.forEach(curriculumChapterAddCmd -> { curriculumChapterAddCmdList.forEach(curriculumChapterAddCmd -> {
CurriculumChapterE curriculumChapterE = new CurriculumChapterE(); CurriculumChapterE curriculumChapterE = new CurriculumChapterE();
BeanUtils.copyProperties(curriculumChapterAddCmd, curriculumChapterE); BeanUtils.copyProperties(curriculumChapterAddCmd, curriculumChapterE);

View File

@ -1,5 +1,6 @@
package com.zcloud.edu.command.resource; package com.zcloud.edu.command.resource;
import cn.hutool.core.collection.CollUtil;
import com.alibaba.cola.exception.BizException; import com.alibaba.cola.exception.BizException;
import com.zcloud.edu.command.convertor.resource.CurriculumChapterCoConvertor; import com.zcloud.edu.command.convertor.resource.CurriculumChapterCoConvertor;
import com.zcloud.edu.domain.enums.CatalogueLevelEnum; import com.zcloud.edu.domain.enums.CatalogueLevelEnum;
@ -12,16 +13,17 @@ import com.zcloud.edu.dto.resource.CurriculumChapterAddCmd;
import com.zcloud.edu.dto.resource.CurriculumUpdateCmd; import com.zcloud.edu.dto.resource.CurriculumUpdateCmd;
import com.zcloud.edu.dto.resource.CurriculumUpdateStateCmd; import com.zcloud.edu.dto.resource.CurriculumUpdateStateCmd;
import com.zcloud.edu.persistence.dataobject.CurriculumDO; import com.zcloud.edu.persistence.dataobject.CurriculumDO;
import com.zcloud.edu.persistence.repository.resource.CorpInfoRepository; import com.zcloud.edu.persistence.repository.resource.*;
import com.zcloud.edu.persistence.repository.resource.CurriculumChapterRepository;
import com.zcloud.edu.persistence.repository.resource.CurriculumRepository;
import com.zcloud.edu.persistence.repository.study.ClassCurriculumRepository; import com.zcloud.edu.persistence.repository.study.ClassCurriculumRepository;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
/** /**
@ -40,6 +42,8 @@ public class CurriculumUpdateExe {
private final CurriculumChapterGateway curriculumChapterGateway; private final CurriculumChapterGateway curriculumChapterGateway;
private final CorpInfoRepository corpInfoRepository; private final CorpInfoRepository corpInfoRepository;
private final ClassCurriculumRepository classCurriculumRepository; private final ClassCurriculumRepository classCurriculumRepository;
private final QuestionRepository questionRepository;
private final VideoCoursewareRepository videoCoursewareRepository;
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void execute(CurriculumUpdateCmd curriculumUpdateCmd) { public void execute(CurriculumUpdateCmd curriculumUpdateCmd) {
@ -62,9 +66,38 @@ public class CurriculumUpdateExe {
if(count>0){ if(count>0){
throw new BizException("该课程已绑定班级,不能编辑"); throw new BizException("该课程已绑定班级,不能编辑");
} }
List<String> videoCoursewareIds =new ArrayList<>();
//判断课程习题数量大于5
if(CatalogueLevelEnum.FIRST_LEVEL.getCode().equals(curriculumUpdateCmd.getCatalogueLevel())){
//一级目录
videoCoursewareIds = curriculumUpdateCmd.getCurriculumChapterAddCmdList().stream()
.filter(curriculumChapterAddCmd -> curriculumChapterAddCmd.getVideoCoursewareId() != null)
.map(CurriculumChapterAddCmd::getVideoCoursewareId).collect(Collectors.toList());
}else{
//二级目录
List<CurriculumChapterAddCmd> curriculumChapterAddCmdList = curriculumUpdateCmd.getCurriculumChapterAddCmdList();
//curriculumChapterAddCmdList过滤掉"0".equals(curriculumChapterAddCmd.getParentId()) 的数据拿到videoCoursewareIds
//curriculumChapterAddCmdList中curriculumChapterAddCmdList.get().getCurriculumChapterAddCmdList() 下所有的getVideoCoursewareId
List<String> finalVideoCoursewareIds = videoCoursewareIds;
curriculumChapterAddCmdList.forEach(info->{
List<String> collect = info.getCurriculumChapterAddCmdList().stream().filter(curriculumChapterAddCmd -> curriculumChapterAddCmd.getVideoCoursewareId() != null)
.map(CurriculumChapterAddCmd::getVideoCoursewareId).collect(Collectors.toList());
finalVideoCoursewareIds.addAll(collect);
});
}
if(CollUtil.isEmpty(videoCoursewareIds)){
throw new BizException("请选择课程");
}
Long videoCoursewareCount = questionRepository.getCountByVideoCoursewareList(videoCoursewareIds);
if(videoCoursewareCount<5){
throw new BizException("课程习题数量不能小于5");
}
CurriculumE curriculumE = new CurriculumE(); CurriculumE curriculumE = new CurriculumE();
BeanUtils.copyProperties(curriculumUpdateCmd, curriculumE); BeanUtils.copyProperties(curriculumUpdateCmd, curriculumE);
BigDecimal videoTotalTime = videoCoursewareRepository.getVideoTotalTime(videoCoursewareIds);
curriculumE.setVideoTotalTime(videoTotalTime);
boolean res = curriculumGateway.update(curriculumE); boolean res = curriculumGateway.update(curriculumE);
if (!res) { if (!res) {
throw new BizException("修改失败"); throw new BizException("修改失败");
@ -87,7 +120,6 @@ public class CurriculumUpdateExe {
} }
}); });
} }
public void editState(CurriculumUpdateStateCmd cmd) { public void editState(CurriculumUpdateStateCmd cmd) {

View File

@ -3,7 +3,6 @@ package com.zcloud.edu.command.study;
import com.alibaba.cola.exception.BizException; import com.alibaba.cola.exception.BizException;
import com.jjb.saas.framework.auth.model.SSOUser; import com.jjb.saas.framework.auth.model.SSOUser;
import com.jjb.saas.framework.auth.utils.AuthContext; import com.jjb.saas.framework.auth.utils.AuthContext;
import com.sun.org.apache.xml.internal.security.Init;
import com.zcloud.edu.domain.gateway.study.ClassGateway; import com.zcloud.edu.domain.gateway.study.ClassGateway;
import com.zcloud.edu.domain.model.study.ClassE; import com.zcloud.edu.domain.model.study.ClassE;
import com.zcloud.edu.dto.study.ClassAddCmd; import com.zcloud.edu.dto.study.ClassAddCmd;

View File

@ -4,6 +4,8 @@ import com.alibaba.cola.dto.ClientObject;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import java.math.BigDecimal;
/** /**
* web-client * web-client
@ -42,7 +44,7 @@ public class VideoCoursewareCO extends ClientObject {
private Integer state; private Integer state;
//课件时长(视频时间)-秒 //课件时长(视频时间)-秒
@ApiModelProperty(value = "课件时长(视频时间)-秒") @ApiModelProperty(value = "课件时长(视频时间)-秒")
private Integer videoTime; private BigDecimal videoTime;
@ApiModelProperty(value = "课件截图url") @ApiModelProperty(value = "课件截图url")
private String screenshotUrl; private String screenshotUrl;

View File

@ -9,6 +9,7 @@ import lombok.NoArgsConstructor;
import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
/** /**
* web-client * web-client
@ -49,7 +50,7 @@ public class VideoCoursewareAddCmd extends Command {
@ApiModelProperty(value = "课件时长(视频时间)-秒", name = "videoTime", required = true) @ApiModelProperty(value = "课件时长(视频时间)-秒", name = "videoTime", required = true)
@NotNull(message = "课件时长(视频时间)-秒不能为空") @NotNull(message = "课件时长(视频时间)-秒不能为空")
private Integer videoTime; private BigDecimal videoTime;
@ApiModelProperty(value = "课件截图url") @ApiModelProperty(value = "课件截图url")
private String screenshotUrl; private String screenshotUrl;

View File

@ -9,6 +9,7 @@ import lombok.NoArgsConstructor;
import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
/** /**
* web-client * web-client
@ -48,7 +49,7 @@ public class VideoCoursewareUpdateCmd extends Command {
private Integer state; private Integer state;
@ApiModelProperty(value = "课件时长(视频时间)-秒", name = "videoTime", required = true) @ApiModelProperty(value = "课件时长(视频时间)-秒", name = "videoTime", required = true)
@NotNull(message = "课件时长(视频时间)-秒不能为空") @NotNull(message = "课件时长(视频时间)-秒不能为空")
private Integer videoTime; private BigDecimal videoTime;
@ApiModelProperty(value = "课件截图url") @ApiModelProperty(value = "课件截图url")
private String screenshotUrl; private String screenshotUrl;
} }

View File

@ -4,6 +4,7 @@ import com.jjb.saas.framework.domain.model.BaseE;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime; import java.time.LocalDateTime;
/** /**
@ -67,6 +68,6 @@ public class CurriculumE extends BaseE {
private Integer chapterCount; private Integer chapterCount;
//总视频时长 //总视频时长
@ApiModelProperty(value = "总视频时长") @ApiModelProperty(value = "总视频时长")
private Integer videoTime; private BigDecimal videoTotalTime;
} }

View File

@ -3,6 +3,8 @@ package com.zcloud.edu.domain.model.resource;
import com.jjb.saas.framework.domain.model.BaseE; import com.jjb.saas.framework.domain.model.BaseE;
import lombok.Data; import lombok.Data;
import java.math.BigDecimal;
/** /**
* web-domain * web-domain
* *
@ -30,7 +32,7 @@ public class VideoCoursewareE extends BaseE {
//课件状态 0未启用, 1-启用 //课件状态 0未启用, 1-启用
private Integer state; private Integer state;
//课件时长(视频时间)-秒 //课件时长(视频时间)-秒
private Integer videoTime; private BigDecimal videoTime;
//课件截图 //课件截图
private String screenshotUrl; private String screenshotUrl;

View File

@ -60,8 +60,7 @@ public class CurriculumDO extends BaseDO {
private Integer chapterCount; private Integer chapterCount;
//总视频时长 //总视频时长
@ApiModelProperty(value = "总视频时长") @ApiModelProperty(value = "总视频时长")
@TableField(exist = false) private BigDecimal videoTotalTime;
private Integer videoTime;
public CurriculumDO(String curriculumId) { public CurriculumDO(String curriculumId) {

View File

@ -8,6 +8,8 @@ import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import java.math.BigDecimal;
/** /**
* web-infrastructure * web-infrastructure
* *
@ -45,7 +47,7 @@ public class VideoCoursewareDO extends BaseDO {
private Integer state; private Integer state;
//课件时长(视频时间)-秒 //课件时长(视频时间)-秒
@ApiModelProperty(value = "课件时长(视频时间)-秒") @ApiModelProperty(value = "课件时长(视频时间)-秒")
private Integer videoTime; private BigDecimal videoTime;
@ApiModelProperty(value = "课件截图url") @ApiModelProperty(value = "课件截图url")
private String screenshotUrl; private String screenshotUrl;
@ApiModelProperty(value = "企业名称") @ApiModelProperty(value = "企业名称")

View File

@ -13,6 +13,7 @@ import com.jjb.saas.framework.repository.repo.impl.BaseRepositoryImpl;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.Map; import java.util.Map;
import java.util.List; import java.util.List;
@ -65,5 +66,14 @@ public class VideoCoursewareRepositoryImpl extends BaseRepositoryImpl<VideoCours
queryWrapper.eq("training_type_id", trainingTypeId); queryWrapper.eq("training_type_id", trainingTypeId);
return videoCoursewareMapper.selectCount(queryWrapper); return videoCoursewareMapper.selectCount(queryWrapper);
} }
@Override
public BigDecimal getVideoTotalTime(List<String> videoCoursewareIds) {
QueryWrapper<VideoCoursewareDO> queryWrapper = new QueryWrapper<>();
queryWrapper.in("video_courseware_id", videoCoursewareIds);
List<VideoCoursewareDO> videoCoursewareDOList = list(queryWrapper);
BigDecimal videoTotalTime = videoCoursewareDOList.stream().map(VideoCoursewareDO::getVideoTime).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(1, BigDecimal.ROUND_HALF_UP);
return videoTotalTime;
}
} }

View File

@ -5,6 +5,7 @@ import com.alibaba.cola.dto.SingleResponse;
import com.alibaba.cola.dto.PageResponse; import com.alibaba.cola.dto.PageResponse;
import com.jjb.saas.framework.repository.repo.BaseRepository; import com.jjb.saas.framework.repository.repo.BaseRepository;
import java.math.BigDecimal;
import java.util.Map; import java.util.Map;
import java.util.List; import java.util.List;
@ -27,5 +28,7 @@ public interface VideoCoursewareRepository extends BaseRepository<VideoCoursewar
SingleResponse<VideoCoursewareDO> getInfoById(Long id); SingleResponse<VideoCoursewareDO> getInfoById(Long id);
Long getListByTraingId(String trainingTypeId); Long getListByTraingId(String trainingTypeId);
BigDecimal getVideoTotalTime(List<String> videoCoursewareIds);
} }

View File

@ -8,8 +8,8 @@
select c.*, select c.*,
corp.corp_name as corpName, corp.corp_name as corpName,
tt.name as trainingTypeName, tt.name as trainingTypeName,
count(cc.id) as chapterCount, count(cc.id) as chapterCount
sum(vc.video_time) as videoTime
from curriculum c from curriculum c
left join corp_info corp on c.corpinfo_id = corp.id left join corp_info corp on c.corpinfo_id = corp.id
left join training_type tt on c.training_type_id = tt.training_type_id and tt.delete_enum = 'FALSE' left join training_type tt on c.training_type_id = tt.training_type_id and tt.delete_enum = 'FALSE'