添加学生档案和签到功能

dev
zhangyue 2026-01-27 16:00:33 +08:00
parent 7290042ed8
commit bd4b0bd46b
94 changed files with 2644 additions and 53 deletions

View File

@ -8,6 +8,7 @@ import com.alibaba.cola.dto.SingleResponse;
import com.jjb.saas.framework.auth.model.SSOUser;
import com.jjb.saas.framework.auth.utils.AuthContext;
import com.zcloud.edu.api.study.StudentSignServiceI;
import com.zcloud.edu.dto.clientobject.study.StudentCO;
import com.zcloud.edu.dto.clientobject.study.StudentSignCO;
import com.zcloud.edu.dto.study.*;
import io.swagger.annotations.Api;
@ -38,7 +39,7 @@ public class AppStudentSignController {
}
@ApiOperation("验证是否可签到")
@GetMapping("/verify")
public Response verify(@RequestBody StudentSignVerifyQry qry) {
public SingleResponse<StudentCO> verify(@RequestBody StudentSignVerifyQry qry) {
return studentSignService.verify(qry);
}
@ApiOperation("分页")

View File

@ -0,0 +1,57 @@
package com.zcloud.edu.web.archives;
import com.alibaba.cola.dto.PageResponse;
import com.alibaba.cola.dto.SingleResponse;
import com.jjb.saas.framework.auth.model.SSOUser;
import com.jjb.saas.framework.auth.utils.AuthContext;
import com.zcloud.edu.api.study.ClassServiceI;
import com.zcloud.edu.api.study.StudentServiceI;
import com.zcloud.edu.dto.archives.ClassArchivesQry;
import com.zcloud.edu.dto.clientobject.study.ClassCO;
import com.zcloud.edu.dto.data.archives.PersonArchivesDTO;
import com.zcloud.edu.dto.study.ClassPageQry;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author zhangyue
* @date 2026/1/26 15:08
*/
@Api(tags = "")
@RequestMapping("/${application.gateway}/archives")
@RestController
@AllArgsConstructor
public class ArchivesController {
private final ClassServiceI classService;
private final StudentServiceI studentService;
@ApiOperation("分页")
@PostMapping("/list")
public PageResponse<ClassCO> page(@RequestBody ClassPageQry qry) {
qry.setEqCorpinfoId(AuthContext.getCurrentUser().getTenantId());
return classService.appListPage(qry);
}
@ApiOperation("查询学时证明")
@PostMapping("/getAttendanceRecord")
public SingleResponse<PersonArchivesDTO> getAttendanceRecord(@RequestBody ClassArchivesQry qry) {
return studentService.getAttendanceRecord(qry);
}
@ApiOperation("查询学习档案")
@PostMapping("/getStudyArchives")
public SingleResponse<PersonArchivesDTO> getStudyArchives(@RequestBody ClassArchivesQry qry) {
return studentService.getStudyArchives(qry);
}
@ApiOperation("查询学习记录")
@PostMapping("/getStudyRecord")
public SingleResponse<PersonArchivesDTO> getStudyRecord(@RequestBody ClassArchivesQry qry) {
return studentService.getStudyRecord(qry);
}
}

View File

@ -0,0 +1,82 @@
package com.zcloud.edu.web.archives;
import com.alibaba.cola.dto.MultiResponse;
import com.alibaba.cola.dto.PageResponse;
import com.alibaba.cola.dto.Response;
import com.alibaba.cola.dto.SingleResponse;
import com.jjb.saas.framework.auth.model.SSOUser;
import com.jjb.saas.framework.auth.utils.AuthContext;
import com.zcloud.edu.api.archives.ArchivesReviewServiceI;
import com.zcloud.edu.dto.archives.ArchivesReviewAddCmd;
import com.zcloud.edu.dto.archives.ArchivesReviewPageQry;
import com.zcloud.edu.dto.archives.ArchivesReviewUpdateCmd;
import com.zcloud.edu.dto.clientobject.archives.ArchivesReviewCO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
/**
* web-adapter
*
* @Author zhangyue
* @Date 2026-01-26 10:59:34
*/
@Api(tags = "")
@RequestMapping("/${application.gateway}/archivesReview")
@RestController
@AllArgsConstructor
public class ArchivesReviewController {
private final ArchivesReviewServiceI archivesReviewService;
@ApiOperation("新增")
@PostMapping("/save")
public SingleResponse<ArchivesReviewCO> add(@Validated @RequestBody ArchivesReviewAddCmd cmd) {
SSOUser ssoUser = AuthContext.getCurrentUser();
return archivesReviewService.add(cmd);
}
@ApiOperation("分页")
@PostMapping("/list")
public PageResponse<ArchivesReviewCO> page(@RequestBody ArchivesReviewPageQry qry) {
return archivesReviewService.listPage(qry);
}
@ApiOperation("所有数据")
@GetMapping("/listAll")
public MultiResponse<ArchivesReviewCO> listAll() {
return MultiResponse.of(new ArrayList<ArchivesReviewCO>());
}
@ApiOperation("详情")
@GetMapping("/{id}")
public SingleResponse<ArchivesReviewCO> getInfoById(@PathVariable("id") Long id) {
return SingleResponse.of(new ArchivesReviewCO());
}
@ApiOperation("删除")
@DeleteMapping("/{id}")
public Response remove(@PathVariable("id") Long id) {
archivesReviewService.remove(id);
return SingleResponse.buildSuccess();
}
@ApiOperation("删除多个")
@DeleteMapping("/ids")
public Response removeBatch(@RequestParam Long[] ids) {
archivesReviewService.removeBatch(ids);
return SingleResponse.buildSuccess();
}
@ApiOperation("修改")
@PutMapping("/edit")
public SingleResponse edit(@Validated @RequestBody ArchivesReviewUpdateCmd archivesReviewUpdateCmd) {
archivesReviewService.edit(archivesReviewUpdateCmd);
return SingleResponse.buildSuccess();
}
}

View File

@ -0,0 +1,82 @@
package com.zcloud.edu.web.archives;
import com.alibaba.cola.dto.MultiResponse;
import com.alibaba.cola.dto.PageResponse;
import com.alibaba.cola.dto.Response;
import com.alibaba.cola.dto.SingleResponse;
import com.jjb.saas.framework.auth.model.SSOUser;
import com.jjb.saas.framework.auth.utils.AuthContext;
import com.zcloud.edu.api.archives.ArchivesReviewRecordServiceI;
import com.zcloud.edu.dto.archives.ArchivesReviewRecordAddCmd;
import com.zcloud.edu.dto.archives.ArchivesReviewRecordPageQry;
import com.zcloud.edu.dto.archives.ArchivesReviewRecordUpdateCmd;
import com.zcloud.edu.dto.clientobject.archives.ArchivesReviewRecordCO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
/**
* web-adapter
*
* @Author zhangyue
* @Date 2026-01-26 10:59:36
*/
@Api(tags = "")
@RequestMapping("/${application.gateway}/archivesReviewRecord")
@RestController
@AllArgsConstructor
public class ArchivesReviewRecordController {
private final ArchivesReviewRecordServiceI archivesReviewRecordService;
@ApiOperation("新增")
@PostMapping("/save")
public SingleResponse<ArchivesReviewRecordCO> add(@Validated @RequestBody ArchivesReviewRecordAddCmd cmd) {
SSOUser ssoUser = AuthContext.getCurrentUser();
return archivesReviewRecordService.add(cmd);
}
@ApiOperation("分页")
@PostMapping("/list")
public PageResponse<ArchivesReviewRecordCO> page(@RequestBody ArchivesReviewRecordPageQry qry) {
return archivesReviewRecordService.listPage(qry);
}
@ApiOperation("所有数据")
@GetMapping("/listAll")
public MultiResponse<ArchivesReviewRecordCO> listAll() {
return MultiResponse.of(new ArrayList<ArchivesReviewRecordCO>());
}
@ApiOperation("详情")
@GetMapping("/{id}")
public SingleResponse<ArchivesReviewRecordCO> getInfoById(@PathVariable("id") Long id) {
return SingleResponse.of(new ArchivesReviewRecordCO());
}
@ApiOperation("删除")
@DeleteMapping("/{id}")
public Response remove(@PathVariable("id") Long id) {
archivesReviewRecordService.remove(id);
return SingleResponse.buildSuccess();
}
@ApiOperation("删除多个")
@DeleteMapping("/ids")
public Response removeBatch(@RequestParam Long[] ids) {
archivesReviewRecordService.removeBatch(ids);
return SingleResponse.buildSuccess();
}
@ApiOperation("修改")
@PutMapping("/edit")
public SingleResponse edit(@Validated @RequestBody ArchivesReviewRecordUpdateCmd archivesReviewRecordUpdateCmd) {
archivesReviewRecordService.edit(archivesReviewRecordUpdateCmd);
return SingleResponse.buildSuccess();
}
}

View File

@ -7,12 +7,10 @@ import com.alibaba.cola.dto.Response;
import com.alibaba.cola.dto.SingleResponse;
import com.zcloud.edu.api.study.ClassServiceI;
import com.zcloud.edu.dto.clientobject.study.ClassCO;
import com.zcloud.edu.dto.clientobject.study.StudentCO;
import com.zcloud.edu.dto.data.study.ClassCountDTO;
import com.zcloud.edu.dto.data.study.ClassQuestionDTO;
import com.zcloud.edu.dto.study.ClassAddCmd;
import com.zcloud.edu.dto.study.ClassPageQry;
import com.zcloud.edu.dto.study.ClassPostponeCmd;
import com.zcloud.edu.dto.study.ClassUpdateCmd;
import com.zcloud.edu.dto.study.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
@ -72,6 +70,11 @@ public class ClassController {
public MultiResponse<ClassCO> countClassStudent() {
return MultiResponse.of(new ArrayList<ClassCO>());
}
@ApiOperation("统计人员班级数")
@GetMapping("/countStuClass")
public MultiResponse<StudentCO> countStuClass(@RequestBody ClassCountQry qry) {
return classService.countStuClass(qry);
}
@ApiOperation("详情")
@GetMapping("/{id}")

View File

@ -52,7 +52,7 @@ public class ClassCurriculumController {
}
@ApiOperation("所有数据")
@GetMapping("/listAll")
@PostMapping("/listAll")
public MultiResponse<ClassCurriculumCO> listAll(@RequestBody ClassCurriculumQry qry) {
return classCurriculumService.listAll(qry);
}

View File

@ -58,6 +58,12 @@ public class StudentExamRecordController {
return SingleResponse.of(new StudentExamRecordCO());
}
@ApiOperation("查询考试记录")
@GetMapping("/getInfoByStudentId/{studentId}")
public SingleResponse<StudentExamRecordCO> getInfoByStudentId(@PathVariable("id") String studentId) {
return studentExamRecordService.getInfoByStudentId(studentId);
}
@ApiOperation("删除")
@DeleteMapping("/{id}")
public Response remove(@PathVariable("id") Long id) {

View File

@ -0,0 +1,40 @@
package com.zcloud.edu.command.archives;
import com.alibaba.cola.exception.BizException;
import com.zcloud.edu.domain.gateway.archives.ArchivesReviewGateway;
import com.zcloud.edu.domain.model.archives.ArchivesReviewE;
import com.zcloud.edu.dto.archives.ArchivesReviewAddCmd;
import lombok.AllArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
/**
* web-app
*
* @Author zhangyue
* @Date 2026-01-26 10:59:34
*/
@Component
@AllArgsConstructor
public class ArchivesReviewAddExe {
private final ArchivesReviewGateway archivesReviewGateway;
@Transactional(rollbackFor = Exception.class)
public boolean execute(ArchivesReviewAddCmd cmd) {
ArchivesReviewE archivesReviewE = new ArchivesReviewE();
BeanUtils.copyProperties(cmd, archivesReviewE);
boolean res = false;
try {
res = archivesReviewGateway.add(archivesReviewE);
} catch (Exception e) {
throw new RuntimeException(e);
}
if (!res) {
throw new BizException("保存失败");
}
return true;
}
}

View File

@ -0,0 +1,40 @@
package com.zcloud.edu.command.archives;
import com.alibaba.cola.exception.BizException;
import com.zcloud.edu.domain.gateway.archives.ArchivesReviewRecordGateway;
import com.zcloud.edu.domain.model.archives.ArchivesReviewRecordE;
import com.zcloud.edu.dto.archives.ArchivesReviewRecordAddCmd;
import lombok.AllArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
/**
* web-app
*
* @Author zhangyue
* @Date 2026-01-26 10:59:36
*/
@Component
@AllArgsConstructor
public class ArchivesReviewRecordAddExe {
private final ArchivesReviewRecordGateway archivesReviewRecordGateway;
@Transactional(rollbackFor = Exception.class)
public boolean execute(ArchivesReviewRecordAddCmd cmd) {
ArchivesReviewRecordE archivesReviewRecordE = new ArchivesReviewRecordE();
BeanUtils.copyProperties(cmd, archivesReviewRecordE);
boolean res = false;
try {
res = archivesReviewRecordGateway.add(archivesReviewRecordE);
} catch (Exception e) {
throw new RuntimeException(e);
}
if (!res) {
throw new BizException("保存失败");
}
return true;
}
}

View File

@ -0,0 +1,39 @@
package com.zcloud.edu.command.archives;
import com.alibaba.cola.exception.BizException;
import com.zcloud.edu.domain.gateway.archives.ArchivesReviewRecordGateway;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
/**
* web-app
*
* @Author zhangyue
* @Date 2026-01-26 10:59:37
*/
@Component
@AllArgsConstructor
public class ArchivesReviewRecordRemoveExe {
private final ArchivesReviewRecordGateway archivesReviewRecordGateway;
@Transactional(rollbackFor = Exception.class)
public boolean execute(Long id) {
boolean res = archivesReviewRecordGateway.deletedArchivesReviewRecordById(id);
if (!res) {
throw new BizException("删除失败");
}
return true;
}
@Transactional(rollbackFor = Exception.class)
public boolean execute(Long[] ids) {
boolean res = archivesReviewRecordGateway.deletedArchivesReviewRecordByIds(ids);
if (!res) {
throw new BizException("删除失败");
}
return true;
}
}

View File

@ -0,0 +1,34 @@
package com.zcloud.edu.command.archives;
import com.alibaba.cola.exception.BizException;
import com.zcloud.edu.domain.gateway.archives.ArchivesReviewRecordGateway;
import com.zcloud.edu.domain.model.archives.ArchivesReviewRecordE;
import com.zcloud.edu.dto.archives.ArchivesReviewRecordUpdateCmd;
import lombok.AllArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
/**
* web-app
*
* @Author zhangyue
* @Date 2026-01-26 10:59:37
*/
@Component
@AllArgsConstructor
public class ArchivesReviewRecordUpdateExe {
private final ArchivesReviewRecordGateway archivesReviewRecordGateway;
@Transactional(rollbackFor = Exception.class)
public void execute(ArchivesReviewRecordUpdateCmd archivesReviewRecordUpdateCmd) {
ArchivesReviewRecordE archivesReviewRecordE = new ArchivesReviewRecordE();
BeanUtils.copyProperties(archivesReviewRecordUpdateCmd, archivesReviewRecordE);
boolean res = archivesReviewRecordGateway.update(archivesReviewRecordE);
if (!res) {
throw new BizException("修改失败");
}
}
}

View File

@ -0,0 +1,39 @@
package com.zcloud.edu.command.archives;
import com.alibaba.cola.exception.BizException;
import com.zcloud.edu.domain.gateway.archives.ArchivesReviewGateway;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
/**
* web-app
*
* @Author zhangyue
* @Date 2026-01-26 10:59:35
*/
@Component
@AllArgsConstructor
public class ArchivesReviewRemoveExe {
private final ArchivesReviewGateway archivesReviewGateway;
@Transactional(rollbackFor = Exception.class)
public boolean execute(Long id) {
boolean res = archivesReviewGateway.deletedArchivesReviewById(id);
if (!res) {
throw new BizException("删除失败");
}
return true;
}
@Transactional(rollbackFor = Exception.class)
public boolean execute(Long[] ids) {
boolean res = archivesReviewGateway.deletedArchivesReviewByIds(ids);
if (!res) {
throw new BizException("删除失败");
}
return true;
}
}

View File

@ -0,0 +1,34 @@
package com.zcloud.edu.command.archives;
import com.alibaba.cola.exception.BizException;
import com.zcloud.edu.domain.gateway.archives.ArchivesReviewGateway;
import com.zcloud.edu.domain.model.archives.ArchivesReviewE;
import com.zcloud.edu.dto.archives.ArchivesReviewUpdateCmd;
import lombok.AllArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
/**
* web-app
*
* @Author zhangyue
* @Date 2026-01-26 10:59:35
*/
@Component
@AllArgsConstructor
public class ArchivesReviewUpdateExe {
private final ArchivesReviewGateway archivesReviewGateway;
@Transactional(rollbackFor = Exception.class)
public void execute(ArchivesReviewUpdateCmd archivesReviewUpdateCmd) {
ArchivesReviewE archivesReviewE = new ArchivesReviewE();
BeanUtils.copyProperties(archivesReviewUpdateCmd, archivesReviewE);
boolean res = archivesReviewGateway.update(archivesReviewE);
if (!res) {
throw new BizException("修改失败");
}
}
}

View File

@ -0,0 +1,24 @@
package com.zcloud.edu.command.convertor.archives;
import com.zcloud.edu.dto.clientobject.archives.ArchivesReviewCO;
import com.zcloud.edu.persistence.dataobject.archives.ArchivesReviewDO;
import org.mapstruct.Mapper;
import java.util.List;
/**
* web-app
*
* @Author zhangyue
* @Date 2026-01-26 10:59:34
*/
@Mapper(componentModel = "spring")
public interface ArchivesReviewCoConvertor {
/**
* @param archivesReviewDOs
* @return
*/
List<ArchivesReviewCO> converDOsToCOs(List<ArchivesReviewDO> archivesReviewDOs);
}

View File

@ -0,0 +1,24 @@
package com.zcloud.edu.command.convertor.archives;
import com.zcloud.edu.dto.clientobject.archives.ArchivesReviewRecordCO;
import com.zcloud.edu.persistence.dataobject.archives.ArchivesReviewRecordDO;
import org.mapstruct.Mapper;
import java.util.List;
/**
* web-app
*
* @Author zhangyue
* @Date 2026-01-26 10:59:36
*/
@Mapper(componentModel = "spring")
public interface ArchivesReviewRecordCoConvertor {
/**
* @param archivesReviewRecordDOs
* @return
*/
List<ArchivesReviewRecordCO> converDOsToCOs(List<ArchivesReviewRecordDO> archivesReviewRecordDOs);
}

View File

@ -0,0 +1,42 @@
package com.zcloud.edu.command.query.archives;
import com.alibaba.cola.dto.PageResponse;
import com.zcloud.edu.command.convertor.archives.ArchivesReviewCoConvertor;
import com.zcloud.edu.dto.archives.ArchivesReviewPageQry;
import com.zcloud.edu.dto.clientobject.archives.ArchivesReviewCO;
import com.zcloud.edu.persistence.dataobject.archives.ArchivesReviewDO;
import com.zcloud.edu.persistence.repository.archives.ArchivesReviewRepository;
import com.zcloud.gbscommon.utils.PageQueryHelper;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
/**
* web-app
*
* @Author zhangyue
* @Date 2026-01-26 10:59:35
*/
@Component
@AllArgsConstructor
public class ArchivesReviewQueryExe {
private final ArchivesReviewRepository archivesReviewRepository;
private final ArchivesReviewCoConvertor archivesReviewCoConvertor;
/**
*
*
* @param archivesReviewPageQry
* @return
*/
public PageResponse<ArchivesReviewCO> execute(ArchivesReviewPageQry archivesReviewPageQry) {
Map<String, Object> params = PageQueryHelper.toHashMap(archivesReviewPageQry);
PageResponse<ArchivesReviewDO> pageResponse = archivesReviewRepository.listPage(params);
List<ArchivesReviewCO> examCenterCOS = archivesReviewCoConvertor.converDOsToCOs(pageResponse.getData());
return PageResponse.of(examCenterCOS, pageResponse.getTotalCount(), pageResponse.getPageSize(), pageResponse.getPageIndex());
}
}

View File

@ -0,0 +1,42 @@
package com.zcloud.edu.command.query.archives;
import com.alibaba.cola.dto.PageResponse;
import com.zcloud.edu.command.convertor.archives.ArchivesReviewRecordCoConvertor;
import com.zcloud.edu.dto.archives.ArchivesReviewRecordPageQry;
import com.zcloud.edu.dto.clientobject.archives.ArchivesReviewRecordCO;
import com.zcloud.edu.persistence.dataobject.archives.ArchivesReviewRecordDO;
import com.zcloud.edu.persistence.repository.archives.ArchivesReviewRecordRepository;
import com.zcloud.gbscommon.utils.PageQueryHelper;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
/**
* web-app
*
* @Author zhangyue
* @Date 2026-01-26 10:59:37
*/
@Component
@AllArgsConstructor
public class ArchivesReviewRecordQueryExe {
private final ArchivesReviewRecordRepository archivesReviewRecordRepository;
private final ArchivesReviewRecordCoConvertor archivesReviewRecordCoConvertor;
/**
*
*
* @param archivesReviewRecordPageQry
* @return
*/
public PageResponse<ArchivesReviewRecordCO> execute(ArchivesReviewRecordPageQry archivesReviewRecordPageQry) {
Map<String, Object> params = PageQueryHelper.toHashMap(archivesReviewRecordPageQry);
PageResponse<ArchivesReviewRecordDO> pageResponse = archivesReviewRecordRepository.listPage(params);
List<ArchivesReviewRecordCO> examCenterCOS = archivesReviewRecordCoConvertor.converDOsToCOs(pageResponse.getData());
return PageResponse.of(examCenterCOS, pageResponse.getTotalCount(), pageResponse.getPageSize(), pageResponse.getPageIndex());
}
}

View File

@ -65,8 +65,8 @@ public class ClassCurriculumQueryExe {
BeanUtils.copyProperties(classCurriculumDO, classCurriculumCO);
List<ClassCurriculumChapterCO> classCurriculumChapterCOList = classCurriculumChapterCoConvertor.converDOsToCOs(classCurriculumChapterDOList);
long videoCount = classCurriculumChapterCOList.stream().filter(bean -> !ObjectUtils.isEmpty(bean.getVideoCoursewareId())).count();
Tools.buildEntityTree(classCurriculumChapterCOList, "classCurriculumChapterId", "parentId", "childCurriculumChapterCOList", "0");
classCurriculumCO.setCurriculumChapterCOList(classCurriculumChapterCOList);
List<ClassCurriculumChapterCO> resultList = Tools.buildEntityTree(classCurriculumChapterCOList, "classCurriculumChapterId", "parentId", "childCurriculumChapterCOList", "0");
classCurriculumCO.setCurriculumChapterCOList(resultList);
classCurriculumCO.setVideoCount(videoCount);
return SingleResponse.of(classCurriculumCO);
}
@ -77,9 +77,9 @@ public class ClassCurriculumQueryExe {
List<String> classCurriculumIds = curList.stream().map(ClassCurriculumDO::getClassCurriculumId).collect(Collectors.toList());
List<ClassCurriculumChapterDO> chapterList = classCurriculumChapterRepository.listByClassCurriculumIds(classCurriculumIds);
List<ClassCurriculumChapterCO> chapterCoList = classCurriculumChapterCoConvertor.converDOsToCOs(chapterList);
Tools.buildEntityTree(chapterCoList, "classCurriculumChapterId", "parentId", "childCurriculumChapterCOList", "0");
List<ClassCurriculumChapterCO> resultList = Tools.buildEntityTree(chapterCoList, "classCurriculumChapterId", "parentId", "childCurriculumChapterCOList", "0");
Map<String, List<ClassCurriculumChapterCO>> chapterMap = chapterCoList.stream().collect(Collectors.groupingBy(ClassCurriculumChapterCO::getClassCurriculumId));
Map<String, List<ClassCurriculumChapterCO>> chapterMap = resultList.stream().collect(Collectors.groupingBy(ClassCurriculumChapterCO::getClassCurriculumId));
List<ClassCurriculumCO> curriculumList = classCurriculumCoConvertor.converDOsToCOs(curList);
curriculumList.stream().forEach(bean -> {
bean.setCurriculumChapterCOList(chapterMap.get(bean.getClassCurriculumId()));

View File

@ -1,15 +1,21 @@
package com.zcloud.edu.command.query.study;
import cn.hutool.core.bean.BeanUtil;
import com.alibaba.cola.dto.MultiResponse;
import com.alibaba.cola.dto.PageResponse;
import com.alibaba.cola.dto.SingleResponse;
import com.jjb.saas.framework.auth.model.SSOUser;
import com.jjb.saas.framework.auth.utils.AuthContext;
import com.zcloud.edu.command.convertor.study.ClassCoConvertor;
import com.zcloud.edu.command.convertor.study.StudentCoConvertor;
import com.zcloud.edu.dto.clientobject.study.ClassCO;
import com.zcloud.edu.dto.clientobject.study.StudentCO;
import com.zcloud.edu.dto.data.study.ClassCountDTO;
import com.zcloud.edu.dto.data.study.ClassQuestionDTO;
import com.zcloud.edu.dto.study.ClassCountQry;
import com.zcloud.edu.dto.study.ClassPageQry;
import com.zcloud.edu.persistence.dataobject.study.ClassDO;
import com.zcloud.edu.persistence.dataobject.study.StudentDO;
import com.zcloud.edu.persistence.mapper.po.study.ClassQuestionPO;
import com.zcloud.edu.persistence.mapper.po.study.StudentCountPO;
import com.zcloud.edu.persistence.repository.study.ClassRepository;
@ -37,6 +43,7 @@ public class ClassQueryExe {
private final ClassRepository classRepository;
private final ClassCoConvertor classCoConvertor;
private final StudentRepository studentRepository;
private final StudentCoConvertor studentCoConvertor;
/**
*
@ -124,5 +131,12 @@ public class ClassQueryExe {
BeanUtils.copyProperties(classDO, classCO);
return SingleResponse.of(classCO);
}
public MultiResponse<StudentCO> executeCountStuClass(ClassCountQry qry){
Map<String, Object> params = PageQueryHelper.toHashMap(qry);
List<StudentDO> studentDOList = studentRepository.countStuClass(params);
List<StudentCO> studentCOList = BeanUtil.copyToList(studentDOList, StudentCO.class);
return MultiResponse.of(studentCOList);
}
}

View File

@ -1,13 +1,19 @@
package com.zcloud.edu.command.query.study;
import com.alibaba.cola.dto.PageResponse;
import com.alibaba.cola.dto.SingleResponse;
import com.zcloud.edu.command.convertor.study.StudentExamRecordCoConvertor;
import com.zcloud.edu.command.convertor.study.StudentExamRecordItemCoConvertor;
import com.zcloud.edu.dto.clientobject.study.StudentExamRecordCO;
import com.zcloud.edu.dto.clientobject.study.StudentExamRecordItemCO;
import com.zcloud.edu.dto.study.StudentExamRecordPageQry;
import com.zcloud.edu.persistence.dataobject.study.StudentExamRecordDO;
import com.zcloud.edu.persistence.dataobject.study.StudentExamRecordItemDO;
import com.zcloud.edu.persistence.repository.study.StudentExamRecordItemRepository;
import com.zcloud.edu.persistence.repository.study.StudentExamRecordRepository;
import com.zcloud.gbscommon.utils.PageQueryHelper;
import lombok.AllArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Component;
import java.util.List;
@ -25,6 +31,8 @@ import java.util.Map;
public class StudentExamRecordQueryExe {
private final StudentExamRecordRepository studentExamRecordRepository;
private final StudentExamRecordCoConvertor studentExamRecordCoConvertor;
private final StudentExamRecordItemRepository studentExamRecordItemRepository;
private final StudentExamRecordItemCoConvertor studentExamRecordItemCoConvertor;
/**
*
@ -38,5 +46,14 @@ public class StudentExamRecordQueryExe {
List<StudentExamRecordCO> examCenterCOS = studentExamRecordCoConvertor.converDOsToCOs(pageResponse.getData());
return PageResponse.of(examCenterCOS, pageResponse.getTotalCount(), pageResponse.getPageSize(), pageResponse.getPageIndex());
}
public SingleResponse<StudentExamRecordCO> executeGetInfoByStudentId(String studentId){
StudentExamRecordDO studentExamRecordDO = studentExamRecordRepository.getInfoByStudentId(studentId);
StudentExamRecordCO studentExamRecordCO = new StudentExamRecordCO();
BeanUtils.copyProperties(studentExamRecordDO, studentExamRecordCO);
List<StudentExamRecordItemDO> recordList = studentExamRecordItemRepository.listByExamRecordId(studentExamRecordDO.getStudentExamRecordId());
List<StudentExamRecordItemCO> recordCoList = studentExamRecordItemCoConvertor.converDOsToCOs(recordList);
studentExamRecordCO.setExamRecordItemList(recordCoList);
return SingleResponse.of(studentExamRecordCO);
}
}

View File

@ -1,15 +1,23 @@
package com.zcloud.edu.command.query.study;
import cn.hutool.core.bean.BeanUtil;
import com.alibaba.cola.dto.PageResponse;
import com.alibaba.cola.dto.SingleResponse;
import com.zcloud.edu.command.convertor.study.StudentCoConvertor;
import com.zcloud.edu.domain.model.archives.PersonArchivesE;
import com.zcloud.edu.domain.model.study.*;
import com.zcloud.edu.dto.archives.ClassArchivesQry;
import com.zcloud.edu.dto.clientobject.study.StudentCO;
import com.zcloud.edu.dto.data.archives.PersonArchivesDTO;
import com.zcloud.edu.dto.study.StudentPageQry;
import com.zcloud.edu.persistence.dataobject.study.StudentDO;
import com.zcloud.edu.persistence.repository.study.StudentRepository;
import com.zcloud.edu.persistence.dataobject.study.*;
import com.zcloud.edu.persistence.repository.study.*;
import com.zcloud.gbscommon.utils.PageQueryHelper;
import lombok.AllArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ -25,6 +33,10 @@ import java.util.Map;
public class StudentQueryExe {
private final StudentRepository studentRepository;
private final StudentCoConvertor studentCoConvertor;
private final ClassRepository classRepository;
private final ClassCurriculumRepository classCurriculumRepository;
private final ClassCurriculumChapterRepository classCurriculumChapterRepository;
private final StudentSignRepository studentSignRepository;
/**
*
@ -38,5 +50,89 @@ public class StudentQueryExe {
List<StudentCO> examCenterCOS = studentCoConvertor.converDOsToCOs(pageResponse.getData());
return PageResponse.of(examCenterCOS, pageResponse.getTotalCount(), pageResponse.getPageSize(), pageResponse.getPageIndex());
}
public SingleResponse<PersonArchivesDTO> executeAttendanceRecord(ClassArchivesQry qry){
StudentDO studentDO = studentRepository.getById(qry.getStuId());
StudentE studentE = new StudentE();
BeanUtils.copyProperties(studentDO, studentE);
ClassDO classDO = classRepository.getByClassId(studentDO.getClassId());
ClassE classE = new ClassE();
BeanUtils.copyProperties(classDO, classE);
// 课程信息
ClassCurriculumE classCurriculumE = new ClassCurriculumE();
Map<String, Object> params = classCurriculumE.initListAllParams(studentDO.getClassId());
List<ClassCurriculumDO> curEList = classCurriculumRepository.listAll(params);
List<ClassCurriculumE> classCurList = BeanUtil.copyToList(curEList, ClassCurriculumE.class);
// 课件信息
List<ClassCurriculumChapterDO> classChapterList = classCurriculumChapterRepository.listVideoByClassId(classE.getClassId());
List<ClassCurriculumChapterE> classChapterEList = BeanUtil.copyToList(classChapterList, ClassCurriculumChapterE.class);
PersonArchivesE personArchivesE = new PersonArchivesE();
personArchivesE.initAttendanceRecord(studentE, classE, classChapterEList, classCurList);
PersonArchivesDTO personArchivesDTO = new PersonArchivesDTO();
BeanUtils.copyProperties(personArchivesE, personArchivesDTO);
return SingleResponse.of(personArchivesDTO);
}
public SingleResponse<PersonArchivesDTO> executeStudyArchives(ClassArchivesQry qry){
// 学员信息
StudentDO studentDO = studentRepository.getById(qry.getStuId());
StudentDO studentUrl = studentRepository.findFaceUrlByPhone(studentDO.getPhone());
StudentE studentE = new StudentE();
studentE.setUserAvatarUrl(studentUrl.getUserAvatarUrl());
BeanUtils.copyProperties(studentDO, studentE);
// 班级信息
ClassDO classDO = classRepository.getByClassId(studentDO.getClassId());
ClassE classE = new ClassE();
BeanUtils.copyProperties(classDO, classE);
// 课程信息
ClassCurriculumE classCurriculumE = new ClassCurriculumE();
Map<String, Object> params = classCurriculumE.initListAllParams(studentDO.getClassId());
List<ClassCurriculumDO> curEList = classCurriculumRepository.listAll(params);
List<ClassCurriculumE> classCurList = BeanUtil.copyToList(curEList, ClassCurriculumE.class);
PersonArchivesE personArchivesE = new PersonArchivesE();
personArchivesE.init(studentE, classE, classCurList);
PersonArchivesDTO personArchivesDTO = new PersonArchivesDTO();
BeanUtils.copyProperties(personArchivesE, personArchivesDTO);
return SingleResponse.of(personArchivesDTO);
}
public SingleResponse<PersonArchivesDTO> executeStudyRecord(ClassArchivesQry qry){
StudentDO studentDO = studentRepository.getById(qry.getStuId());
StudentE studentE = new StudentE();
BeanUtils.copyProperties(studentDO, studentE);
ClassDO classDO = classRepository.getByClassId(studentDO.getClassId());
ClassE classE = new ClassE();
BeanUtils.copyProperties(classDO, classE);
// 课程信息
ClassCurriculumE classCurriculumE = new ClassCurriculumE();
Map<String, Object> params = classCurriculumE.initListAllParams(studentDO.getClassId());
List<ClassCurriculumDO> curEList = classCurriculumRepository.listAll(params);
List<ClassCurriculumE> classCurList = BeanUtil.copyToList(curEList, ClassCurriculumE.class);
// 签到照片
params.put("studentId", studentDO.getStudentId());
List<StudentSignDO> studentSignList = studentSignRepository.listAllByStudentId(params);
List<StudentSignE> studentSignEList = BeanUtil.copyToList(studentSignList, StudentSignE.class);
PersonArchivesE personArchivesE = new PersonArchivesE();
personArchivesE.initStudyRecord(studentE, classE, studentSignEList, classCurList);
PersonArchivesDTO personArchivesDTO = new PersonArchivesDTO();
BeanUtils.copyProperties(personArchivesE, personArchivesDTO);
return SingleResponse.of(personArchivesDTO);
}
}

View File

@ -3,8 +3,10 @@ package com.zcloud.edu.command.query.study;
import com.alibaba.cola.dto.MultiResponse;
import com.alibaba.cola.dto.PageResponse;
import com.alibaba.cola.dto.Response;
import com.alibaba.cola.dto.SingleResponse;
import com.zcloud.edu.command.convertor.study.StudentSignCoConvertor;
import com.zcloud.edu.domain.model.study.ClassE;
import com.zcloud.edu.dto.clientobject.study.StudentCO;
import com.zcloud.edu.dto.clientobject.study.StudentSignCO;
import com.zcloud.edu.dto.study.ClassAppSignQry;
import com.zcloud.edu.dto.study.StudentSignPageQry;
@ -65,7 +67,7 @@ public class StudentSignQueryExe {
}
public Response executeVerify(StudentSignVerifyQry qry) {
public SingleResponse<StudentCO> executeVerify(StudentSignVerifyQry qry) {
ClassDO classDO = classRepository.getByClassId(qry.getClassId());
ClassE classE = new ClassE();
BeanUtils.copyProperties(classDO, classE);
@ -78,7 +80,7 @@ public class StudentSignQueryExe {
throw new RuntimeException("您已经完成此班级的学习");
}
Map<String, Object> params = new HashMap<>();
params.put("student_id", studentDO.getStudentId());
params.put("studentId", studentDO.getStudentId());
params.put("type", qry.getType());
if (qry.getType() == 1){
List<StudentSignDO> list = studentSignRepository.listAllByStudentId(params);
@ -91,7 +93,9 @@ public class StudentSignQueryExe {
throw new RuntimeException("您已经没有考试次数");
}
}
return MultiResponse.buildSuccess();
StudentCO studentCO = new StudentCO();
BeanUtils.copyProperties(studentDO, studentCO);
return SingleResponse.of(studentCO);
}
}

View File

@ -3,9 +3,12 @@ package com.zcloud.edu.command.study;
import com.alibaba.cola.exception.BizException;
import com.zcloud.edu.domain.gateway.study.StudentSignGateway;
import com.zcloud.edu.domain.model.study.StudentSignE;
import com.zcloud.edu.dto.clientobject.study.StudentSignCO;
import com.zcloud.edu.dto.study.StudentSignAddCmd;
import com.zcloud.edu.persistence.dataobject.study.StudentDO;
import com.zcloud.edu.persistence.repository.study.StudentRepository;
import com.zcloud.gbscommon.utils.Base64Util;
import com.zcloud.gbscommon.utils.Tools;
import com.zcloud.gbscommon.zcloudimgfiles.facade.ZcloudImgFilesFacade;
import lombok.AllArgsConstructor;
import org.apache.dubbo.config.annotation.DubboReference;
@ -14,6 +17,8 @@ import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.ObjectUtils;
import java.io.IOException;
/**
* web-app
@ -30,33 +35,39 @@ public class StudentSignAddExe {
private ZcloudImgFilesFacade zcloudImgFilesFacade;
@Transactional(rollbackFor = Exception.class)
public boolean execute(StudentSignAddCmd cmd) {
public StudentSignCO execute(StudentSignAddCmd cmd) {
StudentDO stu = studentRepository.findInfoByStudentId(cmd.getStudentId());
StudentSignE studentSignE = new StudentSignE();
BeanUtils.copyProperties(cmd, studentSignE);
StudentDO student = studentRepository.findFaceUrlByPhone(studentSignE.getPhone());
StudentDO student = studentRepository.findFaceUrlByPhone(stu.getPhone());
if (student == null || ObjectUtils.isEmpty(student.getUserAvatarUrl())) {
throw new RuntimeException("您还没有录入人脸");
}
String faceUrl = null;
try {
studentSignE.compareFace(student.getUserAvatarUrl());
faceUrl = Base64Util.getBase64String(studentSignE.getFiles()[0]);
studentSignE.compareFace(student.getUserAvatarUrl(), faceUrl);
} catch (Exception e) {
throw new RuntimeException(e);
}
String path = studentSignE.getType() == 1 ? "clockSign" : "examSign";
studentSignE.setFaceUrl(zcloudImgFilesFacade.saveFile(studentSignE.getFiles()[0], path));
String fileName = Tools.get32UUID() + studentSignE.getFiles()[0].getOriginalFilename().substring(studentSignE.getFiles()[0].getOriginalFilename().lastIndexOf("."));
studentSignE.setFaceUrl(zcloudImgFilesFacade.saveFile( faceUrl,fileName, path));
studentSignE.init(stu.getStudentId(), stu.getClassId(), stu.getClassCorpinfoId());
boolean res = false;
StudentSignCO studentSignCO = new StudentSignCO();
try {
res = studentSignGateway.add(studentSignE);
BeanUtils.copyProperties(studentSignE, studentSignCO);
} catch (Exception e) {
throw new RuntimeException(e);
}
if (!res) {
throw new BizException("保存失败");
}
return true;
return studentSignCO;
}
}

View File

@ -0,0 +1,59 @@
package com.zcloud.edu.service.archives;
import com.alibaba.cola.dto.PageResponse;
import com.alibaba.cola.dto.SingleResponse;
import com.zcloud.edu.api.archives.ArchivesReviewRecordServiceI;
import com.zcloud.edu.command.archives.ArchivesReviewRecordAddExe;
import com.zcloud.edu.command.archives.ArchivesReviewRecordRemoveExe;
import com.zcloud.edu.command.archives.ArchivesReviewRecordUpdateExe;
import com.zcloud.edu.command.query.archives.ArchivesReviewRecordQueryExe;
import com.zcloud.edu.dto.archives.ArchivesReviewRecordAddCmd;
import com.zcloud.edu.dto.archives.ArchivesReviewRecordPageQry;
import com.zcloud.edu.dto.archives.ArchivesReviewRecordUpdateCmd;
import com.zcloud.edu.dto.clientobject.archives.ArchivesReviewRecordCO;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
/**
* web-app
*
* @Author zhangyue
* @Date 2026-01-26 10:59:37
*/
@Service
@AllArgsConstructor
public class ArchivesReviewRecordServiceImpl implements ArchivesReviewRecordServiceI {
private final ArchivesReviewRecordAddExe archivesReviewRecordAddExe;
private final ArchivesReviewRecordUpdateExe archivesReviewRecordUpdateExe;
private final ArchivesReviewRecordRemoveExe archivesReviewRecordRemoveExe;
private final ArchivesReviewRecordQueryExe archivesReviewRecordQueryExe;
@Override
public PageResponse<ArchivesReviewRecordCO> listPage(ArchivesReviewRecordPageQry qry) {
return archivesReviewRecordQueryExe.execute(qry);
}
@Override
public SingleResponse add(ArchivesReviewRecordAddCmd cmd) {
archivesReviewRecordAddExe.execute(cmd);
return SingleResponse.buildSuccess();
}
@Override
public void edit(ArchivesReviewRecordUpdateCmd archivesReviewRecordUpdateCmd) {
archivesReviewRecordUpdateExe.execute(archivesReviewRecordUpdateCmd);
}
@Override
public void remove(Long id) {
archivesReviewRecordRemoveExe.execute(id);
}
@Override
public void removeBatch(Long[] ids) {
archivesReviewRecordRemoveExe.execute(ids);
}
}

View File

@ -0,0 +1,59 @@
package com.zcloud.edu.service.archives;
import com.alibaba.cola.dto.PageResponse;
import com.alibaba.cola.dto.SingleResponse;
import com.zcloud.edu.api.archives.ArchivesReviewServiceI;
import com.zcloud.edu.command.archives.ArchivesReviewAddExe;
import com.zcloud.edu.command.archives.ArchivesReviewRemoveExe;
import com.zcloud.edu.command.archives.ArchivesReviewUpdateExe;
import com.zcloud.edu.command.query.archives.ArchivesReviewQueryExe;
import com.zcloud.edu.dto.archives.ArchivesReviewAddCmd;
import com.zcloud.edu.dto.archives.ArchivesReviewPageQry;
import com.zcloud.edu.dto.archives.ArchivesReviewUpdateCmd;
import com.zcloud.edu.dto.clientobject.archives.ArchivesReviewCO;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
/**
* web-app
*
* @Author zhangyue
* @Date 2026-01-26 10:59:35
*/
@Service
@AllArgsConstructor
public class ArchivesReviewServiceImpl implements ArchivesReviewServiceI {
private final ArchivesReviewAddExe archivesReviewAddExe;
private final ArchivesReviewUpdateExe archivesReviewUpdateExe;
private final ArchivesReviewRemoveExe archivesReviewRemoveExe;
private final ArchivesReviewQueryExe archivesReviewQueryExe;
@Override
public PageResponse<ArchivesReviewCO> listPage(ArchivesReviewPageQry qry) {
return archivesReviewQueryExe.execute(qry);
}
@Override
public SingleResponse add(ArchivesReviewAddCmd cmd) {
archivesReviewAddExe.execute(cmd);
return SingleResponse.buildSuccess();
}
@Override
public void edit(ArchivesReviewUpdateCmd archivesReviewUpdateCmd) {
archivesReviewUpdateExe.execute(archivesReviewUpdateCmd);
}
@Override
public void remove(Long id) {
archivesReviewRemoveExe.execute(id);
}
@Override
public void removeBatch(Long[] ids) {
archivesReviewRemoveExe.execute(ids);
}
}

View File

@ -9,12 +9,10 @@ import com.zcloud.edu.command.study.ClassAddExe;
import com.zcloud.edu.command.study.ClassRemoveExe;
import com.zcloud.edu.command.study.ClassUpdateExe;
import com.zcloud.edu.dto.clientobject.study.ClassCO;
import com.zcloud.edu.dto.clientobject.study.StudentCO;
import com.zcloud.edu.dto.data.study.ClassCountDTO;
import com.zcloud.edu.dto.data.study.ClassQuestionDTO;
import com.zcloud.edu.dto.study.ClassAddCmd;
import com.zcloud.edu.dto.study.ClassPageQry;
import com.zcloud.edu.dto.study.ClassPostponeCmd;
import com.zcloud.edu.dto.study.ClassUpdateCmd;
import com.zcloud.edu.dto.study.*;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
@ -85,5 +83,10 @@ public class ClassServiceImpl implements ClassServiceI {
public SingleResponse<ClassCountDTO> statisticsCount(ClassPageQry qry) {
return classQueryExe.executeStatisticsCount(qry);
}
@Override
public MultiResponse<StudentCO> countStuClass(ClassCountQry qry) {
return classQueryExe.executeCountStuClass(qry);
}
}

View File

@ -55,5 +55,10 @@ public class StudentExamRecordServiceImpl implements StudentExamRecordServiceI {
public void removeBatch(Long[] ids) {
studentExamRecordRemoveExe.execute(ids);
}
@Override
public SingleResponse<StudentExamRecordCO> getInfoByStudentId(String studentId) {
return studentExamRecordQueryExe.executeGetInfoByStudentId(studentId);
}
}

View File

@ -7,7 +7,9 @@ import com.zcloud.edu.command.query.study.StudentQueryExe;
import com.zcloud.edu.command.study.StudentAddExe;
import com.zcloud.edu.command.study.StudentRemoveExe;
import com.zcloud.edu.command.study.StudentUpdateExe;
import com.zcloud.edu.dto.archives.ClassArchivesQry;
import com.zcloud.edu.dto.clientobject.study.StudentCO;
import com.zcloud.edu.dto.data.archives.PersonArchivesDTO;
import com.zcloud.edu.dto.study.StudentAddCmd;
import com.zcloud.edu.dto.study.StudentPageQry;
import com.zcloud.edu.dto.study.StudentUpdateCmd;
@ -57,5 +59,19 @@ public class StudentServiceImpl implements StudentServiceI {
public void removeBatch(Long[] ids) {
studentRemoveExe.execute(ids);
}
@Override
public SingleResponse<PersonArchivesDTO> getAttendanceRecord(ClassArchivesQry qry) {
return studentQueryExe.executeAttendanceRecord(qry);
}
@Override
public SingleResponse<PersonArchivesDTO> getStudyArchives(ClassArchivesQry qry) {
return studentQueryExe.executeStudyArchives(qry);
}
@Override
public SingleResponse<PersonArchivesDTO> getStudyRecord(ClassArchivesQry qry) {
return studentQueryExe.executeStudyRecord(qry);
}
}

View File

@ -9,6 +9,7 @@ import com.zcloud.edu.command.query.study.StudentSignQueryExe;
import com.zcloud.edu.command.study.StudentSignAddExe;
import com.zcloud.edu.command.study.StudentSignRemoveExe;
import com.zcloud.edu.command.study.StudentSignUpdateExe;
import com.zcloud.edu.dto.clientobject.study.StudentCO;
import com.zcloud.edu.dto.clientobject.study.StudentSignCO;
import com.zcloud.edu.dto.study.*;
import lombok.AllArgsConstructor;
@ -35,10 +36,9 @@ public class StudentSignServiceImpl implements StudentSignServiceI {
}
@Override
public SingleResponse add(StudentSignAddCmd cmd) {
public SingleResponse<StudentSignCO> add(StudentSignAddCmd cmd) {
studentSignAddExe.execute(cmd);
return SingleResponse.buildSuccess();
return SingleResponse.of(studentSignAddExe.execute(cmd));
}
@Override
@ -62,7 +62,7 @@ public class StudentSignServiceImpl implements StudentSignServiceI {
}
@Override
public Response verify(StudentSignVerifyQry qry) {
public SingleResponse<StudentCO> verify(StudentSignVerifyQry qry) {
return studentSignQueryExe.executeVerify(qry);
}
}

View File

@ -0,0 +1,27 @@
package com.zcloud.edu.api.archives;
import com.alibaba.cola.dto.PageResponse;
import com.alibaba.cola.dto.SingleResponse;
import com.zcloud.edu.dto.archives.ArchivesReviewRecordAddCmd;
import com.zcloud.edu.dto.archives.ArchivesReviewRecordPageQry;
import com.zcloud.edu.dto.archives.ArchivesReviewRecordUpdateCmd;
import com.zcloud.edu.dto.clientobject.archives.ArchivesReviewRecordCO;
/**
* web-client
*
* @Author zhangyue
* @Date 2026-01-26 10:59:37
*/
public interface ArchivesReviewRecordServiceI {
PageResponse<ArchivesReviewRecordCO> listPage(ArchivesReviewRecordPageQry qry);
SingleResponse<ArchivesReviewRecordCO> add(ArchivesReviewRecordAddCmd cmd);
void edit(ArchivesReviewRecordUpdateCmd cmd);
void remove(Long id);
void removeBatch(Long[] ids);
}

View File

@ -0,0 +1,27 @@
package com.zcloud.edu.api.archives;
import com.alibaba.cola.dto.PageResponse;
import com.alibaba.cola.dto.SingleResponse;
import com.zcloud.edu.dto.archives.ArchivesReviewAddCmd;
import com.zcloud.edu.dto.archives.ArchivesReviewPageQry;
import com.zcloud.edu.dto.archives.ArchivesReviewUpdateCmd;
import com.zcloud.edu.dto.clientobject.archives.ArchivesReviewCO;
/**
* web-client
*
* @Author zhangyue
* @Date 2026-01-26 10:59:35
*/
public interface ArchivesReviewServiceI {
PageResponse<ArchivesReviewCO> listPage(ArchivesReviewPageQry qry);
SingleResponse<ArchivesReviewCO> add(ArchivesReviewAddCmd cmd);
void edit(ArchivesReviewUpdateCmd cmd);
void remove(Long id);
void removeBatch(Long[] ids);
}

View File

@ -4,12 +4,10 @@ import com.alibaba.cola.dto.MultiResponse;
import com.alibaba.cola.dto.PageResponse;
import com.alibaba.cola.dto.SingleResponse;
import com.zcloud.edu.dto.clientobject.study.ClassCO;
import com.zcloud.edu.dto.clientobject.study.StudentCO;
import com.zcloud.edu.dto.data.study.ClassCountDTO;
import com.zcloud.edu.dto.data.study.ClassQuestionDTO;
import com.zcloud.edu.dto.study.ClassAddCmd;
import com.zcloud.edu.dto.study.ClassPageQry;
import com.zcloud.edu.dto.study.ClassPostponeCmd;
import com.zcloud.edu.dto.study.ClassUpdateCmd;
import com.zcloud.edu.dto.study.*;
/**
* web-client
@ -40,5 +38,7 @@ public interface ClassServiceI {
PageResponse<ClassCO> appListPage(ClassPageQry qry);
SingleResponse<ClassCountDTO> statisticsCount(ClassPageQry qry);
MultiResponse<StudentCO> countStuClass(ClassCountQry qry);
}

View File

@ -23,5 +23,7 @@ public interface StudentExamRecordServiceI {
void remove(Long id);
void removeBatch(Long[] ids);
SingleResponse<StudentExamRecordCO> getInfoByStudentId(String studentId);
}

View File

@ -2,7 +2,9 @@ package com.zcloud.edu.api.study;
import com.alibaba.cola.dto.PageResponse;
import com.alibaba.cola.dto.SingleResponse;
import com.zcloud.edu.dto.archives.ClassArchivesQry;
import com.zcloud.edu.dto.clientobject.study.StudentCO;
import com.zcloud.edu.dto.data.archives.PersonArchivesDTO;
import com.zcloud.edu.dto.study.StudentAddCmd;
import com.zcloud.edu.dto.study.StudentPageQry;
import com.zcloud.edu.dto.study.StudentUpdateCmd;
@ -25,5 +27,11 @@ public interface StudentServiceI {
void remove(Long id);
void removeBatch(Long[] ids);
SingleResponse<PersonArchivesDTO> getAttendanceRecord(ClassArchivesQry qry);
SingleResponse<PersonArchivesDTO> getStudyArchives(ClassArchivesQry qry);
SingleResponse<PersonArchivesDTO> getStudyRecord(ClassArchivesQry qry);
}

View File

@ -4,6 +4,7 @@ import com.alibaba.cola.dto.MultiResponse;
import com.alibaba.cola.dto.PageResponse;
import com.alibaba.cola.dto.Response;
import com.alibaba.cola.dto.SingleResponse;
import com.zcloud.edu.dto.clientobject.study.StudentCO;
import com.zcloud.edu.dto.clientobject.study.StudentSignCO;
import com.zcloud.edu.dto.study.*;
@ -26,6 +27,6 @@ public interface StudentSignServiceI {
MultiResponse<StudentSignCO> listAll(ClassAppSignQry qry);
Response verify(StudentSignVerifyQry qry);
SingleResponse<StudentCO> verify(StudentSignVerifyQry qry);
}

View File

@ -0,0 +1,77 @@
package com.zcloud.edu.dto.archives;
import com.alibaba.cola.dto.Command;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.time.LocalDateTime;
/**
* web-client
*
* @Author zhangyue
* @Date 2026-01-26 10:59:34
*/
@EqualsAndHashCode(callSuper = true)
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ArchivesReviewAddCmd extends Command {
@ApiModelProperty(value = "业务id", name = "archivesReviewId", required = true)
@NotEmpty(message = "业务id不能为空")
private String archivesReviewId;
@ApiModelProperty(value = "课程id", name = "classCurriculumId", required = true)
@NotEmpty(message = "课程id不能为空")
private String classCurriculumId;
@ApiModelProperty(value = "班级id", name = "classId", required = true)
@NotEmpty(message = "班级id不能为空")
private String classId;
@ApiModelProperty(value = "初版书号", name = "bookNum", required = true)
@NotEmpty(message = "初版书号不能为空")
private String bookNum;
@ApiModelProperty(value = "班级所属企业id", name = "corpinfoId", required = true)
@NotNull(message = "班级所属企业id不能为空")
private Integer corpinfoId;
@ApiModelProperty(value = "编写单位", name = "corpName", required = true)
@NotEmpty(message = "编写单位不能为空")
private String corpName;
@ApiModelProperty(value = "编写时间", name = "writeDate", required = true)
@NotNull(message = "编写时间不能为空")
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDateTime writeDate;
@ApiModelProperty(value = "教材类型", name = "materialType", required = true)
@NotEmpty(message = "教材类型不能为空")
private String materialType;
@ApiModelProperty(value = "会审地点", name = "address", required = true)
@NotEmpty(message = "会审地点不能为空")
private String address;
@ApiModelProperty(value = "主持人", name = "compere", required = true)
@NotEmpty(message = "主持人不能为空")
private String compere;
@ApiModelProperty(value = "会审时间", name = "auditDate", required = true)
@NotNull(message = "会审时间不能为空")
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDateTime auditDate;
@ApiModelProperty(value = "会审意见", name = "reviewOpinions", required = true)
@NotEmpty(message = "会审意见不能为空")
private String reviewOpinions;
}

View File

@ -0,0 +1,28 @@
package com.zcloud.edu.dto.archives;
import com.alibaba.cola.dto.PageQuery;
import lombok.Data;
/**
* web-client
*
* @Author zhangyue
* @Date 2026-01-26 10:59:35
*/
@Data
public class ArchivesReviewPageQry extends PageQuery {
/**
* ,
* - `like`: SQLLIKE
* - `eq`: SQL=
* - `gt`:
* - `lt`:
* - `ge`:
* - `le`:
* - `ne`: SQL!=
*/
private String likeArchivesReviewId;
}

View File

@ -0,0 +1,48 @@
package com.zcloud.edu.dto.archives;
import com.alibaba.cola.dto.Command;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotEmpty;
/**
* web-client
*
* @Author zhangyue
* @Date 2026-01-26 10:59:36
*/
@EqualsAndHashCode(callSuper = true)
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ArchivesReviewRecordAddCmd extends Command {
@ApiModelProperty(value = "业务id", name = "archivesReviewRecordId", required = true)
@NotEmpty(message = "业务id不能为空")
private String archivesReviewRecordId;
@ApiModelProperty(value = "会审表id", name = "archivesReviewId", required = true)
@NotEmpty(message = "会审表id不能为空")
private String archivesReviewId;
@ApiModelProperty(value = "会审人员", name = "reviewUser", required = true)
@NotEmpty(message = "会审人员不能为空")
private String reviewUser;
@ApiModelProperty(value = "工作部门", name = "department", required = true)
@NotEmpty(message = "工作部门不能为空")
private String department;
@ApiModelProperty(value = "职务/职称", name = "duties", required = true)
@NotEmpty(message = "职务/职称不能为空")
private String duties;
@ApiModelProperty(value = "审查意见", name = "checkOpinion", required = true)
@NotEmpty(message = "审查意见不能为空")
private String checkOpinion;
}

View File

@ -0,0 +1,28 @@
package com.zcloud.edu.dto.archives;
import com.alibaba.cola.dto.PageQuery;
import lombok.Data;
/**
* web-client
*
* @Author zhangyue
* @Date 2026-01-26 10:59:37
*/
@Data
public class ArchivesReviewRecordPageQry extends PageQuery {
/**
* ,
* - `like`: SQLLIKE
* - `eq`: SQL=
* - `gt`:
* - `lt`:
* - `ge`:
* - `le`:
* - `ne`: SQL!=
*/
private String likeArchivesReviewRecordId;
}

View File

@ -0,0 +1,46 @@
package com.zcloud.edu.dto.archives;
import com.alibaba.cola.dto.Command;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
/**
* web-client
*
* @Author zhangyue
* @Date 2026-01-26 10:59:37
*/
@EqualsAndHashCode(callSuper = true)
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ArchivesReviewRecordUpdateCmd extends Command {
@ApiModelProperty(value = "主键", name = "id", required = true)
@NotNull(message = "主键不能为空")
private Long id;
@ApiModelProperty(value = "业务id", name = "archivesReviewRecordId", required = true)
@NotEmpty(message = "业务id不能为空")
private String archivesReviewRecordId;
@ApiModelProperty(value = "会审表id", name = "archivesReviewId", required = true)
@NotEmpty(message = "会审表id不能为空")
private String archivesReviewId;
@ApiModelProperty(value = "会审人员", name = "reviewUser", required = true)
@NotEmpty(message = "会审人员不能为空")
private String reviewUser;
@ApiModelProperty(value = "工作部门", name = "department", required = true)
@NotEmpty(message = "工作部门不能为空")
private String department;
@ApiModelProperty(value = "职务/职称", name = "duties", required = true)
@NotEmpty(message = "职务/职称不能为空")
private String duties;
@ApiModelProperty(value = "审查意见", name = "checkOpinion", required = true)
@NotEmpty(message = "审查意见不能为空")
private String checkOpinion;
}

View File

@ -0,0 +1,68 @@
package com.zcloud.edu.dto.archives;
import com.alibaba.cola.dto.Command;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.time.LocalDateTime;
/**
* web-client
*
* @Author zhangyue
* @Date 2026-01-26 10:59:35
*/
@EqualsAndHashCode(callSuper = true)
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ArchivesReviewUpdateCmd extends Command {
@ApiModelProperty(value = "${column.comment}", name = "id", required = true)
@NotNull(message = "${column.comment}不能为空")
private Long id;
@ApiModelProperty(value = "业务id", name = "archivesReviewId", required = true)
@NotEmpty(message = "业务id不能为空")
private String archivesReviewId;
@ApiModelProperty(value = "课程id", name = "classCurriculumId", required = true)
@NotEmpty(message = "课程id不能为空")
private String classCurriculumId;
@ApiModelProperty(value = "班级id", name = "classId", required = true)
@NotEmpty(message = "班级id不能为空")
private String classId;
@ApiModelProperty(value = "初版书号", name = "bookNum", required = true)
@NotEmpty(message = "初版书号不能为空")
private String bookNum;
@ApiModelProperty(value = "班级所属企业id", name = "corpinfoId", required = true)
@NotNull(message = "班级所属企业id不能为空")
private Integer corpinfoId;
@ApiModelProperty(value = "编写单位", name = "corpName", required = true)
@NotEmpty(message = "编写单位不能为空")
private String corpName;
@ApiModelProperty(value = "编写时间", name = "writeDate", required = true)
@NotNull(message = "编写时间不能为空")
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDateTime writeDate;
@ApiModelProperty(value = "教材类型", name = "materialType", required = true)
@NotEmpty(message = "教材类型不能为空")
private String materialType;
@ApiModelProperty(value = "会审地点", name = "address", required = true)
@NotEmpty(message = "会审地点不能为空")
private String address;
@ApiModelProperty(value = "主持人", name = "compere", required = true)
@NotEmpty(message = "主持人不能为空")
private String compere;
@ApiModelProperty(value = "会审时间", name = "auditDate", required = true)
@NotNull(message = "会审时间不能为空")
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDateTime auditDate;
@ApiModelProperty(value = "会审意见", name = "reviewOpinions", required = true)
@NotEmpty(message = "会审意见不能为空")
private String reviewOpinions;
}

View File

@ -0,0 +1,30 @@
package com.zcloud.edu.dto.archives;
import com.alibaba.cola.dto.PageQuery;
import lombok.Data;
/**
* web-client
*
* @Author zhangyue
* @Date 2026-01-13 14:18:12
*/
@Data
public class ClassArchivesQry {
/**
* ,
* - `like`: SQLLIKE
* - `eq`: SQL=
* - `gt`:
* - `lt`:
* - `ge`:
* - `le`:
* - `ne`: SQL!=
*/
private Long stuId;
private String studentId;
}

View File

@ -0,0 +1,97 @@
package com.zcloud.edu.dto.clientobject.archives;
import com.alibaba.cola.dto.ClientObject;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
/**
* web-client
*
* @Author zhangyue
* @Date 2026-01-26 10:59:34
*/
@Data
public class ArchivesReviewCO extends ClientObject {
private Long id;
//业务id
@ApiModelProperty(value = "业务id")
private String archivesReviewId;
//课程id
@ApiModelProperty(value = "课程id")
private String classCurriculumId;
//班级id
@ApiModelProperty(value = "班级id")
private String classId;
//初版书号
@ApiModelProperty(value = "初版书号")
private String bookNum;
//班级所属企业id
@ApiModelProperty(value = "班级所属企业id")
private Integer corpinfoId;
//编写单位
@ApiModelProperty(value = "编写单位")
private String corpName;
//编写时间
@ApiModelProperty(value = "编写时间")
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDateTime writeDate;
//教材类型
@ApiModelProperty(value = "教材类型")
private String materialType;
//会审地点
@ApiModelProperty(value = "会审地点")
private String address;
//主持人
@ApiModelProperty(value = "主持人")
private String compere;
//会审时间
@ApiModelProperty(value = "会审时间")
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDateTime auditDate;
//会审意见
@ApiModelProperty(value = "会审意见")
private String reviewOpinions;
//删除标识true false
@ApiModelProperty(value = "删除标识true false")
private String deleteEnum;
//备注
@ApiModelProperty(value = "备注")
private String remarks;
//创建人姓名
@ApiModelProperty(value = "创建人姓名")
private String createName;
//更新人姓名
@ApiModelProperty(value = "更新人姓名")
private String updateName;
//租户id
@ApiModelProperty(value = "租户id")
private Long tenantId;
//单位id
@ApiModelProperty(value = "单位id")
private Long orgId;
//版本
@ApiModelProperty(value = "版本")
private Integer version;
//创建时间
@ApiModelProperty(value = "创建时间")
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDateTime createTime;
//修改时间
@ApiModelProperty(value = "修改时间")
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDateTime updateTime;
//创建人id
@ApiModelProperty(value = "创建人id")
private Long createId;
//修改人id
@ApiModelProperty(value = "修改人id")
private Long updateId;
//环境
@ApiModelProperty(value = "环境")
private String env;
}

View File

@ -0,0 +1,79 @@
package com.zcloud.edu.dto.clientobject.archives;
import com.alibaba.cola.dto.ClientObject;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
/**
* web-client
*
* @Author zhangyue
* @Date 2026-01-26 10:59:36
*/
@Data
public class ArchivesReviewRecordCO extends ClientObject {
//主键
@ApiModelProperty(value = "主键")
private Long id;
//业务id
@ApiModelProperty(value = "业务id")
private String archivesReviewRecordId;
//会审表id
@ApiModelProperty(value = "会审表id")
private String archivesReviewId;
//会审人员
@ApiModelProperty(value = "会审人员")
private String reviewUser;
//工作部门
@ApiModelProperty(value = "工作部门")
private String department;
//职务/职称
@ApiModelProperty(value = "职务/职称")
private String duties;
//审查意见
@ApiModelProperty(value = "审查意见")
private String checkOpinion;
//删除标识true false
@ApiModelProperty(value = "删除标识true false")
private String deleteEnum;
//备注
@ApiModelProperty(value = "备注")
private String remarks;
//创建人姓名
@ApiModelProperty(value = "创建人姓名")
private String createName;
//更新人姓名
@ApiModelProperty(value = "更新人姓名")
private String updateName;
//租户id
@ApiModelProperty(value = "租户id")
private Long tenantId;
//单位id
@ApiModelProperty(value = "单位id")
private Long orgId;
//版本
@ApiModelProperty(value = "版本")
private Integer version;
//创建时间
@ApiModelProperty(value = "创建时间")
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDateTime createTime;
//修改时间
@ApiModelProperty(value = "修改时间")
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDateTime updateTime;
//创建人id
@ApiModelProperty(value = "创建人id")
private Long createId;
//修改人id
@ApiModelProperty(value = "修改人id")
private Long updateId;
//环境
@ApiModelProperty(value = "环境")
private String env;
}

View File

@ -64,6 +64,14 @@ public class ClassCO extends ClientObject {
//考试次数只有考试时候有用
@ApiModelProperty(value = "考试次数只有考试时候有用")
private Integer numberofexams;
@ApiModelProperty(value = "学员id(雪花)")
private Long stuId;
@ApiModelProperty(value = "学员id(uuid)")
private String studentId;
//删除标识true false
@ApiModelProperty(value = "删除标识true false")
private String deleteEnum;

View File

@ -1,6 +1,7 @@
package com.zcloud.edu.dto.clientobject.study;
import com.alibaba.cola.dto.ClientObject;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@ -95,6 +96,18 @@ public class StudentCO extends ClientObject {
//项目名称集合
@ApiModelProperty(value = "项目名称集合")
private String projectNames;
@ApiModelProperty(value = "班级数")
@TableField(exist = false)
private Integer classCount;
@ApiModelProperty(value = "完成班级数")
@TableField(exist = false)
private Integer completeClassCount;
//环境
@ApiModelProperty(value = "环境")
private String env;

View File

@ -6,6 +6,7 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.List;
/**
@ -59,6 +60,13 @@ public class StudentExamRecordCO extends ClientObject {
//考试结果 0 -不通过 1-通过
@ApiModelProperty(value = "考试结果 0 -不通过 1-通过")
private Integer result;
@ApiModelProperty(value = "考试签字")
private String signUrl;
@ApiModelProperty(value = "试题集合")
private List<StudentExamRecordItemCO> examRecordItemList;
//环境
@ApiModelProperty(value = "环境")
private String env;

View File

@ -35,6 +35,11 @@ public class StudentSignCO extends ClientObject {
//签到人脸路径
@ApiModelProperty(value = "签到人脸路径")
private String faceUrl;
//打卡签字路径
@ApiModelProperty(value = "打卡签字路径")
private String signUrl;
//签到类型 1-打卡签到 2-人脸签到
@ApiModelProperty(value = "签到类型 1-打卡签到 2-人脸签到")
private Integer type;

View File

@ -0,0 +1,139 @@
package com.zcloud.edu.dto.data.archives;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
* @author zhangyue
* @date 2026/1/26 16:56
*/
@Data
public class PersonArchivesDTO {
private Long stuId;
//业务id
@ApiModelProperty(value = "业务id")
private String studentId;
//学员userid
@ApiModelProperty(value = "学员userid")
private Integer userId;
//班级id
@ApiModelProperty(value = "班级id")
private String classId;
//学员姓名
@ApiModelProperty(value = "学员姓名")
private String name;
//学员所属班级的企业id
@ApiModelProperty(value = "学员所属班级的企业id")
private Long classCorpinfoId;
//手机号
@ApiModelProperty(value = "手机号")
private String phone;
//身份证号
@ApiModelProperty(value = "身份证号")
private String userIdCard;
//民族编码
@ApiModelProperty(value = "民族编码")
private String nation;
//民族名称
@ApiModelProperty(value = "民族名称")
private String nationName;
//人脸照片url
@ApiModelProperty(value = "人脸照片url")
private String userAvatarUrl;
//现住址
@ApiModelProperty(value = "现住址")
private String currentAddress;
//户口所在地
@ApiModelProperty(value = "户口所在地")
private String locationAddress;
//文化程度 数据字典
@ApiModelProperty(value = "文化程度 数据字典")
private String culturalLevel;
//文化程度名称
@ApiModelProperty(value = "文化程度名称")
private String culturalLevelName;
//婚姻状态
@ApiModelProperty(value = "婚姻状态")
private String maritalStatus;
//婚姻状态名称
@ApiModelProperty(value = "婚姻状态名称")
private String maritalStatusName;
//政治面貌
@ApiModelProperty(value = "政治面貌")
private String politicalAffiliation;
//政治面貌名称
@ApiModelProperty(value = "政治面貌名称")
private String politicalAffiliationName;
//岗位名称
@ApiModelProperty(value = "岗位名称")
private String postName;
//签到状态 0-未签到 1-已签到
@ApiModelProperty(value = "签到状态 0-未签到 1-已签到")
private Integer signFlag;
//考试签到状态 0-未签到 1-已签到
@ApiModelProperty(value = "考试签到状态 0-未签到 1-已签到")
private Integer examSignFlag;
//学员状态 0-未学习 1-已签到 2-考试通过 3-未签到 4-考试未通过
@ApiModelProperty(value = "学员状态 0-未学习 1-已签到 2-考试通过 3-未签到 4-考试未通过")
private Integer state;
//班级名称
@ApiModelProperty(value = "班级名称")
private String className;
//培训日期 开始时间
@ApiModelProperty(value = "培训日期 开始时间")
private String startTime;
//培训日期 结束日期
@ApiModelProperty(value = "培训日期 结束日期")
private String endTime;
//培训教师id
@ApiModelProperty(value = "培训教师id")
private Long teacherId;
//教师名称
@ApiModelProperty(value = "教师名称")
private String teacherName;
//培训行业类型
@ApiModelProperty(value = "培训行业类型")
private String trainType;
//培训行业类型名称
@ApiModelProperty(value = "培训行业类型名称")
private String trainTypeName;
//培训地点
@ApiModelProperty(value = "培训地点")
private String trainingLocation;
//机构ID
@ApiModelProperty(value = "机构ID")
private Long corpinfoId;
//状态1-未申请 2-待开班 3- 培训中 4-培训结束
@ApiModelProperty(value = "状态1-未申请 2-待开班 3- 培训中 4-培训结束 ")
private Integer classState;
//培训有效期日期 开始时间
@ApiModelProperty(value = "培训有效期日期 开始时间")
private String validStartTime;
//培训有效期日期 结束时间
@ApiModelProperty(value = "培训有效期日期 结束时间")
private String validEndTime;
//1考试0不考试
@ApiModelProperty(value = "1考试0不考试")
private Integer examination;
//考试次数只有考试时候有用
@ApiModelProperty(value = "考试次数只有考试时候有用")
private Integer numberofexams;
@ApiModelProperty(value = "培训时长")
private Long trainDurationTime;
@ApiModelProperty(value = "培训科目")
private String trainSubject;
@ApiModelProperty(value = "视频时长")
private BigDecimal videoTotalTime;
@ApiModelProperty(value = "课件数")
private Integer videoCount;
@ApiModelProperty(value = "打卡签到人脸图片路径")
private String signFaceUrl;
@ApiModelProperty(value = "考试签到人脸图片路径")
private String examSignFaceUrl;
}

View File

@ -25,6 +25,8 @@ public class ClassAppSignQry {
*/
private String classId;
private String phone;
private Long stuId;
private String studentId;
}

View File

@ -0,0 +1,31 @@
package com.zcloud.edu.dto.study;
import com.alibaba.cola.dto.PageQuery;
import lombok.Data;
import java.util.List;
/**
* web-client
*
* @Author zhangyue
* @Date 2026-01-13 14:18:12
*/
@Data
public class ClassCountQry {
/**
* ,
* - `like`: SQLLIKE
* - `eq`: SQL=
* - `gt`:
* - `lt`:
* - `ge`:
* - `le`:
* - `ne`: SQL!=
*/
private List<String> phones;
}

View File

@ -24,9 +24,11 @@ import javax.validation.constraints.NotNull;
public class StudentSignAddCmd extends Command {
@ApiModelProperty(value = "班级id", name = "classId", required = true)
@NotEmpty(message = "班级id不能为空")
private String classId;
@ApiModelProperty(value = "学员id", name = "studentId", required = true)
private String studentId;
@ -35,7 +37,6 @@ public class StudentSignAddCmd extends Command {
private Integer type;
@ApiModelProperty(value = "手机号", name = "phone", required = true)
@NotEmpty(message = "手机号不能为空")
private String phone;

View File

@ -0,0 +1,31 @@
package com.zcloud.edu.domain.gateway.archives;
import com.zcloud.edu.domain.model.archives.ArchivesReviewE;
/**
* web-domain
*
* @Author zhangyue
* @Date 2026-01-26 10:59:35
*/
public interface ArchivesReviewGateway {
/**
*
*/
Boolean add(ArchivesReviewE archivesReviewE);
/**
*
*/
Boolean update(ArchivesReviewE archivesReviewE);
/**
*
*/
Boolean deletedArchivesReviewById(Long id);
Boolean deletedArchivesReviewByIds(Long[] id);
}

View File

@ -0,0 +1,31 @@
package com.zcloud.edu.domain.gateway.archives;
import com.zcloud.edu.domain.model.archives.ArchivesReviewRecordE;
/**
* web-domain
*
* @Author zhangyue
* @Date 2026-01-26 10:59:37
*/
public interface ArchivesReviewRecordGateway {
/**
*
*/
Boolean add(ArchivesReviewRecordE archivesReviewRecordE);
/**
*
*/
Boolean update(ArchivesReviewRecordE archivesReviewRecordE);
/**
*
*/
Boolean deletedArchivesReviewRecordById(Long id);
Boolean deletedArchivesReviewRecordByIds(Long[] id);
}

View File

@ -0,0 +1,66 @@
package com.zcloud.edu.domain.model.archives;
import com.jjb.saas.framework.domain.model.BaseE;
import lombok.Data;
import java.time.LocalDateTime;
/**
* web-domain
*
* @Author zhangyue
* @Date 2026-01-26 10:59:34
*/
@Data
public class ArchivesReviewE extends BaseE {
private Long id;
//业务id
private String archivesReviewId;
//课程id
private String classCurriculumId;
//班级id
private String classId;
//初版书号
private String bookNum;
//班级所属企业id
private Integer corpinfoId;
//编写单位
private String corpName;
//编写时间
private LocalDateTime writeDate;
//教材类型
private String materialType;
//会审地点
private String address;
//主持人
private String compere;
//会审时间
private LocalDateTime auditDate;
//会审意见
private String reviewOpinions;
//删除标识true false
private String deleteEnum;
//备注
private String remarks;
//创建人姓名
private String createName;
//更新人姓名
private String updateName;
//租户id
private Long tenantId;
//单位id
private Long orgId;
//版本
private Integer version;
//创建时间
private LocalDateTime createTime;
//修改时间
private LocalDateTime updateTime;
//创建人id
private Long createId;
//修改人id
private Long updateId;
//环境
private String env;
}

View File

@ -0,0 +1,55 @@
package com.zcloud.edu.domain.model.archives;
import com.jjb.saas.framework.domain.model.BaseE;
import lombok.Data;
import java.time.LocalDateTime;
/**
* web-domain
*
* @Author zhangyue
* @Date 2026-01-26 10:59:36
*/
@Data
public class ArchivesReviewRecordE extends BaseE {
//主键
private Long id;
//业务id
private String archivesReviewRecordId;
//会审表id
private String archivesReviewId;
//会审人员
private String reviewUser;
//工作部门
private String department;
//职务/职称
private String duties;
//审查意见
private String checkOpinion;
//删除标识true false
private String deleteEnum;
//备注
private String remarks;
//创建人姓名
private String createName;
//更新人姓名
private String updateName;
//租户id
private Long tenantId;
//单位id
private Long orgId;
//版本
private Integer version;
//创建时间
private LocalDateTime createTime;
//修改时间
private LocalDateTime updateTime;
//创建人id
private Long createId;
//修改人id
private Long updateId;
//环境
private String env;
}

View File

@ -0,0 +1,232 @@
package com.zcloud.edu.domain.model.archives;
import com.jjb.saas.framework.domain.model.BaseE;
import com.zcloud.edu.domain.model.study.*;
import com.zcloud.gbscommon.utils.DateUtil;
import groovy.lang.BenchmarkInterceptor;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.beans.BeanUtils;
import org.springframework.util.ObjectUtils;
import java.math.BigDecimal;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author zhangyue
* @date 2026/1/26 17:38
*/
@Data
public class PersonArchivesE extends BaseE {
private Long stuId;
//业务id
@ApiModelProperty(value = "业务id")
private String studentId;
//学员userid
@ApiModelProperty(value = "学员userid")
private Integer userId;
//班级id
@ApiModelProperty(value = "班级id")
private String classId;
//学员姓名
@ApiModelProperty(value = "学员姓名")
private String name;
//学员所属班级的企业id
@ApiModelProperty(value = "学员所属班级的企业id")
private Long classCorpinfoId;
//手机号
@ApiModelProperty(value = "手机号")
private String phone;
//身份证号
@ApiModelProperty(value = "身份证号")
private String userIdCard;
//民族编码
@ApiModelProperty(value = "民族编码")
private String nation;
//民族名称
@ApiModelProperty(value = "民族名称")
private String nationName;
//人脸照片url
@ApiModelProperty(value = "人脸照片url")
private String userAvatarUrl;
//现住址
@ApiModelProperty(value = "现住址")
private String currentAddress;
//户口所在地
@ApiModelProperty(value = "户口所在地")
private String locationAddress;
//文化程度 数据字典
@ApiModelProperty(value = "文化程度 数据字典")
private String culturalLevel;
//文化程度名称
@ApiModelProperty(value = "文化程度名称")
private String culturalLevelName;
//婚姻状态
@ApiModelProperty(value = "婚姻状态")
private String maritalStatus;
//婚姻状态名称
@ApiModelProperty(value = "婚姻状态名称")
private String maritalStatusName;
//政治面貌
@ApiModelProperty(value = "政治面貌")
private String politicalAffiliation;
//政治面貌名称
@ApiModelProperty(value = "政治面貌名称")
private String politicalAffiliationName;
//岗位名称
@ApiModelProperty(value = "岗位名称")
private String postName;
//签到状态 0-未签到 1-已签到
@ApiModelProperty(value = "签到状态 0-未签到 1-已签到")
private Integer signFlag;
//考试签到状态 0-未签到 1-已签到
@ApiModelProperty(value = "考试签到状态 0-未签到 1-已签到")
private Integer examSignFlag;
//学员状态 0-未学习 1-已签到 2-考试通过 3-未签到 4-考试未通过
@ApiModelProperty(value = "学员状态 0-未学习 1-已签到 2-考试通过 3-未签到 4-考试未通过")
private Integer state;
//班级名称
@ApiModelProperty(value = "班级名称")
private String className;
//培训日期 开始时间
@ApiModelProperty(value = "培训日期 开始时间")
private String startTime;
//培训日期 结束日期
@ApiModelProperty(value = "培训日期 结束日期")
private String endTime;
//培训教师id
@ApiModelProperty(value = "培训教师id")
private Long teacherId;
//教师名称
@ApiModelProperty(value = "教师名称")
private String teacherName;
//培训行业类型
@ApiModelProperty(value = "培训行业类型")
private String trainType;
//培训行业类型名称
@ApiModelProperty(value = "培训行业类型名称")
private String trainTypeName;
//培训地点
@ApiModelProperty(value = "培训地点")
private String trainingLocation;
//机构ID
@ApiModelProperty(value = "机构ID")
private Long corpinfoId;
//状态1-未申请 2-待开班 3- 培训中 4-培训结束
@ApiModelProperty(value = "状态1-未申请 2-待开班 3- 培训中 4-培训结束 ")
private Integer classState;
//培训有效期日期 开始时间
@ApiModelProperty(value = "培训有效期日期 开始时间")
private String validStartTime;
//培训有效期日期 结束时间
@ApiModelProperty(value = "培训有效期日期 结束时间")
private String validEndTime;
//1考试0不考试
@ApiModelProperty(value = "1考试0不考试")
private Integer examination;
//考试次数只有考试时候有用
@ApiModelProperty(value = "考试次数只有考试时候有用")
private Integer numberofexams;
@ApiModelProperty(value = "培训时长")
private Long trainDurationTime;
@ApiModelProperty(value = "培训科目")
private String trainSubject;
@ApiModelProperty(value = "视频时长")
private BigDecimal videoTotalTime;
@ApiModelProperty(value = "课件数")
private Integer videoCount;
@ApiModelProperty(value = "打卡签到人脸图片路径")
private String signFaceUrl;
@ApiModelProperty(value = "考试签到人脸图片路径")
private String examSignFaceUrl;
public void init(StudentE studentE, ClassE classE, List<ClassCurriculumE> classCurList) {
BeanUtils.copyProperties(studentE, this);
setStuId(studentE.getId());
setClassName(classE.getName());
setStartTime(classE.getStartTime());
setEndTime(classE.getEndTime());
setTeacherId(classE.getTeacherId());
setTeacherName(classE.getTeacherName());
setTrainType(classE.getTrainType());
setTrainTypeName(classE.getTrainTypeName());
setTrainingLocation(classE.getTrainingLocation());
setCorpinfoId(classE.getCorpinfoId());
setClassState(classE.getState());
setValidStartTime(classE.getValidStartTime());
setValidEndTime(classE.getValidEndTime());
setExamination(classE.getExamination());
setNumberofexams(classE.getNumberofexams());
String trainSubject = classCurList.stream().map(ClassCurriculumE::getCurriculumName).collect(Collectors.joining(","));
setTrainSubject(trainSubject);
setTrainDurationTime(DateUtil.getMinuteSub(classE.getStartTime(), classE.getEndTime()));
}
public void initAttendanceRecord(StudentE studentE, ClassE classE, List<ClassCurriculumChapterE> chapterEList, List<ClassCurriculumE> classCurList) {
BeanUtils.copyProperties(studentE, this);
setStuId(studentE.getId());
setClassName(classE.getName());
setStartTime(classE.getStartTime());
setEndTime(classE.getEndTime());
setTeacherId(classE.getTeacherId());
setTeacherName(classE.getTeacherName());
setTrainType(classE.getTrainType());
setTrainTypeName(classE.getTrainTypeName());
setTrainingLocation(classE.getTrainingLocation());
setCorpinfoId(classE.getCorpinfoId());
setClassState(classE.getState());
setValidStartTime(classE.getValidStartTime());
setValidEndTime(classE.getValidEndTime());
setExamination(classE.getExamination());
setNumberofexams(classE.getNumberofexams());
setVideoCount(chapterEList.size());
BigDecimal videoTotalTime = classCurList.stream()
.map(ClassCurriculumE::getVideoTotalTime) // 假设getBigDecimalField是获取BigDecimal字段的方法
.filter(bigDecimal -> bigDecimal != null) // 过滤null值防止空指针异常
.reduce(BigDecimal.ZERO, BigDecimal::add);
setVideoTotalTime(videoTotalTime);
}
public void initStudyRecord(StudentE studentE, ClassE classE, List<StudentSignE> studentSignEList, List<ClassCurriculumE> classCurList) {
BeanUtils.copyProperties(studentE, this);
setStuId(studentE.getId());
setClassName(classE.getName());
setStartTime(classE.getStartTime());
setEndTime(classE.getEndTime());
setTeacherId(classE.getTeacherId());
setTeacherName(classE.getTeacherName());
setTrainType(classE.getTrainType());
setTrainTypeName(classE.getTrainTypeName());
setTrainingLocation(classE.getTrainingLocation());
setCorpinfoId(classE.getCorpinfoId());
setClassState(classE.getState());
setValidStartTime(classE.getValidStartTime());
setValidEndTime(classE.getValidEndTime());
setExamination(classE.getExamination());
setNumberofexams(classE.getNumberofexams());
BigDecimal videoTotalTime = classCurList.stream()
.map(ClassCurriculumE::getVideoTotalTime) // 假设getBigDecimalField是获取BigDecimal字段的方法
.filter(bigDecimal -> bigDecimal != null) // 过滤null值防止空指针异常
.reduce(BigDecimal.ZERO, BigDecimal::add);
String trainSubject = classCurList.stream().map(ClassCurriculumE::getCurriculumName).collect(Collectors.joining(","));
setTrainSubject(trainSubject);
setVideoTotalTime(videoTotalTime);
if (studentSignEList != null && studentSignEList.size() > 0){
for (StudentSignE studentSignE : studentSignEList){
if(studentSignE.getType() == 1
&& !ObjectUtils.isEmpty(studentSignE.getFaceUrl())
&& ObjectUtils.isEmpty(this.getSignFaceUrl()) ){
this.setSignFaceUrl(studentSignE.getFaceUrl());
}
if(studentSignE.getType() == 2
&& !ObjectUtils.isEmpty(studentSignE.getFaceUrl())
&& ObjectUtils.isEmpty(this.getExamSignFaceUrl()) ){
this.setExamSignFaceUrl(studentSignE.getFaceUrl());
}
}
}
}
}

View File

@ -100,5 +100,11 @@ public class ClassCurriculumE extends BaseE {
});
}
public HashMap<String, Object> initListAllParams(String classId){
HashMap<String, Object> params = new HashMap<String, Object>();
params.put("classId", classId);
return params;
}
}

View File

@ -105,7 +105,7 @@ public class ClassE extends BaseE {
public void isBegin(){
if(DateUtil.isBeforeThan(this.startTime)){
throw new RuntimeException("班级未开班");
} else if(DateUtil.isBeforeThan(this.endTime)){
} else if(DateUtil.isAfter(this.endTime)){
throw new RuntimeException("班级已结束");
}
}

View File

@ -6,6 +6,7 @@ import com.zcloud.gbscommon.utils.Base64Util;
import com.zcloud.gbscommon.utils.FaceUtil;
import com.zcloud.gbscommon.utils.Tools;
import com.zcloud.gbscommon.zcloudimgfiles.facade.ZcloudImgFilesFacade;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.apache.dubbo.config.annotation.DubboReference;
import org.apache.tomcat.util.http.fileupload.ByteArrayOutputStream;
@ -39,6 +40,8 @@ public class StudentSignE extends BaseE {
private Long corpinfoId;
//签到人脸路径
private String faceUrl;
//打卡签字路径
private String signUrl;
//签到类型 1-打卡签到 2-人脸签到
private Integer type;
@ -73,8 +76,7 @@ public class StudentSignE extends BaseE {
@DubboReference
private ZcloudImgFilesFacade zcloudImgFilesFacade;
public void compareFace(String templateFaceUrl) throws Exception {
String faceUrl = Base64Util.getBase64String(files[0]);
public void compareFace(String templateFaceUrl, String faceUrl) throws Exception {
String templateFace = Base64Util.urlToBase64(prefixUrl + templateFaceUrl);
String confidence = FaceUtil.compareFace(templateFace, faceUrl);
@ -83,6 +85,10 @@ public class StudentSignE extends BaseE {
}
this.setStudentSignId(Tools.get32UUID());
}
public void init(String studentId, String classId, long corpinfoId){
this.setStudentId(studentId);
this.setClassId(classId);
this.setCorpinfoId(corpinfoId);
}
}

View File

@ -0,0 +1,50 @@
package com.zcloud.edu.gatewayimpl.archives;
import com.zcloud.edu.domain.gateway.archives.ArchivesReviewGateway;
import com.zcloud.edu.domain.model.archives.ArchivesReviewE;
import com.zcloud.edu.persistence.dataobject.archives.ArchivesReviewDO;
import com.zcloud.edu.persistence.repository.archives.ArchivesReviewRepository;
import lombok.AllArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import java.util.Arrays;
/**
* web-infrastructure
*
* @Author zhangyue
* @Date 2026-01-26 10:59:35
*/
@Service
@AllArgsConstructor
public class ArchivesReviewGatewayImpl implements ArchivesReviewGateway {
private final ArchivesReviewRepository archivesReviewRepository;
@Override
public Boolean add(ArchivesReviewE archivesReviewE) {
ArchivesReviewDO d = new ArchivesReviewDO();
BeanUtils.copyProperties(archivesReviewE, d);
archivesReviewRepository.save(d);
return true;
}
@Override
public Boolean update(ArchivesReviewE archivesReviewE) {
ArchivesReviewDO d = new ArchivesReviewDO();
BeanUtils.copyProperties(archivesReviewE, d);
archivesReviewRepository.updateById(d);
return true;
}
@Override
public Boolean deletedArchivesReviewById(Long id) {
return archivesReviewRepository.removeById(id);
}
@Override
public Boolean deletedArchivesReviewByIds(Long[] ids) {
return archivesReviewRepository.removeByIds(Arrays.asList(ids));
}
}

View File

@ -0,0 +1,50 @@
package com.zcloud.edu.gatewayimpl.archives;
import com.zcloud.edu.domain.gateway.archives.ArchivesReviewRecordGateway;
import com.zcloud.edu.domain.model.archives.ArchivesReviewRecordE;
import com.zcloud.edu.persistence.dataobject.archives.ArchivesReviewRecordDO;
import com.zcloud.edu.persistence.repository.archives.ArchivesReviewRecordRepository;
import lombok.AllArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import java.util.Collections;
/**
* web-infrastructure
*
* @Author zhangyue
* @Date 2026-01-26 10:59:37
*/
@Service
@AllArgsConstructor
public class ArchivesReviewRecordGatewayImpl implements ArchivesReviewRecordGateway {
private final ArchivesReviewRecordRepository archivesReviewRecordRepository;
@Override
public Boolean add(ArchivesReviewRecordE archivesReviewRecordE) {
ArchivesReviewRecordDO d = new ArchivesReviewRecordDO();
BeanUtils.copyProperties(archivesReviewRecordE, d);
archivesReviewRecordRepository.save(d);
return true;
}
@Override
public Boolean update(ArchivesReviewRecordE archivesReviewRecordE) {
ArchivesReviewRecordDO d = new ArchivesReviewRecordDO();
BeanUtils.copyProperties(archivesReviewRecordE, d);
archivesReviewRecordRepository.updateById(d);
return true;
}
@Override
public Boolean deletedArchivesReviewRecordById(Long id) {
return archivesReviewRecordRepository.removeById(id);
}
@Override
public Boolean deletedArchivesReviewRecordByIds(Long[] ids) {
return archivesReviewRecordRepository.removeByIds(Collections.singletonList(ids));
}
}

View File

@ -26,6 +26,7 @@ public class StudentSignGatewayImpl implements StudentSignGateway {
StudentSignDO d = new StudentSignDO();
BeanUtils.copyProperties(studentSignE, d);
studentSignRepository.save(d);
studentSignE.setId(d.getId());
return true;
}

View File

@ -0,0 +1,62 @@
package com.zcloud.edu.persistence.dataobject.archives;
import com.baomidou.mybatisplus.annotation.TableName;
import com.jjb.saas.framework.repository.basedo.BaseDO;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
/**
* web-infrastructure
*
* @Author zhangyue
* @Date 2026-01-26 10:59:34
*/
@Data
@TableName("archives_review")
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class ArchivesReviewDO extends BaseDO {
//业务id
@ApiModelProperty(value = "业务id")
private String archivesReviewId;
//课程id
@ApiModelProperty(value = "课程id")
private String classCurriculumId;
//班级id
@ApiModelProperty(value = "班级id")
private String classId;
//初版书号
@ApiModelProperty(value = "初版书号")
private String bookNum;
//班级所属企业id
@ApiModelProperty(value = "班级所属企业id")
private Integer corpinfoId;
//编写单位
@ApiModelProperty(value = "编写单位")
private String corpName;
//编写时间
@ApiModelProperty(value = "编写时间")
private LocalDateTime writeDate;
//教材类型
@ApiModelProperty(value = "教材类型")
private String materialType;
//会审地点
@ApiModelProperty(value = "会审地点")
private String address;
//主持人
@ApiModelProperty(value = "主持人")
private String compere;
//会审时间
@ApiModelProperty(value = "会审时间")
private LocalDateTime auditDate;
//会审意见
@ApiModelProperty(value = "会审意见")
private String reviewOpinions;
}

View File

@ -0,0 +1,42 @@
package com.zcloud.edu.persistence.dataobject.archives;
import com.baomidou.mybatisplus.annotation.TableName;
import com.jjb.saas.framework.repository.basedo.BaseDO;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
/**
* web-infrastructure
*
* @Author zhangyue
* @Date 2026-01-26 10:59:37
*/
@Data
@TableName("archives_review_record")
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class ArchivesReviewRecordDO extends BaseDO {
//业务id
@ApiModelProperty(value = "业务id")
private String archivesReviewRecordId;
//会审表id
@ApiModelProperty(value = "会审表id")
private String archivesReviewId;
//会审人员
@ApiModelProperty(value = "会审人员")
private String reviewUser;
//工作部门
@ApiModelProperty(value = "工作部门")
private String department;
//职务/职称
@ApiModelProperty(value = "职务/职称")
private String duties;
//审查意见
@ApiModelProperty(value = "审查意见")
private String checkOpinion;
}

View File

@ -75,5 +75,15 @@ public class ClassDO extends BaseDO {
@TableField(exist = false)
private Integer finishCount = 0;
@ApiModelProperty(value = "学员id(雪花)")
@TableField(exist = false)
private Long stuId;
@ApiModelProperty(value = "学员id(uuid)")
@TableField(exist = false)
private String studentId;
}

View File

@ -97,5 +97,13 @@ public class StudentDO extends BaseDO {
@ApiModelProperty(value = "项目名称集合")
private String projectNames;
@ApiModelProperty(value = "班级数")
@TableField(exist = false)
private Integer classCount;
@ApiModelProperty(value = "完成班级数")
@TableField(exist = false)
private Integer completeClassCount;
}

View File

@ -1,5 +1,6 @@
package com.zcloud.edu.persistence.dataobject.study;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.jjb.saas.framework.repository.basedo.BaseDO;
import io.swagger.annotations.ApiModelProperty;
@ -61,6 +62,13 @@ public class StudentExamRecordDO extends BaseDO {
@ApiModelProperty(value = "考试结果 0 -不通过 1-通过")
private Integer result;
@ApiModelProperty(value = "学员考试签到id")
private String studentSignId;
@ApiModelProperty(value = "考试签字")
@TableField(exist = false)
private String signUrl;
}

View File

@ -46,6 +46,10 @@ public class StudentSignDO extends BaseDO {
@ApiModelProperty(value = "签到人脸路径")
private String faceUrl;
//打卡签字路径
@ApiModelProperty(value = "打卡签字路径")
private String signUrl;
//签到类型 1-打卡签到 2-人脸签到
@ApiModelProperty(value = "签到类型 1-打卡签到 2-人脸签到")
private Integer type;

View File

@ -0,0 +1,17 @@
package com.zcloud.edu.persistence.mapper.archives;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zcloud.edu.persistence.dataobject.archives.ArchivesReviewDO;
import org.apache.ibatis.annotations.Mapper;
/**
* web-infrastructure
*
* @Author zhangyue
* @Date 2026-01-26 10:59:35
*/
@Mapper
public interface ArchivesReviewMapper extends BaseMapper<ArchivesReviewDO> {
}

View File

@ -0,0 +1,17 @@
package com.zcloud.edu.persistence.mapper.archives;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zcloud.edu.persistence.dataobject.archives.ArchivesReviewRecordDO;
import org.apache.ibatis.annotations.Mapper;
/**
* web-infrastructure
*
* @Author zhangyue
* @Date 2026-01-26 10:59:37
*/
@Mapper
public interface ArchivesReviewRecordMapper extends BaseMapper<ArchivesReviewRecordDO> {
}

View File

@ -3,6 +3,7 @@ package com.zcloud.edu.persistence.mapper.study;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zcloud.edu.persistence.dataobject.study.StudentExamRecordDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
* web-infrastructure
@ -12,6 +13,7 @@ import org.apache.ibatis.annotations.Mapper;
*/
@Mapper
public interface StudentExamRecordMapper extends BaseMapper<StudentExamRecordDO> {
StudentExamRecordDO getInfoByStudentId(@Param("studentId") String studentId);
}

View File

@ -25,5 +25,8 @@ public interface StudentMapper extends BaseMapper<StudentDO> {
StudentDO findByClassIdAndPhone(@Param("classId") String classId, @Param("phone") String phone);
StudentDO findFaceUrlByPhone(@Param("phone") String phone);
List<StudentDO> countStuClass(@Param("params") Map<String, Object> params);
}

View File

@ -0,0 +1,18 @@
package com.zcloud.edu.persistence.repository.archives;
import com.alibaba.cola.dto.PageResponse;
import com.jjb.saas.framework.repository.repo.BaseRepository;
import com.zcloud.edu.persistence.dataobject.archives.ArchivesReviewRecordDO;
import java.util.Map;
/**
* web-infrastructure
*
* @Author zhangyue
* @Date 2026-01-26 10:59:37
*/
public interface ArchivesReviewRecordRepository extends BaseRepository<ArchivesReviewRecordDO> {
PageResponse<ArchivesReviewRecordDO> listPage(Map<String, Object> params);
}

View File

@ -0,0 +1,18 @@
package com.zcloud.edu.persistence.repository.archives;
import com.alibaba.cola.dto.PageResponse;
import com.jjb.saas.framework.repository.repo.BaseRepository;
import com.zcloud.edu.persistence.dataobject.archives.ArchivesReviewDO;
import java.util.Map;
/**
* web-infrastructure
*
* @Author zhangyue
* @Date 2026-01-26 10:59:35
*/
public interface ArchivesReviewRepository extends BaseRepository<ArchivesReviewDO> {
PageResponse<ArchivesReviewDO> listPage(Map<String, Object> params);
}

View File

@ -0,0 +1,39 @@
package com.zcloud.edu.persistence.repository.impl.archives;
import com.alibaba.cola.dto.PageResponse;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.jjb.saas.framework.repository.common.PageHelper;
import com.jjb.saas.framework.repository.repo.impl.BaseRepositoryImpl;
import com.zcloud.edu.persistence.dataobject.archives.ArchivesReviewRecordDO;
import com.zcloud.edu.persistence.mapper.archives.ArchivesReviewRecordMapper;
import com.zcloud.edu.persistence.repository.archives.ArchivesReviewRecordRepository;
import com.zcloud.gbscommon.utils.PageQueryHelper;
import com.zcloud.gbscommon.utils.Query;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.Map;
/**
* web-infrastructure
*
* @Author zhangyue
* @Date 2026-01-26 10:59:37
*/
@Service
@RequiredArgsConstructor
public class ArchivesReviewRecordRepositoryImpl extends BaseRepositoryImpl<ArchivesReviewRecordMapper, ArchivesReviewRecordDO> implements ArchivesReviewRecordRepository {
private final ArchivesReviewRecordMapper archivesReviewRecordMapper;
@Override
public PageResponse<ArchivesReviewRecordDO> listPage(Map<String, Object> params) {
IPage<ArchivesReviewRecordDO> iPage = new Query<ArchivesReviewRecordDO>().getPage(params);
QueryWrapper<ArchivesReviewRecordDO> queryWrapper = new QueryWrapper<>();
queryWrapper = PageQueryHelper.createPageQueryWrapper(queryWrapper, params);
queryWrapper.orderByDesc("create_time");
IPage<ArchivesReviewRecordDO> result = archivesReviewRecordMapper.selectPage(iPage, queryWrapper);
return PageHelper.pageToResponse(result, result.getRecords());
}
}

View File

@ -0,0 +1,39 @@
package com.zcloud.edu.persistence.repository.impl.archives;
import com.alibaba.cola.dto.PageResponse;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.jjb.saas.framework.repository.common.PageHelper;
import com.jjb.saas.framework.repository.repo.impl.BaseRepositoryImpl;
import com.zcloud.edu.persistence.dataobject.archives.ArchivesReviewDO;
import com.zcloud.edu.persistence.mapper.archives.ArchivesReviewMapper;
import com.zcloud.edu.persistence.repository.archives.ArchivesReviewRepository;
import com.zcloud.gbscommon.utils.PageQueryHelper;
import com.zcloud.gbscommon.utils.Query;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.Map;
/**
* web-infrastructure
*
* @Author zhangyue
* @Date 2026-01-26 10:59:35
*/
@Service
@RequiredArgsConstructor
public class ArchivesReviewRepositoryImpl extends BaseRepositoryImpl<ArchivesReviewMapper, ArchivesReviewDO> implements ArchivesReviewRepository {
private final ArchivesReviewMapper archivesReviewMapper;
@Override
public PageResponse<ArchivesReviewDO> listPage(Map<String, Object> params) {
IPage<ArchivesReviewDO> iPage = new Query<ArchivesReviewDO>().getPage(params);
QueryWrapper<ArchivesReviewDO> queryWrapper = new QueryWrapper<>();
queryWrapper = PageQueryHelper.createPageQueryWrapper(queryWrapper, params);
queryWrapper.orderByDesc("create_time");
IPage<ArchivesReviewDO> result = archivesReviewMapper.selectPage(iPage, queryWrapper);
return PageHelper.pageToResponse(result, result.getRecords());
}
}

View File

@ -70,5 +70,15 @@ public class ClassCurriculumChapterRepositoryImpl extends BaseRepositoryImpl<Cla
return classCurriculumChapterMapper.selectList(queryWrapper);
}
@Override
public List<ClassCurriculumChapterDO> listVideoByClassId(String classId) {
QueryWrapper<ClassCurriculumChapterDO> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("class_id", classId);
queryWrapper.isNotNull("video_courseware_id");
queryWrapper.ne("video_courseware_id", "");
queryWrapper.eq("delete_enum", "FALSE");
return classCurriculumChapterMapper.selectList(queryWrapper);
}
}

View File

@ -14,6 +14,7 @@ import com.zcloud.gbscommon.utils.Query;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
/**
@ -54,5 +55,14 @@ public class StudentExamRecordItemRepositoryImpl extends BaseRepositoryImpl<Stud
updateWrapper.set("delete_enum", "TRUE");
return studentExamRecordItemMapper.delete(updateWrapper);
}
@Override
public List<StudentExamRecordItemDO> listByExamRecordId(String examRecordId) {
QueryWrapper<StudentExamRecordItemDO> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("exam_record_id", examRecordId);
queryWrapper.eq("delete_enum", "FALSE");
queryWrapper.orderByDesc("create_time");
return studentExamRecordItemMapper.selectList(queryWrapper);
}
}

View File

@ -63,5 +63,10 @@ public class StudentExamRecordRepositoryImpl extends BaseRepositoryImpl<StudentE
queryWrapper.eq("delete_enum", "FALSE");
return studentExamRecordMapper.selectList(queryWrapper);
}
@Override
public StudentExamRecordDO getInfoByStudentId(String studentId) {
return studentExamRecordMapper.getInfoByStudentId(studentId);
}
}

View File

@ -84,5 +84,18 @@ public class StudentRepositoryImpl extends BaseRepositoryImpl<StudentMapper, Stu
return studentMapper.findFaceUrlByPhone(phone);
}
@Override
public List<StudentDO> countStuClass(Map<String, Object> params) {
return studentMapper.countStuClass(params);
}
@Override
public StudentDO findInfoByStudentId(String studentId) {
QueryWrapper<StudentDO> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("student_id", studentId);
queryWrapper.eq("delete_enum", "FALSE");
return studentMapper.selectOne(queryWrapper);
}
}

View File

@ -15,6 +15,7 @@ import com.zcloud.gbscommon.utils.PageQueryHelper;
import com.zcloud.gbscommon.utils.Query;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import java.util.List;
import java.util.Map;
@ -59,7 +60,13 @@ public class StudentSignRepositoryImpl extends BaseRepositoryImpl<StudentSignMap
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.eq("student_id", params.get("studentId"));
queryWrapper.eq("delete_enum", "FALSE");
queryWrapper.eq("type", params.get("type"));
if (!ObjectUtils.isEmpty(params.get("type"))){
queryWrapper.eq("type", params.get("type"));
}
if (!ObjectUtils.isEmpty(params.get("orderCreateTime"))){
queryWrapper.orderByDesc("create_time");
}
queryWrapper.isNotNull("sign_url");
return studentSignMapper.selectList(queryWrapper);
}
}

View File

@ -23,5 +23,7 @@ public interface ClassCurriculumChapterRepository extends BaseRepository<ClassCu
Integer deleteByClassId(String classId);
List<ClassCurriculumChapterDO> listByClassCurriculumIds(List<String> classCurriculumIds);
List<ClassCurriculumChapterDO> listVideoByClassId(String classId);
}

View File

@ -5,6 +5,7 @@ import com.jjb.saas.framework.repository.repo.BaseRepository;
import com.zcloud.edu.persistence.dataobject.study.StudentExamRecordItemDO;
import io.swagger.models.auth.In;
import java.util.List;
import java.util.Map;
/**
@ -19,5 +20,7 @@ public interface StudentExamRecordItemRepository extends BaseRepository<StudentE
void deleteByStudentId(String studentId);
Integer deleteByClassId(String classId);
List<StudentExamRecordItemDO> listByExamRecordId(String examRecordId);
}

View File

@ -21,5 +21,7 @@ public interface StudentExamRecordRepository extends BaseRepository<StudentExamR
Integer deleteByClassId(String classId);
List<StudentExamRecordDO> listAllByStudentId(String studentId);
StudentExamRecordDO getInfoByStudentId(String studentId);
}

View File

@ -31,6 +31,11 @@ public interface StudentRepository extends BaseRepository<StudentDO> {
StudentDO findFaceUrlByPhone(String phone);
List<StudentDO> countStuClass(Map<String, Object> params);
StudentDO findInfoByStudentId(String studentId);

View File

@ -23,5 +23,6 @@ public interface StudentSignRepository extends BaseRepository<StudentSignDO> {
List<StudentSignDO> listAllByStudentId(Map<String, Object> params);
}

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zcloud.edu.persistence.mapper.archives.ArchivesReviewMapper">
</mapper>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zcloud.edu.persistence.mapper.archives.ArchivesReviewRecordMapper">
</mapper>

View File

@ -6,7 +6,7 @@
<select id="listByClassCurriculumId" resultType="com.zcloud.edu.persistence.dataobject.study.ClassCurriculumChapterDO">
SELECT
c.id,
c.curriculum_chapter_id,
c.class_curriculum_chapter_id,
c.class_id,
c.corpinfo_id,
c.class_curriculum_id,
@ -33,7 +33,7 @@
<select id="listByClassCurriculumIds" resultType="com.zcloud.edu.persistence.dataobject.study.ClassCurriculumChapterDO">
SELECT
c.id,
c.curriculum_chapter_id,
c.class_curriculum_chapter_id,
c.class_id,
c.corpinfo_id,
c.class_curriculum_id,

View File

@ -97,17 +97,25 @@
c.valid_start_time,
c.valid_end_time,
c.examination,
c.numberofexams
c.numberofexams,
s.student_id,
s.id stu_id
FROM
class c
student s
left join class c on c.class_id = s.class_id
left join training_type t on t.training_type_id = c.train_type
left join corp_info ci on ci.id = c.corpinfo_id
WHERE
c.class_id IN (SELECT s.class_id FROM student s WHERE s.phone = #{params.phone} AND s.delete_enum = 'FALSE')
<where>
AND s.phone = #{params.phone}
AND s.delete_enum = 'FALSE'
AND c.delete_enum = 'FALSE'
<if test="params.likeName != null and params.likeName !='' ">
and c.name like concat('%',#{params.likeName},'%')
</if>
<if test="params.eqCorpinfoId != null and params.eqCorpinfoId !='' ">
and c.corpinfo_id = #{params.eqCorpinfoId}
</if>
</where>
order by
c.state,
c.create_time desc

View File

@ -3,6 +3,35 @@
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zcloud.edu.persistence.mapper.study.StudentExamRecordMapper">
<select id="getInfoByStudentId" resultType="com.zcloud.edu.persistence.dataobject.study.StudentExamRecordDO">
SELECT
er.id,
er.student_exam_record_id,
er.user_id,
er.student_id,
er.class_id,
er.corpinfo_id,
er.student_sign_id,
er.class_exam_paper_id,
er.exam_paper_id,
er.exam_time_begin,
er.exam_time_end,
er.exam_question_num,
er.exam_question_right,
er.exam_question_wrong,
er.exam_score,
er.result,
ss.sign_url
FROM
student_exam_record er
left join student_sign ss on ss.student_sign_id = er.student_sign_id
<where>
er.delete_enum = 'FALSE'
and er.student_id = #{studentId}
</where>
ORDER BY
er.result desc, er.exam_score desc, er.create_time desc
limit 1
</select>
</mapper>

View File

@ -70,5 +70,25 @@
create_time desc
limit 1
</select>
<select id="countStuClass" resultType="com.zcloud.edu.persistence.dataobject.study.StudentDO">
SELECT
s.phone,
count(*) class_count,
count(CASE WHEN s.state = 1 THEN 1 END) complete_class_count
FROM
student s
<where>
<if test="params.inCorpinfoId != null">
AND s.phone in
<foreach collection="params.phones" item="phone" open="(" close=")" separator=",">
#{phone}
</foreach>
</if>
and s.delete_enum = 'FALSE'
</where>
group by s.phone
</select>
</mapper>

View File

@ -13,12 +13,11 @@
ss.face_url
FROM
student_sign ss
LEFT JOIN student s ON ss.student_id = ss.student_id
LEFT JOIN class cl ON cl.class_id = s.class_id
LEFT JOIN student s ON ss.student_id = ss.student_id
LEFT JOIN class cl ON cl.class_id = s.class_id
WHERE
s.phone = #{params.phone}
AND s.class_id = #{params.classId}
AND ss.delete_enum = 'FALSE'
ss.student_id = #{params.studentId}
AND ss.delete_enum = 'FALSE'
</select>