Ver Fonte

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

guq há 7 anos atrás
pai
commit
b379b814a5
38 ficheiros alterados com 505 adições e 195 exclusões
  1. 6 6
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/wxschool/basic/controller/WxClazzController.java
  2. 4 4
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/wxschool/basic/controller/WxUserController.java
  3. 3 3
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/wxschool/basic/service/WxClazzService.java
  4. 2 2
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/wxschool/basic/service/WxUserService.java
  5. 11 16
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/wxschool/basic/service/impl/WxClazzServiceImpl.java
  6. 10 2
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/wxschool/basic/service/impl/WxOaApproveServiceImpl.java
  7. 9 2
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/wxschool/basic/service/impl/WxUserServiceImpl.java
  8. 1 1
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/wxschool/mapper/WxTeacherMapper.java
  9. 2 0
      applications/school/school-server/src/main/resources/mapper/WxTeacherMapper.xml
  10. 3 2
      frontend/pc-web/app/util/BaseUtil.js
  11. 0 1
      frontend/pc-web/app/util/FormUtil.js
  12. 24 3
      frontend/pc-web/app/view/basic/class/ClassInfo.js
  13. 210 41
      frontend/pc-web/app/view/basic/class/ClassInfoController.js
  14. 1 1
      frontend/pc-web/app/view/basic/class/ListCard.js
  15. 1 1
      frontend/pc-web/app/view/basic/school/SchoolInfo.js
  16. 2 1
      frontend/pc-web/app/view/viewport/ViewportModel.js
  17. BIN
      frontend/pc-web/packages/font-school/resources/fonts/iconfont.eot
  18. 0 0
      frontend/pc-web/packages/font-school/resources/fonts/iconfont.js
  19. 9 0
      frontend/pc-web/packages/font-school/resources/fonts/iconfont.svg
  20. BIN
      frontend/pc-web/packages/font-school/resources/fonts/iconfont.ttf
  21. BIN
      frontend/pc-web/packages/font-school/resources/fonts/iconfont.woff
  22. BIN
      frontend/pc-web/packages/font-school/resources/fonts/iconfont.woff2
  23. 12 8
      frontend/pc-web/packages/font-school/sass/etc/icons.scss
  24. 0 2
      frontend/pc-web/packages/font-school/sass/src/all.scss
  25. 3 0
      frontend/wechat-web/src/modules/hiPages/LeaveDetail/LeaveDetail.css
  26. 6 8
      frontend/wechat-web/src/modules/hiPages/LeaveDetail/LeaveDetail.js
  27. 2 2
      frontend/wechat-web/src/modules/hiPages/approvel/Approvel.css
  28. 52 8
      frontend/wechat-web/src/modules/hiPages/approvel/Approvel.js
  29. 20 16
      frontend/wechat-web/src/modules/hiPages/approvel/ApprovelItem.js
  30. 1 1
      frontend/wechat-web/src/modules/hiPages/res_apply/ResApply.js
  31. 1 1
      frontend/wechat-web/src/modules/hiPages/send-vote/SendVote.js
  32. 2 2
      frontend/wechat-web/src/modules/hiPages/sendMeetting/SendMeet.js
  33. 3 3
      frontend/wechat-web/src/modules/leave/LeaveAddCPage.js
  34. 3 3
      frontend/wechat-web/src/modules/leave/LeaveAddPage.js
  35. 30 19
      frontend/wechat-web/src/modules/leave/LeaveItem.js
  36. 57 29
      frontend/wechat-web/src/modules/leave/LeaveListPage.js
  37. 9 5
      frontend/wechat-web/src/modules/vote/VoteDetailPage.js
  38. 6 2
      frontend/wechat-web/src/modules/vote/VoteListTeacher.jsx

+ 6 - 6
applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/wxschool/basic/controller/WxClazzController.java

