diff --git a/ruoyi-modules/ruoyi-file/pom.xml b/ruoyi-modules/ruoyi-file/pom.xml index d50d4ed..2228d29 100644 --- a/ruoyi-modules/ruoyi-file/pom.xml +++ b/ruoyi-modules/ruoyi-file/pom.xml @@ -73,6 +73,11 @@ org.dromara ruoyi-common-excel + + + org.dromara + ruoyi-system + diff --git a/ruoyi-modules/ruoyi-file/src/main/java/org/dromara/file/controller/SysTeacherController.java b/ruoyi-modules/ruoyi-file/src/main/java/org/dromara/file/controller/SysTeacherController.java index 11c2145..6eaa922 100644 --- a/ruoyi-modules/ruoyi-file/src/main/java/org/dromara/file/controller/SysTeacherController.java +++ b/ruoyi-modules/ruoyi-file/src/main/java/org/dromara/file/controller/SysTeacherController.java @@ -8,6 +8,7 @@ import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; import org.dromara.common.core.validate.AddGroup; 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.idempotent.annotation.RepeatSubmit; 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.web.core.BaseController; 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.listener.SysTeacherImportListener; import org.dromara.file.service.ISysTeacherService; +import org.springframework.http.MediaType; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import java.util.ArrayList; import java.util.List; /** @@ -67,6 +73,27 @@ public class SysTeacherController extends BaseController { 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 importData(@RequestPart("file") MultipartFile file) throws Exception { + ExcelResult 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); + } + /** * 获取教职工信息详细信息 * diff --git a/ruoyi-modules/ruoyi-file/src/main/java/org/dromara/file/domain/bo/SysTeacherBo.java b/ruoyi-modules/ruoyi-file/src/main/java/org/dromara/file/domain/bo/SysTeacherBo.java index 5acda28..ee96036 100644 --- a/ruoyi-modules/ruoyi-file/src/main/java/org/dromara/file/domain/bo/SysTeacherBo.java +++ b/ruoyi-modules/ruoyi-file/src/main/java/org/dromara/file/domain/bo/SysTeacherBo.java @@ -1,5 +1,6 @@ package org.dromara.file.domain.bo; +import com.fasterxml.jackson.annotation.JsonFormat; import io.github.linpeilie.annotations.AutoMapper; import jakarta.validation.constraints.NotBlank; 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.mybatis.core.domain.BaseEntity; import org.dromara.file.domain.SysTeacher; -import org.springframework.format.annotation.DateTimeFormat; 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; diff --git a/ruoyi-modules/ruoyi-file/src/main/java/org/dromara/file/domain/vo/SysTeacherImportVo.java b/ruoyi-modules/ruoyi-file/src/main/java/org/dromara/file/domain/vo/SysTeacherImportVo.java new file mode 100644 index 0000000..c2aa0d1 --- /dev/null +++ b/ruoyi-modules/ruoyi-file/src/main/java/org/dromara/file/domain/vo/SysTeacherImportVo.java @@ -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; +} diff --git a/ruoyi-modules/ruoyi-file/src/main/java/org/dromara/file/domain/vo/SysTeacherVo.java b/ruoyi-modules/ruoyi-file/src/main/java/org/dromara/file/domain/vo/SysTeacherVo.java index 6acafa4..8729585 100644 --- a/ruoyi-modules/ruoyi-file/src/main/java/org/dromara/file/domain/vo/SysTeacherVo.java +++ b/ruoyi-modules/ruoyi-file/src/main/java/org/dromara/file/domain/vo/SysTeacherVo.java @@ -1,14 +1,12 @@ 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.ExcelProperty; -import org.dromara.common.excel.annotation.ExcelDictFormat; -import org.dromara.common.excel.convert.ExcelDictConvert; import io.github.linpeilie.annotations.AutoMapper; 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.Serializable; diff --git a/ruoyi-modules/ruoyi-file/src/main/java/org/dromara/file/listener/SysTeacherImportListener.java b/ruoyi-modules/ruoyi-file/src/main/java/org/dromara/file/listener/SysTeacherImportListener.java new file mode 100644 index 0000000..8356e41 --- /dev/null +++ b/ruoyi-modules/ruoyi-file/src/main/java/org/dromara/file/listener/SysTeacherImportListener.java @@ -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 implements ExcelListener { + + 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("
").append(successNum).append("、账号 ").append(teacher.getTeacherName()).append(" 导入成功"); + } else { + failureNum++; + failureMsg.append("
").append(failureNum).append("、账号 ").append(sysTeacher.getTeacherName()).append(" 已存在"); + } + } catch (Exception e) { + failureNum++; + String msg = "
" + failureNum + "、账号 " + userVo.getTeacherName() + " 导入失败:"; + failureMsg.append(msg).append(e.getMessage()); + log.error(msg, e); + } + } + + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + + } + + @Override + public ExcelResult 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 getList() { + return null; + } + + @Override + public List getErrorList() { + return null; + } + }; + } +} diff --git a/ruoyi-modules/ruoyi-file/src/main/java/org/dromara/file/service/ISysTeacherService.java b/ruoyi-modules/ruoyi-file/src/main/java/org/dromara/file/service/ISysTeacherService.java index b02f86d..554f29c 100644 --- a/ruoyi-modules/ruoyi-file/src/main/java/org/dromara/file/service/ISysTeacherService.java +++ b/ruoyi-modules/ruoyi-file/src/main/java/org/dromara/file/service/ISysTeacherService.java @@ -65,4 +65,12 @@ public interface ISysTeacherService { * @return 是否删除成功 */ Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 通过手机号查询教职工 + * + * @param phonenumber 用户名 + * @return 用户对象信息 + */ + SysTeacherVo selectTeacherByPhonenumber(String phonenumber); } diff --git a/ruoyi-modules/ruoyi-file/src/main/java/org/dromara/file/service/impl/SysTeacherServiceImpl.java b/ruoyi-modules/ruoyi-file/src/main/java/org/dromara/file/service/impl/SysTeacherServiceImpl.java index 7b770df..8c00de2 100644 --- a/ruoyi-modules/ruoyi-file/src/main/java/org/dromara/file/service/impl/SysTeacherServiceImpl.java +++ b/ruoyi-modules/ruoyi-file/src/main/java/org/dromara/file/service/impl/SysTeacherServiceImpl.java @@ -1,5 +1,7 @@ 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.StringUtils; import org.dromara.common.mybatis.core.page.TableDataInfo; @@ -38,7 +40,7 @@ public class SysTeacherServiceImpl implements ISysTeacherService { * @return 教职工信息 */ @Override - public SysTeacherVo queryById(Long teacherId){ + public SysTeacherVo queryById(Long teacherId) { return baseMapper.selectVoById(teacherId); } @@ -118,8 +120,19 @@ public class SysTeacherServiceImpl implements ISysTeacherService { /** * 保存前的数据校验 */ - private void validEntityBeforeSave(SysTeacher entity){ - //TODO 做一些数据校验,如唯一约束 + private void validEntityBeforeSave(SysTeacher entity) { + SysTeacherVo sysTeacherVo = baseMapper.selectVoOne(new LambdaQueryWrapper().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 public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - if(isValid){ + if (isValid) { //TODO 做一些业务上的校验,判断是否需要校验 } return baseMapper.deleteBatchIds(ids) > 0; } + + @Override + public SysTeacherVo selectTeacherByPhonenumber(String phonenumber) { + return baseMapper.selectVoOne(new LambdaQueryWrapper().eq(SysTeacher::getPhonenumber, phonenumber)); + } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDeptService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDeptService.java index cd984d8..e00e0ab 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDeptService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDeptService.java @@ -130,4 +130,6 @@ public interface ISysDeptService { * @return 结果 */ int deleteDeptById(Long deptId); + + Long selectIdBuName(String deptName); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java index cb3f340..77a0f9b 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java @@ -348,4 +348,9 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService { return baseMapper.deleteById(deptId); } + @Override + public Long selectIdBuName(String deptName) { + SysDept sysDept = baseMapper.selectOne(new LambdaQueryWrapper().select(SysDept::getDeptId).eq(SysDept::getDeptName, deptName)); + return sysDept.getDeptId(); + } }