Просмотр исходного кода

Merge branch 'dev' of ssh://10.10.100.21/source/smartschool-platform into dev

guq 6 лет назад
Родитель
Сommit
7b6283e660
30 измененных файлов с 584 добавлено и 111 удалено
  1. 15 10
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/basic/service/impl/CurriculumServiceImpl.java
  2. 9 1
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/basic/service/impl/TeacherServiceImpl.java
  3. 10 1
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/business/service/impl/HomeWorkServiceImpl.java
  4. 10 0
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/business/service/impl/NoticeServiceImpl.java
  5. 3 2
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/common/service/impl/ExcelServiceImpl.java
  6. 3 0
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/exception/BizExceptionCode.java
  7. 2 0
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/mapper/CurriculumMapper.java
  8. 6 1
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/mapper/HomeWorkMapper.java
  9. 2 0
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/mapper/NoticeMapper.java
  10. 4 0
      applications/school/school-server/src/main/resources/mapper/CurriculumMapper.xml
  11. 12 0
      applications/school/school-server/src/main/resources/mapper/HomeWorkMapper.xml
  12. 5 0
      applications/school/school-server/src/main/resources/mapper/MessagelogMapper.xml
  13. 4 0
      applications/school/school-server/src/main/resources/mapper/NotifyMapper.xml
  14. 1 1
      applications/school/school-server/src/main/resources/mapper/SysStudentMapper.xml
  15. 2 1
      frontend/pc-web/app/Application.js
  16. 47 0
      frontend/pc-web/app/store/GradeClass.js
  17. 7 0
      frontend/pc-web/app/view/Interaction/homework/Release.js
  18. 31 0
      frontend/pc-web/app/view/Interaction/score/Detail.js
  19. 23 0
      frontend/pc-web/app/view/Interaction/score/DetailController.js
  20. 4 4
      frontend/pc-web/app/view/Interaction/score/List.js
  21. 10 4
      frontend/pc-web/app/view/basic/class/ClassInfo.js
  22. 9 3
      frontend/pc-web/app/view/basic/class/ClassInfoController.js
  23. 1 2
      frontend/pc-web/app/view/basic/class/ListCard.js
  24. 0 9
      frontend/pc-web/app/view/basic/class/ListCardController.js
  25. 1 0
      frontend/pc-web/app/view/basic/subject/List.js
  26. 25 29
      frontend/pc-web/app/view/basic/subject/ListController.js
  27. 90 0
      frontend/pc-web/app/view/setting/device/List.js
  28. 246 0
      frontend/pc-web/app/view/setting/device/ListController.js
  29. 0 41
      frontend/pc-web/app/view/viewport/ViewportModel.js
  30. 2 2
      frontend/pc-web/resources/json/navigation.json

+ 15 - 10
applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/basic/service/impl/CurriculumServiceImpl.java

