实现个人档案下载功能并优化培训申请用户查询

dev
zhangyue 2026-02-06 14:08:35 +08:00
parent 387b746f56
commit a5e9c8082a
26 changed files with 564 additions and 38 deletions

View File

@ -0,0 +1,21 @@
学时证明
姓名
{{name}}
证件类型
身份证
证件编号
{{userIdCard}}
培训单位名称
{{corpName}}
班级名称
{{className}}
培训日期
{{startTime}} 至 {{endTime}}
培训类型
{{trainTypeName}}
视频学习时长
{{videoTotalTime}}(包含{{videoCount}}个视频课件)
培训单位:(盖章)
日期:

View File

@ -0,0 +1,10 @@
{{examName}}
(满分:{{paperExamScore}}分)
班级名称:{{className}}
{{examRecord_list}}姓名:{{name}}
分数:{{examScore}}
考试时间:{{examTimeBegin}}
签字:
[questionTypeName] [index].[questionDry] (题目分值:[score] 正确答案:[choiceAnswer] 学员答案:[answer]
A[optionA] B[optionB]

View File

@ -0,0 +1,15 @@
学员学习档案
{{@img}}
姓 名:{{name}}
身份证号:{{userIdCard}}
联系电话: {{phone}}
班级名称:{{className}}
培训日期:{{startTime}} 至 {{endTime}}
学习方式:线下学习
课程形式:录播
培训时长:{{trainDurationTime}}
培训科目:{{trainSubject}}
单位名称: {{corpName}}

View File

@ -0,0 +1,16 @@
学时证明
姓名:{{name}}
身份证号:{{userIdCard}}
班级名称
{{className}}
课程名称
{{trainSubject}}
视频时长
{{videoTotalTime}}
是否完成
{{StateName}}
签到人脸验证
{{@signFacePicture}}
考试人脸验证
{{@examSignFacePicture}}

View File

@ -75,7 +75,7 @@ public class ArchivesController {
public SingleResponse<ClassArchivesDTO> downloadPersonArchives(@RequestBody ArchivesQry qry) {
archivesService.downloadPersonArchives(qry);
return null;
}
}
}

View File

