瀏覽代碼

查询员绑定考生

xiatian 1 年之前
父節點
當前提交
4e5b11874a

+ 20 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/bean/UserStudentVo.java

@@ -0,0 +1,20 @@
+package cn.com.qmth.stmms.biz.exam.bean;
+
+import cn.com.qmth.stmms.common.annotation.ExcelField;
+
+public class UserStudentVo {
+
+
+    @ExcelField(title = "准考证号", align = 1, sort = 20)
+    private String examNumber;
+
+	public String getExamNumber() {
+		return examNumber;
+	}
+
+	public void setExamNumber(String examNumber) {
+		this.examNumber = examNumber;
+	}
+
+
+}

+ 14 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/UserStudentDao.java

@@ -0,0 +1,14 @@
+package cn.com.qmth.stmms.biz.exam.dao;
+
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.repository.PagingAndSortingRepository;
+
+import cn.com.qmth.stmms.biz.exam.model.UserStudent;
+
+public interface UserStudentDao extends PagingAndSortingRepository<UserStudent, Integer>, JpaSpecificationExecutor<UserStudent> {
+
+	int countByUserId(Integer userId);
+
+	void deleteByUserId(Integer userId);
+
+}

+ 66 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/UserStudent.java

@@ -0,0 +1,66 @@
+package cn.com.qmth.stmms.biz.exam.model;
+
+import java.io.Serializable;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "eb_user_student")
+public class UserStudent implements Serializable {
+
+    private static final long serialVersionUID = -2682887025138655950L;
+
+    @Id
+    @GeneratedValue
+    private Integer id;
+    
+    @Column(name = "school_id", nullable = false)
+    private Integer schoolId;
+
+    @Column(name = "user_id", nullable = false)
+    private Integer userId;
+
+    @Column(name = "exam_number", nullable = false)
+    private String examNumber;
+
+    public UserStudent() {
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+
+	public String getExamNumber() {
+		return examNumber;
+	}
+
+	public void setExamNumber(String examNumber) {
+		this.examNumber = examNumber;
+	}
+
+	public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+	public Integer getSchoolId() {
+		return schoolId;
+	}
+
+	public void setSchoolId(Integer schoolId) {
+		this.schoolId = schoolId;
+	}
+
+}

+ 11 - 1
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/query/ExamStudentSearchQuery.java

@@ -10,10 +10,12 @@ import org.springframework.data.domain.Sort.Direction;
 
 import cn.com.qmth.stmms.biz.common.BaseQuery;
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
+import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.enums.SubjectiveStatus;
 
 public class ExamStudentSearchQuery extends BaseQuery<ExamStudent> {
-
+	
+	private Role role;
     private Integer examId;
 
     private Integer schoolId;
@@ -547,4 +549,12 @@ public class ExamStudentSearchQuery extends BaseQuery<ExamStudent> {
 		this.inspectUnrepeated = inspectUnrepeated;
 	}
 
+	public Role getRole() {
+		return role;
+	}
+
+	public void setRole(Role role) {
+		this.role = role;
+	}
+
 }

+ 14 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/UserStudentService.java

@@ -0,0 +1,14 @@
+package cn.com.qmth.stmms.biz.exam.service;
+
+import java.util.List;
+
+import cn.com.qmth.stmms.biz.exam.bean.UserStudentVo;
+
+public interface UserStudentService {
+
+	public int addStudent(List<UserStudentVo> list,Integer schoolId,Integer userId);
+
+	public int countByUserId(Integer id);
+
+	public void clear(Integer userId);
+}

+ 66 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/UserStudentServiceImpl.java

@@ -0,0 +1,66 @@
+package cn.com.qmth.stmms.biz.exam.service.impl;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import cn.com.qmth.stmms.biz.common.BaseQueryService;
+import cn.com.qmth.stmms.biz.exam.bean.UserStudentVo;
+import cn.com.qmth.stmms.biz.exam.dao.UserStudentDao;
+import cn.com.qmth.stmms.biz.exam.model.UserStudent;
+import cn.com.qmth.stmms.biz.exam.service.UserStudentService;
+import cn.com.qmth.stmms.biz.utils.BatchUpdateDataUtil;
+
+@Service("userStudentService")
+public class UserStudentServiceImpl extends BaseQueryService<UserStudent> implements UserStudentService {
+	
+	@PersistenceContext
+	private EntityManager entityManager;
+	
+	@Autowired
+	private UserStudentDao userStudentDao;
+	
+	@Transactional
+	@Override
+	public int addStudent(List<UserStudentVo> list,Integer schoolId, Integer userId) {
+		int suc=0;
+		if(list!=null&&list.size()>0) {
+			suc=new BatchUpdateDataUtil<UserStudentVo>() {
+				@Override
+				protected int updateData(List<UserStudentVo> dataList) {
+					List<String> examNumbers=dataList.stream().map(e->e.getExamNumber()).collect(Collectors.toList());
+					StringBuilder sql = new StringBuilder();
+					sql.append(" INSERT INTO eb_user_student (`school_id`,`user_id`, `exam_number`) ");
+					sql.append(" SELECT distinct "+schoolId+","+userId+",s.exam_number from eb_exam_student s ");
+					sql.append(" where s.school_id="+schoolId +" and s.exam_number in ('"+StringUtils.join(examNumbers,"','")+"') ");
+					sql.append(" and not exists (select 1 from eb_user_student t where t.school_id=s.school_id and t.exam_number=s.exam_number)");
+					Query query = entityManager.createNativeQuery(sql.toString());
+					return query.executeUpdate();
+				}
+			}.setDataForBatch(list, 500);
+		}
+		return suc;
+	}
+
+	@Override
+	public int countByUserId(Integer userId) {
+		return userStudentDao.countByUserId(userId);
+	}
+
+	@Transactional
+	@Override
+	public void clear(Integer userId) {
+		userStudentDao.deleteByUserId(userId);
+	}
+
+	
+
+}

+ 31 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/utils/BatchUpdateDataUtil.java

@@ -0,0 +1,31 @@
+package cn.com.qmth.stmms.biz.utils;
+
+import java.util.List;
+
+public abstract class BatchUpdateDataUtil<P> {
+	/**
+	 * @param dataList 参数集合
+	 * @param batchSize 每批数量
+	 */
+	public final int setDataForBatch(List<P> dataList, int batchSize) {
+		if (dataList == null || dataList.size() == 0) {
+			return 0;
+		}
+		int total=0;
+		if (dataList.size() <= batchSize) {
+			total=total+updateData(dataList);
+		} else {
+			int size = dataList.size();
+			int len = batchSize;
+			int count = (size + len - 1) / len;
+
+			for (int i = 0; i < count; i++) {
+				List<P> subList = dataList.subList(i * len, ((i + 1) * len > size ? size : len * (i + 1)));
+				total=total+updateData(subList);
+			}
+		}
+		return total;
+	}
+
+	protected abstract int updateData(List<P> dataList);
+}

+ 1 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ScoreController.java

@@ -106,6 +106,7 @@ public class ScoreController extends BaseExamController {
             String subjectCodeIn = StringUtils.join(wu.getSubjectCodeSet(), ",");
             query.setSubjectCodeIn(subjectCodeIn);
         }
+        query.setRole(wu.getRole());
         query = studentService.findByQuery(query);
         for (ExamStudent student : query.getResult()) {
             buildSheetUrl(student);

+ 95 - 4
stmms-web/src/main/java/cn/com/qmth/stmms/admin/user/UserController.java

@@ -11,23 +11,24 @@ import java.util.Set;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-import net.sf.json.JSONObject;
-
 import org.apache.commons.lang.StringEscapeUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.multipart.MultipartFile;
 import org.springframework.web.servlet.ModelAndView;
 import org.springframework.web.servlet.mvc.support.RedirectAttributes;
 
 import cn.com.qmth.stmms.admin.dto.MarkerDTO;
 import cn.com.qmth.stmms.admin.dto.SubjectUserDTO;
 import cn.com.qmth.stmms.admin.exam.BaseExamController;
+import cn.com.qmth.stmms.biz.exam.bean.UserStudentVo;
 import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
 import cn.com.qmth.stmms.biz.exam.model.Marker;
@@ -41,6 +42,7 @@ import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
 import cn.com.qmth.stmms.biz.exam.service.MarkerService;
 import cn.com.qmth.stmms.biz.exam.service.SubjectUserService;
 import cn.com.qmth.stmms.biz.exam.service.UserExamService;
+import cn.com.qmth.stmms.biz.exam.service.UserStudentService;
 import cn.com.qmth.stmms.biz.user.model.User;
 import cn.com.qmth.stmms.biz.user.service.UserService;
 import cn.com.qmth.stmms.biz.user.service.query.UserSearchQuery;
@@ -51,7 +53,9 @@ import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.enums.UserSource;
 import cn.com.qmth.stmms.common.utils.EncryptUtils;
 import cn.com.qmth.stmms.common.utils.ExportExcel;
+import cn.com.qmth.stmms.common.utils.ImportExcel;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
+import net.sf.json.JSONObject;
 
 @Controller
 @RequestMapping("/admin/user")
@@ -88,6 +92,10 @@ public class UserController extends BaseExamController {
 
     @Autowired
     private ExamStudentService studentService;
+    
+    @Autowired
+    private UserStudentService userStudentService;
+    
 
     @Logging(menu = "查询用户", type = LogType.QUERY)
     @RequestMapping("/list")
@@ -130,6 +138,10 @@ public class UserController extends BaseExamController {
                 view.addObject("examIdString", StringUtils.join(userExamService.findExamIds(user.getId()), SPLIT));
             }
             view.addObject("query", query);
+            if(user.getRole() == Role.SCHOOL_VIEWER) {
+            	int studentCount=userStudentService.countByUserId(id);
+            	view.addObject("studentCount", studentCount);
+            }
             return view;
         } else {
             return new ModelAndView("redirect:/admin/user/list");
@@ -139,18 +151,20 @@ public class UserController extends BaseExamController {
     @Logging(menu = "新增(修改)用户", type = LogType.UPDATE)
     @RequestMapping(value = "/save", method = RequestMethod.POST)
     @RoleRequire(Role.SCHOOL_ADMIN)
-    public String save(HttpServletRequest request, Model model, User user,
+    @Transactional
+    public String save(HttpServletRequest request,RedirectAttributes redirectAttributes, Model model, User user,
             @RequestParam(required = false) String subjectCodeString,
             @RequestParam(required = false) String examIdString,
             @RequestParam(required = false, defaultValue = "1") int pageNumber,
             @RequestParam(required = false) UserSource querySource, @RequestParam(required = false) Role queryRole,
             @RequestParam(required = false) String queryLoginName, @RequestParam(required = false) String queryName,
-            @RequestParam(required = false) Boolean queryEnable) {
+            @RequestParam(required = false) Boolean queryEnable,@RequestParam(required = false)MultipartFile studentFile) {
         User current = RequestUtils.getWebUser(request).getUser();
         User previous = null;
         if (user.getId() != null) {
             previous = userService.findById(user.getId());
         }
+        Integer suc=null;
         if (previous == null) {
             String message = validate(user, subjectCodeString, examIdString);
             if (message == null) {
@@ -166,6 +180,7 @@ public class UserController extends BaseExamController {
                 }
                 if (user.getRole() == Role.SCHOOL_VIEWER) {
                     userExamService.updateByUserId(user.getId(), getExamIdSet(examIdString));
+                    subjectUserService.updateByUserId(user.getId(), getSubjectCodeSet(subjectCodeString));
                 }
                 if (user.getRole() == Role.COLLEGE_ADMIN) {
                     int examId = getSessionExamId(request);
@@ -173,9 +188,30 @@ public class UserController extends BaseExamController {
                             getSubjectCodeSetByCollege(examId, user.getDescription()));
                     userService.save(user);
                 }
+                if(user.getRole() == Role.SCHOOL_VIEWER&&!studentFile.isEmpty()) {
+                	suc=addStudent(studentFile, user.getSchoolId(), user.getId());
+                }
             } else {
                 model.addAttribute("user", user);
                 model.addAttribute("roleList", ROLE_LIST);
+                if (user.getRole() == Role.SUBJECT_HEADER || user.getRole() == Role.INSPECTOR
+                        || user.getRole() == Role.COLLEGE_ADMIN|| user.getRole() == Role.SCHOOL_VIEWER) {
+                	model.addAttribute("subjectCodeString",
+                            StringUtils.join(subjectUserService.findSubjectCode(user.getId()), SPLIT));
+                	model.addAttribute("examIdString", StringUtils.join(userExamService.findExamIds(user.getId()), SPLIT));
+                }
+                if(user.getRole() == Role.SCHOOL_VIEWER) {
+                	int studentCount=userStudentService.countByUserId(user.getId());
+                	model.addAttribute("studentCount", studentCount);
+                }
+                UserSearchQuery query = new UserSearchQuery();
+                query.setPageNumber(pageNumber);
+                query.setSource(querySource);
+                query.setRole(queryRole);
+                query.setLoginName(queryLoginName);
+                query.setName(queryName);
+                query.setEnable(queryEnable);
+                model.addAttribute("query", query);
                 model.addAttribute("message", message);
                 return "modules/user/userEdit";
             }
@@ -208,6 +244,9 @@ public class UserController extends BaseExamController {
                 }
                 previous.setUpdatedTime(new Date());
                 userService.save(previous);
+                if(previous.getRole() == Role.SCHOOL_VIEWER&&!studentFile.isEmpty()) {
+                	suc=addStudent(studentFile, previous.getSchoolId(), previous.getId());
+                }
             } else {
                 model.addAttribute("user", previous);
                 model.addAttribute("roleList", ROLE_LIST);
@@ -220,15 +259,38 @@ public class UserController extends BaseExamController {
                 query.setName(queryName);
                 query.setEnable(queryEnable);
                 model.addAttribute("query", query);
+                if (user.getRole() == Role.SUBJECT_HEADER || user.getRole() == Role.INSPECTOR
+                        || user.getRole() == Role.COLLEGE_ADMIN|| user.getRole() == Role.SCHOOL_VIEWER) {
+                	model.addAttribute("subjectCodeString",
+                            StringUtils.join(subjectUserService.findSubjectCode(user.getId()), SPLIT));
+                	model.addAttribute("examIdString", StringUtils.join(userExamService.findExamIds(user.getId()), SPLIT));
+                }
+                if(user.getRole() == Role.SCHOOL_VIEWER) {
+                	int studentCount=userStudentService.countByUserId(user.getId());
+                	model.addAttribute("studentCount", studentCount);
+                }
                 return "modules/user/userEdit";
             }
         }
         String enable = queryEnable == null ? "" : queryEnable.toString();
         String role = queryRole == null ? "" : String.valueOf(queryRole.getValue());
         String source = querySource == null ? "" : String.valueOf(querySource.getValue());
+        if(suc!=null) {
+        	addMessage(redirectAttributes, "成功绑定考生"+suc+"条");
+        }
         return "redirect:/admin/user/list?pageNumber=" + pageNumber + "&source=" + source + "&role=" + role
                 + "&loginName=" + queryLoginName + "&name=" + queryName + "&enable=" + enable;
     }
+    
+    private int addStudent(MultipartFile file,Integer schoolId,Integer userId) {
+		try {
+			ImportExcel ei = new ImportExcel(file, 1, 0);
+			List<UserStudentVo> list = ei.getDataList(UserStudentVo.class);
+			return userStudentService.addStudent(list, schoolId, userId);
+		} catch (Exception e) {
+			throw new RuntimeException(e);
+		}
+    }
 
     private String validate(User user, String subjectCodeString, String examIdString) {
         String message = null;
@@ -489,4 +551,33 @@ public class UserController extends BaseExamController {
             return "modules/exam/subjectSelect";
         }
     }
+    
+    @RequestMapping(value = "student/template")
+    public String importStudentTemplate(HttpServletResponse response,RedirectAttributes redirectAttributes) {
+        try {
+            String fileName = "绑定考生导入模板.xlsx";
+            String title =  "绑定考生数据";
+            List<SubjectUser> list = new ArrayList<SubjectUser>();
+            list.add(new SubjectUser());
+            new ExportExcel(title, UserStudentVo.class, 2).setDataList(list).write(response, fileName).dispose();
+            return null;
+        } catch (Exception e) {
+            addMessage(redirectAttributes, "导入模板下载失败!失败信息:" + e.getMessage());
+        }
+    	return "redirect:/admin/user/edit";
+    }
+    
+    @RequestMapping(value = "student/clear")
+    public String studentClear(@RequestParam Integer id,
+            @RequestParam(required = false, defaultValue = "1") int pageNumber,
+            @RequestParam(required = false) UserSource querySource, @RequestParam(required = false) Role queryRole,
+            @RequestParam(required = false) String queryLoginName, @RequestParam(required = false) String queryName,
+            @RequestParam(required = false) Boolean queryEnable) {
+        userStudentService.clear(id);
+        String enable = queryEnable == null ? "" : queryEnable.toString();
+        String role = queryRole == null ? "" : String.valueOf(queryRole.getValue());
+        String source = querySource == null ? "" : String.valueOf(querySource.getValue());
+        return "redirect:/admin/user/list?pageNumber=" + pageNumber + "&source=" + source + "&role=" + role
+                + "&loginName=" + queryLoginName + "&name=" + queryName + "&enable=" + enable;
+    }
 }

+ 3 - 0
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/scoreVerifyPage.jsp

@@ -134,6 +134,9 @@
 			return false;
 		}
 		function resetData() {
+			if (!confirm('确定重置?')) {
+	            return;
+	        }
 			$("#searchForm").attr('target', "_self");
 			$("#searchForm").attr('action', '${ctx}/admin/exam/score/verify/reset');
 			$("#searchForm").submit();

+ 51 - 1
stmms-web/src/main/webapp/WEB-INF/views/modules/user/userEdit.jsp

@@ -37,12 +37,35 @@
                 }
                 if (role == '6') {
                     $('#exam-id-div').show();
+                    $('#student-div').show();
                 } else {
                     $('#exam-id-div').hide();
+                    $('#student-div').hide();
                 }
             });
             $('#role-select').trigger('change');
+            $("#studentFile").change(function(e) {
+                var selectedFile = e.target.files[0];
+            	$("#studentFileNameDiv").show();
+            	$("#studentFileName").html(selectedFile.name);
+              });
         });
