新增修改教职工参数校验;获取教职工导入模板;教职工信息导入;

This commit is contained in:
cjw 2024-05-30 15:24:58 +08:00
parent 5e0629e74a
commit 4cd97ae5e3
10 changed files with 257 additions and 11 deletions

View File

@ -73,6 +73,11 @@
<groupId>org.dromara</groupId> <groupId>org.dromara</groupId>
<artifactId>ruoyi-common-excel</artifactId> <artifactId>ruoyi-common-excel</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-system</artifactId>
</dependency>
</dependencies> </dependencies>
</project> </project>

View File

@ -8,6 +8,7 @@ import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.R; import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup; import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup; import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.excel.core.ExcelResult;
import org.dromara.common.excel.utils.ExcelUtil; import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.common.idempotent.annotation.RepeatSubmit; import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log; import org.dromara.common.log.annotation.Log;
@ -16,11 +17,16 @@ import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.web.core.BaseController; import org.dromara.common.web.core.BaseController;
import org.dromara.file.domain.bo.SysTeacherBo; import org.dromara.file.domain.bo.SysTeacherBo;
import org.dromara.file.domain.vo.SysTeacherImportVo;
import org.dromara.file.domain.vo.SysTeacherVo; import org.dromara.file.domain.vo.SysTeacherVo;
import org.dromara.file.listener.SysTeacherImportListener;
import org.dromara.file.service.ISysTeacherService; import org.dromara.file.service.ISysTeacherService;
import org.springframework.http.MediaType;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.util.ArrayList;
import java.util.List; import java.util.List;
/** /**
@ -67,6 +73,27 @@ public class SysTeacherController extends BaseController {
ExcelUtil.exportExcel(list, "教职工信息", SysTeacherVo.class, response); ExcelUtil.exportExcel(list, "教职工信息", SysTeacherVo.class, response);
} }
/**
* 导入数据
*
* @param file 导入文件
*/
@Log(title = "用户管理", businessType = BusinessType.IMPORT)
@SaCheckPermission("school:teacher:import")
@PostMapping(value = "/importData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public R<Void> importData(@RequestPart("file") MultipartFile file) throws Exception {
ExcelResult<SysTeacherImportVo> result = ExcelUtil.importExcel(file.getInputStream(), SysTeacherImportVo.class, new SysTeacherImportListener());
return R.ok(result.getAnalysis());
}
/**
* 获取导入模板
*/
@PostMapping("/importTemplate")
public void importTemplate(HttpServletResponse response) {
ExcelUtil.exportExcel(new ArrayList<>(), "教职工数据", SysTeacherImportVo.class, response);
}
/** /**
* 获取教职工信息详细信息 * 获取教职工信息详细信息
* *

View File

@ -1,5 +1,6 @@
package org.dromara.file.domain.bo; package org.dromara.file.domain.bo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.github.linpeilie.annotations.AutoMapper; import io.github.linpeilie.annotations.AutoMapper;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
@ -9,7 +10,6 @@ import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup; import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.mybatis.core.domain.BaseEntity; import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.file.domain.SysTeacher; import org.dromara.file.domain.SysTeacher;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date; import java.util.Date;
@ -90,7 +90,7 @@ public class SysTeacherBo extends BaseEntity {
/** /**
* 出生日期 * 出生日期
*/ */
@DateTimeFormat(pattern = "yyyy-MM-dd") @JsonFormat(pattern = "yyyy-MM-dd")
private Date birthday; private Date birthday;

View File

@ -0,0 +1,84 @@
package org.dromara.file.domain.vo;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert;
/**
* 教职工对象导入VO
*
* @author cjw
* @version V1.0.0
* @date 2024/5/30 14:53
*/
@Data
@NoArgsConstructor
public class SysTeacherImportVo {
/**
* 部门ID
*/
@ExcelProperty(value = "年级/班级名称")
private String deptName;
/**
* 教职工姓名
*/
@ExcelProperty(value = "教职工姓名")
private String teacherName;
/**
* 手机号码
*/
@ExcelProperty(value = "手机号码")
private String phonenumber;
/**
* 工作号码
*/
@ExcelProperty(value = "工作号码")
private String telephone;
/**
* 用户邮箱
*/
@ExcelProperty(value = "用户邮箱")
private String email;
/**
* 学历
*/
@ExcelProperty(value = "教职工学历", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "sys_education")
private String educationCode;
/**
* 学位
*/
@ExcelProperty(value = "教职工学位", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "sys_degree")
private String degreeCode;
/**
* 学科
*/
@ExcelProperty(value = "教职工学科", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "sys_subject")
private String subjectCode;
/**
* 职务
*/
@ExcelProperty(value = "教职工职务", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "sys_post")
private String post;
/**
* 用户性别0男 1女 2未知
*/
@ExcelProperty(value = "教职工性别", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "sys_user_sex")
private String sex;
}

View File

@ -1,14 +1,12 @@
package org.dromara.file.domain.vo; package org.dromara.file.domain.vo;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.dromara.file.domain.SysTeacher;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.ExcelProperty;
import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert;
import io.github.linpeilie.annotations.AutoMapper; import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data; import lombok.Data;
import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert;
import org.dromara.file.domain.SysTeacher;
import java.io.Serial; import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;

View File