@ -1,17 +1,18 @@
package com.zcloud.edu.web.training;
import com.zcloud.edu.api.training.TrainingApplyUserServiceI;
import com.zcloud.edu.dto.training.TrainingApplyUserAddCmd;
import com.zcloud.edu.dto.training.TrainingApplyUserPageQry;
import com.zcloud.edu.dto.training.TrainingApplyUserUpdateCmd;
import com.zcloud.edu.dto.clientobject.training.TrainingApplyUserCO;
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.training.TrainingApplyUserServiceI;
import com.zcloud.edu.dto.clientobject.training.TrainingApplyUserCO;
import com.zcloud.edu.dto.training.TrainingApplyUserAddCmd;
import com.zcloud.edu.dto.training.TrainingApplyUserPageQry;
import com.zcloud.edu.dto.training.TrainingApplyUserPhonePageQry;
import com.zcloud.edu.dto.training.TrainingApplyUserUpdateCmd;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
@ -38,6 +39,11 @@ public class TrainingApplyUserController {
return trainingApplyUserService.add(cmd);
}
@ApiOperation("根据手机号和所属相关方查询分页")
@PostMapping("/listPageByPhone")
public PageResponse<TrainingApplyUserCO> listPageByPhone(@RequestBody TrainingApplyUserPhonePageQry qry) {
return trainingApplyUserService.listPageByPhone(qry);
}
@ApiOperation("分页")
@PostMapping("/list")
public PageResponse<TrainingApplyUserCO> page(@RequestBody TrainingApplyUserPageQry qry) {

View File

@ -1,18 +1,49 @@
package com.zcloud.edu.command.query.archives;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.unit.DataUnit;
import com.alibaba.cola.dto.PageResponse;
import com.alibaba.cola.dto.SingleResponse;
import com.deepoove.poi.data.PictureRenderData;
import com.deepoove.poi.data.PictureType;
import com.deepoove.poi.data.Pictures;
import com.zcloud.edu.command.convertor.archives.ArchivesPdfFileCoConvertor;
import com.zcloud.edu.command.convertor.study.StudentCoConvertor;
import com.zcloud.edu.command.convertor.study.StudentExamRecordCoConvertor;
import com.zcloud.edu.command.convertor.study.StudentExamRecordItemCoConvertor;
import com.zcloud.edu.domain.model.archives.ArchivesPdfFileE;
import com.zcloud.edu.domain.model.archives.PersonArchivesE;
import com.zcloud.edu.domain.model.study.*;
import com.zcloud.edu.dto.archives.ArchivesPdfFilePageQry;
import com.zcloud.edu.dto.archives.ArchivesQry;
import com.zcloud.edu.dto.clientobject.archives.ArchivesPdfFileCO;
import com.zcloud.edu.dto.clientobject.study.StudentExamRecordCO;
import com.zcloud.edu.dto.clientobject.study.StudentExamRecordItemCO;
import com.zcloud.edu.dto.data.archives.PersonArchivesDTO;
import com.zcloud.edu.persistence.dataobject.archives.ArchivesPdfFileDO;
import com.zcloud.edu.persistence.dataobject.study.*;
import com.zcloud.edu.persistence.repository.archives.ArchivesPdfFileRepository;
import com.zcloud.edu.persistence.repository.study.*;
import com.zcloud.gbscommon.utils.DateUtil;
import com.zcloud.gbscommon.utils.PageQueryHelper;
import com.zcloud.gbscommon.utils.Tools;
import com.zcloud.gbscommon.utils.WordToPdfUtil;
import com.zcloud.gbscommon.zcloudimgfiles.facade.ZcloudImgFilesFacade;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.io.output.ByteArrayOutputStream;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import java.util.List;
import java.util.Map;
import java.lang.reflect.InvocationTargetException;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
/**
@ -26,7 +57,26 @@ import java.util.Map;
public class ArchivesQueryExe {
private final ArchivesPdfFileRepository archivesPdfFileRepository;
private final ArchivesPdfFileCoConvertor archivesPdfFileCoConvertor;
private final StudentRepository studentRepository;
private final StudentCoConvertor studentCoConvertor;
private final ClassRepository classRepository;
private final ClassCurriculumRepository classCurriculumRepository;
private final ClassCurriculumChapterRepository classCurriculumChapterRepository;
private final StudentSignRepository studentSignRepository;
private final StudentExamRecordRepository studentExamRecordRepository;
private final StudentExamRecordItemRepository studentExamRecordItemRepository;
private final StudentExamRecordItemCoConvertor studentExamRecordItemCoConvertor;
private static String prefixUrl;
// = "https://jpfz.qhdsafety.com/gbsFileTest/";
// public static Integer corePoolSize;
@Value("${file.url}")
public void setPrefixUrl(String prefixUrlProperties) {
prefixUrl = prefixUrlProperties;
}
@DubboReference
private ZcloudImgFilesFacade zcloudImgFilesFacade;
/**
*
*
@ -40,18 +90,195 @@ public class ArchivesQueryExe {
return PageResponse.of(examCenterCOS, pageResponse.getTotalCount(), pageResponse.getPageSize(), pageResponse.getPageIndex());
}
public void execte1(){
System.out.println(1);
public PersonArchivesDTO downloadPersonArchives(ArchivesQry qry){
ClassE classE = null;
List<ClassCurriculumE> classCurList = new ArrayList<ClassCurriculumE>();
List<ClassCurriculumChapterE> classChapterEList = new ArrayList<ClassCurriculumChapterE>();
List<StudentSignE> studentSignEList = new ArrayList<StudentSignE>();
HashMap<String, Object> params = new HashMap<String, Object>();
// 学员信息
StudentDO studentDO = studentRepository.getById(qry.getStuId());
byte[] userIdCardBytes = Base64.getDecoder().decode(studentDO.getUserIdCard());
String userIdCardString = new String(userIdCardBytes);
studentDO.setUserIdCard(userIdCardString);
StudentE studentE = new StudentE();
BeanUtils.copyProperties(studentDO, studentE);
// 班级信息
ClassDO classDO = classRepository.getByClassId(studentDO.getClassId());
classE = new ClassE();
BeanUtils.copyProperties(classDO, classE);
if (qry.getTypeList().contains(2) || qry.getTypeList().contains(3) || qry.getTypeList().contains(4)) {
params.put("classId", studentDO.getClassId());
// 课程信息
List<ClassCurriculumDO> curEList = classCurriculumRepository.listAll(params);
classCurList = BeanUtil.copyToList(curEList, ClassCurriculumE.class);
}
if (qry.getTypeList().contains(2)) {
// 课件信息
List<ClassCurriculumChapterDO> classChapterList = classCurriculumChapterRepository.listVideoByClassId(classE.getClassId());
classChapterEList = BeanUtil.copyToList(classChapterList, ClassCurriculumChapterE.class);
}
if (qry.getTypeList().contains(3)) {
// 学员人脸记录
StudentDO studentUrl = studentRepository.findFaceUrlByPhone(studentDO.getPhone());
studentE.setUserAvatarUrl(studentUrl.getUserAvatarUrl());
}
if (qry.getTypeList().contains(4)) {
// 签到照片
params.put("studentId", studentDO.getStudentId());
List<StudentSignDO> studentSignList = studentSignRepository.listAllByStudentId(params);
studentSignEList = BeanUtil.copyToList(studentSignList, StudentSignE.class);
}
PersonArchivesE personArchivesE = new PersonArchivesE();
personArchivesE.initDownload(studentE,
classE,
classCurList,
classChapterEList,
studentSignEList);
PersonArchivesDTO personArchivesDTO = new PersonArchivesDTO();
BeanUtils.copyProperties(personArchivesE, personArchivesDTO);
if (qry.getTypeList().contains(5)) {
StudentExamRecordDO studentExamRecordDO = studentExamRecordRepository.getInfoByStudentId(studentDO.getStudentId());
StudentExamRecordCO studentExamRecordCO = new StudentExamRecordCO();
BeanUtils.copyProperties(studentExamRecordDO, studentExamRecordCO);
List<StudentExamRecordItemDO> recordList = studentExamRecordItemRepository.listByExamRecordId(studentExamRecordDO.getStudentExamRecordId());
List<StudentExamRecordItemCO> recordCoList = studentExamRecordItemCoConvertor.converDOsToCOs(recordList);
studentExamRecordCO.setExamRecordItemList(recordCoList);
personArchivesDTO.setStudentExamRecord(studentExamRecordCO);
}
// 新增档案下载记录
ArchivesPdfFileE archivesPdfFileE = new ArchivesPdfFileE();
archivesPdfFileE.init("student", personArchivesDTO.getStudentId(), 1);
ArchivesPdfFileDO archivesPdfFileDO = new ArchivesPdfFileDO();
BeanUtils.copyProperties(archivesPdfFileE, archivesPdfFileDO);
archivesPdfFileRepository.save(archivesPdfFileDO);
personArchivesDTO.setArchivesPdfFileId(archivesPdfFileDO.getId());
return personArchivesDTO;
}
@Async("archivesAsyncExecutor")
public void execte2(){
// 5s后执行
public void execteGeneratePdf(ArchivesQry qry, PersonArchivesDTO params){
List<byte[]> byteArrayList = new ArrayList<>();
if (qry.getTypeList().contains(2)){
byteArrayList.add(execteAttendanceRecord(params));
}
if (qry.getTypeList().contains(3)){
byteArrayList.add(execteStudentRecord(params));
}
if (qry.getTypeList().contains(4)){
byteArrayList.add(execteStudyRecord(params));
}
if (qry.getTypeList().contains(5)){
byteArrayList.add(execteExamRecord(params));
}
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
byte[] pdf = WordToPdfUtil.mergeWordToPdf(byteArrayList);
String filepath = zcloudImgFilesFacade.saveFile(pdf, params.getName()+"-"+params.getClassName()+"-"+ DateUtil.getSdfTimes()+".pdf","personArchives", params.getClassCorpinfoId());
ArchivesPdfFileE archivesPdfFileE = new ArchivesPdfFileE();
archivesPdfFileE.initEdit(params.getArchivesPdfFileId(), filepath, 1, null);
ArchivesPdfFileDO archivesPdfFileDO = new ArchivesPdfFileDO();
BeanUtils.copyProperties(archivesPdfFileE, archivesPdfFileDO);
// archivesPdfFileRepository.updateById(archivesPdfFileDO);
} catch (Exception e) {
throw new RuntimeException(e);
}
System.out.println(2);
}
public byte[] execteAttendanceRecord(PersonArchivesDTO params){
try {
Map<String, Object> workItem = PropertyUtils.describe( params);
String templatePath = "templates/template/attendance_record.docx";
ByteArrayOutputStream outputStream = Tools.renderTemplate(templatePath, workItem);
return outputStream.toByteArray();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public byte[] execteStudentRecord(PersonArchivesDTO params){
try {
Map<String, Object> workItem = PropertyUtils.describe( params);
PictureRenderData picture = Pictures.ofUrl(prefixUrl + params.getUserAvatarUrl(), PictureType.JPEG).size(100, 100).create();//网络图片地址
workItem.put("img", picture);
String templatePath = "templates/template/studentInfo.docx";
ByteArrayOutputStream outputStream = Tools.renderTemplate(templatePath, workItem);
return outputStream.toByteArray();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public byte[] execteStudyRecord(PersonArchivesDTO params){
try {
Map<String, Object> workItem = PropertyUtils.describe( params);
if(!ObjectUtils.isEmpty(params.getSignFaceUrl())){
PictureRenderData signFacePicture = Pictures.ofUrl(prefixUrl + params.getSignFaceUrl(), PictureType.JPEG).size(100, 100).create();//网络图片地址
workItem.put("signFacePicture", signFacePicture);
}
if(!ObjectUtils.isEmpty(params.getExamSignFlag())){
PictureRenderData examSignFacePicture = Pictures.ofUrl(prefixUrl + params.getExamSignFaceUrl(), PictureType.JPEG).size(100, 100).create();//网络图片地址
workItem.put("examSignFacePicture", examSignFacePicture);
}
String templatePath = "templates/template/studyRecord.docx";
ByteArrayOutputStream outputStream = Tools.renderTemplate(templatePath, workItem);
return outputStream.toByteArray();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public byte[] execteExamRecord(PersonArchivesDTO params){
try {
Map<String, Object> workItem = PropertyUtils.describe( params.getStudentExamRecord());
ArrayList<Object> workList = CollUtil.newArrayList();
AtomicInteger atomicIndex = new AtomicInteger(1);
params.getStudentExamRecord().getExamRecordItemList().forEach(item -> {
try {
Map<String, Object> itemMap = PropertyUtils.describe( item);
int index = atomicIndex.getAndIncrement();
itemMap.put("index", index);
if(item.getQuestionType() == 1){
itemMap.put("questionTypeName", "单选题");
} else if(item.getQuestionType() == 2){
itemMap.put("questionTypeName", "多选题");
}else if(item.getQuestionType() == 3){
itemMap.put("questionTypeName", "判断题");
}
workList.add(itemMap);
} catch (Exception e) {
throw new RuntimeException(e);
}
});
workItem.put("examRecord_list", workList);
// if(!ObjectUtils.isEmpty(params.getStudentExamRecord().getSignUrl())){
// PictureRenderData signPicture = Pictures.ofUrl(prefixUrl + params.getStudentExamRecord().getSignUrl(), PictureType.JPEG).size(100, 100).create();//网络图片地址
// workItem.put("signPicture", signPicture);
// }
// if(!ObjectUtils.isEmpty(params.getExamSignFlag())){
// PictureRenderData examSignFacePicture = Pictures.ofUrl(prefixUrl + params.getExamSignFaceUrl(), PictureType.JPEG).size(100, 100).create();//网络图片地址
// workItem.put("examSignFacePicture", examSignFacePicture);
// }
String templatePath = "templates/template/exam.docx";
ByteArrayOutputStream outputStream = Tools.renderTemplate(templatePath, workItem);
System.out.println("5555555555555");
return outputStream.toByteArray();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}

View File

@ -1,12 +1,13 @@
package com.zcloud.edu.command.query.training;
import com.alibaba.cola.dto.PageResponse;
import com.zcloud.edu.command.convertor.training.TrainingApplyUserCoConvertor;
import com.zcloud.edu.dto.training.TrainingApplyUserPageQry;
import com.zcloud.edu.dto.clientobject.training.TrainingApplyUserCO;
import com.zcloud.edu.dto.training.TrainingApplyUserPageQry;
import com.zcloud.edu.dto.training.TrainingApplyUserPhonePageQry;
import com.zcloud.edu.persistence.dataobject.TrainingApplyUserDO;
import com.zcloud.edu.persistence.repository.training.TrainingApplyUserRepository;
import com.zcloud.gbscommon.utils.PageQueryHelper;
import com.alibaba.cola.dto.PageResponse;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Component;
@ -38,5 +39,14 @@ public class TrainingApplyUserQueryExe {
List<TrainingApplyUserCO> examCenterCOS = trainingApplyUserCoConvertor.converDOsToCOs(pageResponse.getData());
return PageResponse.of(examCenterCOS, pageResponse.getTotalCount(), pageResponse.getPageSize(), pageResponse.getPageIndex());
}
public PageResponse<TrainingApplyUserCO> executeListPageByPhone(TrainingApplyUserPhonePageQry qry) {
Map<String,Object> params = PageQueryHelper.toHashMap(qry);
PageResponse<TrainingApplyUserDO> pageResponse = trainingApplyUserRepository.listPageByPhone(params);
List<TrainingApplyUserCO> examCenterCOS = trainingApplyUserCoConvertor.converDOsToCOs(pageResponse.getData());
return PageResponse.of(examCenterCOS, pageResponse.getTotalCount(), pageResponse.getPageSize(), pageResponse.getPageIndex());
}
}

View File

@ -7,6 +7,7 @@ import com.zcloud.edu.command.training.TrainingApplyUserUpdateExe;
import com.zcloud.edu.command.query.training.TrainingApplyUserQueryExe;
import com.zcloud.edu.dto.training.TrainingApplyUserAddCmd;
import com.zcloud.edu.dto.training.TrainingApplyUserPageQry;
import com.zcloud.edu.dto.training.TrainingApplyUserPhonePageQry;
import com.zcloud.edu.dto.training.TrainingApplyUserUpdateCmd;
import com.zcloud.edu.dto.clientobject.training.TrainingApplyUserCO;
@ -34,6 +35,11 @@ public class TrainingApplyUserServiceImpl implements TrainingApplyUserServiceI {
return trainingApplyUserQueryExe.execute(qry);
}
@Override
public PageResponse<TrainingApplyUserCO> listPageByPhone(TrainingApplyUserPhonePageQry qry) {
return trainingApplyUserQueryExe.executeListPageByPhone(qry);
}
@Override
public SingleResponse add(TrainingApplyUserAddCmd cmd) {

View File

@ -15,6 +15,7 @@ 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 com.zcloud.edu.dto.data.archives.PersonArchivesDTO;
import com.zcloud.gbscommon.utils.Tools;
import com.zcloud.gbscommon.utils.WordToPdfUtil;
import com.zcloud.gbscommon.zcloudimgfiles.facade.ZcloudImgFilesFacade;
@ -26,7 +27,9 @@ import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
/**
* web-app
@ -47,19 +50,37 @@ public class ArchivesServiceImpl implements ArchivesServiceI {
// HashMap<String, Object> workItem = new HashMap<>();
// workItem.put("qry", "555");
// String templatePath = "templates/template/category_score_list.docx";
// try {
try {
// ByteArrayOutputStream outputStream = Tools.renderTemplate(templatePath, workItem);
// workItem.put("qry", "16516851");
// ByteArrayOutputStream outputStream1 = Tools.renderTemplate(templatePath, workItem);
//
// List<byte[]> byteArrayList = new ArrayList<>();
// byteArrayList.add(outputStream.toByteArray());
// byteArrayList.add(outputStream1.toByteArray());
// byte[] pdf = WordToPdfUtil.mergeWordToPdf(byteArrayList);
// byte[] pdfBytes = WordToPdfUtil.convertWordBytesToPdfBytes(outputStream.toByteArray());
// String s = zcloudImgFilesFacade.saveFile(pdfBytes, "clockSign.pdf","clockSign");
// String s = zcloudImgFilesFacade.saveFile(pdf, "clockSign11.pdf","clockSign");
//
// System.out.println(s);
// archivesQueryExe.downloadPersonArchives();
archivesQueryExe.execte2();
} catch (Exception e) {
throw new RuntimeException(e);
}
PersonArchivesDTO personArchivesDTO = archivesQueryExe.downloadPersonArchives(qry);
// 首页
// archivesQueryExe.execteHomePage(personArchivesDTO);
// 查询学时证明
archivesQueryExe.execteGeneratePdf(qry,personArchivesDTO);
// 查询学习档案
// archivesQueryExe.execteStudyArchives(personArchivesDTO);
// 查询学习记录
// archivesQueryExe.execteStudyRecord(personArchivesDTO);
// 查询考试记录
// archivesQueryExe.execteStudentExamRecord(personArchivesDTO);
System.out.println("下载成功");
// } catch (IOException e) {
// throw new RuntimeException(e);
// }
}
}

View File

@ -1,7 +1,9 @@
package com.zcloud.edu.api.training;
import com.zcloud.edu.dto.clientobject.training.TrainingApplyRecordCO;
import com.zcloud.edu.dto.training.TrainingApplyUserAddCmd;
import com.zcloud.edu.dto.training.TrainingApplyUserPageQry;
import com.zcloud.edu.dto.training.TrainingApplyUserPhonePageQry;
import com.zcloud.edu.dto.training.TrainingApplyUserUpdateCmd;
import com.zcloud.edu.dto.clientobject.training.TrainingApplyUserCO;
@ -16,6 +18,8 @@ import com.alibaba.cola.dto.SingleResponse;
public interface TrainingApplyUserServiceI {
PageResponse<TrainingApplyUserCO> listPage(TrainingApplyUserPageQry qry);
PageResponse<TrainingApplyUserCO> listPageByPhone(TrainingApplyUserPhonePageQry qry);
SingleResponse<TrainingApplyUserCO> add(TrainingApplyUserAddCmd cmd);
void edit(TrainingApplyUserUpdateCmd cmd);

View File

@ -24,7 +24,10 @@ public class ArchivesQry {
* - `le`:
* - `ne`: SQL!=
*/
// 档案类型 1-首页 2-学时证明 3-学员学习档案 4-学习记录 5-考卷信息
private List<Integer> typeList;
private String studentId;
private Long stuId;
}