+        function studentFileClear() {
+        	$("#studentFile").val('');
+        	$("#studentFileNameDiv").hide();
+        	$("#studentFileName").html('');
+        }
+        function studentFileSelect() {
+        	$("#studentFile").click();
+        }
+        function studentClear() {
+        	if (!confirm('确定清空?')) {
+	            return;
+	        }
+            $("#inputForm").attr("action", "${ctx}/admin/user/student/clear");
+            $("#inputForm").submit();
+        }
+        
     </script>
 </head>
 <body>
@@ -50,9 +73,11 @@
     <li><a href="${ctx}/admin/user/list">用户列表</a></li>
     <li class="active"><a href="##">用户编辑</a></li>
 </ul>
-<form:form id="inputForm" modelAttribute="user" action="${ctx}/admin/user/save" method="post" class="form-horizontal">
+<form:form id="inputForm" modelAttribute="user" action="${ctx}/admin/user/save" method="post" 
+enctype="multipart/form-data" class="form-horizontal">
     <form:hidden path="id"/>
     <tags:message content="${message}"/>
+    <input id="studentFile" name="studentFile" type="file" accept=".xls, .xlsx" style="display:none;"/>
     <input type="hidden"  name="pageNumber" value="${query.pageNumber }"/>
 	 <input type="hidden"  name="querSource" value="${query.source.value }"/>
 	 <input type="hidden"  name="queryRole" value="${query.role.value }"/>
