xiatian 2 년 전
부모
커밋
6ead143a7e

+ 21 - 0
src/main/java/cn/com/qmth/mps/bean/UserImportMsg.java

@@ -0,0 +1,21 @@
+package cn.com.qmth.mps.bean;
+
+import java.util.List;
+
+public class UserImportMsg {
+	private Boolean hasError;
+	private List<String> errMsg;
+	public Boolean getHasError() {
+		return hasError;
+	}
+	public void setHasError(Boolean hasError) {
+		this.hasError = hasError;
+	}
+	public List<String> getErrMsg() {
+		return errMsg;
+	}
+	public void setErrMsg(List<String> errMsg) {
+		this.errMsg = errMsg;
+	}
+	
+}

+ 41 - 13
src/main/java/cn/com/qmth/mps/controller/UserController.java

@@ -2,6 +2,8 @@ package cn.com.qmth.mps.controller;
 
 
 import java.util.List;
 import java.util.List;
 
 
+import org.apache.commons.collections4.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestMethod;
@@ -14,6 +16,9 @@ import com.qmth.boot.api.annotation.BOOL;
 import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.boot.core.collection.PageResult;
 import com.qmth.boot.core.collection.PageResult;
 
 
+import cn.com.qmth.mps.bean.User;
+import cn.com.qmth.mps.bean.UserImportMsg;
+import cn.com.qmth.mps.service.UserService;
 import cn.com.qmth.mps.util.ResouceUtil;
 import cn.com.qmth.mps.util.ResouceUtil;
 import cn.com.qmth.mps.vo.user.UserDomain;
 import cn.com.qmth.mps.vo.user.UserDomain;
 import cn.com.qmth.mps.vo.user.UserQuery;
 import cn.com.qmth.mps.vo.user.UserQuery;
@@ -26,36 +31,59 @@ import io.swagger.annotations.ApiOperation;
 @RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/user")
 @RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/user")
 @Aac(strict = BOOL.FALSE, auth = BOOL.TRUE)
 @Aac(strict = BOOL.FALSE, auth = BOOL.TRUE)
 public class UserController extends BaseController {
 public class UserController extends BaseController {
+	@Autowired
+	private UserService userService;
+
+	@ApiOperation(value = "新增/修改")
+	@RequestMapping(value = "/save", method = RequestMethod.POST)
+	public void save(UserDomain domain) {
+		userService.saveUser(domain, getAccessUser());
+	}
 
 
-    @ApiOperation(value = "新增/修改")
-    @RequestMapping(value = "/save", method = RequestMethod.POST)
-    public void save(UserDomain domain) {
-    }
-	
 	@PostMapping("import")
 	@PostMapping("import")
 	@ApiOperation(value = "导入")
 	@ApiOperation(value = "导入")
-	public void importPaper(@RequestParam Long schoolId, @RequestParam MultipartFile file) {
+	public UserImportMsg importUser(@RequestParam Long schoolId, @RequestParam MultipartFile file) {
+		User user = getAccessUser();
+		List<String> failRecords = userService.importUser(schoolId,user, file);
+		UserImportMsg msg = new UserImportMsg();
+		msg.setHasError(CollectionUtils.isNotEmpty(failRecords));
+		msg.setErrMsg(failRecords);
+		return msg;
 	}
 	}
 
 
 	@ApiOperation(value = "下载导入模板")
 	@ApiOperation(value = "下载导入模板")
 	@PostMapping("template")
 	@PostMapping("template")
 	public void getImportTemplate() {
 	public void getImportTemplate() {
-		exportFile("用户导入模板.xlsx", ResouceUtil.getStream("importtemplates/absentManualImportTemplate.xlsx"));
+		exportFile("用户导入模板.xlsx", ResouceUtil.getStream("importtemplates/userImport.xlsx"));
 	}
 	}
 
 
 	@ApiOperation(value = "获取分页")
 	@ApiOperation(value = "获取分页")
 	@RequestMapping(value = "/page", method = RequestMethod.POST)
 	@RequestMapping(value = "/page", method = RequestMethod.POST)
 	public PageResult<UserVo> page(UserQuery query) {
 	public PageResult<UserVo> page(UserQuery query) {
-		return null;
+		return userService.page(query,getAccessUser());
 	}
 	}
 
 
 	@ApiOperation(value = "获取信息")
 	@ApiOperation(value = "获取信息")
 	@RequestMapping(value = "/info", method = RequestMethod.POST)
 	@RequestMapping(value = "/info", method = RequestMethod.POST)
 	public UserVo info(@RequestParam Long id) {
 	public UserVo info(@RequestParam Long id) {
-		return null;
+		return userService.info(id);
+	}
+
+	@ApiOperation(value = "启用/禁用")
+	@RequestMapping(value = "/toggle", method = RequestMethod.POST)
+	public void toggle(@RequestParam List<Long> ids, @RequestParam Boolean enable) {
+		userService.toggle(ids,enable);
+	}
+	
+	@ApiOperation(value = "重置用户密码")
+	@PostMapping("reset-passwd")
+	public void resetPass(@RequestParam Long schoolId,@RequestParam List<Long> ids) {
+		userService.resetPass(schoolId,ids,getAccessUser());
+	}
+	
+	@ApiOperation(value = "修改用户密码")
+	@PostMapping("password")
+	public void updatePass(@RequestParam String password) {
+		userService.updatePass(password,getAccessUser());
 	}
 	}
-    @ApiOperation(value = "启用/禁用")
-    @RequestMapping(value = "/toggle", method = RequestMethod.POST)
-    public void enable(@RequestParam List<Long> ids, @RequestParam Boolean enable) {
-    }
 }
 }

