Commit 248d518edaaef5c140ce422a0ed5ab19a08c3771

Authored by yiming
1 parent e9060230

新增考题选择

src/main/java/com/bsth/controller/subject/SubjectController.java
... ... @@ -3,15 +3,51 @@ package com.bsth.controller.subject;
3 3 import com.bsth.controller.BaseController;
4 4 import com.bsth.entity.subject.Subject;
5 5 import com.bsth.service.subject.SubjectService;
  6 +import com.bsth.service.subject.SubjectUserService;
  7 +import org.slf4j.Logger;
  8 +import org.slf4j.LoggerFactory;
6 9 import org.springframework.beans.factory.annotation.Autowired;
7 10 import org.springframework.web.bind.annotation.RequestMapping;
  11 +import org.springframework.web.bind.annotation.RequestParam;
8 12 import org.springframework.web.bind.annotation.RestController;
9 13  
  14 +import java.util.HashMap;
  15 +import java.util.List;
  16 +import java.util.Map;
  17 +
10 18 @RestController
11 19 @RequestMapping("subject")
12 20 public class SubjectController extends BaseController<Subject, Integer> {
13 21  
  22 + private static final Logger LOGGER = LoggerFactory.getLogger(SubjectController.class);
  23 +
14 24 @Autowired
15 25 SubjectService subjectService;
16 26  
  27 + @Autowired
  28 + SubjectUserService subjectUserService;
  29 +
  30 + @RequestMapping("/subjectList")
  31 + public List<Subject> subjectList(){
  32 + List<Subject> r=subjectService.subjectAll();
  33 + return r;
  34 + }
  35 +
  36 + @RequestMapping("/selectSubject")
  37 + public Map<String,String> selectSubject(@RequestParam() Map<String, Object> map){
  38 + Map<String,String> result=new HashMap<>();
  39 + try {
  40 + String[] arr=map.get("ids").toString().split(",");
  41 + subjectUserService.selectSubject(arr);
  42 + result.put("result","成功");
  43 + return result;
  44 + } catch (Exception e) {
  45 + LOGGER.error("",e);
  46 + // TODO: handle exception
  47 + result.put("result","失败");
  48 + return result;
  49 + }
  50 + }
  51 +
  52 +
17 53 }
... ...
src/main/java/com/bsth/entity/subject/Subject.java
... ... @@ -22,6 +22,14 @@ public class Subject {
22 22 //应对答案
23 23 private String answer;
24 24  
  25 + public Integer getId() {
  26 + return id;
  27 + }
  28 +
  29 + public void setId(Integer id) {
  30 + this.id = id;
  31 + }
  32 +
25 33 public String getSubjectText() {
26 34 return subjectText;
27 35 }
... ...
src/main/java/com/bsth/entity/subject/SubjectUser.java
... ... @@ -21,6 +21,10 @@ public class SubjectUser {
21 21 @ManyToOne
22 22 private Subject subjectId;
23 23  
  24 + //用户Id
  25 + private Integer createBy;
  26 +
  27 +
24 28 public Integer getId() {
25 29 return id;
26 30 }
... ... @@ -61,5 +65,11 @@ public class SubjectUser {
61 65 this.result = result;
62 66 }
63 67  
64   -
  68 + public Integer getCreateBy() {
  69 + return createBy;
  70 + }
  71 +
  72 + public void setCreateBy(Integer createBy) {
  73 + this.createBy = createBy;
  74 + }
65 75 }
... ...
src/main/java/com/bsth/repository/subject/SubjectRepository.java
... ... @@ -2,7 +2,13 @@ package com.bsth.repository.subject;
2 2  
3 3 import com.bsth.entity.subject.Subject;
4 4 import com.bsth.repository.BaseRepository;
  5 +import org.springframework.data.jpa.repository.Query;
  6 +
  7 +import java.util.List;
5 8  
6 9 public interface SubjectRepository extends BaseRepository<Subject, Integer> {
  10 +
  11 + @Query(value = "SELECT s FROM Subject s ")
  12 + List<Subject> subjectAll();
7 13  
8 14 }
... ...
src/main/java/com/bsth/repository/subject/SubjectUserRepository.java
... ... @@ -29,4 +29,7 @@ public interface SubjectUserRepository extends BaseRepository&lt;SubjectUser, Integ
29 29 + " order by su.user_id",nativeQuery=true)
30 30 List<Object[]> searchSubjectUserDetail(String rq, String userId);
31 31  
  32 + @Modifying
  33 + @Query(value = "delete from SubjectUser s where s.rq=?1 and s.userId in ( ?2 )")
  34 + void deleteSubjectUserByUserIds(String date, List<Integer> userIds);
