Merge remote-tracking branch 'origin/master' into master-wangwei

This commit is contained in:
Edward_89 2024-12-30 20:47:59 +08:00
commit dfb9286d03
30 changed files with 500 additions and 47 deletions

View File

@ -6,6 +6,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.module.llm.controller.admin.dataset.dto.DataJsonTemplate;
import cn.iocoder.yudao.module.llm.controller.admin.dataset.vo.DatasetPageReqVO;
import cn.iocoder.yudao.module.llm.controller.admin.dataset.vo.DatasetRespVO;
import cn.iocoder.yudao.module.llm.controller.admin.dataset.vo.DatasetSaveReqVO;

View File

@ -1,10 +1,17 @@
package cn.iocoder.yudao.module.llm.controller.admin.dataset;
import cn.iocoder.yudao.module.llm.controller.admin.dataset.vo.DatasetAnswerRespVO;
import cn.iocoder.yudao.module.llm.controller.admin.dataset.vo.DatasetQuestionPageReqVO;
import cn.iocoder.yudao.module.llm.controller.admin.dataset.vo.DatasetQuestionRespVO;
import cn.iocoder.yudao.module.llm.controller.admin.dataset.vo.DatasetQuestionSaveReqVO;
import cn.iocoder.yudao.module.llm.dal.dataobject.dataset.DatasetQuestionDO;
import cn.iocoder.yudao.module.llm.service.dataset.DatasetQuestionService;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.util.CellRangeAddress;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
@ -18,6 +25,7 @@ import javax.validation.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.IOException;
import java.util.stream.Collectors;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
@ -56,6 +64,63 @@ public class DatasetQuestionController {
return success(pageResult);
}
@GetMapping("/export-excel")
@Operation(summary = "导出数据集数据文件 Excel")
@PreAuthorize("@ss.hasPermission('llm:dataset-files:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportDatasetFilesExcel(@Valid DatasetQuestionPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
HSSFWorkbook template = new HSSFWorkbook();
HSSFSheet sheet = template.createSheet();
// 创建样式并设置垂直居中
HSSFCellStyle cellStyle = template.createCellStyle();
cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
int count = 0;
HSSFRow row = sheet.createRow(count);
row.createCell(0).setCellValue("问题内容");
row.createCell(1).setCellValue("标注内容");
count++;
List<Integer> id = new ArrayList<>();
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<DatasetQuestionRespVO> list = datasetQuestionService.getDatasetQuestionPage(pageReqVO).getList();
for (DatasetQuestionRespVO item : list){
String question = item.getQuestion();
List<DatasetAnswerRespVO> datasetAnswerRespVO = item.getDatasetAnswerRespVO();
List<String> collect = datasetAnswerRespVO.stream().map(DatasetAnswerRespVO::getAnswer).collect(Collectors.toList());
if (collect.size() == 0){
row = sheet.createRow(count);
row.createCell(0).setCellValue(question);
row.createCell(1).setCellValue("");
id.add(count);
count++;
}else {
for (String s : collect) {
row = sheet.createRow(count);
row.createCell(0).setCellValue(question);
row.createCell(1).setCellValue(s);
count++;
}
id.add(count-1);
}
}
//合并相同内容的单元格
for (int i = 0; i < id.size() - 1; i++){
if (id.get(i+1)-id.get(i)>1) {
sheet.addMergedRegion(new CellRangeAddress(id.get(i)+1, id.get(i + 1), 0, 0));
}
}
// 导出 Excel
try {
response.setCharacterEncoding("UTF-8");
response.setContentType("application/vnd.ms-excel");
template.write(response.getOutputStream());
response.getOutputStream().close();
template.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/* @PutMapping("/update")
@Operation(summary = "更新数据集数据问题")
@PreAuthorize("@ss.hasPermission('llm:dataset-question:update')")
@ -104,4 +169,4 @@ public class DatasetQuestionController {
return success(datasetQuestionService.createDatasetQuestion(createReqVO));
}*/
}
}

View File

@ -0,0 +1,12 @@
package cn.iocoder.yudao.module.llm.controller.admin.dataset.dto;
import lombok.Data;
import java.util.List;
@Data
public class DataJsonTemplate {
private String system;
private String question;
private List<String> answers;
}

View File

@ -47,6 +47,6 @@ public class DatasetPageReqVO extends PageParam {
private Long dataLength;
@Schema(description = "标注进度", example = "20")
private String annotateProgress;
private Integer annotateProgress;
}