@@ -135,6 +160,31 @@
             </div>
         </div>
      </c:if>
+     <c:if test="${user.role==null || user.role.value==6}">
+        <div class="control-group" id="student-div">
+            <label class="control-label">绑定考生</label>
+            <div class="controls">
+            <a href="javascript:" onclick="studentFileSelect()"  class="btn">选择文件</a>
+            &nbsp;
+            <c:if test="${studentCount!=0}">
+            <input onclick="studentClear()" class="btn" type="button" value="清空"/>
+            </c:if>
+            <c:if test="${studentCount==0}">
+            <input onclick="studentClear()" class="btn" type="button" disabled="disabled" value="清空"/>
+            </c:if>
+            &nbsp;
+            <a href="${ctx}/admin/user/student/template">下载模板</a>
+            &nbsp;
+            <c:if test="${user.role!=null && user.role.value==6}">
+            <span>绑定考生<span style="color: red;">${studentCount }</span>条</span>
+            </c:if>
+            </div>
+            <br/>
+            <div class="controls" id="studentFileNameDiv" hidden="true">
+            	<span id="studentFileName"></span>&nbsp;<span><a href="javascript:" onclick="studentFileClear()">删除</a></span>
+            </div>
+        </div>
+     </c:if>
     <div class="form-actions">
         <input id="btnSubmit" class="btn btn-primary" type="submit" value="保 存"/>
         &nbsp;