32 35 }
... ...
src/main/java/com/bsth/service/subject/SubjectService.java
... ... @@ -3,5 +3,9 @@ package com.bsth.service.subject;
3 3 import com.bsth.entity.subject.Subject;
4 4 import com.bsth.service.BaseService;
5 5  
  6 +import java.util.List;
  7 +
6 8 public interface SubjectService extends BaseService<Subject, Integer> {
  9 +
  10 + List<Subject> subjectAll();
7 11 }
... ...
src/main/java/com/bsth/service/subject/SubjectUserService.java
... ... @@ -16,4 +16,6 @@ public interface SubjectUserService extends BaseService&lt;SubjectUser, Integer&gt; {
16 16 List<Map<String,Object>> subjectUserList(Map<String, Object> map);
17 17  
18 18 List<Map<String,Object>> subjectUserDetail(Map<String, Object> map);
  19 +
  20 + void selectSubject(String[] arr) throws Exception;
19 21 }
... ...
src/main/java/com/bsth/service/subject/impl/SubjectServiceImpl.java
1 1 package com.bsth.service.subject.impl;
2 2  
3 3 import com.bsth.entity.subject.Subject;
  4 +import com.bsth.repository.subject.SubjectRepository;
4 5 import com.bsth.service.impl.BaseServiceImpl;
5 6 import com.bsth.service.subject.SubjectService;
  7 +import org.springframework.beans.factory.annotation.Autowired;
6 8 import org.springframework.stereotype.Service;
7 9  
  10 +import java.util.List;
  11 +
8 12 @Service
9 13 public class SubjectServiceImpl extends BaseServiceImpl<Subject, Integer> implements SubjectService {
  14 +
  15 + @Autowired
  16 + SubjectRepository subjectRepository;
  17 +
  18 + @Override
  19 + public List<Subject> subjectAll() {
  20 + return subjectRepository.subjectAll();
  21 + }
  22 +
10 23 }
... ...
src/main/java/com/bsth/service/subject/impl/SubjectUserServiceImpl.java
... ... @@ -3,6 +3,7 @@ package com.bsth.service.subject.impl;
3 3 import com.bsth.data.schedule.DayOfSchedule;
4 4 import com.bsth.entity.Line;
5 5 import com.bsth.entity.realcontrol.ScheduleRealInfo;
  6 +import com.bsth.entity.subject.Subject;
6 7 import com.bsth.entity.subject.SubjectUser;
7 8 import com.bsth.entity.sys.SysUser;
8 9 import com.bsth.repository.LineRepository;
... ... @@ -16,8 +17,11 @@ import org.slf4j.Logger;
16 17 import org.slf4j.LoggerFactory;
17 18 import org.springframework.beans.factory.annotation.Autowired;
18 19 import org.springframework.stereotype.Service;
  20 +import org.springframework.transaction.annotation.Transactional;
19 21  
20 22 import java.text.SimpleDateFormat;
  23 +import java.time.LocalDate;
  24 +import java.time.format.DateTimeFormatter;