View File

@ -35,7 +35,8 @@ public class DatasetQuestionRespVO {
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
@Schema(description = "系统身份")
private String system;
@Schema(description = "标注内容")
private List<DatasetAnswerRespVO> datasetAnswerRespVO;

View File

@ -24,7 +24,10 @@ public class DatasetQuestionSaveReqVO {
@Schema(description = "标注状态使用字典llm_dataset_mark_status", example = "1")
private Integer status;
@Schema(description = "系统身份")
private String system;
@Schema(description = "标注内容")
private List<DatasetAnswerSaveReqVO> datasetAnswerSaveReqVO;
private List<DatasetAnswerSaveReqVO> datasetAnswerRespVO;
}

View File

@ -55,7 +55,7 @@ public class DatasetRespVO {
private Long dataLength;
@Schema(description = "标注进度", example = "20")
private String annotateProgress;
private Integer annotateProgress;
/* @Schema(description = "数据集数据文件", example = "[]")
private List<DatasetQuestionRespVO> datasetQuestionRespVOS;*/

View File

@ -42,7 +42,7 @@ public class DatasetSaveReqVO {
private Long dataLength;
@Schema(description = "标注进度", example = "20")
private String annotateProgress;
private Integer annotateProgress;
@Schema(description = "数据集数据文件", example = "[]")
private List<DatasetFilesSaveReqVO> datasetFiles;

View File

@ -1,5 +1,7 @@
package cn.iocoder.yudao.module.llm.controller.admin.modelassesstaskauto;
import cn.iocoder.yudao.module.llm.controller.admin.modelassesstaskmanual.vo.ModelAssessTaskManualPageReqVO;
import cn.iocoder.yudao.module.llm.controller.admin.modelassesstaskmanual.vo.ModelAssessTaskManualRespVO;
import cn.iocoder.yudao.module.llm.dal.dataobject.modelassesstaskauto.ModelAssessTaskStoplistDO;
import cn.iocoder.yudao.module.llm.dal.mysql.modelassesstaskauto.ModelAssessTaskStoplistMapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@ -98,4 +100,30 @@ public class ModelAssessTaskAutoController {
BeanUtils.toBean(list, ModelAssessTaskAutoRespVO.class));
}
}
@GetMapping("/gitReport")
@Operation(summary = "查看报告详情")
@PreAuthorize("@ss.hasPermission('llm:model-assess-task-manual:query')")
public CommonResult<PageResult<ModelAssessTaskManualRespVO>> gitViewTheReportDetails(@Valid ModelAssessTaskManualPageReqVO pageReqVO) {
//TODO 自动评估-查看报告待补充
return success(new PageResult<>());
}
@PostMapping("/backedUp")
@Operation(summary = "备份")
public void backedUp(ModelAssessTaskManualPageReqVO pageReqVO) {
//TODO 自动评估-备份待补充
}
@PostMapping("/cancelTheBackUp")
@Operation(summary = "取消备份")
public void cancelTheBackUp(ModelAssessTaskManualPageReqVO pageReqVO) {
//TODO 自动评估-取消备份待补充
}
@PostMapping("/reEvaluation")
@Operation(summary = "重新评估")
public void reEvaluation(ModelAssessTaskManualPageReqVO pageReqVO) {
//TODO 自动评估-重新评估待补充
}
}

View File