+ 13 - 0
stmms-web/src/main/webapp/sql/stmms_ft.sql

@@ -1160,6 +1160,19 @@ CREATE TABLE `eb_answer_card_subject`
 )  ENGINE = InnoDB
   DEFAULT CHARSET = utf8mb4 COMMENT ='卡格式科目关联关系';
   
+DROP TABLE IF EXISTS `eb_user_student`;
+CREATE TABLE `eb_user_student`
+(
+    `id`           int(11)     NOT NULL AUTO_INCREMENT COMMENT '主键',
+    `school_id`      int(11)     NOT NULL COMMENT '用户ID',
+    `user_id`      int(11)     NOT NULL COMMENT '用户ID',
+    `exam_number` 	varchar(64)	   NOT NULL COMMENT '考生ID',
+    PRIMARY KEY (`id`),
+    UNIQUE KEY `index1` (`user_id`, `exam_number`),
+    KEY `index2` (`school_id`, `exam_number`)
+) ENGINE = InnoDB
+  DEFAULT CHARSET = utf8mb4 COMMENT ='用户考生关联表';
+  
 DROP TABLE IF EXISTS `b_role_info`;
 CREATE TABLE `b_role_info`
 (

+ 15 - 1
stmms-web/src/main/webapp/sql/upgrade/1.3.14.sql

@@ -32,7 +32,7 @@ UPDATE eb_exam_subject o,
 SET o.selective = 1
 WHERE
 	o.exam_id = n.exam_id
-AND o. CODE = n. CODE
+AND o. CODE = n. CODE;
 
 -- 更新复核记录数据
 UPDATE eb_inspect_history
@@ -98,6 +98,20 @@ FROM
 	eb_answer_card b
 WHERE
 	b.subject_code is not  NULL;
+	
+	
+DROP TABLE IF EXISTS `eb_user_student`;
+CREATE TABLE `eb_user_student`
+(
+    `id`           int(11)     NOT NULL AUTO_INCREMENT COMMENT '主键',
+    `school_id`      int(11)     NOT NULL COMMENT '用户ID',
+    `user_id`      int(11)     NOT NULL COMMENT '用户ID',
+    `exam_number` 	varchar(64)	   NOT NULL COMMENT '考生ID',
+    PRIMARY KEY (`id`),
+    UNIQUE KEY `index1` (`user_id`, `exam_number`),
+    KEY `index2` (`school_id`, `exam_number`)
+) ENGINE = InnoDB
+  DEFAULT CHARSET = utf8mb4 COMMENT ='用户考生关联表';
 
 DROP TABLE IF EXISTS `b_privilege`;
 CREATE TABLE `b_privilege`