21 25 import java.util.*;
22 26 import java.util.stream.Collectors;
23 27  
... ... @@ -186,6 +190,31 @@ public class SubjectUserServiceImpl extends BaseServiceImpl&lt;SubjectUser, Integer
186 190 }
187 191 return results;
188 192 }
189   -
190   -
  193 +
  194 + @Override
  195 + @Transactional
  196 + public void selectSubject(String[] arr) throws Exception{
  197 + SysUser loginUser = SecurityUtils.getCurrentUser();
  198 + List<SysUser> userList= sysUserRepository.findByParentID(String.valueOf(loginUser.getId()));
  199 + DateTimeFormatter dateTimeFormatter=DateTimeFormatter.ofPattern("yyyy-MM-dd");
  200 + LocalDate localDate=LocalDate.now();
  201 + String rq=localDate.format(dateTimeFormatter);
  202 + List<Integer> userIds=new ArrayList<>();
  203 + for (SysUser user : userList) {
  204 + userIds.add(user.getId());
  205 + }
  206 + subjectUserRepository.deleteSubjectUserByUserIds(rq,userIds);
  207 + for (SysUser user : userList) {
  208 + for (String s : arr) {
  209 + SubjectUser subjectUser=new SubjectUser();
  210 + subjectUser.setUserId(user.getId());
  211 + subjectUser.setRq(rq);
  212 + subjectUser.setCreateBy(loginUser.getId());
  213 + Subject subject=new Subject();
  214 + subject.setId(Integer.parseInt(s));
  215 + subjectUser.setSubjectId(subject);
  216 + subjectUserRepository.save(subjectUser);
  217 + }
  218 + }
  219 + }
191 220 }
... ...
src/main/resources/static/assets/css/MSFmultiSelect.css 0 → 100644
  1 +.msf_multiselect_container .msf_multiselect {
  2 + border: 1px solid #e4e4e4;
  3 + list-style-type:none;
  4 + margin: 0;
  5 + padding: 0;
  6 + position: absolute;
  7 + z-index: 240;
  8 +}
  9 +.msf_multiselect li:hover, .sb_multiselect li:active, .sb_multiselect li:focus{
  10 + background-color: #e5e5e5;
  11 +}
  12 +.msf_multiselect li.active{
  13 + background-color: #e5e5e5;
  14 +}
  15 +.msf_multiselect li{
  16 + padding-left: 4px;
  17 + background-color: #ffffff;
  18 + cursor: pointer;
  19 +}
  20 +.msf_multiselect_container textarea{
  21 + resize: none;
  22 + padding-left: 2px;
  23 + padding-top: 2px;
  24 + overflow: auto;
  25 +}
  26 +.msf_multiselect_container .msf_multiselect{
  27 + height: 200px;
  28 + overflow: auto;
  29 + background-color: white;
  30 + display: grid;
  31 + text-align: left;
  32 +}
  33 +.msf_multiselect label{
  34 + display: block;
  35 + margin-bottom: 1px;
  36 +}