@ -0,0 +1,99 @@
package org.dromara.file.listener;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.SpringUtils;
import org.dromara.common.core.utils.ValidatorUtils;
import org.dromara.common.excel.core.ExcelListener;
import org.dromara.common.excel.core.ExcelResult;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.file.domain.bo.SysTeacherBo;
import org.dromara.file.domain.vo.SysTeacherImportVo;
import org.dromara.file.domain.vo.SysTeacherVo;
import org.dromara.file.service.ISysTeacherService;
import org.dromara.system.service.ISysDeptService;
import java.util.List;
/**
* 系统用户自定义导入
*
* @author Lion Li
*/
@Slf4j
public class SysTeacherImportListener extends AnalysisEventListener<SysTeacherImportVo> implements ExcelListener<SysTeacherImportVo> {
private final ISysTeacherService teacherService;
private final ISysDeptService deptService;
private final Long operUserId;
private int successNum = 0;
private int failureNum = 0;
private final StringBuilder successMsg = new StringBuilder();
private final StringBuilder failureMsg = new StringBuilder();
public SysTeacherImportListener() {
this.teacherService = SpringUtils.getBean(ISysTeacherService.class);
this.deptService = SpringUtils.getBean(ISysDeptService.class);
this.operUserId = LoginHelper.getUserId();
}
@Override
public void invoke(SysTeacherImportVo userVo, AnalysisContext context) {
SysTeacherVo sysTeacher = this.teacherService.selectTeacherByPhonenumber(userVo.getPhonenumber());
try {
// 验证是否存在这个用户
if (ObjectUtil.isNull(sysTeacher)) {
Long deptId = this.deptService.selectIdBuName(userVo.getDeptName());
SysTeacherBo teacher = BeanUtil.toBean(userVo, SysTeacherBo.class);
ValidatorUtils.validate(teacher);
teacher.setCreateBy(operUserId);
teacher.setDeptId(deptId);
teacherService.insertByBo(teacher);
successNum++;
successMsg.append("<br/>").append(successNum).append("、账号 ").append(teacher.getTeacherName()).append(" 导入成功");
} else {
failureNum++;
failureMsg.append("<br/>").append(failureNum).append("、账号 ").append(sysTeacher.getTeacherName()).append(" 已存在");
}
} catch (Exception e) {
failureNum++;
String msg = "<br/>" + failureNum + "、账号 " + userVo.getTeacherName() + " 导入失败:";
failureMsg.append(msg).append(e.getMessage());
log.error(msg, e);
}
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
}
@Override
public ExcelResult<SysTeacherImportVo> getExcelResult() {
return new ExcelResult<>() {
@Override
public String getAnalysis() {
if (failureNum > 0) {
failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
throw new ServiceException(failureMsg.toString());
} else {
successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
}
return successMsg.toString();
}
@Override
public List<SysTeacherImportVo> getList() {
return null;
}
@Override
public List<String> getErrorList() {
return null;
}
};
}
}

View File

@ -65,4 +65,12 @@ public interface ISysTeacherService {
* @return 是否删除成功 * @return 是否删除成功
*/ */
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid); Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
/**
* 通过手机号查询教职工
*
* @param phonenumber 用户名
* @return 用户对象信息
*/
SysTeacherVo selectTeacherByPhonenumber(String phonenumber);
} }

View File

@ -1,5 +1,7 @@
package org.dromara.file.service.impl; package org.dromara.file.service.impl;
import cn.hutool.core.util.ObjectUtil;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.TableDataInfo;
@ -38,7 +40,7 @@ public class SysTeacherServiceImpl implements ISysTeacherService {
* @return 教职工信息 * @return 教职工信息
*/ */
@Override @Override
public SysTeacherVo queryById(Long teacherId){ public SysTeacherVo queryById(Long teacherId) {
return baseMapper.selectVoById(teacherId); return baseMapper.selectVoById(teacherId);
} }
@ -118,8 +120,19 @@ public class SysTeacherServiceImpl implements ISysTeacherService {
/** /**
* 保存前的数据校验 * 保存前的数据校验
*/ */
private void validEntityBeforeSave(SysTeacher entity){ private void validEntityBeforeSave(SysTeacher entity) {
//TODO 做一些数据校验,如唯一约束 SysTeacherVo sysTeacherVo = baseMapper.selectVoOne(new LambdaQueryWrapper<SysTeacher>().eq(SysTeacher::getPhonenumber, entity.getPhonenumber()));
if(ObjectUtil.isNull(entity.getTeacherId())) {
if (ObjectUtil.isNotNull(sysTeacherVo)) {
throw new ServiceException("存在相同手机号,请确认后再新增");
}
}else{
if (ObjectUtil.isNotNull(sysTeacherVo)) {
if(ObjectUtil.equals(sysTeacherVo.getTeacherId().toString(),entity.getTeacherId().toString()) ){
throw new ServiceException("存在相同手机号,请确认后再新增");
}
}
}
} }
/** /**
@ -131,9 +144,14 @@ public class SysTeacherServiceImpl implements ISysTeacherService {
*/ */
@Override @Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) { public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){ if (isValid) {
//TODO 做一些业务上的校验,判断是否需要校验 //TODO 做一些业务上的校验,判断是否需要校验
} }
return baseMapper.deleteBatchIds(ids) > 0; return baseMapper.deleteBatchIds(ids) > 0;
} }
@Override
public SysTeacherVo selectTeacherByPhonenumber(String phonenumber) {
return baseMapper.selectVoOne(new LambdaQueryWrapper<SysTeacher>().eq(SysTeacher::getPhonenumber, phonenumber));
}
} }

View File

@ -130,4 +130,6 @@ public interface ISysDeptService {
* @return 结果 * @return 结果
*/ */
int deleteDeptById(Long deptId); int deleteDeptById(Long deptId);
Long selectIdBuName(String deptName);
} }

View File

@ -348,4 +348,9 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService {
return baseMapper.deleteById(deptId); return baseMapper.deleteById(deptId);
} }
@Override
public Long selectIdBuName(String deptName) {
SysDept sysDept = baseMapper.selectOne(new LambdaQueryWrapper<SysDept>().select(SysDept::getDeptId).eq(SysDept::getDeptName, deptName));
return sysDept.getDeptId();
}
} }