@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.llm.controller.admin.modelassesstaskmanual;
import cn.iocoder.yudao.module.llm.controller.admin.dataset.vo.DatasetQuestionPageReqVO;
import cn.iocoder.yudao.module.llm.dal.dataobject.modelassesstaskmanual.ModelAssessTaskDimensionDO;
import cn.iocoder.yudao.module.llm.dal.mysql.modelassesstaskmanual.ModelAssessTaskDimensionMapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@ -97,4 +98,40 @@ public class ModelAssessTaskManualController {
BeanUtils.toBean(list, ModelAssessTaskManualRespVO.class));
}
}
@GetMapping("/gitReport")
@Operation(summary = "查看报告详情")
@PreAuthorize("@ss.hasPermission('llm:model-assess-task-manual:query')")
public CommonResult<PageResult<ModelAssessTaskManualRespVO>> gitViewTheReportDetails(@Valid ModelAssessTaskManualPageReqVO pageReqVO) {
//TODO 人工评估-查看报告待补充
return success(new PageResult<>());
}
@GetMapping("/getManualAssessment")
@Operation(summary = "人工评估")
@PreAuthorize("@ss.hasPermission('llm:model-assess-task-manual:query')")
public CommonResult<PageResult<ModelAssessTaskManualRespVO>> getManualAssessment(ModelAssessTaskManualPageReqVO pageReqVO) {
//TODO 人工评估-人工评估标注补充
return success(new PageResult<>());
}
@PostMapping("/backedUp")
@Operation(summary = "备份")
public void backedUp(ModelAssessTaskManualPageReqVO pageReqVO) {
//TODO 人工评估-备份待补充
}
@PostMapping("/cancelTheBackUp")
@Operation(summary = "取消备份")
public void cancelTheBackUp(ModelAssessTaskManualPageReqVO pageReqVO) {
//TODO 人工评估-取消备份待补充
}
@PostMapping("/saveTheLabelData")
@Operation(summary = "保存标注数据")
@PreAuthorize("@ss.hasPermission('llm:model-assess-task-manual:create')")
public void saveTheLabelData(ModelAssessTaskManualSaveReqVO updateReqV){
//TODO 人工评估-保存标注数据待补充
}
}

View File

@ -66,6 +66,6 @@ public class DatasetDO extends BaseDO {
/**
* 标注进度
*/
private String annotateProgress;
private Integer annotateProgress;
}

View File

@ -44,4 +44,6 @@ public class DatasetQuestionDO extends BaseDO {
*/
private Integer status;
private String system;
}

View File

@ -33,6 +33,6 @@ public interface DatasetMapper extends BaseMapperX<DatasetDO> {
.orderByDesc(DatasetDO::getId));
}
@Update("update llm_dataset set annotate_progress = CONCAT(#{formattedRatio}, '%') where id = #{datasetId}")
void updateProcess(@Param("formattedRatio") String formattedRatio, @Param("datasetId") Long datasetId);
@Update("update llm_dataset set annotate_progress = #{formattedRatio} where id = #{datasetId}")
void updateProcess(@Param("formattedRatio") Integer formattedRatio, @Param("datasetId") Long datasetId);
}

View File