... ...
src/main/resources/static/assets/js/MSFmultiSelect.js 0 → 100644
  1 +/* MSFmultiSelect v1.00
  2 + * Developed by Jagadeesan S
  3 + * jagadeesanjd11@gamil.coms
  4 + * https://minisuperfiles.blogspot.com
  5 + */
  6 +class MSFmultiSelect{
  7 + constructor(select, settings={}) {
  8 + this.select = select;
  9 + this.settings = settings;
  10 + this.defultSettings={
  11 + width:350,
  12 + height:30,
  13 + appendTo:'body',
  14 + className:''
  15 + }
  16 + this.select.multiple=true;
  17 + this.select.style.display='none';
  18 + this.create();
  19 + }
  20 + create(){
  21 + var div=document.createElement('DIV');
  22 + div.className='msf_multiselect_container';
  23 + this.id='msf_multiselect_'+(document.querySelectorAll('.msf_multiselect_container').length+1);
  24 + div.id=this.id;
  25 + var ul=document.createElement('UL');
  26 + ul.className='msf_multiselect';
  27 + var textarea=document.createElement('textarea'); textarea.readOnly=true;
  28 + textarea.style.height=(this.settings.height) ? this.settings.height+'px' : this.defultSettings.height+'px';
  29 + textarea.style.width=(this.settings.width) ? this.settings.width+'px' : this.defultSettings.width+'px';
  30 + textarea.className=(this.settings.className) ? this.settings.className : this.defultSettings.className;
  31 + var self=this,display="";
  32 + if(this.settings.selectAll){
  33 + var label=document.createElement('label');
  34 + var li=document.createElement('LI');
  35 + var input=document.createElement('input');
  36 + input.type='checkbox';
  37 + input.disabled=(this.settings.readOnly) ? true: false;
  38 + input.addEventListener('click',function(){
  39 + this.parentElement.className=(this.checked) ? 'active' : '';
  40 + self.selectAll(this.checked);
  41 + });
  42 + var caption=document.createTextNode('<Select all>');
  43 + li.appendChild(input);
  44 + li.appendChild(caption);
  45 + label.appendChild(li);
  46 + ul.appendChild(label);
  47 + }
  48 + for(var i=0,len=this.select.children.length; i<len; i++){
  49 + var label=document.createElement('label');
  50 + var li=document.createElement('LI');
  51 + var input=document.createElement('input');
  52 + input.type='checkbox';
  53 + input.disabled=(this.settings.readOnly) ? true: false;
  54 + input.value=this.select.children[i].value;
  55 + var caption=document.createTextNode(this.select.children[i].innerText);
  56 + input.addEventListener('click',function(){
  57 + if(this.checked){
  58 + self.setValue([this.value]);
  59 + }else{
  60 + self.removeValue([this.value]);
  61 + }
  62 + if(typeof self.settings.onChange=='function'){
  63 + self.settings.onChange(this.checked,this.value,self);
  64 + }
  65 + });
  66 + li.appendChild(input);
  67 + li.appendChild(caption);
  68 + if(this.select.children[i].selected){
  69 + li.className='active';
  70 + input.checked=true;
  71 + display+=(display) ? ", "+this.select.children[i].innerText : this.select.children[i].innerText;
  72 + }else{
  73 + li.className='';
  74 + input.checked=false;
  75 + }
  76 + label.appendChild(li);
  77 + ul.appendChild(label);
  78 + }
  79 + textarea.value=display;
  80 + this.logger=textarea;
  81 + div.appendChild(textarea);
  82 + var addTarget;
  83 + if(this.settings.appendTo){
  84 + addTarget=document.querySelector(this.settings.appendTo);
  85 + }else{
  86 + addTarget=document.querySelector(this.defultSettings.appendTo);
  87 + }
  88 + //set width
  89 + ul.style.width=(this.settings.width) ? this.settings.width+2+'px' : this.defultSettings.width+2+'px';
  90 + ul.style.display='none';
  91 + div.appendChild(ul);
  92 + this.list=ul;
  93 + this.container=div;
  94 + addTarget.appendChild(div);
  95 + // add event
  96 + document.addEventListener('click',function(event){
  97 + var isClickInside=self.container.contains(event.target);
  98 + if(!isClickInside){
  99 + self.list.style.display='none';
  100 + }
  101 + });
  102 + this.logger.addEventListener('click',function(){
  103 + if(self.list.style.display=='none'){
  104 + self.list.style.display='';
  105 + }else{
  106 + self.list.style.display='none';
  107 + }
  108 + });
  109 + }
  110 + setValue(selected=[]){
  111 + if(selected.length){
  112 + for(var i=0; i<this.select.children.length; i++){
  113 + for(var j=0; j<selected.length; j++){
  114 + if(this.select.children[i].value==selected[j]){
  115 + this.select.children[i].selected=true;
  116 + var sync=(this.settings.selectAll) ? (i+1) : i;
  117 + this.list.children[sync].children[0].children[0].checked=true;
  118 + this.list.children[sync].children[0].className='active'; //need to change;
  119 + break;
  120 + }
  121 + }
  122 + }
  123 + this.log();
  124 + }
  125 + }
  126 + removeValue(selected=[]){
  127 + if(selected.length){
  128 + for(var i=0; i<this.select.children.length; i++){
  129 + for(var j=0; j<selected.length; j++){
  130 + if(this.select.children[i].value==selected[j]){
  131 + this.select.children[i].selected=false;
  132 + var sync=(this.settings.selectAll) ? (i+1) : i;
  133 + this.list.children[sync].children[0].children[0].checked=false;
  134 + this.list.children[sync].children[0].className=''; //need to change;
  135 + break;
  136 + }
  137 + }
  138 + }
  139 + this.log();
  140 + }
  141 + }
  142 + log(){
  143 + var display="";
  144 + for(var i=0; i<this.select.children.length; i++){
  145 + if(this.select.children[i].selected){
  146 + display+=(display) ? ", "+this.select.children[i].innerText : this.select.children[i].innerText;
  147 + }
  148 + }
  149 + this.logger.value=display;
  150 + }
  151 + getData(){
  152 + var data=[];
  153 + for(var i=0; i<this.select.children.length; i++){
  154 + if(this.select.children[i].selected){
  155 + data.push(this.select.children[i].value);
  156 + }
  157 + }
  158 + return data;
  159 + }
  160 + selectAll(is=false){
  161 + var data=[];
  162 + for(var i=0; i<this.select.children.length; i++){
  163 + data.push(this.select.children[i].value);
  164 + }
  165 + if(is){
  166 + this.setValue(data);
  167 + }else{
  168 + this.removeValue(data);
  169 + }
  170 + }
  171 + loadSource(data=[]){
  172 + if(data.length!=0){
  173 + this.select.innerHTML='';
  174 + for(var i=0; i<data.length; i++){
  175 + var option=document.createElement('OPTION');
  176 + option.value=data[i].value;
  177 + option.innerHTML=data[i].caption;
  178 + option.selected=data[i].selected;
  179 + this.select.appendChild(option);
  180 + }
  181 + this.reload();
  182 + }
  183 + }
  184 + getSource(){
  185 + var data=[];
  186 + for(var i=0; i<this.select.children.length; i++){
  187 + data.push({value:this.select.children[i].value,caption:this.select.children[i].innerText,selected:this.select.children[i].selected});
  188 + }
  189 + return data;
  190 + }
  191 + reload(){
  192 + this.container.remove();
  193 + this.create();
  194 + }
  195 +}
  196 +