+ 9 - 0
src/main/java/cn/com/qmth/mps/dao/CourseDao.java

@@ -0,0 +1,9 @@
+package cn.com.qmth.mps.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+import cn.com.qmth.mps.entity.CourseEntity;
+
+public interface CourseDao extends BaseMapper<CourseEntity> {
+
+}

+ 9 - 0
src/main/java/cn/com/qmth/mps/dao/SchoolDao.java

@@ -0,0 +1,9 @@
+package cn.com.qmth.mps.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+import cn.com.qmth.mps.entity.SchoolEntity;
+
+public interface SchoolDao extends BaseMapper<SchoolEntity> {
+
+}

+ 15 - 0
src/main/java/cn/com/qmth/mps/dao/UserCourseRelationDao.java

@@ -0,0 +1,15 @@
+package cn.com.qmth.mps.dao;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+
+import com.github.jeffreyning.mybatisplus.base.MppBaseMapper;
+
+import cn.com.qmth.mps.entity.UserCourseRelationEntity;
+
+public interface UserCourseRelationDao extends MppBaseMapper<UserCourseRelationEntity> {
+
+	List<String> getCourseCodes(@Param("userId")Long userId);
+
+}

+ 8 - 0
src/main/java/cn/com/qmth/mps/dao/UserDao.java

@@ -1,9 +1,17 @@
 package cn.com.qmth.mps.dao;
 package cn.com.qmth.mps.dao;
 
 
+import org.apache.ibatis.annotations.Param;
+
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 
 
 import cn.com.qmth.mps.entity.UserEntity;
 import cn.com.qmth.mps.entity.UserEntity;
+import cn.com.qmth.mps.vo.user.UserQuery;
+import cn.com.qmth.mps.vo.user.UserVo;
 
 
 public interface UserDao extends BaseMapper<UserEntity> {
 public interface UserDao extends BaseMapper<UserEntity> {
 
 
+	IPage<UserVo> page(Page<UserVo> page,@Param("req") UserQuery query);
+
 }
 }

+ 1 - 1
src/main/java/cn/com/qmth/mps/enums/Role.java

@@ -2,7 +2,7 @@ package cn.com.qmth.mps.enums;
 
 
 public enum Role {
 public enum Role {
 
 
-    SUPPER_ADMIN(1L,"超级管理员"),
+    SUPER_ADMIN(1L,"超级管理员"),
 
 
     SCHOOL_ADMIN(2L,"机构管理员"),
     SCHOOL_ADMIN(2L,"机构管理员"),
 
 

+ 12 - 0
src/main/java/cn/com/qmth/mps/service/CourseService.java

@@ -0,0 +1,12 @@
+package cn.com.qmth.mps.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import cn.com.qmth.mps.entity.CourseEntity;
+
+public interface CourseService  extends IService<CourseEntity> {
+
+	CourseEntity getByCode(Long schoolId, String code);
+
+
+}

+ 9 - 0
src/main/java/cn/com/qmth/mps/service/SchoolService.java

@@ -0,0 +1,9 @@
+package cn.com.qmth.mps.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import cn.com.qmth.mps.entity.SchoolEntity;
+
+public interface SchoolService  extends IService<SchoolEntity> {
+
+}

+ 17 - 0
src/main/java/cn/com/qmth/mps/service/UserCourseRelationService.java

@@ -0,0 +1,17 @@
+package cn.com.qmth.mps.service;
+
+import java.util.List;
+
+import com.github.jeffreyning.mybatisplus.service.IMppService;
+
+import cn.com.qmth.mps.entity.UserCourseRelationEntity;
+
+public interface UserCourseRelationService  extends IMppService<UserCourseRelationEntity> {
+
+	void saveCourse(Long schoolId,Long userId, List<String> course);
+
+	void removeCourse(Long id);
+
+	List<String> getCourseCodes(Long id);
+
+}

+ 23 - 0
src/main/java/cn/com/qmth/mps/service/UserService.java

@@ -1,12 +1,35 @@
 package cn.com.qmth.mps.service;
 package cn.com.qmth.mps.service;
 
 
+import java.util.List;
+
+import org.springframework.web.multipart.MultipartFile;
+
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.boot.core.collection.PageResult;
 
 
+import cn.com.qmth.mps.bean.User;
 import cn.com.qmth.mps.entity.UserEntity;
 import cn.com.qmth.mps.entity.UserEntity;
+import cn.com.qmth.mps.vo.user.UserDomain;
+import cn.com.qmth.mps.vo.user.UserQuery;
+import cn.com.qmth.mps.vo.user.UserVo;
 
 
 public interface UserService  extends IService<UserEntity> {
 public interface UserService  extends IService<UserEntity> {
 
 
 	UserEntity getByLoginName(String phone);
 	UserEntity getByLoginName(String phone);
 
 
+	void saveUser(UserDomain domain,User user);
+
+	List<String> importUser(Long schoolId,User user, MultipartFile file);
+
+	PageResult<UserVo> page(UserQuery query, User user);
+
+	UserVo info(Long id);
+
+	void toggle(List<Long> ids, Boolean enable);
+
+	void updatePass(String password, User accessUser);
+
+	void resetPass(Long schoolId,List<Long> ids, User accessUser);
+
 
 
 }
 }

+ 26 - 0
src/main/java/cn/com/qmth/mps/service/impl/CourseServiceImpl.java

@@ -0,0 +1,26 @@
+package cn.com.qmth.mps.service.impl;
+
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+import cn.com.qmth.mps.dao.CourseDao;
+import cn.com.qmth.mps.entity.CourseEntity;
+import cn.com.qmth.mps.service.CourseService;
+
+@Service
+public class CourseServiceImpl extends ServiceImpl<CourseDao, CourseEntity> implements CourseService {
+
+	@Override
+	public CourseEntity getByCode(Long schoolId, String code) {
+		QueryWrapper<CourseEntity> wrapper = new QueryWrapper<>();
+        LambdaQueryWrapper<CourseEntity> lw = wrapper.lambda();
+        lw.eq(CourseEntity::getSchoolId, schoolId);
+        lw.eq(CourseEntity::getCode, code);
+        return this.getOne(wrapper);
+	}
+
+
+}

+ 15 - 0
src/main/java/cn/com/qmth/mps/service/impl/SchoolServiceImpl.java

@@ -0,0 +1,15 @@
+package cn.com.qmth.mps.service.impl;
+
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+import cn.com.qmth.mps.dao.SchoolDao;
+import cn.com.qmth.mps.entity.SchoolEntity;
+import cn.com.qmth.mps.service.SchoolService;
+
+@Service
+public class SchoolServiceImpl extends ServiceImpl<SchoolDao, SchoolEntity> implements SchoolService {
+
+
+}

+ 60 - 0
src/main/java/cn/com/qmth/mps/service/impl/UserCourseRelationServiceImpl.java

@@ -0,0 +1,60 @@
+package cn.com.qmth.mps.service.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.github.jeffreyning.mybatisplus.service.MppServiceImpl;
+import com.qmth.boot.core.exception.StatusException;
+
+import cn.com.qmth.mps.dao.UserCourseRelationDao;
+import cn.com.qmth.mps.entity.CourseEntity;
+import cn.com.qmth.mps.entity.UserCourseRelationEntity;
+import cn.com.qmth.mps.service.CourseService;
+import cn.com.qmth.mps.service.UserCourseRelationService;
+
+@Service
+public class UserCourseRelationServiceImpl extends
+		MppServiceImpl<UserCourseRelationDao, UserCourseRelationEntity> implements UserCourseRelationService {
+	@Autowired
+	private CourseService courseService;
+	
+	@Transactional
+	@Override
+	public void saveCourse(Long schoolId,Long userId, List<String> course) {
+		List<UserCourseRelationEntity> ret=new ArrayList<>();
+		for(String s:course) {
+			CourseEntity c= courseService.getByCode(schoolId,s);
+			if(c==null) {
+				throw new StatusException("科目代码不存在:"+s);
+			}
+			UserCourseRelationEntity uc=new UserCourseRelationEntity();
+			uc.setCourseId(c.getId());
+			uc.setUserId(userId);
+			ret.add(uc);
+		}
+		this.removeCourse(userId);
+		this.saveOrUpdateBatchByMultiId(ret);
+	}
+	
+	@Transactional
+	@Override
+	public void removeCourse(Long userId) {
+		QueryWrapper<UserCourseRelationEntity> wrapper = new QueryWrapper<>();
+        LambdaQueryWrapper<UserCourseRelationEntity> lw = wrapper.lambda();
+        lw.eq(UserCourseRelationEntity::getUserId, userId);
+        this.remove(wrapper);
+	}
+
+	@Override
+	public List<String> getCourseCodes(Long userId) {
+		return this.baseMapper.getCourseCodes(userId);
+	}
+
+
+}

+ 292 - 1
src/main/java/cn/com/qmth/mps/service/impl/UserServiceImpl.java

@@ -1,20 +1,60 @@
 package cn.com.qmth.mps.service.impl;
 package cn.com.qmth.mps.service.impl;
 
 
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.text.StringEscapeUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
+import org.springframework.web.multipart.MultipartFile;
 
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.boot.core.collection.PageResult;
+import com.qmth.boot.core.exception.StatusException;
+import com.qmth.boot.tools.excel.ExcelReader;
+import com.qmth.boot.tools.excel.enums.ExcelType;
+import com.qmth.boot.tools.excel.model.DataMap;
 
 
+import cn.com.qmth.mps.bean.User;
 import cn.com.qmth.mps.dao.UserDao;
 import cn.com.qmth.mps.dao.UserDao;
 import cn.com.qmth.mps.entity.UserEntity;
 import cn.com.qmth.mps.entity.UserEntity;
+import cn.com.qmth.mps.enums.Role;
+import cn.com.qmth.mps.service.SchoolService;
+import cn.com.qmth.mps.service.UserCourseRelationService;
 import cn.com.qmth.mps.service.UserService;
 import cn.com.qmth.mps.service.UserService;
+import cn.com.qmth.mps.util.ByteUtil;
+import cn.com.qmth.mps.util.PageUtil;
+import cn.com.qmth.mps.util.SHA256;
+import cn.com.qmth.mps.vo.user.UserDomain;
+import cn.com.qmth.mps.vo.user.UserQuery;
+import cn.com.qmth.mps.vo.user.UserVo;
 
 
 @Service
 @Service
 public class UserServiceImpl extends ServiceImpl<UserDao, UserEntity> implements UserService {
 public class UserServiceImpl extends ServiceImpl<UserDao, UserEntity> implements UserService {
+	private static final String defPassWd = "123456";
 
 
-	private static final String[] EXCEL_HEADER = new String[] { "姓名", "登录名", "登陆密码", "角色名称", "课程代码", "课程名称", "审核权限" };
+	private static final String[] EXCEL_HEADER = new String[] { "姓名", "登录名", "角色", "科目" };
 
 
+	@Autowired
+	private UserCourseRelationService userCourseRelationService;
+	@Autowired
+	private SchoolService schoolService;
+	
 	@Override
 	@Override
 	public UserEntity getByLoginName(String phone) {
 	public UserEntity getByLoginName(String phone) {
 		QueryWrapper<UserEntity> wrapper = new QueryWrapper<>();
 		QueryWrapper<UserEntity> wrapper = new QueryWrapper<>();
@@ -23,4 +63,255 @@ public class UserServiceImpl extends ServiceImpl<UserDao, UserEntity> implements
 		return this.getOne(wrapper);
 		return this.getOne(wrapper);
 	}
 	}
 
 
+	@Transactional
+	@Override
+	public void saveUser(UserDomain domain, User user) {
+		if (domain.getSchoolId() == null) {
+			throw new StatusException("学校不能为空");
+		}
+		if (!user.getRole().equals(Role.SUPER_ADMIN) && !user.getSchoolId().equals(domain.getSchoolId())) {
+			throw new StatusException("非法操作");
+		}
+		if (domain.getName() == null) {
+			throw new StatusException("姓名不能为空");
+		}
+		if (domain.getLoginName() == null) {
+			throw new StatusException("登录名不能为空");
+		}
+		if (domain.getRole() == null) {
+			throw new StatusException("角色不能为空");
+		}
+		if (domain.getRole().equals(Role.SUPER_ADMIN)) {
+			throw new StatusException("不能新增编辑超管");
+		}
+		if (!domain.getRole().equals(Role.SECTION_LEADER) && CollectionUtils.isNotEmpty(domain.getCourse())) {
+			throw new StatusException("只有科组长可关联科目");
+		}
+		UserEntity ue = null;
+		if (domain.getId() != null) {
+			ue = this.getById(domain.getId());
+			if (ue == null) {
+				throw new StatusException("未找到用户");
+			}
+		} else {
+			if (getByLoginName(domain.getLoginName()) != null) {
+				throw new StatusException("登录名已存在");
+			}
+			ue = new UserEntity();
+			ue.setPassword(ByteUtil.toHexAscii(SHA256.encode(defPassWd)));
+			ue.setSchoolId(user.getSchoolId());
+			ue.setEnable(true);
+			ue.setLoginName(domain.getLoginName());
+		}
+		ue.setName(domain.getName());
+		ue.setRoleId(domain.getRole().getId());
+		this.saveOrUpdate(ue);
+		if (CollectionUtils.isNotEmpty(domain.getCourse())) {
+			Set<String> set = new HashSet<>();
+			for (String s : domain.getCourse()) {
+				set.add(s);
+			}
+			if (set.size() != domain.getCourse().size()) {
+				throw new StatusException("科目代码不能重复");
+			}
+			userCourseRelationService.saveCourse(ue.getSchoolId(), ue.getId(), domain.getCourse());
+		} else {
+			userCourseRelationService.removeCourse(ue.getId());
+		}
+	}
+
+	@Transactional
+	@Override
+	public List<String> importUser(Long schoolId,User user, MultipartFile file) {
+		if (!user.getRole().equals(Role.SUPER_ADMIN) && !user.getSchoolId().equals(schoolId)) {
+			throw new StatusException("非法操作");
+		}
+		InputStream inputStream = null;
+		try {
+			List<DataMap> lineList = ExcelReader.create(ExcelType.XLSX, inputStream, 4).getDataMapList();
+			if (CollectionUtils.isEmpty(lineList)) {
+				throw new StatusException("Excel无内容");
+			}
+			if (1001 < lineList.size()) {
+				throw new StatusException("数据行数不能超过1000");
+			}
+			List<String> failRecords = new ArrayList<>();
+			List<UserDomain> userList = new ArrayList<>();
+			for (int i = 0; i < lineList.size(); i++) {
+				DataMap line = lineList.get(i);
+				if (0 == i) {
+					if (headerError(line)) {
+						throw new StatusException("Excel表头错误");
+					}
+					continue;
+				}
+
+				StringBuilder msg = new StringBuilder();
+
+				UserDomain impuser = new UserDomain();
+				impuser.setSchoolId(schoolId);
+				String name = trimAndNullIfBlank(line.getValue(0));
+				if (StringUtils.isBlank(name)) {
+					msg.append("  姓名不能为空");
+				} else if (name.length() > 20) {
+					msg.append("  姓名不能超过20个字符");
+				}
+				impuser.setName(name);
+
+				String loginname = trimAndNullIfBlank(line.getValue(1));
+				if (StringUtils.isBlank(loginname)) {
+					msg.append("  登录名不能为空");
+				} else if (loginname.length() > 20) {
+					msg.append("  登录名不能超过20个字符");
+				}
+				impuser.setLoginName(loginname);
+
+				String role = trimAndNullIfBlank(line.getValue(2));
+				if (StringUtils.isBlank(role)) {
+					msg.append("  角色名称不能为空");
+				} else if (Role.getByName(role) == null) {
+					msg.append("  角色名称错误");
+				} else if (Role.SUPER_ADMIN.equals(Role.getByName(role))) {
+					msg.append("  不能新建超级管理员");
+				}
+
+				impuser.setRole(Role.getByName(role));
+
+				String coursecodes = trimAndNullIfBlank(line.getValue(3));
+				if(StringUtils.isNotBlank(coursecodes)) {
+					impuser.setCourse(Arrays.asList(coursecodes.split(",")));
+				}
+
+				if (msg.length() > 0) {
+					failRecords.add(newError(i + 1, msg.toString()));
+				} else {
+					userList.add(impuser);
+				}
+
+			}
+			if (CollectionUtils.isNotEmpty(failRecords)) {
+				return failRecords;
+			}
+			for (int i = 0; i < userList.size(); i++) {
+				UserDomain cur = userList.get(i);
+				try {
+					saveUser(cur, user);
+				} catch (StatusException e) {
+					failRecords.add(newError(i + 1, e.getMessage()));
+				} catch (Exception e) {
+					failRecords.add(newError(i + 1, "系统异常"));
+					log.error("用户导入系统异常", e);
+				}
+			}
+			if (CollectionUtils.isNotEmpty(failRecords)) {
+				TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+			}
+			return failRecords;
+		} catch (Exception e) {
+			throw new StatusException("系统错误",e);
+		} finally {
+			if(inputStream!=null) {
+				try {
+					inputStream.close();
+				} catch (IOException e) {
+				}
+			}
+		}
+	}
+	
+	private boolean headerError(DataMap header) {
+		if (EXCEL_HEADER.length != header.size()) {
+			return true;
+		}
+		for (int i = 0; i < EXCEL_HEADER.length; i++) {
+			if (null == header.getValue(i)) {
+				return true;
+			}
+			if (!EXCEL_HEADER[i].equals(header.getValue(i).trim())) {
+				return true;
+			}
+		}
+		return false;
+	}
+	private String trimAndNullIfBlank(String s) {
+		if (StringUtils.isBlank(s)) {
+			return null;
+		}
+		return s.trim();
+	}
+	private String newError(int lineNum, String msg) {
+		return "第" + lineNum + "行" + msg;
+	}
+	
+	@Override
+	public PageResult<UserVo> page(UserQuery query, User user) {
+		if (query.getSchoolId() == null) {
+			throw new StatusException("学校不能为空");
+		}
+		if (!user.getRole().equals(Role.SUPER_ADMIN) && !user.getSchoolId().equals(query.getSchoolId())) {
+			throw new StatusException("非法操作");
+		}
+		IPage<UserVo> iPage = this.baseMapper.page(new Page<UserVo>(query.getPageNumber(), query.getPageSize()), query);
+		return PageUtil.of(iPage);
+	}
+
+	@Override
+	public UserVo info(Long id) {
+		UserEntity ue=this.getById(id);
+		if (ue == null) {
+			throw new StatusException("未找到用户信息");
+		}
+		UserVo vo=new UserVo();
+		vo.setEnable(ue.getEnable());
+		vo.setId(ue.getId());
+		vo.setRoleId(ue.getRoleId());
+		vo.setLoginName(ue.getLoginName());
+		vo.setName(ue.getName());
+		vo.setSchoolId(ue.getSchoolId());
+		vo.setSchoolName(schoolService.getById(ue.getSchoolId()).getName());
+		if(vo.getRoleId().equals(Role.SECTION_LEADER.getId())) {
+			vo.setCourseCodes(userCourseRelationService.getCourseCodes(vo.getId()));
+		}
+		return vo;
+	}
+
+	@Transactional
+	@Override
+	public void toggle(List<Long> ids, Boolean enable) {
+		UpdateWrapper<UserEntity> wrapper = new UpdateWrapper<>();
+		LambdaUpdateWrapper<UserEntity> lw = wrapper.lambda();
+		lw.set(UserEntity::getEnable, enable);
+		lw.in(UserEntity::getId, ids);
+		this.update(wrapper);
+	}
+
+	@Transactional
+	@Override
+	public void updatePass(String password, User accessUser) {
+		if (!accessUser.getRole().equals(Role.SUPER_ADMIN)) {
+			throw new StatusException("不能修改超级管理员");
+		}
+		Long userId = accessUser.getId();
+		String realPassword = StringEscapeUtils.unescapeJava(password);
+		byte[] bytes = SHA256.encode(realPassword);
+		String encodePassword = ByteUtil.toHexAscii(bytes);
+		UserEntity ue=this.getById(userId);
+		if (ue == null) {
+			throw new StatusException("未找到用户信息");
+		}
+		ue.setPassword(encodePassword);
+		this.updateById(ue);
+	}
+
+	@Transactional
+	@Override
+	public void resetPass(Long schoolId,List<Long> ids, User accessUser) {
+		String pw=ByteUtil.toHexAscii(SHA256.encode(defPassWd));
+		UpdateWrapper<UserEntity> wrapper = new UpdateWrapper<>();
+		LambdaUpdateWrapper<UserEntity> lw = wrapper.lambda();
+		lw.set(UserEntity::getPassword, pw);
+		lw.in(UserEntity::getId, ids);
+		lw.eq(UserEntity::getSchoolId, schoolId);
+		this.update(wrapper);
+	}
 }
 }

+ 11 - 14
src/main/java/cn/com/qmth/mps/vo/user/UserVo.java

@@ -2,9 +2,7 @@ package cn.com.qmth.mps.vo.user;
 
 
 import java.util.List;
 import java.util.List;
 
 
-import cn.com.qmth.mps.entity.CourseEntity;
 import cn.com.qmth.mps.entity.base.BaseEntity;
 import cn.com.qmth.mps.entity.base.BaseEntity;
-import cn.com.qmth.mps.enums.Role;
 import io.swagger.annotations.ApiModelProperty;
 import io.swagger.annotations.ApiModelProperty;
 
 
 public class UserVo extends BaseEntity{
 public class UserVo extends BaseEntity{
@@ -24,10 +22,10 @@ public class UserVo extends BaseEntity{
 	private String loginName;
 	private String loginName;
 	@ApiModelProperty("启用禁用")
 	@ApiModelProperty("启用禁用")
 	private Boolean enable;
 	private Boolean enable;
-	@ApiModelProperty("科目信息集合")
-	private List<CourseEntity> courseInfo;
 	@ApiModelProperty("角色")
 	@ApiModelProperty("角色")
-	private Role role;
+	private Long roleId;
+	@ApiModelProperty("科目代码集合")
+	private List<String> courseCodes;
 	public Long getId() {
 	public Long getId() {
 		return id;
 		return id;
 	}
 	}
@@ -64,18 +62,17 @@ public class UserVo extends BaseEntity{
 	public void setEnable(Boolean enable) {
 	public void setEnable(Boolean enable) {
 		this.enable = enable;
 		this.enable = enable;
 	}
 	}
-	public Role getRole() {
-		return role;
+	public Long getRoleId() {
+		return roleId;
 	}
 	}
-	public void setRole(Role role) {
-		this.role = role;
+	public void setRoleId(Long roleId) {
+		this.roleId = roleId;
 	}
 	}
-	public List<CourseEntity> getCourseInfo() {
-		return courseInfo;
+	public List<String> getCourseCodes() {
+		return courseCodes;
 	}
 	}
-	public void setCourseInfo(List<CourseEntity> courseInfo) {
-		this.courseInfo = courseInfo;
+	public void setCourseCodes(List<String> courseCodes) {
+		this.courseCodes = courseCodes;
 	}
 	}
-
 	
 	
 }
 }

BIN
src/main/resources/importtemplates/userImport.xlsx


+ 15 - 0
src/main/resources/mapper/UserCourseRelationMapper.xml

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.com.qmth.mps.dao.UserCourseRelationDao">
+
+	<select id="getCourseCodes" resultType="string">
+		select s.code from mps_user_course_relation
+		t
+		left join
+		mps_course s on
+		t.course_id=s.id
+		where
+		t.user_id=#{userId}
+		order by t.id
+	</select>
+</mapper>

+ 21 - 0
src/main/resources/mapper/UserMapper.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.com.qmth.mps.dao.UserDao">
+
+	<select id="page" resultType="cn.com.qmth.mps.vo.user.UserVo">
+		select t.*,s.name schoolName from mps_user
+		t
+		left join
+		mps_school s on
+		t.school_id=s.id
+		where
+		t.school_id=#{req.schoolId}
+		<if test="req.loginName != null and req.loginName !=''">
+			and t.login_name like concat('%', #{req.loginName}, '%')
+		</if>
+		<if test="req.name != null and reqname !=''">
+			and t.name like concat('%', #{req.name}, '%')
+		</if>
+		order by t.update_time desc
+	</select>
+</mapper>