Enford 5 年之前
父節點
當前提交
e9c92c630f
共有 100 個文件被更改,包括 12433 次插入0 次删除
  1. 19 0
      src/main/java/com/jeeplus/modules/test/dao/grid/CategoryDao.java
  2. 22 0
      src/main/java/com/jeeplus/modules/test/dao/grid/GoodsDao.java
  3. 19 0
      src/main/java/com/jeeplus/modules/test/dao/note/TestNoteDao.java
  4. 19 0
      src/main/java/com/jeeplus/modules/test/dao/one/FormLeaveDao.java
  5. 19 0
      src/main/java/com/jeeplus/modules/test/dao/onetomany/TestDataChild2Dao.java
  6. 19 0
      src/main/java/com/jeeplus/modules/test/dao/onetomany/TestDataChild3Dao.java
  7. 19 0
      src/main/java/com/jeeplus/modules/test/dao/onetomany/TestDataChildDao.java
  8. 19 0
      src/main/java/com/jeeplus/modules/test/dao/onetomany/TestDataMainDao.java
  9. 18 0
      src/main/java/com/jeeplus/modules/test/dao/tree/TestTreeDao.java
  10. 19 0
      src/main/java/com/jeeplus/modules/test/dao/validation/TestValidationDao.java
  11. 37 0
      src/main/java/com/jeeplus/modules/test/entity/grid/Category.java
  12. 58 0
      src/main/java/com/jeeplus/modules/test/entity/grid/Goods.java
  13. 47 0
      src/main/java/com/jeeplus/modules/test/entity/note/TestNote.java
  14. 87 0
      src/main/java/com/jeeplus/modules/test/entity/one/FormLeave.java
  15. 89 0
      src/main/java/com/jeeplus/modules/test/entity/onetomany/TestDataChild.java
  16. 74 0
      src/main/java/com/jeeplus/modules/test/entity/onetomany/TestDataChild2.java
  17. 74 0
      src/main/java/com/jeeplus/modules/test/entity/onetomany/TestDataChild3.java
  18. 142 0
      src/main/java/com/jeeplus/modules/test/entity/onetomany/TestDataMain.java
  19. 70 0
      src/main/java/com/jeeplus/modules/test/entity/tree/TestTree.java
  20. 104 0
      src/main/java/com/jeeplus/modules/test/entity/validation/TestValidation.java
  21. 50 0
      src/main/java/com/jeeplus/modules/test/service/grid/CategoryService.java
  22. 56 0
      src/main/java/com/jeeplus/modules/test/service/grid/GoodsService.java
  23. 50 0
      src/main/java/com/jeeplus/modules/test/service/note/TestNoteService.java
  24. 50 0
      src/main/java/com/jeeplus/modules/test/service/one/FormLeaveService.java
  25. 120 0
      src/main/java/com/jeeplus/modules/test/service/onetomany/TestDataMainService.java
  26. 46 0
      src/main/java/com/jeeplus/modules/test/service/tree/TestTreeService.java
  27. 50 0
      src/main/java/com/jeeplus/modules/test/service/validation/TestValidationService.java
  28. 196 0
      src/main/java/com/jeeplus/modules/test/web/grid/CategoryController.java
  29. 225 0
      src/main/java/com/jeeplus/modules/test/web/grid/GoodsController.java
  30. 196 0
      src/main/java/com/jeeplus/modules/test/web/note/TestNoteController.java
  31. 196 0
      src/main/java/com/jeeplus/modules/test/web/one/FormLeaveController.java
  32. 196 0
      src/main/java/com/jeeplus/modules/test/web/onetomany/TestDataMainController.java
  33. 145 0
      src/main/java/com/jeeplus/modules/test/web/tree/TestTreeController.java
  34. 194 0
      src/main/java/com/jeeplus/modules/test/web/validation/TestValidationController.java
  35. 18 0
      src/main/java/com/jeeplus/modules/tools/dao/TestInterfaceDao.java
  36. 105 0
      src/main/java/com/jeeplus/modules/tools/entity/TestInterface.java
  37. 47 0
      src/main/java/com/jeeplus/modules/tools/service/TestInterfaceService.java
  38. 146 0
      src/main/java/com/jeeplus/modules/tools/utils/HttpPostTest.java
  39. 262 0
      src/main/java/com/jeeplus/modules/tools/utils/TwoDimensionCode.java
  40. 35 0
      src/main/java/com/jeeplus/modules/tools/utils/TwoDimensionCodeImage.java
  41. 34 0
      src/main/java/com/jeeplus/modules/tools/web/BeautifyHtmlController.java
  42. 59 0
      src/main/java/com/jeeplus/modules/tools/web/EmailController.java
  43. 68 0
      src/main/java/com/jeeplus/modules/tools/web/SMSController.java
  44. 264 0
      src/main/java/com/jeeplus/modules/tools/web/TestInterfaceController.java
  45. 107 0
      src/main/java/com/jeeplus/modules/tools/web/TwoDimensionCodeController.java
  46. 32 0
      src/main/java/com/jeeplus/modules/utils/ErrorCode.java
  47. 30 0
      src/main/java/com/jeeplus/modules/wexinpackage/access/entity/AccessToken.java
  48. 243 0
      src/main/java/com/jeeplus/modules/wexinpackage/access/entity/ChangeNumber.java
  49. 13 0
      src/main/java/com/jeeplus/modules/wexinpackage/access/entity/ChangeParty.java
  50. 202 0
      src/main/java/com/jeeplus/modules/wexinpackage/access/entity/WeChatUser.java
  51. 46 0
      src/main/java/com/jeeplus/modules/wexinpackage/access/entity/WxDepartment.java
  52. 9 0
      src/main/java/com/jeeplus/modules/wexinpackage/access/service/MessageService.java
  53. 247 0
      src/main/java/com/jeeplus/modules/wexinpackage/access/service/WeChatCallbackService.java
  54. 57 0
      src/main/java/com/jeeplus/modules/wexinpackage/access/util/access/AccessTokenUtil.java
  55. 89 0
      src/main/java/com/jeeplus/modules/wexinpackage/access/util/access/AddressBookUtil.java
  56. 75 0
      src/main/java/com/jeeplus/modules/wexinpackage/access/util/access/AddressDepartment.java
  57. 152 0
      src/main/java/com/jeeplus/modules/wexinpackage/access/util/access/ContactUtil.java
  58. 133 0
      src/main/java/com/jeeplus/modules/wexinpackage/access/util/access/RequestAccess.java
  59. 40 0
      src/main/java/com/jeeplus/modules/wexinpackage/access/util/access/WeChatParamsUtil.java
  60. 58 0
      src/main/java/com/jeeplus/modules/wexinpackage/access/util/encryption/AesException.java
  61. 26 0
      src/main/java/com/jeeplus/modules/wexinpackage/access/util/encryption/ByteGroup.java
  62. 67 0
      src/main/java/com/jeeplus/modules/wexinpackage/access/util/encryption/PKCS7Encoder.java
  63. 63 0
      src/main/java/com/jeeplus/modules/wexinpackage/access/util/encryption/SHA1.java
  64. 289 0
      src/main/java/com/jeeplus/modules/wexinpackage/access/util/encryption/WXBizMsgCrypt.java
  65. 107 0
      src/main/java/com/jeeplus/modules/wexinpackage/access/util/encryption/XMLParse.java
  66. 109 0
      src/main/java/com/jeeplus/modules/wexinpackage/access/web/MessageController.java
  67. 257 0
      src/main/java/com/jeeplus/modules/wexinpackage/access/web/WeChatCallbackController.java
  68. 43 0
      src/main/java/com/jeeplus/modules/work/dao/report/WorkReportDao.java
  69. 47 0
      src/main/java/com/jeeplus/modules/work/dao/report/WorkReportRecordDao.java
  70. 26 0
      src/main/java/com/jeeplus/modules/work/dao/review/WorkReportReviewDao.java
  71. 287 0
      src/main/java/com/jeeplus/modules/work/entity/report/WorkReport.java
  72. 88 0
      src/main/java/com/jeeplus/modules/work/entity/report/WorkReportRecord.java
  73. 78 0
      src/main/java/com/jeeplus/modules/work/entity/review/WorkReportReview.java
  74. 866 0
      src/main/java/com/jeeplus/modules/work/service/report/WorkReportService.java
  75. 75 0
      src/main/java/com/jeeplus/modules/work/service/review/WorkReportReviewService.java
  76. 447 0
      src/main/java/com/jeeplus/modules/work/web/report/WorkReportController.java
  77. 163 0
      src/main/java/com/jeeplus/modules/work/web/review/WorkReportReviewController.java
  78. 29 0
      src/main/java/com/jeeplus/modules/workactivity/dao/ActivityDao.java
  79. 36 0
      src/main/java/com/jeeplus/modules/workactivity/dao/WorkActivityProcessDao.java
  80. 172 0
      src/main/java/com/jeeplus/modules/workactivity/entity/Activity.java
  81. 103 0
      src/main/java/com/jeeplus/modules/workactivity/entity/WorkActivityProcess.java
  82. 63 0
      src/main/java/com/jeeplus/modules/workactivity/entity/WorkActivityProcessUser.java
  83. 234 0
      src/main/java/com/jeeplus/modules/workactivity/service/ActivityService.java
  84. 415 0
      src/main/java/com/jeeplus/modules/workactivity/service/WorkActivityProcessService.java
  85. 196 0
      src/main/java/com/jeeplus/modules/workactivity/web/ActivityController.java
  86. 25 0
      src/main/java/com/jeeplus/modules/workactivitymenu/dao/WorkActivityMenuDao.java
  87. 136 0
      src/main/java/com/jeeplus/modules/workactivitymenu/entity/WorkActivityMenu.java
  88. 244 0
      src/main/java/com/jeeplus/modules/workactivitymenu/service/WorkActivityMenuService.java
  89. 268 0
      src/main/java/com/jeeplus/modules/workactivitymenu/web/WorkActivityMenuController.java
  90. 22 0
      src/main/java/com/jeeplus/modules/workadministrativeatamp/dao/WorkAdministrativeAtampDao.java
  91. 176 0
      src/main/java/com/jeeplus/modules/workadministrativeatamp/entity/WorkAdministrativeAtamp.java
  92. 699 0
      src/main/java/com/jeeplus/modules/workadministrativeatamp/service/WorkAdministrativeAtampService.java
  93. 381 0
      src/main/java/com/jeeplus/modules/workadministrativeatamp/web/WorkAdministrativeAtampController.java
  94. 24 0
      src/main/java/com/jeeplus/modules/workaftermath/dao/WorkAftermathDao.java
  95. 165 0
      src/main/java/com/jeeplus/modules/workaftermath/entity/WorkAftermath.java
  96. 56 0
      src/main/java/com/jeeplus/modules/workaftermath/service/WorkAftermathService.java
  97. 474 0
      src/main/java/com/jeeplus/modules/workaftermath/web/WorkAftermathController.java
  98. 90 0
      src/main/java/com/jeeplus/modules/workaftermath/web/WorkBidingProjectMgController.java
  99. 72 0
      src/main/java/com/jeeplus/modules/workaftermath/web/WorkBidingProjectRdController.java
  100. 0 0
      src/main/java/com/jeeplus/modules/workapprovalcopy/dao/ApprovalCopyDao.java

+ 19 - 0
src/main/java/com/jeeplus/modules/test/dao/grid/CategoryDao.java

@@ -0,0 +1,19 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.test.dao.grid;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.test.entity.grid.Category;
+
+/**
+ * 商品分类DAO接口
+ * @author liugf
+ * @version 2016-10-04
+ */
+@MyBatisDao
+public interface CategoryDao extends CrudDao<Category> {
+
+	
+}

+ 22 - 0
src/main/java/com/jeeplus/modules/test/dao/grid/GoodsDao.java

@@ -0,0 +1,22 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.test.dao.grid;
+
+import com.jeeplus.modules.test.entity.grid.Category;
+import java.util.List;
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.test.entity.grid.Goods;
+
+/**
+ * 商品DAO接口
+ * @author liugf
+ * @version 2016-10-04
+ */
+@MyBatisDao
+public interface GoodsDao extends CrudDao<Goods> {
+
+	public List<Category> findListBycategory(Category category);
+	
+}

+ 19 - 0
src/main/java/com/jeeplus/modules/test/dao/note/TestNoteDao.java

@@ -0,0 +1,19 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.test.dao.note;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.test.entity.note.TestNote;
+
+/**
+ * 富文本测试DAO接口
+ * @author liugf
+ * @version 2016-10-04
+ */
+@MyBatisDao
+public interface TestNoteDao extends CrudDao<TestNote> {
+
+	
+}

+ 19 - 0
src/main/java/com/jeeplus/modules/test/dao/one/FormLeaveDao.java

@@ -0,0 +1,19 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.test.dao.one;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.test.entity.one.FormLeave;
+
+/**
+ * 请假表单DAO接口
+ * @author lgf
+ * @version 2016-10-06
+ */
+@MyBatisDao
+public interface FormLeaveDao extends CrudDao<FormLeave> {
+
+	
+}

+ 19 - 0
src/main/java/com/jeeplus/modules/test/dao/onetomany/TestDataChild2Dao.java

@@ -0,0 +1,19 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.test.dao.onetomany;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.test.entity.onetomany.TestDataChild2;
+
+/**
+ * 票务代理DAO接口
+ * @author liugf
+ * @version 2016-10-06
+ */
+@MyBatisDao
+public interface TestDataChild2Dao extends CrudDao<TestDataChild2> {
+
+	
+}

+ 19 - 0
src/main/java/com/jeeplus/modules/test/dao/onetomany/TestDataChild3Dao.java

@@ -0,0 +1,19 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.test.dao.onetomany;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.test.entity.onetomany.TestDataChild3;
+
+/**
+ * 票务代理DAO接口
+ * @author liugf
+ * @version 2016-10-06
+ */
+@MyBatisDao
+public interface TestDataChild3Dao extends CrudDao<TestDataChild3> {
+
+	
+}

+ 19 - 0
src/main/java/com/jeeplus/modules/test/dao/onetomany/TestDataChildDao.java

@@ -0,0 +1,19 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.test.dao.onetomany;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.test.entity.onetomany.TestDataChild;
+
+/**
+ * 票务代理DAO接口
+ * @author liugf
+ * @version 2016-10-06
+ */
+@MyBatisDao
+public interface TestDataChildDao extends CrudDao<TestDataChild> {
+
+	
+}

+ 19 - 0
src/main/java/com/jeeplus/modules/test/dao/onetomany/TestDataMainDao.java

@@ -0,0 +1,19 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.test.dao.onetomany;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.test.entity.onetomany.TestDataMain;
+
+/**
+ * 票务代理DAO接口
+ * @author liugf
+ * @version 2016-10-06
+ */
+@MyBatisDao
+public interface TestDataMainDao extends CrudDao<TestDataMain> {
+
+	
+}

+ 18 - 0
src/main/java/com/jeeplus/modules/test/dao/tree/TestTreeDao.java

@@ -0,0 +1,18 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.test.dao.tree;
+
+import com.jeeplus.common.persistence.TreeDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.test.entity.tree.TestTree;
+
+/**
+ * 组织机构DAO接口
+ * @author liugf
+ * @version 2016-10-04
+ */
+@MyBatisDao
+public interface TestTreeDao extends TreeDao<TestTree> {
+	
+}

+ 19 - 0
src/main/java/com/jeeplus/modules/test/dao/validation/TestValidationDao.java

@@ -0,0 +1,19 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.test.dao.validation;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.test.entity.validation.TestValidation;
+
+/**
+ * 测试校验功能DAO接口
+ * @author lgf
+ * @version 2016-10-05
+ */
+@MyBatisDao
+public interface TestValidationDao extends CrudDao<TestValidation> {
+
+	
+}

+ 37 - 0
src/main/java/com/jeeplus/modules/test/entity/grid/Category.java

@@ -0,0 +1,37 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.test.entity.grid;
+
+
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+
+/**
+ * 商品分类Entity
+ * @author liugf
+ * @version 2016-10-04
+ */
+public class Category extends DataEntity<Category> {
+	
+	private static final long serialVersionUID = 1L;
+	private String name;		// 类型名
+	
+	public Category() {
+		super();
+	}
+
+	public Category(String id){
+		super(id);
+	}
+
+	@ExcelField(title="类型名", align=2, sort=1)
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+	
+}

+ 58 - 0
src/main/java/com/jeeplus/modules/test/entity/grid/Goods.java

@@ -0,0 +1,58 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.test.entity.grid;
+
+import com.jeeplus.modules.test.entity.grid.Category;
+
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+
+/**
+ * 商品Entity
+ * @author liugf
+ * @version 2016-10-04
+ */
+public class Goods extends DataEntity<Goods> {
+	
+	private static final long serialVersionUID = 1L;
+	private String name;		// 商品名称
+	private Category category;		// 所属类型
+	private String price;		// 价格
+	
+	public Goods() {
+		super();
+	}
+
+	public Goods(String id){
+		super(id);
+	}
+
+	@ExcelField(title="商品名称", align=2, sort=1)
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+	
+	@ExcelField(title="所属类型", align=2, sort=2)
+	public Category getCategory() {
+		return category;
+	}
+
+	public void setCategory(Category category) {
+		this.category = category;
+	}
+	
+	@ExcelField(title="价格", align=2, sort=3)
+	public String getPrice() {
+		return price;
+	}
+
+	public void setPrice(String price) {
+		this.price = price;
+	}
+	
+}

+ 47 - 0
src/main/java/com/jeeplus/modules/test/entity/note/TestNote.java

@@ -0,0 +1,47 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.test.entity.note;
+
+
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+
+/**
+ * 富文本测试Entity
+ * @author liugf
+ * @version 2016-10-04
+ */
+public class TestNote extends DataEntity<TestNote> {
+	
+	private static final long serialVersionUID = 1L;
+	private String title;		// 标题
+	private String contents;		// 内容
+	
+	public TestNote() {
+		super();
+	}
+
+	public TestNote(String id){
+		super(id);
+	}
+
+	@ExcelField(title="标题", align=2, sort=7)
+	public String getTitle() {
+		return title;
+	}
+
+	public void setTitle(String title) {
+		this.title = title;
+	}
+	
+	@ExcelField(title="内容", align=2, sort=8)
+	public String getContents() {
+		return contents;
+	}
+
+	public void setContents(String contents) {
+		this.contents = contents;
+	}
+	
+}

+ 87 - 0
src/main/java/com/jeeplus/modules/test/entity/one/FormLeave.java

@@ -0,0 +1,87 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.test.entity.one;
+
+import com.jeeplus.modules.sys.entity.User;
+import javax.validation.constraints.NotNull;
+import com.jeeplus.modules.sys.entity.Office;
+import com.jeeplus.modules.sys.entity.Area;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+
+/**
+ * 请假表单Entity
+ * @author lgf
+ * @version 2016-10-06
+ */
+public class FormLeave extends DataEntity<FormLeave> {
+	
+	private static final long serialVersionUID = 1L;
+	private User tuser;		// 员工
+	private Office office;		// 归属部门
+	private Area area;		// 归属区域
+	private Date beginDate;		// 请假开始日期
+	private Date endDate;		// 请假结束日期
+	
+	public FormLeave() {
+		super();
+	}
+
+	public FormLeave(String id){
+		super(id);
+	}
+
+	@NotNull(message="员工不能为空")
+	@ExcelField(title="员工", fieldType=User.class, value="tuser.name", align=2, sort=1)
+	public User getTuser() {
+		return tuser;
+	}
+
+	public void setTuser(User tuser) {
+		this.tuser = tuser;
+	}
+	
+	@NotNull(message="归属部门不能为空")
+	@ExcelField(title="归属部门", fieldType=Office.class, value="office.name", align=2, sort=2)
+	public Office getOffice() {
+		return office;
+	}
+
+	public void setOffice(Office office) {
+		this.office = office;
+	}
+	
+	@ExcelField(title="归属区域", fieldType=Area.class, value="area.name", align=2, sort=3)
+	public Area getArea() {
+		return area;
+	}
+
+	public void setArea(Area area) {
+		this.area = area;
+	}
+	
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@ExcelField(title="请假开始日期", align=2, sort=4)
+	public Date getBeginDate() {
+		return beginDate;
+	}
+
+	public void setBeginDate(Date beginDate) {
+		this.beginDate = beginDate;
+	}
+	
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@ExcelField(title="请假结束日期", align=2, sort=5)
+	public Date getEndDate() {
+		return endDate;
+	}
+
+	public void setEndDate(Date endDate) {
+		this.endDate = endDate;
+	}
+	
+}

+ 89 - 0
src/main/java/com/jeeplus/modules/test/entity/onetomany/TestDataChild.java

@@ -0,0 +1,89 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.test.entity.onetomany;
+
+import com.jeeplus.modules.sys.entity.Area;
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+
+/**
+ * 票务代理Entity
+ * @author liugf
+ * @version 2016-10-06
+ */
+public class TestDataChild extends DataEntity<TestDataChild> {
+	
+	private static final long serialVersionUID = 1L;
+	private Area startArea;		// 出发地
+	private Area endArea;		// 目的地
+	private Date starttime;		// 出发时间
+	private Double price;		// 代理价格
+	private TestDataMain testDataMain;		// 业务主表ID 父类
+	
+	public TestDataChild() {
+		super();
+	}
+
+	public TestDataChild(String id){
+		super(id);
+	}
+
+	public TestDataChild(TestDataMain testDataMain){
+		this.testDataMain = testDataMain;
+	}
+
+	@NotNull(message="出发地不能为空")
+	@ExcelField(title="出发地", fieldType=Area.class, value="startArea.name", align=2, sort=1)
+	public Area getStartArea() {
+		return startArea;
+	}
+
+	public void setStartArea(Area startArea) {
+		this.startArea = startArea;
+	}
+	
+	@NotNull(message="目的地不能为空")
+	@ExcelField(title="目的地", fieldType=Area.class, value="endArea.name", align=2, sort=2)
+	public Area getEndArea() {
+		return endArea;
+	}
+
+	public void setEndArea(Area endArea) {
+		this.endArea = endArea;
+	}
+	
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@NotNull(message="出发时间不能为空")
+	@ExcelField(title="出发时间", align=2, sort=3)
+	public Date getStarttime() {
+		return starttime;
+	}
+
+	public void setStarttime(Date starttime) {
+		this.starttime = starttime;
+	}
+	
+	@NotNull(message="代理价格不能为空")
+	@ExcelField(title="代理价格", align=2, sort=4)
+	public Double getPrice() {
+		return price;
+	}
+
+	public void setPrice(Double price) {
+		this.price = price;
+	}
+	
+	public TestDataMain getTestDataMain() {
+		return testDataMain;
+	}
+
+	public void setTestDataMain(TestDataMain testDataMain) {
+		this.testDataMain = testDataMain;
+	}
+	
+}

+ 74 - 0
src/main/java/com/jeeplus/modules/test/entity/onetomany/TestDataChild2.java

@@ -0,0 +1,74 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.test.entity.onetomany;
+
+import com.jeeplus.modules.sys.entity.Area;
+import javax.validation.constraints.NotNull;
+
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+
+/**
+ * 票务代理Entity
+ * @author liugf
+ * @version 2016-10-06
+ */
+public class TestDataChild2 extends DataEntity<TestDataChild2> {
+	
+	private static final long serialVersionUID = 1L;
+	private Area startArea;		// 出发地
+	private Area endArea;		// 目的地
+	private Double price;		// 代理价格
+	private TestDataMain testDataMain;		// 外键 父类
+	
+	public TestDataChild2() {
+		super();
+	}
+
+	public TestDataChild2(String id){
+		super(id);
+	}
+
+	public TestDataChild2(TestDataMain testDataMain){
+		this.testDataMain = testDataMain;
+	}
+
+	@NotNull(message="出发地不能为空")
+	@ExcelField(title="出发地", fieldType=Area.class, value="startArea.name", align=2, sort=1)
+	public Area getStartArea() {
+		return startArea;
+	}
+
+	public void setStartArea(Area startArea) {
+		this.startArea = startArea;
+	}
+	
+	@NotNull(message="目的地不能为空")
+	@ExcelField(title="目的地", fieldType=Area.class, value="endArea.name", align=2, sort=2)
+	public Area getEndArea() {
+		return endArea;
+	}
+
+	public void setEndArea(Area endArea) {
+		this.endArea = endArea;
+	}
+	
+	@ExcelField(title="代理价格", align=2, sort=3)
+	public Double getPrice() {
+		return price;
+	}
+
+	public void setPrice(Double price) {
+		this.price = price;
+	}
+	
+	public TestDataMain getTestDataMain() {
+		return testDataMain;
+	}
+
+	public void setTestDataMain(TestDataMain testDataMain) {
+		this.testDataMain = testDataMain;
+	}
+	
+}

+ 74 - 0
src/main/java/com/jeeplus/modules/test/entity/onetomany/TestDataChild3.java

@@ -0,0 +1,74 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.test.entity.onetomany;
+
+import com.jeeplus.modules.sys.entity.Area;
+import javax.validation.constraints.NotNull;
+
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+
+/**
+ * 票务代理Entity
+ * @author liugf
+ * @version 2016-10-06
+ */
+public class TestDataChild3 extends DataEntity<TestDataChild3> {
+	
+	private static final long serialVersionUID = 1L;
+	private Area startArea;		// 出发地
+	private Area endArea;		// 目的地
+	private Double price;		// 代理价格
+	private TestDataMain testDataMain;		// 外键 父类
+	
+	public TestDataChild3() {
+		super();
+	}
+
+	public TestDataChild3(String id){
+		super(id);
+	}
+
+	public TestDataChild3(TestDataMain testDataMain){
+		this.testDataMain = testDataMain;
+	}
+
+	@NotNull(message="出发地不能为空")
+	@ExcelField(title="出发地", fieldType=Area.class, value="startArea.name", align=2, sort=1)
+	public Area getStartArea() {
+		return startArea;
+	}
+
+	public void setStartArea(Area startArea) {
+		this.startArea = startArea;
+	}
+	
+	@NotNull(message="目的地不能为空")
+	@ExcelField(title="目的地", fieldType=Area.class, value="endArea.name", align=2, sort=2)
+	public Area getEndArea() {
+		return endArea;
+	}
+
+	public void setEndArea(Area endArea) {
+		this.endArea = endArea;
+	}
+	
+	@ExcelField(title="代理价格", align=2, sort=3)
+	public Double getPrice() {
+		return price;
+	}
+
+	public void setPrice(Double price) {
+		this.price = price;
+	}
+	
+	public TestDataMain getTestDataMain() {
+		return testDataMain;
+	}
+
+	public void setTestDataMain(TestDataMain testDataMain) {
+		this.testDataMain = testDataMain;
+	}
+	
+}

+ 142 - 0
src/main/java/com/jeeplus/modules/test/entity/onetomany/TestDataMain.java

@@ -0,0 +1,142 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.test.entity.onetomany;
+
+import com.jeeplus.modules.sys.entity.User;
+import javax.validation.constraints.NotNull;
+import com.jeeplus.modules.sys.entity.Office;
+import com.jeeplus.modules.sys.entity.Area;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.util.List;
+import com.google.common.collect.Lists;
+
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+
+/**
+ * 票务代理Entity
+ * @author liugf
+ * @version 2016-10-06
+ */
+public class TestDataMain extends DataEntity<TestDataMain> {
+	
+	private static final long serialVersionUID = 1L;
+	private User tuser;		// 归属用户
+	private Office office;		// 归属部门
+	private Area area;		// 归属区域
+	private String name;		// 名称
+	private String sex;		// 性别
+	private Date inDate;		// 加入日期
+	private Date beginInDate;		// 开始 加入日期
+	private Date endInDate;		// 结束 加入日期
+	private List<TestDataChild> testDataChildList = Lists.newArrayList();		// 子表列表
+	private List<TestDataChild2> testDataChild2List = Lists.newArrayList();		// 子表列表
+	private List<TestDataChild3> testDataChild3List = Lists.newArrayList();		// 子表列表
+	
+	public TestDataMain() {
+		super();
+	}
+
+	public TestDataMain(String id){
+		super(id);
+	}
+
+	@NotNull(message="归属用户不能为空")
+	@ExcelField(title="归属用户", fieldType=User.class, value="tuser.name", align=2, sort=1)
+	public User getTuser() {
+		return tuser;
+	}
+
+	public void setTuser(User tuser) {
+		this.tuser = tuser;
+	}
+	
+	@NotNull(message="归属部门不能为空")
+	@ExcelField(title="归属部门", fieldType=Office.class, value="office.name", align=2, sort=2)
+	public Office getOffice() {
+		return office;
+	}
+
+	public void setOffice(Office office) {
+		this.office = office;
+	}
+	
+	@NotNull(message="归属区域不能为空")
+	@ExcelField(title="归属区域", fieldType=Area.class, value="area.name", align=2, sort=3)
+	public Area getArea() {
+		return area;
+	}
+
+	public void setArea(Area area) {
+		this.area = area;
+	}
+	
+	@ExcelField(title="名称", align=2, sort=4)
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+	
+	@ExcelField(title="性别", dictType="sex", align=2, sort=5)
+	public String getSex() {
+		return sex;
+	}
+
+	public void setSex(String sex) {
+		this.sex = sex;
+	}
+	
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@NotNull(message="加入日期不能为空")
+	@ExcelField(title="加入日期", align=2, sort=6)
+	public Date getInDate() {
+		return inDate;
+	}
+
+	public void setInDate(Date inDate) {
+		this.inDate = inDate;
+	}
+	
+	public Date getBeginInDate() {
+		return beginInDate;
+	}
+
+	public void setBeginInDate(Date beginInDate) {
+		this.beginInDate = beginInDate;
+	}
+	
+	public Date getEndInDate() {
+		return endInDate;
+	}
+
+	public void setEndInDate(Date endInDate) {
+		this.endInDate = endInDate;
+	}
+		
+	public List<TestDataChild> getTestDataChildList() {
+		return testDataChildList;
+	}
+
+	public void setTestDataChildList(List<TestDataChild> testDataChildList) {
+		this.testDataChildList = testDataChildList;
+	}
+	public List<TestDataChild2> getTestDataChild2List() {
+		return testDataChild2List;
+	}
+
+	public void setTestDataChild2List(List<TestDataChild2> testDataChild2List) {
+		this.testDataChild2List = testDataChild2List;
+	}
+	public List<TestDataChild3> getTestDataChild3List() {
+		return testDataChild3List;
+	}
+
+	public void setTestDataChild3List(List<TestDataChild3> testDataChild3List) {
+		this.testDataChild3List = testDataChild3List;
+	}
+}

+ 70 - 0
src/main/java/com/jeeplus/modules/test/entity/tree/TestTree.java

@@ -0,0 +1,70 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.test.entity.tree;
+
+import javax.validation.constraints.NotNull;
+import com.fasterxml.jackson.annotation.JsonBackReference;
+
+import com.jeeplus.common.persistence.TreeEntity;
+
+/**
+ * 组织机构Entity
+ * @author liugf
+ * @version 2016-10-04
+ */
+public class TestTree extends TreeEntity<TestTree> {
+	
+	private static final long serialVersionUID = 1L;
+	private String name;		// 名称
+	private Integer sort;		// 排序
+	private TestTree parent;		// 父级编号
+	private String parentIds;		// 所有父级编号
+	
+	public TestTree() {
+		super();
+	}
+
+	public TestTree(String id){
+		super(id);
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+	
+	@NotNull(message="排序不能为空")
+	public Integer getSort() {
+		return sort;
+	}
+
+	public void setSort(Integer sort) {
+		this.sort = sort;
+	}
+	
+	@JsonBackReference
+	@NotNull(message="父级编号不能为空")
+	public TestTree getParent() {
+		return parent;
+	}
+
+	public void setParent(TestTree parent) {
+		this.parent = parent;
+	}
+	
+	public String getParentIds() {
+		return parentIds;
+	}
+
+	public void setParentIds(String parentIds) {
+		this.parentIds = parentIds;
+	}
+	
+	public String getParentId() {
+		return parent != null && parent.getId() != null ? parent.getId() : "0";
+	}
+}

+ 104 - 0
src/main/java/com/jeeplus/modules/test/entity/validation/TestValidation.java

@@ -0,0 +1,104 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.test.entity.validation;
+
+import javax.validation.constraints.Min;
+import javax.validation.constraints.Max;
+import javax.validation.constraints.NotNull;
+import org.hibernate.validator.constraints.Length;
+import org.hibernate.validator.constraints.Email;
+import org.hibernate.validator.constraints.URL;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+
+/**
+ * 测试校验功能Entity
+ * @author lgf
+ * @version 2016-10-05
+ */
+public class TestValidation extends DataEntity<TestValidation> {
+	
+	private static final long serialVersionUID = 1L;
+	private Double num;		// 浮点数字
+	private Integer num2;		// 整数
+	private String str;		// 字符串
+	private String email;		// 邮件
+	private String url;		// 网址
+	private Date newDate;		// 日期
+	
+	public TestValidation() {
+		super();
+	}
+
+	public TestValidation(String id){
+		super(id);
+	}
+
+	@Min(value=(long)20.1,message="浮点数字的最小值不能小于20.1")
+	@Max(value=(long)69.3,message="浮点数字的最大值不能超过69.3")
+	@ExcelField(title="浮点数字", align=2, sort=1)
+	public Double getNum() {
+		return num;
+	}
+
+	public void setNum(Double num) {
+		this.num = num;
+	}
+	
+	@NotNull(message="整数不能为空")
+	@Min(value=10,message="整数的最小值不能小于10")
+	@Max(value=30,message="整数的最大值不能超过30")
+	@ExcelField(title="整数", align=2, sort=2)
+	public Integer getNum2() {
+		return num2;
+	}
+
+	public void setNum2(Integer num2) {
+		this.num2 = num2;
+	}
+	
+	@Length(min=5, max=65, message="字符串长度必须介于 5 和 65 之间")
+	@ExcelField(title="字符串", align=2, sort=3)
+	public String getStr() {
+		return str;
+	}
+
+	public void setStr(String str) {
+		this.str = str;
+	}
+	
+	@Email(message="邮件必须为合法邮箱")
+	@ExcelField(title="邮件", align=2, sort=4)
+	public String getEmail() {
+		return email;
+	}
+
+	public void setEmail(String email) {
+		this.email = email;
+	}
+	
+	@URL(message="网址必须为合法网址")
+	@ExcelField(title="网址", align=2, sort=5)
+	public String getUrl() {
+		return url;
+	}
+
+	public void setUrl(String url) {
+		this.url = url;
+	}
+	
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@ExcelField(title="日期", align=2, sort=6)
+	public Date getNewDate() {
+		return newDate;
+	}
+
+	public void setNewDate(Date newDate) {
+		this.newDate = newDate;
+	}
+	
+}

+ 50 - 0
src/main/java/com/jeeplus/modules/test/service/grid/CategoryService.java

@@ -0,0 +1,50 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.test.service.grid;
+
+import java.util.List;
+
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.service.CrudService;
+import com.jeeplus.modules.test.entity.grid.Category;
+import com.jeeplus.modules.test.dao.grid.CategoryDao;
+
+/**
+ * 商品分类Service
+ * @author liugf
+ * @version 2016-10-04
+ */
+@Service
+@Transactional(readOnly = true)
+public class CategoryService extends CrudService<CategoryDao, Category> {
+
+	public Category get(String id) {
+		return super.get(id);
+	}
+	
+	public List<Category> findList(Category category) {
+		return super.findList(category);
+	}
+	
+	public Page<Category> findPage(Page<Category> page, Category category) {
+		return super.findPage(page, category);
+	}
+	
+	@Transactional(readOnly = false)
+	public void save(Category category) {
+		super.save(category);
+	}
+	
+	@Transactional(readOnly = false)
+	public void delete(Category category) {
+		super.delete(category);
+	}
+	
+	
+	
+	
+}

+ 56 - 0
src/main/java/com/jeeplus/modules/test/service/grid/GoodsService.java

@@ -0,0 +1,56 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.test.service.grid;
+
+import java.util.List;
+
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.jeeplus.modules.test.entity.grid.Category;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.service.CrudService;
+import com.jeeplus.modules.test.entity.grid.Goods;
+import com.jeeplus.modules.test.dao.grid.GoodsDao;
+
+/**
+ * 商品Service
+ * @author liugf
+ * @version 2016-10-04
+ */
+@Service
+@Transactional(readOnly = true)
+public class GoodsService extends CrudService<GoodsDao, Goods> {
+
+	public Goods get(String id) {
+		return super.get(id);
+	}
+	
+	public List<Goods> findList(Goods goods) {
+		return super.findList(goods);
+	}
+	
+	public Page<Goods> findPage(Page<Goods> page, Goods goods) {
+		return super.findPage(page, goods);
+	}
+	
+	@Transactional(readOnly = false)
+	public void save(Goods goods) {
+		super.save(goods);
+	}
+	
+	@Transactional(readOnly = false)
+	public void delete(Goods goods) {
+		super.delete(goods);
+	}
+	
+	public Page<Category> findPageBycategory(Page<Category> page, Category category) {
+		category.setPage(page);
+		page.setList(dao.findListBycategory(category));
+		return page;
+	}
+	
+	
+	
+}

+ 50 - 0
src/main/java/com/jeeplus/modules/test/service/note/TestNoteService.java

@@ -0,0 +1,50 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.test.service.note;
+
+import java.util.List;
+
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.service.CrudService;
+import com.jeeplus.modules.test.entity.note.TestNote;
+import com.jeeplus.modules.test.dao.note.TestNoteDao;
+
+/**
+ * 富文本测试Service
+ * @author liugf
+ * @version 2016-10-04
+ */
+@Service
+@Transactional(readOnly = true)
+public class TestNoteService extends CrudService<TestNoteDao, TestNote> {
+
+	public TestNote get(String id) {
+		return super.get(id);
+	}
+	
+	public List<TestNote> findList(TestNote testNote) {
+		return super.findList(testNote);
+	}
+	
+	public Page<TestNote> findPage(Page<TestNote> page, TestNote testNote) {
+		return super.findPage(page, testNote);
+	}
+	
+	@Transactional(readOnly = false)
+	public void save(TestNote testNote) {
+		super.save(testNote);
+	}
+	
+	@Transactional(readOnly = false)
+	public void delete(TestNote testNote) {
+		super.delete(testNote);
+	}
+	
+	
+	
+	
+}

+ 50 - 0
src/main/java/com/jeeplus/modules/test/service/one/FormLeaveService.java

@@ -0,0 +1,50 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.test.service.one;
+
+import java.util.List;
+
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.service.CrudService;
+import com.jeeplus.modules.test.entity.one.FormLeave;
+import com.jeeplus.modules.test.dao.one.FormLeaveDao;
+
+/**
+ * 请假表单Service
+ * @author lgf
+ * @version 2016-10-06
+ */
+@Service
+@Transactional(readOnly = true)
+public class FormLeaveService extends CrudService<FormLeaveDao, FormLeave> {
+
+	public FormLeave get(String id) {
+		return super.get(id);
+	}
+	
+	public List<FormLeave> findList(FormLeave formLeave) {
+		return super.findList(formLeave);
+	}
+	
+	public Page<FormLeave> findPage(Page<FormLeave> page, FormLeave formLeave) {
+		return super.findPage(page, formLeave);
+	}
+	
+	@Transactional(readOnly = false)
+	public void save(FormLeave formLeave) {
+		super.save(formLeave);
+	}
+	
+	@Transactional(readOnly = false)
+	public void delete(FormLeave formLeave) {
+		super.delete(formLeave);
+	}
+	
+	
+	
+	
+}

+ 120 - 0
src/main/java/com/jeeplus/modules/test/service/onetomany/TestDataMainService.java

@@ -0,0 +1,120 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.test.service.onetomany;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.service.CrudService;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.modules.test.entity.onetomany.TestDataMain;
+import com.jeeplus.modules.test.dao.onetomany.TestDataMainDao;
+import com.jeeplus.modules.test.entity.onetomany.TestDataChild;
+import com.jeeplus.modules.test.dao.onetomany.TestDataChildDao;
+import com.jeeplus.modules.test.entity.onetomany.TestDataChild2;
+import com.jeeplus.modules.test.dao.onetomany.TestDataChild2Dao;
+import com.jeeplus.modules.test.entity.onetomany.TestDataChild3;
+import com.jeeplus.modules.test.dao.onetomany.TestDataChild3Dao;
+
+/**
+ * 票务代理Service
+ * @author liugf
+ * @version 2016-10-06
+ */
+@Service
+@Transactional(readOnly = true)
+public class TestDataMainService extends CrudService<TestDataMainDao, TestDataMain> {
+
+	@Autowired
+	private TestDataChildDao testDataChildDao;
+	@Autowired
+	private TestDataChild2Dao testDataChild2Dao;
+	@Autowired
+	private TestDataChild3Dao testDataChild3Dao;
+	
+	public TestDataMain get(String id) {
+		TestDataMain testDataMain = super.get(id);
+		testDataMain.setTestDataChildList(testDataChildDao.findList(new TestDataChild(testDataMain)));
+		testDataMain.setTestDataChild2List(testDataChild2Dao.findList(new TestDataChild2(testDataMain)));
+		testDataMain.setTestDataChild3List(testDataChild3Dao.findList(new TestDataChild3(testDataMain)));
+		return testDataMain;
+	}
+	
+	public List<TestDataMain> findList(TestDataMain testDataMain) {
+		return super.findList(testDataMain);
+	}
+	
+	public Page<TestDataMain> findPage(Page<TestDataMain> page, TestDataMain testDataMain) {
+		return super.findPage(page, testDataMain);
+	}
+	
+	@Transactional(readOnly = false)
+	public void save(TestDataMain testDataMain) {
+		super.save(testDataMain);
+		for (TestDataChild testDataChild : testDataMain.getTestDataChildList()){
+			if (testDataChild.getId() == null){
+				continue;
+			}
+			if (TestDataChild.DEL_FLAG_NORMAL.equals(testDataChild.getDelFlag())){
+				if (StringUtils.isBlank(testDataChild.getId())){
+					testDataChild.setTestDataMain(testDataMain);
+					testDataChild.preInsert();
+					testDataChildDao.insert(testDataChild);
+				}else{
+					testDataChild.preUpdate();
+					testDataChildDao.update(testDataChild);
+				}
+			}else{
+				testDataChildDao.delete(testDataChild);
+			}
+		}
+		for (TestDataChild2 testDataChild2 : testDataMain.getTestDataChild2List()){
+			if (testDataChild2.getId() == null){
+				continue;
+			}
+			if (TestDataChild2.DEL_FLAG_NORMAL.equals(testDataChild2.getDelFlag())){
+				if (StringUtils.isBlank(testDataChild2.getId())){
+					testDataChild2.setTestDataMain(testDataMain);
+					testDataChild2.preInsert();
+					testDataChild2Dao.insert(testDataChild2);
+				}else{
+					testDataChild2.preUpdate();
+					testDataChild2Dao.update(testDataChild2);
+				}
+			}else{
+				testDataChild2Dao.delete(testDataChild2);
+			}
+		}
+		for (TestDataChild3 testDataChild3 : testDataMain.getTestDataChild3List()){
+			if (testDataChild3.getId() == null){
+				continue;
+			}
+			if (TestDataChild3.DEL_FLAG_NORMAL.equals(testDataChild3.getDelFlag())){
+				if (StringUtils.isBlank(testDataChild3.getId())){
+					testDataChild3.setTestDataMain(testDataMain);
+					testDataChild3.preInsert();
+					testDataChild3Dao.insert(testDataChild3);
+				}else{
+					testDataChild3.preUpdate();
+					testDataChild3Dao.update(testDataChild3);
+				}
+			}else{
+				testDataChild3Dao.delete(testDataChild3);
+			}
+		}
+	}
+	
+	@Transactional(readOnly = false)
+	public void delete(TestDataMain testDataMain) {
+		super.delete(testDataMain);
+		testDataChildDao.delete(new TestDataChild(testDataMain));
+		testDataChild2Dao.delete(new TestDataChild2(testDataMain));
+		testDataChild3Dao.delete(new TestDataChild3(testDataMain));
+	}
+	
+}

+ 46 - 0
src/main/java/com/jeeplus/modules/test/service/tree/TestTreeService.java

@@ -0,0 +1,46 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.test.service.tree;
+
+import java.util.List;
+
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.jeeplus.common.service.TreeService;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.modules.test.entity.tree.TestTree;
+import com.jeeplus.modules.test.dao.tree.TestTreeDao;
+
+/**
+ * 组织机构Service
+ * @author liugf
+ * @version 2016-10-04
+ */
+@Service
+@Transactional(readOnly = true)
+public class TestTreeService extends TreeService<TestTreeDao, TestTree> {
+
+	public TestTree get(String id) {
+		return super.get(id);
+	}
+	
+	public List<TestTree> findList(TestTree testTree) {
+		if (StringUtils.isNotBlank(testTree.getParentIds())){
+			testTree.setParentIds(","+testTree.getParentIds()+",");
+		}
+		return super.findList(testTree);
+	}
+	
+	@Transactional(readOnly = false)
+	public void save(TestTree testTree) {
+		super.save(testTree);
+	}
+	
+	@Transactional(readOnly = false)
+	public void delete(TestTree testTree) {
+		super.delete(testTree);
+	}
+	
+}

+ 50 - 0
src/main/java/com/jeeplus/modules/test/service/validation/TestValidationService.java

@@ -0,0 +1,50 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.test.service.validation;
+
+import java.util.List;
+
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.service.CrudService;
+import com.jeeplus.modules.test.entity.validation.TestValidation;
+import com.jeeplus.modules.test.dao.validation.TestValidationDao;
+
+/**
+ * 测试校验功能Service
+ * @author lgf
+ * @version 2016-10-05
+ */
+@Service
+@Transactional(readOnly = true)
+public class TestValidationService extends CrudService<TestValidationDao, TestValidation> {
+
+	public TestValidation get(String id) {
+		return super.get(id);
+	}
+	
+	public List<TestValidation> findList(TestValidation testValidation) {
+		return super.findList(testValidation);
+	}
+	
+	public Page<TestValidation> findPage(Page<TestValidation> page, TestValidation testValidation) {
+		return super.findPage(page, testValidation);
+	}
+	
+	@Transactional(readOnly = false)
+	public void save(TestValidation testValidation) {
+		super.save(testValidation);
+	}
+	
+	@Transactional(readOnly = false)
+	public void delete(TestValidation testValidation) {
+		super.delete(testValidation);
+	}
+	
+	
+	
+	
+}

+ 196 - 0
src/main/java/com/jeeplus/modules/test/web/grid/CategoryController.java

@@ -0,0 +1,196 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.test.web.grid;
+
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.ConstraintViolationException;
+
+import org.apache.shiro.authz.annotation.Logical;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import com.google.common.collect.Lists;
+import com.jeeplus.common.utils.DateUtils;
+import com.jeeplus.common.utils.MyBeanUtils;
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.utils.excel.ExportExcel;
+import com.jeeplus.common.utils.excel.ImportExcel;
+import com.jeeplus.modules.test.entity.grid.Category;
+import com.jeeplus.modules.test.service.grid.CategoryService;
+
+/**
+ * 商品分类Controller
+ * @author liugf
+ * @version 2016-10-04
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/test/grid/category")
+public class CategoryController extends BaseController {
+
+	@Autowired
+	private CategoryService categoryService;
+	
+	@ModelAttribute
+	public Category get(@RequestParam(required=false) String id) {
+		Category entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = categoryService.get(id);
+		}
+		if (entity == null){
+			entity = new Category();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 商品分类列表页面
+	 */
+	@RequiresPermissions("test:grid:category:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(Category category, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<Category> page = categoryService.findPage(new Page<Category>(request, response), category); 
+		model.addAttribute("page", page);
+		return "modules/test/grid/categoryList";
+	}
+
+	/**
+	 * 查看,增加,编辑商品分类表单页面
+	 */
+	@RequiresPermissions(value={"test:grid:category:view","test:grid:category:add","test:grid:category:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(Category category, Model model) {
+		model.addAttribute("category", category);
+		return "modules/test/grid/categoryForm";
+	}
+
+	/**
+	 * 保存商品分类
+	 */
+	@RequiresPermissions(value={"test:grid:category:add","test:grid:category:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	public String save(Category category, Model model, RedirectAttributes redirectAttributes) throws Exception{
+		if (!beanValidator(model, category)){
+			return form(category, model);
+		}
+		if(!category.getIsNewRecord()){//编辑表单保存
+			Category t = categoryService.get(category.getId());//从数据库取出记录的值
+			MyBeanUtils.copyBeanNotNull2Bean(category, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+			categoryService.save(t);//保存
+		}else{//新增表单保存
+			categoryService.save(category);//保存
+		}
+		addMessage(redirectAttributes, "保存商品分类成功");
+		return "redirect:"+Global.getAdminPath()+"/test/grid/category/?repage";
+	}
+	
+	/**
+	 * 删除商品分类
+	 */
+	@RequiresPermissions("test:grid:category:del")
+	@RequestMapping(value = "delete")
+	public String delete(Category category, RedirectAttributes redirectAttributes) {
+		categoryService.delete(category);
+		addMessage(redirectAttributes, "删除商品分类成功");
+		return "redirect:"+Global.getAdminPath()+"/test/grid/category/?repage";
+	}
+	
+	/**
+	 * 批量删除商品分类
+	 */
+	@RequiresPermissions("test:grid:category:del")
+	@RequestMapping(value = "deleteAll")
+	public String deleteAll(String ids, RedirectAttributes redirectAttributes) {
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			categoryService.delete(categoryService.get(id));
+		}
+		addMessage(redirectAttributes, "删除商品分类成功");
+		return "redirect:"+Global.getAdminPath()+"/test/grid/category/?repage";
+	}
+	
+	/**
+	 * 导出excel文件
+	 */
+	@RequiresPermissions("test:grid:category:export")
+    @RequestMapping(value = "export", method=RequestMethod.POST)
+    public String exportFile(Category category, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "商品分类"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            Page<Category> page = categoryService.findPage(new Page<Category>(request, response, -1), category);
+    		new ExportExcel("商品分类", Category.class).setDataList(page.getList()).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导出商品分类记录失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/test/grid/category/?repage";
+    }
+
+	/**
+	 * 导入Excel数据
+
+	 */
+	@RequiresPermissions("test:grid:category:import")
+    @RequestMapping(value = "import", method=RequestMethod.POST)
+    public String importFile(MultipartFile file, RedirectAttributes redirectAttributes) {
+		try {
+			int successNum = 0;
+			int failureNum = 0;
+			StringBuilder failureMsg = new StringBuilder();
+			ImportExcel ei = new ImportExcel(file, 1, 0);
+			List<Category> list = ei.getDataList(Category.class);
+			for (Category category : list){
+				try{
+					categoryService.save(category);
+					successNum++;
+				}catch(ConstraintViolationException ex){
+					failureNum++;
+				}catch (Exception ex) {
+					failureNum++;
+				}
+			}
+			if (failureNum>0){
+				failureMsg.insert(0, ",失败 "+failureNum+" 条商品分类记录。");
+			}
+			addMessage(redirectAttributes, "已成功导入 "+successNum+" 条商品分类记录"+failureMsg);
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入商品分类失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/test/grid/category/?repage";
+    }
+	
+	/**
+	 * 下载导入商品分类数据模板
+	 */
+	@RequiresPermissions("test:grid:category:import")
+    @RequestMapping(value = "import/template")
+    public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "商品分类数据导入模板.xlsx";
+    		List<Category> list = Lists.newArrayList(); 
+    		new ExportExcel("商品分类数据", Category.class, 1).setDataList(list).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入模板下载失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/test/grid/category/?repage";
+    }
+	
+	
+	
+
+}

+ 225 - 0
src/main/java/com/jeeplus/modules/test/web/grid/GoodsController.java

@@ -0,0 +1,225 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.test.web.grid;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.ConstraintViolationException;
+
+import org.apache.shiro.authz.annotation.Logical;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import com.jeeplus.modules.test.entity.grid.Category;
+import com.google.common.collect.Lists;
+import com.jeeplus.common.utils.DateUtils;
+import com.jeeplus.common.utils.MyBeanUtils;
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.utils.excel.ExportExcel;
+import com.jeeplus.common.utils.excel.ImportExcel;
+import com.jeeplus.modules.test.entity.grid.Goods;
+import com.jeeplus.modules.test.service.grid.GoodsService;
+
+/**
+ * 商品Controller
+ * @author liugf
+ * @version 2016-10-04
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/test/grid/goods")
+public class GoodsController extends BaseController {
+
+	@Autowired
+	private GoodsService goodsService;
+	
+	@ModelAttribute
+	public Goods get(@RequestParam(required=false) String id) {
+		Goods entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = goodsService.get(id);
+		}
+		if (entity == null){
+			entity = new Goods();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 商品列表页面
+	 */
+	@RequiresPermissions("test:grid:goods:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(Goods goods, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<Goods> page = goodsService.findPage(new Page<Goods>(request, response), goods); 
+		model.addAttribute("page", page);
+		return "modules/test/grid/goodsList";
+	}
+
+	/**
+	 * 查看,增加,编辑商品表单页面
+	 */
+	@RequiresPermissions(value={"test:grid:goods:view","test:grid:goods:add","test:grid:goods:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(Goods goods, Model model) {
+		model.addAttribute("goods", goods);
+		return "modules/test/grid/goodsForm";
+	}
+
+	/**
+	 * 保存商品
+	 */
+	@RequiresPermissions(value={"test:grid:goods:add","test:grid:goods:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	public String save(Goods goods, Model model, RedirectAttributes redirectAttributes) throws Exception{
+		if (!beanValidator(model, goods)){
+			return form(goods, model);
+		}
+		if(!goods.getIsNewRecord()){//编辑表单保存
+			Goods t = goodsService.get(goods.getId());//从数据库取出记录的值
+			MyBeanUtils.copyBeanNotNull2Bean(goods, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+			goodsService.save(t);//保存
+		}else{//新增表单保存
+			goodsService.save(goods);//保存
+		}
+		addMessage(redirectAttributes, "保存商品成功");
+		return "redirect:"+Global.getAdminPath()+"/test/grid/goods/?repage";
+	}
+	
+	/**
+	 * 删除商品
+	 */
+	@RequiresPermissions("test:grid:goods:del")
+	@RequestMapping(value = "delete")
+	public String delete(Goods goods, RedirectAttributes redirectAttributes) {
+		goodsService.delete(goods);
+		addMessage(redirectAttributes, "删除商品成功");
+		return "redirect:"+Global.getAdminPath()+"/test/grid/goods/?repage";
+	}
+	
+	/**
+	 * 批量删除商品
+	 */
+	@RequiresPermissions("test:grid:goods:del")
+	@RequestMapping(value = "deleteAll")
+	public String deleteAll(String ids, RedirectAttributes redirectAttributes) {
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			goodsService.delete(goodsService.get(id));
+		}
+		addMessage(redirectAttributes, "删除商品成功");
+		return "redirect:"+Global.getAdminPath()+"/test/grid/goods/?repage";
+	}
+	
+	/**
+	 * 导出excel文件
+	 */
+	@RequiresPermissions("test:grid:goods:export")
+    @RequestMapping(value = "export", method=RequestMethod.POST)
+    public String exportFile(Goods goods, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "商品"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            Page<Goods> page = goodsService.findPage(new Page<Goods>(request, response, -1), goods);
+    		new ExportExcel("商品", Goods.class).setDataList(page.getList()).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导出商品记录失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/test/grid/goods/?repage";
+    }
+
+	/**
+	 * 导入Excel数据
+
+	 */
+	@RequiresPermissions("test:grid:goods:import")
+    @RequestMapping(value = "import", method=RequestMethod.POST)
+    public String importFile(MultipartFile file, RedirectAttributes redirectAttributes) {
+		try {
+			int successNum = 0;
+			int failureNum = 0;
+			StringBuilder failureMsg = new StringBuilder();
+			ImportExcel ei = new ImportExcel(file, 1, 0);
+			List<Goods> list = ei.getDataList(Goods.class);
+			for (Goods goods : list){
+				try{
+					goodsService.save(goods);
+					successNum++;
+				}catch(ConstraintViolationException ex){
+					failureNum++;
+				}catch (Exception ex) {
+					failureNum++;
+				}
+			}
+			if (failureNum>0){
+				failureMsg.insert(0, ",失败 "+failureNum+" 条商品记录。");
+			}
+			addMessage(redirectAttributes, "已成功导入 "+successNum+" 条商品记录"+failureMsg);
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入商品失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/test/grid/goods/?repage";
+    }
+	
+	/**
+	 * 下载导入商品数据模板
+	 */
+	@RequiresPermissions("test:grid:goods:import")
+    @RequestMapping(value = "import/template")
+    public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "商品数据导入模板.xlsx";
+    		List<Goods> list = Lists.newArrayList(); 
+    		new ExportExcel("商品数据", Goods.class, 1).setDataList(list).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入模板下载失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/test/grid/goods/?repage";
+    }
+	
+	
+	/**
+	 * 选择所属类型
+	 * @throws UnsupportedEncodingException 
+	 */
+	@RequestMapping(value = "selectcategory")
+	public String selectcategory(Category category, String url, String fieldLabels, String fieldKeys, String searchLabel, String searchKey, HttpServletRequest request, HttpServletResponse response, Model model) throws UnsupportedEncodingException {
+		Page<Category> page = goodsService.findPageBycategory(new Page<Category>(request, response),  category);
+		try {
+			fieldLabels = URLDecoder.decode(fieldLabels, "UTF-8");
+			fieldKeys = URLDecoder.decode(fieldKeys, "UTF-8");
+			searchLabel = URLDecoder.decode(searchLabel, "UTF-8");
+			searchKey = URLDecoder.decode(searchKey, "UTF-8");
+		} catch (UnsupportedEncodingException e) {
+			e.printStackTrace();
+		}
+		model.addAttribute("labelNames", fieldLabels.split("\\|"));
+		model.addAttribute("labelValues", fieldKeys.split("\\|"));
+		model.addAttribute("fieldLabels", fieldLabels);
+		model.addAttribute("fieldKeys", fieldKeys);
+		model.addAttribute("url", url);
+		model.addAttribute("searchLabel", searchLabel);
+		model.addAttribute("searchKey", searchKey);
+		model.addAttribute("obj", category);
+		model.addAttribute("page", page);
+		return "modules/sys/gridselect";
+	}
+	
+
+}

+ 196 - 0
src/main/java/com/jeeplus/modules/test/web/note/TestNoteController.java

@@ -0,0 +1,196 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.test.web.note;
+
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.ConstraintViolationException;
+
+import org.apache.shiro.authz.annotation.Logical;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import com.google.common.collect.Lists;
+import com.jeeplus.common.utils.DateUtils;
+import com.jeeplus.common.utils.MyBeanUtils;
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.utils.excel.ExportExcel;
+import com.jeeplus.common.utils.excel.ImportExcel;
+import com.jeeplus.modules.test.entity.note.TestNote;
+import com.jeeplus.modules.test.service.note.TestNoteService;
+
+/**
+ * 富文本测试Controller
+ * @author liugf
+ * @version 2016-10-04
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/test/note/testNote")
+public class TestNoteController extends BaseController {
+
+	@Autowired
+	private TestNoteService testNoteService;
+	
+	@ModelAttribute
+	public TestNote get(@RequestParam(required=false) String id) {
+		TestNote entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = testNoteService.get(id);
+		}
+		if (entity == null){
+			entity = new TestNote();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 富文本测试列表页面
+	 */
+	@RequiresPermissions("test:note:testNote:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(TestNote testNote, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<TestNote> page = testNoteService.findPage(new Page<TestNote>(request, response), testNote); 
+		model.addAttribute("page", page);
+		return "modules/test/note/testNoteList";
+	}
+
+	/**
+	 * 查看,增加,编辑富文本测试表单页面
+	 */
+	@RequiresPermissions(value={"test:note:testNote:view","test:note:testNote:add","test:note:testNote:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(TestNote testNote, Model model) {
+		model.addAttribute("testNote", testNote);
+		return "modules/test/note/testNoteForm";
+	}
+
+	/**
+	 * 保存富文本测试
+	 */
+	@RequiresPermissions(value={"test:note:testNote:add","test:note:testNote:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	public String save(TestNote testNote, Model model, RedirectAttributes redirectAttributes) throws Exception{
+		if (!beanValidator(model, testNote)){
+			return form(testNote, model);
+		}
+		if(!testNote.getIsNewRecord()){//编辑表单保存
+			TestNote t = testNoteService.get(testNote.getId());//从数据库取出记录的值
+			MyBeanUtils.copyBeanNotNull2Bean(testNote, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+			testNoteService.save(t);//保存
+		}else{//新增表单保存
+			testNoteService.save(testNote);//保存
+		}
+		addMessage(redirectAttributes, "保存富文本测试成功");
+		return "redirect:"+Global.getAdminPath()+"/test/note/testNote/?repage";
+	}
+	
+	/**
+	 * 删除富文本测试
+	 */
+	@RequiresPermissions("test:note:testNote:del")
+	@RequestMapping(value = "delete")
+	public String delete(TestNote testNote, RedirectAttributes redirectAttributes) {
+		testNoteService.delete(testNote);
+		addMessage(redirectAttributes, "删除富文本测试成功");
+		return "redirect:"+Global.getAdminPath()+"/test/note/testNote/?repage";
+	}
+	
+	/**
+	 * 批量删除富文本测试
+	 */
+	@RequiresPermissions("test:note:testNote:del")
+	@RequestMapping(value = "deleteAll")
+	public String deleteAll(String ids, RedirectAttributes redirectAttributes) {
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			testNoteService.delete(testNoteService.get(id));
+		}
+		addMessage(redirectAttributes, "删除富文本测试成功");
+		return "redirect:"+Global.getAdminPath()+"/test/note/testNote/?repage";
+	}
+	
+	/**
+	 * 导出excel文件
+	 */
+	@RequiresPermissions("test:note:testNote:export")
+    @RequestMapping(value = "export", method=RequestMethod.POST)
+    public String exportFile(TestNote testNote, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "富文本测试"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            Page<TestNote> page = testNoteService.findPage(new Page<TestNote>(request, response, -1), testNote);
+    		new ExportExcel("富文本测试", TestNote.class).setDataList(page.getList()).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导出富文本测试记录失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/test/note/testNote/?repage";
+    }
+
+	/**
+	 * 导入Excel数据
+
+	 */
+	@RequiresPermissions("test:note:testNote:import")
+    @RequestMapping(value = "import", method=RequestMethod.POST)
+    public String importFile(MultipartFile file, RedirectAttributes redirectAttributes) {
+		try {
+			int successNum = 0;
+			int failureNum = 0;
+			StringBuilder failureMsg = new StringBuilder();
+			ImportExcel ei = new ImportExcel(file, 1, 0);
+			List<TestNote> list = ei.getDataList(TestNote.class);
+			for (TestNote testNote : list){
+				try{
+					testNoteService.save(testNote);
+					successNum++;
+				}catch(ConstraintViolationException ex){
+					failureNum++;
+				}catch (Exception ex) {
+					failureNum++;
+				}
+			}
+			if (failureNum>0){
+				failureMsg.insert(0, ",失败 "+failureNum+" 条富文本测试记录。");
+			}
+			addMessage(redirectAttributes, "已成功导入 "+successNum+" 条富文本测试记录"+failureMsg);
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入富文本测试失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/test/note/testNote/?repage";
+    }
+	
+	/**
+	 * 下载导入富文本测试数据模板
+	 */
+	@RequiresPermissions("test:note:testNote:import")
+    @RequestMapping(value = "import/template")
+    public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "富文本测试数据导入模板.xlsx";
+    		List<TestNote> list = Lists.newArrayList(); 
+    		new ExportExcel("富文本测试数据", TestNote.class, 1).setDataList(list).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入模板下载失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/test/note/testNote/?repage";
+    }
+	
+	
+	
+
+}

+ 196 - 0
src/main/java/com/jeeplus/modules/test/web/one/FormLeaveController.java

@@ -0,0 +1,196 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.test.web.one;
+
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.ConstraintViolationException;
+
+import org.apache.shiro.authz.annotation.Logical;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import com.google.common.collect.Lists;
+import com.jeeplus.common.utils.DateUtils;
+import com.jeeplus.common.utils.MyBeanUtils;
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.utils.excel.ExportExcel;
+import com.jeeplus.common.utils.excel.ImportExcel;
+import com.jeeplus.modules.test.entity.one.FormLeave;
+import com.jeeplus.modules.test.service.one.FormLeaveService;
+
+/**
+ * 请假表单Controller
+ * @author lgf
+ * @version 2016-10-06
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/test/one/formLeave")
+public class FormLeaveController extends BaseController {
+
+	@Autowired
+	private FormLeaveService formLeaveService;
+	
+	@ModelAttribute
+	public FormLeave get(@RequestParam(required=false) String id) {
+		FormLeave entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = formLeaveService.get(id);
+		}
+		if (entity == null){
+			entity = new FormLeave();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 请假表单列表页面
+	 */
+	@RequiresPermissions("test:one:formLeave:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(FormLeave formLeave, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<FormLeave> page = formLeaveService.findPage(new Page<FormLeave>(request, response), formLeave); 
+		model.addAttribute("page", page);
+		return "modules/test/one/formLeaveList";
+	}
+
+	/**
+	 * 查看,增加,编辑请假表单表单页面
+	 */
+	@RequiresPermissions(value={"test:one:formLeave:view","test:one:formLeave:add","test:one:formLeave:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(FormLeave formLeave, Model model) {
+		model.addAttribute("formLeave", formLeave);
+		return "modules/test/one/formLeaveForm";
+	}
+
+	/**
+	 * 保存请假表单
+	 */
+	@RequiresPermissions(value={"test:one:formLeave:add","test:one:formLeave:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	public String save(FormLeave formLeave, Model model, RedirectAttributes redirectAttributes) throws Exception{
+		if (!beanValidator(model, formLeave)){
+			return form(formLeave, model);
+		}
+		if(!formLeave.getIsNewRecord()){//编辑表单保存
+			FormLeave t = formLeaveService.get(formLeave.getId());//从数据库取出记录的值
+			MyBeanUtils.copyBeanNotNull2Bean(formLeave, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+			formLeaveService.save(t);//保存
+		}else{//新增表单保存
+			formLeaveService.save(formLeave);//保存
+		}
+		addMessage(redirectAttributes, "保存请假表单成功");
+		return "redirect:"+Global.getAdminPath()+"/test/one/formLeave/?repage";
+	}
+	
+	/**
+	 * 删除请假表单
+	 */
+	@RequiresPermissions("test:one:formLeave:del")
+	@RequestMapping(value = "delete")
+	public String delete(FormLeave formLeave, RedirectAttributes redirectAttributes) {
+		formLeaveService.delete(formLeave);
+		addMessage(redirectAttributes, "删除请假表单成功");
+		return "redirect:"+Global.getAdminPath()+"/test/one/formLeave/?repage";
+	}
+	
+	/**
+	 * 批量删除请假表单
+	 */
+	@RequiresPermissions("test:one:formLeave:del")
+	@RequestMapping(value = "deleteAll")
+	public String deleteAll(String ids, RedirectAttributes redirectAttributes) {
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			formLeaveService.delete(formLeaveService.get(id));
+		}
+		addMessage(redirectAttributes, "删除请假表单成功");
+		return "redirect:"+Global.getAdminPath()+"/test/one/formLeave/?repage";
+	}
+	
+	/**
+	 * 导出excel文件
+	 */
+	@RequiresPermissions("test:one:formLeave:export")
+    @RequestMapping(value = "export", method=RequestMethod.POST)
+    public String exportFile(FormLeave formLeave, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "请假表单"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            Page<FormLeave> page = formLeaveService.findPage(new Page<FormLeave>(request, response, -1), formLeave);
+    		new ExportExcel("请假表单", FormLeave.class).setDataList(page.getList()).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导出请假表单记录失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/test/one/formLeave/?repage";
+    }
+
+	/**
+	 * 导入Excel数据
+
+	 */
+	@RequiresPermissions("test:one:formLeave:import")
+    @RequestMapping(value = "import", method=RequestMethod.POST)
+    public String importFile(MultipartFile file, RedirectAttributes redirectAttributes) {
+		try {
+			int successNum = 0;
+			int failureNum = 0;
+			StringBuilder failureMsg = new StringBuilder();
+			ImportExcel ei = new ImportExcel(file, 1, 0);
+			List<FormLeave> list = ei.getDataList(FormLeave.class);
+			for (FormLeave formLeave : list){
+				try{
+					formLeaveService.save(formLeave);
+					successNum++;
+				}catch(ConstraintViolationException ex){
+					failureNum++;
+				}catch (Exception ex) {
+					failureNum++;
+				}
+			}
+			if (failureNum>0){
+				failureMsg.insert(0, ",失败 "+failureNum+" 条请假表单记录。");
+			}
+			addMessage(redirectAttributes, "已成功导入 "+successNum+" 条请假表单记录"+failureMsg);
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入请假表单失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/test/one/formLeave/?repage";
+    }
+	
+	/**
+	 * 下载导入请假表单数据模板
+	 */
+	@RequiresPermissions("test:one:formLeave:import")
+    @RequestMapping(value = "import/template")
+    public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "请假表单数据导入模板.xlsx";
+    		List<FormLeave> list = Lists.newArrayList(); 
+    		new ExportExcel("请假表单数据", FormLeave.class, 1).setDataList(list).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入模板下载失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/test/one/formLeave/?repage";
+    }
+	
+	
+	
+
+}

+ 196 - 0
src/main/java/com/jeeplus/modules/test/web/onetomany/TestDataMainController.java

@@ -0,0 +1,196 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.test.web.onetomany;
+
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.ConstraintViolationException;
+
+import org.apache.shiro.authz.annotation.Logical;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import com.google.common.collect.Lists;
+import com.jeeplus.common.utils.DateUtils;
+import com.jeeplus.common.utils.MyBeanUtils;
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.utils.excel.ExportExcel;
+import com.jeeplus.common.utils.excel.ImportExcel;
+import com.jeeplus.modules.test.entity.onetomany.TestDataMain;
+import com.jeeplus.modules.test.service.onetomany.TestDataMainService;
+
+/**
+ * 票务代理Controller
+ * @author liugf
+ * @version 2016-10-06
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/test/onetomany/testDataMain")
+public class TestDataMainController extends BaseController {
+
+	@Autowired
+	private TestDataMainService testDataMainService;
+	
+	@ModelAttribute
+	public TestDataMain get(@RequestParam(required=false) String id) {
+		TestDataMain entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = testDataMainService.get(id);
+		}
+		if (entity == null){
+			entity = new TestDataMain();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 票务代理列表页面
+	 */
+	@RequiresPermissions("test:onetomany:testDataMain:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(TestDataMain testDataMain, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<TestDataMain> page = testDataMainService.findPage(new Page<TestDataMain>(request, response), testDataMain); 
+		model.addAttribute("page", page);
+		return "modules/test/onetomany/testDataMainList";
+	}
+
+	/**
+	 * 查看,增加,编辑票务代理表单页面
+	 */
+	@RequiresPermissions(value={"test:onetomany:testDataMain:view","test:onetomany:testDataMain:add","test:onetomany:testDataMain:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(TestDataMain testDataMain, Model model) {
+		model.addAttribute("testDataMain", testDataMain);
+		return "modules/test/onetomany/testDataMainForm";
+	}
+
+	/**
+	 * 保存票务代理
+	 */
+	@RequiresPermissions(value={"test:onetomany:testDataMain:add","test:onetomany:testDataMain:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	public String save(TestDataMain testDataMain, Model model, RedirectAttributes redirectAttributes) throws Exception{
+		if (!beanValidator(model, testDataMain)){
+			return form(testDataMain, model);
+		}
+		if(!testDataMain.getIsNewRecord()){//编辑表单保存
+			TestDataMain t = testDataMainService.get(testDataMain.getId());//从数据库取出记录的值
+			MyBeanUtils.copyBeanNotNull2Bean(testDataMain, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+			testDataMainService.save(t);//保存
+		}else{//新增表单保存
+			testDataMainService.save(testDataMain);//保存
+		}
+		addMessage(redirectAttributes, "保存票务代理成功");
+		return "redirect:"+Global.getAdminPath()+"/test/onetomany/testDataMain/?repage";
+	}
+	
+	/**
+	 * 删除票务代理
+	 */
+	@RequiresPermissions("test:onetomany:testDataMain:del")
+	@RequestMapping(value = "delete")
+	public String delete(TestDataMain testDataMain, RedirectAttributes redirectAttributes) {
+		testDataMainService.delete(testDataMain);
+		addMessage(redirectAttributes, "删除票务代理成功");
+		return "redirect:"+Global.getAdminPath()+"/test/onetomany/testDataMain/?repage";
+	}
+	
+	/**
+	 * 批量删除票务代理
+	 */
+	@RequiresPermissions("test:onetomany:testDataMain:del")
+	@RequestMapping(value = "deleteAll")
+	public String deleteAll(String ids, RedirectAttributes redirectAttributes) {
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			testDataMainService.delete(testDataMainService.get(id));
+		}
+		addMessage(redirectAttributes, "删除票务代理成功");
+		return "redirect:"+Global.getAdminPath()+"/test/onetomany/testDataMain/?repage";
+	}
+	
+	/**
+	 * 导出excel文件
+	 */
+	@RequiresPermissions("test:onetomany:testDataMain:export")
+    @RequestMapping(value = "export", method=RequestMethod.POST)
+    public String exportFile(TestDataMain testDataMain, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "票务代理"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            Page<TestDataMain> page = testDataMainService.findPage(new Page<TestDataMain>(request, response, -1), testDataMain);
+    		new ExportExcel("票务代理", TestDataMain.class).setDataList(page.getList()).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导出票务代理记录失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/test/onetomany/testDataMain/?repage";
+    }
+
+	/**
+	 * 导入Excel数据
+
+	 */
+	@RequiresPermissions("test:onetomany:testDataMain:import")
+    @RequestMapping(value = "import", method=RequestMethod.POST)
+    public String importFile(MultipartFile file, RedirectAttributes redirectAttributes) {
+		try {
+			int successNum = 0;
+			int failureNum = 0;
+			StringBuilder failureMsg = new StringBuilder();
+			ImportExcel ei = new ImportExcel(file, 1, 0);
+			List<TestDataMain> list = ei.getDataList(TestDataMain.class);
+			for (TestDataMain testDataMain : list){
+				try{
+					testDataMainService.save(testDataMain);
+					successNum++;
+				}catch(ConstraintViolationException ex){
+					failureNum++;
+				}catch (Exception ex) {
+					failureNum++;
+				}
+			}
+			if (failureNum>0){
+				failureMsg.insert(0, ",失败 "+failureNum+" 条票务代理记录。");
+			}
+			addMessage(redirectAttributes, "已成功导入 "+successNum+" 条票务代理记录"+failureMsg);
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入票务代理失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/test/onetomany/testDataMain/?repage";
+    }
+	
+	/**
+	 * 下载导入票务代理数据模板
+	 */
+	@RequiresPermissions("test:onetomany:testDataMain:import")
+    @RequestMapping(value = "import/template")
+    public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "票务代理数据导入模板.xlsx";
+    		List<TestDataMain> list = Lists.newArrayList(); 
+    		new ExportExcel("票务代理数据", TestDataMain.class, 1).setDataList(list).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入模板下载失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/test/onetomany/testDataMain/?repage";
+    }
+	
+	
+	
+
+}

+ 145 - 0
src/main/java/com/jeeplus/modules/test/web/tree/TestTreeController.java

@@ -0,0 +1,145 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.test.web.tree;
+
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.shiro.authz.annotation.Logical;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.jeeplus.common.utils.MyBeanUtils;
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.modules.test.entity.tree.TestTree;
+import com.jeeplus.modules.test.service.tree.TestTreeService;
+
+/**
+ * 组织机构Controller
+ * @author liugf
+ * @version 2016-10-04
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/test/tree/testTree")
+public class TestTreeController extends BaseController {
+
+	@Autowired
+	private TestTreeService testTreeService;
+	
+	@ModelAttribute
+	public TestTree get(@RequestParam(required=false) String id) {
+		TestTree entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = testTreeService.get(id);
+		}
+		if (entity == null){
+			entity = new TestTree();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 机构列表页面
+	 */
+	@RequiresPermissions("test:tree:testTree:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(TestTree testTree, HttpServletRequest request, HttpServletResponse response, Model model) {
+		List<TestTree> list = testTreeService.findList(testTree); 
+		model.addAttribute("list", list);
+		return "modules/test/tree/testTreeList";
+	}
+
+	/**
+	 * 查看,增加,编辑机构表单页面
+	 */
+	@RequiresPermissions(value={"test:tree:testTree:view","test:tree:testTree:add","test:tree:testTree:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(TestTree testTree, Model model) {
+		if (testTree.getParent()!=null && StringUtils.isNotBlank(testTree.getParent().getId())){
+			testTree.setParent(testTreeService.get(testTree.getParent().getId()));
+			// 获取排序号,最末节点排序号+30
+			if (StringUtils.isBlank(testTree.getId())){
+				TestTree testTreeChild = new TestTree();
+				testTreeChild.setParent(new TestTree(testTree.getParent().getId()));
+				List<TestTree> list = testTreeService.findList(testTree); 
+				if (list.size() > 0){
+					testTree.setSort(list.get(list.size()-1).getSort());
+					if (testTree.getSort() != null){
+						testTree.setSort(testTree.getSort() + 30);
+					}
+				}
+			}
+		}
+		if (testTree.getSort() == null){
+			testTree.setSort(30);
+		}
+		model.addAttribute("testTree", testTree);
+		return "modules/test/tree/testTreeForm";
+	}
+
+	/**
+	 * 保存机构
+	 */
+	@RequiresPermissions(value={"test:tree:testTree:add","test:tree:testTree:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	public String save(TestTree testTree, Model model, RedirectAttributes redirectAttributes) throws Exception{
+		if (!beanValidator(model, testTree)){
+			return form(testTree, model);
+		}
+		if(!testTree.getIsNewRecord()){//编辑表单保存
+			TestTree t = testTreeService.get(testTree.getId());//从数据库取出记录的值
+			MyBeanUtils.copyBeanNotNull2Bean(testTree, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+			testTreeService.save(t);//保存
+		}else{//新增表单保存
+			testTreeService.save(testTree);//保存
+		}
+		addMessage(redirectAttributes, "保存机构成功");
+		return "redirect:"+Global.getAdminPath()+"/test/tree/testTree/?repage";
+	}
+	
+	/**
+	 * 删除机构
+	 */
+	@RequiresPermissions("test:tree:testTree:del")
+	@RequestMapping(value = "delete")
+	public String delete(TestTree testTree, RedirectAttributes redirectAttributes) {
+		testTreeService.delete(testTree);
+		addMessage(redirectAttributes, "删除机构成功");
+		return "redirect:"+Global.getAdminPath()+"/test/tree/testTree/?repage";
+	}
+
+	@RequiresPermissions("user")
+	@ResponseBody
+	@RequestMapping(value = "treeData")
+	public List<Map<String, Object>> treeData(@RequestParam(required=false) String extId, HttpServletResponse response) {
+		List<Map<String, Object>> mapList = Lists.newArrayList();
+		List<TestTree> list = testTreeService.findList(new TestTree());
+		for (int i=0; i<list.size(); i++){
+			TestTree e = list.get(i);
+			if (StringUtils.isBlank(extId) || (extId!=null && !extId.equals(e.getId()) && e.getParentIds().indexOf(","+extId+",")==-1)){
+				Map<String, Object> map = Maps.newHashMap();
+				map.put("id", e.getId());
+				map.put("pId", e.getParentId());
+				map.put("name", e.getName());
+				mapList.add(map);
+			}
+		}
+		return mapList;
+	}
+	
+}

+ 194 - 0
src/main/java/com/jeeplus/modules/test/web/validation/TestValidationController.java

@@ -0,0 +1,194 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.test.web.validation;
+
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.ConstraintViolationException;
+
+import org.apache.shiro.authz.annotation.Logical;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import com.google.common.collect.Lists;
+import com.jeeplus.common.utils.DateUtils;
+import com.jeeplus.common.utils.MyBeanUtils;
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.utils.excel.ExportExcel;
+import com.jeeplus.common.utils.excel.ImportExcel;
+import com.jeeplus.modules.test.entity.validation.TestValidation;
+import com.jeeplus.modules.test.service.validation.TestValidationService;
+
+/**
+ * 测试校验功能Controller
+ * @author lgf
+ * @version 2016-10-05
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/test/validation/testValidation")
+public class TestValidationController extends BaseController {
+
+	@Autowired
+	private TestValidationService testValidationService;
+	
+	@ModelAttribute
+	public TestValidation get(@RequestParam(required=false) String id) {
+		TestValidation entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = testValidationService.get(id);
+		}
+		if (entity == null){
+			entity = new TestValidation();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 测试校验列表页面
+	 */
+	@RequiresPermissions("test:validation:testValidation:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(TestValidation testValidation, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<TestValidation> page = testValidationService.findPage(new Page<TestValidation>(request, response), testValidation); 
+		model.addAttribute("page", page);
+		return "modules/test/validation/testValidationList";
+	}
+
+	/**
+	 * 查看,增加,编辑测试校验表单页面
+	 */
+	@RequiresPermissions(value={"test:validation:testValidation:view","test:validation:testValidation:add","test:validation:testValidation:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(TestValidation testValidation, Model model) {
+		model.addAttribute("testValidation", testValidation);
+		return "modules/test/validation/testValidationForm";
+	}
+
+	/**
+	 * 保存测试校验
+	 */
+	@RequiresPermissions(value={"test:validation:testValidation:add","test:validation:testValidation:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	public String save(TestValidation testValidation, Model model, RedirectAttributes redirectAttributes) throws Exception{
+		if (!beanValidator(model, testValidation)){
+			return form(testValidation, model);
+		}
+		if(!testValidation.getIsNewRecord()){//编辑表单保存
+			TestValidation t = testValidationService.get(testValidation.getId());//从数据库取出记录的值
+			MyBeanUtils.copyBeanNotNull2Bean(testValidation, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+			testValidationService.save(t);//保存
+		}else{//新增表单保存
+			testValidationService.save(testValidation);//保存
+		}
+		addMessage(redirectAttributes, "保存测试校验成功");
+		return "redirect:"+Global.getAdminPath()+"/test/validation/testValidation/?repage";
+	}
+	
+	/**
+	 * 删除测试校验
+	 */
+	@RequiresPermissions("test:validation:testValidation:del")
+	@RequestMapping(value = "delete")
+	public String delete(TestValidation testValidation, RedirectAttributes redirectAttributes) {
+		testValidationService.delete(testValidation);
+		addMessage(redirectAttributes, "删除测试校验成功");
+		return "redirect:"+Global.getAdminPath()+"/test/validation/testValidation/?repage";
+	}
+	
+	/**
+	 * 批量删除测试校验
+	 */
+	@RequiresPermissions("test:validation:testValidation:del")
+	@RequestMapping(value = "deleteAll")
+	public String deleteAll(String ids, RedirectAttributes redirectAttributes) {
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			testValidationService.delete(testValidationService.get(id));
+		}
+		addMessage(redirectAttributes, "删除测试校验成功");
+		return "redirect:"+Global.getAdminPath()+"/test/validation/testValidation/?repage";
+	}
+	
+	/**
+	 * 导出excel文件
+	 */
+	@RequiresPermissions("test:validation:testValidation:export")
+    @RequestMapping(value = "export", method=RequestMethod.POST)
+    public String exportFile(TestValidation testValidation, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "测试校验"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            Page<TestValidation> page = testValidationService.findPage(new Page<TestValidation>(request, response, -1), testValidation);
+    		new ExportExcel("测试校验", TestValidation.class).setDataList(page.getList()).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导出测试校验记录失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/test/validation/testValidation/?repage";
+    }
+
+	/**
+	 * 导入Excel数据
+
+	 */
+	@RequiresPermissions("test:validation:testValidation:import")
+    @RequestMapping(value = "import", method=RequestMethod.POST)
+    public String importFile(MultipartFile file, RedirectAttributes redirectAttributes) {
+		try {
+			int successNum = 0;
+			int failureNum = 0;
+			StringBuilder failureMsg = new StringBuilder();
+			ImportExcel ei = new ImportExcel(file, 1, 0);
+			List<TestValidation> list = ei.getDataList(TestValidation.class);
+			for (TestValidation testValidation : list){
+				try{
+					testValidationService.save(testValidation);
+					successNum++;
+				}catch(ConstraintViolationException ex){
+					failureNum++;
+				}catch (Exception ex) {
+					failureNum++;
+				}
+			}
+			if (failureNum>0){
+				failureMsg.insert(0, ",失败 "+failureNum+" 条测试校验记录。");
+			}
+			addMessage(redirectAttributes, "已成功导入 "+successNum+" 条测试校验记录"+failureMsg);
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入测试校验失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/test/validation/testValidation/?repage";
+    }
+	
+	/**
+	 * 下载导入测试校验数据模板
+	 */
+	@RequiresPermissions("test:validation:testValidation:import")
+    @RequestMapping(value = "import/template")
+    public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "测试校验数据导入模板.xlsx";
+    		List<TestValidation> list = Lists.newArrayList(); 
+    		new ExportExcel("测试校验数据", TestValidation.class, 1).setDataList(list).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入模板下载失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/test/validation/testValidation/?repage";
+    }
+    
+
+}

+ 18 - 0
src/main/java/com/jeeplus/modules/tools/dao/TestInterfaceDao.java

@@ -0,0 +1,18 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.tools.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.tools.entity.TestInterface;
+
+/**
+ * 接口DAO接口
+ * @author lgf
+ * @version 2016-01-07
+ */
+@MyBatisDao
+public interface TestInterfaceDao extends CrudDao<TestInterface> {
+	
+}

+ 105 - 0
src/main/java/com/jeeplus/modules/tools/entity/TestInterface.java

@@ -0,0 +1,105 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.tools.entity;
+
+import org.hibernate.validator.constraints.Length;
+
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+
+/**
+ * 接口Entity
+ * @author lgf
+ * @version 2016-01-07
+ */
+public class TestInterface extends DataEntity<TestInterface> {
+	
+	private static final long serialVersionUID = 1L;
+	private String name;		// 接口名称
+	private String type;		// 接口类型
+	private String url;		// 请求URL
+	private String body;		// 请求body
+	private String successmsg;		// 成功时返回消息
+	private String errormsg;		// 失败时返回消息
+	private String remarks;		// 备注
+	
+	public TestInterface() {
+		super();
+	}
+
+	public TestInterface(String id){
+		super(id);
+	}
+
+	@Length(min=0, max=1024, message="接口名称长度必须介于 0 和 1024 之间")
+	@ExcelField(title="接口名称", align=2, sort=1)
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+	
+	@Length(min=0, max=16, message="接口类型长度必须介于 0 和 16 之间")
+	@ExcelField(title="接口类型", dictType="type", align=2, sort=2)
+	public String getType() {
+		return type;
+	}
+
+	public void setType(String type) {
+		this.type = type;
+	}
+	
+	@Length(min=0, max=256, message="请求URL长度必须介于 0 和 256 之间")
+	@ExcelField(title="请求URL", align=2, sort=3)
+	public String getUrl() {
+		return url;
+	}
+
+	public void setUrl(String url) {
+		this.url = url;
+	}
+	
+	@Length(min=0, max=2048, message="请求body长度必须介于 0 和 2048 之间")
+	@ExcelField(title="请求body", align=2, sort=4)
+	public String getBody() {
+		return body;
+	}
+
+	public void setBody(String body) {
+		this.body = body;
+	}
+	
+	@Length(min=0, max=512, message="成功时返回消息长度必须介于 0 和 512 之间")
+	@ExcelField(title="成功时返回消息", align=2, sort=5)
+	public String getSuccessmsg() {
+		return successmsg;
+	}
+
+	public void setSuccessmsg(String successmsg) {
+		this.successmsg = successmsg;
+	}
+	
+	@Length(min=0, max=512, message="失败时返回消息长度必须介于 0 和 512 之间")
+	@ExcelField(title="失败时返回消息", align=2, sort=6)
+	public String getErrormsg() {
+		return errormsg;
+	}
+
+	public void setErrormsg(String errormsg) {
+		this.errormsg = errormsg;
+	}
+	
+	@Length(min=0, max=512, message="备注长度必须介于 0 和 512 之间")
+	@ExcelField(title="备注", align=2, sort=7)
+	public String getRemarks() {
+		return remarks;
+	}
+
+	public void setRemarks(String remarks) {
+		this.remarks = remarks;
+	}
+	
+}

+ 47 - 0
src/main/java/com/jeeplus/modules/tools/service/TestInterfaceService.java

@@ -0,0 +1,47 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.tools.service;
+
+import java.util.List;
+
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.service.CrudService;
+import com.jeeplus.modules.tools.dao.TestInterfaceDao;
+import com.jeeplus.modules.tools.entity.TestInterface;
+
+/**
+ * 接口Service
+ * @author lgf
+ * @version 2016-01-07
+ */
+@Service
+@Transactional(readOnly = true)
+public class TestInterfaceService extends CrudService<TestInterfaceDao, TestInterface> {
+
+	public TestInterface get(String id) {
+		return super.get(id);
+	}
+	
+	public List<TestInterface> findList(TestInterface testInterface) {
+		return super.findList(testInterface);
+	}
+	
+	public Page<TestInterface> findPage(Page<TestInterface> page, TestInterface testInterface) {
+		return super.findPage(page, testInterface);
+	}
+	
+	@Transactional(readOnly = false)
+	public void save(TestInterface testInterface) {
+		super.save(testInterface);
+	}
+	
+	@Transactional(readOnly = false)
+	public void delete(TestInterface testInterface) {
+		super.delete(testInterface);
+	}
+	
+}

+ 146 - 0
src/main/java/com/jeeplus/modules/tools/utils/HttpPostTest.java

@@ -0,0 +1,146 @@
+package com.jeeplus.modules.tools.utils;
+
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.NameValuePair;
+import org.apache.http.ParseException;
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.methods.HttpUriRequest;
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.protocol.HTTP;
+import org.apache.http.util.EntityUtils;
+import org.apache.log4j.Logger;
+
+
+public class HttpPostTest {
+	private static Logger log = Logger.getLogger(HttpPostTest.class);
+	Map<String, String> params;
+	String url;
+	public static String post(String url, Map<String, String> params) {
+		DefaultHttpClient httpclient = new DefaultHttpClient();
+		String body = null;
+		
+		log.info("create httppost:" + url);
+		HttpPost post = postForm(url, params);
+		
+		body = invoke(httpclient, post);
+		
+		httpclient.getConnectionManager().shutdown();
+		
+		return body;
+	}
+	
+	 public HttpPostTest(String url, 	Map<String, String> params){
+		this.url = url;
+		this.params = params;
+	}
+	public static String get(String url) {
+		DefaultHttpClient httpclient = new DefaultHttpClient();
+		String body = null;
+		
+		log.info("create httppost:" + url);
+		HttpGet get = new HttpGet(url);
+		body = invoke(httpclient, get);
+		
+		httpclient.getConnectionManager().shutdown();
+		
+		return body;
+	}
+		
+	
+	private static String invoke(DefaultHttpClient httpclient,
+			HttpUriRequest httpost) {
+		
+		HttpResponse response = sendRequest(httpclient, httpost);
+		String body = paseResponse(response);
+		
+		return body;
+	}
+
+	private static String paseResponse(HttpResponse response) {
+		log.info("get response from http server..");
+		HttpEntity entity = response.getEntity();
+		
+		log.info("response status: " + response.getStatusLine());
+		String charset = EntityUtils.getContentCharSet(entity);
+		log.info(charset);
+		
+		String body = null;
+		try {
+			body = EntityUtils.toString(entity);
+			log.info(body);
+		} catch (ParseException e) {
+			e.printStackTrace();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		
+		return body;
+	}
+
+	private static HttpResponse sendRequest(DefaultHttpClient httpclient,
+			HttpUriRequest httpost) {
+		log.info("execute post...");
+		HttpResponse response = null;
+		
+		try {
+			response = httpclient.execute(httpost);
+		} catch (ClientProtocolException e) {
+			e.printStackTrace();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		return response;
+	}
+
+	private static HttpPost postForm(String url, Map<String, String> params){
+		
+		HttpPost httpost = new HttpPost(url);
+		List<NameValuePair> nvps = new ArrayList <NameValuePair>();
+		
+		Set<String> keySet = params.keySet();
+		for(String key : keySet) {
+			nvps.add(new BasicNameValuePair(key, params.get(key)));
+		}
+		
+		try {
+			log.info("set utf-8 form entity to httppost");
+			httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
+		} catch (UnsupportedEncodingException e) {
+			e.printStackTrace();
+		}
+		
+		return httpost;
+	}
+
+	public static void main(String []agrs){
+		Map<String, String> params = new HashMap<String, String>();
+		params.put("name", "jeeplus");
+		params.put("password", "admin");
+			
+		String xml = HttpPostTest.post("http://localhost:8080/HeartCare/a/login", params);
+	}
+	
+	public  String post(){
+
+//		Map<String, String> params = new HashMap<String, String>();
+//		params.put("name", "admin");
+//		params.put("password", "admin");
+			
+		String xml = HttpPostTest.post(url, params);
+	  return xml;
+	}
+}

+ 262 - 0
src/main/java/com/jeeplus/modules/tools/utils/TwoDimensionCode.java

@@ -0,0 +1,262 @@
+package com.jeeplus.modules.tools.utils;
+
+import java.awt.Color;
+import java.awt.Graphics2D;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import javax.imageio.ImageIO;
+
+import jp.sourceforge.qrcode.QRCodeDecoder;
+import jp.sourceforge.qrcode.exception.DecodingFailedException;
+
+import com.swetake.util.Qrcode;
+
+
+
+public class TwoDimensionCode {
+
+	/**
+	 * 生成二维码(QRCode)图片
+	 * 
+	 * @param content
+	 *            存储内容
+	 * @param imgPath
+	 *            图片路径
+	 */
+	public static void encoderQRCode(String content, String imgPath) {
+		encoderQRCode(content, imgPath, "png", 2);
+	}
+
+	/**
+	 * 生成二维码(QRCode)图片
+	 * 
+	 * @param content
+	 *            存储内容
+	 * @param output
+	 *            输出流
+	 */
+	public static void encoderQRCode(String content, OutputStream output) {
+		encoderQRCode(content, output, "png", 2);
+	}
+
+	/**
+	 * 生成二维码(QRCode)图片
+	 * 
+	 * @param content
+	 *            存储内容
+	 * @param imgPath
+	 *            图片路径
+	 * @param imgType
+	 *            图片类型
+	 */
+	public static void encoderQRCode(String content, String imgPath, String imgType) {
+		encoderQRCode(content, imgPath, imgType, 2);
+	}
+
+	/**
+	 * 生成二维码(QRCode)图片
+	 * 
+	 * @param content
+	 *            存储内容
+	 * @param output
+	 *            输出流
+	 * @param imgType
+	 *            图片类型
+	 */
+	public static void encoderQRCode(String content, OutputStream output,
+			String imgType) {
+		encoderQRCode(content, output, imgType, 2);
+	}
+
+	/**
+	 * 生成二维码(QRCode)图片
+	 * 
+	 * @param content
+	 *            存储内容
+	 * @param imgPath
+	 *            图片路径
+	 * @param imgType
+	 *            图片类型
+	 * @param size
+	 *            二维码尺寸
+	 */
+	public static void encoderQRCode(String content, String imgPath, String imgType,
+			int size) {
+		try {
+			BufferedImage bufImg = qRCodeCommon(content, imgType, size);
+
+			File imgFile = new File(imgPath);
+			// 生成二维码QRCode图片
+			ImageIO.write(bufImg, imgType, imgFile);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+	/**
+	 * 生成二维码(QRCode)图片
+	 * 
+	 * @param content
+	 *            存储内容
+	 * @param output
+	 *            输出流
+	 * @param imgType
+	 *            图片类型
+	 * @param size
+	 *            二维码尺寸
+	 */
+	public static void encoderQRCode(String content, OutputStream output,
+			String imgType, int size) {
+		try {
+			BufferedImage bufImg = qRCodeCommon(content, imgType, size);
+			// 生成二维码QRCode图片
+			ImageIO.write(bufImg, imgType, output);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+	/**
+	 * 生成二维码(QRCode)图片的公共方法
+	 * 
+	 * @param content
+	 *            存储内容
+	 * @param imgType
+	 *            图片类型
+	 * @param size
+	 *            二维码尺寸
+	 * @return
+	 */
+	private static BufferedImage qRCodeCommon(String content, String imgType, int size) {
+		BufferedImage bufImg = null;
+		size = 10;
+		try {
+			Qrcode qrcodeHandler = new Qrcode();
+			// 设置二维码排错率,可选L(7%)、M(15%)、Q(25%)、H(30%),排错率越高可存储的信息越少,但对二维码清晰度的要求越小
+			qrcodeHandler.setQrcodeErrorCorrect('M');
+			qrcodeHandler.setQrcodeEncodeMode('B');
+			// 设置设置二维码尺寸,取值范围1-40,值越大尺寸越大,可存储的信息越大
+			qrcodeHandler.setQrcodeVersion(size);
+			// 获得内容的字节数组,设置编码格式
+			byte[] contentBytes = content.getBytes("utf-8");
+			// 图片尺寸
+			//int imgSize = 67 + 12 * (size - 1);
+			int imgSize = 67 + 12 * (size - 1);
+			
+			//System.out.println(imgSize);
+			
+			bufImg = new BufferedImage(imgSize, imgSize,
+					BufferedImage.TYPE_INT_RGB);
+			Graphics2D gs = bufImg.createGraphics();
+			// 设置背景颜色
+			gs.setBackground(Color.WHITE);
+			gs.clearRect(0, 0, imgSize, imgSize);
+
+			// 设定图像颜色> BLACK
+			gs.setColor(Color.BLACK);
+			// 设置偏移量,不设置可能导致解析出错
+			int pixoff = 2;
+			// 输出内容> 二维码
+			if (contentBytes.length > 0 && contentBytes.length < 800) {
+				
+				
+				
+				boolean[][] codeOut = qrcodeHandler.calQrcode(contentBytes);
+				for (int i = 0; i < codeOut.length; i++) {
+					for (int j = 0; j < codeOut.length; j++) {
+						if (codeOut[j][i]) {
+							gs.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3);
+						}
+					}
+				}
+			} else {
+				throw new Exception("QRCode content bytes length = "
+						+ contentBytes.length + " not in [0, 800].");
+			}
+			gs.dispose();
+			bufImg.flush();
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return bufImg;
+	}
+
+	/**
+	 * 解析二维码(QRCode)
+	 * 
+	 * @param imgPath
+	 *            图片路径
+	 * @return
+	 */
+	public static String decoderQRCode(String imgPath) throws Exception{
+		// QRCode 二维码图片的文件
+		File imageFile = new File(imgPath);
+		BufferedImage bufImg = null;
+		String content = null;
+		try {
+			bufImg = ImageIO.read(imageFile);
+			QRCodeDecoder decoder = new QRCodeDecoder();
+			content = new String(decoder.decode(new TwoDimensionCodeImage(
+					bufImg)), "utf-8");
+		} catch (IOException e) {
+			//System.out.println("Error: " + e.getMessage());
+			//e.printStackTrace();
+		} catch (DecodingFailedException dfe) {
+			//System.out.println("Error: " + dfe.getMessage());
+			//dfe.printStackTrace();
+		}
+		return content;
+	}
+
+	/**
+	 * 解析二维码(QRCode)
+	 * 
+	 * @param input
+	 *            输入流
+	 * @return
+	 */
+	public static String decoderQRCode(InputStream input) {
+		BufferedImage bufImg = null;
+		String content = null;
+		try {
+			bufImg = ImageIO.read(input);
+			QRCodeDecoder decoder = new QRCodeDecoder();
+			content = new String(decoder.decode(new TwoDimensionCodeImage(
+					bufImg)), "utf-8");
+		} catch (IOException e) {
+			System.out.println("Error: " + e.getMessage());
+			e.printStackTrace();
+		} catch (DecodingFailedException dfe) {
+			System.out.println("Error: " + dfe.getMessage());
+			dfe.printStackTrace();
+		}
+		return content;
+	}
+
+	public static void main(String[] args) {
+		String imgPath = "F:/a.png";
+		/*String encoderContent = "Hello 大大、小小,welcome to QRCode!"
+				+ "\nMyblog [ http://sjsky.iteye.com ]"
+				+ "\nEMail [ sjsky007@gmail.com ]";*/
+		
+		String encoderContent = "http://www.baidu.com";
+		TwoDimensionCode handler = new TwoDimensionCode();
+		handler.encoderQRCode(encoderContent, imgPath, "png");
+		// try {
+		// OutputStream output = new FileOutputStream(imgPath);
+		// handler.encoderQRCode(content, output);
+		// } catch (Exception e) {
+		// e.printStackTrace();
+		// }
+		System.out.println("========encoder success");
+
+		//String decoderContent = handler.decoderQRCode(imgPath);
+		System.out.println("解析结果如下:");
+		//System.out.println(decoderContent);
+		System.out.println("========decoder success!!!");
+	}
+}

+ 35 - 0
src/main/java/com/jeeplus/modules/tools/utils/TwoDimensionCodeImage.java

@@ -0,0 +1,35 @@
+package com.jeeplus.modules.tools.utils;
+
+import java.awt.image.BufferedImage;
+
+import jp.sourceforge.qrcode.data.QRCodeImage;
+
+/**
+ * 二维码
+ * 创建人:FH 创建时间:2015年4月10日
+ * @version
+ */
+public class TwoDimensionCodeImage implements QRCodeImage {
+
+	BufferedImage bufImg;
+
+	public TwoDimensionCodeImage(BufferedImage bufImg) {
+		this.bufImg = bufImg;
+	}
+
+	@Override
+	public int getHeight() {
+		return bufImg.getHeight();
+	}
+
+	@Override
+	public int getPixel(int x, int y) {
+		return bufImg.getRGB(x, y);
+	}
+
+	@Override
+	public int getWidth() {
+		return bufImg.getWidth();
+	}
+
+}

+ 34 - 0
src/main/java/com/jeeplus/modules/tools/web/BeautifyHtmlController.java

@@ -0,0 +1,34 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.tools.web;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import com.jeeplus.common.web.BaseController;
+
+/**
+ * 表单构建工具
+ * @author lgf
+ * @version 2016-01-07
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/tools/beautifyhtml")
+public class BeautifyHtmlController extends BaseController {
+
+	
+	/**
+	 * 打开表单构建工具
+	 */
+	@RequestMapping(value = {"index", ""})
+	public String index( HttpServletRequest request, HttpServletResponse response, Model model) {
+		return "modules/tools/form_builder";
+	}
+
+		
+}

+ 59 - 0
src/main/java/com/jeeplus/modules/tools/web/EmailController.java

@@ -0,0 +1,59 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.tools.web;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import com.jeeplus.common.mail.MailSendUtils;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.modules.sys.entity.SystemConfig;
+import com.jeeplus.modules.sys.service.SystemConfigService;
+
+/**
+ * 发送外部邮件
+ * @author lgf
+ * @version 2016-01-07
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/tools/email")
+public class EmailController extends BaseController {
+
+	@Autowired
+	private SystemConfigService systemConfigService;
+	
+	/**
+	 * 打开邮件页面
+	 */
+	@RequestMapping(value = {"index", ""})
+	public String index( HttpServletRequest request, HttpServletResponse response, Model model) {
+		return "modules/tools/sendEmail";
+	}
+
+	/**
+	 * 发送邮件
+	 */
+	@RequestMapping("send")
+	public String send(String emailAddress,  HttpServletResponse response, String title, String content, Model model) throws Exception {
+		SystemConfig config = systemConfigService.get("1");
+		String[]addresses = emailAddress.split(";");
+		String result = "";
+		for(String address: addresses){
+			boolean isSuccess = MailSendUtils.sendEmail(config.getSmtp(), config.getPort(), config.getMailName(), config.getMailPassword(),address,  title, content, "0");
+			if(isSuccess){
+				result += address+":<font color='green'>发送成功!</font><br/>";
+			}else{
+				result += address+":<font color='red'>发送失败!</font><br/>";
+			}
+		}
+			model.addAttribute("result", result);
+			return "modules/tools/sendEmailResult";
+	}
+		
+}

+ 68 - 0
src/main/java/com/jeeplus/modules/tools/web/SMSController.java

@@ -0,0 +1,68 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.tools.web;
+
+import java.io.IOException;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.jeeplus.modules.sys.utils.UserUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import com.jeeplus.common.sms.SMSUtils;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.modules.sys.entity.SystemConfig;
+import com.jeeplus.modules.sys.service.SystemConfigService;
+
+/**
+ * 发送短信
+ * @author lgf
+ * @version 2016-01-07
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/tools/sms")
+public class SMSController extends BaseController {
+
+	@Autowired
+	private SystemConfigService systemConfigService;
+	
+	/**
+	 * 打开短信页面
+	 */
+	@RequestMapping(value = {"index", ""})
+	public String index( HttpServletRequest request, HttpServletResponse response, Model model) {
+		return "modules/tools/sendSMS";
+	}
+
+	/**
+	 * 发送短信
+	 */
+	@RequestMapping("send")
+	public String send(String tels,  HttpServletResponse response, String content, Model model) throws Exception {
+		SystemConfig config = systemConfigService.get("1");
+		String result = "";
+		try{
+				//发送内容
+				content = "【匞匞】"+content;
+				String resultCode = SMSUtils.send(tels, content,"","0");
+				if (resultCode.contains("Success") && resultCode.contains("ok")) {
+					result = "短信发送成功";
+
+				}else{
+					result = "短信发送失败,错误代码:"+resultCode+",请 联系管理员。";
+
+				}
+			} catch (IOException e) {
+				result = "因未知原因导致短信发送失败,请联系管理员。";
+			}
+			
+			model.addAttribute("result", result);
+			return "modules/tools/sendSMSResult";
+	}
+		
+}

+ 264 - 0
src/main/java/com/jeeplus/modules/tools/web/TestInterfaceController.java

@@ -0,0 +1,264 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.tools.web;
+
+import java.io.BufferedReader;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.shiro.authz.annotation.Logical;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import com.google.common.collect.Lists;
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.utils.DateUtils;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.utils.excel.ExportExcel;
+import com.jeeplus.common.utils.excel.ImportExcel;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.modules.tools.entity.TestInterface;
+import com.jeeplus.modules.tools.service.TestInterfaceService;
+import com.jeeplus.modules.tools.utils.HttpPostTest;
+
+/**
+ * 接口Controller
+ * @author lgf
+ * @version 2016-01-07
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/tools/testInterface")
+public class TestInterfaceController extends BaseController {
+
+	@Autowired
+	private TestInterfaceService testInterfaceService;
+	
+	@ModelAttribute
+	public TestInterface get(@RequestParam(required=false) String id) {
+		TestInterface entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = testInterfaceService.get(id);
+		}
+		if (entity == null){
+			entity = new TestInterface();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 接口列表页面
+	 */
+	@RequiresPermissions("tools:testInterface:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(TestInterface testInterface, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<TestInterface> page = testInterfaceService.findPage(new Page<TestInterface>(request, response), testInterface); 
+		model.addAttribute("page", page);
+		return "modules/tools/testInterfaceList";
+	}
+
+	/**
+	 * 查看,增加,编辑接口表单页面
+	 */
+	@RequiresPermissions(value={"tools:testInterface:view","tools:testInterface:add","tools:testInterface:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(TestInterface testInterface, Model model) {
+		model.addAttribute("testInterface", testInterface);
+		return "modules/tools/testInterfaceForm";
+	}
+
+	/**
+	 * 保存接口
+	 */
+	@RequiresPermissions(value={"tools:testInterface:add","tools:testInterface:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	public String save(TestInterface testInterface, Model model, RedirectAttributes redirectAttributes) {
+		if (!beanValidator(model, testInterface)){
+			return form(testInterface, model);
+		}
+		testInterfaceService.save(testInterface);
+		addMessage(redirectAttributes, "保存接口成功");
+		return "redirect:"+Global.getAdminPath()+"/tools/testInterface/?repage";
+	}
+	
+	/**
+	 * 删除接口
+	 */
+	@RequiresPermissions("tools:testInterface:del")
+	@RequestMapping(value = "delete")
+	public String delete(TestInterface testInterface, RedirectAttributes redirectAttributes) {
+		testInterfaceService.delete(testInterface);
+		addMessage(redirectAttributes, "删除接口成功");
+		return "redirect:"+Global.getAdminPath()+"/tools/testInterface/?repage";
+	}
+	
+	/**
+	 * 批量删除接口
+	 */
+	@RequiresPermissions("tools:testInterface:del")
+	@RequestMapping(value = "deleteAll")
+	public String deleteAll(String ids, RedirectAttributes redirectAttributes) {
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			testInterfaceService.delete(testInterfaceService.get(id));
+		}
+		addMessage(redirectAttributes, "删除接口成功");
+		return "redirect:"+Global.getAdminPath()+"/tools/testInterface/?repage";
+	}
+	
+	/**
+	 * 导出excel文件
+	 */
+	@RequiresPermissions("tools:testInterface:export")
+    @RequestMapping(value = "export", method=RequestMethod.POST)
+    public String exportFile(TestInterface testInterface, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "接口"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            Page<TestInterface> page = testInterfaceService.findPage(new Page<TestInterface>(request, response, -1), testInterface);
+    		new ExportExcel("接口", TestInterface.class).setDataList(page.getList()).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导出接口记录失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/tools/testInterface/?repage";
+    }
+
+	/**
+	 * 导入Excel数据
+
+	 */
+	@RequiresPermissions("tools:testInterface:import")
+    @RequestMapping(value = "import", method=RequestMethod.POST)
+    public String importFile(MultipartFile file, RedirectAttributes redirectAttributes) {
+		try {
+			int successNum = 0;
+			ImportExcel ei = new ImportExcel(file, 1, 0);
+			List<TestInterface> list = ei.getDataList(TestInterface.class);
+			for (TestInterface testInterface : list){
+				testInterfaceService.save(testInterface);
+			}
+			addMessage(redirectAttributes, "已成功导入 "+successNum+" 条接口记录");
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入接口失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/tools/testInterface/?repage";
+    }
+	
+	/**
+	 * 下载导入接口数据模板
+	 */
+	@RequiresPermissions("tools:testInterface:import")
+    @RequestMapping(value = "import/template")
+    public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "接口数据导入模板.xlsx";
+    		List<TestInterface> list = Lists.newArrayList(); 
+    		new ExportExcel("接口数据", TestInterface.class, 1).setDataList(list).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入模板下载失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/tools/testInterface/?repage";
+    }
+	
+
+	@RequiresPermissions("tools:testInterface:test")
+	@RequestMapping(value="/test")
+	public String form(String id, HttpServletRequest request, HttpServletResponse response, Model model) {
+		TestInterface entity = testInterfaceService.get(id);
+		model.addAttribute("testInterface", entity);
+		return "modules/tools/interfaceTest";
+	}
+
+	/**
+	 *	接口内部请求
+	 * @param 
+	 * @throws Exception
+	 */
+	@RequestMapping(value="/severTest")
+	@ResponseBody
+	public Object severTest(HttpServletRequest request, HttpServletResponse response, Model model){
+		Map<String,String> map = new HashMap<String,String>();
+		String errInfo = "success",str = "",rTime="";
+		try{
+			long startTime = System.currentTimeMillis(); 	
+			String s_url = request.getParameter("serverUrl");//请求起始时间_毫秒
+			String type = request.getParameter("requestMethod");
+			String requestBody = request.getParameter("requestBody");
+			URL url;		
+			if(type.equals("POST")){//请求类型  POST or GET	
+				Map<String, String> params = new HashMap<String, String>();
+				
+				if(requestBody!=null && !requestBody.equals("")){
+				    String[] paramList = requestBody.split("&");
+				    
+				    for(String param : paramList){
+				    	if(param.split("=").length == 2){
+				    		params.put(param.split("=")[0], param.split("=")[1]);
+				    	}else{
+				    		params.put(param.split("=")[0], "");
+				    	}
+				    }
+				}
+			    HttpPostTest test = new HttpPostTest(s_url, params);
+			    
+			    str=  test.post();
+			}else{
+				url = new URL(s_url);
+				HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+				connection.setRequestMethod("GET");
+				BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(),"UTF-8"));
+									//请求结束时间_毫秒
+				String temp = "";
+				while((temp = in.readLine()) != null){ 
+					str = str + temp;
+				}
+				
+			}
+			
+			long endTime = System.currentTimeMillis(); 	
+			rTime = String.valueOf(endTime - startTime); 
+		}
+		catch(Exception e){
+			errInfo = "error";
+			str = e.getMessage();
+		}
+		map.put("errInfo", errInfo);	//状态信息
+		map.put("result", str);			//返回结果
+		map.put("rTime", rTime);		//服务器请求时间 毫秒
+		return map;
+	}
+	
+	 public static byte[] readInputStream(InputStream inStream) throws Exception{
+	        ByteArrayOutputStream outStream = new ByteArrayOutputStream();
+	        byte[] buffer = new byte[1024];
+	        int len = 0;
+	        while( (len = inStream.read(buffer)) !=-1 ){
+	            outStream.write(buffer, 0, len);
+	        }
+	        byte[] data = outStream.toByteArray();//网页的二进制数据
+	        outStream.close();
+	        inStream.close();
+	        return data;
+	    }
+
+}

+ 107 - 0
src/main/java/com/jeeplus/modules/tools/web/TwoDimensionCodeController.java

@@ -0,0 +1,107 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.tools.web;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.json.AjaxJson;
+import com.jeeplus.common.utils.FileUtils;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.security.SystemAuthorizingRealm.Principal;
+import com.jeeplus.modules.sys.service.SystemService;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.tools.utils.TwoDimensionCode;
+
+/**
+ * 二维码Controller
+ * @author jeeplus
+ * @version 2015-11-30
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/tools/TwoDimensionCodeController")
+public class TwoDimensionCodeController extends BaseController {
+
+	@Autowired
+	private SystemService systemService;
+	/**
+	 * 二维码页面
+	 */
+	@RequestMapping(value = {"index", ""})
+	public String index() throws Exception{
+		return "modules/tools/TwoDimensionCode";
+	}
+	
+	/**
+	 *	生成二维码
+	 * @param args
+	 * @throws Exception
+	 */
+	@RequestMapping(value="createTwoDimensionCode")
+	@ResponseBody
+	public AjaxJson createTwoDimensionCode(HttpServletRequest request, String encoderContent){
+		AjaxJson j = new AjaxJson();
+		Principal principal = (Principal) UserUtils.getPrincipal();
+		User user = UserUtils.getUser();
+		if (principal == null){
+			j.setSuccess(false);
+			j.setErrorCode("0");
+			j.setMsg("没有登录");
+		}
+		String realPath = Global.getUserfilesBaseDir() + Global.USERFILES_BASE_URL
+							+ principal + "/qrcode/";
+		FileUtils.createDirectory(realPath);
+		String name="test.png"; //encoderImgId此处二维码的图片名
+			try {
+				String filePath = realPath + name;  //存放路径
+				TwoDimensionCode.encoderQRCode(encoderContent, filePath, "png");//执行生成二维码
+				user.setQrCode(request.getContextPath()+Global.USERFILES_BASE_URL
+						+ principal + "/qrcode/"+name);
+				systemService.updateUserInfo(user);
+				j.setSuccess(true);
+				j.setMsg("二维码生成成功");
+				j.put("filePath", request.getContextPath()+Global.USERFILES_BASE_URL
+						+ principal + "/qrcode/"+name);
+			} catch (Exception e) {
+				
+			}
+		return j;
+	}
+//	
+//	/**
+//	 *	解析二维码
+//	 * @param args
+//	 * @throws Exception
+//	 */
+//	@RequestMapping(value="/readTwoDimensionCode")
+//	@ResponseBody
+//	public Object readTwoDimensionCode(){
+//		Map<String,String> map = new HashMap<String,String>();
+//		PageData pd = new PageData();
+//		pd = this.getPageData();
+//		String errInfo = "success",readContent="";
+//		String imgId = pd.getString("imgId");//内容
+//		if(null == imgId){
+//			errInfo = "error";
+//		}else{
+//			try {
+//				String filePath = PathUtil.getClasspath() + Const.FILEPATHTWODIMENSIONCODE + imgId;  //存放路径
+//				readContent = TwoDimensionCode.decoderQRCode(filePath);//执行读取二维码
+//			} catch (Exception e) {
+//				errInfo = "error";
+//			}
+//		}
+//		map.put("result", errInfo);						//返回结果
+//		map.put("readContent", readContent);			//读取的内容
+//		return AppUtil.returnObject(new PageData(), map);
+//	}
+//	
+
+}

+ 32 - 0
src/main/java/com/jeeplus/modules/utils/ErrorCode.java

@@ -0,0 +1,32 @@
+package com.jeeplus.modules.utils;
+
+/**
+ * 错误码定义
+ */
+public interface ErrorCode {
+
+
+    final String code_1001 = "1001";  // 会话失效
+    final String code_1002 = "1002";  // 用户或密码错误, 请重试.
+    final String code_1003 = "1003";  //登录失败, 该用户未注册.
+    final String code_1004 = "-1";   //正确数据
+    final String code_1005 = "1005";   //只有一位管理员,不允许退出企业
+    final String code_1006 = "1006";   //已经登陆
+    final String code_1007 = "1007";   //手机号已被使用
+    final String code_1008 = "1008";   //短信发送异常
+    final String code_1009 = "1009";   //信息已存在 不能再次操作
+    final String code_1010 = "1010";   //没有操作权限
+    final String code_1011 = "1011";   //验证码错误
+    final String code_1012 = "1012";   //密码错误
+    final String code_1013 = "1013";   //上班已打卡
+    final String code_2001 = "2001"; // 参数缺失
+    final String code_2002 = "2002"; // 参数格式异常
+    final String code_2003 = "2003"; // 参数值不正确
+    final String code_2004 = "2004"; // 后台数据逻辑异常
+    final String code_2005 = "2005"; // 查询的数据不存在
+    final String code_2006 = "2006"; // 操作数据失败
+    final String code_3001 = "3001"; // 第三方数据获取异常
+    final String code_3002 = "3002"; // 第三方数据保存异常
+    final String code_4001 = "4001"; // 群信息不存在
+    final String code_3003 = "-2";   //案例专指全国数据
+}

+ 30 - 0
src/main/java/com/jeeplus/modules/wexinpackage/access/entity/AccessToken.java

@@ -0,0 +1,30 @@
+package com.jeeplus.modules.wexinpackage.access.entity;
+
+public class AccessToken {
+    private String token;//获取得到得凭证
+    private int expiresIn;//秒
+
+    public String getToken() {
+        return token;
+    }
+
+    public void setToken(String token) {
+        this.token = token;
+    }
+
+    public int getExpiresIn() {
+        return expiresIn;
+    }
+
+    public void setExpiresIn(int expiresIn) {
+        this.expiresIn = expiresIn;
+    }
+
+    @Override
+    public String toString() {
+        return "AccessToken{" +
+                "token='" + token + '\'' +
+                ", expiresIn=" + expiresIn +
+                '}';
+    }
+}

+ 243 - 0
src/main/java/com/jeeplus/modules/wexinpackage/access/entity/ChangeNumber.java

@@ -0,0 +1,243 @@
+package com.jeeplus.modules.wexinpackage.access.entity;
+
+import java.util.Date;
+
+/**
+ * 成员变更通知
+ */
+public class ChangeNumber {
+   private String ToUserName;//企业微信CorpID
+   private String FromUserName;//	此事件该值固定为sys,表示该消息由系统生成
+   private String CreateTime;//	消息创建时间 (整型)
+   private String MsgType;//	消息的类型,此时固定为event
+   private String Event;//	事件的类型,此时固定为change_contact
+   private String ChangeType;//	此时固定为create_user
+   private String UserID;//	成员UserID
+   private String Name;//	成员名称
+   private String Department;//	成员部门列表,仅返回该应用有查看权限的部门id
+   private String IsLeaderInDept;//	表示所在部门是否为上级,0-否,1-是,顺序与Department字段的部门逐一对应
+   private String Mobile;//	手机号码
+   private String Position;//	职位信息。长度为0~64个字节
+   private String Gender;//	性别,1表示男性,2表示女性
+   private String Email;//	邮箱
+   private String Status;//	激活状态:1=已激活 2=已禁用 4=未激活 已激活代表已激活企业微信或已关注微工作台(原企业号)。
+   private String Avatar;//	头像url。注:如果要获取小图将url最后的”/0”改成”/100”即可。
+   private String Alias;//成员别名
+   private String Telephone;//	座机
+   private String Address;//	地址
+   private String ExtAttr;//	扩展属性
+   private String Type;//	扩展属性类型: 0-本文 1-网页
+   private String Text;//	文本属性类型,扩展属性类型为0时填写
+   private String Value;//	文本属性内容
+   private String Web;//	网页类型属性,扩展属性类型为1时填写
+   private String Title;//	网页的展示标题
+   private String Url;//	网页的url
+
+    public String getToUserName() {
+        return ToUserName;
+    }
+
+    public void setToUserName(String toUserName) {
+        ToUserName = toUserName;
+    }
+
+    public String getFromUserName() {
+        return FromUserName;
+    }
+
+    public void setFromUserName(String fromUserName) {
+        FromUserName = fromUserName;
+    }
+
+    public String getCreateTime() {
+        return CreateTime;
+    }
+
+    public void setCreateTime(String createTime) {
+        CreateTime = createTime;
+    }
+
+    public String getMsgType() {
+        return MsgType;
+    }
+
+    public void setMsgType(String msgType) {
+        MsgType = msgType;
+    }
+
+    public String getEvent() {
+        return Event;
+    }
+
+    public void setEvent(String event) {
+        Event = event;
+    }
+
+    public String getChangeType() {
+        return ChangeType;
+    }
+
+    public void setChangeType(String changeType) {
+        ChangeType = changeType;
+    }
+
+    public String getUserID() {
+        return UserID;
+    }
+
+    public void setUserID(String userID) {
+        UserID = userID;
+    }
+
+    public String getName() {
+        return Name;
+    }
+
+    public void setName(String name) {
+        Name = name;
+    }
+
+    public String getDepartment() {
+        return Department;
+    }
+
+    public void setDepartment(String department) {
+        Department = department;
+    }
+
+    public String getIsLeaderInDept() {
+        return IsLeaderInDept;
+    }
+
+    public void setIsLeaderInDept(String isLeaderInDept) {
+        IsLeaderInDept = isLeaderInDept;
+    }
+
+    public String getMobile() {
+        return Mobile;
+    }
+
+    public void setMobile(String mobile) {
+        Mobile = mobile;
+    }
+
+    public String getPosition() {
+        return Position;
+    }
+
+    public void setPosition(String position) {
+        Position = position;
+    }
+
+    public String getGender() {
+        return Gender;
+    }
+
+    public void setGender(String gender) {
+        Gender = gender;
+    }
+
+    public String getEmail() {
+        return Email;
+    }
+
+    public void setEmail(String email) {
+        Email = email;
+    }
+
+    public String getStatus() {
+        return Status;
+    }
+
+    public void setStatus(String status) {
+        Status = status;
+    }
+
+    public String getAvatar() {
+        return Avatar;
+    }
+
+    public void setAvatar(String avatar) {
+        Avatar = avatar;
+    }
+
+    public String getAlias() {
+        return Alias;
+    }
+
+    public void setAlias(String alias) {
+        Alias = alias;
+    }
+
+    public String getTelephone() {
+        return Telephone;
+    }
+
+    public void setTelephone(String telephone) {
+        Telephone = telephone;
+    }
+
+    public String getAddress() {
+        return Address;
+    }
+
+    public void setAddress(String address) {
+        Address = address;
+    }
+
+    public String getExtAttr() {
+        return ExtAttr;
+    }
+
+    public void setExtAttr(String extAttr) {
+        ExtAttr = extAttr;
+    }
+
+    public String getType() {
+        return Type;
+    }
+
+    public void setType(String type) {
+        Type = type;
+    }
+
+    public String getText() {
+        return Text;
+    }
+
+    public void setText(String text) {
+        Text = text;
+    }
+
+    public String getValue() {
+        return Value;
+    }
+
+    public void setValue(String value) {
+        Value = value;
+    }
+
+    public String getWeb() {
+        return Web;
+    }
+
+    public void setWeb(String web) {
+        Web = web;
+    }
+
+    public String getTitle() {
+        return Title;
+    }
+
+    public void setTitle(String title) {
+        Title = title;
+    }
+
+    public String getUrl() {
+        return Url;
+    }
+
+    public void setUrl(String url) {
+        Url = url;
+    }
+}

+ 13 - 0
src/main/java/com/jeeplus/modules/wexinpackage/access/entity/ChangeParty.java

@@ -0,0 +1,13 @@
+package com.jeeplus.modules.wexinpackage.access.entity;
+
+public class ChangeParty {
+
+
+
+
+
+
+
+
+
+}

+ 202 - 0
src/main/java/com/jeeplus/modules/wexinpackage/access/entity/WeChatUser.java

@@ -0,0 +1,202 @@
+package com.jeeplus.modules.wexinpackage.access.entity;
+
+public class WeChatUser {
+    private String errcode;//状态码
+    private String errmsg;
+    private String userid;//唯一标识=登录名 成员UserID
+    private String name;//姓名 成员名称
+    private int department;//部门 成员部门列表,仅返回该应用有查看权限的部门id
+    private String mobile;//手机号 手机号码
+    private String email;//邮箱
+    private String position;//职位 职位信息。长度为0~64个字节
+    private String gender;//性别 性别,1表示男性,2表示女性
+    private String avatar;// 头像url。注:如果要获取小图将url最后的”/0”改成”/100”即可。
+    private String status;// 激活状态:1=已激活 2=已禁用 4=未激活 已激活代表已激活企业微信或已关注微工作台(原企业号)
+    private String isleader;//是否领导 表示所在部门是否为上级,0-否,1-是,顺序与Department字段的部门逐一对应
+    private String telephone;//座机 座机
+    private String enable;//是否启用
+    private String hide_mobile;//
+    private String order;//
+    private String external_profile;//
+    private String qr_code;
+    private String alias;//别名 成员别名
+    private String is_leader_in_dept;
+    private String address;//地址 地址
+    private String thumb_avatar;
+
+    public String getErrcode() {
+        return errcode;
+    }
+
+    public void setErrcode(String errcode) {
+        this.errcode = errcode;
+    }
+
+    public String getErrmsg() {
+        return errmsg;
+    }
+
+    public void setErrmsg(String errmsg) {
+        this.errmsg = errmsg;
+    }
+
+    public String getUserid() {
+        return userid;
+    }
+
+    public void setUserid(String userid) {
+        this.userid = userid;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public int getDepartment() {
+        return department;
+    }
+
+    public void setDepartment(int department) {
+        this.department = department;
+    }
+
+    public String getMobile() {
+        return mobile;
+    }
+
+    public void setMobile(String mobile) {
+        this.mobile = mobile;
+    }
+
+    public String getEmail() {
+        return email;
+    }
+
+    public void setEmail(String email) {
+        this.email = email;
+    }
+
+    public String getPosition() {
+        return position;
+    }
+
+    public void setPosition(String position) {
+        this.position = position;
+    }
+
+    public String getGender() {
+        return gender;
+    }
+
+    public void setGender(String gender) {
+        this.gender = gender;
+    }
+
+    public String getAvatar() {
+        return avatar;
+    }
+
+    public void setAvatar(String avatar) {
+        this.avatar = avatar;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public String getIsleader() {
+        return isleader;
+    }
+
+    public void setIsleader(String isleader) {
+        this.isleader = isleader;
+    }
+
+    public String getTelephone() {
+        return telephone;
+    }
+
+    public void setTelephone(String telephone) {
+        this.telephone = telephone;
+    }
+
+    public String getEnable() {
+        return enable;
+    }
+
+    public void setEnable(String enable) {
+        this.enable = enable;
+    }
+
+    public String getHide_mobile() {
+        return hide_mobile;
+    }
+
+    public void setHide_mobile(String hide_mobile) {
+        this.hide_mobile = hide_mobile;
+    }
+
+    public String getOrder() {
+        return order;
+    }
+
+    public void setOrder(String order) {
+        this.order = order;
+    }
+
+    public String getExternal_profile() {
+        return external_profile;
+    }
+
+    public void setExternal_profile(String external_profile) {
+        this.external_profile = external_profile;
+    }
+
+    public String getQr_code() {
+        return qr_code;
+    }
+
+    public void setQr_code(String qr_code) {
+        this.qr_code = qr_code;
+    }
+
+    public String getAlias() {
+        return alias;
+    }
+
+    public void setAlias(String alias) {
+        this.alias = alias;
+    }
+
+    public String getIs_leader_in_dept() {
+        return is_leader_in_dept;
+    }
+
+    public void setIs_leader_in_dept(String is_leader_in_dept) {
+        this.is_leader_in_dept = is_leader_in_dept;
+    }
+
+    public String getAddress() {
+        return address;
+    }
+
+    public void setAddress(String address) {
+        this.address = address;
+    }
+
+    public String getThumb_avatar() {
+        return thumb_avatar;
+    }
+
+    public void setThumb_avatar(String thumb_avatar) {
+        this.thumb_avatar = thumb_avatar;
+    }
+}

+ 46 - 0
src/main/java/com/jeeplus/modules/wexinpackage/access/entity/WxDepartment.java

@@ -0,0 +1,46 @@
+package com.jeeplus.modules.wexinpackage.access.entity;
+
+public class WxDepartment {
+    private int id ;
+    private String name;
+    private int parentid;
+    private int order;
+
+    public WxDepartment(int id, String name, int parentid) {
+        this.id = id;
+        this.name = name;
+        this.parentid = parentid;
+    }
+
+    public int getId() {
+        return id;
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public int getParentid() {
+        return parentid;
+    }
+
+    public void setParentid(int parentid) {
+        this.parentid = parentid;
+    }
+
+    public int getOrder() {
+        return order;
+    }
+
+    public void setOrder(int order) {
+        this.order = order;
+    }
+}

+ 9 - 0
src/main/java/com/jeeplus/modules/wexinpackage/access/service/MessageService.java

@@ -0,0 +1,9 @@
+package com.jeeplus.modules.wexinpackage.access.service;
+
+import com.jeeplus.modules.workstaff.dao.WorkStaffBasicInfoDao;
+import org.springframework.beans.factory.annotation.Autowired;
+
+public class MessageService {
+    @Autowired
+    private WorkStaffBasicInfoDao workStaffBasicInfoDao;
+}

+ 247 - 0
src/main/java/com/jeeplus/modules/wexinpackage/access/service/WeChatCallbackService.java

@@ -0,0 +1,247 @@
+package com.jeeplus.modules.wexinpackage.access.service;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jeeplus.common.utils.JedisUtils;
+import com.jeeplus.common.utils.MyBeanUtils;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.modules.sys.dao.OfficeDao;
+import com.jeeplus.modules.sys.dao.UserDao;
+import com.jeeplus.modules.sys.entity.Office;
+import com.jeeplus.modules.sys.entity.Role;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.service.OfficeService;
+import com.jeeplus.modules.sys.service.RoleService;
+import com.jeeplus.modules.sys.service.SystemService;
+import com.jeeplus.modules.sys.service.UserService;
+import com.jeeplus.modules.wexinpackage.access.entity.ChangeNumber;
+import com.jeeplus.modules.wexinpackage.access.util.access.AccessTokenUtil;
+import com.jeeplus.modules.wexinpackage.access.util.access.AddressBookUtil;
+import com.jeeplus.modules.wexinpackage.access.util.access.ContactUtil;
+import com.jeeplus.modules.wexinpackage.access.util.access.WeChatParamsUtil;
+import com.jeeplus.modules.workstaff.dao.WorkStaffBasicInfoDao;
+import com.jeeplus.modules.workstaff.entity.WorkStaffBasicInfo;
+import com.jeeplus.modules.workstaff.service.WorkStaffBasicInfoService;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.DocumentHelper;
+import org.dom4j.Element;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * 操作用户Service
+ */
+@Service
+public class WeChatCallbackService {
+    @Autowired
+    private UserService userService;
+    @Autowired
+    private OfficeService officeService;
+    @Autowired
+    private OfficeDao officeDao;
+    @Autowired
+    private WorkStaffBasicInfoService workStaffBasicInfoService;
+    @Autowired
+    private SystemService systemService;
+    @Autowired
+    private RoleService roleService;
+    @Autowired
+    private WorkStaffBasicInfoDao workStaffBasicInfoDao;
+    @Autowired
+    private UserDao userDao;
+
+    //操作 :判断事件类型
+    public void getMapOperation(String sMsg, HttpServletRequest request){
+        Document doc = null;
+        try {
+            doc = DocumentHelper.parseText(sMsg);
+            Element root = doc.getRootElement();
+            // 获取根节点下的所有元素
+            List list = root.elements();
+            Map<String,String> map = new HashMap<String, String>();
+            if (list != null && list.size() > 0) {
+                for (int i = 0; i < list.size(); i++) {
+                    Element child = (Element) list.get(i);
+                    //xml转Map
+                    map.put(child.getName(),child.getTextTrim());
+                }
+            }
+            ChangeNumber changeNumber = ContactUtil.map2Object(map, ChangeNumber.class);
+            if (null!=changeNumber){
+                //获取通讯口事件 判断事件类型
+                if (changeNumber.getEvent().equals(ContactUtil.CHANGE_CONTACT)) {
+                    getJudgeCDUSType(changeNumber,request);
+                }
+            }
+        } catch (DocumentException e) {
+            e.printStackTrace();
+        }
+    }
+    //判断事件类型 增删改查
+    public void getJudgeCDUSType(ChangeNumber changeNumber,HttpServletRequest request){
+        switch (changeNumber.getChangeType()){
+            case ContactUtil.UPDATE_USER:
+                getUpdateTotal(changeNumber,request);
+                break;
+            case ContactUtil.CREATE_USER:
+                String s = JedisUtils.get(changeNumber.getUserID()+"create");
+                if (null != s){
+                    if (!s.equals(changeNumber.getUserID())){
+                        JedisUtils.set(changeNumber.getUserID()+"create",changeNumber.getUserID(),10000);
+                        getCreateTotal(changeNumber,request);
+                    }
+                }else {
+                    JedisUtils.set(changeNumber.getUserID()+"create",changeNumber.getUserID(),10000);
+                    getCreateTotal(changeNumber,request);
+                }
+                break;
+            case ContactUtil.DELETE_USER:
+                    getDeleteTotal(changeNumber);
+                break;
+        }
+    }
+    //增加操作
+    public void getCreateTotal(ChangeNumber changeNumber,HttpServletRequest request){
+        Office office = new Office();
+        String department = changeNumber.getDepartment();
+        String[] split = department.split(",");
+        if (split.length>1){
+            department = split[0];
+            if (department.equals("1")){
+                department = split[1];
+            }
+        }
+        if (department.equals("1")){
+            changeNumber.setDepartment("2");
+        }
+        changeNumber.setDepartment(department);
+        office.setWxOfficeId(changeNumber.getDepartment());
+        List<Office> offices = officeDao.findListByWxName(office);
+        WorkStaffBasicInfo workStaffBasicInfo = new WorkStaffBasicInfo();
+        List<Role> byOfficeId = null;
+        if (null!=offices && offices.size()>0){
+            byOfficeId = roleService.getByOfficeId(offices.get(0).getId());
+        }
+        String roleId = "";
+        if (null!=byOfficeId && byOfficeId.size()>0){
+            roleId = byOfficeId.get(0).getId();
+        }else {
+            roleId = "1";
+        }
+        WorkStaffBasicInfo createWorkStaffBasicInfo = ContactUtil.getCreateWorkStaffBasicInfo(roleId,offices.get(0),workStaffBasicInfo, changeNumber);
+        try {
+            //可变动
+            Office branchOffice = new Office();
+            branchOffice.setId(workStaffBasicInfo.getCompany().getId());
+            workStaffBasicInfo.setBranchOffice(branchOffice);
+            workStaffBasicInfo.setNo(getNo(createWorkStaffBasicInfo));
+            User user = new User();
+            user = this.createUser(workStaffBasicInfo);
+            User user1 = userService.findUniqueByProperty("mobile", workStaffBasicInfo.getMobile());
+            if (null==user1){
+                user.setWeChatId(changeNumber.getUserID());
+                boolean b = userService.save(user, request, null);
+                workStaffBasicInfoService.save(createWorkStaffBasicInfo, request);//保存
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    //修改操作
+    public void getUpdateTotal(ChangeNumber changeNumber,HttpServletRequest request){
+        Office office = new Office();
+        List<Office> offices = null;
+        if (null!=changeNumber.getDepartment()){
+            String department = changeNumber.getDepartment();
+            String[] split = department.split(",");
+            if (split.length>1){
+                department = split[0];
+                if (department.equals("1")){
+                    department = split[1];
+                }
+            }
+            if (department.equals("1")){
+                changeNumber.setDepartment("2");
+            }
+            changeNumber.setDepartment(department);
+            office.setWxOfficeId(changeNumber.getDepartment());
+            offices = officeDao.findListByWxName(office);
+        }else {
+            office.setName("财务部");
+            offices = officeDao.findListByCompanyName(office);
+        }
+        WorkStaffBasicInfo workStaffBasicInfo = new WorkStaffBasicInfo();
+        List<Role> byOfficeId = null;
+        if (null!=offices && offices.size()>0){
+            byOfficeId = roleService.getByOfficeId(offices.get(0).getId());
+        }
+        String roleId = "";
+        if (null!=byOfficeId && byOfficeId.size()>0){
+            roleId = byOfficeId.get(0).getId();
+        }else {
+            roleId = "1";
+        }
+        WorkStaffBasicInfo createWorkStaffBasicInfo = ContactUtil.getCreateWorkStaffBasicInfo(roleId,offices.get(0),workStaffBasicInfo, changeNumber);
+        String userNo = userDao.findUserNo(changeNumber.getUserID());
+        WorkStaffBasicInfo no = workStaffBasicInfoService.findNo(userNo);
+        WorkStaffBasicInfo t = workStaffBasicInfoService.get(no.getId());//从数据库取出记录的值
+        createWorkStaffBasicInfo.setIsNewRecord(false);
+        try {
+            MyBeanUtils.copyBeanNotNull2Bean(createWorkStaffBasicInfo, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+            t.setIsNewRecord(false);
+            workStaffBasicInfoService.save(t,request);//保存
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    //删除操作
+    public void getDeleteTotal(ChangeNumber changeNumber){
+        String userNo = userDao.findUserNo(changeNumber.getUserID());
+        WorkStaffBasicInfo workStaffBasicInfo = workStaffBasicInfoService.findNo(userNo);
+        if (null!=workStaffBasicInfo){
+            workStaffBasicInfoService.delete(workStaffBasicInfo);
+        }
+    }
+
+    //查询操作
+    public void getSelectTotal(){
+
+    }
+
+    public String getNo(WorkStaffBasicInfo workStaffBasicInfo){
+        String no = workStaffBasicInfoDao.queryMaxNoWithCompany(workStaffBasicInfo);
+        String newNo = "000000";
+        if(StringUtils.isNotBlank(no)){
+            Integer integer = Integer.valueOf(no);
+            integer+=1;
+            no = String.valueOf(integer);
+        }
+        newNo = newNo+no;
+        return newNo;
+    }
+
+    private User createUser(WorkStaffBasicInfo workStaffBasicInfo) {
+        User user = new User();
+        user.setOffice(workStaffBasicInfo.getOffice());
+        user.setCompany(workStaffBasicInfo.getCompany());
+        user.setComId(workStaffBasicInfo.getCompany().getId());
+        user.setNo(workStaffBasicInfo.getNo());
+        user.setName(workStaffBasicInfo.getName());
+        user.setMobile(workStaffBasicInfo.getMobile());
+        user.setNewPassword("123456");
+        user.setLoginName(workStaffBasicInfo.getMobile());
+        user.setEmail(workStaffBasicInfo.getEmail());
+        user.setSex(workStaffBasicInfo.getGender());
+        user.setLoginFlag("1");
+        user.setFirstFlag("0");
+        return user;
+    }
+}

+ 57 - 0
src/main/java/com/jeeplus/modules/wexinpackage/access/util/access/AccessTokenUtil.java

@@ -0,0 +1,57 @@
+package com.jeeplus.modules.wexinpackage.access.util.access;
+
+import com.jeeplus.common.utils.JedisUtils;
+import com.jeeplus.modules.wexinpackage.access.entity.AccessToken;
+import net.sf.json.JSONException;
+import net.sf.json.JSONObject;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import redis.clients.jedis.Jedis;
+import redis.clients.jedis.JedisPool;
+
+public class AccessTokenUtil {
+    private static Logger log = (Logger) LoggerFactory.getLogger(RequestAccess.class);
+    //获取redis中得access_token
+    public static String getAccessToken(String corpId,String corpSecret){
+        String access_token = "";
+//        boolean flag = JedisUtils.exists("access_token");
+            access_token = JedisUtils.get("access_token");
+        if (null==access_token){
+            AccessToken accessTokenUtil = getAccessTokenUtil(corpId, corpSecret);
+            JedisUtils.set("access_token",accessTokenUtil.getToken(),accessTokenUtil.getExpiresIn()- 1000);
+            access_token = accessTokenUtil.getToken();
+        }
+        return access_token;
+    }
+
+    /**
+         //     * 3.获取access_token
+         //     * @param corpId 凭证
+         //     * @param corpsecret 密钥
+         //     * @return AccessToken
+         //
+     */
+    public static AccessToken getAccessTokenUtil(String corpId, String corpSecret) {
+        AccessToken accessToken = null;
+        String requestUrl = WeChatParamsUtil.ACCESS_TOKEN_URL.replace("{corpId}", corpId).replace("{corpsecret}",corpSecret);
+        JSONObject jsonObject = RequestAccess.httpRequest(requestUrl, "GET", null);
+        // 如果请求成功
+        if (null != jsonObject) {
+            try {
+                accessToken = new AccessToken();
+                accessToken.setToken(jsonObject.getString("access_token"));
+                accessToken.setExpiresIn(jsonObject.getInt("expires_in"));
+            } catch (JSONException e) {
+                accessToken = null;
+                // 获取token失败
+                log.error("获取token失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));
+            }
+        }
+        return accessToken;
+    }
+//    @Test
+//    public void getAccessToken(){
+//        getAccessToken(WeChatParamsUtil.corpId,WeChatParamsUtil.contactsSecret);
+//    }
+}

+ 89 - 0
src/main/java/com/jeeplus/modules/wexinpackage/access/util/access/AddressBookUtil.java

@@ -0,0 +1,89 @@
+package com.jeeplus.modules.wexinpackage.access.util.access;
+
+import com.google.gson.Gson;
+import com.jeeplus.modules.wexinpackage.access.entity.WeChatUser;
+import com.jeeplus.modules.workstaff.entity.WorkStaffBasicInfo;
+import net.sf.json.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class AddressBookUtil {
+    private static Logger log = (Logger) LoggerFactory.getLogger(RequestAccess.class);
+
+    public static WeChatUser replaceUser(WorkStaffBasicInfo workStaffBasicInfo){
+        WeChatUser user1 = new WeChatUser();
+        user1.setUserid(workStaffBasicInfo.getNo());
+        user1.setName(workStaffBasicInfo.getName());
+        user1.setDepartment(2);
+        user1.setMobile(workStaffBasicInfo.getMobile());
+        user1.setEmail(workStaffBasicInfo.getEmail());
+        user1.setGender(workStaffBasicInfo.getGender());
+        user1.setPosition(workStaffBasicInfo.getDuty());
+        return user1;
+    }
+
+    //1.创建成员
+    public static void createUser(String accessToken,WeChatUser weChatUser) {
+        //1.获取json字符串:将user对象转换为json字符串
+        Gson gson = new Gson();
+        String jsonU1 =gson.toJson(weChatUser);//使用gson.toJson(user)即可将user对象顺序转成json
+        //2.获取请求的url
+        String createUser = WeChatParamsUtil.CREATE_USER.replace("ACCESS_TOKEN", accessToken);
+        //3.调用接口,发送请求,创建成员
+        JSONObject jsonObject = RequestAccess.httpRequest(createUser, "POST", jsonU1);
+        System.out.println("jsonObject:"+jsonObject.toString());
+        //4.错误消息处理
+        if (null != jsonObject) {
+            if (0 != jsonObject.getInt("errcode")) {
+                log.error("创建用户失败");
+            }
+        }
+    }
+    //修改用户
+    public static void updateUser(String accessToken,WeChatUser weChatUser) {
+        //1.获取json字符串:将user对象转换为json字符串
+        Gson gson = new Gson();
+        String jsonU1 =gson.toJson(weChatUser);//使用gson.toJson(user)即可将user对象顺序转成json
+        //2.获取请求的url
+        String updateUser = WeChatParamsUtil.UPDATE_USER.replace("ACCESS_TOKEN", accessToken);
+        //3.调用接口,发送请求,创建成员
+        JSONObject jsonObject = RequestAccess.httpRequest(updateUser, "POST", jsonU1);
+        //4.错误消息处理
+        if (null != jsonObject) {
+            if (0 != jsonObject.getInt("errcode")) {
+                log.error("修改用户失败");
+            }
+        }
+    }
+    //4.删除成员
+    public static void deleteUser(String accessToken,String userId) {
+        //1.获取请求的url
+        String deleteUser = WeChatParamsUtil.DELETE_USER.replace("ACCESS_TOKEN", accessToken)
+                .replace("USERID", userId);
+        //2.调用接口,发送请求,删除成员
+        JSONObject jsonObject = RequestAccess.httpRequest(deleteUser, "GET", null);
+        //3.错误消息处理
+        if (null != jsonObject) {
+            if (0 != jsonObject.getInt("errcode")) {
+                log.error("删除用户失败");
+            }
+        }
+    }
+    //获取用户
+    public static String getUser(String accessToken, String userId) {
+        //1.获取请求的url
+        String getUser = WeChatParamsUtil.SELECT_USER.replace("ACCESS_TOKEN", accessToken)
+                .replace("USERID",userId);
+
+        //2.调用接口,发送请求,获取成员
+        JSONObject jsonObject = RequestAccess.httpRequest(getUser, "GET", null);
+        String string = jsonObject.toString();
+        //3.错误消息处理
+        if (null != jsonObject) {
+            if (0 != jsonObject.getInt("errcode")) {
+                log.error("查找用户失败");
+            }
+        }
+        return string;
+    }
+}

+ 75 - 0
src/main/java/com/jeeplus/modules/wexinpackage/access/util/access/AddressDepartment.java

@@ -0,0 +1,75 @@
+package com.jeeplus.modules.wexinpackage.access.util.access;
+
+import com.google.gson.Gson;
+import com.jeeplus.modules.wexinpackage.access.entity.WxDepartment;
+import net.sf.json.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * 部门管理
+ */
+public class AddressDepartment {
+    private static Logger log = (Logger) LoggerFactory.getLogger(RequestAccess.class);
+    //1.创建部门
+    public static void createDepartment(String accessToken, WxDepartment department) {
+        //1.获取json字符串:将Department对象转换为json字符串
+        Gson gson = new Gson();
+        String jsonDepartment =gson.toJson(department);      //使用gson.toJson(jsonDepartment)即可将jsonDepartment对象顺序转成json
+        //2.拼接请求的url
+        String crate_department = WeChatParamsUtil.create_department.replace("ACCESS_TOKEN", accessToken);
+        //3.调用接口,发送请求,创建部门
+        JSONObject jsonObject = RequestAccess.httpRequest(crate_department, "POST", jsonDepartment);
+        if (null != jsonObject) {
+            if (0 != jsonObject.getInt("errcode")) {
+                log.error("创建部门失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));
+            }
+        }
+    }
+
+    //2.更新部门
+    public static void updateDepartment(String accessToken,WxDepartment department) {
+        //1.获取json字符串:将Department对象转换为json字符串
+        Gson gson = new Gson();
+        String jsonDepartment =gson.toJson(department);      //使用gson.toJson(jsonDepartment)即可将jsonDepartment对象顺序转成json
+        //2.拼接请求的url
+        String update_department = WeChatParamsUtil.update_department.replace("ACCESS_TOKEN", accessToken);
+        //3.调用接口,发送请求,更新部门
+        JSONObject jsonObject = RequestAccess.httpRequest(update_department, "POST", jsonDepartment);
+        System.out.println("jsonObject:"+jsonObject.toString());
+        if (null != jsonObject) {
+            if (0 != jsonObject.getInt("errcode")) {
+
+                log.error("更新部门失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));
+            }
+        }
+    }
+    //3.删除部门
+    public static void deleteDepartment(String accessToken,String departmentId) {
+        //1.获取请求的url
+        String delete_department=WeChatParamsUtil.delete_department.replace("ACCESS_TOKEN", accessToken)
+                .replace("ID", departmentId);
+        //2.调用接口,发送请求,删除部门
+        JSONObject jsonObject = RequestAccess.httpRequest(delete_department, "GET", null);
+        //3.错误消息处理
+        if (null != jsonObject) {
+            if (0 != jsonObject.getInt("errcode")) {
+                log.error("删除部门失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));
+            }
+        }
+    }
+    //4.获取部门列表
+    public void getDepartmentList(String accessToken,String departmentId) {
+        //1.获取请求的url
+        String select_department = WeChatParamsUtil.select_department.replace("ACCESS_TOKEN", accessToken)
+                .replace("ID", departmentId);
+        //2.调用接口,发送请求,获取成员
+        JSONObject jsonObject = RequestAccess.httpRequest(select_department, "GET", null);
+        //3.错误消息处理
+        if (null != jsonObject) {
+            if (0 != jsonObject.getInt("errcode")) {
+                log.error("获取部门列表 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));
+            }
+        }
+    }
+}

+ 152 - 0
src/main/java/com/jeeplus/modules/wexinpackage/access/util/access/ContactUtil.java

@@ -0,0 +1,152 @@
+package com.jeeplus.modules.wexinpackage.access.util.access;
+
+import com.jeeplus.modules.sys.entity.Office;
+import com.jeeplus.modules.wexinpackage.access.entity.ChangeNumber;
+import com.jeeplus.modules.wexinpackage.access.entity.WeChatUser;
+import com.jeeplus.modules.workstaff.entity.WorkStaffBasicInfo;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Map;
+
+public class ContactUtil {
+    //通讯录事件类型
+    public final static String CHANGE_CONTACT = "change_contact";
+    public final static String UPDATE_USER = "update_user";
+    public final static String CREATE_USER = "create_user";
+    public final static String DELETE_USER = "delete_user";
+
+    //map集合转换成实体类
+    public static <T> T map2Object(Map<String, String> map, Class<T> clazz) {
+        if (map == null) {
+            return null;
+        }
+        T obj = null;
+        try {
+            // 使用newInstance来创建对象
+            obj = clazz.newInstance();
+            // 获取类中的所有字段
+            Field[] fields = obj.getClass().getDeclaredFields();
+            for (Field field : fields) {
+                int mod = field.getModifiers();
+                // 判断是拥有某个修饰符
+                if (Modifier.isStatic(mod) || Modifier.isFinal(mod)) {
+                    continue;
+                }
+                // 当字段使用private修饰时,需要加上
+                field.setAccessible(true);
+                // 获取参数类型名字
+                String filedTypeName = field.getType().getName();
+                // 判断是否为时间类型,使用equalsIgnoreCase比较字符串,不区分大小写
+                // 给obj的属性赋值
+                field.set(obj, map.get(field.getName()));
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return obj;
+    }
+    //人员登记类转换
+    public static WeChatUser replaceUser(WorkStaffBasicInfo workStaffBasicInfo){
+        WeChatUser weChatUser = new WeChatUser();
+        weChatUser.setUserid(workStaffBasicInfo.getNo());
+        weChatUser.setName(workStaffBasicInfo.getName());
+        weChatUser.setDepartment(1);
+        weChatUser.setMobile(workStaffBasicInfo.getMobile());
+        weChatUser.setEmail(workStaffBasicInfo.getEmail());
+        weChatUser.setGender("1");
+        weChatUser.setPosition(workStaffBasicInfo.getDuty());
+        return weChatUser;
+    }
+
+    //获取保存到系统中对象
+    public static WorkStaffBasicInfo getCreateWorkStaffBasicInfo(String roleId,Office office,WorkStaffBasicInfo workStaffBasicInfo, ChangeNumber changeNumber){
+
+        Office company = new Office();
+        company.setName("兴光项目");
+        company.setId("ffe5af5b557e46f28b000c94716e228a");
+        workStaffBasicInfo.setCompany(company);
+        workStaffBasicInfo.setOffice(office);
+//        String idCard = "";
+//        workStaffBasicInfo.setIdCard(idCard);//身份证 -
+        workStaffBasicInfo.setName(changeNumber.getName());//姓名 -- 微信姓名
+        workStaffBasicInfo.setGender(changeNumber.getGender());//性别  --微信姓别性别,1表示男性,2表示女性
+        workStaffBasicInfo.setNation("01");//民族
+//        workStaffBasicInfo = ContactUtil.getDateAndAge(workStaffBasicInfo,idCard);//获取出生日期以及年龄
+        workStaffBasicInfo.setCalendar("01");//公里农历
+        workStaffBasicInfo.setEmail(changeNumber.getEmail());//邮箱
+        workStaffBasicInfo.setMobile(changeNumber.getMobile());//移动电话
+        workStaffBasicInfo.setPhone(changeNumber.getTelephone());//座机
+        workStaffBasicInfo.setStatus("正式");//默认正式
+        workStaffBasicInfo.setEntryDate(new Date());//入职日期
+        workStaffBasicInfo.setMarriage("未婚");
+        workStaffBasicInfo.setPolitics("普通居民");
+        workStaffBasicInfo.setExSoldier("0");
+        workStaffBasicInfo.setNotifyFlag("1");
+        workStaffBasicInfo.setDelFlag("0");
+        workStaffBasicInfo.setRoleId(roleId);
+        workStaffBasicInfo.setIsNewRecord(false);
+        return workStaffBasicInfo;
+    }
+
+    //获取创建日期,以及年龄
+    public static WorkStaffBasicInfo getDateAndAge(WorkStaffBasicInfo workStaffBasicInfo,String idCard){
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yy-MM-dd");
+        Date date = new Date();
+        //得到当前时间日期
+        if (null != idCard && !idCard.equals("")){
+            String year = idCard.substring(6,10);//获取年
+            String month = idCard.substring(10,12);//获取月
+            String day = idCard.substring(12,14);//获取日
+            String data = year+"-"+month+"-"+day;
+            try {
+                date = simpleDateFormat.parse(data);
+                int ageByBirth = getAgeByBirth(date);
+                workStaffBasicInfo.setBirthday(date);//出生日期
+                workStaffBasicInfo.setAge(ageByBirth);//年龄
+            } catch (ParseException e) {
+                e.printStackTrace();
+            }
+            workStaffBasicInfo.setAge(25);//获取年龄
+        }
+        return workStaffBasicInfo;
+    }
+
+    /**
+     * 根据用户生日精确计算年龄
+     * 用Calender对象取得当前日期对象--从对象中分别取出年月日
+     * @author Administrator
+     *
+     */
+    private static int getAgeByBirth(Date birthday){
+        //Calendar:日历
+        /*从Calendar对象中或得一个Date对象*/
+        Calendar cal = Calendar.getInstance();
+        /*把出生日期放入Calendar类型的bir对象中,进行Calendar和Date类型进行转换*/
+        Calendar bir = Calendar.getInstance();
+        bir.setTime(birthday);
+        /*如果生日大于当前日期,则抛出异常:出生日期不能大于当前日期*/
+        if(cal.before(birthday)){
+            throw new IllegalArgumentException("The birthday is before Now,It's unbelievable");
+        }
+        /*取出当前年月日*/
+        int yearNow = cal.get(Calendar.YEAR);
+        int monthNow = cal.get(Calendar.MONTH);
+        int dayNow = cal.get(Calendar.DAY_OF_MONTH);
+        /*取出出生年月日*/
+        int yearBirth = bir.get(Calendar.YEAR);
+        int monthBirth = bir.get(Calendar.MONTH);
+        int dayBirth = bir.get(Calendar.DAY_OF_MONTH);
+        /*大概年龄是当前年减去出生年*/
+        int age = yearNow - yearBirth;
+        /*如果出当前月小与出生月,或者当前月等于出生月但是当前日小于出生日,那么年龄age就减一岁*/
+        if(monthNow < monthBirth || (monthNow == monthBirth && dayNow < dayBirth)){
+            age--;
+        }
+        return age;
+    }
+}

+ 133 - 0
src/main/java/com/jeeplus/modules/wexinpackage/access/util/access/RequestAccess.java

@@ -0,0 +1,133 @@
+package com.jeeplus.modules.wexinpackage.access.util.access;
+
+
+import com.jeeplus.common.utils.MyX509TrustManager;
+import com.jeeplus.modules.wexinpackage.access.entity.AccessToken;
+import net.sf.json.JSONException;
+import net.sf.json.JSONObject;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.net.ssl.HttpsURLConnection;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.TrustManager;
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.net.ConnectException;
+import java.net.HttpURLConnection;
+import java.net.URL;
+
+import static com.jeeplus.common.utils.HttpClientUtil.httpRequest;
+
+/**
+ * 获取token
+ * http请求 以及 https请求
+ */
+public class RequestAccess {
+    private static Logger log = (Logger) LoggerFactory.getLogger(RequestAccess.class);
+    /**
+     * 1.发起https请求并获取结果
+     *
+     * @param requestUrl 请求地址
+     * @param requestMethod 请求方式(GET、POST)
+     * @param outputStr 提交的数据
+     * @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)
+     */
+    public static JSONObject httpRequest(String requestUrl, String requestMethod, String outputStr) {
+        JSONObject jsonObject = null;
+        StringBuffer buffer = new StringBuffer();
+        try {
+            // 创建SSLContext对象,并使用我们指定的信任管理器初始化
+            TrustManager[] tm = { new MyX509TrustManager() };
+            SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
+            sslContext.init(null, tm, new java.security.SecureRandom());
+            // 从上述SSLContext对象中得到SSLSocketFactory对象
+            SSLSocketFactory ssf = sslContext.getSocketFactory();
+
+            URL url = new URL(requestUrl);
+            HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection();
+            httpUrlConn.setSSLSocketFactory(ssf);
+
+            httpUrlConn.setDoOutput(true);
+            httpUrlConn.setDoInput(true);
+            httpUrlConn.setUseCaches(false);
+            httpUrlConn.setRequestMethod(requestMethod);
+            if ("GET".equalsIgnoreCase(requestMethod))
+                httpUrlConn.connect();
+
+            // 当有数据需要提交时
+            if (null != outputStr) {
+                OutputStream outputStream = httpUrlConn.getOutputStream();
+                // 注意编码格式,防止中文乱码
+                outputStream.write(outputStr.getBytes("UTF-8"));
+                outputStream.close();
+            }
+
+            // 将返回的输入流转换成字符串
+            InputStream inputStream = httpUrlConn.getInputStream();
+            InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
+            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
+
+            String str = null;
+            while ((str = bufferedReader.readLine()) != null) {
+                buffer.append(str);
+            }
+            bufferedReader.close();
+            inputStreamReader.close();
+            // 释放资源
+            inputStream.close();
+            inputStream = null;
+            httpUrlConn.disconnect();
+            jsonObject = JSONObject.fromObject(buffer.toString());
+        } catch (ConnectException ce) {
+            log.error("Weixin server connection timed out.");
+        } catch (Exception e) {
+            log.error("https request error:{}", e);
+        }
+        return jsonObject;
+    }
+
+    /**
+     * 2.发起http请求获取返回结果
+     *
+     * @param requestUrl 请求地址
+     * @return
+     */
+    public static String httpRequest(String requestUrl) {
+        StringBuffer buffer = new StringBuffer();
+        try {
+            URL url = new URL(requestUrl);
+            HttpURLConnection httpUrlConn = (HttpURLConnection) url.openConnection();
+
+            httpUrlConn.setDoOutput(false);
+            httpUrlConn.setDoInput(true);
+            httpUrlConn.setUseCaches(false);
+
+            httpUrlConn.setRequestMethod("GET");
+            httpUrlConn.connect();
+
+            // 将返回的输入流转换成字符串
+            InputStream inputStream = httpUrlConn.getInputStream();
+            InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
+            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
+
+            String str = null;
+            while ((str = bufferedReader.readLine()) != null) {
+                buffer.append(str);
+            }
+            bufferedReader.close();
+            inputStreamReader.close();
+            // 释放资源
+            inputStream.close();
+            inputStream = null;
+            httpUrlConn.disconnect();
+
+        } catch (Exception e) {
+        }
+        return buffer.toString();
+    }
+}

+ 40 - 0
src/main/java/com/jeeplus/modules/wexinpackage/access/util/access/WeChatParamsUtil.java

@@ -0,0 +1,40 @@
+package com.jeeplus.modules.wexinpackage.access.util.access;
+
+/**
+ * 微信参数封装
+ */
+public class WeChatParamsUtil {
+    //token
+    public final static String token ="9ZmhR1CRrGIOSMxCcznVccQN8f3XX2w4GMoacioSkovFuJdCwMBvTHsJpGf67bUVtkHEqLzYIyaamn9dEyPJKcVxgIeERJpAwa9uNtW68EXYwOBvR2blpiQ3aM9l7ndqMJThfEWlcUz8oBzOh6XZPQqTcLwb95yHhwQO14KdIXj6Q1nko9rjp-9c-LsrzoS_SNu4TxTqTqoYj5ztp3J9Wg";
+    //企业id
+    public final static String corpId = "wwb8c36b4b35675fe9";
+    //应用的凭证密钥
+    public final static String agentSecret = "kekm2UtL_82xFr6tMi4N2cWQFMHNKhLD-0bwIIaUQP0";
+    //通讯录秘钥 (获取tokenid)
+    public final static String contactsSecret = "X67oIAoM8_SR9VhW7exd4_JKaeW5st8DKxvNluTZfi4";
+    //企业应用的id,整型。可在应用的设置页面查看
+    public final static int agentId = 1000002;
+    //通讯录token
+    public final static String contacts_token = "jqzaHYO";
+    // encodingAESKey
+    public final static String encodingAESKey = "YnOAOlnqpx3qudeoQxmo8W1YSneCubW3zVWntu1g4vT";
+
+    final static String ACCESS_TOKEN_URL = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={corpId}&corpsecret={corpsecret}";
+    //创建用户
+    final static String CREATE_USER = "https://qyapi.weixin.qq.com/cgi-bin/user/create?access_token=ACCESS_TOKEN";
+    //更新用户
+    final static String UPDATE_USER = "https://qyapi.weixin.qq.com/cgi-bin/user/update?access_token=ACCESS_TOKEN";
+    //删除用户
+    final static  String DELETE_USER="https://qyapi.weixin.qq.com/cgi-bin/user/delete?access_token=ACCESS_TOKEN&userid=USERID";
+    //查找用户
+    public final static  String SELECT_USER="https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN&userid=USERID";
+
+    //创建部门
+    final static String create_department = "https://qyapi.weixin.qq.com/cgi-bin/department/create?access_token=ACCESS_TOKEN";
+    //更新部门
+    final static String update_department = "https://qyapi.weixin.qq.com/cgi-bin/department/update?access_token=ACCESS_TOKEN";
+    //删除部门
+    final static String delete_department = "https://qyapi.weixin.qq.com/cgi-bin/department/delete?access_token=ACCESS_TOKEN&id=ID";
+    //获取部门列表
+    final static String select_department = "https://qyapi.weixin.qq.com/cgi-bin/department/list?access_token=ACCESS_TOKEN&id=ID";
+}

+ 58 - 0
src/main/java/com/jeeplus/modules/wexinpackage/access/util/encryption/AesException.java

@@ -0,0 +1,58 @@
+package com.jeeplus.modules.wexinpackage.access.util.encryption;
+
+public class AesException extends Exception {
+
+	public final static int OK = 0;
+	public final static int ValidateSignatureError = -40001;
+	public final static int ParseXmlError = -40002;
+	public final static int ComputeSignatureError = -40003;
+	public final static int IllegalAesKey = -40004;
+	public final static int ValidateCorpidError = -40005;
+	public final static int EncryptAESError = -40006;
+	public final static int DecryptAESError = -40007;
+	public final static int IllegalBuffer = -40008;
+	//public final static int EncodeBase64Error = -40009;
+	//public final static int DecodeBase64Error = -40010;
+	//public final static int GenReturnXmlError = -40011;
+
+	private int code;
+
+	private static String getMessage(int code) {
+		switch (code) {
+		case ValidateSignatureError:
+			return "签名验证错误";
+		case ParseXmlError:
+			return "xml解析失败";
+		case ComputeSignatureError:
+			return "sha加密生成签名失败";
+		case IllegalAesKey:
+			return "SymmetricKey非法";
+		case ValidateCorpidError:
+			return "corpid校验失败";
+		case EncryptAESError:
+			return "aes加密失败";
+		case DecryptAESError:
+			return "aes解密失败";
+		case IllegalBuffer:
+			return "解密后得到的buffer非法";
+//		case EncodeBase64Error:
+//			return "base64加密错误";
+//		case DecodeBase64Error:
+//			return "base64解密错误";
+//		case GenReturnXmlError:
+//			return "xml生成失败";
+		default:
+			return null; // cannot be
+		}
+	}
+
+	public int getCode() {
+		return code;
+	}
+
+	AesException(int code) {
+		super(getMessage(code));
+		this.code = code;
+	}
+
+}

+ 26 - 0
src/main/java/com/jeeplus/modules/wexinpackage/access/util/encryption/ByteGroup.java

@@ -0,0 +1,26 @@
+package com.jeeplus.modules.wexinpackage.access.util.encryption;
+
+import java.util.ArrayList;
+
+class ByteGroup {
+	ArrayList<Byte> byteContainer = new ArrayList<Byte>();
+
+	public byte[] toBytes() {
+		byte[] bytes = new byte[byteContainer.size()];
+		for (int i = 0; i < byteContainer.size(); i++) {
+			bytes[i] = byteContainer.get(i);
+		}
+		return bytes;
+	}
+
+	public ByteGroup addBytes(byte[] bytes) {
+		for (byte b : bytes) {
+			byteContainer.add(b);
+		}
+		return this;
+	}
+
+	public int size() {
+		return byteContainer.size();
+	}
+}

+ 67 - 0
src/main/java/com/jeeplus/modules/wexinpackage/access/util/encryption/PKCS7Encoder.java

@@ -0,0 +1,67 @@
+/**
+ * 对企业微信发送给企业后台的消息加解密示例代码.
+ * 
+ * @copyright Copyright (c) 1998-2014 Tencent Inc.
+ */
+
+// ------------------------------------------------------------------------
+
+package com.jeeplus.modules.wexinpackage.access.util.encryption;
+
+import java.nio.charset.Charset;
+import java.util.Arrays;
+
+/**
+ * 提供基于PKCS7算法的加解密接口.
+ */
+class PKCS7Encoder {
+	static Charset CHARSET = Charset.forName("utf-8");
+	static int BLOCK_SIZE = 32;
+
+	/**
+	 * 获得对明文进行补位填充的字节.
+	 * 
+	 * @param count 需要进行填充补位操作的明文字节个数
+	 * @return 补齐用的字节数组
+	 */
+	static byte[] encode(int count) {
+		// 计算需要填充的位数
+		int amountToPad = BLOCK_SIZE - (count % BLOCK_SIZE);
+		if (amountToPad == 0) {
+			amountToPad = BLOCK_SIZE;
+		}
+		// 获得补位所用的字符
+		char padChr = chr(amountToPad);
+		String tmp = new String();
+		for (int index = 0; index < amountToPad; index++) {
+			tmp += padChr;
+		}
+		return tmp.getBytes(CHARSET);
+	}
+
+	/**
+	 * 删除解密后明文的补位字符
+	 * 
+	 * @param decrypted 解密后的明文
+	 * @return 删除补位字符后的明文
+	 */
+	static byte[] decode(byte[] decrypted) {
+		int pad = (int) decrypted[decrypted.length - 1];
+		if (pad < 1 || pad > 32) {
+			pad = 0;
+		}
+		return Arrays.copyOfRange(decrypted, 0, decrypted.length - pad);
+	}
+
+	/**
+	 * 将数字转化成ASCII码对应的字符,用于对明文进行补码
+	 * 
+	 * @param a 需要转化的数字
+	 * @return 转化得到的字符
+	 */
+	static char chr(int a) {
+		byte target = (byte) (a & 0xFF);
+		return (char) target;
+	}
+
+}

+ 63 - 0
src/main/java/com/jeeplus/modules/wexinpackage/access/util/encryption/SHA1.java

@@ -0,0 +1,63 @@
+/**
+ * 对企业微信发送给企业后台的消息加解密示例代码.
+ * 
+ * @copyright Copyright (c) 1998-2014 Tencent Inc.
+ */
+
+// ------------------------------------------------------------------------
+
+package com.jeeplus.modules.wexinpackage.access.util.encryption;
+
+import com.jeeplus.modules.wexinpackage.access.util.encryption.AesException;
+
+import java.security.MessageDigest;
+import java.util.Arrays;
+
+/**
+ * SHA1 class
+ *
+ * 计算消息签名接口.
+ */
+class SHA1 {
+
+	/**
+	 * 用SHA1算法生成安全签名
+	 * @param token 票据
+	 * @param timestamp 时间戳
+	 * @param nonce 随机字符串
+	 * @param encrypt 密文
+	 * @return 安全签名
+	 * @throws AesException
+	 */
+	public static String getSHA1(String token, String timestamp, String nonce, String encrypt) throws AesException
+			  {
+		try {
+			String[] array = new String[] { token, timestamp, nonce, encrypt };
+			StringBuffer sb = new StringBuffer();
+			// 字符串排序
+			Arrays.sort(array);
+			for (int i = 0; i < 4; i++) {
+				sb.append(array[i]);
+			}
+			String str = sb.toString();
+			// SHA1签名生成
+			MessageDigest md = MessageDigest.getInstance("SHA-1");
+			md.update(str.getBytes());
+			byte[] digest = md.digest();
+
+			StringBuffer hexstr = new StringBuffer();
+			String shaHex = "";
+			for (int i = 0; i < digest.length; i++) {
+				shaHex = Integer.toHexString(digest[i] & 0xFF);
+				if (shaHex.length() < 2) {
+					hexstr.append(0);
+				}
+				hexstr.append(shaHex);
+			}
+			return hexstr.toString();
+		} catch (Exception e) {
+			e.printStackTrace();
+			throw new AesException(AesException.ComputeSignatureError);
+		}
+	}
+}

+ 289 - 0
src/main/java/com/jeeplus/modules/wexinpackage/access/util/encryption/WXBizMsgCrypt.java

@@ -0,0 +1,289 @@
+/**
+ * 对企业微信发送给企业后台的消息加解密示例代码.
+ * 
+ * @copyright Copyright (c) 1998-2014 Tencent Inc.
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * 针对org.apache.commons.codec.binary.Base64,
+ * 需要导入架包commons-codec-1.9(或commons-codec-1.8等其他版本)
+ * 官方下载地址:http://commons.apache.org/proper/commons-codec/download_codec.cgi
+ */
+package com.jeeplus.modules.wexinpackage.access.util.encryption;
+
+import java.nio.charset.Charset;
+import java.util.Arrays;
+import java.util.Random;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+
+import org.apache.commons.codec.binary.Base64;
+
+/**
+ * 提供接收和推送给企业微信消息的加解密接口(UTF8编码的字符串).
+ * <ol>
+ * 	<li>第三方回复加密消息给企业微信</li>
+ * 	<li>第三方收到企业微信发送的消息,验证消息的安全性,并对消息进行解密。</li>
+ * </ol>
+ * 说明:异常java.security.InvalidKeyException:illegal Key Size的解决方案
+ * <ol>
+ * 	<li>在官方网站下载JCE无限制权限策略文件(JDK7的下载地址:
+ *      http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html</li>
+ * 	<li>下载后解压,可以看到local_policy.jar和US_export_policy.jar以及readme.txt</li>
+ * 	<li>如果安装了JRE,将两个jar文件放到%JRE_HOME%\lib\security目录下覆盖原来的文件</li>
+ * 	<li>如果安装了JDK,将两个jar文件放到%JDK_HOME%\jre\lib\security目录下覆盖原来文件</li>
+ * </ol>
+ */
+public class WXBizMsgCrypt {
+	static Charset CHARSET = Charset.forName("utf-8");
+	Base64 base64 = new Base64();
+	byte[] aesKey;
+	String token;
+	String receiveid;
+
+	/**
+	 * 构造函数
+	 * @param token 企业微信后台,开发者设置的token
+	 * @param encodingAesKey 企业微信后台,开发者设置的EncodingAESKey
+	 * @param receiveid, 不同场景含义不同,详见文档
+	 * 
+	 * @throws AesException 执行失败,请查看该异常的错误码和具体的错误信息
+	 */
+	public WXBizMsgCrypt(String token, String encodingAesKey, String receiveid) throws AesException {
+		if (encodingAesKey.length() != 43) {
+			throw new AesException(AesException.IllegalAesKey);
+		}
+
+		this.token = token;
+		this.receiveid = receiveid;
+		aesKey = Base64.decodeBase64(encodingAesKey + "=");
+	}
+
+	// 生成4个字节的网络字节序
+	byte[] getNetworkBytesOrder(int sourceNumber) {
+		byte[] orderBytes = new byte[4];
+		orderBytes[3] = (byte) (sourceNumber & 0xFF);
+		orderBytes[2] = (byte) (sourceNumber >> 8 & 0xFF);
+		orderBytes[1] = (byte) (sourceNumber >> 16 & 0xFF);
+		orderBytes[0] = (byte) (sourceNumber >> 24 & 0xFF);
+		return orderBytes;
+	}
+
+	// 还原4个字节的网络字节序
+	int recoverNetworkBytesOrder(byte[] orderBytes) {
+		int sourceNumber = 0;
+		for (int i = 0; i < 4; i++) {
+			sourceNumber <<= 8;
+			sourceNumber |= orderBytes[i] & 0xff;
+		}
+		return sourceNumber;
+	}
+
+	// 随机生成16位字符串
+	String getRandomStr() {
+		String base = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
+		Random random = new Random();
+		StringBuffer sb = new StringBuffer();
+		for (int i = 0; i < 16; i++) {
+			int number = random.nextInt(base.length());
+			sb.append(base.charAt(number));
+		}
+		return sb.toString();
+	}
+
+	/**
+	 * 对明文进行加密.
+	 * 
+	 * @param text 需要加密的明文
+	 * @return 加密后base64编码的字符串
+	 * @throws AesException aes加密失败
+	 */
+	String encrypt(String randomStr, String text) throws AesException {
+		ByteGroup byteCollector = new ByteGroup();
+		byte[] randomStrBytes = randomStr.getBytes(CHARSET);
+		byte[] textBytes = text.getBytes(CHARSET);
+		byte[] networkBytesOrder = getNetworkBytesOrder(textBytes.length);
+		byte[] receiveidBytes = receiveid.getBytes(CHARSET);
+
+		// randomStr + networkBytesOrder + text + receiveid
+		byteCollector.addBytes(randomStrBytes);
+		byteCollector.addBytes(networkBytesOrder);
+		byteCollector.addBytes(textBytes);
+		byteCollector.addBytes(receiveidBytes);
+
+		// ... + pad: 使用自定义的填充方式对明文进行补位填充
+		byte[] padBytes = PKCS7Encoder.encode(byteCollector.size());
+		byteCollector.addBytes(padBytes);
+
+		// 获得最终的字节流, 未加密
+		byte[] unencrypted = byteCollector.toBytes();
+
+		try {
+			// 设置加密模式为AES的CBC模式
+			Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
+			SecretKeySpec keySpec = new SecretKeySpec(aesKey, "AES");
+			IvParameterSpec iv = new IvParameterSpec(aesKey, 0, 16);
+			cipher.init(Cipher.ENCRYPT_MODE, keySpec, iv);
+
+			// 加密
+			byte[] encrypted = cipher.doFinal(unencrypted);
+
+			// 使用BASE64对加密后的字符串进行编码
+			String base64Encrypted = base64.encodeToString(encrypted);
+
+			return base64Encrypted;
+		} catch (Exception e) {
+			e.printStackTrace();
+			throw new AesException(AesException.EncryptAESError);
+		}
+	}
+
+	/**
+	 * 对密文进行解密.
+	 * 
+	 * @param text 需要解密的密文
+	 * @return 解密得到的明文
+	 * @throws AesException aes解密失败
+	 */
+	String decrypt(String text) throws AesException {
+		byte[] original;
+		try {
+			// 设置解密模式为AES的CBC模式
+			Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
+			SecretKeySpec key_spec = new SecretKeySpec(aesKey, "AES");
+			IvParameterSpec iv = new IvParameterSpec(Arrays.copyOfRange(aesKey, 0, 16));
+			cipher.init(Cipher.DECRYPT_MODE, key_spec, iv);
+
+			// 使用BASE64对密文进行解码
+			byte[] encrypted = Base64.decodeBase64(text);
+
+			// 解密
+			original = cipher.doFinal(encrypted);
+		} catch (Exception e) {
+			e.printStackTrace();
+			throw new AesException(AesException.DecryptAESError);
+		}
+
+		String xmlContent, from_receiveid;
+		try {
+			// 去除补位字符
+			byte[] bytes = PKCS7Encoder.decode(original);
+
+			// 分离16位随机字符串,网络字节序和receiveid
+			byte[] networkOrder = Arrays.copyOfRange(bytes, 16, 20);
+
+			int xmlLength = recoverNetworkBytesOrder(networkOrder);
+
+			xmlContent = new String(Arrays.copyOfRange(bytes, 20, 20 + xmlLength), CHARSET);
+			from_receiveid = new String(Arrays.copyOfRange(bytes, 20 + xmlLength, bytes.length),
+					CHARSET);
+		} catch (Exception e) {
+			e.printStackTrace();
+			throw new AesException(AesException.IllegalBuffer);
+		}
+
+		// receiveid不相同的情况
+		if (!from_receiveid.equals(receiveid)) {
+			throw new AesException(AesException.ValidateCorpidError);
+		}
+		return xmlContent;
+
+	}
+
+	/**
+	 * 将企业微信回复用户的消息加密打包.
+	 * <ol>
+	 * 	<li>对要发送的消息进行AES-CBC加密</li>
+	 * 	<li>生成安全签名</li>
+	 * 	<li>将消息密文和安全签名打包成xml格式</li>
+	 * </ol>
+	 * 
+	 * @param replyMsg 企业微信待回复用户的消息,xml格式的字符串
+	 * @param timeStamp 时间戳,可以自己生成,也可以用URL参数的timestamp
+	 * @param nonce 随机串,可以自己生成,也可以用URL参数的nonce
+	 * 
+	 * @return 加密后的可以直接回复用户的密文,包括msg_signature, timestamp, nonce, encrypt的xml格式的字符串
+	 * @throws AesException 执行失败,请查看该异常的错误码和具体的错误信息
+	 */
+	public String EncryptMsg(String replyMsg, String timeStamp, String nonce) throws AesException {
+		// 加密
+		String encrypt = encrypt(getRandomStr(), replyMsg);
+
+		// 生成安全签名
+		if (timeStamp == "") {
+			timeStamp = Long.toString(System.currentTimeMillis());
+		}
+
+		String signature = SHA1.getSHA1(token, timeStamp, nonce, encrypt);
+
+		// System.out.println("发送给平台的签名是: " + signature[1].toString());
+		// 生成发送的xml
+		String result = XMLParse.generate(encrypt, signature, timeStamp, nonce);
+		return result;
+	}
+
+	/**
+	 * 检验消息的真实性,并且获取解密后的明文.
+	 * <ol>
+	 * 	<li>利用收到的密文生成安全签名,进行签名验证</li>
+	 * 	<li>若验证通过,则提取xml中的加密消息</li>
+	 * 	<li>对消息进行解密</li>
+	 * </ol>
+	 * 
+	 * @param msgSignature 签名串,对应URL参数的msg_signature
+	 * @param timeStamp 时间戳,对应URL参数的timestamp
+	 * @param nonce 随机串,对应URL参数的nonce
+	 * @param postData 密文,对应POST请求的数据
+	 * 
+	 * @return 解密后的原文
+	 * @throws AesException 执行失败,请查看该异常的错误码和具体的错误信息
+	 */
+	public String DecryptMsg(String msgSignature, String timeStamp, String nonce, String postData)
+			throws AesException {
+
+		// 密钥,公众账号的app secret
+		// 提取密文
+		Object[] encrypt = XMLParse.extract(postData);
+
+		// 验证安全签名
+		String signature = SHA1.getSHA1(token, timeStamp, nonce, encrypt[1].toString());
+
+		// 和URL中的签名比较是否相等
+		// System.out.println("第三方收到URL中的签名:" + msg_sign);
+		// System.out.println("第三方校验签名:" + signature);
+		if (!signature.equals(msgSignature)) {
+			throw new AesException(AesException.ValidateSignatureError);
+		}
+
+		// 解密
+		String result = decrypt(encrypt[1].toString());
+		return result;
+	}
+
+	/**
+	 * 验证URL
+	 * @param msgSignature 签名串,对应URL参数的msg_signature
+	 * @param timeStamp 时间戳,对应URL参数的timestamp
+	 * @param nonce 随机串,对应URL参数的nonce
+	 * @param echoStr 随机串,对应URL参数的echostr
+	 * 
+	 * @return 解密之后的echostr
+	 * @throws AesException 执行失败,请查看该异常的错误码和具体的错误信息
+	 */
+	public String VerifyURL(String msgSignature, String timeStamp, String nonce, String echoStr)
+			throws AesException {
+		String signature = SHA1.getSHA1(token, timeStamp, nonce, echoStr);
+
+		if (!signature.equals(msgSignature)) {
+			throw new AesException(AesException.ValidateSignatureError);
+		}
+
+		String result = decrypt(echoStr);
+		return result;
+	}
+
+}

+ 107 - 0
src/main/java/com/jeeplus/modules/wexinpackage/access/util/encryption/XMLParse.java

@@ -0,0 +1,107 @@
+/**
+ * 对企业微信发送给企业后台的消息加解密示例代码.
+ * 
+ * @copyright Copyright (c) 1998-2014 Tencent Inc.
+ */
+
+// ------------------------------------------------------------------------
+
+package com.jeeplus.modules.wexinpackage.access.util.encryption;
+
+import java.io.StringReader;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import com.jeeplus.modules.wexinpackage.access.util.encryption.AesException;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+import org.xml.sax.InputSource;
+
+/**
+ * XMLParse class
+ *
+ * 提供提取消息格式中的密文及生成回复消息格式的接口.
+ */
+class XMLParse {
+
+	/**
+	 * 提取出xml数据包中的加密消息
+	 * @param xmltext 待提取的xml字符串
+	 * @return 提取出的加密消息字符串
+	 * @throws AesException
+	 */
+	public static Object[] extract(String xmltext) throws AesException     {
+		Object[] result = new Object[3];
+		try {
+			DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+			
+			String FEATURE = null;
+			// This is the PRIMARY defense. If DTDs (doctypes) are disallowed, almost all XML entity attacks are prevented
+			// Xerces 2 only - http://xerces.apache.org/xerces2-j/features.html#disallow-doctype-decl
+			FEATURE = "http://apache.org/xml/features/disallow-doctype-decl";
+			dbf.setFeature(FEATURE, true);
+			
+			// If you can't completely disable DTDs, then at least do the following:
+			// Xerces 1 - http://xerces.apache.org/xerces-j/features.html#external-general-entities
+			// Xerces 2 - http://xerces.apache.org/xerces2-j/features.html#external-general-entities
+			// JDK7+ - http://xml.org/sax/features/external-general-entities 
+			FEATURE = "http://xml.org/sax/features/external-general-entities";
+			dbf.setFeature(FEATURE, false);
+			
+			// Xerces 1 - http://xerces.apache.org/xerces-j/features.html#external-parameter-entities
+			// Xerces 2 - http://xerces.apache.org/xerces2-j/features.html#external-parameter-entities
+			// JDK7+ - http://xml.org/sax/features/external-parameter-entities 
+			FEATURE = "http://xml.org/sax/features/external-parameter-entities";
+			dbf.setFeature(FEATURE, false);
+			
+			// Disable external DTDs as well
+			FEATURE = "http://apache.org/xml/features/nonvalidating/load-external-dtd";
+			dbf.setFeature(FEATURE, false);
+			
+			// and these as well, per Timothy Morgan's 2014 paper: "XML Schema, DTD, and Entity Attacks"
+			dbf.setXIncludeAware(false);
+			dbf.setExpandEntityReferences(false);
+			
+			// And, per Timothy Morgan: "If for some reason support for inline DOCTYPEs are a requirement, then 
+			// ensure the entity settings are disabled (as shown above) and beware that SSRF attacks
+			// (http://cwe.mitre.org/data/definitions/918.html) and denial 
+			// of service attacks (such as billion laughs or decompression bombs via "jar:") are a risk."
+			
+			// remaining parser logic
+			DocumentBuilder db = dbf.newDocumentBuilder();
+			StringReader sr = new StringReader(xmltext);
+			InputSource is = new InputSource(sr);
+			Document document = db.parse(is);
+
+			Element root = document.getDocumentElement();
+			NodeList nodelist1 = root.getElementsByTagName("Encrypt");
+			NodeList nodelist2 = root.getElementsByTagName("ToUserName");
+			result[0] = 0;
+			result[1] = nodelist1.item(0).getTextContent();
+			result[2] = nodelist2.item(0).getTextContent();
+			return result;
+		} catch (Exception e) {
+			e.printStackTrace();
+			throw new AesException(AesException.ParseXmlError);
+		}
+	}
+
+	/**
+	 * 生成xml消息
+	 * @param encrypt 加密后的消息密文
+	 * @param signature 安全签名
+	 * @param timestamp 时间戳
+	 * @param nonce 随机字符串
+	 * @return 生成的xml字符串
+	 */
+	public static String generate(String encrypt, String signature, String timestamp, String nonce) {
+
+		String format = "<xml>\n" + "<Encrypt><![CDATA[%1$s]]></Encrypt>\n"
+				+ "<MsgSignature><![CDATA[%2$s]]></MsgSignature>\n"
+				+ "<TimeStamp>%3$s</TimeStamp>\n" + "<Nonce><![CDATA[%4$s]]></Nonce>\n" + "</xml>";
+		return String.format(format, encrypt, signature, timestamp, nonce);
+
+	}
+}

+ 109 - 0
src/main/java/com/jeeplus/modules/wexinpackage/access/web/MessageController.java

@@ -0,0 +1,109 @@
+package com.jeeplus.modules.wexinpackage.access.web;
+
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.modules.sys.dao.UserDao;
+import com.jeeplus.modules.sys.entity.Office;
+import com.jeeplus.modules.sys.entity.Role;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.service.OfficeService;
+import com.jeeplus.modules.sys.service.RoleService;
+import com.jeeplus.modules.sys.service.SystemService;
+import com.jeeplus.modules.sys.service.UserService;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.workstaff.entity.WorkStaffBasicInfo;
+import com.jeeplus.modules.workstaff.service.WorkStaffBasicInfoService;
+import org.bouncycastle.math.raw.Mod;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+@Controller
+@RequestMapping(value = "${adminPath}/wxMessage/messageController")
+public class MessageController extends BaseController {
+
+    @Autowired
+    private SystemService systemService;
+
+    @Autowired
+    private RoleService roleService;
+
+    @Autowired
+    private OfficeService officeService;
+
+    @Autowired
+    private WorkStaffBasicInfoService workStaffBasicInfoService;
+    //主页展示
+    @RequestMapping(value = "messageList")
+    public String messageList(HttpServletRequest request, HttpServletResponse response) {
+        return "modules/weixin/home";
+    }
+    //详细信息
+    @RequestMapping(value = "contactForm")
+    public String contactForm(WorkStaffBasicInfo workStaffBasicInfo, Model model, boolean reFlag) {
+        workStaffBasicInfo = workStaffBasicInfoService.get(workStaffBasicInfo.getId());
+        Role role = roleService.get(roleService.getRoleIdByUserId(workStaffBasicInfo.getUserId()));
+        workStaffBasicInfo.setRoleId(role.getId());
+        workStaffBasicInfo.setRoleName(role.getName());
+        model.addAttribute("workStaffBasicInfo", workStaffBasicInfo);
+        return  "modules/weixin/user/contactForm";
+    }
+
+    //联系人列表展示
+    @RequestMapping(value = "contactList")
+    public String contactList(WorkStaffBasicInfo workStaffBasicInfo,HttpServletRequest request, HttpServletResponse response, Model model) {
+        List<WorkStaffBasicInfo> workStaffBasicInfos = workStaffBasicInfoService.wxFindAddressBook(workStaffBasicInfo);
+        model.addAttribute("users",workStaffBasicInfos);
+        return  "modules/weixin/user/contactList";
+    }
+    //部门列表
+    @RequestMapping(value = "departmentList")
+    public String departmentList(Model model){
+        Office office = new Office();
+        List<Office> list = officeService.findList(office);
+        model.addAttribute("departments",list);
+        return "modules/weixin/departmentList";
+    }
+
+//    public String
+
+
+
+
+//    // 微信加密签名
+//    ${adminPath}/wxMessage/** = anon
+//    String msg_signature = request.getParameter("msg_signature");
+//    // 时间戳
+//    String timestamp = request.getParameter("timestamp");
+//    // 随机数
+//    String nonce = request.getParameter("nonce");
+//    // 随机字符串
+//    String echoStr = request.getParameter("echostr");
+//    //回调key值
+//    String sEchoStr = null;
+//
+//    String contacts_token = "MYTVsHqnNnAwvNJXn6";
+//    String contacts_encodingaeskey = "fnM1vuVzzTdpk8b6EOVto4JMvb7F9ybOmC60R7Lrqy7";
+//    String corpId = "wwb8c36b4b35675fe9";
+//    WXBizMsgCrypt wxcpt;
+//        try {
+//        PrintWriter writer = response.getWriter();
+//        wxcpt = new WXBizMsgCrypt(contacts_token,contacts_encodingaeskey,corpId);
+//        sEchoStr = wxcpt.VerifyURL(msg_signature, timestamp, nonce, echoStr);
+//        if (StringUtils.isBlank(sEchoStr)){
+//            logger.error("url验证失败");
+//        }
+//        writer.write(sEchoStr+"111111111111111");
+//        System.out.println(msg_signature+"111111111111111");
+//        System.out.println(timestamp+"111111111111111");
+//        System.out.println(nonce+"111111111111111");
+//        System.out.println(echoStr+"111111111111111");
+//        System.out.println("连接成功-------------");
+//        writer.close();
+//    }catch (Exception e){
+//        logger.error("企业微信回调验证错误",e);
+//    }
+}

+ 257 - 0
src/main/java/com/jeeplus/modules/wexinpackage/access/web/WeChatCallbackController.java

@@ -0,0 +1,257 @@
+package com.jeeplus.modules.wexinpackage.access.web;
+
+
+import com.alibaba.fastjson.JSONObject;
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.utils.JedisUtils;
+import com.jeeplus.common.utils.MyBeanUtils;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.modules.sys.entity.Company;
+import com.jeeplus.modules.sys.entity.Office;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.service.OfficeService;
+import com.jeeplus.modules.sys.service.SystemService;
+import com.jeeplus.modules.sys.service.UserService;
+import com.jeeplus.modules.wexinpackage.access.service.WeChatCallbackService;
+import com.jeeplus.modules.wexinpackage.access.util.access.WeChatParamsUtil;
+import com.jeeplus.modules.wexinpackage.access.util.encryption.WXBizMsgCrypt;
+import com.jeeplus.modules.workstaff.service.WorkStaffBasicInfoService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.BufferedReader;
+import java.io.PrintWriter;
+
+@Controller
+@RequestMapping(value = "${adminPath}/weChatCallBack/weChatController")
+public class WeChatCallbackController extends BaseController {
+    @Autowired
+    private WeChatCallbackService weChatCallbackService;
+
+    @RequestMapping(value = "callBack")
+    public void getCallBack(HttpServletRequest request, HttpServletResponse response) throws Exception{
+        String method = request.getMethod();
+        if ("GET".equals(method)){
+            doGet(request,response);
+        }else {
+            doPost(request,response);
+        }
+    }
+    private void doGet(HttpServletRequest request, HttpServletResponse response){
+        // 微信加密签名
+        String msg_signature = request.getParameter("msg_signature");
+        // 时间戳
+        String timestamp = request.getParameter("timestamp");
+        // 随机数
+        String nonce = request.getParameter("nonce");
+        // 随机字符串
+        String echoStr = request.getParameter("echostr");
+        //回调key值
+        String sEchoStr = null;
+        WXBizMsgCrypt wxcpt;
+            try {
+            PrintWriter writer = response.getWriter();
+            wxcpt = new WXBizMsgCrypt(WeChatParamsUtil.contacts_token,WeChatParamsUtil.encodingAESKey,WeChatParamsUtil.corpId);
+            sEchoStr = wxcpt.VerifyURL(msg_signature, timestamp, nonce, echoStr);
+            if (StringUtils.isBlank(sEchoStr)){
+                logger.error("url验证失败");
+            }
+            writer.write(sEchoStr);
+            writer.close();
+        }catch (Exception e){
+            logger.error("企业微信回调验证错误",e);
+        }
+    }
+    private  void  doPost(HttpServletRequest request, HttpServletResponse response) throws Exception{
+        String sReqMsgSig = request.getParameter("msg_signature");
+        String sReqTimeStamp = request.getParameter("timestamp");
+        String sReqNonce = request.getParameter("nonce");
+//        try {
+            BufferedReader reader = request.getReader();
+            char[] buf = new char[512];
+            int len = 0;
+            StringBuffer stringBuffer = new StringBuffer();
+            while ((len = (int) reader.read(buf))!= -1){
+                stringBuffer =  stringBuffer.append(buf, 0, len);
+            }
+            String content = stringBuffer.toString();
+            if (content == null){
+                content = "";
+            }
+            WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(WeChatParamsUtil.contacts_token,WeChatParamsUtil.encodingAESKey,WeChatParamsUtil.corpId);
+            String sMsg = wxcpt.DecryptMsg(sReqMsgSig, sReqTimeStamp, sReqNonce, content);
+            weChatCallbackService.getMapOperation(sMsg,request);
+            // 循环所有子元素
+//        } catch (Exception e) {
+//            // TODO
+//            // 解密失败,失败原因请查看异常
+//            e.printStackTrace();
+//        }
+    }
+
+//    public void getSaveUser(List children,HttpServletRequest request){
+//        String userId= "";
+//        String ChangeType = "";
+//        if (children != null && children.size() > 0) {
+//            for (int i = 0; i < children.size(); i++) {
+//                Element child = (Element) children.get(i);
+//                //xml转Map
+//                System.out.println(child.getName()+"======"+child.getTextTrim());
+//                if (child.getName().equals("ChangeType")){
+//                    ChangeType = child.getTextTrim();
+//                }
+//                if (child.getName().equals("UserID")){
+//                    userId = child.getTextTrim();
+//                    break;
+//                }
+//            }
+//        }
+//        if (ChangeType.contains("update")){
+//            WeChatUser weChatUser1 = new WeChatUser();
+//            String s = UserUrl.getUser("", userId);
+//            JSONObject jsonObject = JSONObject.parseObject(s);
+//            Map<String,Object> map = JSONObject.toJavaObject(jsonObject,Map.class);
+//            weChatUser1.setUserid((String) map.get("userid"));
+//            weChatUser1.setName((String) map.get("name"));
+//            weChatUser1.setGender((String)map.get("gender"));//性别
+//            weChatUser1.setTelephone((String)map.get("telephone"));//座机
+//            weChatUser1.setMobile((String) map.get("mobile"));
+//            weChatUser1.setMobile((String)map.get("alias"));//别名
+//            weChatUser1.setEmail((String) map.get("email"));
+//            weChatUser1.setAddress((String)map.get("address"));//地址
+////            WorkStaffBasicInfo  workStaffBasicInfo = new WorkStaffBasicInfo();
+//            WorkStaffBasicInfo workStaffBasicInfo = new WorkStaffBasicInfo();
+//            User user = new User();
+//            Office office = new Office();
+//            office.setName("财务部");
+//            office.setId("379981dac65a4b26a59f2f6d373da091");
+//            user.setOffice(office);
+//            workStaffBasicInfo.setOffice(office);
+//            Office office1 = new Office();
+//            office1.setName("兴光项目");
+//            office1.setId("ffe5af5b557e46f28b000c94716e228a");
+//            user.setCompany(office1);
+//            workStaffBasicInfo.setCompany(office1);
+//            user.setComId("ffe5af5b557e46f28b000c94716e228a");
+//            user.setLoginName(weChatUser1.getUserid());//登录名
+//            workStaffBasicInfo.setNo(weChatUser1.getUserid());
+//            user.setName(weChatUser1.getName());
+//            workStaffBasicInfo.setName(weChatUser1.getName());
+//            workStaffBasicInfo.setNo(weChatUser1.getUserid());
+////            workStaffBasicInfo.setNo(weChatUser.getMobile());
+//            workStaffBasicInfo.setGender(weChatUser1.getGender());
+//            workStaffBasicInfo.setNation("01");
+//            workStaffBasicInfo.setAge(24);
+//            workStaffBasicInfo.setStatus("正式");
+//            workStaffBasicInfo.setBranchOffice(office1);
+//            user.setEmail(weChatUser1.getEmail());
+//            workStaffBasicInfo.setEmail(weChatUser1.getEmail());
+//            user.setMobile(weChatUser1.getMobile());
+//            workStaffBasicInfo.setMobile(weChatUser1.getMobile());
+//            workStaffBasicInfo.setPhone(weChatUser1.getMobile());
+//            user.setLoginFlag("1");
+//            workStaffBasicInfo.setDelFlag("0");
+//            workStaffBasicInfo.setRoleId("df7e52bdc2934e18b4739e6c98b93385");
+//            user.setNewPassword("123456");
+//            user.setDelFlag("0");
+////            workStaffBasicInfo.setName(weChatUser1.getName());
+////            workStaffBasicInfo.setGender(weChatUser1.getGender());
+////            workStaffBasicInfo.setEmail(weChatUser1.getEmail());
+////            workStaffBasicInfo.setPhone(weChatUser1.getMobile());
+////            workStaffBasicInfo.setMobile(weChatUser1.getMobile());
+//            WorkStaffBasicInfo no = workStaffBasicInfoService.findNo(userId);
+//            WorkStaffBasicInfo t = workStaffBasicInfoService.get(no.getId());//从数据库取出记录的值
+//            try {
+//                MyBeanUtils.copyBeanNotNull2Bean(workStaffBasicInfo, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+////                workStaffBasicInfoService.save(t,request);//保存
+//            } catch (Exception e) {
+//                e.printStackTrace();
+//            }
+//        }
+//        if (ChangeType.equals("delete_user")){
+//            WorkStaffBasicInfo workStaffBasicInfo = workStaffBasicInfoService.findNo(userId);
+//            if (null!=workStaffBasicInfo){
+//                workStaffBasicInfoService.delete(workStaffBasicInfo);
+//            }
+//        }
+//        if (ChangeType.contains("create")){
+//            if (!"".equals(userId)){
+//                WeChatUser weChatUser = new WeChatUser();
+//                String s = UserUrl.getUser("", userId);
+//                JSONObject jsonObject = JSONObject.parseObject(s);
+//                Map<String,Object> map = JSONObject.toJavaObject(jsonObject,Map.class);
+//                weChatUser.setUserid((String) map.get("userid"));
+//                weChatUser.setName((String) map.get("name"));
+//                weChatUser.setGender((String)map.get("gender"));//性别
+//                weChatUser.setTelephone((String)map.get("telephone"));//座机
+//                weChatUser.setMobile((String) map.get("mobile"));
+//                weChatUser.setMobile((String)map.get("alias"));//别名
+//                weChatUser.setEmail((String) map.get("email"));
+//                weChatUser.setAddress((String)map.get("address"));//地址
+//                System.out.println(s);
+//                WorkStaffBasicInfo workStaffBasicInfo = new WorkStaffBasicInfo();
+//                User user = new User();
+//                Office office = new Office();
+//                office.setName("财务部");
+//                office.setId("379981dac65a4b26a59f2f6d373da091");
+//                user.setOffice(office);
+//                workStaffBasicInfo.setOffice(office);
+//                Office office1 = new Office();
+//                office1.setName("兴光项目");
+//                office1.setId("ffe5af5b557e46f28b000c94716e228a");
+//                user.setCompany(office1);
+//                workStaffBasicInfo.setCompany(office1);
+//                user.setComId("ffe5af5b557e46f28b000c94716e228a");
+//                user.setLoginName(weChatUser.getUserid());//登录名
+//                workStaffBasicInfo.setNo(weChatUser.getUserid());
+//                user.setName(weChatUser.getName());
+//                workStaffBasicInfo.setName(weChatUser.getName());
+//                workStaffBasicInfo.setNo(weChatUser.getUserid());
+////            workStaffBasicInfo.setNo(weChatUser.getMobile());
+//                workStaffBasicInfo.setGender(weChatUser.getGender());
+//                workStaffBasicInfo.setNation("01");
+//                workStaffBasicInfo.setAge(24);
+//                workStaffBasicInfo.setStatus("正式");
+//                workStaffBasicInfo.setBranchOffice(office1);
+//                user.setEmail(weChatUser.getEmail());
+//                workStaffBasicInfo.setEmail(weChatUser.getEmail());
+//                user.setMobile(weChatUser.getMobile());
+//                workStaffBasicInfo.setMobile(weChatUser.getMobile());
+//                workStaffBasicInfo.setPhone(weChatUser.getMobile());
+//                user.setLoginFlag("1");
+//                workStaffBasicInfo.setDelFlag("0");
+//                workStaffBasicInfo.setRoleId("df7e52bdc2934e18b4739e6c98b93385");
+//                user.setNewPassword("123456");
+//                user.setDelFlag("0");
+//                String redisUser = JedisUtils.get("WXUSERID");
+//                if (null != redisUser){
+//                    if (!redisUser.equals(weChatUser.getUserid())){
+//                        try {
+//                            JedisUtils.set("WXUSERID",weChatUser.getUserid(),0);
+//                            boolean b = userService.save(user,request,null);
+//                            if (b){
+//                                workStaffBasicInfoService.save(workStaffBasicInfo,request);//保存
+//                            }
+//                        }catch (Exception e){
+//                            e.printStackTrace();
+//                        }
+//                    }
+//                }else {
+//                    try {
+//                        JedisUtils.set("WXUSERID",weChatUser.getUserid(),0);
+//                        boolean b = userService.save(user,request,null);
+//                        if (b){
+//                            workStaffBasicInfoService.save(workStaffBasicInfo,request);//保存
+//                        }
+//                    }catch (Exception e){
+//                        e.printStackTrace();
+//                    }
+//                }
+//            }
+//        }
+//
+//    }
+}

+ 43 - 0
src/main/java/com/jeeplus/modules/work/dao/report/WorkReportDao.java

@@ -0,0 +1,43 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.work.dao.report;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.work.entity.report.WorkReport;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 工作日志DAO接口
+ * @author 许凯
+ * @version 2017-04-21
+ */
+@MyBatisDao
+public interface WorkReportDao extends CrudDao<WorkReport> {
+
+	public List<WorkReport> findGetList(WorkReport workReport);
+	public List getCreateDateList(Map<String,String> map);
+	public List getCreateDateList1(Map<String,String> map);
+	public List findByCompany1(Map<String,String> map);
+	public List getCreateDateListAll(Map<String,String> map);
+	public List findByCompanyAll(Map<String,String> map);
+	public List<WorkReport> findByCompany2(@Param("wr") WorkReport workReport,@Param("date") String date);
+	public List<WorkReport> findByCompany(WorkReport workReport);
+	public List<WorkReport> findReportUserByCompany(WorkReport workReport);
+	public List<WorkReport> findOutList(WorkReport workReport);
+
+	public List<WorkReport> findByManage(Map<String,Object> map);
+	public List<WorkReport> findByCompanySelf(Map<String,Object> map);
+	public WorkReport findNewId();
+
+	//更新选择的环信群组
+	void updateEasemobGroupId(WorkReport workReport);
+
+    //查询某一天自己的工作
+	public List<WorkReport> reportlist(Map<String,Object> map);
+	public List<WorkReport> reportlistAll(Map<String,Object> map);
+}

+ 47 - 0
src/main/java/com/jeeplus/modules/work/dao/report/WorkReportRecordDao.java

@@ -0,0 +1,47 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.work.dao.report;
+
+import java.util.List;
+import java.util.Map;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.oa.entity.OaNotifyRecord;
+import com.jeeplus.modules.work.entity.report.WorkReport;
+import com.jeeplus.modules.work.entity.report.WorkReportRecord;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 工作报告DAO接口
+ * @author 许凯
+ * @version 2017-04-21
+ */
+@MyBatisDao
+public interface WorkReportRecordDao extends CrudDao<WorkReportRecord> {
+
+	/**
+	 * 插入用户通知记录
+	 * @param oaNotifyRecordList
+	 * @return
+	 */
+	public int insertAllUser(List<WorkReportRecord> workReportRecordListUser);
+	/**
+	 * 插入群组通知记录
+	 * @param oaNotifyRecordList
+	 * @return
+	 */
+	public int insertAllGroup(List<WorkReportRecord> workReportRecordListGroup);
+
+	/**
+	 * 根据通知ID删除通知记录
+	 * @param oaNotifyId 通知ID
+	 * @return
+	 */
+	public int deleteByReportId(String reportId);
+	
+	public List<WorkReportRecord> findUserList(WorkReportRecord workReportRecord);
+
+
+}

+ 26 - 0
src/main/java/com/jeeplus/modules/work/dao/review/WorkReportReviewDao.java

@@ -0,0 +1,26 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.work.dao.review;
+
+import java.util.List;
+
+import com.jeeplus.common.persistence.TreeDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.work.entity.review.WorkReportReview;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 工作报告的评论与回复DAO接口
+ * @author 许凯
+ * @version 2017-04-28
+ */
+@MyBatisDao
+public interface WorkReportReviewDao extends TreeDao<WorkReportReview> {
+	public List<WorkReportReview> findListByReportId(WorkReportReview workReportReview);
+
+	public List<WorkReportReview> findListByCompany(@Param("wrr") WorkReportReview workReportReview, @Param("companyId") String companyId);
+
+	List<WorkReportReview> getReviewByReportId(String workReportId);
+}

+ 287 - 0
src/main/java/com/jeeplus/modules/work/entity/report/WorkReport.java

@@ -0,0 +1,287 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.work.entity.report;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.google.common.collect.Lists;
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.common.utils.Collections3;
+import com.jeeplus.common.utils.IdGen;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+import com.jeeplus.modules.iim.entity.LayGroup;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.entity.Workattachment;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 工作报告Entity
+ * @author 许凯
+ * @version 2017-04-21
+ */
+public class WorkReport extends DataEntity<WorkReport> {
+	
+	private static final long serialVersionUID = 1L;
+	private String type;		// 类型
+    private String companyId;		// 公司主键
+    private String officeId;		// 部门主键
+	private String thisContent;		// 本次工作内容
+	private String thisFiles;		// 本次工作内容附件
+	private String nextContent;		// 下次工作计划内容
+	private String nextFiles;		// 下次工作附件
+	private String status;		// 状态
+	private Date startDate;		// 开始时间
+	private Date finishDate;		// 结束时间
+	private String readFlag;	// 本人阅读状态
+	private boolean isSelf;		// 是否只查询自己的报告
+	private List<WorkReportRecord> workReportRecordListUser = Lists.newArrayList();		// 子表列表
+	private List<WorkReportRecord> workReportRecordListGroup = Lists.newArrayList();		// 子表列表
+	private String userName;
+	private String photo;
+	private String userId;
+
+	public String getUserName() {
+		return userName;
+	}
+
+	public void setUserName(String userName) {
+		this.userName = userName;
+	}
+
+	public String getPhoto() {
+		return photo;
+	}
+
+	public void setPhoto(String photo) {
+		this.photo = photo;
+	}
+
+	public String getUserId() {
+		return userId;
+	}
+
+	public void setUserId(String userId) {
+		this.userId = userId;
+	}
+
+	private String create;
+	private List<Workattachment> workAttachments;//附件
+	
+	public WorkReport() {
+		super();
+	}
+
+	public WorkReport(String id){
+		super(id);
+	}
+
+	@ExcelField(title="类型", dictType="work_report_type", align=2, sort=1)
+	public String getType() {
+		return type;
+	}
+
+	public void setType(String type) {
+		this.type = type;
+	}
+
+    public String getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(String companyId) {
+        this.companyId = companyId;
+    }
+
+    public String getOfficeId() {
+        return officeId;
+    }
+
+    public void setOfficeId(String officeId) {
+        this.officeId = officeId;
+    }
+
+    @ExcelField(title="本次工作内容", align=2, sort=2)
+	public String getThisContent() {
+		return thisContent;
+	}
+
+	public void setThisContent(String thisContent) {
+		this.thisContent = thisContent;
+	}
+	
+	@ExcelField(title="本次工作内容附件", align=2, sort=3)
+	public String getThisFiles() {
+		return thisFiles;
+	}
+
+	public void setThisFiles(String thisFiles) {
+		this.thisFiles = thisFiles;
+	}
+	
+	@ExcelField(title="下次工作计划内容", align=2, sort=4)
+	public String getNextContent() {
+		return nextContent;
+	}
+
+	public void setNextContent(String nextContent) {
+		this.nextContent = nextContent;
+	}
+	
+	@ExcelField(title="下次工作附件", align=2, sort=5)
+	public String getNextFiles() {
+		return nextFiles;
+	}
+
+	public void setNextFiles(String nextFiles) {
+		this.nextFiles = nextFiles;
+	}
+	
+	@ExcelField(title="状态", dictType="oa_notify_status", align=2, sort=6)
+	public String getStatus() {
+		return status;
+	}
+
+	public void setStatus(String status) {
+		this.status = status;
+	}
+	
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@ExcelField(title="开始时间", align=2, sort=7)
+	public Date getStartDate() {
+		return startDate;
+	}
+
+	public void setStartDate(Date startDate) {
+		this.startDate = startDate;
+	}
+	
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@ExcelField(title="结束时间", align=2, sort=8)
+	public Date getFinishDate() {
+		return finishDate;
+	}
+
+	public void setFinishDate(Date finishDate) {
+		this.finishDate = finishDate;
+	}
+	
+	public List<WorkReportRecord> getWorkReportRecordListUser() {
+		return workReportRecordListUser;
+	}
+
+	public void setWorkReportRecordListUser(List<WorkReportRecord> workReportRecordListUser) {
+		this.workReportRecordListUser = workReportRecordListUser;
+	}
+
+	public List<WorkReportRecord> getWorkReportRecordListGroup() {
+		return workReportRecordListGroup;
+	}
+
+	public void setWorkReportRecordListGroup(List<WorkReportRecord> workReportRecordListGroup) {
+		this.workReportRecordListGroup = workReportRecordListGroup;
+	}
+
+	/**
+	 * 获取报告发送记录用户ID
+	 * @return
+	 */
+	public String getWorkReportRecordIdsUser() {
+		return Collections3.extractToString(workReportRecordListUser, "user.id", ",") ;
+	}
+	
+	/**
+	 * 设置报告发送记录用户ID
+	 * @return
+	 */
+	public void setWorkReportRecordIdsUser(String workReportRecordu) {
+		this.workReportRecordListUser = Lists.newArrayList();
+		for (String id : StringUtils.split(workReportRecordu, ",")){
+			WorkReportRecord entity = new WorkReportRecord();
+			entity.setId(IdGen.uuid());
+			entity.setReport(this);
+			entity.setUser(new User(id));
+			entity.setReadFlag("0");	
+			this.workReportRecordListUser.add(entity);
+		//	System.out.println("------ListUser----------"+workReportRecordListUser.toString());
+		}
+		
+	}
+	/**
+	 * 设置报告发送记录用户ID
+	 * @return
+	 */
+	public void setWorkReportRecordIdsGroup(String groupIds) {
+		this.workReportRecordListGroup = Lists.newArrayList();
+		for (String id : StringUtils.split(groupIds, ",")){
+			WorkReportRecord entity = new WorkReportRecord();
+			entity.setId(IdGen.uuid());
+			entity.setReport(this);
+			entity.setGroup(new LayGroup(id));
+			entity.setReadFlag("0");
+			this.workReportRecordListGroup.add(entity);
+		//	System.out.println("------ListUser----------"+workReportRecordListUser.toString());
+		}
+
+	}
+
+
+	/**
+	 * 获取报告发送记录用户Name
+	 * @return
+	 */
+	public String getWorkReportRecordNamesUser() {
+		return Collections3.extractToString(workReportRecordListUser, "user.name", ",") ;
+	}
+	
+	/**
+	 * 设置报告发送记录用户Name
+	 * @return
+	 */
+	public void setWorkReportRecordNamesUser(String workReportRecord) {
+		// 什么也不做
+	}
+
+	
+	public String getReadFlag() {
+		return readFlag;
+	}
+
+	public void setReadFlag(String readFlag) {
+		this.readFlag = readFlag;
+	}
+
+	public boolean isSelf() {
+		return isSelf;
+	}
+
+	public void setSelf(boolean isSelf) {
+		this.isSelf = isSelf;
+	}
+
+	@Override
+	public String toString() {
+		return "WorkReport [type=" + type + ", thisContent=" + thisContent + ", thisFiles=" + thisFiles
+				+ ", nextContent=" + nextContent + ", nextFiles=" + nextFiles + ", status=" + status + ", startDate="
+				+ startDate + ", finishDate=" + finishDate + ", readFlag=" + readFlag + ", isSelf=" + isSelf
+				+ ", workReportRecordListUser=" + workReportRecordListUser + "]";
+	}
+
+	public String getCreate() {
+		return create;
+	}
+
+	public void setCreate(String create) {
+		this.create = create;
+	}
+
+	public List<Workattachment> getWorkAttachments() {
+		return workAttachments;
+	}
+
+	public void setWorkAttachments(List<Workattachment> workAttachments) {
+		this.workAttachments = workAttachments;
+	}
+}

+ 88 - 0
src/main/java/com/jeeplus/modules/work/entity/report/WorkReportRecord.java

@@ -0,0 +1,88 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.work.entity.report;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+import com.jeeplus.modules.iim.entity.LayGroup;
+import com.jeeplus.modules.sys.entity.User;
+
+import java.util.Date;
+
+/**
+ * 工作报告Entity
+ * @author 许凯
+ * @version 2017-04-21
+ */
+public class WorkReportRecord extends DataEntity<WorkReportRecord> {
+	
+	private static final long serialVersionUID = 1L;
+	private WorkReport report;		// 工作报告主键ID 父类
+	private User user;		// 接收人
+	private LayGroup group;	// 接收群//已弃用
+	private String readFlag;		// 阅读标记
+	private Date readDate;		// 阅读时间
+	
+	public WorkReportRecord() {
+		super();
+	}
+
+	public WorkReportRecord(String id){
+		super(id);
+	}
+
+	public WorkReportRecord(WorkReport report){
+		this.report = report;
+	}
+
+	public WorkReport getReport() {
+		return report;
+	}
+
+	public void setReport(WorkReport report) {
+		this.report = report;
+	}
+	
+	@ExcelField(title="接收人", fieldType=User.class, value="user.name", align=2, sort=2)
+	public User getUser() {
+		return user;
+	}
+
+	public void setUser(User user) {
+		this.user = user;
+	}
+	
+	@ExcelField(title="接收群", fieldType=LayGroup.class, value="group.groupname", align=2, sort=3)
+
+	public LayGroup getGroup() {
+	//	System.out.println("=====group======"+group);
+		return group;
+	}
+
+	public void setGroup(LayGroup group) {
+		this.group = group;
+	}
+	
+	@ExcelField(title="阅读标记", align=2, sort=4)
+	public String getReadFlag() {
+		return readFlag;
+	}
+
+
+	public void setReadFlag(String readFlag) {
+		this.readFlag = readFlag;
+	}
+	
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@ExcelField(title="阅读时间", align=2, sort=5)
+	public Date getReadDate() {
+		return readDate;
+	}
+
+	public void setReadDate(Date readDate) {
+		this.readDate = readDate;
+	}
+	
+}

+ 78 - 0
src/main/java/com/jeeplus/modules/work/entity/review/WorkReportReview.java

@@ -0,0 +1,78 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.work.entity.review;
+
+import com.fasterxml.jackson.annotation.JsonBackReference;
+import javax.validation.constraints.NotNull;
+
+import com.jeeplus.common.persistence.TreeEntity;
+
+/**
+ * 工作报告的评论与回复Entity
+ * @author 许凯
+ * @version 2017-04-28
+ */
+public class WorkReportReview extends TreeEntity<WorkReportReview> {
+	
+	private static final long serialVersionUID = 1L;
+	private WorkReportReview parent;		// 父级编号
+	private String parentIds;		// 所有父级编号
+	private String reportId;		// 公告ID
+	private String type;		// 类型
+	private String content;		// 内容
+	
+	public WorkReportReview() {
+		super();
+	}
+
+	public WorkReportReview(String id){
+		super(id);
+	}
+
+	@JsonBackReference
+	@NotNull(message="父级编号不能为空")
+	public WorkReportReview getParent() {
+		return parent;
+	}
+
+	public void setParent(WorkReportReview parent) {
+		this.parent = parent;
+	}
+	
+	public String getParentIds() {
+		return parentIds;
+	}
+
+	public void setParentIds(String parentIds) {
+		this.parentIds = parentIds;
+	}
+	
+	public String getReportId() {
+		return reportId;
+	}
+
+	public void setReportId(String reportId) {
+		this.reportId = reportId;
+	}
+	
+	public String getType() {
+		return type;
+	}
+
+	public void setType(String type) {
+		this.type = type;
+	}
+	
+	public String getContent() {
+		return content;
+	}
+
+	public void setContent(String content) {
+		this.content = content;
+	}
+	
+	public String getParentId() {
+		return parent != null && parent.getId() != null ? parent.getId() : "0";
+	}
+}

+ 866 - 0
src/main/java/com/jeeplus/modules/work/service/report/WorkReportService.java

@@ -0,0 +1,866 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.work.service.report;
+
+import com.jeeplus.common.oss.OSSClientUtil;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.service.CrudService;
+import com.jeeplus.common.utils.JPushClientUtil;
+import com.jeeplus.common.utils.MenuStatusEnum;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.modules.oa.dao.LeaveDao;
+import com.jeeplus.modules.oa.entity.Leave;
+import com.jeeplus.modules.oa.entity.OaAttendance;
+import com.jeeplus.modules.oa.service.LeaveService;
+import com.jeeplus.modules.oa.service.OaAttendanceService;
+import com.jeeplus.modules.oa_evection.entity.oa_evection.OaEvection;
+import com.jeeplus.modules.oa_evection.service.oa_evection.OaEvectionService;
+import com.jeeplus.modules.pushinfo.entity.Pushinfo;
+import com.jeeplus.modules.pushinfo.service.PushinfoService;
+import com.jeeplus.modules.sys.dao.WorkattachmentDao;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.entity.Workattachment;
+import com.jeeplus.modules.sys.service.WorkattachmentService;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.work.dao.report.WorkReportDao;
+import com.jeeplus.modules.work.dao.report.WorkReportRecordDao;
+import com.jeeplus.modules.work.entity.report.WorkReport;
+import com.jeeplus.modules.work.entity.report.WorkReportRecord;
+import com.jeeplus.modules.workcalendar.entity.CalendarCountEntity;
+import com.jeeplus.modules.workclientinfo.entity.WorkClientAttachment;
+import com.jeeplus.modules.workgoout.entity.GoOut;
+import com.jeeplus.modules.workgoout.service.GoOutService;
+import com.jeeplus.modules.workoutsignin.entity.WorkOutSignIn;
+import com.jeeplus.modules.workoutsignin.service.WorkOutSignInService;
+import com.jeeplus.modules.workovertimeform.entity.WorkOvertimeForm;
+import com.jeeplus.modules.workovertimeform.service.WorkOvertimeFormService;
+import com.jeeplus.modules.workreimbursement.utils.VarStr;
+import com.jeeplus.modules.worksealform.entity.WorkSealForm;
+import com.jeeplus.modules.worksealform.service.WorkSealFormService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * 工作报告Service
+ * @author 许凯
+ * @version 2017-04-21
+ */
+@Service
+@Transactional(readOnly = true)
+public class WorkReportService extends CrudService<WorkReportDao, WorkReport> {
+	@Autowired
+	private WorkReportRecordDao workReportRecordDao;
+	@Autowired
+	private WorkReportDao workReportDao;
+	@Autowired
+    private PushinfoService pushinfoService;
+
+	@Autowired
+	private WorkOutSignInService workOutSignInService;
+	@Autowired
+	private OaAttendanceService oaAttendanceService;
+	@Autowired
+	private LeaveService leaveService;
+	@Autowired
+	private WorkSealFormService workSealFormService;
+	@Autowired
+	private OaEvectionService oaEvectionService;
+	@Autowired
+	private WorkOvertimeFormService workOvertimeFormService;
+	@Autowired
+	private GoOutService goOutService;
+	@Autowired
+	private WorkattachmentService workattachmentService;
+	public WorkReport get(String id) {
+		WorkReport workReport = super.get(id);
+		workReport.setWorkReportRecordListUser(workReportRecordDao.findList(new WorkReportRecord(workReport)));
+		List<Workattachment> attachmentList = workattachmentService.getListByAttachmentIdAndFlag(id,"77");
+		workReport.setWorkAttachments(attachmentList);
+
+		return workReport;
+	}
+	public Page<WorkReport> findPage(Page<WorkReport> page, WorkReport workReport) {
+		return super.findPage(page, workReport);
+	}
+	public  Page<WorkReport> findPageByUser(Page<WorkReport> page , WorkReport workReport){
+		workReport.setPage(page);
+		page.setList(dao.findListByUser(workReport));
+		return page ;
+	}
+	public List<WorkReport> findList(WorkReport workReport) {
+		return super.findList(workReport);
+	}
+
+    public List<WorkReport> findGetList(WorkReport workReport) {
+        return workReportDao.findGetList(workReport);
+    }
+
+    public  List<WorkReport> findListByDate(WorkReport workReport){
+        return super.findList(workReport);
+    }
+	
+	public Page<WorkReport> findGetPage(Page<WorkReport> page, WorkReport workReport) {
+		workReport.setPage(page);
+		page.setList(workReportDao.findGetList(workReport));
+		return page;
+	}
+	//优化版,供PC端使用
+	public List<WorkReport> findByCompany2(WorkReport workReport,String date){
+    	return workReportDao.findByCompany2(workReport,date);
+	}
+	public List getCreateDateList(String companyId,String date) {
+		Map<String,String> map = new HashMap<String,String>();
+		map.put("companyId",companyId);
+		map.put("date",date);
+		return workReportDao.getCreateDateList(map);
+	}
+	public List getCreateDateList1(String time) {
+		Map<String,String> map = new HashMap<String,String>();
+		map.put("userId",UserUtils.getUser().getId());
+		map.put("time",time);
+		return workReportDao.getCreateDateList1(map);
+	}
+	public List<WorkReport> findByCompany1(String time){
+		Map<String,String> map = new HashMap<String,String>();
+		map.put("userId",UserUtils.getUser().getId());
+		map.put("time",time);
+		return workReportDao.findByCompany1(map);
+	}
+
+	public List getCreateDateListAll(String time) {
+		WorkReport w=new WorkReport();
+		Map<String,String> map = new HashMap<String,String>();
+		map.put("sqlStr",dataScopeFilter(w.getCurrentUser(), "o", "u", "s", MenuStatusEnum.WORK_REPORT.getValue()));
+		map.put("time",time);
+		return workReportDao.getCreateDateListAll(map);
+	}
+	public List<WorkReport> findByCompanyAll(String time){
+		Map<String,String> map = new HashMap<String,String>();
+		WorkReport w=new WorkReport();
+		map.put("sqlStr",dataScopeFilter(w.getCurrentUser(), "o", "u", "s", MenuStatusEnum.WORK_REPORT.getValue()));
+		map.put("time",time);
+		return workReportDao.findByCompanyAll(map);
+	}
+    public List<WorkReport> findByCompany(WorkReport workReport) {
+        return workReportDao.findByCompany(workReport);
+    }
+
+    public List<WorkReport> findReportUserByCompany(WorkReport workReport) {
+        return workReportDao.findReportUserByCompany(workReport);
+    }
+	
+	public Page<WorkReport> findOutPage(Page<WorkReport> page, WorkReport workReport) {
+		workReport.setPage(page);
+		page.setList(workReportDao.findOutList(workReport));
+		return page;
+	}
+
+    public WorkReport findNewId() {
+        WorkReport workReport = workReportDao.findNewId();
+        workReport.setWorkReportRecordListUser(workReportRecordDao.findList(new WorkReportRecord(workReport)));
+        return workReport;
+    }
+	
+	@Transactional(readOnly = false)
+	public void save(WorkReport workReport) {
+		if (StringUtils.isBlank(workReport.getOfficeId())) {
+			workReport.setOfficeId(UserUtils.getSelectOffice().getId());
+		}
+		super.save(workReport);
+		if ( workReport.getWorkAttachments()!=null && workReport.getWorkAttachments().size()!=0){
+			//附件信息
+			for (Workattachment workattachment : workReport.getWorkAttachments()) {
+				if (workattachment.getId() == null) {
+					continue;
+				}
+				if (WorkClientAttachment.DEL_FLAG_NORMAL.equals(workattachment.getDelFlag())) {
+					workattachment.setAttachmentFlag("77");
+					workattachment.setAttachmentId(workReport.getId());
+					workattachment.setAttachmentUser(UserUtils.getUser().getId());
+					if (StringUtils.isBlank(workattachment.getId()) || "null".equals(workattachment.getId())) {
+						workattachment.preInsert();
+						workattachmentService.insert(workattachment);
+					} else {
+						workattachment.preUpdate();
+						workattachmentService.update(workattachment);
+					}
+				} else {
+					workattachmentService.delete(workattachment);
+				}
+			}
+		}
+
+		/*if(workReport!=null && StringUtils.isNotBlank(workReport.getId()) &&files!=null){
+			if(files.length>0){
+				OSSClientUtil ossClientUtil = new OSSClientUtil();
+				for (int i = 0; i < files.length; i++) {
+					MultipartFile file = files[i];
+					if(!file.isEmpty()&&file.getSize()>0){
+						String fileName = file.getOriginalFilename();
+						String fileType = fileName.substring(fileName.lastIndexOf("."));
+						String url = ossClientUtil.uploadFile2OSS(file,"report");
+						Workattachment workattachment = new Workattachment();
+						workattachment.setUrl(url);
+						workattachment.setType(fileType);
+						workattachment.setAttachmentName(fileName);
+						workattachment.setAttachmentUser(UserUtils.getUser().getId());
+						workattachment.setAttachmentId(workReport.getId());
+						workattachment.setCompanyId(UserUtils.getSelectCompany().getId());
+						workattachment.setAttachmentFlag("77");
+						workattachmentService.save(workattachment);
+					}
+				}
+			}
+		}*/
+
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+		String date = sdf.format(new Date());
+		String content = workReport.getThisContent();
+
+		// 更新发送接受人记录
+		workReportRecordDao.deleteByReportId(workReport.getId());
+		if (workReport.getWorkReportRecordListUser().size()>0){
+			workReportRecordDao.insertAllUser(workReport.getWorkReportRecordListUser());
+		}
+		if (workReport.getWorkReportRecordListGroup().size()>0){
+			workReportRecordDao.insertAllGroup(workReport.getWorkReportRecordListGroup());
+		}
+
+		String state = "1";
+        String ids = workReport.getWorkReportRecordIdsUser();
+        Map extras = new HashMap();
+        extras.put("type","3003");
+        extras.put("id",workReport.getId());
+
+
+        List aliases = new ArrayList();
+        if(ids != null && ids.length()!=0){
+            String[] aliase = ids.split(",");
+            for(String a : aliase){
+                aliases.add(a);
+            }
+        }
+
+        if(StringUtils.isNotBlank(workReport.getStatus()) && "1".equals(workReport.getStatus())){
+
+			Pushinfo pushinfo = new Pushinfo();
+			pushinfo.setCompanyId(workReport.getCompanyId());
+			pushinfo.setMobile("ios,android");
+			pushinfo.setCurrentUser(UserUtils.getUser());
+			pushinfo.setRemarks(content);
+			pushinfo.setUserId(UserUtils.getUser().getId());
+			pushinfo.setType("3003");
+			pushinfo.setPushId(workReport.getId());
+			pushinfo.setTitle("工作报告");
+			String status = workReport.getUpdateBy().getName() +"  "+date;
+			pushinfo.setStatus(status);
+			pushinfo.setContent(workReport.getThisContent());
+			pushinfo.setPushUserId(ids);
+			pushinfo.setParentType("singleWorkReport");
+			if (workReport.getThisFiles()!=null &&workReport.getThisFiles().length()>0){
+				pushinfo.setStatus(workReport.getThisFiles());
+			}
+			pushinfoService.save(pushinfo);
+
+			JPushClientUtil.sendNotificationToAliases(workReport.getThisFiles(), content, extras, aliases);
+		}
+	}
+	
+	@Transactional(readOnly = false)
+	public void delete(WorkReport workReport) {
+		super.delete(workReport);
+		workReportRecordDao.delete(new WorkReportRecord(workReport));
+	}
+
+    /**
+     * 更新阅读状态
+     */
+    @Transactional(readOnly = false)
+    public void updateReadFlag(WorkReport workReport) {
+        WorkReportRecord workReportRecord = new WorkReportRecord(workReport);
+        workReportRecord.setUser(workReportRecord.getCurrentUser());
+        workReportRecord.setReadDate(new Date());
+        workReportRecord.setReadFlag("1");
+        workReportRecordDao.update(workReportRecord);
+    }
+
+    //APP端使用,一次上传一个
+	@Transactional(readOnly = false)
+	public String uploadFile(OSSClientUtil ossClientUtil, MultipartFile file, WorkReport workReport, String flag) {
+		String fileName = file.getOriginalFilename();
+		String fileType = fileName.substring(fileName.lastIndexOf("."));
+		String url = ossClientUtil.uploadFile2OSS(file,"report");
+		Workattachment workattachment = new Workattachment();
+		workattachment.setUrl(url);
+		workattachment.setType(fileType);
+		workattachment.setAttachmentName(fileName);
+		workattachment.setAttachmentUser(UserUtils.getUser().getId());
+		workattachment.setAttachmentId(workReport.getId());
+		workattachment.setCompanyId(UserUtils.getSelectCompany().getId());
+		workattachment.setAttachmentFlag(flag);
+		workattachmentService.save(workattachment);
+		return url;
+	}
+
+	//删除附件
+	@Transactional(readOnly = false)
+	public void delFile(String attaId, String attachmentUrl) {
+		try {
+			Workattachment workattachment = new Workattachment();
+			if(StringUtils.isNotBlank(attaId)){
+				workattachment.setId(attaId);
+				workattachmentService.delete(workattachment);
+			}
+			if(StringUtils.isNotBlank(attachmentUrl)){
+				workattachment.setUrl(attachmentUrl);
+				workattachmentService.deleteFileFromAliyun(workattachment,workattachment==null?attachmentUrl:workattachment.getUrl());
+			}
+		}catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	public List<WorkReport> findByManage(Map<String,Object> map) {
+		return workReportDao.findByManage(map);
+	}
+	public List<WorkReport> findByCompanySelf(Map<String,Object> map) {
+		return workReportDao.findByCompanySelf(map);
+	}
+	/**
+	 *
+	 */
+/*	@Transactional(readOnly = false)
+	public List<WorkReport> reportlist(String start) {
+		Map<String,Object> map=new HashMap<>();
+		map.put("time",start);
+		map.put("userId",UserUtils.getUser().getId());
+		List<WorkReport> reportlist= workReportDao.reportlist(map);
+		return reportlist;
+	}*/
+	public Map<String,Object> getManageCalendarByDateAll(String dateStr,CalendarCountEntity c) {
+		Map<String,Object> map=new HashMap<>();
+		CalendarCountEntity cc=new CalendarCountEntity();
+		map.put("time",dateStr);
+		map.put("sqlStr",dataScopeFilter(cc.getCurrentUser(), "o", "u", "s", MenuStatusEnum.WORK_REPORT.getValue()));
+		map.put("startDate",c.getStartDate());
+		map.put("endDate",c.getEndDate());
+		List<WorkReport> workReportList=new ArrayList<>();
+		List<WorkOutSignIn> workOutList=new ArrayList<>();
+		List<OaAttendance> oaAttenList=new ArrayList<>();
+		List<WorkSealForm> workSealList=new ArrayList<>();
+		List<Leave> leaveList =new ArrayList<>();
+		List<OaEvection> oaEvectionList=new ArrayList<>();
+		List<WorkOvertimeForm> workOvertimeFormList=new ArrayList<>();
+		List<GoOut> goOutList=new ArrayList<>();
+		if(c.getType()!=null&&!"".equals(c.getType())){
+			if("1".equals(c.getType())){
+				workReportList = this.findByManage(map);
+			}else if("2".equals(c.getType())){
+				leaveList = leaveService.findByManage(map);
+			}
+		}else{
+			 workReportList = this.findByManage(map);
+			 workOutList = workOutSignInService.findByManage(map);
+			 oaAttenList = oaAttendanceService.findByManage(map);
+			 workSealList = workSealFormService.findByManage(map);
+			 leaveList = leaveService.findByManage(map);
+			 oaEvectionList = oaEvectionService.findByManage(map);
+			 workOvertimeFormList = workOvertimeFormService.findByManage(map);
+			 goOutList = goOutService.findByManage(map);
+		}
+
+		Map<String,Object> map1 = new HashMap<String,Object>();
+		map1.put("workReportList",workReportList);
+		map1.put("workOutList",workOutList);
+		map1.put("oaAttenList",oaAttenList);
+		map1.put("workSealList",workSealList);
+		map1.put("leaveList",leaveList);
+		map1.put("oaEvectionList",oaEvectionList);
+		map1.put("workOvertimeFormList",workOvertimeFormList);
+		map1.put("goOutList",goOutList);
+		return  map1;
+	}
+
+	public Map<String,Object> getManageCalendarByDate(String dateStr,CalendarCountEntity c) {
+		Map<String,Object> map=new HashMap<>();
+		map.put("time",dateStr);
+		map.put("userId",UserUtils.getUser().getId());
+		map.put("startDate",c.getStartDate());
+		map.put("endDate",c.getEndDate());
+		List<WorkReport> workReportList=new ArrayList<>();
+		List<WorkOutSignIn> workOutList=new ArrayList<>();
+		List<OaAttendance> oaAttenList=new ArrayList<>();
+		List<WorkSealForm> workSealList=new ArrayList<>();
+		List<Leave> leaveList =new ArrayList<>();
+		List<OaEvection> oaEvectionList=new ArrayList<>();
+		List<WorkOvertimeForm> workOvertimeFormList=new ArrayList<>();
+		List<GoOut> goOutList=new ArrayList<>();
+
+		if(c.getType()!=null&&!"".equals(c.getType())){
+			if("1".equals(c.getType())){
+				workReportList = this.findByCompanySelf(map);
+			}else if("2".equals(c.getType())){
+				leaveList = leaveService.findByCompanySelf(map);
+			}
+		}else{
+			workReportList = this.findByCompanySelf(map);
+			workOutList = workOutSignInService.findByCompanySelf(map);
+			oaAttenList = oaAttendanceService.findByCompanySelf(map);
+			workSealList = workSealFormService.findByCompanySelf(map);
+			leaveList = leaveService.findByCompanySelf(map);
+			oaEvectionList = oaEvectionService.findByCompanySelf(map);
+			workOvertimeFormList = workOvertimeFormService.findByCompanySelf(map);
+			goOutList = goOutService.findByCompanySelf(map);
+		}
+		Map<String,Object> map1 = new HashMap<String,Object>();
+		map1.put("workReportList",workReportList);
+		map1.put("workOutList",workOutList);
+		map1.put("oaAttenList",oaAttenList);
+		map1.put("workSealList",workSealList);
+		map1.put("leaveList",leaveList);
+		map1.put("oaEvectionList",oaEvectionList);
+		map1.put("workOvertimeFormList",workOvertimeFormList);
+		map1.put("goOutList",goOutList);
+		return  map1;
+	}
+	/**
+	 *
+	 */
+/*	@Transactional(readOnly = false)
+	public List<WorkReport> reportlistAll(String start) {
+		Map<String,Object> map=new HashMap<>();
+		map.put("time",start);
+		map.put("sqlStr",dataScopeFilter(UserUtils.getUser(), "o", "u", "s"));
+		List<WorkReport> reportlist= workReportDao.reportlistAll(map);
+		return reportlist;
+	}*/
+
+	public List getReportUserList(String dateStr,CalendarCountEntity c){
+		Map<String,Object> maps = getManageCalendarByDate(dateStr,c);
+		List reportList =new ArrayList();
+		List<WorkReport> workReportList = (List<WorkReport>)maps.get("workReportList");
+		List<WorkOutSignIn> workOutList = (List<WorkOutSignIn>)maps.get("workOutList");
+		List<OaAttendance> oaAttenList = (List<OaAttendance>)maps.get("oaAttenList");
+		List<WorkSealForm> workSealList = (List<WorkSealForm>)maps.get("workSealList");
+		List<Leave> leaveList = (List<Leave>)maps.get("leaveList");
+		List<OaEvection> oaEvectionList = (List<OaEvection>)maps.get("oaEvectionList");
+		List<WorkOvertimeForm> workOvertimeFormList = (List<WorkOvertimeForm>)maps.get("workOvertimeFormList");
+		List<GoOut> goOutList = (List<GoOut>)maps.get("goOutList");
+
+		List<Map> mapList1 = new ArrayList<>();
+		List<Map> mapList2 = new ArrayList<>();
+		List<Map> mapList3 = new ArrayList<>();
+		List<Map> mapList4 = new ArrayList<>();
+		List<Map> mapList5 = new ArrayList<>();
+		List<Map> mapList6 = new ArrayList<>();
+		List<Map> mapList7 = new ArrayList<>();
+		List<Map> mapList8 = new ArrayList<>();
+		List<Map> mapList9 = new ArrayList<>();
+		List<Map> mapList10 = new ArrayList<>();
+		List<Map> mapList11 = new ArrayList<>();
+		Map<String,Object> totalMap1 = new HashMap<String,Object>();
+		Map<String,Object> totalMap2 = new HashMap<String,Object>();
+		Map<String,Object> totalMap3 = new HashMap<String,Object>();
+		Map<String,Object> totalMap4 = new HashMap<String,Object>();
+
+		Map<String,Object> map3 = new HashMap<String,Object>();
+		Map<String,Object> map4 = new HashMap<String,Object>();
+		if(workReportList!=null && workReportList.size()!=0) {
+			for (WorkReport w : workReportList) {
+				Map map = new HashMap();
+				User u = UserUtils.get(w.getCreateBy().getId());
+				if (u!=null) {
+					map.put("userId", u.getId());
+					map.put("createDate",w.getCreateDate());
+					map.put("workReportBean",w);
+					mapList1.add(map);
+				}
+			}
+			map3.put("workReport",mapList1);
+		}
+		totalMap1.put("workReports",map3);
+		if(workOutList!=null && workOutList.size()!=0) {
+			for (WorkOutSignIn w : workOutList) {
+				Map map = new HashMap();
+				User u = UserUtils.get(w.getCreateBy().getId());
+				if (u!=null) {
+					map.put("userId", u.getId());
+					map.put("createDate",w.getCreateDate());
+					map.put("workOutSignInBean",w);
+					mapList2.add(map);
+				}
+			}
+			map4.put("workOutSignIn", mapList2);
+		}
+		totalMap2.put("workOutSignIns",map4);
+
+		Map<String,Object> map1 = new HashMap<String,Object>();
+		if(oaAttenList!=null && oaAttenList.size()!=0) {
+			SimpleDateFormat sdf3 = new SimpleDateFormat("HHmmss");
+			for (OaAttendance o : oaAttenList) {
+				Map map = new HashMap();
+				User u = UserUtils.get(o.getCreateBy().getId());
+				if (u!=null){
+					if (o.getStartTime() != null && !"".equals(o.getStartTime())) {
+						String ruleStart = o.getRule().getStartTime().replaceAll(":","")+"00";
+						Integer start = Integer.parseInt(sdf3.format(o.getStartTime()));
+						int morning = Integer.parseInt(ruleStart);
+						if (start > morning) {
+							map.put("userId", u.getId());
+							map.put("createDate",o.getCreateDate());
+							map.put("oaAttendanceBean",o);
+							mapList3.add(map);
+						} else {
+							map.put("userId", u.getId());
+							map.put("createDate",o.getCreateDate());
+							map.put("oaAttendanceBean",o);
+							mapList4.add(map);
+						}
+					}
+					if (o.getEndTime() != null && !"".equals(o.getEndTime())) {
+						String ruleEnd = o.getRule().getEndTime().replaceAll(":","")+"00";
+						Integer end = Integer.parseInt(sdf3.format(o.getEndTime()));
+						int night = Integer.parseInt(ruleEnd);
+						if (end >= night) {
+							map.put("userId", u.getId());
+							map.put("createDate",o.getCreateDate());
+							map.put("oaAttendanceBean",o);
+							mapList5.add(map);
+						} else {
+							map.put("userId", u.getId());
+							map.put("createDate",o.getCreateDate());
+							map.put("oaAttendanceBean",o);
+							mapList6.add(map);
+						}
+					}
+				}
+			}
+			if(mapList3!=null && mapList3.size()!=0){ map1.put("late",mapList3); }
+
+			if(mapList4!=null && mapList4.size()!=0){ map1.put("onDuty",mapList4);}
+			if(mapList5!=null && mapList5.size()!=0){  map1.put("offDut",mapList5);}
+			if(mapList6!=null && mapList6.size()!=0){ map1.put("leaveEarly",mapList6);}
+
+		}
+		totalMap3.put("attendances",map1);
+
+
+		Map<String,Object> map2 = new HashMap<String,Object>();
+		if(workSealList!=null && workSealList.size()!=0) {
+			for (WorkSealForm w : workSealList) {
+				Map map = new HashMap();
+				User u = UserUtils.get(w.getCreateBy().getId());
+				if (u!=null) {
+					map.put("userId", u.getId());
+					map.put("createDate",w.getCreateDate());
+					map.put("workSealFormBean",w);
+					mapList7.add(map);
+				}
+			}
+			map2.put("workSealFrom",mapList7);
+		}
+		if(leaveList!=null && leaveList.size()!=0) {
+			for (Leave w : leaveList) {
+				Map map = new HashMap();
+				User u = UserUtils.get(w.getCreateBy().getId());
+				if (u!=null) {
+					map.put("userId", u.getId());
+					map.put("createDate",w.getCreateDate());
+					map.put("leaveBean",w);
+					mapList8.add(map);
+				}
+			}
+			map2.put("leave",mapList8);
+		}
+		if(oaEvectionList!=null && oaEvectionList.size()!=0) {
+			for (OaEvection w : oaEvectionList) {
+				Map map = new HashMap();
+				User u = UserUtils.get(w.getCreateBy().getId());
+				if (u!=null) {
+					map.put("userId", u.getId());
+					map.put("createDate",w.getCreateDate());
+					map.put("oaEvectionBean",w);
+					mapList9.add(map);
+				}
+			}
+			map2.put("oaEvection",mapList9);
+		}
+		if(workOvertimeFormList!=null && workOvertimeFormList.size()!=0) {
+			for (WorkOvertimeForm w : workOvertimeFormList) {
+				Map map = new HashMap();
+				User u = UserUtils.get(w.getCreateBy().getId());
+				if (u!=null) {
+					map.put("userId", u.getId());
+					map.put("createDate",w.getCreateDate());
+					map.put("workOvertimeFormBean",w);
+					mapList10.add(map);
+				}
+			}
+			map2.put("workOvertimeForm",mapList10);
+		}
+		if(goOutList!=null && goOutList.size()!=0) {
+			for (GoOut goOut : goOutList) {
+				Map map = new HashMap();
+				User u = UserUtils.get(goOut.getCreateBy().getId());
+				if (u!=null) {
+					map.put("userId", u.getId());
+					map.put("createDate",goOut.getCreateDate());
+					map.put("goOutBean",goOut);
+					mapList11.add(map);
+				}
+			}
+			map2.put("workGoOut",mapList11);
+		}
+		totalMap4.put("audits",map2);
+		reportList.add(totalMap1);
+		reportList.add(totalMap2);
+		reportList.add(totalMap3);
+		reportList.add(totalMap4);
+		return reportList;
+	}
+
+	public List getReportUserListAll(String dateStr,CalendarCountEntity c){
+		Map<String,Object> maps = getManageCalendarByDateAll(dateStr,c);
+		List reportList =new ArrayList();
+
+		List<WorkReport> workReportList = (List<WorkReport>)maps.get("workReportList");
+		List<WorkOutSignIn> workOutList = (List<WorkOutSignIn>)maps.get("workOutList");
+		List<OaAttendance> oaAttenList = (List<OaAttendance>)maps.get("oaAttenList");
+		List<WorkSealForm> workSealList = (List<WorkSealForm>)maps.get("workSealList");
+		List<Leave> leaveList = (List<Leave>)maps.get("leaveList");
+		List<OaEvection> oaEvectionList = (List<OaEvection>)maps.get("oaEvectionList");
+		List<WorkOvertimeForm> workOvertimeFormList = (List<WorkOvertimeForm>)maps.get("workOvertimeFormList");
+		List<GoOut> goOutList = (List<GoOut>)maps.get("goOutList");
+
+		List<Map> mapList1 = new ArrayList<>();
+		List<Map> mapList2 = new ArrayList<>();
+		List<Map> mapList3 = new ArrayList<>();
+		List<Map> mapList4 = new ArrayList<>();
+		List<Map> mapList5 = new ArrayList<>();
+		List<Map> mapList6 = new ArrayList<>();
+		List<Map> mapList7 = new ArrayList<>();
+		List<Map> mapList8 = new ArrayList<>();
+		List<Map> mapList9 = new ArrayList<>();
+		List<Map> mapList10 = new ArrayList<>();
+		List<Map> mapList11 = new ArrayList<>();
+		Map<String,Object> totalMap1 = new HashMap<String,Object>();
+		Map<String,Object> totalMap2 = new HashMap<String,Object>();
+		Map<String,Object> totalMap3 = new HashMap<String,Object>();
+		Map<String,Object> totalMap4 = new HashMap<String,Object>();
+
+		Map<String,Object> map3 = new HashMap<String,Object>();
+		Map<String,Object> map4 = new HashMap<String,Object>();
+		if(workReportList!=null && workReportList.size()!=0) {
+			for (WorkReport w : workReportList) {
+				Map map = new HashMap();
+				User u = UserUtils.get(w.getCreateBy().getId());
+				if (u!=null) {
+					map.put("userId", u.getId());
+					map.put("photo", u.getPhoto());
+					map.put("no",u.getNo());
+					map.put("officeName",u.getOfficeName());
+					map.put("userName", u.getName());
+					map.put("createDate",w.getCreateDate());
+					map.put("updateDate",w.getUpdateDate());
+					map.put("workReportBean",w);
+					mapList1.add(map);
+				}
+			}
+			map3.put("workReport",mapList1);
+		}
+		totalMap1.put("workReports",map3);
+		if(workOutList!=null && workOutList.size()!=0) {
+			for (WorkOutSignIn w : workOutList) {
+				Map map = new HashMap();
+				User u = UserUtils.get(w.getCreateBy().getId());
+				if (u!=null) {
+					map.put("userId", u.getId());
+					map.put("photo", u.getPhoto());
+					map.put("no",u.getNo());
+					map.put("officeName",u.getOfficeName());
+					map.put("userName", u.getName());
+					map.put("createDate",w.getCreateDate());
+					map.put("updateDate",w.getUpdateDate());
+					map.put("workOutSignInBean",w);
+					mapList2.add(map);
+				}
+			}
+			map4.put("workOutSignIn", mapList2);
+		}
+		totalMap2.put("workOutSignIns",map4);
+
+		Map<String,Object> map1 = new HashMap<String,Object>();
+		if(oaAttenList!=null && oaAttenList.size()!=0) {
+			SimpleDateFormat sdf3 = new SimpleDateFormat("HHmmss");
+			for (OaAttendance o : oaAttenList) {
+				Map map = new HashMap();
+				User u = UserUtils.get(o.getCreateBy().getId());
+				if (u!=null){
+					if (o.getStartTime() != null && !"".equals(o.getStartTime())) {
+						String ruleStart = o.getRule().getStartTime().replaceAll(":","")+"00";
+						Integer start = Integer.parseInt(sdf3.format(o.getStartTime()));
+						int morning = Integer.parseInt(ruleStart);
+						if (start > morning) {
+							map.put("userId", u.getId());
+							map.put("photo", u.getPhoto());
+							map.put("no",u.getNo());
+							map.put("officeName",u.getOfficeName());
+							map.put("userName", u.getName());
+							map.put("createDate",o.getCreateDate());
+							map.put("updateDate",o.getUpdateDate());
+							map.put("oaAttendanceBean",o);
+							mapList3.add(map);
+						} else {
+							map.put("userId", u.getId());
+							map.put("photo", u.getPhoto());
+							map.put("no",u.getNo());
+							map.put("officeName",u.getOfficeName());
+							map.put("userName", u.getName());
+							map.put("createDate",o.getCreateDate());
+							map.put("updateDate",o.getUpdateDate());
+							map.put("oaAttendanceBean",o);
+							mapList4.add(map);
+						}
+					}
+					if (o.getEndTime() != null && !"".equals(o.getEndTime())) {
+						String ruleEnd = o.getRule().getEndTime().replaceAll(":","")+"00";
+						Integer end = Integer.parseInt(sdf3.format(o.getEndTime()));
+						int night = Integer.parseInt(ruleEnd);
+						if (end >= night) {
+							map.put("userId", u.getId());
+							map.put("photo", u.getPhoto());
+							map.put("no",u.getNo());
+							map.put("officeName",u.getOfficeName());
+							map.put("userName", u.getName());
+							map.put("createDate",o.getCreateDate());
+							map.put("updateDate",o.getUpdateDate());
+							map.put("oaAttendanceBean",o);
+							mapList5.add(map);
+						} else {
+							map.put("userId", u.getId());
+							map.put("photo", u.getPhoto());
+							map.put("no",u.getNo());
+							map.put("officeName",u.getOfficeName());
+							map.put("userName", u.getName());
+							map.put("createDate",o.getCreateDate());
+							map.put("updateDate",o.getUpdateDate());
+							map.put("oaAttendanceBean",o);
+							mapList6.add(map);
+						}
+					}
+				}
+			}
+			if(mapList3!=null && mapList3.size()!=0){ map1.put("late",mapList3); }
+			if(mapList4!=null && mapList4.size()!=0){ map1.put("onDuty",mapList4);}
+			if(mapList5!=null && mapList5.size()!=0){  map1.put("offDut",mapList5);}
+			if(mapList6!=null && mapList6.size()!=0){ map1.put("leaveEarly",mapList6);}
+
+		}
+		totalMap3.put("attendances",map1);
+
+
+		Map<String,Object> map2 = new HashMap<String,Object>();
+		if(workSealList!=null && workSealList.size()!=0) {
+			for (WorkSealForm w : workSealList) {
+				Map map = new HashMap();
+				User u = UserUtils.get(w.getCreateBy().getId());
+				if (u!=null) {
+					map.put("userId", u.getId());
+					map.put("photo", u.getPhoto());
+					map.put("no",u.getNo());
+					map.put("officeName",u.getOfficeName());
+					map.put("userName", u.getName());
+					map.put("createDate",w.getCreateDate());
+					map.put("updateDate",w.getUpdateDate());
+					map.put("workSealFormBean",w);
+					mapList7.add(map);
+				}
+			}
+			map2.put("workSealFrom",mapList7);
+		}
+		if(leaveList!=null && leaveList.size()!=0) {
+			for (Leave w : leaveList) {
+				Map map = new HashMap();
+				User u = UserUtils.get(w.getCreateBy().getId());
+				if (u!=null) {
+					map.put("userId", u.getId());
+					map.put("photo", u.getPhoto());
+					map.put("no",u.getNo());
+					map.put("officeName",u.getOfficeName());
+					map.put("userName", u.getName());
+					map.put("createDate",w.getCreateDate());
+					map.put("updateDate",w.getUpdateDate());
+					map.put("leaveBean",w);
+					mapList8.add(map);
+				}
+			}
+			map2.put("leave",mapList8);
+		}
+		if(oaEvectionList!=null && oaEvectionList.size()!=0) {
+			for (OaEvection w : oaEvectionList) {
+				Map map = new HashMap();
+				User u = UserUtils.get(w.getCreateBy().getId());
+				if (u!=null) {
+					map.put("userId", u.getId());
+					map.put("photo", u.getPhoto());
+					map.put("no",u.getNo());
+					map.put("officeName",u.getOfficeName());
+					map.put("userName", u.getName());
+					map.put("createDate",w.getCreateDate());
+					map.put("updateDate",w.getUpdateDate());
+					map.put("oaEvectionBean",w);
+					mapList9.add(map);
+				}
+			}
+			map2.put("oaEvection",mapList9);
+		}
+		if(workOvertimeFormList!=null && workOvertimeFormList.size()!=0) {
+			for (WorkOvertimeForm w : workOvertimeFormList) {
+				Map map = new HashMap();
+				User u = UserUtils.get(w.getCreateBy().getId());
+				if (u!=null) {
+					map.put("userId", u.getId());
+					map.put("photo", u.getPhoto());
+					map.put("no",u.getNo());
+					map.put("officeName",u.getOfficeName());
+					map.put("userName", u.getName());
+					map.put("createDate",w.getCreateDate());
+					map.put("updateDate",w.getUpdateDate());
+					map.put("workOvertimeFormBean",w);
+					mapList10.add(map);
+				}
+			}
+			map2.put("workOvertimeForm",mapList10);
+		}
+		if(goOutList!=null && goOutList.size()!=0) {
+			for (GoOut goOut : goOutList) {
+				Map map = new HashMap();
+				User u = UserUtils.get(goOut.getCreateBy().getId());
+				if (u!=null) {
+					map.put("userId", u.getId());
+					map.put("photo", u.getPhoto());
+					map.put("no",u.getNo());
+					map.put("officeName",u.getOfficeName());
+					map.put("userName", u.getName());
+					map.put("createDate",goOut.getCreateDate());
+					map.put("updateDate",goOut.getUpdateDate());
+					map.put("goOutBean",goOut);
+					mapList11.add(map);
+				}
+			}
+			map2.put("workGoOut",mapList11);
+		}
+		totalMap4.put("audits",map2);
+		reportList.add(totalMap1);
+		reportList.add(totalMap2);
+		reportList.add(totalMap3);
+		reportList.add(totalMap4);
+		return reportList;
+	}
+}

+ 75 - 0
src/main/java/com/jeeplus/modules/work/service/review/WorkReportReviewService.java

@@ -0,0 +1,75 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.work.service.review;
+
+import java.util.List;
+
+import com.jeeplus.modules.sys.entity.User;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.service.TreeService;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.modules.work.entity.report.WorkReport;
+import com.jeeplus.modules.work.entity.review.WorkReportReview;
+import com.jeeplus.modules.work.dao.report.WorkReportRecordDao;
+import com.jeeplus.modules.work.dao.review.WorkReportReviewDao;
+
+/**
+ * 工作报告的评论与回复Service
+ * @author 许凯
+ * @version 2017-04-28
+ */
+@Service
+@Transactional(readOnly = true)
+public class WorkReportReviewService extends TreeService<WorkReportReviewDao, WorkReportReview> {
+	
+	@Autowired
+	private WorkReportReviewDao workReportReviewDao;
+
+	public WorkReportReview get(String id) {
+		return super.get(id);
+	}
+	
+	public List<WorkReportReview> findList(WorkReportReview workReportReview) {
+		if (StringUtils.isNotBlank(workReportReview.getParentIds())){
+			workReportReview.setParentIds(","+workReportReview.getParentIds()+",");
+		}
+		return super.findList(workReportReview);
+	}
+	
+	public Page<WorkReportReview> findPage(Page<WorkReportReview> page, WorkReportReview workReportReview) {
+		workReportReview.setPage(page);
+		page.setList(workReportReviewDao.findList(workReportReview));
+		return page;
+	}
+
+	public Page<WorkReportReview> findPageByCompany(Page<WorkReportReview>page,WorkReportReview workReportReview,String companyId){
+		workReportReview.setPage(page);
+		page.setList(workReportReviewDao.findListByCompany(workReportReview,companyId));
+		return page;
+	}
+	
+	@Transactional(readOnly = false)
+	public void save(WorkReportReview workReportReview) {
+		super.save(workReportReview);
+	}
+	
+	@Transactional(readOnly = false)
+	public void delete(WorkReportReview workReportReview) {
+		super.delete(workReportReview);
+	}
+	
+	public Page<WorkReportReview> findListByReportId(Page<WorkReportReview> page, WorkReportReview workReportReview) {
+		workReportReview.setPage(page);
+		page.setList(workReportReviewDao.findListByReportId(workReportReview));
+		return page;
+	}
+	public List<WorkReportReview> findReviewListByReportId(String workReportId){
+		return workReportReviewDao.getReviewByReportId(workReportId);
+	}
+	
+}

+ 447 - 0
src/main/java/com/jeeplus/modules/work/web/report/WorkReportController.java

@@ -0,0 +1,447 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.work.web.report;
+
+import com.google.common.collect.Lists;
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.json.AjaxJson;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.utils.DateUtils;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.utils.excel.ExportExcel;
+import com.jeeplus.common.utils.excel.ImportExcel;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.modules.iim.service.LayGroupService;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.work.entity.report.WorkReport;
+import com.jeeplus.modules.work.entity.report.WorkReportRecord;
+import com.jeeplus.modules.work.entity.review.WorkReportReview;
+import com.jeeplus.modules.work.service.report.WorkReportService;
+import com.jeeplus.modules.work.service.review.WorkReportReviewService;
+import com.jeeplus.modules.workborrowmangement.entity.WorkBorrowMangement;
+import com.jeeplus.modules.workcalendar.entity.CalendarCountEntity;
+import org.apache.shiro.authz.annotation.Logical;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.ConstraintViolationException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 工作报告Controller
+ * @author 许凯
+ * @version 2017-04-21
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/work/report/workReport")
+public class WorkReportController extends BaseController {
+
+	@Autowired
+	private WorkReportService workReportService;
+	@Autowired
+	private WorkReportReviewService workReportReviewService;
+	@Autowired
+	private LayGroupService layGroupService;
+
+	
+	@ModelAttribute
+	public WorkReport get(@RequestParam(required=false) String id) {
+		WorkReport entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = workReportService.get(id);
+		}
+		if (entity == null){
+			entity = new WorkReport();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 工作报告列表页面(可以执行删除工作报告的操作;个人只能看到自己发布的,管理员可以看到全公司发布的;)
+	 */
+	@RequiresPermissions("work:report:workReport:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(WorkReport workReport, HttpServletRequest request, HttpServletResponse response, Model model) {
+		User user = UserUtils.getUser();
+		boolean isManager = UserUtils.isManager();
+		workReport.setStatus("1");
+
+		if(user.isAdmin()){
+			//Admin查看全平台发布的
+		}else {
+			workReport.setCompanyId(user.getComId());
+			if(isManager){
+				//公司管理员查看本公司发布的
+			}else{
+				//个人只查看自己发布的
+				workReport.setCreateBy(user);
+			}
+		}
+		Page<WorkReport> page = workReportService.findPage(new Page<WorkReport>(request, response), workReport);
+
+		model.addAttribute("page", page);
+		model.addAttribute("allList","allList");
+		return "modules/work/report/workReportListAll";
+	}
+	
+	
+	/**
+	 * 我收到的工作报告(我收到别人发给我的工作报告,不能删除)
+	 */
+	@RequestMapping(value = "getList")
+	public String listGet(WorkReport workReport, HttpServletRequest request, HttpServletResponse response, Model model) {
+		User user = UserUtils.getUser();
+		workReport.setSelf(true);
+		workReport.setCompanyId(user.getComId());
+		workReport.setCurrentUser(user);
+
+		Page<WorkReport> page = workReportService.findGetPage(new Page<WorkReport>(request, response), workReport);
+		model.addAttribute("my_receive","true");
+		model.addAttribute("getList","getList");
+		model.addAttribute("page", page);
+		return "modules/work/report/workReportListGet";
+	}
+	
+
+	/**
+	 * 我发出的工作报告(包含草稿和发布状态的,不能删除;要删除需要到"工作报告"列表执行)
+	 */
+	@RequestMapping(value = "outList")
+	public String listOut(WorkReport workReport, HttpServletRequest request, HttpServletResponse response, Model model) {
+		User user = UserUtils.getUser();
+		workReport.setCurrentUser(user);
+		workReport.setCompanyId(user.getComId());
+		Page<WorkReport> page = workReportService.findOutPage(new Page<WorkReport>(request, response), workReport);
+		model.addAttribute("my_send","true");
+		model.addAttribute("outList","outList");
+		model.addAttribute("page", page);
+		return "modules/work/report/workReportListOut";
+	}
+	
+	/**
+	 * 查看,增加,编辑工作报告表单页面
+	 */
+	@RequiresPermissions(value={"work:report:workReport:view","work:report:workReport:add","work:report:workReport:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(@RequestParam(value = "readAttr",required = false)String readAttr,
+					   WorkReport workReport, Model model,
+					   @RequestParam(value = "view",required = false)String view,
+					   @RequestParam(value = "updateReadFlag",required = false)String updateReadFlag,
+					   @RequestParam(value = "forUpdate",required = false)String forUpdate) {
+
+
+		//用于修改草稿状态的
+		model.addAttribute("forUpdate",forUpdate);
+
+		//在"我收到的工作报告"中,点击查看,同时更新阅读状态
+		if(StringUtils.isNotBlank(updateReadFlag)&&"updateReadFlag".equals(updateReadFlag) && StringUtils.isNotBlank(workReport.getId())){
+			//当前工作报告如果是发送给我的话,就将当前工作工作报告的阅读状态赋值
+			if(workReport.getWorkReportRecordListUser().size()>0){
+				for (int i = 0; i < workReport.getWorkReportRecordListUser().size(); i++) {
+					WorkReportRecord workReportRecord = workReport.getWorkReportRecordListUser().get(i);
+					if(workReportRecord!=null && workReportRecord.getUser().getId().equals(UserUtils.getUser().getId())){
+						if("0".equals(workReportRecord.getReadFlag())){
+							workReportService.updateReadFlag(workReport);
+						}
+					}
+				}
+			}
+		}
+
+		List<WorkReportReview> workReportReviewList =  workReportReviewService.findReviewListByReportId(workReport.getId());
+		model.addAttribute("workReportReviewList",workReportReviewList);
+		model.addAttribute("workReport", workReport);
+		model.addAttribute("disabled",(readAttr==null||"".equals(readAttr))?"false":"true");
+
+
+		if(workReport.getType().equals("1")){
+			if(StringUtils.isNotBlank(view)&&view.equals("view")){
+				return "modules/work/report/workReportViewDay";
+			}
+			return "modules/work/report/workReportFormDay";	
+		}
+		if(workReport.getType().equals("2")){
+			if(StringUtils.isNotBlank(view)&&view.equals("view")){
+				return "modules/work/report/workReportViewWeek";
+			}
+			return "modules/work/report/workReportFormWeek";	
+		}
+		if(workReport.getType().equals("3")){
+			if(StringUtils.isNotBlank(view)&&view.equals("view")){
+				return "modules/work/report/workReportViewMonth";
+			}
+			return "modules/work/report/workReportFormMonth";	
+		}
+		return adminPath;
+		
+	}
+
+	/**
+	 * 删除附件
+	 * @param request
+	 * @param model
+	 * @return
+	 */
+	@RequestMapping("delFile")
+	@ResponseBody
+	public AjaxJson delFile(WorkReport workReport, HttpServletRequest request, Model model){
+		String id = request.getParameter("id");
+		String attaId = request.getParameter("attaId");
+		String attachmentUrl = request.getParameter("attachmentUrl");
+		workReportService.delFile(attaId,attachmentUrl);
+		AjaxJson ajaxJson = new AjaxJson();
+		ajaxJson.put("attachmentUrl",attachmentUrl);
+		return ajaxJson;
+	}
+
+	@RequiresPermissions(value={"work:report:workReport:view","work:report:workReport:add","work:report:workReport:edit"},logical=Logical.OR)
+	@RequestMapping(value = "formc")
+	public String formChoose(@RequestParam(value = "readAttr",required = false)String readAttr,WorkReport workReport, Model model) {
+		model.addAttribute("workReport", workReport);
+		model.addAttribute("disabled",(readAttr==null||"".equals(readAttr))?"false":"true");
+		//return "modules/work/report/workReportFormChoose";
+		workReport.setType("1");  //默认选日报,在添加页面当选择的时候就跳到周报/月报
+		return 	"modules/work/report/workReportFormDay";
+	}
+
+	/**
+	 * 保存工作报告
+	 */
+	@RequiresPermissions(value={"work:report:workReport:add","work:report:workReport:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	public String save(WorkReport workReport, Model model,
+					   HttpServletRequest request,RedirectAttributes redirectAttributes/*,
+					   @RequestParam(value = "this_upload_files",required = false)MultipartFile[] this_upload_files,
+					   @RequestParam(value = "next_upload_files",required = false)MultipartFile[] next_upload_files*/) throws Exception{
+		if (!beanValidator(model, workReport)){
+			return form("",workReport, model,"","","");
+		}
+		workReport.setCompanyId(UserUtils.getUser().getComId());
+		// 如果是修改,则状态为已发布,则不能再进行操作
+		if (StringUtils.isNotBlank(workReport.getId())){
+			WorkReport e = workReportService.get(workReport.getId());
+			if ("1".equals(e.getStatus())){
+				addMessage(redirectAttributes, "已发布,不能操作!");
+				return "redirect:" + adminPath + "/work/report/workReport/?repage";
+			}
+		}
+/*
+
+		//--- 上传本月图片、日报图片
+		String  this_uploadFolder = request.getSession().getServletContext().getRealPath("local_upload/workReport/"+System.nanoTime());
+		new File(this_uploadFolder).mkdirs();
+		List<String> this_imgList = new ArrayList<>();
+		if(this_upload_files!=null && this_upload_files.length>0){
+			for(int i=0;i<this_upload_files.length;i++){
+				if(this_upload_files[i]==null || this_upload_files[i].getSize()==0)
+					continue;
+				String imageName = System.nanoTime()+this_upload_files[i].getOriginalFilename();
+				String imageNewName = this_uploadFolder+"/"+imageName;
+				this_imgList.add(imageNewName);
+				try{
+					this_upload_files[i].transferTo(new File(imageNewName));
+				}catch (IllegalStateException | IOException e) {
+					e.printStackTrace();
+				}
+			}
+		}
+		StringBuilder this_workreportFiles = new StringBuilder();
+		InputStream inputStream = null;
+		for(int i=0;i<this_imgList.size();i++) {
+			String filePath = this_imgList.get(i);
+			try {
+				inputStream = new FileInputStream(new File(filePath));
+				OSSClientUtil ossUtil = new OSSClientUtil();
+				String suffix = filePath.substring(filePath.lastIndexOf("."));
+				String name = System.nanoTime() + suffix;
+				ossUtil.uploadFile2OSS(inputStream, Global.getReportDir(), name);
+				this_workreportFiles.append(Global.getAliyunUrl() + "/" + Global.getReportDir() + name+",");
+			} catch (IOException e) {
+				e.printStackTrace();
+			} finally {
+				try {
+					if (inputStream != null)
+						inputStream.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+		}
+		//--- 上传下月图片
+		String  next_uploadFolder = request.getSession().getServletContext().getRealPath("local_upload/workReport/"+System.nanoTime());
+		new File(next_uploadFolder).mkdirs();
+		List<String> next_imgList = new ArrayList<>();
+		if(next_upload_files!=null && next_upload_files.length>0){
+			for(int i=0;i<next_upload_files.length;i++){
+				if(next_upload_files[i]==null || next_upload_files[i].getSize()==0)
+					continue;
+				String imageName = System.nanoTime()+next_upload_files[i].getOriginalFilename();
+				String imageNewName = next_uploadFolder+"/"+imageName;
+				next_imgList.add(imageNewName);
+				try{
+					next_upload_files[i].transferTo(new File(imageNewName));
+				}catch (IllegalStateException | IOException e) {
+					e.printStackTrace();
+				}
+			}
+		}
+		StringBuilder next_workreportFiles = new StringBuilder();
+		InputStream next_inputStream = null;
+		for(int i=0;i<next_imgList.size();i++) {
+			String filePath = next_imgList.get(i);
+			try {
+				next_inputStream = new FileInputStream(new File(filePath));
+				OSSClientUtil ossUtil = new OSSClientUtil();
+				String suffix = filePath.substring(filePath.lastIndexOf("."));
+				String name = System.nanoTime() + suffix;
+				ossUtil.uploadFile2OSS(next_inputStream, Global.getReportDir(), name);
+				next_workreportFiles.append(Global.getAliyunUrl() + "/" + Global.getReportDir() + name+",");
+			} catch (IOException e) {
+				e.printStackTrace();
+			} finally {
+				try {
+					if (next_inputStream != null)
+						next_inputStream.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+		}
+		if(!StringUtils.isBlank(this_workreportFiles.toString()))
+			workReport.setThisFiles(this_workreportFiles.toString().substring(0,this_workreportFiles.lastIndexOf(",")));
+		if(!StringUtils.isBlank(next_workreportFiles.toString()))
+			workReport.setNextFiles(next_workreportFiles.toString().substring(0,next_workreportFiles.lastIndexOf(",")));
+*/
+
+
+		workReportService.save(workReport);//保存
+		addMessage(redirectAttributes, "保存工作报告成功");
+		return "redirect:"+Global.getAdminPath()+"/work/report/workReport/outList";
+	}
+	
+	/**
+	 * 删除工作报告
+	 */
+	@RequiresPermissions("work:report:workReport:del")
+	@RequestMapping(value = "delete")
+	public String delete(WorkReport workReport, RedirectAttributes redirectAttributes) {
+		workReportService.delete(workReport);
+		addMessage(redirectAttributes, "删除工作报告成功");
+		return "redirect:"+Global.getAdminPath()+"/work/report/workReport/list";
+	}
+	
+	/**
+	 * 批量删除工作报告
+	 */
+	@RequiresPermissions("work:report:workReport:del")
+	@RequestMapping(value = "deleteAll")
+	public String deleteAll(String ids, RedirectAttributes redirectAttributes) {
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			workReportService.delete(workReportService.get(id));
+		}
+		addMessage(redirectAttributes, "删除工作报告成功");
+		return "redirect:"+Global.getAdminPath()+"/work/report/workReport/?repage";
+	}
+	
+	/**
+	 * 导出excel文件
+	 */
+	@RequiresPermissions("work:report:workReport:export")
+    @RequestMapping(value = "export", method=RequestMethod.POST)
+    public String exportFile(WorkReport workReport, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "工作报告"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            Page<WorkReport> page = workReportService.findPage(new Page<WorkReport>(request, response, -1), workReport);
+    		new ExportExcel("工作报告", WorkReport.class).setDataList(page.getList()).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导出工作报告记录失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/work/report/workReport/?repage";
+    }
+
+	/**
+	 * 导入Excel数据
+
+	 */
+	@RequiresPermissions("work:report:workReport:import")
+    @RequestMapping(value = "import", method=RequestMethod.POST)
+    public String importFile(MultipartFile file, RedirectAttributes redirectAttributes) {
+		try {
+			int successNum = 0;
+			int failureNum = 0;
+			StringBuilder failureMsg = new StringBuilder();
+			ImportExcel ei = new ImportExcel(file, 1, 0);
+			List<WorkReport> list = ei.getDataList(WorkReport.class);
+			for (WorkReport workReport : list){
+				try{
+					workReportService.save(workReport);
+					successNum++;
+				}catch(ConstraintViolationException ex){
+					failureNum++;
+				}catch (Exception ex) {
+					failureNum++;
+				}
+			}
+			if (failureNum>0){
+				failureMsg.insert(0, ",失败 "+failureNum+" 条工作报告记录。");
+			}
+			addMessage(redirectAttributes, "已成功导入 "+successNum+" 条工作报告记录"+failureMsg);
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入工作报告失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/work/report/workReport/?repage";
+    }
+	
+	/**
+	 * 下载导入工作报告数据模板
+	 */
+	@RequiresPermissions("work:report:workReport:import")
+    @RequestMapping(value = "import/template")
+    public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "工作报告数据导入模板.xlsx";
+    		List<WorkReport> list = Lists.newArrayList(); 
+    		new ExportExcel("工作报告数据", WorkReport.class, 1).setDataList(list).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入模板下载失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/work/report/workReport/?repage";
+    }
+
+	/**
+	 * 工作
+	 */
+
+	@RequestMapping(value = {"reportlist"})
+	public String reportlist(CalendarCountEntity calendarCountEntity, @RequestParam(value="flat",required = false)String flat, HttpServletRequest request, HttpServletResponse response, Model model) {
+		String start=request.getParameter("start");
+		User login_user = UserUtils.getUser();
+		List<WorkReport> list=new ArrayList<>();
+		if("1".equals(flat)){
+			List manageCalendarDetailsList = workReportService.getReportUserList(start,calendarCountEntity);
+			model.addAttribute("calendarCountEntity",calendarCountEntity);
+			model.addAttribute("login_user",login_user);
+			model.addAttribute("manageCalendarDetailsList", manageCalendarDetailsList);
+			return "modules/oa/manageCalendarDetailsSelf";
+		}else{
+			List manageCalendarDetailsList = workReportService.getReportUserListAll(start,calendarCountEntity);
+			model.addAttribute("login_user",login_user);
+			model.addAttribute("calendarCountEntity",calendarCountEntity);
+			model.addAttribute("manageCalendarDetailsList", manageCalendarDetailsList);
+			return "modules/oa/manageCalendarDetailsAll";
+		}
+	}
+}

+ 163 - 0
src/main/java/com/jeeplus/modules/work/web/review/WorkReportReviewController.java

@@ -0,0 +1,163 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.work.web.review;
+
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import org.apache.shiro.authz.annotation.Logical;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.jeeplus.common.utils.MyBeanUtils;
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.modules.work.entity.report.WorkReport;
+import com.jeeplus.modules.work.entity.review.WorkReportReview;
+import com.jeeplus.modules.work.service.review.WorkReportReviewService;
+
+/**
+ * 工作报告的评论与回复Controller
+ * @author 许凯
+ * @version 2017-04-28
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/work/review/workReportReview")
+public class WorkReportReviewController extends BaseController {
+
+	@Autowired
+	private WorkReportReviewService workReportReviewService;
+	
+	@ModelAttribute
+	public WorkReportReview get(@RequestParam(required=false) String id) {
+		WorkReportReview entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = workReportReviewService.get(id);
+		}
+		if (entity == null){
+			entity = new WorkReportReview();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 工作报告的评论与回复列表页面
+	 */
+	@RequiresPermissions("work:review:workReportReview:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(WorkReportReview workReportReview, HttpServletRequest request, HttpServletResponse response, Model model) {
+		User user = UserUtils.getUser();
+		String companyId = user.getComId();
+		Page<WorkReportReview> page = workReportReviewService.findPageByCompany(new Page<WorkReportReview>(request,response),workReportReview,companyId);
+		model.addAttribute("page", page);
+		return "modules/work/review/workReportReviewListBy";
+	}
+	
+	
+	/**
+	 * 
+	 */
+	@RequestMapping(value = "listBy")
+	public String listBy(WorkReportReview workReportReview, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<WorkReportReview> page = workReportReviewService.findListByReportId(new Page<WorkReportReview>(request, response), workReportReview); 
+		model.addAttribute("page", page);
+		return "modules/work/review/workReportReviewListBy";
+	}
+
+	/**
+	 * 查看,增加,编辑工作报告的评论与回复表单页面
+	 */
+	@RequiresPermissions(value={"work:review:workReportReview:view","work:review:workReportReview:add","work:review:workReportReview:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(@RequestParam(value = "readAttr",required = false)String readAttr,WorkReportReview workReportReview, Model model) {
+		if (workReportReview.getParent()!=null && StringUtils.isNotBlank(workReportReview.getParent().getId())){
+			workReportReview.setParent(workReportReviewService.get(workReportReview.getParent().getId()));
+			// 获取排序号,最末节点排序号+30
+			if (StringUtils.isBlank(workReportReview.getId())){
+				WorkReportReview workReportReviewChild = new WorkReportReview();
+				workReportReviewChild.setParent(new WorkReportReview(workReportReview.getParent().getId()));
+				List<WorkReportReview> list = workReportReviewService.findList(workReportReview); 
+				if (list.size() > 0){
+					workReportReview.setSort(list.get(list.size()-1).getSort());
+					if (workReportReview.getSort() != null){
+						workReportReview.setSort(workReportReview.getSort() + 30);
+					}
+				}
+			}
+		}
+		if (workReportReview.getSort() == null){
+			workReportReview.setSort(30);
+		}
+		model.addAttribute("workReportReview", workReportReview);
+		model.addAttribute("disabled",(readAttr==null||"".equals(readAttr))?"false":"true");
+		return "modules/work/review/workReportReviewForm";
+	}
+
+	/**
+	 * 保存工作报告的评论与回复
+	 */
+	@RequiresPermissions(value={"work:review:workReportReview:add","work:review:workReportReview:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	public String save(WorkReportReview workReportReview, Model model, RedirectAttributes redirectAttributes) throws Exception{
+		if (!beanValidator(model, workReportReview)){
+			return form("",workReportReview, model);
+		}
+		if(!workReportReview.getIsNewRecord()){//编辑表单保存
+			WorkReportReview t = workReportReviewService.get(workReportReview.getId());//从数据库取出记录的值
+			MyBeanUtils.copyBeanNotNull2Bean(workReportReview, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+			workReportReviewService.save(t);//保存
+		}else{//新增表单保存
+			workReportReviewService.save(workReportReview);//保存
+		}
+		addMessage(redirectAttributes, "保存工作报告的评论与回复成功");
+		return "redirect:"+Global.getAdminPath()+"/work/review/workReportReview/?repage";
+	}
+	
+	/**
+	 * 删除工作报告的评论与回复
+	 */
+	@RequiresPermissions("work:review:workReportReview:del")
+	@RequestMapping(value = "delete")
+	public String delete(WorkReportReview workReportReview, RedirectAttributes redirectAttributes) {
+		workReportReviewService.delete(workReportReview);
+		addMessage(redirectAttributes, "删除工作报告的评论与回复成功");
+		return "redirect:"+Global.getAdminPath()+"/work/review/workReportReview/?repage";
+	}
+
+	@RequiresPermissions("user")
+	@ResponseBody
+	@RequestMapping(value = "treeData")
+	public List<Map<String, Object>> treeData(@RequestParam(required=false) String extId, HttpServletResponse response) {
+		List<Map<String, Object>> mapList = Lists.newArrayList();
+		List<WorkReportReview> list = workReportReviewService.findList(new WorkReportReview());
+		for (int i=0; i<list.size(); i++){
+			WorkReportReview e = list.get(i);
+			if (StringUtils.isBlank(extId) || (extId!=null && !extId.equals(e.getId()) && e.getParentIds().indexOf(","+extId+",")==-1)){
+				Map<String, Object> map = Maps.newHashMap();
+				map.put("id", e.getId());
+				map.put("pId", e.getParentId());
+				map.put("name", e.getContent());
+				mapList.add(map);
+			}
+		}
+		return mapList;
+	}
+	
+}

+ 29 - 0
src/main/java/com/jeeplus/modules/workactivity/dao/ActivityDao.java

@@ -0,0 +1,29 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workactivity.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.workactivity.entity.Activity;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 工作流附加类DAO接口
+ * @author 杨帆
+ * @version 2018-01-24
+ */
+@MyBatisDao
+public interface ActivityDao extends CrudDao<Activity> {
+
+    List<Activity> findByActivityMenuId(String activityMenuId);
+    List<Activity> findListByMenu(Activity activity);
+
+    List<Activity> groupByActivityMenu(@Param("parentId") String parentId,@Param("companyId") String companyId);
+
+    List<Activity> getByProcessInstanceId(@Param("processInstanceId") String processInstanceId);
+
+    int deleteToDelflag(String activityMenuId);
+}

+ 36 - 0
src/main/java/com/jeeplus/modules/workactivity/dao/WorkActivityProcessDao.java

@@ -0,0 +1,36 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workactivity.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.workactivity.entity.WorkActivityProcess;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 工作流审批信息DAO接口
+ * @author 杨帆
+ * @version 2018-01-30
+ */
+@MyBatisDao
+public interface WorkActivityProcessDao extends CrudDao<WorkActivityProcess> {
+
+    List<WorkActivityProcess> findByKeyAndCount(WorkActivityProcess workActivityProcess);
+    List<WorkActivityProcess> findByProcInsId(WorkActivityProcess workActivityProcess);
+    List<WorkActivityProcess> findByProcInsIdAudit(WorkActivityProcess workActivityProcess);
+    List<WorkActivityProcess> findByProcInsIdAndIsApproval(WorkActivityProcess workActivityProcess);
+    int delFlag(WorkActivityProcess workActivityProcess);
+    int deleteByAudit(WorkActivityProcess workActivityProcess);
+    int deleteProcessIdAuditUsers(@Param("processInstanceId")String processInstanceId);
+    int updateProcessInstanceId(@Param("processInstanceId")String processInstanceId,@Param("processId")String processId);
+    int deleteProcessInstanceId(@Param("processId")String processId);
+    int deleteProcessInstanceById(@Param("processId")String processId);
+    int deleteAudits(@Param("processId")String processId,@Param("count")int count);
+    int insertAudits(WorkActivityProcess workActivityProcess);
+    int updateDelFlagAndIsApproval(WorkActivityProcess p);
+    void deleteyProcess(String id);
+    int updateType(@Param("processInstanceId")String processInstanceId,@Param("type")String type);
+}

+ 172 - 0
src/main/java/com/jeeplus/modules/workactivity/entity/Activity.java

@@ -0,0 +1,172 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workactivity.entity;
+
+import com.jeeplus.modules.sys.entity.Role;
+import com.jeeplus.modules.sys.entity.SysRoleActivity;
+import com.jeeplus.modules.sys.entity.User;
+
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+
+/**
+ * 工作流附加类Entity
+ * @author 杨帆
+ * @version 2018-01-24
+ */
+public class Activity extends DataEntity<Activity> {
+	
+	private static final long serialVersionUID = 1L;
+	private String name;		// 任务名称
+	private User User;		// 审批人
+	private SysRoleActivity role;		// 审批角色别名
+	private String encount;		// 审批角色别名
+	private String enlist;		// 审批角色别名
+	private String processKey;		// 流程标识
+	private String returnBack;		// 0 返回上一步 1 返回第一步
+	private String isApproval;		// 是否审批
+	private String approvalId;		// 审批id
+	private String activityMenuId;  // 流程外键Id
+	private int count;
+	private WorkActivityProcess workActivityProcess;
+	private String activityTask;
+	private String companyId;
+	private String activityName;
+	
+	public Activity() {
+		super();
+	}
+
+	public Activity(String id){
+		super(id);
+	}
+
+	@ExcelField(title="任务名称", align=2, sort=7)
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+	
+	@ExcelField(title="审批人", align=2, sort=8)
+	public User getUser() {
+		return User;
+	}
+
+	public void setUser(User User) {
+		this.User = User;
+	}
+
+	@ExcelField(title="审批角色别名", align=2, sort=9)
+	public SysRoleActivity getRole() {
+		return role;
+	}
+
+	public void setRole(SysRoleActivity role) {
+		this.role = role;
+	}
+
+	@ExcelField(title="审批id", align=2, sort=8)
+	public String getActivityMenuId() {
+		return activityMenuId;
+	}
+
+	public void setActivityMenuId(String activityMenuId) {
+		this.activityMenuId = activityMenuId;
+	}
+
+	@ExcelField(title="流程标识", align=2, sort=11)
+	public String getProcessKey() {
+		return processKey;
+	}
+
+	public void setProcessKey(String processKey) {
+		this.processKey = processKey;
+	}
+	
+	@ExcelField(title="0 返回上一步 1 返回第一步", align=2, sort=12)
+	public String getReturnBack() {
+		return returnBack;
+	}
+
+	public void setReturnBack(String returnBack) {
+		this.returnBack = returnBack;
+	}
+	
+	@ExcelField(title="是否审批", align=2, sort=13)
+	public String getIsApproval() {
+		return isApproval;
+	}
+
+	public void setIsApproval(String isApproval) {
+		this.isApproval = isApproval;
+	}
+	
+	@ExcelField(title="审批id", align=2, sort=14)
+	public String getApprovalId() {
+		return approvalId;
+	}
+
+	public void setApprovalId(String approvalId) {
+		this.approvalId = approvalId;
+	}
+
+	public int getCount() {
+		return count;
+	}
+
+	public void setCount(int count) {
+		this.count = count;
+	}
+
+	public WorkActivityProcess getWorkActivityProcess() {
+		return workActivityProcess;
+	}
+
+	public void setWorkActivityProcess(WorkActivityProcess workActivityProcess) {
+		this.workActivityProcess = workActivityProcess;
+	}
+
+	public String getEncount() {
+		return encount;
+	}
+
+	public void setEncount(String encount) {
+		this.encount = encount;
+	}
+
+	public String getEnlist() {
+		return enlist;
+	}
+
+	public void setEnlist(String enlist) {
+		this.enlist = enlist;
+	}
+
+	public String getActivityName() {
+		return activityName;
+	}
+
+	public void setActivityName(String activityName) {
+		this.activityName = activityName;
+	}
+
+	public String getActivityTask() {
+		return activityTask;
+	}
+
+	public void setActivityTask(String activityTask) {
+		this.activityTask = activityTask;
+	}
+
+	public String getCompanyId() {
+		return companyId;
+	}
+
+	public void setCompanyId(String companyId) {
+		this.companyId = companyId;
+	}
+}

+ 103 - 0
src/main/java/com/jeeplus/modules/workactivity/entity/WorkActivityProcess.java

@@ -0,0 +1,103 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workactivity.entity;
+
+
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+
+import java.util.List;
+
+/**
+ * 工作流审批信息Entity
+ * @author 杨帆
+ * @version 2018-01-30
+ */
+public class WorkActivityProcess extends DataEntity<WorkActivityProcess> {
+	
+	private static final long serialVersionUID = 1L;
+	private String processKey;			// 流程标识
+	private String isApproval;			// 是否审批,1 审批通过。2审批未通过
+	private String processInstanceId;		// 实例流程id
+	private int count;
+	private Activity activity;
+	private String activityTask;
+	private String type;
+	private List<WorkActivityProcessUser> processUserList;
+	
+	public WorkActivityProcess() {
+		super();
+	}
+
+	public WorkActivityProcess(String id){
+		super(id);
+	}
+
+	@ExcelField(title="流程标识", align=2, sort=7)
+	public String getProcessKey() {
+		return processKey;
+	}
+
+	public void setProcessKey(String processKey) {
+		this.processKey = processKey;
+	}
+	
+	@ExcelField(title="是否审批", align=2, sort=8)
+	public String getIsApproval() {
+		return isApproval;
+	}
+
+	public void setIsApproval(String isApproval) {
+		this.isApproval = isApproval;
+	}
+	
+	@ExcelField(title="实例流程id", align=2, sort=9)
+	public String getProcessInstanceId() {
+		return processInstanceId;
+	}
+
+	public void setProcessInstanceId(String processInstanceId) {
+		this.processInstanceId = processInstanceId;
+	}
+
+	public int getCount() {
+		return count;
+	}
+
+	public void setCount(int count) {
+		this.count = count;
+	}
+
+	public Activity getActivity() {
+		return activity;
+	}
+
+	public void setActivity(Activity activity) {
+		this.activity = activity;
+	}
+
+	public String getActivityTask() {
+		return activityTask;
+	}
+
+	public void setActivityTask(String activityTask) {
+		this.activityTask = activityTask;
+	}
+
+	public List<WorkActivityProcessUser> getProcessUserList() {
+		return processUserList;
+	}
+
+	public void setProcessUserList(List<WorkActivityProcessUser> processUserList) {
+		this.processUserList = processUserList;
+	}
+
+	public String getType() {
+		return type;
+	}
+
+	public void setType(String type) {
+		this.type = type;
+	}
+}

+ 63 - 0
src/main/java/com/jeeplus/modules/workactivity/entity/WorkActivityProcessUser.java

@@ -0,0 +1,63 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workactivity.entity;
+
+
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+
+/**
+ * 工作流审批信息Entity
+ * @author 杨帆
+ * @version 2018-01-30
+ */
+public class WorkActivityProcessUser extends DataEntity<WorkActivityProcessUser> {
+
+	private static final long serialVersionUID = 1L;
+	private String processId;		// 流程实例id
+	private String userId;		// 用户id
+	private String name;  //用户名称
+	private int count;		// 是否审批
+	private int type;       // type
+
+	public String getProcessId() {
+		return processId;
+	}
+
+	public void setProcessId(String processId) {
+		this.processId = processId;
+	}
+
+	public String getUserId() {
+		return userId;
+	}
+
+	public void setUserId(String userId) {
+		this.userId = userId;
+	}
+
+	public int getCount() {
+		return count;
+	}
+
+	public void setCount(int count) {
+		this.count = count;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public int getType() {
+		return type;
+	}
+
+	public void setType(int type) {
+		this.type = type;
+	}
+}

+ 234 - 0
src/main/java/com/jeeplus/modules/workactivity/service/ActivityService.java

@@ -0,0 +1,234 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workactivity.service;
+
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.service.CrudService;
+import com.jeeplus.common.utils.MyBeanUtils;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.workactivity.dao.ActivityDao;
+import com.jeeplus.modules.workactivity.dao.WorkActivityProcessDao;
+import com.jeeplus.modules.workactivity.entity.Activity;
+import com.jeeplus.modules.workprojectnotify.entity.WorkProjectNotify;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 工作流附加类Service
+ * @author 杨帆
+ * @version 2018-01-24
+ */
+@Service
+@Transactional(readOnly = true)
+public class ActivityService extends CrudService<ActivityDao, Activity> {
+	@Autowired
+	private WorkActivityProcessDao workActivityProcessDao;
+
+	public Activity get(String id) {
+		Activity activity = super.get(id);
+		return activity;
+	}
+
+	public List<Activity> getByProcessInstanceId(String processInstanceId) {
+		List<Activity> activitys = dao.getByProcessInstanceId(processInstanceId);
+		return activitys;
+	}
+	public WorkProjectNotify getByFlagAndTaskDefKey(List<Activity> activities,WorkProjectNotify workProjectNotify, String taskDefKey, String flag,String count,User user) {
+		try {
+			Activity activity = new Activity();
+			if (taskDefKey.contains("audit")) {
+				if (activities.size() == 1 || count.equals("1")){
+					activity = activities.get(0);
+				}else if (activities.size()==Integer.parseInt(count)){
+					activity = activities.get(activities.size()-1);
+					String returnBack = activity.getReturnBack();
+					if (returnBack.equals("1")){
+						activity = activities.get(Integer.parseInt(count)-2);
+					}else if (returnBack.equals("2")){
+						activity = activities.get(0);
+					}
+				}else {
+					activity = activities.get(Integer.parseInt(count)-1);
+					String returnBack = activity.getReturnBack();
+					if (returnBack.equals("1")){
+						activity = activities.get(Integer.parseInt(count)-2);
+					}else if (returnBack.equals("2")){
+						activity = activities.get(0);
+					}
+				}
+			}else if(!"yes".equals(flag)){
+				workProjectNotify.setRemarks("重新申请");
+				activity = new Activity();
+			}else {
+				activity = activities.get(Integer.parseInt(count));
+			}
+			if (activity!=null && StringUtils.isNotBlank(activity.getId())){
+				workProjectNotify.setUser(activity.getUser());
+				workProjectNotify.setNotifyRole(activity.getRole().getEnname());
+			}else {
+				workProjectNotify.setUser(user);
+			}
+		}catch (Exception e){
+			logger.info("Exception e:"+e);
+		}
+
+		return workProjectNotify;
+	}
+
+	public List<WorkProjectNotify> getByFlagAndTaskDefKeyList(List<Activity> activities,WorkProjectNotify workProjectNotify, String taskDefKey, String flag,String count,User user,String officeId,String type) {
+		List<WorkProjectNotify> list = new ArrayList<>();
+		try {
+			Activity activity = new Activity();
+			if (taskDefKey.equals("modifyApply")) {
+				activity = activities.get(0);
+				if (activities.size() == 1 || count.equals("1")){
+					activity = activities.get(0);
+				}else if (activities.size()==Integer.parseInt(count)){
+					activity = activities.get(activities.size()-1);
+					String returnBack = activity.getReturnBack();
+					if (returnBack.equals("1")){
+						activity = activities.get(0);
+					}else if (returnBack.equals("2")){
+						activity = activities.get(0);
+					}
+				}else {
+					activity = activities.get(0);
+					String returnBack = activity.getReturnBack();
+					if (returnBack.equals("1")){
+						activity = activities.get(0);
+					}else if (returnBack.equals("2")){
+						activity = activities.get(0);
+					}
+				}
+			}else if(!"yes".equals(flag)){
+				workProjectNotify.setRemarks("重新申请");
+				activity = new Activity();
+			}else {
+				activity = activities.get(Integer.parseInt(count));
+			}
+			if (activity!=null && StringUtils.isNotBlank(activity.getId())){
+				if (activity.getUser()!=null && StringUtils.isNotBlank(activity.getUser().getId())){
+					workProjectNotify.setUser(activity.getUser());
+					list.add(workProjectNotify);
+				}else {
+					List<User> users = UserUtils.getByRoleActivityEnnames(activity.getRole().getEnname(),officeId,type,user.getCreateBy());
+					for (User user1:users){
+						WorkProjectNotify projectNotify = new WorkProjectNotify();
+						MyBeanUtils.copyBeanNotNull2Bean(workProjectNotify, projectNotify);
+						projectNotify.setUser(user1);
+						list.add(projectNotify);
+					}
+				}
+
+			}else {
+				workProjectNotify.setUser(user);
+				list.add(workProjectNotify);
+			}
+		}catch (Exception e){
+			logger.info("Exception e:"+e);
+			list.add(workProjectNotify);
+		}
+
+		return list;
+	}
+	public List<WorkProjectNotify> getByFlagAndTaskDefKeyListSpecial(List<Activity> activities,WorkProjectNotify workProjectNotify, String taskDefKey, String flag,String count,User user,String officeId,String type) {
+		List<WorkProjectNotify> list = new ArrayList<>();
+		try {
+			Activity activity = new Activity();
+			if (taskDefKey.equals("modifyApply")) {
+				activity = activities.get(0);
+				if (activities.size() == 1 || count.equals("1")){
+					activity = activities.get(0);
+				}else if (activities.size()==Integer.parseInt(count)){
+					activity = activities.get(activities.size()-1);
+					String returnBack = activity.getReturnBack();
+					if (returnBack.equals("1")){
+						activity = activities.get(0);
+					}else if (returnBack.equals("2")){
+						activity = activities.get(0);
+					}
+				}else {
+					activity = activities.get(0);
+					String returnBack = activity.getReturnBack();
+					if (returnBack.equals("1")){
+						activity = activities.get(0);
+					}else if (returnBack.equals("2")){
+						activity = activities.get(0);
+					}
+				}
+			}else if("2".equals(flag)){
+				workProjectNotify.setRemarks("重新申请");
+				activity = new Activity();
+			}else {
+				activity = activities.get(Integer.parseInt(count));
+			}
+			if (activity!=null && StringUtils.isNotBlank(activity.getId())){
+				if (activity.getUser()!=null && StringUtils.isNotBlank(activity.getUser().getId())){
+					workProjectNotify.setUser(activity.getUser());
+					list.add(workProjectNotify);
+				}else {
+					List<User> users = UserUtils.getByRoleActivityEnnames(activity.getRole().getEnname(),officeId,type,user.getCreateBy());
+					for (User user1:users){
+						WorkProjectNotify projectNotify = new WorkProjectNotify();
+						MyBeanUtils.copyBeanNotNull2Bean(workProjectNotify, projectNotify);
+						projectNotify.setUser(user1);
+						list.add(projectNotify);
+					}
+				}
+
+			}else {
+				workProjectNotify.setUser(user);
+				list.add(workProjectNotify);
+			}
+		}catch (Exception e){
+			logger.info("Exception e:"+e);
+			list.add(workProjectNotify);
+		}
+
+		return list;
+	}
+	
+	public List<Activity> findList(Activity activity) {
+		return super.findList(activity);
+	}
+
+	public List<Activity> findByActivityMenuId(String activityMenuId) {
+		return dao.findByActivityMenuId(activityMenuId);
+	}
+
+	public List<Activity> groupByActivityMenu(String parentId,String companyId) {
+		return dao.groupByActivityMenu(parentId,companyId);
+	}
+
+	public Page<Activity> findPage(Page<Activity> page, Activity activity) {
+		return super.findPage(page, activity);
+	}
+	
+	@Transactional(readOnly = false)
+	public void save(Activity activity) {
+		super.save(activity);
+	}
+
+	@Transactional(readOnly = false)
+	public void deleteToDelflag(String activityMenuId) {
+		dao.deleteToDelflag(activityMenuId);
+	}
+
+	@Transactional(readOnly = false)
+	public void delete(Activity activity) {
+		super.delete(activity);
+	}
+	
+	public Activity findUniqueByProperty(String propertyName, Object value){
+		return super.findUniqueByProperty(propertyName,value);
+	}
+	
+	
+}

+ 415 - 0
src/main/java/com/jeeplus/modules/workactivity/service/WorkActivityProcessService.java

@@ -0,0 +1,415 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workactivity.service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.workactivity.entity.Activity;
+import com.jeeplus.modules.workactivity.entity.WorkActivityProcessUser;
+import com.jeeplus.modules.workactivitymenu.entity.WorkActivityMenu;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.service.CrudService;
+import com.jeeplus.modules.workactivity.entity.WorkActivityProcess;
+import com.jeeplus.modules.workactivity.dao.WorkActivityProcessDao;
+
+/**
+ * 工作流审批信息Service
+ * @author 杨帆
+ * @version 2018-01-30
+ */
+@Service
+@Transactional(readOnly = true)
+public class WorkActivityProcessService extends CrudService<WorkActivityProcessDao, WorkActivityProcess> {
+
+	public WorkActivityProcess get(String id) {
+		return super.get(id);
+	}
+	
+	public List<WorkActivityProcess> findByKeyAndCount(WorkActivityProcess workActivityProcess) {
+		return dao.findByKeyAndCount(workActivityProcess);
+	}
+	public List<WorkActivityProcess> findList(WorkActivityProcess workActivityProcess) {
+		return super.findList(workActivityProcess);
+	}
+	public List<WorkActivityProcess> findByProcInsId(WorkActivityProcess workActivityProcess) {
+		return dao.findByProcInsId(workActivityProcess);
+	}
+	public List<WorkActivityProcess> findByProcInsIdAudit(WorkActivityProcess workActivityProcess) {
+		return dao.findByProcInsIdAudit(workActivityProcess);
+	}
+	public List<WorkActivityProcess> findByProcInsIdAndIsApproval(WorkActivityProcess workActivityProcess) {
+		return dao.findByProcInsIdAndIsApproval(workActivityProcess);
+	}
+
+	public Page<WorkActivityProcess> findPage(Page<WorkActivityProcess> page, WorkActivityProcess workActivityProcess) {
+		return super.findPage(page, workActivityProcess);
+	}
+	
+	@Transactional(readOnly = false)
+	public void save(WorkActivityProcess workActivityProcess) {
+		super.save(workActivityProcess);
+	}
+	@Transactional(readOnly = false)
+	public void insert(WorkActivityProcess workActivityProcess) {
+		workActivityProcess.preInsert();
+		dao.insert(workActivityProcess);
+	}
+
+	@Transactional(readOnly = false)
+	public void insertAudits(WorkActivityProcess workActivityProcess) {
+		dao.insertAudits(workActivityProcess);
+	}
+	@Transactional(readOnly = false)
+	public void insertAuditsByType(List<User> users,String processId,int count,int type) {
+		WorkActivityProcess workActivityProcess = new WorkActivityProcess();
+		List<WorkActivityProcessUser> processUserList = new ArrayList<>();
+		if(users!=null&&users.size()!=0){
+			for (User u :users){
+				WorkActivityProcessUser process = new WorkActivityProcessUser();
+				process.setCount(count);
+				process.setUserId(u.getId());
+				process.setProcessId(processId);
+				process.setType(type);
+				processUserList.add(process);
+			}
+			workActivityProcess.setProcessUserList(processUserList);
+			if(count>1 && type==1) {
+				dao.deleteAudits(processId,count);
+			}
+			dao.insertAudits(workActivityProcess);
+		}
+
+	}
+	@Transactional(readOnly = false)
+	public void delFlag(WorkActivityProcess workActivityProcess) {
+		dao.delFlag(workActivityProcess);
+	}
+	@Transactional(readOnly = false)
+	public void updateProcessInstanceId(String processInstanceId,String processId) {
+		dao.updateProcessInstanceId(processInstanceId,processId);
+	}
+	@Transactional(readOnly = false)
+	public void deleteProcessInstanceId(String processId) {
+		dao.deleteProcessInstanceId(processId);
+	}
+	@Transactional(readOnly = false)
+	public void deleteProcessInstanceById(String processId) {
+		dao.deleteProcessInstanceById(processId);
+	}
+	@Transactional(readOnly = false)
+	public void updateProcess(WorkActivityProcess workActivityProcess, WorkActivityMenu workActivityMenu, int key, String taskCount, String processInstanceId, String taskDefKey, String audit, String flag, String comment, List<Activity> activities) {
+		if (workActivityProcess.getCount() != 0) {
+			workActivityProcess.setId("");
+		} else {
+			WorkActivityProcess workActivityProcess1 = new WorkActivityProcess();
+			workActivityProcess1.setIsApproval("0");
+			workActivityProcess1.setCount(0);
+			workActivityProcess1.setProcessInstanceId(processInstanceId);
+			this.deleteByAudit(workActivityProcess1);
+		}
+
+		workActivityProcess.setRemarks(comment);
+		workActivityProcess.setProcessInstanceId(processInstanceId);
+		workActivityProcess.setProcessKey(workActivityMenu.getProcessType());
+		if (workActivityProcess.getCount() != 0) {
+			workActivityProcess.setCount(Integer.parseInt(taskCount));
+		}
+		workActivityProcess.setIsApproval("yes".equals(flag) ? "1" : "2");
+		if (workActivityProcess != null && StringUtils.isNotBlank(workActivityProcess.getIsApproval())) {
+
+			WorkActivityProcess w = new WorkActivityProcess();
+			w.setProcessInstanceId(processInstanceId);
+			w.setIsApproval("0");
+			w.setDelFlag("0");
+			this.delFlag(w);
+			WorkActivityProcess process = w;
+			if ((taskDefKey.equals("modifyApply") && key == 1) || (taskDefKey.equals(audit) && key == 0)) {
+				if ("yes".equals(flag)) {
+					String returnBack = "";
+					for (Activity activity : activities) {
+						if (activity.getCount() == Integer.parseInt(taskCount)) {
+							returnBack = activity.getReturnBack();
+						}
+					}
+					if (!returnBack.equals("0")) {
+						if (returnBack.equals("1")) {
+							if (!taskCount.equals("1")) {
+								process.setCount(1);
+							} else {
+								process.setCount(1);
+							}
+						} else if (returnBack.equals("2")) {
+							process.setCount(1);
+						} else {
+							process.setCount(1);
+						}
+					}
+					workActivityProcess.setId("");
+				} else {
+					process.setCount(11);
+				}
+			} else {
+				if ("yes".equals(flag)) {
+					process.setCount(Integer.parseInt(taskCount) + 1);
+				} else {
+					String returnBack = "";
+					for (Activity activity : activities) {
+						if (activity.getCount() == Integer.parseInt(taskCount)) {
+							returnBack = activity.getReturnBack();
+						}
+					}
+					if (!returnBack.equals("0")) {
+						if (returnBack.equals("1")) {
+							if (!taskCount.equals("1")) {
+								process.setCount(1);
+							} else {
+								process.setCount(1);
+							}
+						} else if (returnBack.equals("2")) {
+							process.setCount(1);
+						} else {
+							process.setCount(1);
+						}
+						WorkActivityProcess workActivityProcess1 = new WorkActivityProcess();
+						workActivityProcess1.setCount(0);
+						workActivityProcess1.setProcessInstanceId(processInstanceId);
+						workActivityProcess1.setProcessKey(workActivityMenu.getProcessType());
+						workActivityProcess1.setIsApproval("0");
+						workActivityProcess1.setActivityTask("modifyApply");
+						this.save(workActivityProcess1);
+					}
+				}
+			}
+			process.setDelFlag("1");
+			this.delFlag(process);
+			if (workActivityProcess.getCount() == 0) {
+				workActivityProcess.setDelFlag("0");
+			}
+			this.save(workActivityProcess);
+		}
+	}
+
+	@Transactional(readOnly = false)
+	public void updateProcessSpecial(WorkActivityProcess workActivityProcess, WorkActivityMenu workActivityMenu,int key, String taskCount, String processInstanceId, String taskDefKey,String audit, String flag, String comment, List<Activity> activities) {
+		if (workActivityProcess.getCount()!=0){
+			workActivityProcess.setId("");
+		}else {
+			WorkActivityProcess workActivityProcess1 = new WorkActivityProcess();
+			workActivityProcess1.setIsApproval("0");
+			workActivityProcess1.setCount(0);
+			workActivityProcess1.setProcessInstanceId(processInstanceId);
+			this.deleteByAudit(workActivityProcess1);
+		}
+
+		workActivityProcess.setRemarks(comment);
+		workActivityProcess.setProcessInstanceId(processInstanceId);
+		workActivityProcess.setProcessKey(workActivityMenu.getProcessType());
+		if (workActivityProcess.getCount()!=0) {
+			workActivityProcess.setCount(Integer.parseInt(taskCount));
+		}
+		//1 -3 通过 2驳回
+		workActivityProcess.setIsApproval("2".equals(flag)?"2":"1");
+		if (workActivityProcess!=null && StringUtils.isNotBlank(workActivityProcess.getIsApproval())){
+
+			WorkActivityProcess w = new WorkActivityProcess();
+			w.setProcessInstanceId(processInstanceId);
+			w.setIsApproval("0");
+			w.setDelFlag("0");
+			this.delFlag(w);
+			WorkActivityProcess process = w;
+			if((taskDefKey.equals("modifyApply") && key==1) || (taskDefKey.equals(audit)&& key==0)) {
+				if ("1".equals(flag) || "3".equals(flag)){
+					String returnBack = "";
+					for (Activity activity : activities) {
+						if (activity.getCount() == Integer.parseInt(taskCount)) {
+							returnBack = activity.getReturnBack();
+						}
+					}
+					if (!returnBack.equals("0")) {
+						if (returnBack.equals("1")) {
+							if (!taskCount.equals("1")) {
+								process.setCount(1);
+							}else {
+								process.setCount(1);
+							}
+						} else if (returnBack.equals("2")) {
+							process.setCount(1);
+						} else{
+							process.setCount(1);
+						}
+					}
+					workActivityProcess.setId("");
+				}else {
+					process.setCount(11);
+				}
+			}else {
+				if ("1".equals(flag) || "3".equals(flag)) {
+					process.setCount(Integer.parseInt(taskCount) + 1);
+				} else {
+					String returnBack = "";
+					for (Activity activity : activities) {
+						if (activity.getCount() == Integer.parseInt(taskCount)) {
+							returnBack = activity.getReturnBack();
+						}
+					}
+					if (!returnBack.equals("0")) {
+						if (returnBack.equals("1")) {
+							if (!taskCount.equals("1")) {
+								process.setCount(1);
+							}else {
+								process.setCount(1);
+							}
+						} else if (returnBack.equals("2")) {
+							process.setCount(1);
+						} else{
+							process.setCount(1);
+						}
+						WorkActivityProcess workActivityProcess1 = new WorkActivityProcess();
+						workActivityProcess1.setCount(0);
+						workActivityProcess1.setProcessInstanceId(processInstanceId);
+						workActivityProcess1.setProcessKey(workActivityMenu.getProcessType());
+						workActivityProcess1.setIsApproval("0");
+						workActivityProcess1.setActivityTask("modifyApply");
+						this.save(workActivityProcess1);
+					}
+				}
+			}
+			process.setDelFlag("1");
+			this.delFlag(process);
+			if (workActivityProcess.getCount()==0){
+				workActivityProcess.setDelFlag("0");
+			}
+			this.save(workActivityProcess);
+		}
+	}
+	@Transactional(readOnly = false)
+	public void deleteByAudit(WorkActivityProcess workActivityProcess) {
+		dao.deleteByAudit(workActivityProcess);
+	}
+	@Transactional(readOnly = false)
+	public void deleteProcessIdAuditUsers(String processInstanceId) {
+		dao.deleteProcessIdAuditUsers(processInstanceId);
+	}
+
+	@Transactional(readOnly = false)
+	public void saveList(List<Activity> list,String processInstanceId) {
+		for (Activity activity:list){
+			WorkActivityProcess workActivityProcess = new WorkActivityProcess();
+			workActivityProcess.setProcessKey(activity.getProcessKey());
+			workActivityProcess.setCount(activity.getCount());
+			workActivityProcess.setProcessInstanceId(processInstanceId);
+			workActivityProcess.setIsApproval("0");
+			workActivityProcess.setActivity(activity);
+			workActivityProcess.setActivityTask(activity.getActivityTask());
+			super.save(workActivityProcess);
+		}
+	}
+
+	@Transactional(readOnly = false)
+	public void delete(WorkActivityProcess workActivityProcess) {
+		super.delete(workActivityProcess);
+	}
+	
+	public void deleteyProcess(String id){
+		dao.deleteyProcess(id);
+	}
+
+	@Transactional(readOnly = false)
+	public void updateProcessRegular(WorkActivityProcess workActivityProcess, WorkActivityMenu workActivityMenu,int key, String taskCount, String processInstanceId, String taskDefKey,String audit, String flag, String comment, List<Activity> activities) {
+		if (workActivityProcess.getCount()!=0){
+			workActivityProcess.setId("");
+		}else {
+			WorkActivityProcess workActivityProcess1 = new WorkActivityProcess();
+			workActivityProcess1.setIsApproval("0");
+			workActivityProcess1.setCount(0);
+			workActivityProcess1.setProcessInstanceId(processInstanceId);
+			this.deleteByAudit(workActivityProcess1);
+		}
+
+		workActivityProcess.setRemarks(comment);
+		workActivityProcess.setProcessInstanceId(processInstanceId);
+		workActivityProcess.setProcessKey(workActivityMenu.getProcessType());
+		if (workActivityProcess.getCount()!=0) {
+			workActivityProcess.setCount(Integer.parseInt(taskCount));
+		}
+		workActivityProcess.setIsApproval("yes".equals(flag)?"1":"2");
+		if (workActivityProcess!=null && StringUtils.isNotBlank(workActivityProcess.getIsApproval())){
+
+			WorkActivityProcess w = new WorkActivityProcess();
+			w.setProcessInstanceId(processInstanceId);
+			w.setIsApproval("0");
+			w.setDelFlag("0");
+			this.delFlag(w);
+			WorkActivityProcess process = w;
+			if((taskDefKey.equals("modifyApply") && key==1) || (taskDefKey.equals(audit)&& key==0)) {
+				if ("yes".equals(flag)){
+					String returnBack = "";
+					for (Activity activity : activities) {
+						if (activity.getCount() == Integer.parseInt(taskCount)) {
+							returnBack = activity.getReturnBack();
+						}
+					}
+					if (!returnBack.equals("0")) {
+						if (returnBack.equals("1")) {
+							if (!taskCount.equals("1")) {
+								process.setCount(1);
+							}else {
+								process.setCount(1);
+							}
+						} else if (returnBack.equals("2")) {
+							process.setCount(1);
+						} else{
+							process.setCount(1);
+						}
+					}
+					workActivityProcess.setId("");
+				}else {
+					process.setCount(11);
+				}
+			}else {
+				if ("yes".equals(flag)) {
+					process.setCount(Integer.parseInt(taskCount) + 1);
+				} else {
+					String returnBack = "";
+					for (Activity activity : activities) {
+						if (activity.getCount() == Integer.parseInt(taskCount)) {
+							returnBack = activity.getReturnBack();
+						}
+					}
+					if (!returnBack.equals("0")) {
+						if (returnBack.equals("1")) {
+							if (!taskCount.equals("1")) {
+								process.setCount(1);
+							}else {
+								process.setCount(1);
+							}
+						} else if (returnBack.equals("2")) {
+							process.setCount(1);
+						} else{
+							process.setCount(1);
+						}
+
+					}
+				}
+			}
+			process.setDelFlag("1");
+			this.delFlag(process);
+			if (workActivityProcess.getCount()==0){
+				workActivityProcess.setDelFlag("0");
+			}
+			this.save(workActivityProcess);
+		}
+	}
+
+	@Transactional(readOnly = false)
+	public void updateType(String processInstanceId ,String type) {
+		dao.updateType(processInstanceId,type);
+	}
+}

+ 196 - 0
src/main/java/com/jeeplus/modules/workactivity/web/ActivityController.java

@@ -0,0 +1,196 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workactivity.web;
+
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.ConstraintViolationException;
+
+import org.apache.shiro.authz.annotation.Logical;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import com.google.common.collect.Lists;
+import com.jeeplus.common.utils.DateUtils;
+import com.jeeplus.common.utils.MyBeanUtils;
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.utils.excel.ExportExcel;
+import com.jeeplus.common.utils.excel.ImportExcel;
+import com.jeeplus.modules.workactivity.entity.Activity;
+import com.jeeplus.modules.workactivity.service.ActivityService;
+
+/**
+ * 工作流附加类Controller
+ * @author 杨帆
+ * @version 2018-01-24
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/workactivity/activity")
+public class ActivityController extends BaseController {
+
+	@Autowired
+	private ActivityService activityService;
+	
+	@ModelAttribute
+	public Activity get(@RequestParam(required=false) String id) {
+		Activity entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = activityService.get(id);
+		}
+		if (entity == null){
+			entity = new Activity();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 工作流附加类列表页面
+	 */
+	@RequiresPermissions("workactivity:activity:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(Activity activity, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<Activity> page = activityService.findPage(new Page<Activity>(request, response), activity); 
+		model.addAttribute("page", page);
+		return "modules/workactivity/activityList";
+	}
+
+	/**
+	 * 查看,增加,编辑工作流附加类表单页面
+	 */
+	@RequiresPermissions(value={"workactivity:activity:view","workactivity:activity:add","workactivity:activity:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(Activity activity, Model model) {
+		model.addAttribute("activity", activity);
+		return "modules/workactivity/activityForm";
+	}
+
+	/**
+	 * 保存工作流附加类
+	 */
+	@RequiresPermissions(value={"workactivity:activity:add","workactivity:activity:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	public String save(Activity activity, Model model, RedirectAttributes redirectAttributes) throws Exception{
+		if (!beanValidator(model, activity)){
+			return form(activity, model);
+		}
+		if(!activity.getIsNewRecord()){//编辑表单保存
+			Activity t = activityService.get(activity.getId());//从数据库取出记录的值
+			MyBeanUtils.copyBeanNotNull2Bean(activity, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+			activityService.save(t);//保存
+		}else{//新增表单保存
+			activityService.save(activity);//保存
+		}
+		addMessage(redirectAttributes, "保存工作流附加类成功");
+		return "redirect:"+Global.getAdminPath()+"/workactivity/activity/?repage";
+	}
+	
+	/**
+	 * 删除工作流附加类
+	 */
+	@RequiresPermissions("workactivity:activity:del")
+	@RequestMapping(value = "delete")
+	public String delete(Activity activity, RedirectAttributes redirectAttributes) {
+		activityService.delete(activity);
+		addMessage(redirectAttributes, "删除工作流附加类成功");
+		return "redirect:"+Global.getAdminPath()+"/workactivity/activity/?repage";
+	}
+	
+	/**
+	 * 批量删除工作流附加类
+	 */
+	@RequiresPermissions("workactivity:activity:del")
+	@RequestMapping(value = "deleteAll")
+	public String deleteAll(String ids, RedirectAttributes redirectAttributes) {
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			activityService.delete(activityService.get(id));
+		}
+		addMessage(redirectAttributes, "删除工作流附加类成功");
+		return "redirect:"+Global.getAdminPath()+"/workactivity/activity/?repage";
+	}
+	
+	/**
+	 * 导出excel文件
+	 */
+	@RequiresPermissions("workactivity:activity:export")
+    @RequestMapping(value = "export", method=RequestMethod.POST)
+    public String exportFile(Activity activity, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "工作流附加类"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            Page<Activity> page = activityService.findPage(new Page<Activity>(request, response, -1), activity);
+    		new ExportExcel("工作流附加类", Activity.class).setDataList(page.getList()).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导出工作流附加类记录失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workactivity/activity/?repage";
+    }
+
+	/**
+	 * 导入Excel数据
+
+	 */
+	@RequiresPermissions("workactivity:activity:import")
+    @RequestMapping(value = "import", method=RequestMethod.POST)
+    public String importFile(MultipartFile file, RedirectAttributes redirectAttributes) {
+		try {
+			int successNum = 0;
+			int failureNum = 0;
+			StringBuilder failureMsg = new StringBuilder();
+			ImportExcel ei = new ImportExcel(file, 1, 0);
+			List<Activity> list = ei.getDataList(Activity.class);
+			for (Activity activity : list){
+				try{
+					activityService.save(activity);
+					successNum++;
+				}catch(ConstraintViolationException ex){
+					failureNum++;
+				}catch (Exception ex) {
+					failureNum++;
+				}
+			}
+			if (failureNum>0){
+				failureMsg.insert(0, ",失败 "+failureNum+" 条工作流附加类记录。");
+			}
+			addMessage(redirectAttributes, "已成功导入 "+successNum+" 条工作流附加类记录"+failureMsg);
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入工作流附加类失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workactivity/activity/?repage";
+    }
+	
+	/**
+	 * 下载导入工作流附加类数据模板
+	 */
+	@RequiresPermissions("workactivity:activity:import")
+    @RequestMapping(value = "import/template")
+    public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "工作流附加类数据导入模板.xlsx";
+    		List<Activity> list = Lists.newArrayList(); 
+    		new ExportExcel("工作流附加类数据", Activity.class, 1).setDataList(list).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入模板下载失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workactivity/activity/?repage";
+    }
+	
+	
+	
+
+}

+ 25 - 0
src/main/java/com/jeeplus/modules/workactivitymenu/dao/WorkActivityMenuDao.java

@@ -0,0 +1,25 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workactivitymenu.dao;
+
+import com.jeeplus.common.persistence.TreeDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.workactivitymenu.entity.WorkActivityMenu;
+
+import java.util.List;
+
+/**
+ * 流程表DAO接口
+ * @author yangfan
+ * @version 2018-01-17
+ */
+@MyBatisDao
+public interface WorkActivityMenuDao extends TreeDao<WorkActivityMenu> {
+
+    List<WorkActivityMenu> findByList(WorkActivityMenu workActivityMenu);
+
+    List<WorkActivityMenu> findTreeData(WorkActivityMenu workActivityMenu);
+
+    List<WorkActivityMenu> findByParentAndOffice(WorkActivityMenu workActivityMenu);
+}

+ 136 - 0
src/main/java/com/jeeplus/modules/workactivitymenu/entity/WorkActivityMenu.java

@@ -0,0 +1,136 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workactivitymenu.entity;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.jeeplus.common.persistence.TreeEntity;
+import com.jeeplus.modules.sys.entity.Role;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.workactivity.entity.Activity;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 流程表Entity
+ * @author yangfan
+ * @version 2018-01-17
+ */
+public class WorkActivityMenu extends TreeEntity<WorkActivityMenu> {
+
+	private static final long serialVersionUID = 1L;
+	private String processKey;		// 流程数
+	private String companyId;		// 公司Id
+	private String officeId;
+	private String officeName;
+	private String functionalName;
+	private String branchCompanyId;
+	private String isExt;
+	private String view;
+	private String processType;
+	private List<Activity> activities = new ArrayList<>();
+
+	public WorkActivityMenu(){
+		super();
+	}
+
+	public WorkActivityMenu(String id){
+		super(id);
+	}
+
+
+	public WorkActivityMenu getParent() {
+		return parent;
+	}
+
+	public void setParent(WorkActivityMenu parent) {
+		this.parent = parent;
+	}
+
+	public String getProcessKey() {
+		return processKey;
+	}
+
+	public void setProcessKey(String processKey) {
+		this.processKey = processKey;
+	}
+
+	@Override
+	public String toString() {
+		return name;
+	}
+
+	public String getCompanyId() {
+		return companyId;
+	}
+
+	public void setCompanyId(String companyId) {
+		this.companyId = companyId;
+	}
+
+
+	public String getFunctionalName() {
+		return functionalName;
+	}
+
+	public void setFunctionalName(String functionalName) {
+		this.functionalName = functionalName;
+	}
+
+	public String getBranchCompanyId() {
+		return branchCompanyId;
+	}
+
+	public void setBranchCompanyId(String branchCompanyId) {
+		this.branchCompanyId = branchCompanyId;
+	}
+
+	public String getIsExt() {
+		return isExt;
+	}
+
+	public void setIsExt(String isExt) {
+		this.isExt = isExt;
+	}
+
+	public String getView() {
+		return view;
+	}
+
+	public void setView(String view) {
+		this.view = view;
+	}
+
+	public List<Activity> getActivities() {
+		return activities;
+	}
+
+	public void setActivities(List<Activity> activities) {
+		this.activities = activities;
+	}
+
+	public String getOfficeId() {
+		return officeId;
+	}
+
+	public void setOfficeId(String officeId) {
+		this.officeId = officeId;
+	}
+
+	public String getOfficeName() {
+		return officeName;
+	}
+
+	public void setOfficeName(String officeName) {
+		this.officeName = officeName;
+	}
+
+	public String getProcessType() {
+		return processType;
+	}
+
+	public void setProcessType(String processType) {
+		this.processType = processType;
+	}
+}

+ 244 - 0
src/main/java/com/jeeplus/modules/workactivitymenu/service/WorkActivityMenuService.java

@@ -0,0 +1,244 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workactivitymenu.service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.jeeplus.common.utils.DateUtils;
+import com.jeeplus.modules.act.service.ActivityXmlService;
+import com.jeeplus.modules.sys.dao.RoleDao;
+import com.jeeplus.modules.sys.dao.SysRoleActivityDao;
+import com.jeeplus.modules.sys.entity.Office;
+import com.jeeplus.modules.sys.entity.Role;
+import com.jeeplus.modules.sys.entity.SysRoleActivity;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.workactivity.entity.Activity;
+import com.jeeplus.modules.workactivity.service.ActivityService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.jeeplus.common.service.TreeService;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.modules.workactivitymenu.entity.WorkActivityMenu;
+import com.jeeplus.modules.workactivitymenu.dao.WorkActivityMenuDao;
+
+/**
+ * 流程表Service
+ * @author yangfan
+ * @version 2018-01-17
+ */
+@Service
+@Transactional(readOnly = true)
+public class WorkActivityMenuService extends TreeService<WorkActivityMenuDao, WorkActivityMenu> {
+
+	@Autowired
+	private SysRoleActivityDao roleActivityDao;
+	@Autowired
+	private ActivityService activityService;
+	@Autowired
+	private ActivityXmlService activityXmlService;
+
+	public WorkActivityMenu get(String id) {
+		WorkActivityMenu workActivityMenu = super.get(id);
+		List<Activity> list = activityService.findByActivityMenuId(id);
+		for (Activity activity:list){
+			if (activity.getUser()!=null && StringUtils.isNotBlank(activity.getUser().getId())){
+				User user;
+				if (activity.getUser().getId().equals("1")){
+					user = UserUtils.getUser();
+				}else {
+					user = UserUtils.get(activity.getUser().getId());
+				}
+
+				activity.setUser(user);
+			}
+			if( activity.getRole()!=null && StringUtils.isNotBlank(activity.getRole().getEnname())){
+				SysRoleActivity role = this.getByEnname(activity.getRole(),workActivityMenu.getCompanyId(),workActivityMenu.getBranchCompanyId());
+				activity.setRole(role);
+			}
+		}
+		workActivityMenu.setActivities(list);
+
+		return workActivityMenu;
+	}
+	
+	public List<WorkActivityMenu> findList(WorkActivityMenu workActivityMenu) {
+		if (StringUtils.isNotBlank(workActivityMenu.getParentIds())){
+			workActivityMenu.setParentIds(","+workActivityMenu.getParentIds()+",");
+		}
+		return super.findList(workActivityMenu);
+	}
+	public List<WorkActivityMenu> findTreeData(WorkActivityMenu workActivityMenu) {
+		if (StringUtils.isNotBlank(workActivityMenu.getParentIds())){
+			workActivityMenu.setParentIds(","+workActivityMenu.getParentIds()+",");
+		}
+		return dao.findTreeData(workActivityMenu);
+	}
+	public List<WorkActivityMenu> findByList(WorkActivityMenu workActivityMenu) {
+		return dao.findByList(workActivityMenu);
+	}
+
+	public WorkActivityMenu findByParentAndOffice(String parentId,Office office) {
+		try {
+			WorkActivityMenu activityMenu = new WorkActivityMenu();
+			activityMenu.setParent(new WorkActivityMenu(parentId));
+			activityMenu.setOfficeId(office.getId());
+			List<WorkActivityMenu> list = dao.findByParentAndOffice(activityMenu);
+			if (list!=null && list.size()!=0){
+				activityMenu = list.get(0);
+			}else {
+				String[] parents = office.getParentIds().split(",");
+				for (int i =parents.length-1 ; i > 0 ; i--){
+					String parentsId = parents[i];
+					activityMenu.setOfficeId(parentsId);
+					List<WorkActivityMenu> lists  = dao.findByParentAndOffice(activityMenu);
+					if (lists!=null && lists.size()!=0){
+						activityMenu = lists.get(0);
+						break;
+					}
+				}
+			}
+			if (activityMenu!=null && StringUtils.isNotBlank(activityMenu.getId())) {
+				activityMenu = get(activityMenu.getId());
+				return activityMenu;
+			}else{
+				return new WorkActivityMenu();
+			}
+		}catch (Exception e){
+			return new WorkActivityMenu();
+		}
+	}
+
+	public List<WorkActivityMenu> findByParent(String parentId,Office office) {
+		try {
+			WorkActivityMenu activityMenu = new WorkActivityMenu();
+			activityMenu.setParent(new WorkActivityMenu(parentId));
+			activityMenu.setOfficeId(office.getId());
+			List<WorkActivityMenu> list =new ArrayList<WorkActivityMenu>();
+			list.addAll(dao.findByParentAndOffice(activityMenu));
+			String[] parents = office.getParentIds().split(",");
+			for (int i =parents.length-1 ; i > 0 ; i--){
+				String parentsId = parents[i];
+				activityMenu.setOfficeId(parentsId);
+				list.addAll(dao.findByParentAndOffice(activityMenu));
+			}
+			return list;
+		}catch (Exception e){
+			return new ArrayList<>();
+		}
+	}
+
+	@Transactional(readOnly = false)
+	public void save(WorkActivityMenu workActivityMenu) {
+		try {
+			if (StringUtils.isBlank(workActivityMenu.getId())){
+				List<WorkActivityMenu> workActivityMenus = dao.findByParentAndOffice(workActivityMenu);
+				if (workActivityMenus!=null && workActivityMenus.size()!=0){
+					workActivityMenu.setId(workActivityMenus.get(0).getId());
+				}
+			}
+
+			if (workActivityMenu.getActivities()!=null && workActivityMenu.getActivities().size()!=0 && StringUtils.isNotBlank(workActivityMenu.getProcessKey())) {
+				//List<Activity> activityList= activityService.findByActivityMenuId(workActivityMenu.getId());
+				//List<Activity> activities = workActivityMenu.getActivities();
+				List<Activity> list = new ArrayList<Activity>();
+				boolean b = false;
+				//String processId = "process_"+System.currentTimeMillis();
+				/*if (activityList.size() == 0 || activityList.size() != Integer.parseInt(workActivityMenu.getProcessKey())){
+					b = true;
+				}else if (activityList.size() == Integer.parseInt(workActivityMenu.getProcessKey())){
+					for (int i=0 ; i<Integer.parseInt(workActivityMenu.getProcessKey()); i++){
+						Activity oldActivity = activityList.get(i);
+						Activity activity = activities.get(i);
+						if (!oldActivity.getReturnBack().equals(activity.getReturnBack())){
+							b = true;
+							break;
+						}
+						if (oldActivity.getRole()!=null && StringUtils.isNotBlank(oldActivity.getRole().getEnname())){
+							if (activity.getRole()==null || StringUtils.isBlank(activity.getRole().getEnname())){
+								b = true;
+								break;
+							}
+						}else {
+							if (activity.getRole()!=null && StringUtils.isNotBlank(activity.getRole().getEnname())){
+								b = true;
+								break;
+							}
+						}
+						if (oldActivity.getUser()!=null && StringUtils.isNotBlank(oldActivity.getUser().getId())){
+							if (activity.getUser()==null || StringUtils.isBlank(activity.getUser().getId())){
+								b = true;
+								break;
+							}
+						}else {
+							if (activity.getUser()!=null && StringUtils.isNotBlank(activity.getUser().getId())){
+								b = true;
+								break;
+							}
+						}
+					}
+				}*/
+				if (!b){
+					activityService.deleteToDelflag(workActivityMenu.getId());
+					//workActivityMenu.setProcessType(processId);
+					super.save(workActivityMenu);
+					for (int i = 0 ;i<Integer.parseInt(workActivityMenu.getProcessKey()) ;i++) {
+						Activity activity = workActivityMenu.getActivities().get(i);
+						activity.setCount(i+1);
+						activity.setActivityMenuId(workActivityMenu.getId());
+						activity.setIsApproval("0");
+						activity.setProcessKey(workActivityMenu.getProcessType());
+						activity.setId("");
+						list.add(activity);
+						activityService.save(activity);
+					}
+					//activityXmlService.createActivityXml(processId,workActivityMenu.getName()+System.currentTimeMillis(),list);
+				}else {
+					super.save(workActivityMenu);
+				}
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+	
+	@Transactional(readOnly = false)
+	public void delete(WorkActivityMenu workActivityMenu) {
+		activityService.deleteToDelflag(workActivityMenu.getId());
+		super.delete(workActivityMenu);
+	}
+
+	public SysRoleActivity getByEnname(SysRoleActivity selectRole, String companyId, String branchCompanyId){
+		try {
+			String enname = selectRole.getEnname();
+			if (StringUtils.isNotBlank(branchCompanyId) && StringUtils.isNotBlank(companyId) && companyId.equals("0") && branchCompanyId.equals("0")) {
+				String buffer = UserUtils.getRoleActivity(UserUtils.getSelectCompany().getId());
+				buffer += enname;
+				selectRole.setEnname(buffer);
+			}
+			SysRoleActivity returnRole = roleActivityDao.getByEnname(enname);
+			return returnRole;
+		}catch (Exception e){
+			return new SysRoleActivity();
+		}
+
+	}
+
+	public void sortStringArray(String[] arrStr) {
+		String temp;
+		for (int i = 0; i < arrStr.length; i++) {
+			for (int j = arrStr.length - 1; j > i; j--) {
+				if (arrStr[i].length() > arrStr[j].length()) {
+					temp = arrStr[i];
+					arrStr[i] = arrStr[j];
+					arrStr[j] = temp;
+				}
+			}
+		}
+	}
+
+}

+ 268 - 0
src/main/java/com/jeeplus/modules/workactivitymenu/web/WorkActivityMenuController.java

@@ -0,0 +1,268 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workactivitymenu.web;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.jeeplus.modules.sys.entity.Menu;
+import com.jeeplus.modules.sys.entity.Office;
+import com.jeeplus.modules.sys.entity.Role;
+import com.jeeplus.modules.sys.service.OfficeService;
+import com.jeeplus.modules.sys.service.SystemService;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.workactivity.entity.Activity;
+import org.apache.shiro.authz.annotation.Logical;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.jeeplus.common.utils.MyBeanUtils;
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.modules.workactivitymenu.entity.WorkActivityMenu;
+import com.jeeplus.modules.workactivitymenu.service.WorkActivityMenuService;
+
+/**
+ * 流程表Controller
+ * @author yangfan
+ * @version 2018-01-17
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/workactivitymenu/workActivityMenu")
+public class WorkActivityMenuController extends BaseController {
+
+	@Autowired
+	private WorkActivityMenuService workActivityMenuService;
+	@Autowired
+	private OfficeService officeService;
+	@Autowired
+	private SystemService systemService;
+	
+	@ModelAttribute
+	public WorkActivityMenu get(@RequestParam(required=false) String id) {
+		WorkActivityMenu entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = workActivityMenuService.get(id);
+		}
+		if (entity == null){
+			entity = new WorkActivityMenu();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 流程表列表页面
+	 */
+	@RequiresPermissions("workactivitymenu:workActivityMenu:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(WorkActivityMenu workActivityMenu, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Office company = UserUtils.getSelectCompany();
+		List<Office> offices = new ArrayList<>();
+		List<Office> officeList = officeService.findByType(company);
+		offices.addAll(officeList);
+		model.addAttribute("list", offices);
+		return "modules/workactivitymenu/officeList";
+	}
+
+	/**
+	 * 流程表列表页面
+	 */
+	@RequestMapping(value = "workActivityMenuList")
+	public String workActivityMenuList(WorkActivityMenu workActivityMenu, HttpServletRequest request, HttpServletResponse response, Model model) {
+		model.addAttribute("officeId", workActivityMenu.getOfficeId());
+		if (StringUtils.isNotBlank(workActivityMenu.getOfficeId()) && !workActivityMenu.getOfficeId().equals("001")){
+			Office office = officeService.get(workActivityMenu.getOfficeId());
+			if (office.getType().equals("2")){
+				workActivityMenu.setOfficeId(office.getId());
+			}else if(office.getType().equals("3")){
+				workActivityMenu.setOfficeId("");
+				workActivityMenu.setBranchCompanyId(office.getId());
+			}else {
+				workActivityMenu.setOfficeId("");
+				workActivityMenu.setCompanyId(office.getId());
+			}
+		}else {
+			workActivityMenu.setOfficeId("");
+			if(!UserUtils.getUser().isAdmin()){
+				workActivityMenu.setCompanyId(UserUtils.getSelectCompany().getId());
+			}
+		}
+		logger.info(workActivityMenu.getOfficeId()+"");
+		List<WorkActivityMenu> list = workActivityMenuService.findList(workActivityMenu);
+		model.addAttribute("list", list);
+		return "modules/workactivitymenu/workActivityMenuList";
+	}
+
+	/**
+	 * 查看,增加,编辑流程表表单页面
+	 */
+	@RequiresPermissions(value={"workactivitymenu:workActivityMenu:view","workactivitymenu:workActivityMenu:add","workactivitymenu:workActivityMenu:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(WorkActivityMenu workActivityMenu, Model model, RedirectAttributes redirectAttributes) {
+		getSort(workActivityMenu);
+		if (StringUtils.isNotBlank(workActivityMenu.getOfficeId()) && !"0".equals(workActivityMenu.getOfficeId())){
+			if (StringUtils.isNotBlank(workActivityMenu.getOfficeId()) && !workActivityMenu.getOfficeId().equals("001")){
+				Office office = officeService.get(workActivityMenu.getOfficeId());
+				workActivityMenu.setOfficeName(office.getName());
+			}
+		}
+		if (StringUtils.isNotBlank(workActivityMenu.getView()) && workActivityMenu.getView().equals("copy")){
+			return "modules/workactivitymenu/workActivityMenuCopy";
+		}
+		if (UserUtils.getUser().isAdmin()){
+			model.addAttribute("allRoles", systemService.findAllRoleByCompany());
+		}else {
+			String companyId = UserUtils.getSelectCompany().getId();
+			Role roles = new Role();
+			roles.setCompany(new Office(companyId));
+			List<Role> roleList = UserUtils.getRoleListByCompany(roles);
+			model.addAttribute("allRoles", roleList);
+		}
+		model.addAttribute("workActivityMenu", workActivityMenu);
+		model.addAttribute("companyid", UserUtils.getSelectCompany().getId());
+		if (StringUtils.isNotBlank(workActivityMenu.getView()) && workActivityMenu.getView().equals("view")){
+			return "modules/workactivitymenu/workActivityMenuView";
+		}
+		return "modules/workactivitymenu/workActivityMenuForm";
+	}
+
+	/**
+	 * 保存流程表
+	 */
+	@RequiresPermissions(value={"workactivitymenu:workActivityMenu:add","workactivitymenu:workActivityMenu:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	public String save(WorkActivityMenu workActivityMenu, Model model, RedirectAttributes redirectAttributes) throws Exception{
+		if (!beanValidator(model, workActivityMenu)){
+			return form(workActivityMenu, model,redirectAttributes);
+		}
+		getSort(workActivityMenu);
+		if(!workActivityMenu.getIsNewRecord()){//编辑表单保存
+			WorkActivityMenu t = workActivityMenuService.get(workActivityMenu.getId());//从数据库取出记录的值
+			MyBeanUtils.copyBeanNotNull2Bean(workActivityMenu, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+			workActivityMenuService.save(t);//保存
+		}else{//新增表单保存
+			Office office = officeService.get(workActivityMenu.getOfficeId());
+			String[] parentIds = office.getParentIds().split(",");
+			String parent = "";
+			String officeIds = "";
+			for (String parentId:parentIds){
+				if (!parentId.equals("0")) {
+					Office o = officeService.get(parentId);
+					if (o.getType().equals("3")) {
+						parent += o.getId() + ",";
+					}else if(o.getType().equals("1")){
+						officeIds += o.getId() + ",";
+					}
+				}
+			}
+			if (office.getType().equals("1")){
+				officeIds+= office.getId() + ",";
+			}
+			if (StringUtils.isNotBlank(parent)){
+				parent = parent.substring(0,parent.length()-1);
+			}
+			if (StringUtils.isNotBlank(officeIds)){
+				officeIds = officeIds.substring(0,officeIds.length()-1);
+			}
+			workActivityMenu.setBranchCompanyId(parent);
+			workActivityMenu.setCompanyId(officeIds);
+			workActivityMenuService.save(workActivityMenu);//保存
+		}
+		addMessage(redirectAttributes, "保存流程表成功");
+		return "redirect:"+Global.getAdminPath()+"/workactivitymenu/workActivityMenu/workActivityMenuList?repage";
+	}
+
+	public WorkActivityMenu getSort(WorkActivityMenu workActivityMenu){
+		if (workActivityMenu.getParent()!=null && StringUtils.isNotBlank(workActivityMenu.getParent().getId()) && workActivityMenu.getSort()==30){
+			workActivityMenu.setParent(workActivityMenuService.get(workActivityMenu.getParent().getId()));
+			// 获取排序号,最末节点排序号+30
+			if (StringUtils.isBlank(workActivityMenu.getId())){
+				WorkActivityMenu workActivityMenuChild = new WorkActivityMenu();
+				workActivityMenuChild.setParent(new WorkActivityMenu(workActivityMenu.getParent().getId()));
+				workActivityMenuChild.setOfficeId(workActivityMenu.getOfficeId());
+				List<WorkActivityMenu> list = workActivityMenuService.findByList(workActivityMenu);
+				if (list.size() > 0){
+					workActivityMenu.setSort(list.get(list.size()-1).getSort());
+					if (workActivityMenu.getSort() != null){
+						workActivityMenu.setSort(workActivityMenu.getSort() + 1);
+					}
+				}
+			}
+		}
+		return workActivityMenu;
+	}
+
+	/**
+	 * 保存流程表
+	 */
+	@RequestMapping(value = "copy")
+	public String copy(@RequestParam(value="id", required=false) String id, @RequestParam(value="officeId", required=false) String officeId,Model model, RedirectAttributes redirectAttributes) throws Exception{
+		logger.info(officeId+","+id);
+		WorkActivityMenu workActivityMenu = workActivityMenuService.get(id);
+		Office office = new Office(officeId);
+		WorkActivityMenu oldMenu = workActivityMenuService.findByParentAndOffice(workActivityMenu.getParentId(),office);
+		if (oldMenu!=null && oldMenu.getOfficeId()!=null && oldMenu.getOfficeId().equals(officeId)){
+			workActivityMenu.setId(oldMenu.getId());
+		}else {
+			workActivityMenu.setId("");
+			workActivityMenu.setSort(30);
+		}
+		workActivityMenu.setOfficeId(officeId);
+		getSort(workActivityMenu);
+		workActivityMenuService.save(workActivityMenu);
+		addMessage(redirectAttributes, "同步流程数据成功");
+		return "redirect:"+Global.getAdminPath()+"/workactivitymenu/workActivityMenu/workActivityMenuList?repage";
+	}
+
+	/**
+	 * 删除流程表
+	 */
+	@RequiresPermissions("workactivitymenu:workActivityMenu:del")
+	@RequestMapping(value = "delete")
+	public String delete(WorkActivityMenu workActivityMenu, RedirectAttributes redirectAttributes) {
+		workActivityMenuService.delete(workActivityMenu);
+		addMessage(redirectAttributes, "删除流程表成功");
+		return "redirect:"+Global.getAdminPath()+"/workactivitymenu/workActivityMenu/workActivityMenuList?repage";
+	}
+
+	@RequiresPermissions("user")
+	@ResponseBody
+	@RequestMapping(value = "treeData")
+	public List<Map<String, Object>> treeData(@RequestParam(required=false) String extId,HttpServletResponse response) {
+		List<Map<String, Object>> mapList = Lists.newArrayList();
+		WorkActivityMenu workActivityMenu = new WorkActivityMenu();
+		workActivityMenu.setOfficeId("0");
+		List<WorkActivityMenu> list = workActivityMenuService.findTreeData(workActivityMenu);
+		for (int i=0; i<list.size(); i++){
+			WorkActivityMenu e = list.get(i);
+			if (StringUtils.isBlank(extId) || (extId!=null && !extId.equals(e.getId()) && e.getParentIds().indexOf(","+extId+",")==-1)){
+				Map<String, Object> map = Maps.newHashMap();
+				map.put("id", e.getId());
+				map.put("pId", e.getParentId());
+				map.put("name", e.getName());
+				if (e.getParentIds() != null && "0,".equals(e.getParentIds())){
+					map.put("isParent", true);
+				}
+				mapList.add(map);
+			}
+		}
+		return mapList;
+	}
+	
+}

+ 22 - 0
src/main/java/com/jeeplus/modules/workadministrativeatamp/dao/WorkAdministrativeAtampDao.java

@@ -0,0 +1,22 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workadministrativeatamp.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.workadministrativeatamp.entity.WorkAdministrativeAtamp;
+
+/**
+ * 行政盖章DAO接口
+ * @author ssrh
+ * @version 2018-07-10
+ */
+@MyBatisDao
+public interface WorkAdministrativeAtampDao extends CrudDao<WorkAdministrativeAtamp> {
+
+
+    void updateProcessIdAndStatus(WorkAdministrativeAtamp workAdministrativeAtamp);
+
+    int queryCount(WorkAdministrativeAtamp workAdministrativeAtamp);
+}

+ 176 - 0
src/main/java/com/jeeplus/modules/workadministrativeatamp/entity/WorkAdministrativeAtamp.java

@@ -0,0 +1,176 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workadministrativeatamp.entity;
+
+import com.google.common.collect.Lists;
+import com.jeeplus.common.persistence.ActEntity;
+import com.jeeplus.modules.sys.entity.Office;
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.workclientinfo.entity.WorkClientAttachment;
+
+/**
+ * 行政盖章Entity
+ * @author ssrh
+ * @version 2018-07-10
+ */
+public class WorkAdministrativeAtamp extends ActEntity<WorkAdministrativeAtamp> {
+	
+	private static final long serialVersionUID = 1L;
+    public static final String ATTACHMENT_TYPE = "102";
+    public static final String SERIAL_BIZCODE = "12";
+    private Office office;		// 部门ID
+	private Office company;		// 公司ID
+	private String docType;		// 文档类型
+	private String num;		// 申请编号
+	private Office comSign;		// 签章公司
+	private User submiter;		// 申请人
+	private Date submitDate;		// 申请日期
+	private String sealType;		// 印章类型
+	private Integer state;		// 审批状态
+	private String processInstanceId;		// 流程ID
+    private List<WorkClientAttachment> workAttachments = Lists.newArrayList();
+    private Date beginDate;
+    private Date endDate;
+    private String home;
+	
+	public WorkAdministrativeAtamp() {
+		super();
+	}
+
+	public WorkAdministrativeAtamp(String id){
+		super(id);
+	}
+
+	@ExcelField(title="部门ID", align=2, sort=7)
+	public Office getOffice() {
+		return office;
+	}
+
+	public void setOffice(Office office) {
+		this.office = office;
+	}
+	
+	@ExcelField(title="公司ID", align=2, sort=8)
+	public Office getCompany() {
+		return company;
+	}
+
+	public void setCompany(Office company) {
+		this.company = company;
+	}
+	
+	@ExcelField(title="文档类型", dictType="", align=2, sort=9)
+	public String getDocType() {
+		return docType;
+	}
+
+	public void setDocType(String docType) {
+		this.docType = docType;
+	}
+	
+	@ExcelField(title="申请编号", align=2, sort=10)
+	public String getNum() {
+		return num;
+	}
+
+	public void setNum(String num) {
+		this.num = num;
+	}
+	
+	@NotNull(message="签章公司不能为空")
+	@ExcelField(title="签章公司", fieldType=Office.class, value="", align=2, sort=11)
+	public Office getComSign() {
+		return comSign;
+	}
+
+	public void setComSign(Office comSign) {
+		this.comSign = comSign;
+	}
+
+    public User getSubmiter() {
+        return submiter;
+    }
+
+    public void setSubmiter(User submiter) {
+        this.submiter = submiter;
+    }
+
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@NotNull(message="申请日期不能为空")
+	@ExcelField(title="申请日期", align=2, sort=13)
+	public Date getSubmitDate() {
+		return submitDate;
+	}
+
+	public void setSubmitDate(Date submitDate) {
+		this.submitDate = submitDate;
+	}
+	
+	@ExcelField(title="印章类型", dictType="", align=2, sort=14)
+	public String getSealType() {
+		return sealType;
+	}
+
+	public void setSealType(String sealType) {
+		this.sealType = sealType;
+	}
+	
+	@ExcelField(title="审批状态", align=2, sort=15)
+	public Integer getState() {
+		return state;
+	}
+
+	public void setState(Integer state) {
+		this.state = state;
+	}
+	
+	@ExcelField(title="流程ID", align=2, sort=16)
+	public String getProcessInstanceId() {
+		return processInstanceId;
+	}
+
+	public void setProcessInstanceId(String processInstanceId) {
+		this.processInstanceId = processInstanceId;
+	}
+
+    public List<WorkClientAttachment> getWorkAttachments() {
+        return workAttachments;
+    }
+
+    public void setWorkAttachments(List<WorkClientAttachment> workAttachments) {
+        this.workAttachments = workAttachments;
+    }
+
+    public Date getBeginDate() {
+        return beginDate;
+    }
+
+    public void setBeginDate(Date beginDate) {
+        this.beginDate = beginDate;
+    }
+
+    public Date getEndDate() {
+        return endDate;
+    }
+
+    public void setEndDate(Date endDate) {
+        this.endDate = endDate;
+    }
+
+    public String getHome() {
+        return home;
+    }
+
+    public void setHome(String home) {
+        this.home = home;
+    }
+}

+ 699 - 0
src/main/java/com/jeeplus/modules/workadministrativeatamp/service/WorkAdministrativeAtampService.java

@@ -0,0 +1,699 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workadministrativeatamp.service;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import com.google.common.collect.Maps;
+import com.jeeplus.common.utils.DateUtils;
+import com.jeeplus.common.utils.MenuStatusEnum;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.websocket.onchat.ChatServerPool;
+import com.jeeplus.modules.act.service.ActTaskService;
+import com.jeeplus.modules.isignature.service.ISignatureDocumentService;
+import com.jeeplus.modules.projectrecord.enums.ProjectStatusEnum;
+import com.jeeplus.modules.serialnum.service.SerialNumTplService;
+import com.jeeplus.modules.sys.dao.UserDao;
+import com.jeeplus.modules.sys.entity.Office;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.utils.DictUtils;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.workactivity.dao.WorkActivityProcessDao;
+import com.jeeplus.modules.workactivity.entity.Activity;
+import com.jeeplus.modules.workactivity.entity.WorkActivityProcess;
+import com.jeeplus.modules.workactivity.service.ActivityService;
+import com.jeeplus.modules.workactivity.service.WorkActivityProcessService;
+import com.jeeplus.modules.workactivitymenu.entity.WorkActivityMenu;
+import com.jeeplus.modules.workactivitymenu.service.WorkActivityMenuService;
+import com.jeeplus.modules.workclientinfo.dao.WorkClientAttachmentDao;
+import com.jeeplus.modules.workclientinfo.entity.WorkClientAttachment;
+import com.jeeplus.modules.workincomingmessage.entity.WorkIncomingMessage;
+import com.jeeplus.modules.workprojectnotify.entity.WorkProjectNotify;
+import com.jeeplus.modules.workprojectnotify.service.WorkProjectNotifyService;
+import com.jeeplus.modules.workprojectnotify.util.UtilNotify;
+import org.activiti.engine.ActivitiObjectNotFoundException;
+import org.activiti.engine.HistoryService;
+import org.activiti.engine.IdentityService;
+import org.activiti.engine.RuntimeService;
+import org.activiti.engine.runtime.ProcessInstance;
+import org.java_websocket.WebSocket;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.service.CrudService;
+import com.jeeplus.modules.workadministrativeatamp.entity.WorkAdministrativeAtamp;
+import com.jeeplus.modules.workadministrativeatamp.dao.WorkAdministrativeAtampDao;
+
+/**
+ * 行政盖章Service
+ * @author ssrh
+ * @version 2018-07-10
+ */
+@Service
+@Transactional(readOnly = true)
+public class WorkAdministrativeAtampService extends CrudService<WorkAdministrativeAtampDao, WorkAdministrativeAtamp> {
+    @Autowired
+    private WorkClientAttachmentDao workClientAttachmentDao;
+    @Autowired
+    private UserDao userDao;
+    @Autowired
+    private WorkProjectNotifyService workProjectNotifyService;
+    @Autowired
+    private IdentityService identityService;
+    @Autowired
+    private ActTaskService actTaskService;
+    @Autowired
+    private WorkActivityMenuService workActivityMenuService;
+    @Autowired
+    private RuntimeService runtimeService;
+    @Autowired
+    private WorkActivityProcessService workActivityProcessService;
+    @Autowired
+    private ActivityService activityService;
+    @Autowired
+    protected HistoryService historyService;
+    @Autowired
+    private WorkActivityProcessDao workActivityProcessDao;
+    @Autowired
+    private SerialNumTplService serialNumTplService;
+    @Autowired
+    private ISignatureDocumentService signatureDocumentService;
+
+	public WorkAdministrativeAtamp get(String id) {
+        WorkAdministrativeAtamp workAdministrativeAtamp = super.get(id);
+        if(workAdministrativeAtamp!=null&&StringUtils.isNotBlank(workAdministrativeAtamp.getId())){
+            WorkClientAttachment attchment = new WorkClientAttachment();
+            attchment.setAttachmentId(workAdministrativeAtamp.getId());
+            workAdministrativeAtamp.setWorkAttachments(workClientAttachmentDao.findList(attchment));
+        }
+        return workAdministrativeAtamp;
+    }
+	
+	public List<WorkAdministrativeAtamp> findList(WorkAdministrativeAtamp workAdministrativeAtamp) {
+        if(!UserUtils.getUser().isAdmin()) {
+            String dataScopeSql = dataScopeFilter(workAdministrativeAtamp.getCurrentUser(), "o", "u", "s", MenuStatusEnum.WORK_ADMINISTRATIVEATAMP.getValue());
+            workAdministrativeAtamp.getSqlMap().put("dsf", dataScopeSql);
+        }
+		return super.findList(workAdministrativeAtamp);
+	}
+	
+	public Page<WorkAdministrativeAtamp> findPage(Page<WorkAdministrativeAtamp> page, WorkAdministrativeAtamp workAdministrativeAtamp) {
+        if(!UserUtils.getUser().isAdmin()) {
+            String dataScopeSql = dataScopeFilter(workAdministrativeAtamp.getCurrentUser(), "o", "u", "s", MenuStatusEnum.WORK_ADMINISTRATIVEATAMP.getValue());
+            workAdministrativeAtamp.getSqlMap().put("dsf", dataScopeSql);
+        }
+        int count = dao.queryCount(workAdministrativeAtamp);
+        page.setCount(count);
+        page.setCountFlag(false);
+        workAdministrativeAtamp.setPage(page);
+        List<WorkAdministrativeAtamp> recordsList = dao.findList(workAdministrativeAtamp);
+        page.setList(recordsList);
+		return page;
+	}
+	
+	@Transactional(readOnly = false)
+	public void save(WorkAdministrativeAtamp workAdministrativeAtamp) {
+        long t1 = System.currentTimeMillis();
+        preSave(workAdministrativeAtamp);
+		super.save(workAdministrativeAtamp);
+		this.saveAttachments(workAdministrativeAtamp);
+		logger.info("保存行政签章耗时:{}ms",System.currentTimeMillis()-t1);
+	}
+
+    private void preSave(WorkAdministrativeAtamp workAdministrativeAtamp) {
+        if(workAdministrativeAtamp.getOffice()==null|| StringUtils.isBlank(workAdministrativeAtamp.getOffice().getId())){
+            workAdministrativeAtamp.setOffice(UserUtils.getSelectOffice());
+        }
+        if(workAdministrativeAtamp.getCompany()==null||StringUtils.isBlank(workAdministrativeAtamp.getCompany().getId())){
+            workAdministrativeAtamp.setCompany(UserUtils.getSelectCompany());
+        }
+        if (StringUtils.isBlank(workAdministrativeAtamp.getNum())){
+            String serialNum = serialNumTplService.genSerialNum(workAdministrativeAtamp.getComSign(), WorkAdministrativeAtamp.SERIAL_BIZCODE);
+            workAdministrativeAtamp.setNum(serialNum);
+        }
+    }
+
+    @Transactional(readOnly = false)
+	public void delete(WorkAdministrativeAtamp workAdministrativeAtamp) {
+		super.delete(workAdministrativeAtamp);
+        if(workAdministrativeAtamp.getWorkAttachments()!=null&&workAdministrativeAtamp.getWorkAttachments().size()>0){
+            for (WorkClientAttachment workClientAttachment : workAdministrativeAtamp.getWorkAttachments()) {
+                workClientAttachmentDao.delete(workClientAttachment);
+            }
+        }
+        WorkProjectNotify notify = new WorkProjectNotify();
+        notify.setNotifyId(workAdministrativeAtamp.getId());
+        List<User> users = workProjectNotifyService.readByNotifyId(notify);
+        if (users!=null && users.size()!=0){
+            for (User user:users){
+                UserUtils.pushMeIm(user.getId());
+            }
+        }
+	}
+
+
+    private void saveAttachments(WorkAdministrativeAtamp workAdministrativeAtamp) {
+        for (WorkClientAttachment workClientAttachment : workAdministrativeAtamp.getWorkAttachments()) {
+            if (workClientAttachment.getId() == null) {
+                continue;
+            }
+            if (WorkClientAttachment.DEL_FLAG_NORMAL.equals(workClientAttachment.getDelFlag())) {
+                workClientAttachment.setAttachmentId(workAdministrativeAtamp.getId());
+                workClientAttachment.setAttachmentFlag(WorkAdministrativeAtamp.ATTACHMENT_TYPE);
+                workClientAttachment.setAttachmentUser(UserUtils.getUser().getId());
+                if (StringUtils.isBlank(workClientAttachment.getId()) || "null".equals(workClientAttachment.getId())) {
+                    workClientAttachment.preInsert();
+                    workClientAttachmentDao.insert(workClientAttachment);
+                    signatureDocumentService.createIsignature(workClientAttachment.getUrl(),workClientAttachment.getAttachmentName(),workClientAttachment.getId(),workAdministrativeAtamp.getNum());
+                } else {
+                    workClientAttachment.preUpdate();
+                    workClientAttachmentDao.update(workClientAttachment);
+                }
+            } else {
+                workClientAttachmentDao.delete(workClientAttachment);
+            }
+        }
+    }
+
+    @Transactional(readOnly = false)
+    public String saveAtamp(WorkAdministrativeAtamp workAdministrativeAtamp) {
+	    save(workAdministrativeAtamp);
+        return this.startAudit(workAdministrativeAtamp,workAdministrativeAtamp.getProcessInstanceId());
+    }
+
+    /**
+     * 启动审批流程
+     */
+    private String startAudit(WorkAdministrativeAtamp workAdministrativeAtamp, String processInstanceId){
+        long t1 = System.currentTimeMillis();
+        Map<String, Object> variables = new HashMap<String, Object>();
+        identityService.setAuthenticatedUserId(workAdministrativeAtamp.getCurrentUser().getId());
+        String contentStr = "申请编号:"+workAdministrativeAtamp.getNum()+",文档类型:"+ DictUtils.getDictLabel(workAdministrativeAtamp.getDocType(),"sign_doc_type","")+",印章类型:"+DictUtils.getMainDictLabel(workAdministrativeAtamp.getSealType(),"seal_type","")+",申请日期:"+ DateUtils.formatDate(workAdministrativeAtamp.getCreateDate());
+        String titleStr = "签章公司:"+ workAdministrativeAtamp.getComSign().getName();
+
+        String businessKey = workAdministrativeAtamp.getId();
+        Office office = UserUtils.getSelectOffice();
+        WorkActivityMenu workActivityMenu = workActivityMenuService.findByParentAndOffice("ggh3125fwef194582bdda9abcew750904", office);
+        // 启动流程
+        String processType = workActivityMenu.getProcessType();
+        StringBuffer buffer = new StringBuffer();
+        Activity activity = new Activity();
+        WorkProjectNotify workProjectNotify = UtilNotify
+                .saveNotify(workAdministrativeAtamp.getId(),
+                        null,
+                        workAdministrativeAtamp.getCompany().getId(),
+                        titleStr,
+                        contentStr,
+                        "56",
+                        "0",
+                        "待审批",
+                        ""
+                );
+
+        List<User> users = new ArrayList<>();
+        List<User> bmzrList = UserUtils.getByRoleActivityEnname("bmzr",2,office.getId(),"11",workAdministrativeAtamp.getCreateBy());
+        List<User> fgldList = UserUtils.getByRoleActivityEnname("fgld",2,office.getId(),"11",workAdministrativeAtamp.getCreateBy());
+        List<User> gzrList = UserUtils.getByRoleActivityEnname("gzr",3,workAdministrativeAtamp.getComSign().getId(),"11",workAdministrativeAtamp.getCreateBy());
+        if (StringUtils.isNotBlank(workActivityMenu.getId())) {
+            workProjectNotify.setNotifyRole("");
+            workActivityMenu = workActivityMenuService.get(workActivityMenu.getId());
+            List<Activity> activities = workActivityMenu.getActivities();
+            for (Activity a : activities) {
+                String encount = a.getEncount();
+                String enlist = a.getEnlist();
+                if (a.getRole()!=null && StringUtils.isNotBlank(a.getRole().getEnname())){
+                    List enusers = UserUtils.getByRoleActivityEnnames(a.getRole().getEnname(),office.getId(),"11",workAdministrativeAtamp.getCreateBy());
+                    if (enusers.size()==0){
+                        workAdministrativeAtamp.setState(ProjectStatusEnum.TSTORE.getValue());
+                        this.updateStateById(workAdministrativeAtamp);
+                        return "流程审批人不能为空,角色"+a.getRole().getName()+"下无用户,请联系管理员!";
+                    }
+                    variables.put(enlist, enusers);
+                    variables.put(encount, enusers.size());
+                }
+                if (a.getDelFlag().equals("0") && a.getCount() == 1) {
+                    activity = a;
+                }
+            }
+            buffer.append(activity.getRole().getEnname());
+            if (activity != null && StringUtils.isNotBlank(activity.getId())) {
+                //角色审批
+                if (StringUtils.isNotBlank(activity.getRole().getEnname())) {
+                    users = UserUtils.getByRoleActivityEnnames(activity.getRole().getEnname(),office.getId(),"11",workAdministrativeAtamp.getCreateBy());
+                }
+                //人员审批
+                if (StringUtils.isNotBlank(activity.getUser().getId())) {
+                    users.add(activity.getUser());
+                }
+            }
+            workProjectNotify.setId("");
+        } else {
+            if (bmzrList.size()==0){
+                workAdministrativeAtamp.setState(ProjectStatusEnum.TSTORE.getValue());
+                this.updateStateById(workAdministrativeAtamp);
+                return "流程审批人不能为空,部门负责人下无用户,请联系管理员!";
+            }
+            processType = "administrativeAtamp";
+            users.addAll(bmzrList);
+        }
+        List<String> userIds = new ArrayList<>(users.size());
+        for (User u : users){
+            userIds.add(u.getId());
+            workProjectNotify.setUser(u);
+            workProjectNotify.setId("");
+            workProjectNotify.setNotifyRole("部门负责人审批");
+            workProjectNotifyService.save(workProjectNotify);
+            Map<String,Object> extras = new HashMap<>();
+            extras.put("type","7002");
+            extras.put("procDefKey","56");
+            extras.put("id",workProjectNotify.getId());
+            UserUtils.pushInfoToApp(titleStr, contentStr,extras,u.getId());
+        }
+        long t2 = System.currentTimeMillis();
+        UserUtils.pushIm(userIds,contentStr);
+        logger.info("行政签章推送消息耗时:{}ms",System.currentTimeMillis()-t2);
+
+        variables.put("busId", businessKey);
+        variables.put("type", processType);
+        variables.put("title", "审批单:" + workAdministrativeAtamp.getNum());//设置标题;
+
+        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processType, businessKey, variables);
+        //        workReceiptsSettle.setProcessInstance(processInstance);
+        if (org.apache.commons.lang3.StringUtils.isNotBlank(processInstanceId)) {
+            workActivityProcessService.updateProcessInstanceId(processInstance.getId(),processInstanceId);
+            workActivityProcessService.deleteProcessInstanceId(processInstanceId);
+            workActivityProcessService.deleteProcessIdAuditUsers(processInstanceId);
+        }
+        List<Activity> list = workActivityMenu.getActivities();
+        if (list != null && list.size() != 0) {
+            workActivityProcessService.saveList(list, processInstance.getId());
+        } else {
+            WorkActivityProcess workActivityProcess = new WorkActivityProcess();
+            workActivityProcess.setProcessKey(processType);
+            workActivityProcess.setCount(1);
+            workActivityProcess.setProcessInstanceId(processInstance.getId());
+            workActivityProcess.setIsApproval("0");
+            workActivityProcessService.save(workActivityProcess);
+            workActivityProcess.setCount(2);
+            workActivityProcess.setId("");
+            workActivityProcessService.save(workActivityProcess);
+            workActivityProcess.setCount(3);
+            workActivityProcess.setId("");
+            workActivityProcessService.save(workActivityProcess);
+            workActivityProcessService.insertAuditsByType(bmzrList,processInstance.getId(),1,1);
+            workActivityProcessService.insertAuditsByType(fgldList,processInstance.getId(),2,0);
+            workActivityProcessService.insertAuditsByType(gzrList,processInstance.getId(),3,0);
+        }
+        workAdministrativeAtamp.setProcessInstanceId(processInstance.getId());
+        workAdministrativeAtamp.setState(ProjectStatusEnum.IN_APRL.getValue());
+        dao.updateProcessIdAndStatus(workAdministrativeAtamp);
+        logger.info("启动行政签章审批流程耗时:{}ms",System.currentTimeMillis()-t1);
+        return "";
+    }
+
+    /**
+     * 审核流程
+     */
+    @Transactional(readOnly = false)
+    public String auditSave(WorkAdministrativeAtamp workAdministrativeAtamp,List<User> auditUsers) {
+        String str = "申请编号:"+workAdministrativeAtamp.getNum()+",文档类型:"+ DictUtils.getDictLabel(workAdministrativeAtamp.getDocType(),"sign_doc_type","")+",印章类型:"+DictUtils.getMainDictLabel(workAdministrativeAtamp.getSealType(),"seal_type","")+",申请日期:"+ DateUtils.formatDate(workAdministrativeAtamp.getCreateDate());
+        String title = "签章公司:"+ workAdministrativeAtamp.getComSign().getName();
+        // 对不同环节的业务逻辑进行操作
+        String taskDefKey = workAdministrativeAtamp.getAct().getTaskDefKey();
+        if (!"modifyApply".equals(taskDefKey) && !taskDefKey.contains("audit")) {
+            actTaskService.claim(workAdministrativeAtamp.getAct().getTaskId(), UserUtils.getUser().getId());
+        }else {
+            workAdministrativeAtamp.getAct().setFlag("yes");
+            this.saveAttachments(workAdministrativeAtamp);
+        }
+        String comment = "";
+        if (ProjectStatusEnum.REJECTED.getValue() == workAdministrativeAtamp.getState()){
+            comment = ("yes".equals(workAdministrativeAtamp.getAct().getFlag())?"[重新申请] ":"[已撤销] ");
+        }else {
+            comment = ("yes".equals(workAdministrativeAtamp.getAct().getFlag())?"[同意] ":"[驳回] ")+ workAdministrativeAtamp.getAct().getComment();
+        }
+        //yes 的时候状态为审核通过 否则为未通过
+        //1 审核中 2 未通过
+        workAdministrativeAtamp.setState(("yes".equals(workAdministrativeAtamp.getAct().getFlag()) ? ProjectStatusEnum.IN_APRL.getValue() : ProjectStatusEnum.REJECTED.getValue()));
+        Map<String, Object> vars = Maps.newHashMap();
+        //业务逻辑对应的条件表达式
+        String exp = "";
+        String taskCount = "";
+        String notifyRole = "";
+        int key = 0;
+        String enname = "";
+        List<Activity> activitieList = activityService.getByProcessInstanceId(workAdministrativeAtamp.getProcessInstanceId());
+        WorkActivityMenu workActivityMenu = new WorkActivityMenu();
+        if (activitieList != null && activitieList.size() != 0) {
+            workActivityMenu.setProcessType(activitieList.get(0).getProcessKey());
+            workActivityMenu.setActivities(activitieList);
+        }
+
+        WorkActivityProcess workActivityProcess = new WorkActivityProcess();
+        WorkActivityProcess selectProcess = new WorkActivityProcess();
+        selectProcess.setProcessInstanceId(workAdministrativeAtamp.getProcessInstanceId());
+        List<WorkActivityProcess> workActivityProcesses = workActivityProcessService.findList(selectProcess);
+        List<Activity> activities = workActivityMenu.getActivities();
+        if (StringUtils.isNotBlank(workActivityMenu.getProcessType()) && !workActivityMenu.getProcessType().equals("administrativeAtamp")) {
+            key = 1;
+            for (int i = 0; i < workActivityProcesses.size(); i++) {
+                WorkActivityProcess activityProcess = workActivityProcesses.get(i);
+                if (taskDefKey.equals(activityProcess.getActivityTask()) && !taskDefKey.equals("modifyApply")) {
+                    taskCount = activityProcess.getCount()+"";
+                    workActivityProcess = activityProcess;
+                    if (!workActivityProcess.getIsApproval().equals("0")) {
+                        workActivityProcess.setId("");
+                    }
+                    exp = "pass";
+                    if (!"yes".equals(workAdministrativeAtamp.getAct().getFlag())) {
+                        notifyRole = "调整盖章信息";
+                        workAdministrativeAtamp.setState(ProjectStatusEnum.REJECTED.getValue());
+                        workActivityProcess.setIsApproval("2");
+                        String returnBack = "-1";
+                        for (Activity activity : activities) {
+                            if (activity.getCount() == activityProcess.getCount()) {
+                                notifyRole = activity.getName();
+                                returnBack = activity.getReturnBack();
+                                break;
+                            }
+                        }
+                        if (returnBack.equals("0")) {
+                            workActivityProcess.setId("");
+                        }
+
+                    } else {
+                        workActivityProcess.setIsApproval("1");
+                    }
+                }else if(taskDefKey.equals("modifyApply")){
+                    taskCount = "0";
+                    exp = "pass";
+                    workActivityProcess.setId("");
+                    workActivityProcess.setCount(0);
+                    if (!"yes".equals(workAdministrativeAtamp.getAct().getFlag())) {
+                        workAdministrativeAtamp.setState(ProjectStatusEnum.RECALL.getValue());
+                        workActivityProcess.setIsApproval("2");
+                    } else {
+                        workActivityProcess.setIsApproval("1");
+                    }
+                    break;
+                }
+            }
+        } else {
+            workActivityMenu.setProcessType("administrativeAtamp");
+            for (int i = 0; i < workActivityProcesses.size(); i++) {
+                WorkActivityProcess activityProcess = workActivityProcesses.get(i);
+                String count = activityProcess.getCount() + "";
+                workActivityProcess = activityProcess;
+                if (!workActivityProcess.getIsApproval().equals("0")) {
+                    workActivityProcess.setId("");
+                }
+                // 审核环节
+                if ("bmzr".equals(taskDefKey) && count.contains("1")) {
+                    taskCount = "1";
+                    exp = "pass";
+                    if ("yes".equals(workAdministrativeAtamp.getAct().getFlag())) {
+                        workActivityProcessService.insertAuditsByType(auditUsers,workAdministrativeAtamp.getProcessInstanceId(),2,1);
+
+                        notifyRole = "业务分管领导审核";
+                        workActivityProcess.setIsApproval("1");
+                        enname = "fgld";
+                    } else {
+                        notifyRole = "调整申请";
+                        workActivityProcess.setIsApproval("2");
+                    }
+                    break;
+                } else if ("fgld".equals(taskDefKey) && count.contains("2")) {
+                    taskCount = "2";
+                    exp = "pass";
+                    if ("yes".equals(workAdministrativeAtamp.getAct().getFlag())) {
+                        workActivityProcessService.insertAuditsByType(auditUsers,workAdministrativeAtamp.getProcessInstanceId(),3,1);
+
+                        notifyRole = "签章人审批";
+                        workActivityProcess.setIsApproval("1");
+                        enname = "gzr";
+                    } else {
+                        notifyRole = "调整签章信息";
+                        workActivityProcess.setIsApproval("2");
+                    }
+                    break;
+                }else if ("gzr".equals(taskDefKey) && count.contains("3")) {
+                    taskCount = "3";
+                    exp = "pass";
+                    if ("yes".equals(workAdministrativeAtamp.getAct().getFlag())) {
+                        notifyRole = "审批通过";
+                        workActivityProcess.setIsApproval("1");
+                    } else {
+                        notifyRole = "调整签章信息";
+                        workActivityProcess.setIsApproval("2");
+                    }
+                    break;
+                } else if ("modifyApply".equals(taskDefKey)&& count.contains("0")) {
+                    notifyRole = "部门负责人审批";
+                    taskCount = "0";
+                    exp = "pass";
+                    workActivityProcess.setCount(0);
+                    enname = "bmzr";
+                    if (!"yes".equals(workAdministrativeAtamp.getAct().getFlag())) {
+                        workAdministrativeAtamp.setState(ProjectStatusEnum.RECALL.getValue());
+                    }
+                    break;
+                } else if ("apply_end".equals(taskDefKey)) {
+                }
+
+            }
+        }
+        // 设置意见
+        workAdministrativeAtamp.getAct().setComment(("yes".equals(workAdministrativeAtamp.getAct().getFlag()) ? "[同意] " : "[驳回] ") + workAdministrativeAtamp.getAct().getComment());
+        workAdministrativeAtamp.preUpdate();
+        // 提交流程任务
+        vars.put(exp, "yes".equals(workAdministrativeAtamp.getAct().getFlag()) ? true : false);
+        workActivityProcessService.updateProcess(workActivityProcess,workActivityMenu,key,taskCount, workAdministrativeAtamp.getProcessInstanceId(),taskDefKey,"modifyApply", workAdministrativeAtamp.getAct().getFlag(),comment, activities);
+        // 提交流程任务
+        actTaskService.complete(workAdministrativeAtamp.getAct().getTaskId(), workAdministrativeAtamp.getAct().getProcInsId(), workAdministrativeAtamp.getAct().getComment(), vars);
+        boolean state = actTaskService.isProcessEnd(workAdministrativeAtamp.getAct().getProcInsId());
+        List<User> users = new ArrayList<>();
+        List<User> userList = new ArrayList<>();
+        if (!state) {
+            users.add(workAdministrativeAtamp.getCreateBy());
+            if ("yes".equals(workAdministrativeAtamp.getAct().getFlag())) {
+                workAdministrativeAtamp.setState(ProjectStatusEnum.SIGNED.getValue());
+                WorkProjectNotify notify = new WorkProjectNotify();
+                notify.setNotifyId(workAdministrativeAtamp.getId());
+                userList = workProjectNotifyService.readByNotifyId(notify);
+                workProjectNotifyService
+                        .save(UtilNotify
+                                .saveNotify(workAdministrativeAtamp.getId(),
+                                        workAdministrativeAtamp.getCreateBy(),
+                                        workAdministrativeAtamp.getCompany().getId(),
+                                        title,
+                                        str,
+                                        "56",
+                                        "0",
+                                        "待通知",
+                                        notifyRole));
+
+            } else {
+                WorkProjectNotify notify = new WorkProjectNotify();
+                notify.setNotifyId(workAdministrativeAtamp.getId());
+                userList = workProjectNotifyService.readByNotifyId(notify);
+                if (ProjectStatusEnum.RECALL.getValue() != workAdministrativeAtamp.getState()){
+                    workAdministrativeAtamp.setState(ProjectStatusEnum.REJECTED.getValue());
+                    workProjectNotifyService
+                            .save(UtilNotify
+                                    .saveNotify(workAdministrativeAtamp.getId(),
+                                            workAdministrativeAtamp.getCreateBy(),
+                                            workAdministrativeAtamp.getCompany().getId(),
+                                            title,
+                                            str,
+                                            "56",
+                                            "0",
+                                            "待通知",
+                                            notifyRole));
+                }
+            }
+            workActivityProcessService.deleteProcessIdAuditUsers(workAdministrativeAtamp.getProcessInstanceId());
+        } else {
+            if (StringUtils.isNotBlank(workActivityMenu.getProcessType()) && !workActivityMenu.getProcessType().equals("administrativeAtamp")) {
+                WorkProjectNotify notify = new WorkProjectNotify();
+                notify.setNotifyId(workAdministrativeAtamp.getId());
+                userList = workProjectNotifyService.readByNotifyId(notify);
+                //users.addAll(userList);
+                WorkProjectNotify workProjectNotify = UtilNotify
+                        .saveNotify(workAdministrativeAtamp.getId(),
+                                new User(),
+                                workAdministrativeAtamp.getCompany().getId(),
+                                title,
+                                str,
+                                "56",
+                                "0",
+                                "待审批",
+                                notifyRole);
+                List<WorkProjectNotify> workProjectNotifys = activityService.getByFlagAndTaskDefKeyList(
+                        activities,
+                        workProjectNotify,
+                        taskDefKey,
+                        workAdministrativeAtamp.getAct().getFlag(),
+                        taskCount,
+                        workAdministrativeAtamp.getCreateBy(),
+                        workAdministrativeAtamp.getOffice().getId(),
+                        "56");
+                for (WorkProjectNotify workProjectNotify1:workProjectNotifys){
+                    users.add(workProjectNotify1.getUser());
+                    workProjectNotify1.setId("");
+                    workProjectNotify1.setIsNewRecord(false);
+                    workProjectNotifyService
+                            .save(workProjectNotify1);
+                }
+
+            } else {
+                if (!"yes".equals(workAdministrativeAtamp.getAct().getFlag())) {
+                    WorkProjectNotify notify = new WorkProjectNotify();
+                    notify.setNotifyId(workAdministrativeAtamp.getId());
+                    userList = workProjectNotifyService.readByNotifyId(notify);
+                    //users.addAll(userList);
+                    workProjectNotifyService
+                            .save(UtilNotify
+                                    .saveNotify(workAdministrativeAtamp.getId(),
+                                            workAdministrativeAtamp.getCreateBy(),
+                                            workAdministrativeAtamp.getCompany().getId(),
+                                            title,
+                                            str,
+                                            "56",
+                                            "0",
+                                            "重新申请",
+                                            notifyRole));
+                    users.add( workAdministrativeAtamp.getCreateBy());
+                } else {
+                    if (StringUtils.isNotBlank(enname)) {
+                        WorkProjectNotify notify = new WorkProjectNotify();
+                        notify.setNotifyId(workAdministrativeAtamp.getId());
+                        userList = workProjectNotifyService.readByNotifyId(notify);
+                        //users.addAll(userList1);
+                        WorkProjectNotify workProjectNotify = UtilNotify
+                                .saveNotify(workAdministrativeAtamp.getId(),
+                                        new User(),
+                                        workAdministrativeAtamp.getCompany().getId(),
+                                        title,
+                                        str,
+                                        "56",
+                                        "0",
+                                        "待审批",
+                                        notifyRole);
+                        users.addAll(auditUsers);
+                        for (User user1:auditUsers){
+                            workProjectNotify.setUser(user1);
+                            workProjectNotify.setId("");
+                            workProjectNotify.setIsNewRecord(false);
+                            workProjectNotifyService.save(workProjectNotify);
+                            Map<String,Object> extras = new HashMap<>();
+                            if(enname.contains("bmzr")||enname.contains("fgld")) {
+                                extras.put("type", "7002");
+                            }else {
+                                extras.put("type", "7001");
+                            }
+                            extras.put("procDefKey","56");
+                            extras.put("id",workProjectNotify.getId());
+                            UserUtils.pushInfoToApp(title, str,extras,user1.getId());
+                        }
+                    }else {
+                        WorkProjectNotify notify = new WorkProjectNotify();
+                        notify.setNotifyId(workAdministrativeAtamp.getId());
+                        userList = workProjectNotifyService.readByNotifyId(notify);
+                        users.add(workAdministrativeAtamp.getCreateBy());
+                        workProjectNotifyService
+                                .save(UtilNotify
+                                        .saveNotify(workAdministrativeAtamp.getId(),
+                                                workAdministrativeAtamp.getCreateBy(),
+                                                workAdministrativeAtamp.getCompany().getId(),
+                                                title,
+                                                str,
+                                                "56",
+                                                "0",
+                                                "重新申请",
+                                                notifyRole));
+                    }
+                }
+            }
+        }
+        if (StringUtils.isNotBlank(title) && users!=null && users.size()!=0) {
+            for (User u : users) {
+                UserUtils.pushIm(u.getId(),title);
+            }
+        }
+        if (StringUtils.isNotBlank(title) && userList!=null && userList.size()!=0) {
+            for (User u : userList) {
+                UserUtils.pushMeIm(u.getId());
+            }
+        }
+        dao.update(workAdministrativeAtamp);
+        return "保存审核意见成功!";
+    }
+
+    @Transactional(readOnly = false)
+    public void cancelProcess(WorkAdministrativeAtamp workAdministrativeAtamp) throws Exception {
+        WorkActivityProcess process = new WorkActivityProcess();
+        process.setProcessInstanceId(workAdministrativeAtamp.getProcessInstanceId());
+        process.setIsApproval("0");
+        //List<WorkActivityProcess> processList1 = workActivityProcessService.findByProcInsId(process);
+        WorkActivityProcess workActivityProcess = new WorkActivityProcess();
+        workActivityProcess.setProcessInstanceId(workAdministrativeAtamp.getProcessInstanceId());
+        List<WorkActivityProcess> processList = workActivityProcessService.findList(workActivityProcess);
+        WorkProjectNotify notify = new WorkProjectNotify();
+        notify.setNotifyId(workAdministrativeAtamp.getId());
+        List<User> userList = workProjectNotifyService.readByNotifyId(notify);
+        if (userList!=null && userList.size()!=0) {
+            for (User u : userList) {
+                User user = UserUtils.get(u.getId());
+                /*List<WebSocket> toUserConns = ChatServerPool.getWebSocketByUser(u.getId());
+                for (WebSocket toUserConn : toUserConns) {
+                    String message = "{\"to\":\""+u.getId()+"\"," +
+                            "\"msg\":\"审批信息 申请人:"+ user.getName()+",盖章审批编号:"+workAdministrativeAtamp.getNum() +" 强制撤销!\"," +
+                            "\"useType\":\"sys\"}";
+                    ChatServerPool.sendMessageToUser(toUserConn, message);//同时向本人发送消息
+                    //ChatServerPool.sendMessageToUser(toUserConn, u.getId() + "_sys_审批信息 " + "报销人:" + user.getName() + ",报销编号:" + workReimbursement.getNumber() + " 强制撤销!");//同时向本人发送消息
+                }*/
+                UserUtils.pushIm(u.getId(),"申请人 "+user.getName() +",盖章审批编号:"+workAdministrativeAtamp.getNum() +" 强制撤销!");
+
+            }
+        }
+        if(processList!=null && processList.size()>0){
+            for (int i =0;i<processList.size();i++) {
+                WorkActivityProcess p = processList.get(i);
+                if(StringUtils.isNotBlank(p.getIsApproval()) && "0".equals(p.getIsApproval())){
+                    p.setIsApproval("-1");
+                    p.setDelFlag("1");
+                    workActivityProcessDao.updateDelFlagAndIsApproval(p);
+                }
+            }
+            WorkActivityProcess pro = new WorkActivityProcess();
+            pro.setId("");
+            pro.setDelFlag("0");
+            pro.preInsert();
+            pro.setRemarks("[强制撤销]");
+            pro.setProcessKey(processList.get(0).getProcessKey());
+            pro.setIsApproval("1");
+            pro.setProcessInstanceId(processList.get(0).getProcessInstanceId());
+            pro.setCount(0);
+            workActivityProcessDao.insert(pro);
+
+            //结束该流程,设为"撤销"状态月
+            WorkAdministrativeAtamp administrativeAtamp = new WorkAdministrativeAtamp();
+            administrativeAtamp.setId(workAdministrativeAtamp.getId());
+            administrativeAtamp.setState(ProjectStatusEnum.RECALL.getValue());
+            administrativeAtamp.setProcessInstanceId(workAdministrativeAtamp.getProcessInstanceId());
+            administrativeAtamp.preUpdate();
+            this.updateStateById(administrativeAtamp);
+            actTaskService.endProcessInstance(workAdministrativeAtamp.getProcessInstanceId(), "签章申请-撤回");
+        }
+    }
+
+    private void updateStateById(WorkAdministrativeAtamp administrativeAtamp) {
+        dao.updateProcessIdAndStatus(administrativeAtamp);
+    }
+}

+ 381 - 0
src/main/java/com/jeeplus/modules/workadministrativeatamp/web/WorkAdministrativeAtampController.java

@@ -0,0 +1,381 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workadministrativeatamp.web;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.ConstraintViolationException;
+
+import com.jeeplus.modules.act.entity.Act;
+import com.jeeplus.modules.act.service.ActTaskService;
+import com.jeeplus.modules.projectrecord.enums.ProjectStatusEnum;
+import com.jeeplus.modules.sys.entity.Office;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.workincomingmessage.entity.WorkIncomingMessage;
+import org.activiti.engine.runtime.ProcessInstance;
+import org.activiti.engine.task.Task;
+import org.apache.shiro.authz.annotation.Logical;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import com.google.common.collect.Lists;
+import com.jeeplus.common.utils.DateUtils;
+import com.jeeplus.common.utils.MyBeanUtils;
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.utils.excel.ExportExcel;
+import com.jeeplus.common.utils.excel.ImportExcel;
+import com.jeeplus.modules.workadministrativeatamp.entity.WorkAdministrativeAtamp;
+import com.jeeplus.modules.workadministrativeatamp.service.WorkAdministrativeAtampService;
+
+/**
+ * 行政盖章Controller
+ * @author ssrh
+ * @version 2018-07-10
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/workadministrativeatamp/workAdministrativeAtamp")
+public class WorkAdministrativeAtampController extends BaseController {
+
+	@Autowired
+	private WorkAdministrativeAtampService workAdministrativeAtampService;
+    @Autowired
+    private ActTaskService actTaskService;
+	
+	@ModelAttribute
+	public WorkAdministrativeAtamp get(@RequestParam(required=false) String id) {
+		WorkAdministrativeAtamp entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = workAdministrativeAtampService.get(id);
+		}
+		if (entity == null){
+			entity = new WorkAdministrativeAtamp();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 行政盖章列表页面
+	 */
+	@RequiresPermissions("workadministrativeatamp:workAdministrativeAtamp:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(WorkAdministrativeAtamp workAdministrativeAtamp, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<WorkAdministrativeAtamp> page = workAdministrativeAtampService.findPage(new Page<WorkAdministrativeAtamp>(request, response), workAdministrativeAtamp); 
+		model.addAttribute("page", page);
+		return "modules/workadministrativeatamp/workAdministrativeAtampList";
+	}
+
+	/**
+	 * 查看,增加,编辑行政盖章表单页面
+	 */
+	@RequiresPermissions(value={"workadministrativeatamp:workAdministrativeAtamp:view","workadministrativeatamp:workAdministrativeAtamp:add","workadministrativeatamp:workAdministrativeAtamp:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(WorkAdministrativeAtamp workAdministrativeAtamp, Model model) {
+	    if(workAdministrativeAtamp.getComSign()==null||StringUtils.isBlank(workAdministrativeAtamp.getComSign().getId())){
+            Office office = UserUtils.getSelectOffice();
+            workAdministrativeAtamp.setOffice(office);
+            if(StringUtils.isNotBlank(office.getBranchOffice())) {
+                workAdministrativeAtamp.setComSign(UserUtils.getBranchOfficeById(office.getBranchOffice()));
+            }else {
+                workAdministrativeAtamp.setComSign(UserUtils.getSelectCompany());
+            }
+        }
+        if(workAdministrativeAtamp.getSubmitDate()==null){
+	        workAdministrativeAtamp.setSubmitDate(new Date());
+        }
+        if(workAdministrativeAtamp.getSubmiter()==null){
+	        workAdministrativeAtamp.setSubmiter(UserUtils.getUser());
+        }
+        if(workAdministrativeAtamp.getOffice()==null||StringUtils.isBlank(workAdministrativeAtamp.getOffice().getId())){
+	        workAdministrativeAtamp.setOffice(UserUtils.getSelectOffice());
+        }
+		model.addAttribute("workAdministrativeAtamp", workAdministrativeAtamp);
+		return "modules/workadministrativeatamp/workAdministrativeAtampForm";
+	}
+
+	/**
+	 * 查看,增加,编辑行政盖章表单页面
+	 */
+	@RequiresPermissions(value={"workadministrativeatamp:workAdministrativeAtamp:view"},logical=Logical.OR)
+	@RequestMapping(value = "view")
+	public String view(WorkAdministrativeAtamp workAdministrativeAtamp, Model model) {
+		model.addAttribute("workAdministrativeAtamp", workAdministrativeAtamp);
+		return "modules/workadministrativeatamp/workAdministrativeAtampView";
+	}
+
+    @RequiresPermissions(value={"workadministrativeatamp:workAdministrativeAtamp:add","workadministrativeatamp:workAdministrativeAtamp:edit"},logical=Logical.OR)
+    @RequestMapping(value = "tstore")
+    public String tStore(WorkAdministrativeAtamp workAdministrativeAtamp, Model model, RedirectAttributes redirectAttributes) throws Exception{
+        if (!beanValidator(model, workAdministrativeAtamp)){
+            return form(workAdministrativeAtamp, model);
+        }
+        try {
+            workAdministrativeAtamp.setState(ProjectStatusEnum.TSTORE.getValue());
+            if (!workAdministrativeAtamp.getIsNewRecord()) {//编辑表单保存
+                WorkAdministrativeAtamp t = workAdministrativeAtampService.get(workAdministrativeAtamp.getId());//从数据库取出记录的值
+                MyBeanUtils.copyBeanNotNull2Bean(workAdministrativeAtamp, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+                workAdministrativeAtampService.save(t);//保存
+            } else {//新增表单保存
+                workAdministrativeAtampService.save(workAdministrativeAtamp);//保存
+            }
+            addMessage(redirectAttributes, "暂存行政盖章成功");
+        }catch (Exception e){
+            logger.error("暂存行政盖章异常:",e);
+            addMessage(redirectAttributes, "暂存行政盖章异常:"+e.getMessage());
+        }
+        return "redirect:"+Global.getAdminPath()+"/workadministrativeatamp/workAdministrativeAtamp/?repage";
+    }
+
+	/**
+	 * 保存行政盖章
+	 */
+	@RequiresPermissions(value={"workadministrativeatamp:workAdministrativeAtamp:add","workadministrativeatamp:workAdministrativeAtamp:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	public String save(WorkAdministrativeAtamp workAdministrativeAtamp, Model model, RedirectAttributes redirectAttributes) throws Exception{
+		if (!beanValidator(model, workAdministrativeAtamp)){
+			return form(workAdministrativeAtamp, model);
+		}
+        workAdministrativeAtamp.setState(ProjectStatusEnum.IN_APRL.getValue());
+        String str = "";
+        if(!workAdministrativeAtamp.getIsNewRecord()){//编辑表单保存
+            WorkAdministrativeAtamp t = workAdministrativeAtampService.get(workAdministrativeAtamp.getId());//从数据库取出记录的值
+            MyBeanUtils.copyBeanNotNull2Bean(workAdministrativeAtamp, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+            str = workAdministrativeAtampService.saveAtamp(t);//保存
+        }else{//新增表单保存
+            str = workAdministrativeAtampService.saveAtamp(workAdministrativeAtamp);//保存
+        }
+        if (StringUtils.isNotBlank(str)){
+            addMessage(redirectAttributes, "保存行政盖章失败:"+str);
+        }else {
+            addMessage(redirectAttributes, "保存行政盖章成功");
+        }
+		return "redirect:"+Global.getAdminPath()+"/workadministrativeatamp/workAdministrativeAtamp/?repage";
+	}
+	
+	/**
+	 * 删除行政盖章
+	 */
+	@RequiresPermissions("workadministrativeatamp:workAdministrativeAtamp:del")
+	@RequestMapping(value = "delete")
+	public String delete(WorkAdministrativeAtamp workAdministrativeAtamp, RedirectAttributes redirectAttributes) {
+        if(5==workAdministrativeAtamp.getState()|| 2==workAdministrativeAtamp.getState()){
+            if(5==workAdministrativeAtamp.getState()){
+                addMessage(redirectAttributes, "行政盖章已审批通过,无法删除");
+                return "redirect:"+Global.getAdminPath()+"/workadministrativeatamp/workAdministrativeAtamp/?repage";
+            }else{
+                addMessage(redirectAttributes, "行政盖章正在审核中,无法删除");
+                return "redirect:"+Global.getAdminPath()+"/workadministrativeatamp/workAdministrativeAtamp/?repage";
+            }
+        }
+		workAdministrativeAtampService.delete(workAdministrativeAtamp);
+		addMessage(redirectAttributes, "删除行政盖章成功");
+		return "redirect:"+Global.getAdminPath()+"/workadministrativeatamp/workAdministrativeAtamp/?repage";
+	}
+	
+	/**
+	 * 批量删除行政盖章
+	 */
+	@RequiresPermissions("workadministrativeatamp:workAdministrativeAtamp:del")
+	@RequestMapping(value = "deleteAll")
+	public String deleteAll(String ids, RedirectAttributes redirectAttributes) {
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			workAdministrativeAtampService.delete(workAdministrativeAtampService.get(id));
+		}
+		addMessage(redirectAttributes, "删除行政盖章成功");
+		return "redirect:"+Global.getAdminPath()+"/workadministrativeatamp/workAdministrativeAtamp/?repage";
+	}
+	
+	/**
+	 * 导出excel文件
+	 */
+	@RequiresPermissions("workadministrativeatamp:workAdministrativeAtamp:export")
+    @RequestMapping(value = "export", method=RequestMethod.POST)
+    public String exportFile(WorkAdministrativeAtamp workAdministrativeAtamp, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "行政盖章"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            Page<WorkAdministrativeAtamp> page = workAdministrativeAtampService.findPage(new Page<WorkAdministrativeAtamp>(request, response, -1), workAdministrativeAtamp);
+    		new ExportExcel("行政盖章", WorkAdministrativeAtamp.class).setDataList(page.getList()).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导出行政盖章记录失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workadministrativeatamp/workAdministrativeAtamp/?repage";
+    }
+
+	/**
+	 * 导入Excel数据
+
+	 */
+	@RequiresPermissions("workadministrativeatamp:workAdministrativeAtamp:import")
+    @RequestMapping(value = "import", method=RequestMethod.POST)
+    public String importFile(MultipartFile file, RedirectAttributes redirectAttributes) {
+		try {
+			int successNum = 0;
+			int failureNum = 0;
+			StringBuilder failureMsg = new StringBuilder();
+			ImportExcel ei = new ImportExcel(file, 1, 0);
+			List<WorkAdministrativeAtamp> list = ei.getDataList(WorkAdministrativeAtamp.class);
+			for (WorkAdministrativeAtamp workAdministrativeAtamp : list){
+				try{
+					workAdministrativeAtampService.save(workAdministrativeAtamp);
+					successNum++;
+				}catch(ConstraintViolationException ex){
+					failureNum++;
+				}catch (Exception ex) {
+					failureNum++;
+				}
+			}
+			if (failureNum>0){
+				failureMsg.insert(0, ",失败 "+failureNum+" 条行政盖章记录。");
+			}
+			addMessage(redirectAttributes, "已成功导入 "+successNum+" 条行政盖章记录"+failureMsg);
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入行政盖章失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workadministrativeatamp/workAdministrativeAtamp/?repage";
+    }
+	
+	/**
+	 * 下载导入行政盖章数据模板
+	 */
+	@RequiresPermissions("workadministrativeatamp:workAdministrativeAtamp:import")
+    @RequestMapping(value = "import/template")
+    public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "行政盖章数据导入模板.xlsx";
+    		List<WorkAdministrativeAtamp> list = Lists.newArrayList(); 
+    		new ExportExcel("行政盖章数据", WorkAdministrativeAtamp.class, 1).setDataList(list).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入模板下载失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workadministrativeatamp/workAdministrativeAtamp/?repage";
+    }
+
+    @RequiresPermissions(value={"workincomingmessage:workIncomingMessage:edit"},logical=Logical.OR)
+    @RequestMapping(value = "modify")
+    public String modify(WorkAdministrativeAtamp workAdministrativeAtamp, Model model,RedirectAttributes redirectAttributes) {
+        workAdministrativeAtamp=workAdministrativeAtampService.get(workAdministrativeAtamp.getId());
+        ProcessInstance processInstance = actTaskService.getProcIns(workAdministrativeAtamp.getProcessInstanceId());
+        if (processInstance!=null) {
+            Task taskInfok = actTaskService.getCurrentTaskInfo(processInstance);
+            Act act = new Act();
+            act.setTaskId(taskInfok.getId());
+            act.setTaskName(taskInfok.getName());
+            act.setTaskDefKey(taskInfok.getTaskDefinitionKey());
+            act.setProcDefId(taskInfok.getProcessDefinitionId());
+            act.setProcInsId(taskInfok.getProcessInstanceId());
+            act.setTask(taskInfok);
+            workAdministrativeAtamp.setAct(act);
+        }
+
+        model.addAttribute("workAdministrativeAtamp", workAdministrativeAtamp);
+        return "modules/workadministrativeatamp/workAdministrativeAtampModifyApply";
+    }
+
+    /**
+     * 工单执行(完成任务)
+     * @param model
+     * @return
+     */
+    @RequestMapping(value = "saveAudit")
+    public String saveAudit(WorkAdministrativeAtamp workAdministrativeAtamp, Model model,
+                            RedirectAttributes redirectAttributes) {
+        try {
+            // 对不同环节的业务逻辑进行操作
+            String taskDefKey = workAdministrativeAtamp.getAct().getTaskDefKey();
+            List<User> users = null;
+            if ("bmzr".equals(taskDefKey)){
+                users = UserUtils.getByProssType(workAdministrativeAtamp.getProcessInstanceId(),2);
+                if (users==null )
+                    users = UserUtils.getByRoleActivityEnname("fgld",2,UserUtils.getSelectOffice().getId(),"11",workAdministrativeAtamp.getCreateBy());
+            }else  if ("fgld".equals(taskDefKey)){
+                users = UserUtils.getByProssType(workAdministrativeAtamp.getProcessInstanceId(),3);
+                if (users==null )
+                    users = UserUtils.getByRoleActivityEnname("gzr",3,workAdministrativeAtamp.getComSign().getId(),"11",workAdministrativeAtamp.getCreateBy());
+            }else if ("gzr".equals(taskDefKey)){
+                users = UserUtils.getByProssType(workAdministrativeAtamp.getProcessInstanceId(),3);
+            }else if ("modifyApply".equals(taskDefKey)){
+                users = UserUtils.getByProssType(workAdministrativeAtamp.getProcessInstanceId(),1);
+            }
+            String flag = workAdministrativeAtamp.getAct().getFlag();
+            if ("yes".equals(flag) && (users==null || users.size()==0)){
+                addMessage(redirectAttributes, "审批失败,审批人为空,请联系管理员!");
+            }else {
+                String str = workAdministrativeAtampService.auditSave(workAdministrativeAtamp,users);
+                addMessage(redirectAttributes, str);
+            }
+        }catch (Exception e){
+            logger.info("Exception e:"+e);
+            addMessage(redirectAttributes, "审批失败");
+        }
+        if (StringUtils.isNotBlank(workAdministrativeAtamp.getHome()) && "home".equals(workAdministrativeAtamp.getHome())){
+            return "redirect:" + Global.getAdminPath() + "/home/?repage";
+        }else {
+            return "redirect:" + Global.getAdminPath() + "/workadministrativeatamp/workAdministrativeAtamp/?repage";
+        }
+    }
+
+    //	审批页面
+    @RequestMapping(value = "audit")
+    public String workContractInfoAudit(Act act, WorkAdministrativeAtamp workAdministrativeAtamp, Model model) {
+
+        if (act.getProcInsId() != null) {
+            if (actTaskService.getProcIns(act.getProcInsId()) != null) {
+                act.setProcIns(actTaskService.getProcIns(act.getProcInsId()));
+            } else {
+                act.setFinishedProcIns(actTaskService.getFinishedProcIns(act.getProcInsId()));
+            }
+        }
+        if (act != null && StringUtils.isNotBlank(act.getTaskId())) {
+            workAdministrativeAtamp.setAct(act);
+            model.addAttribute("processInstanceId", workAdministrativeAtamp.getProcessInstanceId());
+        }
+        model.addAttribute("workAdministrativeAtamp", workAdministrativeAtamp);
+        return "modules/workadministrativeatamp/workAdministrativeAtampAudit";
+    }
+
+    @RequestMapping(value = "getProcess")
+    public String getProcess(WorkAdministrativeAtamp workAdministrativeAtamp, Model model, HttpServletRequest request){
+        model.addAttribute("processInstanceId", workAdministrativeAtamp.getProcessInstanceId());
+        return "modules/workadministrativeatamp/workAdministrativeAtampTask";
+    }
+
+    @RequiresPermissions(value={"workadministrativeatamp:workAdministrativeAtamp:edit"},logical=Logical.OR)
+    @RequestMapping(value = "revoke")
+    public String revoke(HttpServletRequest request, RedirectAttributes redirectAttributes) {
+        HashMap<String, String> requestMap = findRequestMap(request);
+        String processInstanceId = requestMap.get("processInstanceId");
+        String id = requestMap.get("id");
+        try {
+            WorkAdministrativeAtamp workAdministrativeAtamp = workAdministrativeAtampService.get(id);
+            if(5==workAdministrativeAtamp.getState()){
+                addMessage(redirectAttributes, "行政盖章已审批通过,无法撤回");
+                return "redirect:"+Global.getAdminPath()+"/workadministrativeatamp/workAdministrativeAtamp/?repage";
+            }
+            workAdministrativeAtampService.cancelProcess(workAdministrativeAtamp);
+            addMessage(redirectAttributes, "撤回该盖章审批成功");
+        }catch (Exception e){
+            logger.info(e.getMessage());
+            addMessage(redirectAttributes, "撤回该盖章审批失败");
+        }
+        return "redirect:" + Global.getAdminPath() + "/workadministrativeatamp/workAdministrativeAtamp/?repage";
+    }
+}

+ 24 - 0
src/main/java/com/jeeplus/modules/workaftermath/dao/WorkAftermathDao.java

@@ -0,0 +1,24 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workaftermath.dao;
+
+import com.jeeplus.modules.workbidingproject.entity.WorkBidingProject;
+import java.util.List;
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.workaftermath.entity.WorkAftermath;
+
+/**
+ * 评标后工作管理DAO接口
+ * @author liuw
+ * @version 2017-12-26
+ */
+@MyBatisDao
+public interface WorkAftermathDao extends CrudDao<WorkAftermath> {
+
+	public List<WorkBidingProject> findListByworkBidingProject(WorkBidingProject workBidingProject);
+
+	public WorkAftermath getBypid(String pid);
+	
+}

+ 165 - 0
src/main/java/com/jeeplus/modules/workaftermath/entity/WorkAftermath.java

@@ -0,0 +1,165 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workaftermath.entity;
+
+import com.jeeplus.modules.workbidingproject.entity.WorkBidingProject;
+import java.util.Date;
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+import com.jeeplus.modules.workclientinfo.entity.WorkClientInfo;
+import com.jeeplus.modules.workprojectdeposit.entity.WorkProjectDeposit;
+
+/**
+ * 评标后工作管理Entity
+ * @author liuw
+ * @version 2017-12-26
+ */
+public class WorkAftermath extends DataEntity<WorkAftermath> {
+	
+	private static final long serialVersionUID = 1L;
+	private WorkBidingProject workBidingProject;		// 招标项目
+	private String companyId;		// company_id
+	private String officeId;		// office_id
+	private String bidAmount;		// 中标金额
+	private Date dateStart;		// 工期(起)
+	private Date dateEnd;		// 工期(止)
+	private String projectMaster;		// 项目经理
+	private String agencyType;		// 代理费缴纳方类型
+	private String payName;		// 缴纳方全称
+	private String invoiceNumber;		// 发票号
+	private Date invoiceDate;		// 开票时间
+	private List list;//企业保证金
+	private WorkClientInfo workClientInfo; //委托方
+
+	public WorkClientInfo getWorkClientInfo() {
+		return workClientInfo;
+	}
+
+	public void setWorkClientInfo(WorkClientInfo workClientInfo) {
+		this.workClientInfo = workClientInfo;
+	}
+
+	public List getList() {
+		return list;
+	}
+
+	public void setList(List list) {
+		this.list = list;
+	}
+
+	public WorkAftermath() {
+		super();
+	}
+
+	public WorkAftermath(String id){
+		super(id);
+	}
+
+	@ExcelField(title="招标项目", align=2, sort=7)
+	public WorkBidingProject getWorkBidingProject() {
+		return workBidingProject;
+	}
+
+	public void setWorkBidingProject(WorkBidingProject workBidingProject) {
+		this.workBidingProject = workBidingProject;
+	}
+	
+	@ExcelField(title="company_id", align=2, sort=8)
+	public String getCompanyId() {
+		return companyId;
+	}
+
+	public void setCompanyId(String companyId) {
+		this.companyId = companyId;
+	}
+	
+	@ExcelField(title="office_id", align=2, sort=9)
+	public String getOfficeId() {
+		return officeId;
+	}
+
+	public void setOfficeId(String officeId) {
+		this.officeId = officeId;
+	}
+	
+	@ExcelField(title="中标金额", align=2, sort=10)
+	public String getBidAmount() {
+		return bidAmount;
+	}
+
+	public void setBidAmount(String bidAmount) {
+		this.bidAmount = bidAmount;
+	}
+	
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@ExcelField(title="工期(起)", align=2, sort=11)
+	public Date getDateStart() {
+		return dateStart;
+	}
+
+	public void setDateStart(Date dateStart) {
+		this.dateStart = dateStart;
+	}
+	
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@ExcelField(title="工期(止)", align=2, sort=12)
+	public Date getDateEnd() {
+		return dateEnd;
+	}
+
+	public void setDateEnd(Date dateEnd) {
+		this.dateEnd = dateEnd;
+	}
+	
+	@ExcelField(title="项目经理", align=2, sort=13)
+	public String getProjectMaster() {
+		return projectMaster;
+	}
+
+	public void setProjectMaster(String projectMaster) {
+		this.projectMaster = projectMaster;
+	}
+	
+	@ExcelField(title="代理费缴纳方类型", dictType="", align=2, sort=14)
+	public String getAgencyType() {
+		return agencyType;
+	}
+
+	public void setAgencyType(String agencyType) {
+		this.agencyType = agencyType;
+	}
+	
+	@ExcelField(title="缴纳方全称", align=2, sort=15)
+	public String getPayName() {
+		return payName;
+	}
+
+	public void setPayName(String payName) {
+		this.payName = payName;
+	}
+	
+	@ExcelField(title="发票号", align=2, sort=16)
+	public String getInvoiceNumber() {
+		return invoiceNumber;
+	}
+
+	public void setInvoiceNumber(String invoiceNumber) {
+		this.invoiceNumber = invoiceNumber;
+	}
+	
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@ExcelField(title="开票时间", align=2, sort=17)
+	public Date getInvoiceDate() {
+		return invoiceDate;
+	}
+
+	public void setInvoiceDate(Date invoiceDate) {
+		this.invoiceDate = invoiceDate;
+	}
+	
+}

+ 56 - 0
src/main/java/com/jeeplus/modules/workaftermath/service/WorkAftermathService.java

@@ -0,0 +1,56 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workaftermath.service;
+
+import java.util.List;
+
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.jeeplus.modules.workbidingproject.entity.WorkBidingProject;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.service.CrudService;
+import com.jeeplus.modules.workaftermath.entity.WorkAftermath;
+import com.jeeplus.modules.workaftermath.dao.WorkAftermathDao;
+
+/**
+ * 评标后工作管理Service
+ * @author liuw
+ * @version 2017-12-26
+ */
+@Service
+@Transactional(readOnly = true)
+public class WorkAftermathService extends CrudService<WorkAftermathDao, WorkAftermath> {
+
+	public WorkAftermath get(String id) {
+		return super.get(id);
+	}
+	
+	public List<WorkAftermath> findList(WorkAftermath workAftermath) {
+		return super.findList(workAftermath);
+	}
+	
+	public Page<WorkAftermath> findPage(Page<WorkAftermath> page, WorkAftermath workAftermath) {
+		return super.findPage(page, workAftermath);
+	}
+	
+	@Transactional(readOnly = false)
+	public void save(WorkAftermath workAftermath) {
+		super.save(workAftermath);
+	}
+	
+	@Transactional(readOnly = false)
+	public void delete(WorkAftermath workAftermath) {
+		super.delete(workAftermath);
+	}
+	
+	public Page<WorkBidingProject> findPageByworkBidingProject(Page<WorkBidingProject> page, WorkBidingProject workBidingProject) {
+		workBidingProject.setPage(page);
+		page.setList(dao.findListByworkBidingProject(workBidingProject));
+		return page;
+	}
+	
+	
+	
+}

+ 474 - 0
src/main/java/com/jeeplus/modules/workaftermath/web/WorkAftermathController.java

@@ -0,0 +1,474 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workaftermath.web;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.ConstraintViolationException;
+
+import com.jeeplus.modules.sys.entity.Role;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.workaftermath.dao.WorkAftermathDao;
+import com.jeeplus.modules.workbidingproject.dao.WorkBidingProjectDao;
+import com.jeeplus.modules.workbidingproject.service.WorkBidingProjectService;
+import com.jeeplus.modules.workclientinfo.entity.WorkClientInfo;
+import com.jeeplus.modules.workclientinfo.service.WorkClientInfoService;
+import com.jeeplus.modules.workfullmanage.entity.WorkFullManage;
+import com.jeeplus.modules.workfullmanage.entity.WorkFullRecord;
+import com.jeeplus.modules.workfullmanage.service.WorkFullRecordService;
+import com.jeeplus.modules.workproject.dao.WorkProjectDao;
+import com.jeeplus.modules.workproject.entity.WorkProject;
+import com.jeeplus.modules.workproject.service.WorkProjectService;
+import com.jeeplus.modules.workprojectdeposit.dao.WorkProjectDepositDao;
+import com.jeeplus.modules.workprojectdeposit.entity.WorkProjectDeposit;
+import com.jeeplus.modules.workprojectdeposit.service.WorkProjectDepositService;
+import com.jeeplus.modules.workprojectnotify.entity.WorkProjectNotify;
+import com.jeeplus.modules.workprojectnotify.service.WorkProjectNotifyService;
+import com.jeeplus.modules.workreimbursement.utils.VarStr;
+import org.apache.shiro.authz.annotation.Logical;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import com.jeeplus.modules.workbidingproject.entity.WorkBidingProject;
+import com.google.common.collect.Lists;
+import com.jeeplus.common.utils.DateUtils;
+import com.jeeplus.common.utils.MyBeanUtils;
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.utils.excel.ExportExcel;
+import com.jeeplus.common.utils.excel.ImportExcel;
+import com.jeeplus.modules.workaftermath.entity.WorkAftermath;
+import com.jeeplus.modules.workaftermath.service.WorkAftermathService;
+
+/**
+ * 评标后工作管理Controller
+ * @author liuw
+ * @version 2017-12-26
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/workaftermath/workAftermath")
+public class WorkAftermathController extends BaseController {
+
+	@Autowired
+	private WorkAftermathService workAftermathService;
+	@Autowired
+	private WorkBidingProjectService workBidingProjectService;
+	@Autowired
+	private WorkAftermathDao workAftermathDao;
+	@Autowired
+	private WorkProjectDepositDao workProjectDepositDao;
+	@Autowired
+	private WorkProjectNotifyService workProjectNotifyService;
+	@Autowired
+	private WorkBidingProjectDao workBidingProjectDao;
+	@Autowired
+	private WorkFullRecordService workFullRecordService;
+	@Autowired
+	private WorkProjectService workProjectService;
+	@Autowired
+	private WorkProjectDao workProjectDao;
+	@Autowired
+	private WorkClientInfoService workClientInfoService;
+
+
+	@Autowired
+	private WorkProjectDepositService workProjectDepositService;
+	@ModelAttribute
+	public WorkAftermath get(@RequestParam(required=false) String id) {
+		WorkAftermath entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = workAftermathService.get(id);
+		}
+		if (entity == null){
+			entity = new WorkAftermath();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 评标后工作管理列表页面
+	 */
+	//@RequiresPermissions("workaftermath:workAftermath:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(WorkAftermath workAftermath, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<WorkAftermath> page = workAftermathService.findPage(new Page<WorkAftermath>(request, response), workAftermath); 
+		model.addAttribute("page", page);
+		return "modules/workaftermath/workAftermathList";
+	}
+
+	/**
+	 * 查看,增加,编辑评标后工作管理表单页面
+	 */
+	//@RequiresPermissions(value={"workaftermath:workAftermath:view","workaftermath:workAftermath:add","workaftermath:workAftermath:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(WorkAftermath workAftermath, Model model,HttpServletRequest request) {
+		String pid = request.getParameter("pid");
+		if(StringUtils.isBlank(pid)){
+			pid = request.getSession().getAttribute("pid").toString();
+		}
+		WorkAftermath workAftermath2 = workAftermathDao.getBypid(pid);
+		if(workAftermath2!=null&&!workAftermath2.equals("")){
+			workAftermath = workAftermath2;
+		}
+		WorkBidingProject workBidingProject = workBidingProjectService.get(pid);
+		workAftermath.setWorkBidingProject(workBidingProject);
+			StringBuffer sb = new StringBuffer();
+			if(workBidingProject.getProjectMaster()!=null&&!workBidingProject.getProjectMaster().equals("")){
+				String [] a = StringUtils.split(workBidingProject.getProjectMaster(), ",");
+				if(a.length>1){
+					for (String id : StringUtils.split(workBidingProject.getProjectMaster(), ",")){
+						//this.masterList.add(new User(id));
+						String name = UserUtils.get(id).getName();
+						sb.append(name+",");
+					}
+				}else {
+					for (String id : StringUtils.split(workBidingProject.getProjectMaster(), ",")) {
+						//this.masterList.add(new User(id));
+						String name = UserUtils.get(id).getName();
+						sb.append(name);
+					}
+				}
+				workAftermath.setProjectMaster(sb+"");
+			}
+		List<WorkProjectDeposit> list = workProjectDepositService.findByPid(workBidingProject.getId());
+		if(StringUtils.isNotBlank(workBidingProject.getClient().getId())){
+			WorkClientInfo workClientInfo = workClientInfoService.get(workBidingProject.getClient().getId());
+			workAftermath.setWorkClientInfo(workClientInfo);
+		};
+		workAftermath.setList(list);
+		model.addAttribute("workAftermath", workAftermath);
+		request.getSession().getAttribute("pid");
+		return "modules/workaftermath/workAftermathForm";
+	}
+
+	/**
+	 * 保存评标后工作管理
+	 */
+	//@RequiresPermissions(value={"workaftermath:workAftermath:add","workaftermath:workAftermath:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	public String save(WorkAftermath workAftermath, Model model, RedirectAttributes redirectAttributes,HttpServletRequest request) throws Exception{
+		if (!beanValidator(model, workAftermath)){
+			return form(workAftermath, model,request);
+		}
+		if(!workAftermath.getIsNewRecord()){//编辑表单保存
+			WorkAftermath t = workAftermathService.get(workAftermath.getId());//从数据库取出记录的值
+			MyBeanUtils.copyBeanNotNull2Bean(workAftermath, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+			workAftermathService.save(t);//保存
+		}else{//新增表单保存
+			workAftermath.setCompanyId(UserUtils.getSelectCompany().getId());
+			workAftermath.setOfficeId(UserUtils.getSelectOffice().getId());
+			WorkBidingProject workBidingProject = workBidingProjectService.get(workAftermath.getWorkBidingProject().getId());
+				StringBuffer sb = new StringBuffer();
+				if(workBidingProject.getProjectMaster()!=null&&!workBidingProject.getProjectMaster().equals("")){
+					for (String id : StringUtils.split(workBidingProject.getProjectMaster(), ",")){
+						String name = UserUtils.get(id).getName();
+						sb.append(name+",");
+					}
+					workAftermath.setProjectMaster(sb+"");
+				}
+			workAftermathService.save(workAftermath);//保存
+		}
+		addMessage(redirectAttributes, "保存评标后工作管理成功");
+		return "redirect:"+Global.getAdminPath()+"/workbidingprojectmg/workBidingProjectmg/list";
+	}
+	
+	/**
+	 * 删除评标后工作管理
+	 */
+	//@RequiresPermissions("workaftermath:workAftermath:del")
+	@RequestMapping(value = "delete")
+	public String delete(WorkAftermath workAftermath, RedirectAttributes redirectAttributes) {
+		workAftermathService.delete(workAftermath);
+		addMessage(redirectAttributes, "删除评标后工作管理成功");
+		return "redirect:"+Global.getAdminPath()+"/workaftermath/workAftermath/?repage";
+	}
+	
+	/**
+	 * 批量删除评标后工作管理
+	 */
+	//@RequiresPermissions("workaftermath:workAftermath:del")
+	@RequestMapping(value = "deleteAll")
+	public String deleteAll(String ids, RedirectAttributes redirectAttributes) {
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			workAftermathService.delete(workAftermathService.get(id));
+		}
+		addMessage(redirectAttributes, "删除评标后工作管理成功");
+		return "redirect:"+Global.getAdminPath()+"/workaftermath/workAftermath/?repage";
+	}
+	
+	/**
+	 * 导出excel文件
+	 */
+	//@RequiresPermissions("workaftermath:workAftermath:export")
+    @RequestMapping(value = "export", method=RequestMethod.POST)
+    public String exportFile(WorkAftermath workAftermath, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "评标后工作管理"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            Page<WorkAftermath> page = workAftermathService.findPage(new Page<WorkAftermath>(request, response, -1), workAftermath);
+    		new ExportExcel("评标后工作管理", WorkAftermath.class).setDataList(page.getList()).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导出评标后工作管理记录失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workaftermath/workAftermath/?repage";
+    }
+
+	/**
+	 * 导入Excel数据
+
+	 */
+	//@RequiresPermissions("workaftermath:workAftermath:import")
+    @RequestMapping(value = "import", method=RequestMethod.POST)
+    public String importFile(MultipartFile file, RedirectAttributes redirectAttributes) {
+		try {
+			int successNum = 0;
+			int failureNum = 0;
+			StringBuilder failureMsg = new StringBuilder();
+			ImportExcel ei = new ImportExcel(file, 1, 0);
+			List<WorkAftermath> list = ei.getDataList(WorkAftermath.class);
+			for (WorkAftermath workAftermath : list){
+				try{
+					workAftermathService.save(workAftermath);
+					successNum++;
+				}catch(ConstraintViolationException ex){
+					failureNum++;
+				}catch (Exception ex) {
+					failureNum++;
+				}
+			}
+			if (failureNum>0){
+				failureMsg.insert(0, ",失败 "+failureNum+" 条评标后工作管理记录。");
+			}
+			addMessage(redirectAttributes, "已成功导入 "+successNum+" 条评标后工作管理记录"+failureMsg);
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入评标后工作管理失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workaftermath/workAftermath/?repage";
+    }
+	
+	/**
+	 * 下载导入评标后工作管理数据模板
+	 */
+	@RequiresPermissions("workaftermath:workAftermath:import")
+    @RequestMapping(value = "import/template")
+    public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "评标后工作管理数据导入模板.xlsx";
+    		List<WorkAftermath> list = Lists.newArrayList(); 
+    		new ExportExcel("评标后工作管理数据", WorkAftermath.class, 1).setDataList(list).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入模板下载失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workaftermath/workAftermath/?repage";
+    }
+	
+	
+	/**
+	 * 选择招标项目
+	 */
+	@RequestMapping(value = "selectworkBidingProject")
+	public String selectworkBidingProject(WorkBidingProject workBidingProject, String url, String fieldLabels, String fieldKeys, String searchLabel, String searchKey, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<WorkBidingProject> page = workAftermathService.findPageByworkBidingProject(new Page<WorkBidingProject>(request, response),  workBidingProject);
+		try {
+			fieldLabels = URLDecoder.decode(fieldLabels, "UTF-8");
+			fieldKeys = URLDecoder.decode(fieldKeys, "UTF-8");
+			searchLabel = URLDecoder.decode(searchLabel, "UTF-8");
+			searchKey = URLDecoder.decode(searchKey, "UTF-8");
+		} catch (UnsupportedEncodingException e) {
+			e.printStackTrace();
+		}
+		model.addAttribute("labelNames", fieldLabels.split("\\|"));
+		model.addAttribute("labelValues", fieldKeys.split("\\|"));
+		model.addAttribute("fieldLabels", fieldLabels);
+		model.addAttribute("fieldKeys", fieldKeys);
+		model.addAttribute("url", url);
+		model.addAttribute("searchLabel", searchLabel);
+		model.addAttribute("searchKey", searchKey);
+		model.addAttribute("obj", workBidingProject);
+		model.addAttribute("page", page);
+		return "modules/sys/gridselect";
+	}
+
+	/**
+	 * 确认中标企业
+	 */
+	@RequestMapping(value = "updateBiding")
+	public String updateBiding(WorkProjectDeposit workProjectDeposit,HttpServletRequest request) {
+		workProjectDeposit.setBidingState("1");//1为已中标
+		workProjectDepositDao.updateState(workProjectDeposit);
+		WorkProjectDeposit workProjectDeposit2 = workProjectDepositService.get(workProjectDeposit.getId());
+		request.getSession().setAttribute("pid",workProjectDeposit2.getBidingProject().getId());
+		List<WorkProjectDeposit> list = workProjectDepositService.findByPid(workProjectDeposit2.getBidingProject().getId());
+		list.remove(workProjectDeposit);
+		for (WorkProjectDeposit w:
+			 list) {
+			w.setBidingState("2");//2为未中标
+			workProjectDepositDao.updateState(w);
+		}
+		return "redirect:"+Global.getAdminPath()+"/workaftermath/workAftermath/form";
+	}
+	/**
+	 * 退还保证金
+	 */
+	@RequestMapping(value = "updateStatus")
+	public String updateStatus(WorkProjectDeposit workProjectDeposit,HttpServletRequest request) {
+		workProjectDeposit.setDepositStatus("3");//3为已退还
+		workProjectDepositDao.updateStatus(workProjectDeposit);
+		WorkProjectDeposit workProjectDeposit2 = workProjectDepositService.get(workProjectDeposit.getId());
+		request.getSession().setAttribute("pid",workProjectDeposit2.getBidingProject().getId());
+
+		Role role = UserUtils.getSelectRole().get(0);
+		StringBuffer buffer1 = DateUtils.getByEnnme(role.getEnname());
+		buffer1.append("cw");
+		//发起通知给财务
+		WorkProjectNotify workProjectNotify = new WorkProjectNotify();
+		workProjectNotify.setTitle("保证金退还通知");
+		workProjectNotify.setNotifyId(workProjectDeposit.getId());
+		workProjectNotify.setCompanyId(UserUtils.getSelectCompany().getId());
+		workProjectNotify.setContent("保证金退还");
+		workProjectNotify.setRemarks("待通知");
+		workProjectNotify.setNotifyRole(buffer1.toString());
+		workProjectNotify.setType("29");
+		workProjectNotify.setStatus("0");
+		workProjectNotifyService.save(workProjectNotify);
+		//修改总项目归档状态
+		if(workProjectDeposit2.getBidingProject()!=null){
+			WorkBidingProject workBidingProject = workBidingProjectService.get(workProjectDeposit2.getBidingProject().getId());
+			if(getBidState(workBidingProject)&&getMoneyState(workBidingProject)){
+				WorkProject workProject = workProjectService.get(workBidingProject.getWorkProject().getId());
+				workProject.setState("1");//1为能归档
+				workProjectDao.updateStatus(workProject);
+				//通知
+				StringBuffer buffer = DateUtils.getByEnnme(role.getEnname());
+				buffer.append("glygd");//归档管理员角色
+				WorkProjectNotify workProjectNotifyy = new WorkProjectNotify();
+				workProjectNotifyy.setTitle("招标项目相关业务完成,请归档");
+				workProjectNotifyy.setNotifyId(workBidingProject.getId());
+				workProjectNotifyy.setNotifyRole(buffer.toString());
+				workProjectNotifyy.setCompanyId(workBidingProject.getCompanyId());
+				workProjectNotifyy.setContent(workBidingProject.getProjectName()+"已符合归档条件,请归档!");
+				workProjectNotifyy.setType("30");
+				workProjectNotifyy.setStatus("0");
+				workProjectNotifyy.setRemarks("待通知");
+				workProjectNotifyService.save(workProjectNotifyy);
+			}
+		}
+		return "redirect:"+Global.getAdminPath()+"/workaftermath/workAftermath/form";
+	}
+	/**
+	 * 保存项目归档
+	 */
+	@RequestMapping(value = "startposs")
+	public String startposs(WorkBidingProject workBidingProject, Model model, RedirectAttributes redirectAttributes) throws Exception{
+		WorkFullRecord workFullRecord = new WorkFullRecord();
+		WorkBidingProject workBidingProject1 = workBidingProjectService.get(workBidingProject.getId());
+		workFullRecord.setWorkBidingProject(workBidingProject1);
+		workFullRecord.setRecordNumber(workBidingProject1.getProjectNumber());
+		workFullRecord.setRecordName(workBidingProject1.getProjectName());
+		workFullRecord.setStartTime(workBidingProject.getProjectStartDate());
+		workFullRecord.setEndTime(workBidingProject.getProjectEndDate());
+		model.addAttribute("workFullRecord", workFullRecord);
+		if (StringUtils.isNotBlank(workBidingProject.getName()) && workBidingProject.getName().equals("view")){
+			WorkFullRecord workFullRecord1 = workFullRecordService.findUniqueByProperty("work_full_manage_id", workBidingProject.getId());
+			workFullRecord1.setWorkBidingProject(workBidingProject1);
+			workFullRecord1.setRecordNumber(workBidingProject1.getProjectNumber());
+			workFullRecord1.setRecordName(workBidingProject1.getProjectName());
+			model.addAttribute("workFullRecord", workFullRecord1);
+			return "modules/workaftermath/workRecordView";
+		}
+		return "modules/workaftermath/workRecordForm";
+	}
+	/**
+	 * 项目归档
+	 */
+	@RequestMapping(value = "updateRd")
+	public String updateRd(WorkFullRecord workFullRecord,HttpServletRequest request, RedirectAttributes redirectAttributes) {
+
+		String bid=  workFullRecord.getWorkBidingProject().getId();
+		WorkFullRecord workFullManageId = workFullRecordService.findUniqueByProperty("work_full_manage_id", workFullRecord.getWorkBidingProject().getId());
+		if(workFullManageId != null){
+			addMessage(redirectAttributes, "项目归档已申请,不能重新申请");
+			return "redirect:"+Global.getAdminPath()+"/workbidingprojectrd/workBidingProjectrd/list";
+		}
+		WorkBidingProject workBidingProject = workBidingProjectService.get(bid);
+		if(!getBidState(workBidingProject)){
+			addMessage(redirectAttributes, "项目未定标");
+			return "redirect:"+Global.getAdminPath()+"/workbidingprojectrd/workBidingProjectrd/list";
+		}
+		if(!getMoneyState(workBidingProject)){
+			addMessage(redirectAttributes, "项目相关企业保证金未退还");
+			return "redirect:"+Global.getAdminPath()+"/workbidingprojectrd/workBidingProjectrd/list";
+		}
+		//workFullManageId.preInsert();
+		workFullRecord.setCompanyId(UserUtils.getSelectCompany().getId());
+		WorkFullManage w = new WorkFullManage();
+		w.setId(workBidingProject.getId());
+		workFullRecord.setWorkFullManage(w);
+		workFullRecord.setOfficeId(workBidingProject.getOffice()==null?"":workBidingProject.getOffice().getId());
+		workFullRecord.setType("4");
+		workFullRecord.setBackRecordStatus(VarStr.BACKRECORD_STATUS[1]);
+		workFullRecordService.save(workFullRecord);
+
+
+		//Role r = new Role();
+		//r.setEnname(gly.toString());
+		//Role rolegd =  roleDao.getByEnname(r);
+		//List<User> userList = systemService.findUser(new User(new Role(rolegd.getId())));
+		//workFullManageId.setManageUser(userList==null||userList.size()==0?"":userList.get(0).getId());
+		//workFullRecordService.startposs(workFullManageId,variables,false,"4",buffer.toString());//保存
+
+		workBidingProject.setStatus("3");
+		workBidingProjectDao.updateStatus(workBidingProject);
+		addMessage(redirectAttributes, "项目已归档");
+		return "redirect:"+Global.getAdminPath()+"/workbidingprojectrd/workBidingProjectrd/list";
+	}
+	//确定有中标企业
+	public boolean getBidState(WorkBidingProject workBidingProject){
+		int num = 0;
+		List<WorkProjectDeposit> list= workProjectDepositService.findByPid(workBidingProject.getId());
+		for (WorkProjectDeposit workProjectDeposit:
+				list) {
+			if (workProjectDeposit.getBidingState().equals("1")){
+				num++;
+			}
+		}
+		if(num == 0){
+			return false;
+		}else{
+			return true;
+		}
+	}
+	//确定保证金已退还
+	public boolean getMoneyState(WorkBidingProject workBidingProject){
+		int num = 0;
+		List<WorkProjectDeposit> list= workProjectDepositService.findByPid(workBidingProject.getId());
+		for (WorkProjectDeposit workProjectDeposit:
+				list) {
+			if (!workProjectDeposit.getDepositStatus().equals("3")){
+				num++;
+			}
+		}
+		if(num == 0){
+			return true;
+		}else{
+			return false;
+		}
+	}
+}

+ 90 - 0
src/main/java/com/jeeplus/modules/workaftermath/web/WorkBidingProjectMgController.java

@@ -0,0 +1,90 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workaftermath.web;
+
+import com.google.common.collect.Lists;
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.utils.DateUtils;
+import com.jeeplus.common.utils.MyBeanUtils;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.utils.excel.ExportExcel;
+import com.jeeplus.common.utils.excel.ImportExcel;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.modules.sys.entity.Role;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.workbidingproject.entity.WorkBidingProject;
+import com.jeeplus.modules.workbidingproject.service.WorkBidingProjectService;
+import org.apache.shiro.authz.annotation.Logical;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.ConstraintViolationException;
+import java.util.List;
+
+/**
+ * 招标项目Controller
+ * @author
+ * @version
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/workbidingprojectmg/workBidingProjectmg")
+public class WorkBidingProjectMgController extends BaseController {
+
+	@Autowired
+	private WorkBidingProjectService workBidingProjectService;
+
+	@ModelAttribute
+	public WorkBidingProject get(@RequestParam(required=false) String id) {
+		WorkBidingProject entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = workBidingProjectService.get(id);
+		}
+		if (entity == null){
+			entity = new WorkBidingProject();
+		}
+		return entity;
+	}
+
+	/**
+	 * 招标项目信息列表页面
+	 */
+	@RequiresPermissions("workbidingprojectmg:workBidingProjectmg:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(WorkBidingProject workBidingProject, HttpServletRequest request, HttpServletResponse response, Model model) {
+		if(!UserUtils.getSelectOffice().getName().contains("招标")){
+			workBidingProject.setBiddingType("-1");
+			model.addAttribute("status", "1");
+		}else {
+			model.addAttribute("status", "2");
+		}
+		if(!UserUtils.getSelectRoleInfo()){
+			String id = UserUtils.getUser().getId();
+			workBidingProject.setQueryCon(id);
+		}
+		Page<WorkBidingProject> page = workBidingProjectService.findPage(new Page<WorkBidingProject>(request, response), workBidingProject);
+		model.addAttribute("page", page);
+		return "modules/workaftermath/workAftermathmgList";
+	}
+
+	/**
+	 * 查看,增加,编辑招标项目信息表单页面
+	 */
+	//@RequiresPermissions(value={"workbidingproject:workBidingProject:view","workbidingproject:workBidingProject:add","workbidingproject:workBidingProject:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(WorkBidingProject workBidingProject, Model model) {
+		model.addAttribute("workBidingProject", workBidingProject);
+		return "modules/workbidingproject/workBidingProjectForm";
+	}
+}

+ 72 - 0
src/main/java/com/jeeplus/modules/workaftermath/web/WorkBidingProjectRdController.java

@@ -0,0 +1,72 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workaftermath.web;
+
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.modules.sys.entity.Role;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.workbidingproject.entity.WorkBidingProject;
+import com.jeeplus.modules.workbidingproject.service.WorkBidingProjectService;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * 招标项目Controller
+ * @author
+ * @version
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/workbidingprojectrd/workBidingProjectrd")
+public class WorkBidingProjectRdController extends BaseController {
+
+	@Autowired
+	private WorkBidingProjectService workBidingProjectService;
+
+	@ModelAttribute
+	public WorkBidingProject get(@RequestParam(required=false) String id) {
+		WorkBidingProject entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = workBidingProjectService.get(id);
+		}
+		if (entity == null){
+			entity = new WorkBidingProject();
+		}
+		return entity;
+	}
+
+	/**
+	 * 招标项目信息列表页面
+	 */
+	@RequiresPermissions("workbidingprojectrd:workBidingProjectrd:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(WorkBidingProject workBidingProject, HttpServletRequest request, HttpServletResponse response, Model model) {
+		if(!UserUtils.getSelectRoleInfo()){
+			String id = UserUtils.getUser().getId();
+			workBidingProject.setQueryCon(id);
+		}
+		Page<WorkBidingProject> page = workBidingProjectService.findPage(new Page<WorkBidingProject>(request, response), workBidingProject);
+		model.addAttribute("page", page);
+		return "modules/workaftermath/workBidingProjectRdList";
+	}
+
+	/**
+	 * 查看,增加,编辑招标项目信息表单页面
+	 */
+	//@RequiresPermissions(value={"workbidingproject:workBidingProject:view","workbidingproject:workBidingProject:add","workbidingproject:workBidingProject:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(WorkBidingProject workBidingProject, Model model) {
+		model.addAttribute("workBidingProject", workBidingProject);
+		return "modules/workbidingproject/workBidingProjectForm";
+	}
+}

+ 0 - 0
src/main/java/com/jeeplus/modules/workapprovalcopy/dao/ApprovalCopyDao.java


部分文件因文件數量過多而無法顯示