... ...
src/main/resources/static/index.html
... ... @@ -85,7 +85,8 @@
85 85 <link
86 86 href="/metronic_v4.5.4/plugins/tipso/css/tipso.css"
87 87 rel="stylesheet" type="text/css" />
88   -
  88 + <link href="/assets/css/MSFmultiSelect.css" rel="stylesheet" type="text/css" />
  89 + <script src="/assets/js/MSFmultiSelect.js"></script>
89 90 <style type="text/css">
90 91 .searchForm {
91 92  
... ...
src/main/resources/static/pages/subjectUser/selectSubject.html 0 → 100644
  1 +<style type="text/css">
  2 + .table-bordered {
  3 + border: 1px solid; }
  4 + .table-bordered > thead > tr > th,
  5 + .table-bordered > thead > tr > td,
  6 + .table-bordered > tbody > tr > th,
  7 + .table-bordered > tbody > tr > td,
  8 + .table-bordered > tfoot > tr > th,
  9 + .table-bordered > tfoot > tr > td {
  10 + border: 1px solid; }
  11 + .table-bordered > thead > tr > th,
  12 + .table-bordered > thead > tr > td {
  13 + border-bottom-width: 2px; }
  14 +
  15 + .table > tbody + tbody {
  16 + border-top: 1px solid; }
  17 +</style>
  18 +<div class="page-head">
  19 + <div class="page-title">
  20 + <h1>考题选择</h1>
  21 + </div>
  22 +</div>
  23 +<body>
  24 +
  25 +</body>
  26 +<div class="row">
  27 + <div class="col-md-12">
  28 + <div class="portlet light porttlet-fit bordered">
  29 + <div class="portlet-title">
  30 + <form class="form-inline" action="">
  31 + <div style="display: inline-block;">
  32 + <span class="item-label" style="width: 80px;margin-left: 6px;">选题: </span>
  33 + <div id="myselect">
  34 + <select id="multiselect" style="width: 350px;" class="form-control" name="countries[]" multiple="multiple">
  35 + </select>
  36 + </div>
  37 + </div>
  38 + <div class="form-group">
  39 + <input class="btn btn-default" type="button" onclick="selectSubject()" value="提交" style="margin-left: 2px;margin-top: -24px;"/>
  40 + </div>
  41 + </form>
  42 + </div>
  43 + <div class="portlet-body">
  44 + <div class="table-container" style="margin-top: 10px;overflow:auto;min-width: 906px">
  45 + <form role="form">
  46 + <div class="form-group">
  47 + <span class="item-label" style="width: 80px;margin-left: 6px;">题目: </span>
  48 + <textarea class="form-control" rows="12" id="subjectText"></textarea>
  49 + </div>
  50 + </form>
  51 + <form role="form">
  52 + <div class="form-group">
  53 + <span class="item-label" style="width: 80px;margin-left: 6px;">操作: </span>
  54 + <textarea class="form-control" rows="12" id="operateTest"></textarea>
  55 + </div>
  56 + </form>
  57 + </div>
  58 + </div>
  59 + </div>
  60 + </div>
  61 +</div>
  62 +<script>
  63 + var select=new MSFmultiSelect(
  64 + document.querySelector('#multiselect'),
  65 + {
  66 + onChange:function(checked,value,instance){
  67 + var subjectTextStr='';
  68 + var operateTestStr='';
  69 + var arr=select.getData();
  70 + for (let i of arr) {
  71 + let index=1;
  72 + for (let s of subjectList) {
  73 + if(s.id==i){
  74 + subjectTextStr+='题'+index+':'+s.subjectText+'\n';
  75 + operateTestStr+='题'+index+':'+s.operateTest+'\n';
  76 + }
  77 + index++;
  78 + }
  79 + }
  80 + $("#subjectText").val(subjectTextStr);
  81 + $("#operateTest").val(operateTestStr);
  82 + },
  83 + appendTo:'#myselect',
  84 + }
  85 + );
  86 + var subjectList;
  87 + $(function(){
  88 + $get('/subject/subjectList',{type:'query'},function(result){
  89 + subjectList=result;
  90 + var datas=[];
  91 + let i=1;
  92 + for (let r of result) {
  93 + var d=new Object();
  94 + d.value=r.id;
  95 + d.caption="题"+i;
  96 + datas[i-1]=d;
  97 + i++;
  98 + }
  99 + select.loadSource(datas);
  100 + });
  101 + });
  102 + function selectSubject(){
  103 + var arr=select.getData();
  104 + if(arr.length!=10){
  105 + layer.alert("请选择10道题");
  106 + return;
  107 + }
  108 + layer.confirm('提交后会覆盖当天选题是否确认', {
  109 + btn: ['确认', '取消'],isOutAnim: false,//可以无限个按钮
  110 + }, function(index, layero){
  111 + layer.close(index)
  112 + var ids='';
  113 + for (let id of arr) {
  114 + ids+=id+',';
  115 + }
  116 + $get('/subject/selectSubject',{ids:ids},function(result){
  117 + layer.alert(result.result);
  118 + });
  119 + });
  120 + }
  121 +</script>
  122 +
  123 +
  124 +
  125 +
  126 +
... ...