@@ -68,9 +68,9 @@ public class WxClazzController {
 	 * @throws Exception
 	 */
 	@PostMapping("/selectParentPhoneByTeacher")
-	public ResultBean selectParentPhoneByTeacher(@Param("teacherId") Long teacherId, @Param("selectKey") String selectKey){
+	public ResultBean selectParentPhoneByTeacher(@Param("teacherId") Long teacherId, @Param("selectKey") String selectKey,@Param("pageIndex") Integer pageIndex,@Param("pageSize") Integer pageSize){
 		try {
-			List<ClazzDO> clazzDOS = clazzService.selectParentPhoneByTeacher(teacherId, selectKey);
+			List<ClazzDO> clazzDOS = clazzService.selectParentPhoneByTeacher(teacherId, selectKey,pageIndex,pageSize);
 			return new ResultBean(clazzDOS);
 		}catch (Exception e){
 			return new ResultBean(e);
@@ -83,9 +83,9 @@ public class WxClazzController {
 	 * @throws Exception
 	 */
 	@PostMapping("/getTeacherByStuId")
-	public ResultBean getTeacherByStuId(@Param("stuId") Long stuId, @Param("selectKey")String selectKey){
+	public ResultBean getTeacherByStuId(@Param("stuId") Long stuId, @Param("selectKey")String selectKey,@Param("pageIndex") Integer pageIndex,@Param("pageSize") Integer pageSize){
 		try {
-			List<TeacherDO> teacherByStuId = clazzService.getTeacherByStuId(stuId, selectKey);
+			List<TeacherDO> teacherByStuId = clazzService.getTeacherByStuId(stuId, selectKey,pageIndex,pageSize);
 			return new ResultBean(teacherByStuId);
 		}catch (Exception e){
 			return new ResultBean(e);
@@ -98,9 +98,9 @@ public class WxClazzController {
 	 * @throws Exception
 	 */
 	@PostMapping("/getParentByClazzId")
-	public ResultBean getParentByClazzId(@Param("clazzId") Long clazzId, @Param("selectKey") String selectKey){
+	public ResultBean getParentByClazzId(@Param("clazzId") Long clazzId, @Param("selectKey") String selectKey,@Param("pageIndex") Integer pageIndex,@Param("pageSize") Integer pageSize){
 		try {
-			List<StudentDO> parentByClazzId = clazzService.getParentByClazzId(clazzId, selectKey);
+			List<StudentDO> parentByClazzId = clazzService.getParentByClazzId(clazzId, selectKey,pageIndex,pageSize);
 			return new ResultBean(parentByClazzId);
 		}catch (Exception e){
 			return new ResultBean(e);

+ 4 - 4
applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/wxschool/basic/controller/WxUserController.java

@@ -64,12 +64,12 @@ public class WxUserController {
 
 	/** 绑定 */
 	@PostMapping("/bindOpenid")
-	public ResultBean bindOpenid(@Param("userPhone")String userPhone, @Param("code")String code, @Param("openid")String openid){
+	public ResultBean bindOpenid(@Param("userPhone")String userPhone, @Param("code")String code, @Param("openid")String openid,@Param("headimgurl")String headimgurl){
 		try {
 			Assert.notNull(userPhone,"请填入手机号");
 			Assert.notNull(code,"请输入验证码");
 			Assert.notNull(openid,"openid不能为空");
-			Map<String, Object> map = userService.bindOpenid(userPhone, code, openid);
+			Map<String, Object> map = userService.bindOpenid(userPhone, code, openid,headimgurl);
 			return new ResultBean(map);
 		}catch (Exception e){
 			return new ResultBean(e);
@@ -77,10 +77,10 @@ public class WxUserController {
 	}
 
 	@GetMapping("/isBinding")
-	public ResultBean isBinding(String openid){
+	public ResultBean isBinding(@Param("openid") String openid,@Param("headimgurl")String headimgurl){
 		try {
 			Assert.notNull(openid,"openid不能为空");
-			Map<String, Object> map = userService.isBinding(openid);
+			Map<String, Object> map = userService.isBinding(openid,headimgurl);
 			Object teacherDOS =  map.get("teacherDOS");
 			Object parentsDOS = map.get("parentsDOS");
 			if (ObjectUtils.isEmpty(teacherDOS)&&ObjectUtils.isEmpty(parentsDOS)){

+ 3 - 3
applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/wxschool/basic/service/WxClazzService.java

@@ -38,21 +38,21 @@ public interface WxClazzService {
 	 * @return
 	 * @throws Exception
 	 */
-	public List<ClazzDO> selectParentPhoneByTeacher(@Param("teacherId") Long teacherId, @Param("selectKey") String selectKey) throws Exception;
+	public List<ClazzDO> selectParentPhoneByTeacher(@Param("teacherId") Long teacherId, @Param("selectKey") String selectKey,@Param("pageIndex") Integer pageIndex,@Param("pageSize") Integer pageSize) throws Exception;
 
 	/**
 	 * 获取学生班级的所有老师
 	 * @param stuId
 	 * @throws Exception
 	 */
-	public List<TeacherDO> getTeacherByStuId(@Param("stuId") Long stuId, @Param("selectKey") String selectKey) throws Exception;
+	public List<TeacherDO> getTeacherByStuId(@Param("stuId") Long stuId, @Param("selectKey") String selectKey,@Param("pageIndex") Integer pageIndex,@Param("pageSize") Integer pageSize) throws Exception;
 
 	/**
 	 * 获取学生班级的所有家长
 	 * @param clazzId
 	 * @throws Exception
 	 */
-	public List<StudentDO> getParentByClazzId(@Param("clazzId") Long clazzId, @Param("selectKey") String selectKey) throws Exception;
+	public List<StudentDO> getParentByClazzId(@Param("clazzId") Long clazzId, @Param("selectKey") String selectKey,@Param("pageIndex") Integer pageIndex,@Param("pageSize") Integer pageSize) throws Exception;
 
 	/**
 	 * 获取所有教师的电话

+ 2 - 2
applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/wxschool/basic/service/WxUserService.java

@@ -33,7 +33,7 @@ public interface WxUserService {
 	 * @return
 	 * @throws Exception
 	 */
-	Map<String, Object> bindOpenid(@Param("userPhone") String userPhone, @Param("code") String code, @Param("openid") String openid) throws Exception;
+	Map<String, Object> bindOpenid(@Param("userPhone") String userPhone, @Param("code") String code, @Param("openid") String openid,@Param("headimgurl")String headimgurl) throws Exception;
 
 	/**
 	 * 是否绑定
@@ -41,7 +41,7 @@ public interface WxUserService {
 	 * @return
 	 * @throws Exception
 	 */
-	public HashMap<String, Object> isBinding(@Param("openid") String openid) throws Exception;
+	public HashMap<String, Object> isBinding(@Param("openid") String openid,@Param("headimgurl")String headimgurl) throws Exception;
 
 	/**
 	 * 首页数据

+ 11 - 16
applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/wxschool/basic/service/impl/WxClazzServiceImpl.java

@@ -74,12 +74,15 @@ public class WxClazzServiceImpl implements WxClazzService {
 	 * @return
 	 * @throws Exception
 	 */
-	public List<ClazzDO> selectParentPhoneByTeacher(Long teacherId, String selectKey) throws Exception {
+	public List<ClazzDO> selectParentPhoneByTeacher(Long teacherId, String selectKey,Integer pageIndex,Integer pageSize) throws Exception {
+		Integer pageStart = (pageIndex - 1) * pageSize;
 		List<ClazzDO> clazzDOS = selectClazz(teacherId);
 		for (ClazzDO cz:clazzDOS) {
 			Map<String, Object> map = new HashMap<>();
 			map.put("clazzId",cz.getClazzId());
 			map.put("stuName","%"+selectKey+"%");
+			map.put("offset",pageStart);
+			map.put("limit",pageSize);
 			List<StudentDO> studentDOS = studentMapper.list(map);
 			if (ObjectUtils.isNotEmpty(studentDOS)){
 				for (StudentDO st:studentDOS) {
@@ -105,22 +108,11 @@ public class WxClazzServiceImpl implements WxClazzService {
 	 * @param stuId
 	 * @throws Exception
 	 */
-	public List<TeacherDO> getTeacherByStuId(Long stuId, String selectKey) throws Exception {
+	public List<TeacherDO> getTeacherByStuId(Long stuId, String selectKey,Integer pageIndex,Integer pageSize) throws Exception {
+		Integer pageStart = (pageIndex - 1) * pageSize;
 		StudentDO studentDO = studentMapper.get(stuId);
 		if (ObjectUtils.isNotEmpty(studentDO)){
-			/*Map<String, Object> hashMap = new HashMap<>();
-			hashMap.put("clazzId",studentDO.getClazzId());
-			List<TeacherClazzDO> teacherClazzDOS = teacherClazzMapper.list(hashMap);
-			if (ObjectUtils.isNotEmpty(teacherClazzDOS)){
-				List<TeacherDO> teacherDOS = new ArrayList<>();
-				for (TeacherClazzDO tc:teacherClazzDOS) {
-					TeacherDO teacherDO = teacherMapper.get(tc.getTeacherId());
-					teacherDO.setUserPhone(userMapper.get(teacherDO.getUserId()).getUserPhone());
-				teacherDOS.add(teacherDO);
-				}
-			}
-			return clazzDO;*/
-			List<TeacherDO> byClazzId = teacherMapper.getByClazzId(studentDO.getClazzId(), "%" + selectKey + "%");
+			List<TeacherDO> byClazzId = teacherMapper.getByClazzId(studentDO.getClazzId(), "%" + selectKey + "%",pageStart,pageSize);
 				if (ObjectUtils.isNotEmpty(byClazzId)){
 					for (TeacherDO tc:byClazzId) {
 						tc.setUserPhone(userMapper.get(tc.getUserId()).getUserPhone());
@@ -140,10 +132,13 @@ public class WxClazzServiceImpl implements WxClazzService {
 	 * @param clazzId
 	 * @throws Exception
 	 */
-	public List<StudentDO> getParentByClazzId(Long clazzId, String selectKey) throws Exception {
+	public List<StudentDO> getParentByClazzId(Long clazzId, String selectKey,Integer pageIndex,Integer pageSize) throws Exception {
+		Integer pageStart = (pageIndex - 1) * pageSize;
 		Map<String, Object> map = new HashMap<>();
 		map.put("clazzId",clazzId);
 		map.put("stuName","%"+selectKey+"%");
+		map.put("offset",pageStart);
+		map.put("limit",pageSize);
 		List<StudentDO> studentDOS = studentMapper.list(map);
 		if (ObjectUtils.isNotEmpty(studentDOS)){
 			for (StudentDO st:studentDOS) {

+ 10 - 2
applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/wxschool/basic/service/impl/WxOaApproveServiceImpl.java

@@ -59,8 +59,16 @@ public class WxOaApproveServiceImpl implements WxOaApproveService {
         oaApprove.setSchoolId(teacherMapper.get(proposer).getSchoolId());
         Long approver = parse.getLong("approver");
         oaApprove.setApprover(approver);
-        oaApprove.setStartDate(DateFormatUtil.string2Date(parse.getString("startDate")));
-        oaApprove.setEndDate(DateFormatUtil.string2Date(parse.getString("endDate")));
+        String startDate = parse.getString("startDate");
+        if (ObjectUtils.isNotEmpty(startDate)){
+            Date date = DateFormatUtil.string2Date(startDate);
+            oaApprove.setStartDate(date);
+        }
+        String endDate = parse.getString("endDate");
+        if (ObjectUtils.isNotEmpty(endDate)){
+            Date date = DateFormatUtil.string2Date(endDate);
+            oaApprove.setEndDate(date);
+        }
         oaApprove.setAddress(parse.getString("address"));
         int i = oaApproveMapper.save(oaApprove);
         if (i > 0) {

+ 9 - 2
applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/wxschool/basic/service/impl/WxUserServiceImpl.java

@@ -84,7 +84,7 @@ public class WxUserServiceImpl implements WxUserService {
 	 * @return
 	 * @throws Exception
 	 */
-	public Map<String, Object> bindOpenid(String userPhone, String code, String openid) throws Exception {
+	public Map<String, Object> bindOpenid(String userPhone, String code, String openid,String headimgurl) throws Exception {
 		UserDO user = userMapper.selectUserByPhone(userPhone);
 		if (ObjectUtils.isNotEmpty(user)){
 			Map<String, Object> map = new HashMap<>();
@@ -96,6 +96,7 @@ public class WxUserServiceImpl implements WxUserService {
 				if (ObjectUtils.isNotEmpty(teacherDOS)){
 					for (TeacherDO tc:teacherDOS) {
 						tc.setOpenid(openid);
+						tc.setTeacherPhoto(headimgurl);
 						teacherMapper.update(tc);
 						tc.setSchoolName(schoolMapper.get(tc.getSchoolId()).getSchoolName());
 					}
@@ -104,6 +105,7 @@ public class WxUserServiceImpl implements WxUserService {
 				if (ObjectUtils.isNotEmpty(parentsDOS)){
 					for (ParentsDO pt:parentsDOS) {
 						pt.setOpenid(openid);
+						pt.setParentsPhoto(headimgurl);
 						parentsMapper.update(pt);
 						pt.setSchoolName(schoolMapper.get(pt.getSchoolId()).getSchoolName());
 					}
@@ -243,19 +245,24 @@ public class WxUserServiceImpl implements WxUserService {
 	 * 是否绑定
 	 * @param openid
 	 */
-	public HashMap<String, Object> isBinding(String openid) throws Exception {
+	public HashMap<String, Object> isBinding(String openid,String headimgurl) throws Exception {
 		HashMap<String, Object> map = new HashMap<>();
 		Map<String, Object> hashMap = new HashMap<>();
 		hashMap.put("openid",openid);
 		List<TeacherDO> teacherDOS = teacherMapper.list(hashMap);
 		if (ObjectUtils.isNotEmpty(teacherDOS)){
 			for (TeacherDO tc:teacherDOS) {
+				tc.setTeacherPhoto(headimgurl);
+				teacherMapper.update(tc);
 				tc.setSchoolName(schoolMapper.get(tc.getSchoolId()).getSchoolName());
+
 			}
 		}
 		List<ParentsDO> parentsDOS = parentsMapper.list(hashMap);
 		if (ObjectUtils.isNotEmpty(parentsDOS)){
 			for (ParentsDO pt:parentsDOS) {
+				pt.setParentsPhoto(headimgurl);
+				parentsMapper.update(pt);
 				pt.setSchoolName(schoolMapper.get(pt.getSchoolId()).getSchoolName());
 			}
 		}

+ 1 - 1
applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/wxschool/mapper/WxTeacherMapper.java

@@ -34,7 +34,7 @@ public interface WxTeacherMapper {
 
 	TeacherDO getBySchoolAndOpenid(@Param("schoolId") Long schoolId, @Param("openid") String openid);
 
-	List<TeacherDO> getByClazzId(@Param("clazzId") Long clazzId, @Param("teacherName") String teacherName);
+	List<TeacherDO> getByClazzId(@Param("clazzId") Long clazzId, @Param("teacherName") String teacherName,@Param("pageStart") Integer pageStart,@Param("pageSize")Integer pageSize);
 
 
 	List<TeacherDO> getAll(@Param("schoolId") Long schoolId, @Param("teacherName") String teacherName,@Param("pageStart")Integer pageStart,@Param("pageSize")Integer pageSize);

+ 2 - 0
applications/school/school-server/src/main/resources/mapper/WxTeacherMapper.xml

@@ -147,6 +147,8 @@
 		<where>
 			teacher_id in (select `teacher_id` from sys_teacher_clazz where clazz_id = #{clazzId})
 			<if test="teacherName != null and teacherName != ''"> and teacher_name like #{teacherName} </if>
+			order by teacher_id desc
+			limit #{pageStart}, #{pageSize}
 		</where>
 	</select>
 

+ 3 - 2
frontend/pc-web/app/util/BaseUtil.js

@@ -191,9 +191,10 @@ Ext.define('school.util.BaseUtil', {
                         }catch(e) {
                             res = response.responseJson || {};
                         }
-                        console.error('ajax request failure: ', res);
                         res.message = res.message || '未知错误';
-                        throw new Error(res.message);
+                        console.error('ajax request failure: ', res);
+                        // throw new Error(res.message);
+                        return reject(res);
                     }
                 });
             })

+ 0 - 1
frontend/pc-web/app/util/FormUtil.js

@@ -290,7 +290,6 @@ Ext.define('school.util.FormUtil', {
                     });
 
                     cnames.push(item.detnoColumn);
-                    console.log(cnames);
 
                     formModel.set('detail' + index + '.detailBindFields', cnames);
                     item.bind = {

+ 24 - 3
frontend/pc-web/app/view/basic/class/ClassInfo.js

@@ -28,6 +28,13 @@ Ext.define('school.view.basic.class.ClassInfo', {
             store: '{store_grade}',
             width: '{treeWidth}'
         },
+        // viewConfig: {
+        //     plugins: {
+        //         treeviewdragdrop: {
+        //             containerScroll: true
+        //         }
+        //     }
+        // },
         columns: [{
             xtype: 'treecolumn',
             text: 'Name',
@@ -46,6 +53,14 @@ Ext.define('school.view.basic.class.ClassInfo', {
                 tooltip: '新增',
                 handler: 'onTreeAddClick'
             }]
+        }, {
+            xtype: 'actioncolumn',
+            width: 30,
+            items: [{
+                iconCls: 'action-icon x-hidden x-fa fa-pencil',
+                tooltip: '编辑',
+                handler: 'onTreeEditClick'
+            }]
         }, {
             xtype: 'actioncolumn',
             width: 30,
@@ -56,9 +71,11 @@ Ext.define('school.view.basic.class.ClassInfo', {
             }]
         }],
         listeners: {
-            itemclick: 'onItemclick',
+            itemclick: 'onItemClick',
             itemmouseenter: 'onItemMouseEnter',
-            itemmouseleave: 'onItemMouseLeave'
+            itemmouseleave: 'onItemMouseLeave',
+            beforedrop: 'onItemBeforeDrop',
+            drop: 'onItemDrop',
         }
     }, {
         region: 'center',
@@ -94,5 +111,9 @@ Ext.define('school.view.basic.class.ClassInfo', {
                 hidden: true
             }]
         }]
-    }]
+    }],
+    
+    listeners: {
+        afterrender: 'onAfterRender'
+    }
 });

+ 210 - 41
frontend/pc-web/app/view/basic/class/ClassInfoController.js

@@ -2,32 +2,42 @@ Ext.define('school.view.basic.class.ClassInfoController', {
     extend: 'Ext.app.ViewController',
     alias: 'controller.basic-class-classinfo',
 
-    onItemMouseEnter: function(tree, record, item, index, e, eOpts)  {
-        var icons = item.getElementsByClassName('action-icon');
-        if(record.data.leaf) {
-            icons[1].classList.remove('x-hidden');
-            return;
-        }
+    onAfterRender: function() {
+        let me = this,
+        view = me.getView(),
+        viewModel = me.getViewModel();
 
-        if(record.data.id == 'root') {
-            icons[0].classList.remove('x-hidden');
-            return;
-        }
+        viewModel.get('store_grade').load();
+    },
 
-        icons[0].classList.remove('x-hidden');
-        icons[1].classList.remove('x-hidden');
+    onItemMouseEnter: function(tree, record, item, index, e, eOpts)  {
+        let icons = item.getElementsByClassName('action-icon');
+        let addIcon = icons[0],
+        editIcon = icons[1],
+        deleteIcon = icons[2];
+        if(record.data.type == 'SCHOOL') {
+            addIcon.classList.remove('x-hidden');
+        }else if(record.data.type == 'GRADE') {
+            addIcon.classList.remove('x-hidden');
+            editIcon.classList.remove('x-hidden');
+            deleteIcon.classList.remove('x-hidden');
+        }else if(record.data.type == 'CLASS') {
+            // addIcon.classList.remove('x-hidden');
+            editIcon.classList.remove('x-hidden');
+            deleteIcon.classList.remove('x-hidden');
+        } 
     },
 
     onItemMouseLeave: function(tree, record, item, index, e, eOpts) {
-        var icons = item.getElementsByClassName('action-icon');
+        let icons = item.getElementsByClassName('action-icon');
 
-        for(var x = 0; x < icons.length; x++) {
+        for(let x = 0; x < icons.length; x++) {
             icons[x].classList.add('x-hidden');
         }
     },
 
-    onItemclick: function(tree, record, item, index, e, eOpts) {
-        var me = this,
+    onItemClick: function(tree, record, item, index, e, eOpts) {
+        let me = this,
         refs = me.getReferences(),
         listCard = refs.listcard;
 
@@ -35,8 +45,24 @@ Ext.define('school.view.basic.class.ClassInfoController', {
 
     },
 
+    onItemBeforeDrop: function(node, data, overModel, dropPosition, dropHandlers) {
+        let cdata = data.records[0].data;
+        let tdata = overModel.data;
+        dropHandlers.wait = true;
+
+        if(cdata.type == tdata.type && dropPosition != 'append') {
+            dropHandlers.processDrop();
+        }else {
+            dropHandlers.cancelDrop();
+        }
+    },
+
+    onItemDrop: function() {
+
+    },
+
     onToggleTree: function() {
-        var me = this,
+        let me = this,
         viewModel = me.getViewModel(),
         refs = me.getReferences(),
         treeList = refs.treelist,
@@ -59,7 +85,7 @@ Ext.define('school.view.basic.class.ClassInfoController', {
     },
 
     onTreeUp: function() {
-        var me = this,
+        let me = this,
         viewModel = me.getViewModel(),
         refs = me.getReferences(),
         treeList = refs.treelist,
@@ -78,49 +104,77 @@ Ext.define('school.view.basic.class.ClassInfoController', {
     },
 
     onTreeAddClick: function(tree, row, col, item, e, eOpts, tr) {
-        var me = this,
+        let me = this,
         store = tree.store,
         record = store.getAt(row);
 
-        me.showTreeAddWin(record.data);
+        me.showTreeAddWin(record.data, record);
+
+    },
+
+    onTreeEditClick: function(tree, row, col, item, e, eOpts, tr) {
+        let me = this,
+        store = tree.store,
+        record = store.getAt(row);
 
+        me.showTreeEditWin(record.data, true);
     },
 
     onTreeDeleteClick: function(tree, row, col, item, e, eOpts, tr) {
-        var me = this,
+        let me = this,
         refs = me.getReferences(),
         listCard = refs.listcard,
         treeList = refs.treelist,
         store = treeList.store,
         record = store.getAt(row),
         rootNode = treeList.getRootNode(),
+        _id = record.data._id,
         id = record.data.id,
+        type = record.data.type,
         currentNode = rootNode.findChild('id', id, true),
         parentNode = currentNode.parentNode;
 
-        treeList.setSelection(parentNode);
-        currentNode.remove();
-        
-        listCard.showNode(parentNode);
+        let url;
+
+        if(type == 'GRADE') {
+            // url = 'http://10.1.80.47:9560/grade/delete'
+            url = '/api/school/grade/delete'
+        }else {
+            // url = 'http://10.1.80.47:9560/grade/deleteClass'
+            url = '/api/school/grade/deleteClass'
+        }
+
+        school.util.BaseUtil.request({
+            url: url + '/' +  _id,
+            method: 'POST'
+        }).then(function(res) {
+            treeList.setSelection(parentNode);
+            currentNode.remove();
+            listCard.showNode(parentNode);
+        }).catch(function(e) {
+            school.util.BaseUtil.showErrorToast(e.message);
+        });
     },
 
-    showTreeAddWin: function(data) {
-        var me = this,
+    showTreeAddWin: function(data, record) {
+        let me = this,
         view = me.getView(),
         refs = me.getReferences(),
         treeList = refs.treelist,
         listCard = refs.listcard,
         win = refs.treeaddwin,
         id = data.id,
-        type = data.type;
+        _id = data._id,
+        type = data.type,
+        childCount = record.childNodes.length;
 
-        var title = type == 'SCHOOL' ? '新增年级' : '新增班级';
-        var sumType = type == 'SCHOOL' ? 'GRADE' : 'CLASS';
+        let title = type == 'SCHOOL' ? '新增年级' : '新增班级';
+        let sumType = type == 'SCHOOL' ? 'GRADE' : 'CLASS';
         if(!win) {
             win = Ext.create('Ext.window.Window', {
                 width: 300,
                 height: 180,
-                renderTo: Ext.getBody(),
+                constrain: true,
                 references: 'treeaddwin',
                 modal: true,
                 bodyPadding: 10,
@@ -142,26 +196,141 @@ Ext.define('school.view.basic.class.ClassInfoController', {
                         text: '确定',
                         formBind: true,
                         handler: function() {
-                            var form = this.up('form');
-                            var text = form.getValues().text;
-                            var rootNode = treeList.getRootNode();
-                            var currentNode;
-                            var childNode = {
+                            let form = this.up('form');
+                            let text = form.getValues().text;
+                            let rootNode = treeList.getRootNode();
+                            let currentNode;
+                            let childNode = {
                                 text: text,
                                 type: sumType
                             };
-                            if(id == 'root') {
+                            let url, params, headers;
+                            if(type == 'SCHOOL') {
                                 currentNode = rootNode;
                                 childNode.leaf = false;
                                 childNode.children = [];
+                                // url = 'http://10.1.80.47:9560/grade/save';
+                                url = '/api/school/grade/save';
+                                params = {
+                                    grade: text,
+                                    no: childCount
+                                };
+                                headers = {
+                                    "Content-Type": 'application/x-www-form-urlencoded; charset=UTF-8'
+                                }
                             }else {
                                 currentNode = rootNode.findChild('id', id, true);
                                 childNode.leaf = true;
+                                // url = 'http://10.1.80.47:9560/grade/addClass';
+                                url = '/api/school/grade/addClass';
+                                params = JSON.stringify({
+                                    grade_id: _id,
+                                    clazz_name: text,
+                                    no: childCount
+                                });
                             }
-                            
-                            currentNode.appendChild(childNode);
-                            listCard.showNode(currentNode);
-                            win.close();
+
+                            view.setLoading(true);
+                            school.util.BaseUtil.request({
+                                url: url,
+                                method: 'POST',
+                                params: params,
+                                headers: headers
+                            }).then(function(res) {
+                                view.setLoading(false);
+                                childNode._id = res.data.id;
+                                currentNode.appendChild(childNode);
+                                listCard.showNode(currentNode);
+                                win.close();
+                            }).catch(function(e) {
+                                view.setLoading(false);
+                                school.util.BaseUtil.showErrorToast(e.message);
+                            });
+                        }
+                    }]
+                }]
+            });
+            view.add(win);
+        }
+        win.setTitle(title);
+        win.show();
+    },
+
+    showTreeEditWin: function(data) {
+        let me = this,
+        view = me.getView(),
+        refs = me.getReferences(),
+        treeList = refs.treelist,
+        listCard = refs.listcard,
+        win = refs.treeaddwin,
+        _id = data._id,
+        id = data.id,
+        type = data.type;
+
+        let title = type == 'GRADE' ? '修改年级' : '修改班级';
+        if(!win) {
+            win = Ext.create('Ext.window.Window', {
+                width: 300,
+                height: 180,
+                references: 'treeaddwin',
+                constrain: true,
+                modal: true,
+                bodyPadding: 10,
+                layout: 'fit',
+                items: [{
+                    xtype: 'form',
+                    layout: 'column',
+                    defaults: {
+                        columnWidth: 1
+                    },
+                    items: [{
+                        xtype: 'textfield',
+                        name: 'text',
+                        emptyText: '名称',
+                        value: data.text,
+                        allowBlank: false
+                    }],
+                    buttonAlign: 'center',
+                    buttons: [{
+                        text: '确定',
+                        formBind: true,
+                        handler: function() {
+                            let form = this.up('form');
+                            let text = form.getValues().text;
+                            let rootNode = treeList.getRootNode();
+                            let currentNode = rootNode.findChild('id', id, true);
+                            let url, params, headers;
+                            if(type == 'GRADE') {
+                                // url = 'http://10.1.80.47:9560/grade/update';
+                                url = '/api/school/grade/update';
+                                params = JSON.stringify({
+                                    grade_id: _id,
+                                    grade_name: text
+                                });
+                            }else {
+                                // url = 'http://10.1.80.47:9560/grade/updateClass';
+                                url = '/api/school/grade/updateClass';
+                                params = JSON.stringify({
+                                    clazz_id: _id,
+                                    clazz_name: text
+                                });
+                            }
+
+                            view.setLoading(true);
+                            school.util.BaseUtil.request({
+                                url: url,
+                                method: 'POST',
+                                params: params,
+                                headers: headers
+                            }).then(function(res) {
+                                view.setLoading(false);
+                                currentNode.set('text', text);
+                                currentNode.commit();
+                                win.close();
+                            }).catch(function(e) {
+                                view.setLoading(false);
+                                school.util.BaseUtil.showErrorToast(e.message);
+                            });
                         }
                     }]
                 }]

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

@@ -39,7 +39,7 @@ Ext.define('school.view.basic.class.ListCard', {
     },
 
     showNode: function(node) {
-        var me = this,
+        let me = this,
         classInfo = me.up('basic-class-classinfo'),
         viewModel = classInfo.getViewModel(),
         currentlist = viewModel.get('currentlist'),

+ 1 - 1
frontend/pc-web/app/view/basic/school/SchoolInfo.js

@@ -91,7 +91,7 @@ Ext.define('school.view.basic.school.SchoolInfo', {
         me.setLoading(true);
         school.util.BaseUtil.request({
             // url: 'http://10.1.80.35:9560/school/save',
-            url: '/school/save',
+            url: '/api/school/school/save',
             method: 'POST',
             params: JSON.stringify(values)
         })

+ 2 - 1
frontend/pc-web/app/view/viewport/ViewportModel.js

@@ -34,13 +34,14 @@ Ext.define('school.view.viewport.ViewportModel', {
             }],
             proxy: {
                 type: 'ajax',
-                // url: 'http://10.1.80.35:9520/grade/read/1',
+                // url: 'http://10.1.80.47:9560/grade/read/1',
                 url: '/api/school/grade/read/1',
                 reader: {
                     transform: {
                         fn: function(data) {
                             let schools = data.data.children;
                             schools.map(function(s) {
+                                s._id = s.id;
                                 s.id = 'school-' + s.id;
                                 let classes = s.children;
                                 classes.map(function(c) {

BIN
frontend/pc-web/packages/font-school/resources/fonts/iconfont.eot


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/pc-web/packages/font-school/resources/fonts/iconfont.js


Diff do ficheiro suprimidas por serem muito extensas
+ 9 - 0
frontend/pc-web/packages/font-school/resources/fonts/iconfont.svg


BIN
frontend/pc-web/packages/font-school/resources/fonts/iconfont.ttf


BIN
frontend/pc-web/packages/font-school/resources/fonts/iconfont.woff


BIN
frontend/pc-web/packages/font-school/resources/fonts/iconfont.woff2


+ 12 - 8
frontend/pc-web/packages/font-school/sass/etc/icons.scss

@@ -1,15 +1,19 @@
-.font-school {
-  font-family: "font-school" !important;
-  font-size: 16px;
-  font-style: normal;
-  -webkit-font-smoothing: antialiased;
-  -moz-osx-font-smoothing: grayscale;
-}
-
 .ss-nav-interaction:before {
   content: "\e905";
 }
 
+.ss-move:before {
+  content: "\e908";
+}
+
+.ss-down:before {
+  content: "\e906";
+}
+
+.ss-up:before {
+  content: "\e907";
+}
+
 .ss-nav-setting:before {
   content: "\e904";
 }

Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 2
frontend/pc-web/packages/font-school/sass/src/all.scss


+ 3 - 0
frontend/wechat-web/src/modules/hiPages/LeaveDetail/LeaveDetail.css

@@ -47,4 +47,7 @@
 .comhline_sty1{background-color:#F2F2F2;width:100%;height:1px;}
 .top_header{
     background-color: #FFFFFF;width: 100%;flex:1;
+}
+.leave_reason{
+    display: flex;flex-direction: row;margin-left: 20px;
 }

+ 6 - 8
frontend/wechat-web/src/modules/hiPages/LeaveDetail/LeaveDetail.js

@@ -98,15 +98,13 @@ class LeaveDetail extends Component {
                             </div>)}
                         </div>
                     </div>
-                    <div className="common-flex-row">
-                        <div className="col-xs-3" id="col-clear" style={{fontSize: 12, color: "#666666"}}>请假时间:</div>
-                        <div className="col-xs-9" id="col-clear-start"
-                             style={{fontSize: 12, color: "#333333"}}>{itemdetail.startTime}—{itemdetail.endTime}</div>
+                    <div className="leave_reason">
+                        <div style={{fontSize: 12, color: "#666666",width:'20%'}}>请假时间:</div>
+                        <div style={{fontSize: 12, color: "#333333",width:'80%'}}>{itemdetail.startTime}—{itemdetail.endTime}</div>
                     </div>
-                    <div className="common-flex-row " style={{marginTop: 10}}>
-                        <div className="col-xs-3" id="col-clear" style={{fontSize: 12, color: "#666666"}}>请假事由:</div>
-                        <div className="col-xs-9" id="col-clear-start"
-                             style={{fontSize: 12, color: "#333333"}}>{itemdetail.content}</div>
+                    <div  style={{marginTop: 10}} className="leave_reason">
+                        <div style={{fontSize: 12, color: "#666666",width:'20%'}}>请假事由:</div>
+                        <div style={{fontSize: 12, color: "#333333",width:'80%'}}>{itemdetail.content}</div>
                     </div>
                     <div style={{display: 'flex', width: '100%', flexDirection: 'column'}}>
                         <div style={{flex: '1', overflow: 'scroll', padding: '5px', webkitOverflowScrolling: 'touch'}}>

+ 2 - 2
frontend/wechat-web/src/modules/hiPages/approvel/Approvel.css

@@ -1,6 +1,6 @@
 .item-Style{
-    margin: 0px 10px;background-color: #FFFFFF;height: 76px;border-radius: 6px;display: flex;flex-direction: row;width: auto;
-    width: 53vh;
+    margin: 0px 10px;background-color: #FFFFFF;height: 76px;border-radius: 6px;
+    display: flex;flex-direction: row;width:50vh;
 }
 .img_sty{
     height:45px;width: 45px;margin: 15px 10px;

+ 52 - 8
frontend/wechat-web/src/modules/hiPages/approvel/Approvel.js

@@ -19,7 +19,7 @@ import {connect} from 'react-redux';
 import RefreshLayout from "../../../components/RefreshLayout";
 import {Skeleton, List} from 'antd';
 import {getIntValue, getStrValue, isObjEmpty} from "../../../utils/common";
-
+import {saveListState} from "../../../redux/actions/listState";
 
 let mySwiper;
 let myApplypageIndex = 0;
@@ -64,14 +64,16 @@ class Approvel extends Component {
             }
         })
         if (this.props.listState && !isObjEmpty(this.props.listState.listData)) {
+            console.log('11111')
             this.setState({
                 applyList: this.props.listState.listData,
                 isMyapplydload: false,
             }, () => {
-                ReactDOM.findDOMNode(this.container).scrollTop = this.props.listState.scrollTop
+                ReactDOM.findDOMNode(this.myApplyTab).scrollTop = this.props.listState.scrollTop
             })
             myApplypageIndex = this.props.listState.pageIndex
         } else {
+            console.log('22222')
             myApplypageIndex = 0;
             this.getMyApplyData();
             Toast.hide();
@@ -82,7 +84,7 @@ class Approvel extends Component {
                 approvelList: this.props.listState.listData2,
                 isMyapprovedload: false,
             }, () => {
-                ReactDOM.findDOMNode(this.container).scrollTop = this.props.listState.scrollTop2
+                ReactDOM.findDOMNode(this.myApproveTab).scrollTop = this.props.listState.scrollTop2
             })
             myApprovepageIndex = this.props.listState.pageIndex2
         } else {
@@ -97,14 +99,17 @@ class Approvel extends Component {
     render() {
         const isMyapplyItems =
             <RefreshLayout
+                ref={el => {
+                    this.myApplyTab = el
+                }}
                 refreshing={this.state.isMyApplyRefreshing}
                 onRefresh={this.getMyApplyData}
                 height={this.state.height}>
                 <Skeleton loading={this.state.isMyapplyding} active paragraph={{rows: 3}}>
                     <List dataSource={this.state.applyList}
-                          renderItem={applyListBean => (
+                          renderItem={(applyListBean,index) => (
                               <List.Item>
-                                  <ApprovelItem itemdata={applyListBean} isMyApply={true}/>
+                                  <ApprovelItem itemdata={applyListBean} isMyApply={true}   index={index} onItemClick={this.onItemClick.bind(this)}/>
                               </List.Item>
                           )}/>
                 </Skeleton>
@@ -112,14 +117,17 @@ class Approvel extends Component {
 
         const isMyapproveItems =
             <RefreshLayout
+                ref={el => {
+                    this.myApproveTab = el
+                }}
                 refreshing={this.state.isMyApproveRefreshing}
                 onRefresh={this.getMyApproveData}
                 height={this.state.height}>
                 <Skeleton loading={this.state.isMyapprovedload} active paragraph={{rows: 3}}>
                     <List dataSource={this.state.approvelList}
-                          renderItem={approvelListBean => (
+                          renderItem={(approvelListBean,index) => (
                               <List.Item>
-                                  <ApprovelItem itemdata={approvelListBean}isMyApply={false}/>
+                                  <ApprovelItem itemdata={approvelListBean}isMyApply={false}  index={index} onItemClick={this.onItemClick.bind(this)}/>
                               </List.Item>
                           )}/>
                 </Skeleton>
@@ -143,7 +151,7 @@ class Approvel extends Component {
                          this.contain = el
                      }}>
                     <div className="swiper-wrapper">
-                        <div className="swiper-slide">
+                        <div className="swiper-slide" >
                             {isMyapplyItems}
                         </div>
                         <div className="swiper-slide">
@@ -154,7 +162,43 @@ class Approvel extends Component {
             </div>
         )
     }
+    onItemClick = (isMyApply,index) => {
+        console.log('onItemClick-index',index)
+        this.saveListStatus(false, index)
+    }
+
+
+    saveListStatus = (pageLimit, itemIndex) => {
+        const {applyList, approvelList} = this.state
+        let applyScroll = 0, approvelScroll = 0, applyIndex = 0, approveleIndex = 0
 
+        if (applyList.length <= 10 && pageLimit) {
+            applyList.length = 0
+            applyIndex = 0
+            applyScroll = 0
+        } else {
+            applyIndex = myApplypageIndex
+            applyScroll = ReactDOM.findDOMNode(this.myApplyTab).scrollTop
+        }
+        if (approvelList.length <= 10 && pageLimit) {
+            approvelList.length = 0
+            approveleIndex = 0
+            approvelScroll = 0
+        } else {
+            approveleIndex = myApprovepageIndex
+            approvelScroll = ReactDOM.findDOMNode(this.myApproveTab).scrollTop
+        }
+        saveListState({
+            scrollTop: applyScroll,
+            listData: applyList,
+            pageIndex: applyIndex,
+            tabIndex: this.state.selectIndex,
+            scrollTop2: approvelScroll,
+            listData2: approvelList,
+            pageIndex2: approveleIndex,
+            itemIndex: itemIndex
+        })()
+    }
     getMyApplyData = () => {
         myApplypageIndex++
         try {

+ 20 - 16
frontend/wechat-web/src/modules/hiPages/approvel/ApprovelItem.js

@@ -36,26 +36,30 @@ export default class ApprovelItem extends Component{
 
         const {itemdata,isMyApply,approveId} = this.state
         return(
-            <Link to={"/approvel-detail/" + approveId +"/"+isMyApply}>
-                <div className="item-Style" onClick={this.ItemClick.bind(this,isMyApply,itemdata)}>
-                    <div style={{width:76,height:'100%'}}>
-                        <img src={itemdata.approveType == 1 ? icon_trip : (itemdata.approveType == 2 ? icon_res : icon_leave)} className={isMyApply==true?'img_sty':"img_circle"}/>
-                    </div>
-                    <div style={{width:'65%'}}>
-                        <div style={{color:"#333333",fontSize:15,marginTop:10}}>
-                            {itemdata.approveType == 1 ? '出差申请' :  (itemdata.approveType == 2 ? '用品申请' : '请假申请' )}
+                    <Link to={"/approvel-detail/" + approveId +"/"+isMyApply}>
+                        <div className="item-Style" onClick={this.ItemClick.bind(this,isMyApply,itemdata,this.props.index)}>
+                            <div style={{width:'20%'}}>
+                                <div style={{width:76,height:'100%'}}>
+                                    <img src={itemdata.approveType == 1 ? icon_trip : (itemdata.approveType == 2 ? icon_res : icon_leave)} className={isMyApply==true?'img_sty':"img_circle"}/>
+                                </div>
+                            </div>
+                            <div style={{width:'65%'}}>
+                                <div style={{color:"#333333",fontSize:15,marginTop:10}}>
+                                    {itemdata.approveType == 1 ? '出差申请' :  (itemdata.approveType == 2 ? '用品申请' : '请假申请' )}
+                                </div>
+                                <div style={{color:"#666666",fontSize:12,marginTop:15}}>{this.props.itemdata.creatDate}</div>
+                            </div>
+                            <div className={itemdata.approveStatus==1?'doing':'done'}
+                                 style={{textAlign:'left',marginTop:10,fontSize:12,width:'15%'}}>
+                                {itemdata.approveStatus == 1 ? "待审批" :"已审批"}
+                            </div>
                         </div>
-                        <div style={{color:"#666666",fontSize:12,marginTop:15}}>{this.props.itemdata.creatDate}</div>
-                    </div>
-                    <div className={itemdata.approveStatus==1?'doing':'done'} style={{textAlign:'left',marginTop:10,fontSize:12}}>
-                        {itemdata.approveStatus == 1 ? "待审批" :"已审批"}
-                    </div>
-                </div>
-            </Link>
+                    </Link>
         )
     }
-    ItemClick =(isMyApply,data)=>{
+    ItemClick =(isMyApply,data,index)=>{
         // console.log('type,data',type+'--'+data);
+        this.props.onItemClick(isMyApply,index)
         return
         if(isMyApply){
             this.props.clickApplyItem(data)

+ 1 - 1
frontend/wechat-web/src/modules/hiPages/res_apply/ResApply.js

@@ -95,7 +95,7 @@ class ResApply extends Component{
                     <div onClick={this.addUserItem} className="text-center" style={{color:"#0CE11D",fontSize:12,margin:10}}>+ <span style={{color:"#666666",borderBottom:"1px #000 solid"}}>添加物品明细</span></div>
                 </div>
 
-                <textarea ref='receivingSays' className="form-control textarea_sty" rows="5"  placeholder="领取说明"  value={this.state.receivingSays}></textarea>
+                <textarea ref='receivingSays' className="form-control textarea_sty" rows="5"  placeholder="领取说明"  value={this.state.receivingSays}  maxLength={400}></textarea>
                 <div className="comhline_sty1"></div>
 
 

+ 1 - 1
frontend/wechat-web/src/modules/hiPages/send-vote/SendVote.js

@@ -164,7 +164,7 @@ class SendVote extends Component {
                     : <TargetSelect {...defaultTargetProps}/>}
                 <div className="comhline_sty"></div>
                 <textarea autoFocus="autoFocus" ref='voteTitle' className="form-control textarea_sty"
-                          rows="2" placeholder="请填写投票主题…" style={{resize: 'none'}}></textarea>
+                          rows="2" placeholder="请填写投票主题…" style={{resize: 'none'}}  maxLength={20}></textarea>
                 <div className="comhline_sty"></div>
 
                 <div>

+ 2 - 2
frontend/wechat-web/src/modules/hiPages/sendMeetting/SendMeet.js

@@ -141,9 +141,9 @@ class SendMeet extends Component {
             <div onChange={this.handelValueCom} style={{fontFamily: "PingFangSC-Regular", letterSpacing: 2.5}} className='common-column-layout'>
                 {/*<p>{new Date().getTime()}</p>*/}
                 <textarea autoFocus="autoFocus" ref='meetTitle' className="form-control textarea_sty" rows="2"
-                          placeholder="请填写会议主题…"></textarea>
+                          placeholder="请填写会议主题…"  maxLength={20}></textarea>
                 <textarea ref='meetAddress' className="form-control textarea_sty" rows="3"
-                          placeholder="请填写会议地址…"></textarea>
+                          placeholder="请填写会议地址…"  maxLength={50}></textarea>
                 <div className="comhline_sty"></div>
                 <div className="common-column-layout" style={{fontSize: 15}}>
                     <DatePicker

+ 3 - 3
frontend/wechat-web/src/modules/leave/LeaveAddCPage.js

@@ -114,7 +114,7 @@ class LeaveAddCPage extends Component {
                 <div className="comhline_sty"></div>
                 <div onChange={this.handelValueCom}>
                     <textarea  ref='leaveReason' className="form-control textarea_sty" rows="4"
-                               placeholder="请填写请假内容"></textarea>
+                               placeholder="请填写请假内容" maxLength={400}></textarea>
                 </div>
                 <div className="comhline_sty"></div>
                 {this.state.targetData.length > 0 ? <TargetSelect {...targetProps}/>
@@ -156,8 +156,8 @@ class LeaveAddCPage extends Component {
         var startT = new Date(this.state.startValue).getTime()
         var endT = new Date(this.state.endValue).getTime()
         // console.log('startT',startT)
-        if (startT > endT) {
-            Toast.fail('结束时间不可小于开始时间')
+        if (startT >= endT) {
+            Toast.fail('结束时间必须大于开始时间')
             return
         }
         if (this.state.leaveReason == null || this.state.leaveReason == '') {

+ 3 - 3
frontend/wechat-web/src/modules/leave/LeaveAddPage.js

@@ -93,7 +93,7 @@ class LeaveAddPage extends Component{
                 <div className="comhline_sty"></div>
                 <div onChange={this.handelValueCom}>
                     <textarea  ref='leaveReason' className="form-control textarea_sty" rows="4"
-                               placeholder="请填写请假事由"></textarea>
+                               placeholder="请填写请假事由" maxLength={400}></textarea>
                 </div>
                 <div className="comhline_sty"></div>
                 {this.state.targetData.length > 0 ? <TargetSelect {...targetProps}/>
@@ -129,8 +129,8 @@ class LeaveAddPage extends Component{
         var startT = new Date(this.state.startValue).getTime()
         var endT = new Date(this.state.endValue).getTime()
         // console.log('startT',startT)
-        if (startT > endT) {
-            Toast.fail('结束时间不可小于开始时间')
+        if (startT >= endT) {
+            Toast.fail('结束时间必须大于开始时间')
             return
         }
         if (this.state.leaveReason.trim().length == 0) {

+ 30 - 19
frontend/wechat-web/src/modules/leave/LeaveItem.js

@@ -6,44 +6,55 @@
 import React,{Component} from 'react';
 import {Link} from 'react-router-dom';
 
-export default class LeaveItem extends Component{
-    constructor(props){
+export default class LeaveItem extends Component {
+    constructor(props) {
         super(props);
         this.state = {
-            item:this.props.itemdata
+            item: this.props.itemdata
         }
     }
-    render(){
-        const {item}  = this.state;
-        return(
+
+    render() {
+        const {item} = this.state;
+        return (
             <div>
-                <Link to={'/leavedetail/' +this.props.role +'/'+item.lvId}>
-                    <div className="col-xs-12 " style={{backgroundColor:'#FFF',width:'53vh'}} >
-                        <div className="row flex" >
-                            <div id="global_page_title"  style={{fontSize:15,color:"#333333"}}>  {item.title}</div>
+                <Link to={'/leavedetail/' + this.props.role + '/' + item.lvId}>
+                    <div className="col-xs-12 " style={{backgroundColor: '#FFF', width: '53vh'}}
+                         onClick={this.ItemClick.bind(this, this.props.index)}>
+                        <div className="row flex">
+                            <div id="global_page_title" style={{fontSize: 15, color: "#333333"}}>  {item.title}</div>
                             <div className="item_flex_1  flex_row_right margin_left_right_10">
                                 {
-                                    this.state.role == "parent"? '' :
+                                    this.state.role == "parent" ? '' :
                                         <div>
                                             {
-                                                item.leaveMessages.length == 0 ? <div style={{fontSize:12,color:"#FA5200"}}>未查阅</div>
-                                                    : <div style={{fontSize:12,color:"##686868"}}>已查阅</div>
+                                                item.leaveMessages.length == 0 ?
+                                                    <div style={{fontSize: 12, color: "#FA5200"}}>未查阅</div>
+                                                    : <div style={{fontSize: 12, color: "##686868"}}>已查阅</div>
                                             }
                                         </div>
                                 }
                             </div>
                         </div>
-                        <div className="row" >
-                            <div  className="col-xs-3" id="col-clear"   style={{fontSize:12,color:"#666666"}}>请假时间:</div>
-                            <div  className="col-xs-9" id="col-clear-start"  style={{fontSize:12,color:"#333333"}}>{item.startTime}—{item.endTime}</div>
+                        <div className="row">
+                            <div className="col-xs-3" id="col-clear" style={{fontSize: 12, color: "#666666"}}>请假时间:
+                            </div>
+                            <div className="col-xs-9" id="col-clear-start"
+                                 style={{fontSize: 12, color: "#333333"}}>{item.startTime}—{item.endTime}</div>
                         </div>
-                        <div className="row " style={{marginTop:10,marginBottom:10}} >
-                            <div  className="col-xs-3" id="col-clear"  style={{fontSize:12,color:"#666666"}}>请假事由:</div>
-                            <div  className="col-xs-9" id="col-clear-start"  style={{fontSize:12,color:"#333333"}}>{item.content}</div>
+                        <div className="row " style={{marginTop: 10, marginBottom: 10}}>
+                            <div className="col-xs-3" id="col-clear" style={{fontSize: 12, color: "#666666"}}>请假事由:
+                            </div>
+                            <div className="col-xs-9" id="col-clear-start"
+                                 style={{fontSize: 12, color: "#333333"}}>{item.content}</div>
                         </div>
                     </div>
                 </Link>
             </div>
         )
     }
+    ItemClick =(index)=>{
+        console.log('ItemClick_index',index)
+        this.props.onItemClick(index)
+    }
 }

+ 57 - 29
frontend/wechat-web/src/modules/leave/LeaveListPage.js

@@ -4,6 +4,7 @@
  */
 
 import React from 'react';
+import ReactDOM from 'react-dom';
 import 'bootstrap/dist/css/bootstrap.css'
 import 'bootstrap/dist/css/bootstrap.min.css'
 import './LeaveListPage.css'
@@ -16,11 +17,13 @@ import {API,_baseURL} from "../../configs/api.config";
 import {connect} from 'react-redux'
 import LeaveItem from './LeaveItem';
 import RefreshLayout from "../../components/RefreshLayout";
+import {saveListState} from "../../redux/actions/listState";
+import {getIntValue, getStrValue, isObjEmpty} from "../../utils/common";
+import {Toast} from 'antd-mobile';
 
 let LEAVE_LIST_URL = ''
-/**
- * Created by Arison on 11:22.
- */
+let mPageIndex = 0
+
 class LeaveListPage extends React.Component{
     constructor(props){
         super(props);
@@ -28,7 +31,7 @@ class LeaveListPage extends React.Component{
             name:'LeaveListPage',
             detailVisible: false,
             pageIndex:1,
-            pageSize:5,
+            pageSize:10,
             listItem:null,
             index:null,
             role:this.props.match.params.role,
@@ -44,7 +47,20 @@ class LeaveListPage extends React.Component{
     }
 
     componentDidMount(){
-        this.getLeaveListData();
+        console.log('listState', this.props.listState)
+        if (this.props.listState && !isObjEmpty(this.props.listState.listData)) {
+            this.setState({
+                data: this.props.listState.listData,
+                isLoading: false,
+            }, () => {
+                ReactDOM.findDOMNode(this.container).scrollTop = this.props.listState.scrollTop
+            })
+            mPageIndex = this.props.listState.pageIndex
+        } else {
+            // Toast.loading('数据加载中...', 0)
+            mPageIndex = 0
+            this.getLeaveListData();
+        }
     }
 
 
@@ -54,15 +70,15 @@ class LeaveListPage extends React.Component{
 
             <RefreshLayout
                         refreshing={this.state.isRefreshing}
-                        // ref={el => {
-                        //     this.container = el
-                        // }}
+                         ref={el => {
+                             this.container = el
+                        }}
                         onRefresh={this.getListData}>
                         <Skeleton loading={this.state.isLoading} active paragraph={{rows: 3}}>
                             <List dataSource={this.state.data}
-                                  renderItem={itemdata =>(
+                                  renderItem={(itemdata,index) =>(
                                       <List.Item   id="row_background"  >
-                                          <LeaveItem itemdata={itemdata} role={this.state.role}></LeaveItem>
+                                          <LeaveItem itemdata={itemdata} role={this.state.role} index = {index} onItemClick={this.onItemClick.bind(this)}></LeaveItem>
                                       </List.Item>
                                   )}/>
                         </Skeleton>
@@ -82,14 +98,15 @@ class LeaveListPage extends React.Component{
             })
         } catch (e) {
         }
-
+        mPageIndex = 1
         if (this.state.role === "teacher") {
             console.log("pageIndex",this.state.pageIndex);
             fetchPost(API.leaveListTeacher, {
                 teacherId: this.props.userInfo.user.userFunId,
-                pageIndex: this.state.pageIndex,
+                pageIndex: mPageIndex,
                 pageSize: this.state.pageSize
             }).then((response) => {
+                Toast.hide()
                 this.state.data.length = 0;
                 for (let i = 0; i < response.data.length; i++) {
                     let model = {
@@ -123,7 +140,7 @@ class LeaveListPage extends React.Component{
         if (this.state.role === "parent") {
             fetchPost(API.leaveListParent, {
                 stuId: this.props.userInfo.user.student.stuId,
-                pageIndex: this.state.pageIndex,
+                pageIndex: mPageIndex,
                 pageSize: this.state.pageSize
             }).then((response) => {
                 this.state.data.length = 0;
@@ -156,7 +173,16 @@ class LeaveListPage extends React.Component{
             })
         }
     }
-
+    onItemClick = (index) => {
+        console.log('onItemClick',index)
+        console.log('listState', ReactDOM.findDOMNode(this.container).scrollTop)
+        saveListState({
+            scrollTop: ReactDOM.findDOMNode(this.container).scrollTop,
+            listData: this.state.data,
+            pageIndex: mPageIndex,
+            itemIndex: index,
+        })()
+    }
     loadMoreAction=()=> {
         try {
             this.setState({
@@ -165,23 +191,22 @@ class LeaveListPage extends React.Component{
         } catch (e) {
         }
         setTimeout(() => {
-            this.state.pageIndex++;
             if (this.state.role === "teacher") {
-                fetchGet(API.leaveListTeacher, {
+                fetchPost(API.leaveListTeacher, {
                     userId: this.props.userInfo.user.userFunId,
-                    pageIndex: this.state.pageIndex,
+                    pageIndex:mPageIndex,
                     pageSize: this.state.pageSize
                 }).then((response) => {
                     if(response.data.leaveNotify.length>0){
                         for (let i = 0; i < response.data.leaveNotify.length; i++) {
                             let model = {
-                                lvId:response.data.leaveNotify[i].lvId,
-                                title: response.data.leaveNotify[i].lvName,
-                                endTime: response.data.leaveNotify[i].endDate,
-                                startTime: response.data.leaveNotify[i].startDate,
-                                content: response.data.leaveNotify[i].lvDetails,
-                                enclosure:response.data.leaveNotify[i].enclosure,
-                                leaveMessages:response.data.leaveNotify[i].leaveMessages
+                                lvId:response.data[i].lvId,
+                                title: response.data[i].lvTitle,
+                                endTime: response.data[i].endDate,
+                                startTime: response.data[i].startDate,
+                                content: response.data[i].lvDetails,
+                                enclosure:response.data[i].enclosure,
+                                leaveMessages:response.data[i].oaLeaveReplyDOS
                             };
                             this.state.data.push(model);
                         }
@@ -204,9 +229,9 @@ class LeaveListPage extends React.Component{
                 })
             }
             if (this.state.role === "parent") {
-                fetchGet(API.leaveListParent, {
+                fetchPost(API.leaveListParent, {
                     stuId: this.props.userInfo.user.student.stuId,
-                    pageIndex: this.state.pageIndex,
+                    pageIndex: mPageIndex,
                     pageSize: this.state.pageSize
                 }).then((response) => {
                     console.log("response:" + JSON.stringify(response));
@@ -214,12 +239,12 @@ class LeaveListPage extends React.Component{
                         for (let i = 0; i < response.data.length; i++) {
                             let model = {
                                 lvId:response.data[i].lvId,
-                                title: response.data[i].lvName,
+                                title: response.data[i].lvTitle,
                                 endTime: response.data[i].endDate,
                                 startTime: response.data[i].startDate,
                                 content: response.data[i].lvDetails,
                                 enclosure:response.data[i].enclosure,
-                                leaveMessages:response.data[i].leaveMessages
+                                leaveMessages:response.data[i].oaLeaveReplyDOS
                             };
                             this.state.data.push(model);
                         }
@@ -245,9 +270,11 @@ class LeaveListPage extends React.Component{
 
     }
     getListData= () =>{
-        if(this.state.pageIndex == 1){
+        if(mPageIndex == 0){
+            mPageIndex = 1
             this.getLeaveListData()
         }else {
+            mPageIndex++;
             this.loadMoreAction()
         }
     }
@@ -269,6 +296,7 @@ class LeaveListPage extends React.Component{
 
 let mapStateToProps = (state) => ({
     userInfo: {...state.redUserInfo},
+    listState: {...state.redListState}
 })
 
 let mapDispatchToProps = (dispatch) => ({})

+ 9 - 5
frontend/wechat-web/src/modules/vote/VoteDetailPage.js

@@ -33,7 +33,8 @@ class VoteDetailPage extends React.Component {
                 files: [],
                 endTime: '2018-11-15 08:00',
                 selectState: 0,//0 单选 1 多选
-                votes: []
+                votes: [],
+                voteStatus:''
             }
         };
     }
@@ -87,8 +88,9 @@ class VoteDetailPage extends React.Component {
 
                 this.state.data.endTime = response.data.voteEndDate;
                 this.state.data.voterPhoto = response.data.userPhoto
-                this.state.data.selectState = response.data.voteType === 1 ? 0 : 1
+                this.state.data.selectState = response.data.voteTopicDOS[0].topicType === 1 ? 0 : 1
                 this.state.data.state = response.data.voteStatus === 1 ? "进行中" : "已结束"
+                this.state.data.voteStatus = response.data.voteStatus
                 if (this.state.data.state === "进行中") {
                     this.state.voteState = true;
                 } else {
@@ -116,11 +118,13 @@ class VoteDetailPage extends React.Component {
 
                 voteBean.voteId = getIntValue(item, 'voteId')
                 voteBean.voteName = getStrValue(item, 'voteName')
-                voteBean.voteType = getIntValue(item, 'voteType')
+                voteBean.voteType = getIntValue(response.data.voteTopicDOS, 'topicType')
                 voteBean.voteStatusCode = getIntValue(item, 'voteStatus')
                 if (voteBean.voteStatusCode === 1) {
                     voteBean.voteStatus = '进行中'
-                } else {
+                }else if(voteBean.voteStatusCode === 4){
+                    voteBean.voteStatus = '已截止'
+                }else {
                     voteBean.voteStatus = '已投票'
                 }
                 voteBean.creatDate = getStrValue(item, 'creatDate')
@@ -320,7 +324,7 @@ class VoteDetailPage extends React.Component {
                                         color: "#ffffff",
                                         border: "1px solid #ffffff",
                                         margin: '30px 10px'
-                                    }}>已投票</Button>
+                                    }}>{this.state.data.voteStatus == 4 ? '已截止' : '已投票'}</Button>
                         )
                         }
                     </div>

+ 6 - 2
frontend/wechat-web/src/modules/vote/VoteListTeacher.jsx

@@ -12,7 +12,7 @@ import {Modal, Toast} from 'antd-mobile'
 import RefreshLayout from '../../components/RefreshLayout'
 import {_baseURL, API} from "../../configs/api.config";
 import {connect} from 'react-redux'
-import {saveListState} from 'action/listState'
+import {saveListState} from '../../redux/actions/listState';
 import {getArrayValue, getIntValue, getStrValue, isObjEmpty} from "../../utils/common"
 import VoteItem from 'components/VoteItem'
 import NotifyBoardItem from "../../components/NotifyBoardItem";
@@ -178,6 +178,8 @@ class VoteListTeacher extends Component {
                     voteBean.voteStatusCode = getIntValue(item, 'voteStatus')
                     if (voteBean.voteStatusCode === 1) {
                         voteBean.voteStatus = '进行中'
+                    }else if(voteBean.voteStatusCode === 4){
+                        voteBean.voteStatus = '已截止'
                     } else {
                         voteBean.voteStatus = '已投票'
                     }
@@ -249,7 +251,9 @@ class VoteListTeacher extends Component {
                     voteBean.voteStatusCode = getIntValue(item, 'voteStatus')
                     if (voteBean.voteStatusCode === 1) {
                         voteBean.voteStatus = '进行中'
-                    } else {
+                    } else if(voteBean.voteStatusCode === 4){
+                        voteBean.voteStatus = '已截止'
+                    }else {
                         voteBean.voteStatus = '已投票'
                     }
                     voteBean.creatDate = getStrValue(item, 'creatDate')

Alguns ficheiros não foram mostrados porque muitos ficheiros mudaram neste diff