@ -97,9 +97,11 @@ public class DatasetQuestionServiceImpl implements DatasetQuestionService {
updateReqVOS.forEach(updateReqVO -> {
DatasetQuestionDO datasetQuestionDO = BeanUtils.toBean(updateReqVO, DatasetQuestionDO.class);
datasetQuestionMapper.updateById(datasetQuestionDO);
List<DatasetAnswerSaveReqVO> datasetAnswerSaveReqVO = updateReqVO.getDatasetAnswerSaveReqVO();
List<DatasetAnswerSaveReqVO> datasetAnswerSaveReqVO = updateReqVO.getDatasetAnswerRespVO();
List<DatasetAnswerDO> datasetAnswerDOS = BeanUtils.toBean(datasetAnswerSaveReqVO, DatasetAnswerDO.class);
datasetAnswerMapper.insertOrUpdate(datasetAnswerDOS);
if (CollectionUtils.isNotEmpty(datasetAnswerDOS)){
datasetAnswerMapper.insertOrUpdate(datasetAnswerDOS);
}
});
// 标注进度修改
LambdaQueryWrapper<DatasetQuestionDO> wrapper = new LambdaQueryWrapper<DatasetQuestionDO>()
@ -108,7 +110,7 @@ public class DatasetQuestionServiceImpl implements DatasetQuestionService {
wrapper.eq(DatasetQuestionDO::getStatus,2);
Long annoCount = datasetQuestionMapper.selectCount(wrapper);
double ratio = sumCount == 0 ? 0 : ((double) annoCount / sumCount) *100;
String formattedRatio = String.format("%.2f", ratio);
Integer formattedRatio = ratio == 0 ? 0 : (int) ratio;
datasetMapper.updateProcess(formattedRatio, updateReqVOS.get(0).getDatasetId());
}

View File

@ -2,6 +2,8 @@ package cn.iocoder.yudao.module.llm.service.dataset;
import java.util.*;
import javax.validation.*;
import cn.iocoder.yudao.module.llm.controller.admin.dataset.dto.DataJsonTemplate;
import cn.iocoder.yudao.module.llm.controller.admin.dataset.vo.*;
import cn.iocoder.yudao.module.llm.dal.dataobject.dataset.DatasetDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;

View File

@ -4,10 +4,13 @@ package cn.iocoder.yudao.module.llm.service.dataset;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.llm.constant.DataConstants;
import cn.iocoder.yudao.module.llm.controller.admin.dataset.dto.DataJsonTemplate;
import cn.iocoder.yudao.module.llm.controller.admin.dataset.vo.*;
import cn.iocoder.yudao.module.llm.dal.dataobject.dataset.DatasetAnswerDO;
import cn.iocoder.yudao.module.llm.dal.dataobject.dataset.DatasetDO;
import cn.iocoder.yudao.module.llm.dal.dataobject.dataset.DatasetFilesDO;
import cn.iocoder.yudao.module.llm.dal.dataobject.dataset.DatasetQuestionDO;
import cn.iocoder.yudao.module.llm.dal.mysql.dataset.DatasetAnswerMapper;
import cn.iocoder.yudao.module.llm.dal.mysql.dataset.DatasetFilesMapper;
import cn.iocoder.yudao.module.llm.dal.mysql.dataset.DatasetMapper;
import cn.iocoder.yudao.module.llm.dal.mysql.dataset.DatasetQuestionMapper;
@ -49,6 +52,8 @@ public class DatasetServiceImpl implements DatasetService {
private DatasetFilesMapper datasetFilesMapper;
@Resource
private DatasetQuestionMapper datasetQuestionMapper;
@Resource
private DatasetAnswerMapper datasetAnswerMapper;
@Override
public Long createDataset(DatasetSaveReqVO createReqVO) {
@ -107,7 +112,7 @@ public class DatasetServiceImpl implements DatasetService {
.eq(DatasetQuestionDO::getDatasetId, updateObj.getId())
.eq(DatasetQuestionDO::getStatus,2));
double ratio = count == 0 ? 0 : ((double) annoCount / count) *100;
String formattedRatio = String.format("%.2f%%", ratio);
Integer formattedRatio = ratio == 0 ? 0 : (int) ratio;
if (formattedRatio != null){
updateObj.setAnnotateProgress(formattedRatio);
}
@ -186,16 +191,27 @@ public class DatasetServiceImpl implements DatasetService {
content.append(line);
}
// 使用Jackson解析 Json 字符串为List<String>对象
// 使用Jackson解析 Json 字符串为List<String>对象
ObjectMapper mapper = new ObjectMapper();
// 使用 TypeReference 解析 JSON 字符串为 List<String>
List<String> stringList = mapper.readValue(content.toString(), new TypeReference<List<String>>() {});
stringList.forEach(
string -> {
DatasetQuestionDO datasetQuestionDO = new DatasetQuestionDO();
List<DataJsonTemplate> jsonList = mapper.readValue(content.toString(), new TypeReference<List<DataJsonTemplate>>() {});
jsonList.forEach(
dataJsonTemplate -> {
DatasetQuestionDO datasetQuestionDO = BeanUtils.toBean(dataJsonTemplate, DatasetQuestionDO.class);
datasetQuestionDO.setDatasetId(datasetFilesDO.getDatasetId());
datasetQuestionDO.setQuestion(string);
datasetQuestionDO.setDatasetFilesId(datasetFilesDO.getId());
datasetQuestionMapper.insert(datasetQuestionDO);
List<String> answers = dataJsonTemplate.getAnswers();
if (CollectionUtils.isNotEmpty(answers)){
for (String answer : answers) {
DatasetAnswerDO datasetAnswerDO = new DatasetAnswerDO();
datasetAnswerDO.setDatasetId(datasetFilesDO.getDatasetId());
datasetAnswerDO.setDatasetFilesId(datasetFilesDO.getId());
datasetAnswerDO.setQuestionId(datasetQuestionDO.getId());
datasetAnswerDO.setAnswer(answer);
datasetAnswerMapper.insert(datasetAnswerDO);
}
}
}
);
}catch (Exception e){

View File

@ -125,19 +125,20 @@ public class ModelAssessTaskAutoServiceImpl implements ModelAssessTaskAutoServic
List<ModelAssessTaskStoplistRespVO> stoplistRespVOS = BeanUtils.toBean(modelAssessTaskStoplistDOS, ModelAssessTaskStoplistRespVO.class);
// 提取id
List<Long> stoplistIds = modelAssessTaskStoplistDOS.stream().map(ModelAssessTaskStoplistDO::getStoplistId).collect(Collectors.toList());
// 查询停用词表 将词表word返回
LambdaQueryWrapper<ModelAssessStoplistDO> wrapper = new LambdaQueryWrapper<>();
wrapper.in(ModelAssessStoplistDO::getId,stoplistIds);
List<ModelAssessStoplistDO> modelAssessStoplistDOs = modelAssessStoplistMapper.selectList(wrapper);
Map<Long, ModelAssessStoplistDO> longModelServiceDOMap = cn.iocoder.yudao.framework.common.util.collection.
CollectionUtils.convertMap(modelAssessStoplistDOs, ModelAssessStoplistDO::getId);
stoplistRespVOS.stream().forEach(stoplistRespVO -> {
ModelAssessStoplistDO modelAssessStoplistDO = longModelServiceDOMap.get(stoplistRespVO.getStoplistId());
if(modelAssessStoplistDO != null){
stoplistRespVO.setStoplistName(modelAssessStoplistDO.getWord());
}
});
if (!CollectionUtils.isEmpty(stoplistIds)){
// 查询停用词表 将词表word返回
LambdaQueryWrapper<ModelAssessStoplistDO> wrapper = new LambdaQueryWrapper<>();
wrapper.in(ModelAssessStoplistDO::getId,stoplistIds);
List<ModelAssessStoplistDO> modelAssessStoplistDOs = modelAssessStoplistMapper.selectList(wrapper);
Map<Long, ModelAssessStoplistDO> longModelServiceDOMap = cn.iocoder.yudao.framework.common.util.collection.
CollectionUtils.convertMap(modelAssessStoplistDOs, ModelAssessStoplistDO::getId);
stoplistRespVOS.stream().forEach(stoplistRespVO -> {
ModelAssessStoplistDO modelAssessStoplistDO = longModelServiceDOMap.get(stoplistRespVO.getStoplistId());
if(modelAssessStoplistDO != null){
stoplistRespVO.setStoplistName(modelAssessStoplistDO.getWord());
}
});
}
result.setStoplists(stoplistRespVOS);
ModelServiceDO modelServiceDO = modelServiceMapper.selectById(modelAssessTaskAutoDO.getModelService());

View File

@ -122,19 +122,20 @@ public class ModelAssessTaskManualServiceImpl implements ModelAssessTaskManualSe
// 提取id
List<Long> dimensionIds = modelAssessTaskDimensionDOS.stream().map(ModelAssessTaskDimensionDO::getDimensionId).collect(Collectors.toList());
// 查询模型评估维度 将维度名称返回
List<ModelAssessDimensionDO> modelAssessDimensionDOS = modelAssessDimensionMapper.selectList(new LambdaQueryWrapper<ModelAssessDimensionDO>()
.in(ModelAssessDimensionDO::getId, dimensionIds));
Map<Long, ModelAssessDimensionDO> longModelDimesionDOMap = cn.iocoder.yudao.framework.common.util.collection.
CollectionUtils.convertMap(modelAssessDimensionDOS, ModelAssessDimensionDO::getId);
modelAssessTaskDimensionRespVOS.stream().forEach(
modelAssessTaskDimensionRespVO -> {
ModelAssessDimensionDO modelAssessDimensionDO = longModelDimesionDOMap.get(modelAssessTaskDimensionRespVO.getDimensionId());
if (modelAssessDimensionDO != null){
modelAssessTaskDimensionRespVO.setDimensionName(modelAssessDimensionDO.getDimension());
if (!CollectionUtils.isEmpty(dimensionIds)){
List<ModelAssessDimensionDO> modelAssessDimensionDOS = modelAssessDimensionMapper.selectList(new LambdaQueryWrapper<ModelAssessDimensionDO>()
.in(ModelAssessDimensionDO::getId, dimensionIds));
Map<Long, ModelAssessDimensionDO> longModelDimesionDOMap = cn.iocoder.yudao.framework.common.util.collection.
CollectionUtils.convertMap(modelAssessDimensionDOS, ModelAssessDimensionDO::getId);
modelAssessTaskDimensionRespVOS.stream().forEach(
modelAssessTaskDimensionRespVO -> {
ModelAssessDimensionDO modelAssessDimensionDO = longModelDimesionDOMap.get(modelAssessTaskDimensionRespVO.getDimensionId());
if (modelAssessDimensionDO != null){
modelAssessTaskDimensionRespVO.setDimensionName(modelAssessDimensionDO.getDimension());
}
}
}
);
);
}
result.setDimensions(modelAssessTaskDimensionRespVOS);
ModelServiceDO modelServiceDO = modelServiceMapper.selectById(modelAssessTaskManual.getModelService());
if (modelServiceDO != null){

View File

@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.system.controller.admin.user;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
@ -27,6 +28,7 @@ import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
@ -142,6 +144,57 @@ public class UserController {
UserConvert.INSTANCE.convertList(list, deptMap));
}
@GetMapping("/student/export")
@Operation(summary = "导出学生")
@PreAuthorize("@ss.hasPermission('system:user:export')")
@ApiAccessLog(operateType = EXPORT)
public void exporStudent(@Validated UserPageReqVO exportReqVO,
HttpServletResponse response) throws IOException {
exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<AdminUserDO> list = userService.getUserPage(exportReqVO).getList();
Map<Long, DeptDO> deptMap = deptService.getDeptMap(
convertList(list, AdminUserDO::getDeptId));
List<UserRespVO> userRespVOS = UserConvert.INSTANCE.convertList(list, deptMap);
//将用户转换成学生的标头
List<UserStudentExcelVO> studentUserList = new ArrayList<>();
if (!userRespVOS.isEmpty()) {
userRespVOS.stream().forEach(sysUser ->{
UserStudentExcelVO student = new UserStudentExcelVO();
BeanUtil.copyProperties(sysUser, student);
studentUserList.add(student);
});
}
// 输出 Excel
ExcelUtils.write(response, "学生数据.xls", "数据", UserStudentExcelVO.class, studentUserList );
}
@GetMapping("/teacher/export")
@Operation(summary = "导出教师")
@PreAuthorize("@ss.hasPermission('system:user:export')")
@ApiAccessLog(operateType = EXPORT)
public void exporTeacher(@Validated UserPageReqVO exportReqVO,
HttpServletResponse response) throws IOException {
exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<AdminUserDO> list = userService.getUserPage(exportReqVO).getList();
Map<Long, DeptDO> deptMap = deptService.getDeptMap(
convertList(list, AdminUserDO::getDeptId));
List<UserRespVO> userRespVOS = UserConvert.INSTANCE.convertList(list, deptMap);
//将用户转换成教师的标头
List<UserTeacherExcelVO> studentUserList = new ArrayList<>();
if (!userRespVOS.isEmpty()) {
userRespVOS.stream().forEach(sysUser ->{
UserTeacherExcelVO student = new UserTeacherExcelVO();
BeanUtil.copyProperties(sysUser, student);
studentUserList.add(student);
});
}
// 输出 Excel
ExcelUtils.write(response, "教师数据.xls", "数据", UserTeacherExcelVO.class,
studentUserList);
}
@GetMapping("/get-import-template")
@Operation(summary = "获得导入用户模板")
public void importTemplate(HttpServletResponse response) throws IOException {
@ -169,4 +222,65 @@ public class UserController {
return success(userService.importUserList(list, updateSupport));
}
@PostMapping("/student/import")
@Operation(summary = "导入学生")
@Parameters({
@Parameter(name = "file", description = "Excel 文件", required = true),
})
@PreAuthorize("@ss.hasPermission('system:user:import')")
public CommonResult<String> importExcelStudent(@RequestParam("file") MultipartFile file) throws Exception {
List<UserStudentExcelVO> list = ExcelUtils.read(file, UserStudentExcelVO.class);
List<AdminUserDO> userList = new ArrayList<>();
if (!list.isEmpty()) {
list.stream().forEach(sysStudentUser ->{
AdminUserDO user = new AdminUserDO();
BeanUtil.copyProperties(sysStudentUser, user);
user.setUserType(2);
userList.add(user);
});
}
return success(userService.importUserStudentTeacher(userList));
}
@PostMapping("/teacher/import")
@Operation(summary = "导入教师")
@Parameters({
@Parameter(name = "file", description = "Excel 文件", required = true)
})
@PreAuthorize("@ss.hasPermission('system:user:import')")
public CommonResult<String> importExcelTeacher(@RequestParam("file") MultipartFile file) throws Exception {
List<UserTeacherExcelVO> list = ExcelUtils.read(file, UserTeacherExcelVO.class);
List<AdminUserDO> userList = new ArrayList<>();
if (!list.isEmpty()) {
list.stream().forEach(sysStudentUser ->{
AdminUserDO user = new AdminUserDO();
BeanUtil.copyProperties(sysStudentUser, user);
user.setUserType(1);
userList.add(user);
});
}
return success(userService.importUserStudentTeacher(userList));
}
@GetMapping("/student/importTemplate")
@Operation(summary = "导出学生")
@PreAuthorize("@ss.hasPermission('system:user:export')")
@ApiAccessLog(operateType = EXPORT)
public void importStudentTemplate(HttpServletResponse response) throws IOException {
List<UserStudentExcelVO> list = new ArrayList<>();
// 输出 Excel
ExcelUtils.write(response, "学生模板.xls", "数据", UserStudentExcelVO.class,list);
}
@GetMapping("/teacher/importTemplate")
@Operation(summary = "导出教师模板")
@PreAuthorize("@ss.hasPermission('system:user:export')")
@ApiAccessLog(operateType = EXPORT)
public void importTeacherTemplate(HttpServletResponse response) throws IOException {
List<UserTeacherExcelVO> list = new ArrayList<>();
// 输出 Excel
ExcelUtils.write(response, "教师模板.xls", "数据", UserTeacherExcelVO.class,list);
}
}

View File

@ -38,4 +38,16 @@ public class UserPageReqVO extends PageParam {
@Schema(description = "角色编号", example = "1024")
private Long roleId;
@Schema(description = "用户类型", example = "0 管理员 1教师 2学生")
private Integer userType;
@Schema(description = "教职工号/学生编号", example = "1")
private String userNo;
@Schema(description = "出生日期", requiredMode = Schema.RequiredMode.REQUIRED, example = "时间戳格式")
private LocalDateTime birthDate;
@Schema(description = "当userType为学生时 0 学生 1学员当userType为教师时 0 教师 1培训教师", example = "1")
private Integer statusType;
}

View File

@ -72,4 +72,16 @@ public class UserRespVO{
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "时间戳格式")
private LocalDateTime createTime;
@Schema(description = "用户类型", example = "0 管理员 1教师 2学生")
private Integer userType;
@Schema(description = "教职工号/学生编号", example = "1")
private String userNo;
@Schema(description = "出生日期", requiredMode = Schema.RequiredMode.REQUIRED, example = "时间戳格式")
private LocalDateTime birthDate;
@Schema(description = "当userType为学生时 0 学生 1学员当userType为教师时 0 教师 1培训教师", example = "1")
private Integer statusType;
}

View File

@ -12,6 +12,7 @@ import lombok.Data;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.*;
import java.time.LocalDateTime;
import java.util.Set;
@Schema(description = "管理后台 - 用户创建/修改 Request VO")
@ -77,4 +78,16 @@ public class UserSaveReqVO {
|| (ObjectUtil.isAllNotEmpty(password)); // 新增时必须都传递 password
}
@Schema(description = "用户类型", example = "0 管理员 1教师 2学生")
private Integer userType;
@Schema(description = "教职工号/学生编号", example = "1")
private String userNo;
@Schema(description = "出生日期", requiredMode = Schema.RequiredMode.REQUIRED, example = "时间戳格式")
private LocalDateTime birthDate;
@Schema(description = "当userType为学生时 0 学生 1学员当userType为教师时 0 教师 1培训教师", example = "1")
private Integer statusType;
}

View File

@ -0,0 +1,31 @@
package cn.iocoder.yudao.module.system.controller.admin.user.vo.user;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
@Data
@ExcelIgnoreUnannotated
public class UserStudentExcelVO {
@ExcelProperty("登录账号")
private String username;
@ExcelProperty("学生姓名")
private String nickname;
@ExcelProperty("学生编号")
private String userNo;
@ExcelProperty("学生类型")
private String statusType;
@ExcelProperty("性别")
private String sex;
@ExcelProperty("手机号码")
private String mobile;
@ExcelProperty("状态")
private String status;
}

View File

@ -0,0 +1,40 @@
package cn.iocoder.yudao.module.system.controller.admin.user.vo.user;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
@Data
@ExcelIgnoreUnannotated
public class UserTeacherExcelVO {
@ExcelProperty("登录账号")
private String username;
@ExcelProperty("教职工号")
private String userNo;
@ExcelProperty("姓名")
private String nickname;
@ExcelProperty("邮箱")
private String email;
@ExcelProperty("手机号码")
private String mobile;
@ExcelProperty("性别")
private String sex;
@ExcelProperty("状态")
private String status;
@ExcelProperty("出生日期")
private String birthDate;
@ExcelProperty("教师类型类型")
private String statusType;
}

View File

@ -96,4 +96,20 @@ public class AdminUserDO extends TenantBaseDO {
* 用户类型0 - 管理员1-老师2-学生
*/
private Integer userType;
/**
* 教职工号/学生编号
*/
private String userNo;
/**
* 出生日期
*/
private LocalDateTime birthDate;
/**
* 当userType为学生时 0 学生 1学员
* 当userType为教师时 0 教师 1培训教师
*/
private Integer statusType;
}

View File

@ -30,6 +30,7 @@ public interface AdminUserMapper extends BaseMapperX<AdminUserDO> {
.likeIfPresent(AdminUserDO::getUsername, reqVO.getUsername())
.likeIfPresent(AdminUserDO::getMobile, reqVO.getMobile())
.eqIfPresent(AdminUserDO::getStatus, reqVO.getStatus())
.eqIfPresent(AdminUserDO::getUserType, reqVO.getUserType())
.betweenIfPresent(AdminUserDO::getCreateTime, reqVO.getCreateTime())
.inIfPresent(AdminUserDO::getDeptId, deptIds)
.inIfPresent(AdminUserDO::getId, userIds)

View File

@ -199,6 +199,8 @@ public interface AdminUserService {
*/
UserImportRespVO importUserList(List<UserImportExcelVO> importUsers, boolean isUpdateSupport);
String importUserStudentTeacher(List<AdminUserDO> importUsers);
/**
* 获得指定状态的用户们
*

View File

@ -33,8 +33,10 @@ import com.google.common.annotations.VisibleForTesting;
import com.mzt.logapi.context.LogRecordContext;
import com.mzt.logapi.service.impl.DiffParseFunction;
import com.mzt.logapi.starter.annotation.LogRecord;
import com.thoughtworks.xstream.core.SecurityUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Lazy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -508,6 +510,33 @@ public class AdminUserServiceImpl implements AdminUserService {
return respVO;
}
@Override
public String importUserStudentTeacher(List<AdminUserDO> importUsers) {
if (importUsers == null || importUsers.size() == 0) {
throw new ServiceException(500,"导入用户数据不能为空!");
}
StringBuilder successMsg = new StringBuilder();
for (AdminUserDO user : importUsers) {
if(user.getUsername() == null || user.getUsername().equals("")){
successMsg.append("用户名不能为空,导入失败/n" );
continue;
}
AdminUserDO adminUserDO = userMapper.selectByUsername(user.getUsername());
if(adminUserDO != null){
successMsg.append("用户名:" + user.getUsername() + "已存在,导入失败/n" );
continue;
}
BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
String password = passwordEncoder.encode("123456");
user.setPassword(password);
user.setStatus(0);
userMapper.insert(user);
successMsg.append("用户名:" + user.getUsername() + "已导入成功/n" );
}
successMsg.insert(0, "导入完成,数据如下:");
return successMsg.toString();
}
@Override
public List<AdminUserDO> getUserListByStatus(Integer status) {
return userMapper.selectListByStatus(status);

View File

@ -237,6 +237,12 @@ llm:
# 登录 POST
login: http://localhost:8123/login
#### 大模型对话
# 模型列表 GET
model_list: http://api.xhllm.xinnuojinzhi.com/model/v1/models
# 模型对话 POST
model_completions: http://api.xhllm.xinnuojinzhi.com/model/v1/chat/completions
--- #################### iot相关配置 TODO 芋艿:再瞅瞅 ####################
iot:
emq:

View File

@ -246,7 +246,7 @@ justauth:
--- #################### 大模型训练相关配置 ###################
llm:
backend:
# RAG服务
#### RAG服务
#RAG健康检查 GET
rag_health: http://localhost:8123/health
#上传并向量化 POST
@ -262,7 +262,7 @@ llm:
#支持多个文件id查询向量 GET
rag_query_multiple: http://localhost:8123/query_multiple
# LLM train and service api
#### LLM train and service api
# 训练集列表 GET
dataset_list: http://localhost:8123/api/mgr/datasets/list
# 上传训练集 POST
@ -280,6 +280,12 @@ llm:
# 登录 POST
login: http://localhost:8123/login
#### 大模型对话
# 模型列表 GET
model_list: http://api.xhllm.xinnuojinzhi.com/model/v1/models
# 模型对话 POST
model_completions: http://api.xhllm.xinnuojinzhi.com/model/v1/chat/completions
--- #################### iot相关配置 TODO 芋艿:再瞅瞅 ####################
iot:
emq: