wangwei vor 7 Jahren
Ursprung
Commit
34164379ad

+ 2 - 2
examcloud-core-basic-api-provider/src/main/java/cn/com/qmth/examcloud/core/basic/api/controller/StudentController.java

@@ -31,7 +31,7 @@ import cn.com.qmth.examcloud.core.basic.dao.entity.Student;
 import cn.com.qmth.examcloud.core.basic.dao.entity.UserEntity;
 import cn.com.qmth.examcloud.core.basic.dao.enums.LoginType;
 import cn.com.qmth.examcloud.core.basic.service.bean.UserInfo;
-import cn.com.qmth.examcloud.core.basic.service.impl.StudentService;
+import cn.com.qmth.examcloud.core.basic.service.impl.StudentServiceImpl;
 
 import javax.servlet.http.HttpServletRequest;
 
@@ -47,7 +47,7 @@ public class StudentController extends ControllerSupport{
     StudentRepo studentRepo;
 
     @Autowired
-    StudentService studentService;
+    StudentServiceImpl studentService;
 
     @Autowired
     UserRepo userRepo;

+ 29 - 18
examcloud-core-basic-api-provider/src/main/java/cn/com/qmth/examcloud/core/basic/api/provider/StudentCloudServiceProvider.java

@@ -1,16 +1,20 @@
 package cn.com.qmth.examcloud.core.basic.api.provider;
 
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import cn.com.qmth.examcloud.commons.web.support.ControllerSupport;
 import cn.com.qmth.examcloud.core.basic.api.StudentCloudService;
 import cn.com.qmth.examcloud.core.basic.api.request.InsertOrUpdateStudentReq;
+import cn.com.qmth.examcloud.core.basic.dao.OrgRepo;
 import cn.com.qmth.examcloud.core.basic.dao.StudentRepo;
 import cn.com.qmth.examcloud.core.basic.dao.UserRepo;
-import cn.com.qmth.examcloud.core.basic.dao.entity.Student;
-import cn.com.qmth.examcloud.core.basic.service.impl.StudentService;
+import cn.com.qmth.examcloud.core.basic.service.bean.StudentInfo;
+import cn.com.qmth.examcloud.core.basic.service.impl.StudentServiceImpl;
+import io.swagger.annotations.ApiOperation;
 
 @RestController
 @RequestMapping("${$rmp.cloud.basic}" + "student")
@@ -18,30 +22,37 @@ public class StudentCloudServiceProvider extends ControllerSupport implements St
 
 	private static final long serialVersionUID = -571041158847398070L;
 
+	@Autowired
+	OrgRepo orgRepo;
+
 	@Autowired
 	UserRepo userRepo;
 
 	@Autowired
-	StudentService studentService;
+	StudentServiceImpl studentService;
 
 	@Autowired
-	private StudentRepo studentRepo;
+	StudentRepo studentRepo;
 
+	@ApiOperation(value = "插入或更新学生")
+	@PostMapping("insertOrUpdateStudent")
 	@Override
-	public void insertOrUpdateStudent(InsertOrUpdateStudentReq req) {
-		Student oldStudent = studentRepo.findByIdentityNumber(req.getIdentityNumber());
-		if (oldStudent == null) {
-			Student student = new Student();
-			student.setName(req.getName());
-			student.setIdentityNumber(req.getIdentityNumber());
-			student.setStudentCode(req.getStudentCode());
-			student.setOrgId(req.getOrgId());
-			studentRepo.save(student);
-		} else {
-			oldStudent.setOrgId(req.getOrgId());
-			oldStudent.setRootOrgId(req.getRootOrgId());
-			studentRepo.save(oldStudent);
-		}
+	public void insertOrUpdateStudent(@RequestBody InsertOrUpdateStudentReq req) {
+
+		StudentInfo studentInfo = new StudentInfo();
+		studentInfo.setName(req.getName());
+		studentInfo.setIdentityNumber(req.getIdentityNumber());
+		studentInfo.setStudentCode(req.getStudentCode());
+		studentInfo.setRootOrgId(req.getRootOrgId());
+
+		studentInfo.setOrgCode(req.getOrgCode());
+		studentInfo.setOrgName(req.getOrgName());
+
+		studentInfo.setPhoneNumber(req.getPhoneNumber());
+		studentInfo.setPhotoPath(req.getPhotoPath());
+		studentInfo.setRemark(req.getRemark());
+
+		studentService.insertOrUpdateStudent(studentInfo);
 	}
 
 }

+ 72 - 16
examcloud-core-basic-api/src/main/java/cn/com/qmth/examcloud/core/basic/api/request/InsertOrUpdateStudentReq.java

@@ -2,43 +2,59 @@ package cn.com.qmth.examcloud.core.basic.api.request;
 
 import cn.com.qmth.examcloud.commons.web.cloud.api.BaseRequest;
 
-public class InsertOrUpdateStudentReq extends BaseRequest{
+public class InsertOrUpdateStudentReq extends BaseRequest {
 
 	private static final long serialVersionUID = 9066273303019460160L;
-	
+
 	/**
 	 * 学生姓名
 	 */
 	private String name;
+
 	/**
 	 * 顶级机构ID
 	 */
 	private Long rootOrgId;
+
 	/**
 	 * 机构ID
 	 */
 	private Long orgId;
+
+	/**
+	 * 学习中心编码
+	 */
+	private String orgCode;
+
+	/**
+	 * 学习中心名称
+	 */
+	private String orgName;
+
 	/**
 	 * 学生code
 	 */
 	private String studentCode;
+
 	/**
 	 * 身份证号码
 	 */
 	private String identityNumber;
+
 	/**
-	 * 创建用户ID
+	 * 备注
 	 */
-	private  Long userId;
+	private String remark;
 
-	
-	public Long getRootOrgId() {
-		return rootOrgId;
-	}
+	/**
+	 * 图片地址
+	 */
+	private String photoPath;
 
-	public void setRootOrgId(Long rootOrgId) {
-		this.rootOrgId = rootOrgId;
-	}
+	/**
+	 * 手机号码
+	 */
+	private String phoneNumber;
 
 	public String getName() {
 		return name;
@@ -48,6 +64,14 @@ public class InsertOrUpdateStudentReq extends BaseRequest{
 		this.name = name;
 	}
 
+	public Long getRootOrgId() {
+		return rootOrgId;
+	}
+
+	public void setRootOrgId(Long rootOrgId) {
+		this.rootOrgId = rootOrgId;
+	}
+
 	public Long getOrgId() {
 		return orgId;
 	}
@@ -56,6 +80,22 @@ public class InsertOrUpdateStudentReq extends BaseRequest{
 		this.orgId = orgId;
 	}
 
+	public String getOrgCode() {
+		return orgCode;
+	}
+
+	public void setOrgCode(String orgCode) {
+		this.orgCode = orgCode;
+	}
+
+	public String getOrgName() {
+		return orgName;
+	}
+
+	public void setOrgName(String orgName) {
+		this.orgName = orgName;
+	}
+
 	public String getStudentCode() {
 		return studentCode;
 	}
@@ -72,12 +112,28 @@ public class InsertOrUpdateStudentReq extends BaseRequest{
 		this.identityNumber = identityNumber;
 	}
 
-	public Long getUserId() {
-		return userId;
+	public String getRemark() {
+		return remark;
+	}
+
+	public void setRemark(String remark) {
+		this.remark = remark;
+	}
+
+	public String getPhotoPath() {
+		return photoPath;
 	}
 
-	public void setUserId(Long userId) {
-		this.userId = userId;
+	public void setPhotoPath(String photoPath) {
+		this.photoPath = photoPath;
 	}
-	
+
+	public String getPhoneNumber() {
+		return phoneNumber;
+	}
+
+	public void setPhoneNumber(String phoneNumber) {
+		this.phoneNumber = phoneNumber;
+	}
+
 }

+ 7 - 4
examcloud-core-basic-dao/src/main/java/cn/com/qmth/examcloud/core/basic/dao/StudentRepo.java

@@ -8,15 +8,18 @@ import cn.com.qmth.examcloud.core.basic.dao.entity.Student;
 /**
  * Created by songyue on 17/1/13.
  */
-public interface StudentRepo extends JpaRepository<Student,Long>,QueryByExampleExecutor<Student>{
+public interface StudentRepo extends JpaRepository<Student, Long>, QueryByExampleExecutor<Student> {
 
-    Student findByUserId(long userId);
+	Student findByUserId(long userId);
 
 	Student findByIdentityNumber(String identityNumber);
 
-	Student findByIdentityNumberAndRootOrgId(String identityNumber,Long rootOrgId);
+	Student findByIdentityNumberAndStudentCodeAndRootOrgId(String identityNumber,
+			String studentCode, Long rootOrgId);
 
-	Student findByStudentCodeAndRootOrgId(String studentCode,Long rootOrgId);
+	Student findByIdentityNumberAndRootOrgId(String identityNumber, Long rootOrgId);
+
+	Student findByStudentCodeAndRootOrgId(String studentCode, Long rootOrgId);
 
 	Student findByRootOrgIdAndStudentCode(Long rootOrgId, String studentCode);
 }

+ 15 - 5
examcloud-core-basic-dao/src/main/java/cn/com/qmth/examcloud/core/basic/dao/entity/Student.java

@@ -30,7 +30,7 @@ public class Student implements JsonSerializable {
 	@GeneratedValue
 	private Long id;
 
-	@OneToOne(cascade = { CascadeType.ALL })
+	@OneToOne(cascade = {CascadeType.ALL})
 	@JoinColumn(name = "userId")
 	private UserEntity user;
 
@@ -59,10 +59,11 @@ public class Student implements JsonSerializable {
 
 	private Long rootOrgId;
 
-	public static long getSerialVersionUID() {
-		return serialVersionUID;
-	}
-	
+	/**
+	 * 手机号码
+	 */
+	private String phoneNumber;
+
 	public Student() {
 	}
 
@@ -165,4 +166,13 @@ public class Student implements JsonSerializable {
 	public void setRootOrgId(Long rootOrgId) {
 		this.rootOrgId = rootOrgId;
 	}
+
+	public String getPhoneNumber() {
+		return phoneNumber;
+	}
+
+	public void setPhoneNumber(String phoneNumber) {
+		this.phoneNumber = phoneNumber;
+	}
+
 }

+ 24 - 0
examcloud-core-basic-service/src/main/java/cn/com/qmth/examcloud/core/basic/service/StudentService.java

@@ -0,0 +1,24 @@
+package cn.com.qmth.examcloud.core.basic.service;
+
+import cn.com.qmth.examcloud.core.basic.dao.entity.Student;
+import cn.com.qmth.examcloud.core.basic.service.bean.StudentInfo;
+
+/**
+ * 类注释
+ *
+ * @author WANGWEI
+ * @date 2018年6月29日
+ * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
+ */
+public interface StudentService {
+
+	/**
+	 * 方法注释
+	 *
+	 * @author WANGWEI
+	 * @param studentInfo
+	 * @return
+	 */
+	Student insertOrUpdateStudent(StudentInfo studentInfo);
+
+}

+ 146 - 0
examcloud-core-basic-service/src/main/java/cn/com/qmth/examcloud/core/basic/service/bean/StudentInfo.java

@@ -0,0 +1,146 @@
+package cn.com.qmth.examcloud.core.basic.service.bean;
+
+import cn.com.qmth.examcloud.commons.web.cloud.api.JsonSerializable;
+
+/**
+ * 类注释
+ *
+ * @author WANGWEI
+ * @date 2018年6月29日
+ * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
+ */
+public class StudentInfo implements JsonSerializable {
+
+	private static final long serialVersionUID = 5341258253620314306L;
+
+	/**
+	 * 学生姓名
+	 */
+	private String name;
+
+	/**
+	 * 顶级机构ID
+	 */
+	private Long rootOrgId;
+
+	/**
+	 * 机构ID
+	 */
+	private Long orgId;
+
+	/**
+	 * 学习中心编码
+	 */
+	private String orgCode;
+
+	/**
+	 * 学习中心名称
+	 */
+	private String orgName;
+
+	/**
+	 * 学生code
+	 */
+	private String studentCode;
+
+	/**
+	 * 身份证号码
+	 */
+	private String identityNumber;
+
+	/**
+	 * 备注
+	 */
+	private String remark;
+
+	/**
+	 * 图片地址
+	 */
+	private String photoPath;
+
+	/**
+	 * 手机号码
+	 */
+	private String phoneNumber;
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public Long getRootOrgId() {
+		return rootOrgId;
+	}
+
+	public void setRootOrgId(Long rootOrgId) {
+		this.rootOrgId = rootOrgId;
+	}
+
+	public Long getOrgId() {
+		return orgId;
+	}
+
+	public void setOrgId(Long orgId) {
+		this.orgId = orgId;
+	}
+
+	public String getOrgCode() {
+		return orgCode;
+	}
+
+	public void setOrgCode(String orgCode) {
+		this.orgCode = orgCode;
+	}
+
+	public String getOrgName() {
+		return orgName;
+	}
+
+	public void setOrgName(String orgName) {
+		this.orgName = orgName;
+	}
+
+	public String getStudentCode() {
+		return studentCode;
+	}
+
+	public void setStudentCode(String studentCode) {
+		this.studentCode = studentCode;
+	}
+
+	public String getIdentityNumber() {
+		return identityNumber;
+	}
+
+	public void setIdentityNumber(String identityNumber) {
+		this.identityNumber = identityNumber;
+	}
+
+	public String getRemark() {
+		return remark;
+	}
+
+	public void setRemark(String remark) {
+		this.remark = remark;
+	}
+
+	public String getPhotoPath() {
+		return photoPath;
+	}
+
+	public void setPhotoPath(String photoPath) {
+		this.photoPath = photoPath;
+	}
+
+	public String getPhoneNumber() {
+		return phoneNumber;
+	}
+
+	public void setPhoneNumber(String phoneNumber) {
+		this.phoneNumber = phoneNumber;
+	}
+
+}

+ 0 - 240
examcloud-core-basic-service/src/main/java/cn/com/qmth/examcloud/core/basic/service/impl/StudentService.java

@@ -1,240 +0,0 @@
-package cn.com.qmth.examcloud.core.basic.service.impl;
-
-import static org.springframework.data.domain.ExampleMatcher.GenericPropertyMatchers.contains;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-
-import javax.transaction.Transactional;
-
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.domain.Example;
-import org.springframework.data.domain.ExampleMatcher;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.Pageable;
-import org.springframework.stereotype.Service;
-
-import cn.com.qmth.examcloud.commons.base.util.ErrorMsg;
-import cn.com.qmth.examcloud.commons.web.security.AccessCtrlUtil;
-import cn.com.qmth.examcloud.core.basic.base.enums.UserType;
-import cn.com.qmth.examcloud.core.basic.dao.OrgRepo;
-import cn.com.qmth.examcloud.core.basic.dao.StudentRepo;
-import cn.com.qmth.examcloud.core.basic.dao.UserRepo;
-import cn.com.qmth.examcloud.core.basic.dao.constants.Consts;
-import cn.com.qmth.examcloud.core.basic.dao.entity.Org;
-import cn.com.qmth.examcloud.core.basic.dao.entity.Student;
-import cn.com.qmth.examcloud.core.basic.dao.entity.UserEntity;
-import cn.com.qmth.examcloud.core.basic.dao.entity.UserRole;
-import cn.com.qmth.examcloud.core.basic.dao.enums.LoginType;
-import cn.com.qmth.examcloud.core.basic.dao.enums.UserScope;
-import cn.com.qmth.examcloud.core.basic.service.bean.UserInfo;
-
-/**
- * 学生服务类
- * Created by songyue on 17/1/14.
- */
-@Service
-public class StudentService {
-
-    @Autowired
-    StudentRepo studentRepo;
-
-    @Autowired
-    UserRepo userRepo;
-
-    @Autowired
-    UserServiceImpl userService;
-
-    @Autowired
-    OrgRepo orgRepo;
-
-    @Autowired
-    DataSendService dataSendService;
-
-    private static final String JPG = ".jpg";
-
-    /**
-     * 获取所有学生(分页)
-     *
-     * @param studentCriteria
-     * @param pageable
-     * @return
-     */
-    public Page<Student> getAllStudent(Student studentCriteria, Pageable pageable) {
-        ExampleMatcher exampleMatcher = ExampleMatcher.matching()
-                .withMatcher("name", contains())
-                .withMatcher("studentCode", contains())
-                .withMatcher("identityNumber", contains()).withIgnoreNullValues();
-        Example<Student> studentExample = Example.of(studentCriteria, exampleMatcher);
-        return studentRepo.findAll(studentExample, pageable);
-    }
-
-    /**
-     * 获取所有学生
-     *
-     * @param studentCriteria
-     * @return
-     */
-    public List<Student> getAllStudent(Student studentCriteria) {
-        ExampleMatcher exampleMatcher = ExampleMatcher.matching();
-        Example<Student> studentExample = Example.of(studentCriteria, exampleMatcher);
-        return studentRepo.findAll(studentExample);
-    }
-
-    /**
-     * 绑定学生照片
-     *
-     * @return
-     */
-    public List<ErrorMsg> photopBundled(Long rootOrgId, File directory) {
-        List<ErrorMsg> list = new ArrayList<ErrorMsg>();
-        if (directory.isDirectory()) {
-            for (File file : directory.listFiles()) {
-                if (!file.getName().endsWith(JPG)) {
-                    list.add(new ErrorMsg(file.getName() + "格式错误,文件名格式必须是jpg(小写)"));
-                }
-                String fileName = file.getName().split(JPG)[0];
-                //先查学号
-                Student student = studentRepo.findByStudentCodeAndRootOrgId(fileName, rootOrgId);
-                if (student == null) {//学号不存在查身份证号
-                    student = studentRepo.findByIdentityNumber(fileName);
-                }
-                if (student != null) {//学生存在则绑定照片
-                    student.setPhotoPath(student.getUser().getRootOrgId() + File.separator + "photo" + File.separator + fileName);
-                    studentRepo.save(student);
-                    dataSendService.sendStudent(student);
-                }
-            }
-        } else {
-            list.add(new ErrorMsg("文件路径不正确"));
-        }
-        return list;
-    }
-
-    @Transactional
-    public Student save(Student student) {
-    	//判断是否有用户
-        if (student.getUser() == null || null == student.getUser().getId()) {
-            //判断是否有该学生
-            if (!StringUtils.isEmpty(student.getStudentCode())) {
-            	//学号查找不为空,更新身份证号
-                Student s1 = studentRepo.findByRootOrgIdAndStudentCode(student.getUser().getRootOrgId(), student.getStudentCode());
-                if (s1 != null) {
-                    s1.setIdentityNumber(student.getIdentityNumber());
-                    s1.setUpdateTime(new Date());
-                    s1.setName(student.getName());
-                    s1.setOrgId(student.getOrgId());
-                    s1 = studentRepo.save(s1);
-                    dataSendService.sendStudent(s1);
-                    return s1;
-                }
-            }
-            
-            //身份证查找不为空,更新学号
-            Student s2 = studentRepo.findByIdentityNumberAndRootOrgId(student.getIdentityNumber(), student.getRootOrgId());
-            if (s2 != null) {
-                s2.setStudentCode(student.getStudentCode());
-                s2.setUpdateTime(new Date());
-                s2.setName(student.getName());
-                s2.setOrgId(student.getOrgId());
-                s2 = studentRepo.save(s2);
-                dataSendService.sendStudent(s2);
-                return s2;
-            }
-            
-            student.setOrgId(student.getUser().getOrgId());
-            student.setRootOrgId(student.getUser().getRootOrgId());
-            //新建用户和学生
-            UserEntity user = new UserEntity(student.getName(), UserScope.ORG, student.getUser().getRootOrgId(), student.getUser().getOrgId(), UserType.STUDENT);
-            user.setEnable(student.getUser().getEnable() == null ? true : student.getUser().getEnable());
-            
-
-			if (StringUtils.isNotEmpty(student.getStudentCode())) {
-				user.setLoginName(student.getStudentCode());
-			} else {
-				user.setLoginName(student.getIdentityNumber());
-			}
-
-			String identityNumber = student.getIdentityNumber();
-			if (StringUtils.isNotEmpty(identityNumber)
-					&& identityNumber.matches("[0-9a-zA-Z]{6,}")) {
-				user.setPassword(
-						StringUtils.substring(identityNumber, -6, identityNumber.length()));
-			} else {
-				user.setPassword(Consts.DEFAULT_PASSWORD);
-			}
-
-            List<UserRole> userRoles = new ArrayList<UserRole>();
-            userRoles.add(new UserRole("STUDENT"));
-            user.setUserRoles(userRoles);
-            userRepo.save(user);
-            student.setUser(user);
-        }
-        
-        student = studentRepo.save(student);
-        dataSendService.sendStudent(student);
-        return student;
-    }
-
-    /**
-     * 二级登录
-     *
-     * @param orgId
-     * @param loginName
-     * @param password
-     * @return
-     */
-    public UserInfo login(String orgId,
-                          String loginName,
-                          String password,
-                          LoginType loginType) throws Exception {
-        Org org = orgRepo.findFirstByParentIdAndCode((long) 0, orgId);
-        if (org == null) {
-            throw new RuntimeException("学校不存在");
-        }
-        Student student = null;
-        if (LoginType.STUDENT_CODE.equals(loginType)) {
-            student = studentRepo.findByStudentCodeAndRootOrgId(loginName, org.getId());
-        }else if (LoginType.IDENTITY_NUMBER.equals(loginType)) {
-            student = studentRepo.findByIdentityNumberAndRootOrgId(loginName, org.getId());
-        }
-        if (student == null) {
-            throw new RuntimeException("该用户不存在");
-        }
-        return this.loginProcess(student, password);
-    }
-
-    private UserInfo loginProcess(Student student, String password) throws Exception {
-        if (student.getUser() == null) {
-            throw new RuntimeException("该用户不存在");
-        } else if (!student.getUser().getPassword().equals(password)) {
-            throw new RuntimeException("密码错误");
-        } else if (!student.getUser().getEnable()) {
-            throw new RuntimeException("该用户被禁用");
-        } else {
-            String token = AccessCtrlUtil.buildToken();
-            userService.initUserLogin(student.getUser());
-            userService.createAccessUser(token, student.getUser(), student.getId());
-            userService.createUserLogin(token, student.getUser());
-            UserInfo userInfo = userService.getUserInfo(student.getUser(), token);
-            userInfo.setStudentId(student.getId());
-            userInfo.setIdentityNumber(student.getIdentityNumber());
-            userInfo.setStudentCode(student.getStudentCode());
-            return userInfo;
-        }
-    }
-
-    public Student update(Student student) {
-        student.setUpdateTime(new Date());
-        UserEntity user = userRepo.findOne(student.getUser().getId());
-        user.setName(student.getName());
-        student.setUser(user);
-        student = studentRepo.save(student);
-        dataSendService.sendStudent(student);
-        return student;
-    }
-
-}

+ 306 - 0
examcloud-core-basic-service/src/main/java/cn/com/qmth/examcloud/core/basic/service/impl/StudentServiceImpl.java

@@ -0,0 +1,306 @@
+package cn.com.qmth.examcloud.core.basic.service.impl;
+
+import static org.springframework.data.domain.ExampleMatcher.GenericPropertyMatchers.contains;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import javax.transaction.Transactional;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Example;
+import org.springframework.data.domain.ExampleMatcher;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.stereotype.Service;
+
+import cn.com.qmth.examcloud.commons.base.exception.StatusException;
+import cn.com.qmth.examcloud.commons.base.util.ErrorMsg;
+import cn.com.qmth.examcloud.commons.web.security.AccessCtrlUtil;
+import cn.com.qmth.examcloud.core.basic.base.enums.UserType;
+import cn.com.qmth.examcloud.core.basic.dao.OrgRepo;
+import cn.com.qmth.examcloud.core.basic.dao.StudentRepo;
+import cn.com.qmth.examcloud.core.basic.dao.UserRepo;
+import cn.com.qmth.examcloud.core.basic.dao.constants.Consts;
+import cn.com.qmth.examcloud.core.basic.dao.entity.Org;
+import cn.com.qmth.examcloud.core.basic.dao.entity.Student;
+import cn.com.qmth.examcloud.core.basic.dao.entity.UserEntity;
+import cn.com.qmth.examcloud.core.basic.dao.entity.UserRole;
+import cn.com.qmth.examcloud.core.basic.dao.enums.LoginType;
+import cn.com.qmth.examcloud.core.basic.dao.enums.UserScope;
+import cn.com.qmth.examcloud.core.basic.service.StudentService;
+import cn.com.qmth.examcloud.core.basic.service.bean.StudentInfo;
+import cn.com.qmth.examcloud.core.basic.service.bean.UserInfo;
+
+/**
+ * 学生服务类 Created by songyue on 17/1/14.
+ */
+@Service
+public class StudentServiceImpl implements StudentService {
+
+	@Autowired
+	StudentRepo studentRepo;
+
+	@Autowired
+	UserRepo userRepo;
+
+	@Autowired
+	UserServiceImpl userService;
+
+	@Autowired
+	OrgRepo orgRepo;
+
+	@Autowired
+	DataSendService dataSendService;
+
+	private static final String JPG = ".jpg";
+
+	/**
+	 * 获取所有学生(分页)
+	 *
+	 * @param studentCriteria
+	 * @param pageable
+	 * @return
+	 */
+	public Page<Student> getAllStudent(Student studentCriteria, Pageable pageable) {
+		ExampleMatcher exampleMatcher = ExampleMatcher.matching().withMatcher("name", contains())
+				.withMatcher("studentCode", contains()).withMatcher("identityNumber", contains())
+				.withIgnoreNullValues();
+		Example<Student> studentExample = Example.of(studentCriteria, exampleMatcher);
+		return studentRepo.findAll(studentExample, pageable);
+	}
+
+	/**
+	 * 获取所有学生
+	 *
+	 * @param studentCriteria
+	 * @return
+	 */
+	public List<Student> getAllStudent(Student studentCriteria) {
+		ExampleMatcher exampleMatcher = ExampleMatcher.matching();
+		Example<Student> studentExample = Example.of(studentCriteria, exampleMatcher);
+		return studentRepo.findAll(studentExample);
+	}
+
+	/**
+	 * 绑定学生照片
+	 *
+	 * @return
+	 */
+	public List<ErrorMsg> photopBundled(Long rootOrgId, File directory) {
+		List<ErrorMsg> list = new ArrayList<ErrorMsg>();
+		if (directory.isDirectory()) {
+			for (File file : directory.listFiles()) {
+				if (!file.getName().endsWith(JPG)) {
+					list.add(new ErrorMsg(file.getName() + "格式错误,文件名格式必须是jpg(小写)"));
+				}
+				String fileName = file.getName().split(JPG)[0];
+				// 先查学号
+				Student student = studentRepo.findByStudentCodeAndRootOrgId(fileName, rootOrgId);
+				if (student == null) {// 学号不存在查身份证号
+					student = studentRepo.findByIdentityNumber(fileName);
+				}
+				if (student != null) {// 学生存在则绑定照片
+					student.setPhotoPath(student.getUser().getRootOrgId() + File.separator + "photo"
+							+ File.separator + fileName);
+					studentRepo.save(student);
+					dataSendService.sendStudent(student);
+				}
+			}
+		} else {
+			list.add(new ErrorMsg("文件路径不正确"));
+		}
+		return list;
+	}
+
+	@Transactional
+	public Student save(Student student) {
+		// 判断是否有用户
+		if (student.getUser() == null || null == student.getUser().getId()) {
+			// 判断是否有该学生
+			if (!StringUtils.isEmpty(student.getStudentCode())) {
+				// 学号查找不为空,更新身份证号
+				Student s1 = studentRepo.findByRootOrgIdAndStudentCode(
+						student.getUser().getRootOrgId(), student.getStudentCode());
+				if (s1 != null) {
+					s1.setIdentityNumber(student.getIdentityNumber());
+					s1.setUpdateTime(new Date());
+					s1.setName(student.getName());
+					s1.setOrgId(student.getOrgId());
+					s1 = studentRepo.save(s1);
+					dataSendService.sendStudent(s1);
+					return s1;
+				}
+			}
+
+			// 身份证查找不为空,更新学号
+			Student s2 = studentRepo.findByIdentityNumberAndRootOrgId(student.getIdentityNumber(),
+					student.getRootOrgId());
+			if (s2 != null) {
+				s2.setStudentCode(student.getStudentCode());
+				s2.setUpdateTime(new Date());
+				s2.setName(student.getName());
+				s2.setOrgId(student.getOrgId());
+				s2 = studentRepo.save(s2);
+				dataSendService.sendStudent(s2);
+				return s2;
+			}
+
+			student.setOrgId(student.getUser().getOrgId());
+			student.setRootOrgId(student.getUser().getRootOrgId());
+			// 新建用户和学生
+			UserEntity user = new UserEntity(student.getName(), UserScope.ORG,
+					student.getUser().getRootOrgId(), student.getUser().getOrgId(),
+					UserType.STUDENT);
+			user.setEnable(
+					student.getUser().getEnable() == null ? true : student.getUser().getEnable());
+
+			if (StringUtils.isNotEmpty(student.getStudentCode())) {
+				user.setLoginName(student.getStudentCode());
+			} else {
+				user.setLoginName(student.getIdentityNumber());
+			}
+
+			String identityNumber = student.getIdentityNumber();
+			if (StringUtils.isNotEmpty(identityNumber)
+					&& identityNumber.matches("[0-9a-zA-Z]{6,}")) {
+				user.setPassword(
+						StringUtils.substring(identityNumber, -6, identityNumber.length()));
+			} else {
+				user.setPassword(Consts.DEFAULT_PASSWORD);
+			}
+
+			List<UserRole> userRoles = new ArrayList<UserRole>();
+			userRoles.add(new UserRole("STUDENT"));
+			user.setUserRoles(userRoles);
+			userRepo.save(user);
+			student.setUser(user);
+		}
+
+		student = studentRepo.save(student);
+		dataSendService.sendStudent(student);
+		return student;
+	}
+
+	/**
+	 * 二级登录
+	 *
+	 * @param orgId
+	 * @param loginName
+	 * @param password
+	 * @return
+	 */
+	public UserInfo login(String orgId, String loginName, String password, LoginType loginType)
+			throws Exception {
+		Org org = orgRepo.findFirstByParentIdAndCode((long) 0, orgId);
+		if (org == null) {
+			throw new RuntimeException("学校不存在");
+		}
+		Student student = null;
+		if (LoginType.STUDENT_CODE.equals(loginType)) {
+			student = studentRepo.findByStudentCodeAndRootOrgId(loginName, org.getId());
+		} else if (LoginType.IDENTITY_NUMBER.equals(loginType)) {
+			student = studentRepo.findByIdentityNumberAndRootOrgId(loginName, org.getId());
+		}
+		if (student == null) {
+			throw new RuntimeException("该用户不存在");
+		}
+		return this.loginProcess(student, password);
+	}
+
+	private UserInfo loginProcess(Student student, String password) throws Exception {
+		if (student.getUser() == null) {
+			throw new RuntimeException("该用户不存在");
+		} else if (!student.getUser().getPassword().equals(password)) {
+			throw new RuntimeException("密码错误");
+		} else if (!student.getUser().getEnable()) {
+			throw new RuntimeException("该用户被禁用");
+		} else {
+			String token = AccessCtrlUtil.buildToken();
+			userService.initUserLogin(student.getUser());
+			userService.createAccessUser(token, student.getUser(), student.getId());
+			userService.createUserLogin(token, student.getUser());
+			UserInfo userInfo = userService.getUserInfo(student.getUser(), token);
+			userInfo.setStudentId(student.getId());
+			userInfo.setIdentityNumber(student.getIdentityNumber());
+			userInfo.setStudentCode(student.getStudentCode());
+			return userInfo;
+		}
+	}
+
+	public Student update(Student student) {
+		student.setUpdateTime(new Date());
+		UserEntity user = userRepo.findOne(student.getUser().getId());
+		user.setName(student.getName());
+		student.setUser(user);
+		student = studentRepo.save(student);
+		dataSendService.sendStudent(student);
+		return student;
+	}
+
+	@Override
+	@Transactional
+	public Student insertOrUpdateStudent(StudentInfo studentInfo) {
+		Long rootOrgId = studentInfo.getRootOrgId();
+		Org rootOrg = orgRepo.findOne(rootOrgId);
+
+		if (null == rootOrg || (!rootOrg.getParentId().equals(0L))) {
+			throw new StatusException("B-160001", "顶级机构错误");
+		}
+
+		Long orgId = studentInfo.getOrgId();
+		String orgCode = studentInfo.getOrgCode();
+		String orgName = studentInfo.getOrgName();
+
+		if (null != orgId) {
+			Org org = orgRepo.findOne(orgId);
+			if (!org.getParentId().equals(rootOrgId)) {
+				throw new StatusException("B-160002", "机构错误");
+			}
+		} else {
+			if (StringUtils.isBlank(orgName) || StringUtils.isBlank(orgCode)) {
+				Org org = orgRepo.findFirstByParentIdAndCode(rootOrgId, orgCode);
+				if (null == org) {
+					org = new Org();
+					org.setParentId(rootOrgId);
+					org.setCode(orgCode);
+					org.setName(orgName);
+					Org saved = orgRepo.save(org);
+					orgId = saved.getId();
+				}
+			}
+		}
+
+		String identityNumber = studentInfo.getIdentityNumber();
+		String studentCode = studentInfo.getStudentCode();
+
+		Student student = studentRepo.findByIdentityNumberAndStudentCodeAndRootOrgId(identityNumber,
+				studentCode, rootOrgId);
+
+		Student updatedStudent = new Student();
+		if (null != student) {
+			updatedStudent.setId(student.getId());
+		}
+
+		updatedStudent.setName(studentInfo.getName());
+		updatedStudent.setIdentityNumber(identityNumber);
+		updatedStudent.setStudentCode(studentCode);
+		updatedStudent.setOrgId(orgId);
+		if (null != studentInfo.getPhotoPath()) {
+			updatedStudent.setPhotoPath(studentInfo.getPhotoPath());
+		}
+		if (null != studentInfo.getPhoneNumber()) {
+			updatedStudent.setPhoneNumber(studentInfo.getPhoneNumber());
+		}
+		if (null != studentInfo.getRemark()) {
+			updatedStudent.setRemark(studentInfo.getRemark());
+		}
+		studentRepo.save(updatedStudent);
+
+		return updatedStudent;
+	}
+
+}