View File

@ -39,7 +39,7 @@ public class ArchivesReviewCO extends ClientObject {
private String corpName;
//编写时间
@ApiModelProperty(value = "编写时间")
@JsonFormat(pattern = "yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime writeDate;
//教材类型
@ApiModelProperty(value = "教材类型")
@ -52,7 +52,7 @@ public class ArchivesReviewCO extends ClientObject {
private String compere;
//会审时间
@ApiModelProperty(value = "会审时间")
@JsonFormat(pattern = "yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime auditDate;
//会审意见
@ApiModelProperty(value = "会审意见")
@ -89,11 +89,11 @@ public class ArchivesReviewCO extends ClientObject {
private Integer version;
//创建时间
@ApiModelProperty(value = "创建时间")
@JsonFormat(pattern = "yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
//修改时间
@ApiModelProperty(value = "修改时间")
@JsonFormat(pattern = "yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;
//创建人id
@ApiModelProperty(value = "创建人id")

View File

@ -41,6 +41,10 @@ public class StudentSignCO extends ClientObject {
@ApiModelProperty(value = "打卡签字路径")
private String signUrl;
//学员姓名
@ApiModelProperty(value = "学员姓名")
private String studentName;
@ApiModelProperty(value = "培训地点")
@TableField(exist = false)

View File

@ -1,6 +1,7 @@
package com.zcloud.edu.dto.clientobject.training;
import com.alibaba.cola.dto.ClientObject;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@ -38,9 +39,48 @@ public class TrainingApplyUserCO extends ClientObject {
//身份证号
@ApiModelProperty(value = "身份证号")
private String idCard;
//关联项目
@ApiModelProperty(value = "关联项目")
private String projectName;
//申请企业id
@ApiModelProperty(value = "申请企业id")
@TableField(exist = false)
private Long applyCorpinfoId;
//申请企业名称
@ApiModelProperty(value = "申请企业名称")
@TableField(exist = false)
private String applyCorpinfoName;
//审批企业id
@ApiModelProperty(value = "审批企业id")
@TableField(exist = false)
private Long approvalCorpinfoId;
//审批部门id
@ApiModelProperty(value = "审批部门id")
@TableField(exist = false)
private Long approvalDepartmentId;
//审批用户id
@ApiModelProperty(value = "审批用户id")
@TableField(exist = false)
private Long approvalUserId;
//审批企业id
@ApiModelProperty(value = "审批企业名称")
@TableField(exist = false)
private String approvalCorpinfoName;
//审批部门id
@ApiModelProperty(value = "审批部门名称")
@TableField(exist = false)
private String approvalDepartmentName;
//审批用户id
@ApiModelProperty(value = "审批用户名称")
@TableField(exist = false)
private String approvalUserName;
//乐观锁
@ApiModelProperty(value = "乐观锁")
private Integer version;

View File

@ -1,5 +1,6 @@
package com.zcloud.edu.dto.data.archives;
import com.zcloud.edu.dto.clientobject.study.StudentExamRecordCO;
import com.zcloud.edu.dto.clientobject.study.StudentSignCO;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@ -80,6 +81,9 @@ public class PersonArchivesDTO {
//学员状态 0-未学习 1-已签到 2-考试通过 3-未签到 4-考试未通过
@ApiModelProperty(value = "学员状态 0-未学习 1-已签到 2-考试通过 3-未签到 4-考试未通过")
private Integer state;
//学员状态 0-未学习 1-已签到 2-考试通过 3-未签到 4-考试未通过
@ApiModelProperty(value = "学员状态翻译")
private String stateName;
//班级名称
@ -109,6 +113,9 @@ public class PersonArchivesDTO {
//机构ID
@ApiModelProperty(value = "机构ID")
private Long corpinfoId;
//机构名称
private String corpName;
//状态1-未申请 2-待开班 3- 培训中 4-培训结束
@ApiModelProperty(value = "状态1-未申请 2-待开班 3- 培训中 4-培训结束 ")
private Integer classState;
@ -140,4 +147,9 @@ public class PersonArchivesDTO {
private String examSignFaceUrl;
@ApiModelProperty(value = "签字列表")
private List<StudentSignCO> signList;
@ApiModelProperty(value = "考试记录")
private StudentExamRecordCO studentExamRecord;
@ApiModelProperty(value = "档案pdf文件id")
private Long archivesPdfFileId;
}

View File

@ -0,0 +1,33 @@
package com.zcloud.edu.dto.training;
import com.alibaba.cola.dto.PageQuery;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* web-client
* @Author makejava
* @Date 2026-01-12 15:36:36
*/
@Data
public class TrainingApplyUserPhonePageQry extends PageQuery {
/**
* ,
* - `like`: SQLLIKE
* - `eq`: SQL=
* - `gt`:
* - `lt`:
* - `ge`:
* - `le`:
* - `ne`: SQL!=
*/
@ApiModelProperty(value = "所属相关方(uuid)", name = "eqCorpinfoId", required = false)
private String eqCorpinfoId;
@ApiModelProperty(value = "手机号" , name = "eqPhone", required = false)
private String eqPhone;
}

View File

@ -1,7 +1,9 @@
package com.zcloud.edu.domain.model.archives;
import com.jjb.saas.framework.domain.model.BaseE;
import com.zcloud.gbscommon.utils.Tools;
import lombok.Data;
import org.springframework.util.ObjectUtils;
import java.time.LocalDateTime;
@ -57,5 +59,21 @@ public class ArchivesPdfFileE extends BaseE {
private Long createId;
//修改人id
private Long updateId;
public void init(String tableName, String tableId, Integer type){
this.setArchivesPdfFileId(Tools.get32UUID());
this.setTableName(tableName);
this.setTableId(tableId);
this.setType(type);
this.setStatus(0);
}
public void initEdit(Long id, String filePath, Integer status, String errormsg){
this.setId(id);
this.setFilePath(filePath);
this.setStatus(status);
if(!ObjectUtils.isEmpty(errormsg)){
this.setErrormsg(errormsg.length() > 3000 ? errormsg.substring(0, 3000) : errormsg);
}
}
}

View File

@ -116,6 +116,9 @@ public class PersonArchivesE extends BaseE {
//机构ID
@ApiModelProperty(value = "机构ID")
private Long corpinfoId;
//机构名称
private String corpName;
//状态1-未申请 2-待开班 3- 培训中 4-培训结束
@ApiModelProperty(value = "状态1-未申请 2-待开班 3- 培训中 4-培训结束 ")
private Integer classState;
@ -144,6 +147,9 @@ public class PersonArchivesE extends BaseE {
@ApiModelProperty(value = "考试签到人脸图片路径")
private String examSignFaceUrl;
@ApiModelProperty(value = "学员状态翻译")
private String stateName;
public void init(StudentE studentE, ClassE classE, List<ClassCurriculumE> classCurList) {
BeanUtils.copyProperties(studentE, this);
setStuId(studentE.getId());
@ -230,4 +236,62 @@ public class PersonArchivesE extends BaseE {
}
}
public void initDownload(StudentE studentE,
ClassE classE,
List<ClassCurriculumE> classCurList,
List<ClassCurriculumChapterE> chapterEList,
List<StudentSignE> studentSignEList){
BeanUtils.copyProperties(studentE, this);
setStuId(studentE.getId());
if (!ObjectUtils.isEmpty(studentE.getState())){
setStateName(studentE.getState() == 1 ? "已完成" : "未完成");
}
if (classE != null){
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());
setCorpName(classE.getCorpName());
setTrainDurationTime(DateUtil.getMinuteSub(classE.getStartTime(), classE.getEndTime()));
}
if (classCurList != null && classCurList.size() > 0){
String trainSubject = classCurList.stream().map(ClassCurriculumE::getCurriculumName).collect(Collectors.joining(","));
setTrainSubject(trainSubject);
BigDecimal videoTotalTime = classCurList.stream()
.map(ClassCurriculumE::getVideoTotalTime) // 假设getBigDecimalField是获取BigDecimal字段的方法
.filter(bigDecimal -> bigDecimal != null) // 过滤null值防止空指针异常
.reduce(BigDecimal.ZERO, BigDecimal::add);
setVideoTotalTime(videoTotalTime);
}
if (chapterEList != null && chapterEList.size() > 0){
setVideoCount(chapterEList.size());
}
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

@ -71,8 +71,13 @@ public class StudentSignE extends BaseE {
private Long createId;
//修改人id
private Long updateId;
private String prefixUrl = "https://jpfz.qhdsafety.com/gbsFileTest/";
private static String prefixUrl;
// = "https://jpfz.qhdsafety.com/gbsFileTest/";
// public static Integer corePoolSize;
@Value("${file.url}")
public void setPrefixUrl(String prefixUrlProperties) {
prefixUrl = prefixUrlProperties;
}
@DubboReference
private ZcloudImgFilesFacade zcloudImgFilesFacade;

View File

@ -7,6 +7,8 @@ import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
/**
* web-infrastructure
* @Author makejava
@ -42,6 +44,43 @@ public class TrainingApplyUserDO extends BaseDO {
@TableField(exist = false)
private String userName;
//申请企业id
@ApiModelProperty(value = "申请企业id")
@TableField(exist = false)
private Long applyCorpinfoId;
//申请企业名称
@ApiModelProperty(value = "申请企业名称")
@TableField(exist = false)
private String applyCorpinfoName;
//更新时间
@ApiModelProperty(value = "更新时间")
private LocalDateTime updateTime;
//审批企业id
@ApiModelProperty(value = "审批企业id")
@TableField(exist = false)
private Long approvalCorpinfoId;
//审批部门id
@ApiModelProperty(value = "审批部门id")
@TableField(exist = false)
private Long approvalDepartmentId;
//审批用户id
@ApiModelProperty(value = "审批用户id")
@TableField(exist = false)
private Long approvalUserId;
//审批企业id
@ApiModelProperty(value = "审批企业名称")
@TableField(exist = false)
private String approvalCorpinfoName;
//审批部门id
@ApiModelProperty(value = "审批部门名称")
@TableField(exist = false)
private String approvalDepartmentName;
//审批用户id
@ApiModelProperty(value = "审批用户名称")
@TableField(exist = false)
private String approvalUserName;
public TrainingApplyUserDO(String trainingApplyUserId) {
this.trainingApplyUserId = trainingApplyUserId;
}

View File

@ -36,6 +36,7 @@ public class StudentDO extends BaseDO {
private String classId;
//班级id(雪花)
@ApiModelProperty(value = "班级id(雪花)")
@TableField(exist = false)
private String clzId;
//学员姓名
@ApiModelProperty(value = "学员姓名")

View File

@ -1,5 +1,7 @@
package com.zcloud.edu.persistence.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.zcloud.edu.persistence.dataobject.TrainingApplyRecordDO;
import com.zcloud.edu.persistence.dataobject.TrainingApplyUserDO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
@ -21,6 +23,8 @@ public interface TrainingApplyUserMapper extends BaseMapper<TrainingApplyUserDO>
*/
List<TrainingApplyUserDO> selectByRecordId(@Param("trainingApplyRecordId") String trainingApplyRecordId);
IPage<TrainingApplyUserDO> listPageByPhone(IPage<TrainingApplyUserDO> page, @Param("params") Map<String, Object> params);
/**
*
*/

View File

@ -1,21 +1,19 @@
package com.zcloud.edu.persistence.repository.impl;
import com.jjb.saas.framework.auth.model.SSOUser;
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.auth.utils.AuthContext;
import com.jjb.saas.framework.repository.common.PageHelper;
import com.jjb.saas.framework.repository.repo.impl.BaseRepositoryImpl;
import com.zcloud.edu.persistence.dataobject.TrainingApplyUserDO;
import com.zcloud.edu.persistence.mapper.TrainingApplyUserMapper;
import com.zcloud.edu.persistence.repository.training.TrainingApplyUserRepository;
import com.alibaba.cola.dto.PageResponse;
import com.zcloud.gbscommon.utils.PageQueryHelper;
import com.zcloud.gbscommon.utils.Query;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.jjb.saas.framework.repository.repo.impl.BaseRepositoryImpl;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.Collections;
import java.util.List;
import java.util.Map;
@ -39,6 +37,13 @@ public class TrainingApplyUserRepositoryImpl extends BaseRepositoryImpl<Training
return PageHelper.pageToResponse(result, result.getRecords());
}
@Override
public PageResponse<TrainingApplyUserDO> listPageByPhone(Map<String, Object> params) {
IPage<TrainingApplyUserDO> iPage = new Query<TrainingApplyUserDO>().getPage(params);
IPage<TrainingApplyUserDO> result = trainingApplyUserMapper.listPageByPhone(iPage, params);
return PageHelper.pageToResponse(result, result.getRecords());
}
@Override
public List<TrainingApplyUserDO> getByRecordId(String trainingApplyRecordId) {
return trainingApplyUserMapper.selectByRecordId(trainingApplyRecordId);

View File

@ -1,5 +1,6 @@
package com.zcloud.edu.persistence.repository.training;
import com.zcloud.edu.persistence.dataobject.TrainingApplyRecordDO;
import com.zcloud.edu.persistence.dataobject.TrainingApplyUserDO;
import com.alibaba.cola.dto.PageResponse;
import com.jjb.saas.framework.repository.repo.BaseRepository;
@ -16,6 +17,8 @@ public interface TrainingApplyUserRepository extends BaseRepository<TrainingAppl
PageResponse<TrainingApplyUserDO> listPage(Map<String,Object> params);
PageResponse<TrainingApplyUserDO> listPageByPhone(Map<String,Object> params);
/**
* ID
*/

View File

@ -48,7 +48,28 @@
</if>
</select>
<select id="listPageByPhone" resultType="com.zcloud.edu.persistence.dataobject.TrainingApplyUserDO">
SELECT
tau.*,
sqco.corp_name apply_corpinfo_name,
spco.corp_name approval_corpinfo_name,
spdept.name approval_department_name,
spuser.name approval_user_name
from
training_apply_user tau
left join training_apply_record tar on tar.training_apply_record_id = tau.training_apply_record_id
left join corp_info sqco on sqco.id = tar.apply_corpinfo_id
left join corp_info spco on spco.id = tar.approval_corpinfo_id
left join department spdept on spdept.id = tar.approval_department_id
left join user spuser on spuser.id = tar.approval_user_id
<where>
and tar.delete_enum = 'false'
and tau.delete_enum = 'false'
and tau.user_id in (
select u.id from user u where u.phone = #{params.eqPhone} and u.delete_enum = 'false' and u.corpinfo_id = #{params.eqCorpinfoId}
)
</where>
</select>
</mapper>