@@ -112,18 +112,21 @@ public class CurriculumServiceImpl implements CurriculumService {
     private void convertToId(CurriculumDetailDTO curriculumDetailDTO, SubjectDO subjectDO) {
         if (curriculumDetailDTO.getMon().equals(subjectDO.getSubjectName())){
             curriculumDetailDTO.setMon(subjectDO.getSubjectId().toString());
-        }else if (curriculumDetailDTO.getTues().equals(subjectDO.getSubjectName())){
+        }
+        if (curriculumDetailDTO.getTues().equals(subjectDO.getSubjectName())){
             curriculumDetailDTO.setTues(subjectDO.getSubjectId().toString());
-        }else if (curriculumDetailDTO.getThur().equals(subjectDO.getSubjectName())){
+        }
+        if (curriculumDetailDTO.getThur().equals(subjectDO.getSubjectName())){
             curriculumDetailDTO.setThur(subjectDO.getSubjectId().toString());
-        }else if (curriculumDetailDTO.getWed().equals(subjectDO.getSubjectName())){
+        }
+        if (curriculumDetailDTO.getWed().equals(subjectDO.getSubjectName())){
             curriculumDetailDTO.setWed(subjectDO.getSubjectId().toString());
-        }else if (curriculumDetailDTO.getFri().equals(subjectDO.getSubjectName())){
+        }
+        if (curriculumDetailDTO.getFri().equals(subjectDO.getSubjectName())){
             curriculumDetailDTO.setFri(subjectDO.getSubjectId().toString());
-        }else if (curriculumDetailDTO.getSat().equals(subjectDO.getSubjectName())){
+        }
+        if (curriculumDetailDTO.getSat().equals(subjectDO.getSubjectName())){
             curriculumDetailDTO.setSat(subjectDO.getSubjectId().toString());
-        }else {
-            throw new BizException(BizExceptionCode.NOT_EXISTS_SUBJECT.getCode(), String.format(BizExceptionCode.NOT_EXISTS_SUBJECT.getMessage(), subjectDO.getSubjectName()));
         }
     }
 
@@ -142,6 +145,7 @@ public class CurriculumServiceImpl implements CurriculumService {
             main.setCreateTime(new Date());
             main.setSchoolId(BaseContextHolder.getSchoolId());
             main.setCreatorName(BaseContextHolder.getUserName());
+            main.setStatus("0");
             //保存主表
             curriculumMapper.insertSelective(main);
             Long mId = main.getId();
@@ -153,6 +157,7 @@ public class CurriculumServiceImpl implements CurriculumService {
                     curriculumDetailDTO.setSchoolId(schoolId);
                     curriculumDetailDTO.setClazzId(Long.parseLong(main.getClazzId()));
                     curriculumDetailDTO.setStatus(Integer.parseInt(main.getStatus()));
+                    curriculumDetailDTO.setStatus(0);
                 });
                 curriculumMapper.insertDetailSelective(items);
                 messageLogService.save(new DocBaseDTO(mId, CODE, NAME));
@@ -187,6 +192,9 @@ public class CurriculumServiceImpl implements CurriculumService {
     @Override
     @Transactional
     public void delete(Long id) {
+        if(curriculumMapper.courseStatus(id)>0){
+            throw new BizException(BizExceptionCode.COURSE_RELEASE_STATUS);
+        }
         curriculumMapper.deleteDetailByMainId(id);
         curriculumMapper.delete(id);
         messageLogService.delete(new DocBaseDTO(id, CODE, NAME));
@@ -199,7 +207,6 @@ public class CurriculumServiceImpl implements CurriculumService {
     }
 
     @Override
-    @Transactional
     public void saveToFormal(Integer id, boolean update){
         if (null == id || "0".equals(id)) {
             return;
@@ -241,12 +248,10 @@ public class CurriculumServiceImpl implements CurriculumService {
                         //1. 替换课程名称为ID
                         List<SubjectDO> subjectDOList = curriculumMapper.selectSubject(schoolId);
                         Iterator<CurriculumDetailDTO> detailIterator = curriculumDetailDTOList.iterator();
-                        int detno = 1;
                         while (detailIterator.hasNext()){
                             CurriculumDetailDTO curriculumDetailDTO = detailIterator.next();
                             curriculumDetailDTO.setmId(mainId);
                             curriculumDetailDTO.setStatus(1);
-                            curriculumDetailDTO.setLessons(detno++);
                             curriculumDetailDTO.setSchoolId(schoolId);
                             curriculumDetailDTO.setClazzId(clazzId);
                             subjectDOList.forEach(subjectDO -> { convertToId(curriculumDetailDTO, subjectDO); });

+ 9 - 1
applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/basic/service/impl/TeacherServiceImpl.java

@@ -138,6 +138,12 @@ public class TeacherServiceImpl implements TeacherService{
                         }else if ("女".equals(json.get("teacher_sex"))) {
                             json.put("teacher_sex", 2);
                         };
+
+                        if ("已婚".equals(json.get("teacher_marriage"))) {
+                            json.put("teacher_marriage", 0);
+                        }else if ("否".equals(json.get("teacher_marriage"))) {
+                            json.put("teacher_marriage", 1);
+                        };
                     }
                     teacher = JSONObject.parseObject(json.toJSONString(), SysTeacher.class);
                     teacher.setSchool_id(schoolId);
@@ -174,6 +180,7 @@ public class TeacherServiceImpl implements TeacherService{
     }
 
     @Override
+    @Transactional
     public void batchDelete(BatchDealBaseDTO baseDTOs) {
         if (null == baseDTOs || null == baseDTOs.getBaseDTOs() ||
                 baseDTOs.getBaseDTOs().size() == 0) {
@@ -185,8 +192,9 @@ public class TeacherServiceImpl implements TeacherService{
                 delete(base.getId());
             }catch (Exception e){
                 sb.append(sysTeacherMapper.selectByPrimaryKey(base.getId()).getTeacher_name() + "|");
+                throw new BizException(BizExceptionCode.TEACHERS_EXISTS_CLASS.getCode(), String.format(BizExceptionCode.TEACHERS_EXISTS_CLASS.getMessage(), sb.substring(0, sb.length() - 1)));
             }
         }
-        throw new BizException(BizExceptionCode.TEACHERS_EXISTS_CLASS.getCode(), String.format(BizExceptionCode.TEACHERS_EXISTS_CLASS.getMessage(), sb.substring(0, sb.length() - 1)));
+
     }
 }

+ 10 - 1
applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/business/service/impl/HomeWorkServiceImpl.java

@@ -22,8 +22,8 @@ import org.springframework.stereotype.Service;
 import org.springframework.util.ObjectUtils;
 import org.springframework.util.StringUtils;
 
+import java.util.Calendar;
 import java.util.List;
-import java.util.StringJoiner;
 
 /**
  * @author: guq
@@ -54,10 +54,16 @@ public class HomeWorkServiceImpl implements HomeWorkService{
             //增加推送人(学生)信息
             String studentIds = getNotifer(formdata.getGrade_name(), formdata.getClassz_name(), school_id);
             formdata.setTask_notifier(studentIds);
+            //获取时间
+            Calendar calendar= Calendar.getInstance();
+            formdata.setCreate_date(calendar.getTime());
             homeWorkMapper.insertSelective(formdata);
         } else {
             //更新
             homeWorkMapper.updateByPrimaryKeySelective(formdata);
+            if(formdata.getTask_status()==1){
+                publish(formdata.getTask_id());
+            }
         }
         return new DocBaseDTO(formdata.getTask_id());
     }
@@ -81,6 +87,9 @@ public class HomeWorkServiceImpl implements HomeWorkService{
         if (StringUtils.isEmpty(id) || "0".equals(id)) {
             return;
         }
+        if(homeWorkMapper.taskStatus("1",id)>0){
+            throw new BizException(BizExceptionCode.TASK_RELEASE_STATUS);
+        }
         homeWorkMapper.deleteByPrimaryKey(id);
     }
 

+ 10 - 0
applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/business/service/impl/NoticeServiceImpl.java

@@ -16,6 +16,7 @@ import com.usoftchina.smartschool.utils.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.Calendar;
 import java.util.List;
 
 /**
@@ -38,11 +39,17 @@ public class NoticeServiceImpl implements NoticeService{
         //新增
         if (StringUtils.isEmpty(formdata.getNotify_id()) || "0".equals(formdata.getNotify_id().toString())) {
             formdata.setNotify_status(2);
+            //获取时间
+            Calendar calendar= Calendar.getInstance();
+            formdata.setCreate_date(calendar.getTime());
             noticeMapper.insertSelective(formdata);
 
         } else {
             //更新
             noticeMapper.updateByPrimaryKeySelective(formdata);
+            if(formdata.getNotify_status()==1){
+                publish(formdata.getNotify_id());
+            }
         }
         return new DocBaseDTO(formdata.getNotify_id());
     }
@@ -75,6 +82,9 @@ public class NoticeServiceImpl implements NoticeService{
         if (StringUtils.isEmpty(id) || "0".equals(id)) {
             return;
         }
+        if(noticeMapper.noticeStatus(id)>0){
+            throw new BizException(BizExceptionCode.NOTICE_RELEASE_STATUS);
+        }
         noticeMapper.deleteByPrimaryKey(id);
     }
 

+ 3 - 2
applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/common/service/impl/ExcelServiceImpl.java

@@ -26,6 +26,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.StringUtils;
 
+import java.math.BigDecimal;
 import java.util.*;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -366,10 +367,10 @@ public class ExcelServiceImpl implements ExcelService {
                 case Cell.CELL_TYPE_NUMERIC:{
                     //POI在解析时,会将日期格式也解析为NUMERIC(数字类型);可查看API中CellType.java
                     if (!HSSFDateUtil.isCellDateFormatted(cell)) {
-                        cellValue = String.valueOf(cell.getNumericCellValue());
+                        cellValue = String.valueOf(new BigDecimal(cell.getNumericCellValue()));
                         cellValue = RegexpUtils.replaceSpecialCharacterNotcodefield(cellValue);
                         //判断是否为INT类型
-                        if (Double.valueOf(cellValue.toString()).intValue() - Double.valueOf(cellValue.toString()) == 0) {
+                        if (Double.valueOf(cellValue.toString()).intValue() - Double.valueOf(cellValue.toString()) == 0 && cellValue.toString().indexOf(".") > -1) {
                             return cellValue.toString().substring(0, cellValue.toString().indexOf("."));
                         }
                     }else {

+ 3 - 0
applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/exception/BizExceptionCode.java

@@ -28,6 +28,9 @@ public enum BizExceptionCode implements BaseExceptionCode {
     REPEAT_CLASS_NAME(600002, "班级名称重复"),
     REPEAT_STUDENT_NUMBER(600003, "学生学号不可重复"),
     EFFECTIVE_CLASS_DATA(600004, "无法删除有学生的班级"),
+    TASK_RELEASE_STATUS(600005, "作业已发布无法更改"),
+    COURSE_RELEASE_STATUS(600006, "课程表已生效,无法删除"),
+    NOTICE_RELEASE_STATUS(600007, "学校发布已生效,无法删除"),
     NOT_EXISTS_SUBJECT(60005, "科目<u>%s</u>不存在");
 
 

+ 2 - 0
applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/mapper/CurriculumMapper.java

@@ -82,4 +82,6 @@ public interface CurriculumMapper {
      * @param curriculumDetailDTOList
      */
     void updateDetailSelective(List<CurriculumDetailDTO> curriculumDetailDTOList);
+
+    int courseStatus(Long id);
 }

+ 6 - 1
applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/mapper/HomeWorkMapper.java

@@ -3,7 +3,6 @@ package com.usoftchina.smartschool.school.mapper;
 import com.usoftchina.smartschool.school.po.HomeWork;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
-import org.springframework.web.bind.annotation.GetMapping;
 
 import java.util.List;
 
@@ -27,4 +26,10 @@ public interface HomeWorkMapper {
     List<HomeWork> selectByConditon(@Param("con") String condition, @Param("school_id") Long schoolId);
 
     int updateByPublish(Long task_id);
+
+    /**
+     * 查询作业发布状态
+     * @return
+     */
+    int taskStatus(@Param("task_status") String task_status,@Param("task_id") Long task_id);
 }

+ 2 - 0
applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/mapper/NoticeMapper.java

@@ -26,4 +26,6 @@ public interface NoticeMapper {
     List<Notify> selectByConditon(@Param("con") String con, @Param("school_id") Long schoolId);
 
     int updateByPublish(Long notify_id);
+
+    int noticeStatus(Long id);
 }

+ 4 - 0
applications/school/school-server/src/main/resources/mapper/CurriculumMapper.xml

@@ -258,4 +258,8 @@
     </foreach>
   </update>
 
+  <select id="courseStatus" parameterType="long" resultType="int">
+    select count(1) from clazz_curriculum where mcur_status=1 and cur_id=#{id}
+  </select>
+
 </mapper>

+ 12 - 0
applications/school/school-server/src/main/resources/mapper/HomeWorkMapper.xml

@@ -246,4 +246,16 @@
       publish_date = now()
     where task_id = #{task_id,jdbcType=BIGINT}
   </update>
+
+    <select id="taskStatus" resultType="int">
+        select count(1) from task_notify
+        <where>
+            <if test="task_status != null">
+                task_status=#{task_status}
+            </if>
+            <if test="task_id != null">
+                and task_id=#{task_id}
+            </if>
+        </where>
+    </select>
 </mapper>

+ 5 - 0
applications/school/school-server/src/main/resources/mapper/MessagelogMapper.xml

@@ -145,4 +145,9 @@
     </where>
     order by ml_id DESC
   </select>
+
+  <delete id="deleteDetail" parameterType="java.lang.Integer" >
+    delete from messagelog
+    where ml_id = #{id,jdbcType=INTEGER}
+  </delete>
 </mapper>

+ 4 - 0
applications/school/school-server/src/main/resources/mapper/NotifyMapper.xml

@@ -221,4 +221,8 @@
       publish_date = now()
     where notify_id = #{notify_id,jdbcType=BIGINT}
   </update>
+
+    <select id="noticeStatus" parameterType="long" resultType="int">
+    select count(1) from notify where notify_status=1 and notify_id=#{id}
+  </select>
 </mapper>

+ 1 - 1
applications/school/school-server/src/main/resources/mapper/SysStudentMapper.xml

@@ -486,6 +486,6 @@
   </select>
 
   <select id="selectIdByClazzId" resultType="string" parameterType="long">
-    SELECT stu_id FROM student WHERE clazz_id = #{clazzId}
+    SELECT stu_id FROM sys_student WHERE clazz_id = #{clazzId}
   </select>
 </mapper>

+ 2 - 1
frontend/pc-web/app/Application.js

@@ -15,7 +15,8 @@ Ext.define('school.Application', {
         // TODO: add global / shared stores here
         'school.store.Grade',
         'school.store.Class',
-        'school.store.Subject'
+        'school.store.Subject',
+        'school.store.GradeClass'
     ],
 
     defaultToken: 'main',

+ 47 - 0
frontend/pc-web/app/store/GradeClass.js

@@ -0,0 +1,47 @@
+/**
+ * 年级组织
+ */
+Ext.define('school.store.GradeClass', {
+    extend: 'Ext.data.TreeStore',
+    alias: 'store.store_gradeclass',
+
+    storeId: 'store_gradeclass',
+
+    fields: [{
+        name: 'text'
+    }],
+    root: {
+        text: '全年级',
+        type: 'SCHOOL',
+        expanded: false
+    },
+    autoLoad: false,
+    proxy: {
+        type: 'ajax',
+        // url: 'http://10.1.80.47:9560/grade/read',
+        url: '/api/school/grade/read',
+        reader: {
+            transform: {
+                fn: function(data) {
+                    let grades = [];
+                    if(!!data.data) {
+                        grades = data.data.children || [];
+                        grades.map(function(s) {
+                            s._id = s.id;
+                            s.id = 'grade-' + s.id;
+                            let classes = s.children;
+                            let d = classes.map(function(c) {
+                                c._id = c.id;
+                                c.id = 'class-' + c.id;
+                                return c;
+                            });
+                            return s;
+                        });
+                    }
+                    return grades;
+                },
+                scope: this
+            }
+        }
+    }
+});

+ 7 - 0
frontend/pc-web/app/view/Interaction/homework/Release.js

@@ -129,6 +129,13 @@ Ext.define('school.view.interaction.homework.Release', {
                     disabled: '{!base.valid}'
                 }
             }],
+            applyBtns: [{
+                apply: true,
+                text: '删除',
+                bind: {
+                    hidden: '{!showDeleteBtn || !task_id || task_status == 1}'
+                },
+            }],
             toolBtns: [{
                 xtype: 'button',
                 text: '发布',

+ 31 - 0
frontend/pc-web/app/view/Interaction/score/Detail.js

@@ -44,6 +44,21 @@ Ext.define('school.view.interaction.score.Detail', {
                 xtype: 'classcombo',
                 name: 'si_class',
                 fieldLabel: '班级'
+            }, {
+                xtype: 'combobox',
+                name: 'si_publish',
+                fieldLabel: '发布状态',
+                displayField: 'name',
+                valueField: 'value',
+                editable: false,
+                readOnly: true,
+                defaultValue: 0,
+                store: Ext.create('Ext.data.ArrayStore', {
+                    fields: ['name', 'value'],
+                    data: [['未发布', 0], ['已发布', 1]]
+                }),
+                minChars: 0,
+                queryMode: 'local'
             }, {
                 name: "score",
                 xtype: "detailGridField",
@@ -71,6 +86,22 @@ Ext.define('school.view.interaction.score.Detail', {
                     dataIndex: 'sd_remark'
                 }]
             }],
+            applyBtns: [{
+                apply: true,
+                text: '删除',
+                bind: {
+                    hidden: '{!showDeleteBtn || !si_id || si_publish == 1}'
+                },
+            }],
+            toolBtns: [{
+                xtype: 'button',
+                text: '发布',
+                hidden: true,
+                bind: {
+                    hidden: '{!si_id || si_publish == 1}'
+                },
+                handler: 'onPublish'
+            }]
         });
         this.callParent();
         this.setEditable(false);

+ 23 - 0
frontend/pc-web/app/view/Interaction/score/DetailController.js

@@ -14,4 +14,27 @@ Ext.define('school.view.interaction.score.DetailController', {
             school.util.BaseUtil.refreshTabTitle(newId, newTitle);
         });
     },
+
+    onPublish: function() {
+        let me = this,
+        view = me.getView(),
+        viewModel = me.getViewModel(),
+        id = viewModel.data.si_id;
+        view.setLoading(true);
+        school.util.BaseUtil.request({
+            // url: 'http://10.1.80.180:9520/api/school/score/publish/' + id,
+            url: '/api/school/score/publish/' + id,
+            method: 'POST'
+        })
+        .then(function() {
+            view.setLoading(false);
+            school.util.BaseUtil.showSuccessToast('发布成功');
+            viewModel.set('si_publish', 1);
+            me.refresh();
+        })
+        .catch(function(e) {
+            view.setLoading(false);
+            school.util.BaseUtil.showErrorToast('发布失败: ' + e.message);
+        });
+    }
 });

+ 4 - 4
frontend/pc-web/app/view/Interaction/score/List.js

@@ -80,10 +80,10 @@ Ext.define('school.view.interaction.score.List', {
                 },
                 hiddenTools: false,
                 toolBtns: [{
-                    xtype: 'button',
-                    text: '新增',
-                    handler: 'onAddClick'
-                }, {
+                //     xtype: 'button',
+                //     text: '新增',
+                //     handler: 'onAddClick'
+                // }, {
                     xtype: 'importbutton',
                     text: '导入',
                     belong: me,

+ 10 - 4
frontend/pc-web/app/view/basic/class/ClassInfo.js

@@ -18,6 +18,7 @@ Ext.define('school.view.basic.class.ClassInfo', {
 
     initComponent: function() {
         let me = this;
+        let store = Ext.StoreMgr.get('store_gradeclass');
         Ext.apply(me, {
             items: [{
                 region: 'west',
@@ -28,8 +29,8 @@ Ext.define('school.view.basic.class.ClassInfo', {
                 width: 250,
                 xtype: 'treepanel',
                 reference: 'treelist',
+                store: store,
                 bind: {
-                    store: '{store_gradeclass}',
                     width: '{treeWidth}'
                 },
                 // viewConfig: {
@@ -81,9 +82,14 @@ Ext.define('school.view.basic.class.ClassInfo', {
                     caller: 'GradeAndCLass',
                     pathKey: 'grade',
                     onSuccess: function() {
-                        let viewModel = me.getViewModel();
-        
-                        viewModel.get('store_gradeclass').load();
+                        let treePanel = me.down('treepanel');
+                        let listCard = me.down('listcard');
+                        let treeStore = treePanel.store;
+                        treeStore.load(function() {
+                            let rootNode = treeStore.getRootNode();
+                            rootNode.expand();
+                            listCard.showNode(rootNode);
+                        });
                     }
                 }, '->'],
                 listeners: {

+ 9 - 3
frontend/pc-web/app/view/basic/class/ClassInfoController.js

@@ -4,13 +4,19 @@ Ext.define('school.view.basic.class.ClassInfoController', {
 
     onBeforeRender: function() {
         let me = this,
-        view = me.getView(),
-        viewModel = me.getViewModel();
+        refs = me.getReferences(),
+        treeList = refs.treelist,
+        listCard = refs.listcard,
+        treeStore = treeList.store;
 
         Ext.StoreMgr.get('store_grade').load();
         Ext.StoreMgr.get('store_class').load();
         Ext.StoreMgr.get('store_subject').load();
-        viewModel.get('store_gradeclass').load();
+        treeStore.load(function(records, operation, success) {
+            let rootNode = treeStore.getRootNode();
+            rootNode.expand();
+            listCard.showNode(rootNode);
+        });
     },
 
     onItemMouseEnter: function(tree, record, item, index, e, eOpts)  {

+ 1 - 2
frontend/pc-web/app/view/basic/class/ListCard.js

@@ -34,8 +34,7 @@ Ext.define('school.view.basic.class.ListCard', {
     singleSelect: true,
     itemSelector: '.item',
     listeners: {
-        itemclick: 'cardItemClick',
-        beforeRender: 'onBeforeRender'
+        itemclick: 'cardItemClick'
     },
 
     showNode: function(node) {

+ 0 - 9
frontend/pc-web/app/view/basic/class/ListCardController.js

@@ -2,15 +2,6 @@ Ext.define('school.view.basic.class.ListCardController', {
     extend: 'Ext.app.ViewController',
     alias: 'controller.listcard',
 
-    onBeforeRender: function() {
-        var me = this,
-        view = me.view,
-        viewModel = me.getViewModel(),
-        grade = viewModel.get('store_gradeclass');
-
-        view.showNode(grade.getRootNode());
-    },
-
     cardItemClick: function(view, record, navItem, index, e, eOpts) {
         var me = this;
         var view = me.getView();

+ 1 - 0
frontend/pc-web/app/view/basic/subject/List.js

@@ -37,6 +37,7 @@ Ext.define('school.view.basic.subject.List', {
                 selModel: {
                     type: 'cellmodel'
                 },
+                disableDetail: true,
                 hiddenTools: false,
                 toolBtns: [{
                     xtype: 'button',

+ 25 - 29
frontend/pc-web/app/view/basic/subject/ListController.js

@@ -73,7 +73,7 @@ Ext.define('school.view.basic.subject.ListController', {
         if(targetCls.contains('fa-pencil')) {
             me.modifyClick(record.data);
         }else if(targetCls.contains('fa-trash-o')) {
-            me.onDeleteClick(record.data.subject_id);
+            me.onDeleteClick(record);
         }
     },
 
@@ -144,41 +144,37 @@ Ext.define('school.view.basic.subject.ListController', {
         win.show();
     },
 
-    onDeleteClick: function(id) {
+    onDeleteClick: function(record) {
         let me = this,
         view = me.getView(),
         grid = view.down('grid'),
-        selectedRecords = grid.getSelection(),
+        id = record.data.subject_id,
         data;
 
-        data = id ? [{
+        data = [{
             id: id
-        }] : selectedRecords.map(function(r) {
-            return {
-                id: r.get('subject_id')
-            };
-        });
-
-        if(data.length == 0) {
-            school.util.BaseUtil.showErrorToast('请先勾选需要删除的记录');
-            return;
-        }
+        }];
 
-        grid.setLoading(true);
-        school.util.BaseUtil.request({
-            // url: 'http://10.1.80.47:9560/student/batchDelete',
-            url: '/api/school/subject/batchDelete',
-            method: 'POST',
-            params: JSON.stringify({
-                baseDTOs: data
-            })
-        }).then(function(res) {
-            grid.setLoading(false);
-            school.util.BaseUtil.showSuccessToast('成功删除' + data.length + '条记录');
-            grid.store.loadPage(grid.store.currentPage);
-        }).catch(function(e) {
-            grid.setLoading(false);
-            school.util.BaseUtil.showErrorToast('删除失败: ' + e.message);
+        school.util.BaseUtil.showConfirm('确认删除', '确定要删除学科' + record.get('subject_name') + '吗?')
+        .then(function(yes) {
+            if(yes == 'yes') {
+                grid.setLoading(true);
+                school.util.BaseUtil.request({
+                    // url: 'http://10.1.80.47:9560/student/batchDelete',
+                    url: '/api/school/subject/batchDelete',
+                    method: 'POST',
+                    params: JSON.stringify({
+                        baseDTOs: data
+                    })
+                }).then(function(res) {
+                    grid.setLoading(false);
+                    school.util.BaseUtil.showSuccessToast('成功删除' + data.length + '条记录');
+                    grid.store.loadPage(grid.store.currentPage);
+                }).catch(function(e) {
+                    grid.setLoading(false);
+                    school.util.BaseUtil.showErrorToast('删除失败: ' + e.message);
+                });
+            }
         });
     }
 

+ 90 - 0
frontend/pc-web/app/view/setting/device/List.js

@@ -0,0 +1,90 @@
+/**
+ * 设备参数列表
+ */
+Ext.define('school.view.setting.device.List', {
+    extend: 'school.view.core.base.BasePanel',
+    xtype: 'setting-device-list',
+
+    controller: 'setting-device-list',
+
+    // dataUrl: 'http://10.1.80.47:9520/api/device/device/list',
+    dataUrl: '/api/device/device/list',
+    _title: '设备参数',
+    caller: null,
+    pathKey: null,
+
+    initComponent: function() {
+        var me = this;
+        Ext.apply(this, {
+            searchField: [{
+                xtype: 'textfield',
+                name: 'deviceName',
+                fieldLabel: '名称'
+            }],
+            gridConfig: {
+                addTitle: '设备参数',
+                addXtype: null,
+                idField: 'id',
+                codeField: null,
+                detailField: null,
+                dataUrl: me.dataUrl,
+                caller: null,
+                rootProperty: 'data.list',
+                totalProperty: 'data.total',
+                actionColumn: [],
+                selModel: {
+                    type: 'cellmodel'
+                },
+                disableDetail: true,
+                hiddenTools: false,
+                toolBtns: [{
+                    xtype: 'button',
+                    text: '新增',
+                    handler: 'onAddClick'
+                }],
+                columns : [{
+                    text: '设备ID',
+                    dataIndex: 'deviceId'
+                }, {
+                    text: '设备IP',
+                    dataIndex: 'deviceIp',
+                    width: 120
+                }, {
+                    text: '设备名称',
+                    dataIndex: 'deviceName',
+                    width: 120
+                }, {
+                    text: '用户',
+                    dataIndex: 'deviceUser'
+                }, {
+                    text: '密码',
+                    dataIndex: 'devicePassword'
+                }, {
+                    text: '端口',
+                    dataIndex: 'devicePort'
+                }, {
+                    text: '备注',
+                    dataIndex: 'deviceRemark',
+                    width: 150
+                }, {
+                    xtype:'actioncolumn',
+                    width:70,
+                    dataIndex:'actioncolumn',
+                    text:'操作',
+                    align: 'center',
+                    items: [{
+                        tooltip: '编辑',
+                        iconCls: 'x-fa fa-pencil fa-fw'
+                    },{
+                        iconCls:'x-fa fa-trash-o fa-fw',
+                        tooltip: '删除'
+                    }],
+                    listeners: {
+                        click: 'onActionClick'
+                    }
+                }]
+            },
+        });
+        this.callParent(arguments);
+    }
+});

+ 246 - 0
frontend/pc-web/app/view/setting/device/ListController.js

@@ -0,0 +1,246 @@
+Ext.define('school.view.setting.device.ListController', {
+    extend: 'school.view.core.base.BasePanelController',
+    alias: 'controller.setting-device-list',
+
+    onAddClick: function () {
+        let me = this,
+        view = me.getView(),
+        win = Ext.getCmp('device-addwin');
+
+        if (!win) {
+            win = Ext.create('Ext.window.Window', {
+                title: '新增设备信息',
+                width: 450,
+                height: 380,
+                id: 'device-addwin',
+                constrain: true,
+                modal: true,
+                bodyPadding: 10,
+                layout: 'fit',
+                items: [{
+                    xtype: 'form',
+                    layout: 'column',
+                    defaults: {
+                        columnWidth: 1
+                    },
+                    items: [{
+                        xtype: 'textfield',
+                        name: 'deviceIp',
+                        emptyText: '设备IP',
+                        allowBlank: false,
+                        maxLength: 20
+                    }, {
+                        xtype: 'textfield',
+                        name: 'deviceName',
+                        emptyText: '设备名称',
+                        allowBlank: false,
+                        maxLength: 20
+                    }, {
+                        xtype: 'textfield',
+                        name: 'deviceUser',
+                        emptyText: '用户',
+                        allowBlank: false,
+                        maxLength: 20
+                    }, {
+                        xtype: 'textfield',
+                        name: 'devicePassword',
+                        emptyText: '密码',
+                        allowBlank: false,
+                        maxLength: 20
+                    }, {
+                        xtype: 'textfield',
+                        name: 'devicePort',
+                        emptyText: '端口',
+                        allowBlank: false,
+                        maxLength: 20
+                    }, {
+                        xtype: 'textfield',
+                        name: 'deviceRemark',
+                        emptyText: '备注'
+                    }],
+                    buttonAlign: 'center',
+                    buttons: [{
+                        text: '确定',
+                        formBind: true,
+                        handler: function () {
+                            let form = this.up('form');
+                            let values = form.getValues();
+                            let url, params, headers;
+                            
+                            params = JSON.stringify(values);
+
+                            view.setLoading(true);
+                            school.util.BaseUtil.request({
+                                // url: 'http://10.1.80.47:9520/api/device/device/save',
+                                url: '/api/device/device/save',
+                                method: 'POST',
+                                params: params,
+                                headers: headers
+                            }).then(function (res) {
+                                view.setLoading(false);
+                                win.close();
+                                school.util.BaseUtil.showSuccessToast('添加成功');
+                                view.refresh();
+                            }).catch(function (e) {
+                                view.setLoading(false);
+                                school.util.BaseUtil.showErrorToast('添加失败: ' + e.message);
+                            });
+                        }
+                    }]
+                }]
+            });
+            view.add(win);
+        }
+        win.show();
+    },
+
+    onActionClick: function(tableView, td, row, col, e, record, tr) {
+        let me = this;
+        let targetCls = event.target.classList;
+        if(targetCls.contains('fa-pencil')) {
+            me.modifyClick(record.data);
+        }else if(targetCls.contains('fa-trash-o')) {
+            me.onDeleteClick(record);
+        }
+    },
+
+    modifyClick: function (data) {
+        let me = this,
+        view = me.getView(),
+        win = Ext.getCmp('device-modifywin');
+
+        if (!win) {
+            win = Ext.create('Ext.window.Window', {
+                title: '修改设备信息',
+                width: 450,
+                height: 380,
+                id: 'device-modifywin',
+                constrain: true,
+                modal: true,
+                bodyPadding: 10,
+                layout: 'fit',
+                items: [{
+                    xtype: 'form',
+                    layout: 'column',
+                    defaults: {
+                        columnWidth: 1
+                    },
+                    items: [{
+                        xtype: 'textfield',
+                        name: 'deviceId',
+                        emptyText: '设备ID',
+                        hidden: true,
+                        maxLength: 20
+                    }, {
+                        xtype: 'textfield',
+                        name: 'deviceIp',
+                        emptyText: '设备IP',
+                        allowBlank: false,
+                        maxLength: 20
+                    }, {
+                        xtype: 'textfield',
+                        name: 'deviceName',
+                        emptyText: '设备名称',
+                        allowBlank: false,
+                        maxLength: 20
+                    }, {
+                        xtype: 'textfield',
+                        name: 'deviceUser',
+                        emptyText: '用户',
+                        allowBlank: false,
+                        maxLength: 20
+                    }, {
+                        xtype: 'textfield',
+                        name: 'devicePassword',
+                        emptyText: '密码',
+                        allowBlank: false,
+                        maxLength: 20
+                    }, {
+                        xtype: 'textfield',
+                        name: 'devicePort',
+                        emptyText: '端口',
+                        allowBlank: false,
+                        maxLength: 20
+                    }, {
+                        xtype: 'textfield',
+                        name: 'deviceRemark',
+                        emptyText: '备注'
+                    }],
+                    buttonAlign: 'center',
+                    buttons: [{
+                        text: '确定',
+                        formBind: true,
+                        handler: function () {
+                            let form = this.up('form');
+                            let values = form.getValues();
+                            let params, headers;
+                            
+                            params = JSON.stringify(values);
+
+                            view.setLoading(true);
+                            school.util.BaseUtil.request({
+                                // url: 'http://10.1.80.47:9520/api/device/device/save',
+                                url: '/api/device/device/save',
+                                method: 'POST',
+                                params: params,
+                                headers: headers
+                            }).then(function (res) {
+                                view.setLoading(false);
+                                win.close();
+                                school.util.BaseUtil.showSuccessToast('修改成功');
+                                view.refresh();
+                            }).catch(function (e) {
+                                view.setLoading(false);
+                                school.util.BaseUtil.showErrorToast('修改失败: ' + e.message);
+                            });
+                        }
+                    }]
+                }]
+            });
+            view.add(win);
+            win.down('form').getForm().findField('deviceId').setValue(data.deviceId);
+            win.down('form').getForm().findField('deviceIp').setValue(data.deviceIp);
+            win.down('form').getForm().findField('deviceName').setValue(data.deviceName);
+            win.down('form').getForm().findField('deviceUser').setValue(data.deviceUser);
+            win.down('form').getForm().findField('devicePassword').setValue(data.devicePassword);
+            win.down('form').getForm().findField('devicePort').setValue(data.devicePort);
+            win.down('form').getForm().findField('deviceRemark').setValue(data.deviceRemark);
+        }
+        win.show();
+    },
+
+    onDeleteClick: function(record) {
+        let me = this,
+        view = me.getView(),
+        grid = view.down('grid'),
+        id = record.data.deviceId,
+        data;
+
+        data = [{
+            id: id
+        }];
+
+        school.util.BaseUtil.showConfirm('确认删除', '确定要删除设备' + record.get('deviceName') + '吗?')
+        .then(function(yes) {
+            if(yes == 'yes') {
+                grid.setLoading(true);
+                school.util.BaseUtil.request({
+                    // url: 'http://10.1.80.47:9520/api/device/device/batchDelete',
+                    url: '/api/device/device/batchDelete',
+                    method: 'POST',
+                    params: JSON.stringify({
+                        baseDTOs: data
+                    })
+                }).then(function(res) {
+                    grid.setLoading(false);
+                    school.util.BaseUtil.showSuccessToast('成功删除' + data.length + '条记录');
+                    grid.store.loadPage(grid.store.currentPage);
+                }).catch(function(e) {
+                    grid.setLoading(false);
+                    school.util.BaseUtil.showErrorToast('删除失败: ' + e.message);
+                });
+            }
+        });
+    }
+
+});

+ 0 - 41
frontend/pc-web/app/view/viewport/ViewportModel.js

@@ -25,46 +25,5 @@ Ext.define('school.view.viewport.ViewportModel', {
                 }
             }
         },
-        store_gradeclass: {
-            type: 'tree',
-            autoLoad: false,
-            // model: 'school.model.Grade',
-            fields: [{
-                name: 'text'
-            }],
-            proxy: {
-                type: 'ajax',
-                // url: 'http://10.1.80.47:9560/grade/read',
-                url: '/api/school/grade/read',
-                reader: {
-                    transform: {
-                        fn: function(data) {
-                            let grades = [];
-                            if(!!data.data) {
-                                grades = data.data.children || [];
-                                grades.map(function(s) {
-                                    s._id = s.id;
-                                    s.id = 'grade-' + s.id;
-                                    let classes = s.children;
-                                    let d = classes.map(function(c) {
-                                        c._id = c.id;
-                                        c.id = 'class-' + c.id;
-                                        return c;
-                                    });
-                                    return s;
-                                });
-                            }
-                            return grades;
-                        },
-                        scope: this
-                    }
-                }
-            },
-            root: {
-                text: '全年级',
-                type: 'SCHOOL',
-                expanded: true
-            }
-        }
     }
 });

+ 2 - 2
frontend/pc-web/resources/json/navigation.json

@@ -58,9 +58,9 @@
         "text": "角色授权",
         "view": "setting-access-roleaccess"
     }, {
-        "id": "device-param",
+        "id": "setting-device-list",
         "text": "设备参数",
-        "view": "device-param"
+        "view": "setting-device-list"
     }, {
         "id": "setting-operatelog-operatelog",
         "text": "操作日志",