Enford 5 years atrás
parent
commit
62e5761aff
100 changed files with 11372 additions and 0 deletions
  1. 19 0
      src/main/java/com/jeeplus/modules/echarts/dao/ChinaWeatherDataBeanDao.java
  2. 19 0
      src/main/java/com/jeeplus/modules/echarts/dao/PieClassDao.java
  3. 120 0
      src/main/java/com/jeeplus/modules/echarts/entity/ChinaWeatherDataBean.java
  4. 49 0
      src/main/java/com/jeeplus/modules/echarts/entity/PieClass.java
  5. 50 0
      src/main/java/com/jeeplus/modules/echarts/service/ChinaWeatherDataBeanService.java
  6. 50 0
      src/main/java/com/jeeplus/modules/echarts/service/PieClassService.java
  7. 81 0
      src/main/java/com/jeeplus/modules/echarts/web/BarController.java
  8. 268 0
      src/main/java/com/jeeplus/modules/echarts/web/ChinaWeatherDataBeanController.java
  9. 97 0
      src/main/java/com/jeeplus/modules/echarts/web/LineController.java
  10. 51 0
      src/main/java/com/jeeplus/modules/echarts/web/LineDoubleNumController.java
  11. 206 0
      src/main/java/com/jeeplus/modules/echarts/web/PieClassController.java
  12. 34 0
      src/main/java/com/jeeplus/modules/echarts/web/PieController.java
  13. 46 0
      src/main/java/com/jeeplus/modules/echarts/web/RadarController.java
  14. 60 0
      src/main/java/com/jeeplus/modules/esignature/kinggridserver/KingGridServer.java
  15. 45 0
      src/main/java/com/jeeplus/modules/esignature/service/contract/ContractDocService.java
  16. 150 0
      src/main/java/com/jeeplus/modules/esignature/service/contract/ContractService.java
  17. 138 0
      src/main/java/com/jeeplus/modules/esignature/service/contract/ContractWithTemplateService.java
  18. 176 0
      src/main/java/com/jeeplus/modules/esignature/service/docdeal/DealPdfService.java
  19. 160 0
      src/main/java/com/jeeplus/modules/esignature/service/docdeal/DocConvertPdfService.java
  20. 29 0
      src/main/java/com/jeeplus/modules/esignature/service/other/RealNameAuthenticateService.java
  21. 59 0
      src/main/java/com/jeeplus/modules/esignature/service/signer/SignerService.java
  22. 52 0
      src/main/java/com/jeeplus/modules/esignature/utils/Byte2Hex.java
  23. 39 0
      src/main/java/com/jeeplus/modules/esignature/utils/FileHolder.java
  24. 402 0
      src/main/java/com/jeeplus/modules/esignature/utils/HttpRequest.java
  25. 103 0
      src/main/java/com/jeeplus/modules/esignature/utils/MD5.java
  26. 32 0
      src/main/java/com/jeeplus/modules/esignature/utils/StrKit.java
  27. 171 0
      src/main/java/com/jeeplus/modules/esignature/web/EsignatureController.java
  28. 28 0
      src/main/java/com/jeeplus/modules/exampleeconomics/dao/ExampleEconomicsDao.java
  29. 163 0
      src/main/java/com/jeeplus/modules/exampleeconomics/entity/ExampleEconomics.java
  30. 63 0
      src/main/java/com/jeeplus/modules/exampleeconomics/service/ExampleEconomicsService.java
  31. 196 0
      src/main/java/com/jeeplus/modules/exampleeconomics/web/ExampleEconomicsController.java
  32. 27 0
      src/main/java/com/jeeplus/modules/exampleexpend/dao/ExampleExpendDao.java
  33. 175 0
      src/main/java/com/jeeplus/modules/exampleexpend/entity/ExampleExpend.java
  34. 63 0
      src/main/java/com/jeeplus/modules/exampleexpend/service/ExampleExpendService.java
  35. 196 0
      src/main/java/com/jeeplus/modules/exampleexpend/web/ExampleExpendController.java
  36. 26 0
      src/main/java/com/jeeplus/modules/exampleproject/dao/ExampleProjectDao.java
  37. 152 0
      src/main/java/com/jeeplus/modules/exampleproject/entity/ExampleProject.java
  38. 63 0
      src/main/java/com/jeeplus/modules/exampleproject/service/ExampleProjectService.java
  39. 196 0
      src/main/java/com/jeeplus/modules/exampleproject/web/ExampleProjectController.java
  40. 26 0
      src/main/java/com/jeeplus/modules/examplesingle/dao/ExampleSingleDao.java
  41. 163 0
      src/main/java/com/jeeplus/modules/examplesingle/entity/ExampleSingle.java
  42. 61 0
      src/main/java/com/jeeplus/modules/examplesingle/service/ExampleSingleService.java
  43. 196 0
      src/main/java/com/jeeplus/modules/examplesingle/web/ExampleSingleController.java
  44. 123 0
      src/main/java/com/jeeplus/modules/filePreview/FileSplit.java
  45. 36 0
      src/main/java/com/jeeplus/modules/filePreview/OSSRequestSigner.java
  46. 107 0
      src/main/java/com/jeeplus/modules/filePreview/OssUpload.java
  47. 273 0
      src/main/java/com/jeeplus/modules/filePreview/PreviewController.java
  48. 27 0
      src/main/java/com/jeeplus/modules/hr/dao/UserInfoDao.java
  49. 455 0
      src/main/java/com/jeeplus/modules/hr/entity/UserInfo.java
  50. 268 0
      src/main/java/com/jeeplus/modules/hr/service/UserInfoService.java
  51. 143 0
      src/main/java/com/jeeplus/modules/hr/web/CertificateController.java
  52. 137 0
      src/main/java/com/jeeplus/modules/hr/web/EvaluationController.java
  53. 135 0
      src/main/java/com/jeeplus/modules/hr/web/JobResumeController.java
  54. 241 0
      src/main/java/com/jeeplus/modules/hr/web/UserInfoController.java
  55. 45 0
      src/main/java/com/jeeplus/modules/iim/dao/ChatHistoryDao.java
  56. 19 0
      src/main/java/com/jeeplus/modules/iim/dao/LayGroupDao.java
  57. 19 0
      src/main/java/com/jeeplus/modules/iim/dao/LayGroupUserDao.java
  58. 20 0
      src/main/java/com/jeeplus/modules/iim/dao/MailBoxDao.java
  59. 18 0
      src/main/java/com/jeeplus/modules/iim/dao/MailComposeDao.java
  60. 18 0
      src/main/java/com/jeeplus/modules/iim/dao/MailDao.java
  61. 26 0
      src/main/java/com/jeeplus/modules/iim/dao/MyCalendarDao.java
  62. 81 0
      src/main/java/com/jeeplus/modules/iim/entity/ChatHistory.java
  63. 69 0
      src/main/java/com/jeeplus/modules/iim/entity/Friend.java
  64. 52 0
      src/main/java/com/jeeplus/modules/iim/entity/FriendGroup.java
  65. 25 0
      src/main/java/com/jeeplus/modules/iim/entity/LayFileJsonData.java
  66. 60 0
      src/main/java/com/jeeplus/modules/iim/entity/LayGroup.java
  67. 41 0
      src/main/java/com/jeeplus/modules/iim/entity/LayGroupJsonData.java
  68. 61 0
      src/main/java/com/jeeplus/modules/iim/entity/LayGroupUser.java
  69. 33 0
      src/main/java/com/jeeplus/modules/iim/entity/LayJson.java
  70. 45 0
      src/main/java/com/jeeplus/modules/iim/entity/LayJsonData.java
  71. 75 0
      src/main/java/com/jeeplus/modules/iim/entity/Mail.java
  72. 81 0
      src/main/java/com/jeeplus/modules/iim/entity/MailBox.java
  73. 150 0
      src/main/java/com/jeeplus/modules/iim/entity/MailCompose.java
  74. 109 0
      src/main/java/com/jeeplus/modules/iim/entity/MailPage.java
  75. 51 0
      src/main/java/com/jeeplus/modules/iim/entity/Mine.java
  76. 137 0
      src/main/java/com/jeeplus/modules/iim/entity/MyCalendar.java
  77. 69 0
      src/main/java/com/jeeplus/modules/iim/service/ChatHistoryService.java
  78. 263 0
      src/main/java/com/jeeplus/modules/iim/service/LayGroupService.java
  79. 56 0
      src/main/java/com/jeeplus/modules/iim/service/MailBoxService.java
  80. 56 0
      src/main/java/com/jeeplus/modules/iim/service/MailComposeService.java
  81. 135 0
      src/main/java/com/jeeplus/modules/iim/service/MailService.java
  82. 154 0
      src/main/java/com/jeeplus/modules/iim/service/MyCalendarService.java
  83. 53 0
      src/main/java/com/jeeplus/modules/iim/utils/DateUtil.java
  84. 197 0
      src/main/java/com/jeeplus/modules/iim/web/ChatHistoryController.java
  85. 544 0
      src/main/java/com/jeeplus/modules/iim/web/ContactController.java
  86. 50 0
      src/main/java/com/jeeplus/modules/iim/web/EasemobGroupController.java
  87. 288 0
      src/main/java/com/jeeplus/modules/iim/web/LayGroupController.java
  88. 162 0
      src/main/java/com/jeeplus/modules/iim/web/MailBoxController.java
  89. 310 0
      src/main/java/com/jeeplus/modules/iim/web/MailComposeController.java
  90. 93 0
      src/main/java/com/jeeplus/modules/iim/web/MailController.java
  91. 364 0
      src/main/java/com/jeeplus/modules/iim/web/MyCalendarController.java
  92. 22 0
      src/main/java/com/jeeplus/modules/isignature/dao/ISignatureDocumentDao.java
  93. 112 0
      src/main/java/com/jeeplus/modules/isignature/entity/ISignatureDocument.java
  94. 171 0
      src/main/java/com/jeeplus/modules/isignature/entity/iDBManager2000.java
  95. 74 0
      src/main/java/com/jeeplus/modules/isignature/service/ConverterDocument.java
  96. 225 0
      src/main/java/com/jeeplus/modules/isignature/service/ISignatureDocumentService.java
  97. 212 0
      src/main/java/com/jeeplus/modules/isignature/web/ISignatureDocumentController.java
  98. 39 0
      src/main/java/com/jeeplus/modules/isignature/workthread/ImageConvertThread.java
  99. 43 0
      src/main/java/com/jeeplus/modules/leaveapply/dao/LeaveApplyDao.java
  100. 0 0
      src/main/java/com/jeeplus/modules/leaveapply/dao/LeaveCountDao.java

+ 19 - 0
src/main/java/com/jeeplus/modules/echarts/dao/ChinaWeatherDataBeanDao.java

@@ -0,0 +1,19 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.echarts.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.echarts.entity.ChinaWeatherDataBean;
+
+/**
+ * 城市气温DAO接口
+ * @author lgf
+ * @version 2016-06-02
+ */
+@MyBatisDao
+public interface ChinaWeatherDataBeanDao extends CrudDao<ChinaWeatherDataBean> {
+
+	
+}

+ 19 - 0
src/main/java/com/jeeplus/modules/echarts/dao/PieClassDao.java

@@ -0,0 +1,19 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.echarts.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.echarts.entity.PieClass;
+
+/**
+ * 班级DAO接口
+ * @author lgf
+ * @version 2016-05-26
+ */
+@MyBatisDao
+public interface PieClassDao extends CrudDao<PieClass> {
+
+	
+}

+ 120 - 0
src/main/java/com/jeeplus/modules/echarts/entity/ChinaWeatherDataBean.java

@@ -0,0 +1,120 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.echarts.entity;
+
+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-06-02
+ */
+public class ChinaWeatherDataBean extends DataEntity<ChinaWeatherDataBean> {
+	
+	private static final long serialVersionUID = 1L;
+	private Date datestr;		// 日期
+	private Double beijingMaxTemp;		// 北京最高气温
+	private Double beijingMinTemp;		// 北京最低气温
+	private Double changchunMaxTemp;		// 长春最高气温
+	private Double changchunMinTemp;		// 长春最低气温
+	private Double shenyangMaxTemp;		// 沈阳最高气温
+	private Double shenyangMinTemp;		// 沈阳最低气温
+	private Double haerbinMaxTemp;		// 哈尔滨最高气温
+	private Double haerbinMinTemp;		// 哈尔滨最低气温
+	
+	public ChinaWeatherDataBean() {
+		super();
+	}
+
+	public ChinaWeatherDataBean(String id){
+		super(id);
+	}
+
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@ExcelField(title="日期", align=2, sort=7)
+	public Date getDatestr() {
+		return datestr;
+	}
+
+	public void setDatestr(Date datestr) {
+		this.datestr = datestr;
+	}
+	
+	@ExcelField(title="北京最高气温", align=2, sort=8)
+	public Double getBeijingMaxTemp() {
+		return beijingMaxTemp;
+	}
+
+	public void setBeijingMaxTemp(Double beijingMaxTemp) {
+		this.beijingMaxTemp = beijingMaxTemp;
+	}
+	
+	@ExcelField(title="北京最低气温", align=2, sort=9)
+	public Double getBeijingMinTemp() {
+		return beijingMinTemp;
+	}
+
+	public void setBeijingMinTemp(Double beijingMinTemp) {
+		this.beijingMinTemp = beijingMinTemp;
+	}
+	
+	@ExcelField(title="长春最高气温", align=2, sort=10)
+	public Double getChangchunMaxTemp() {
+		return changchunMaxTemp;
+	}
+
+	public void setChangchunMaxTemp(Double changchunMaxTemp) {
+		this.changchunMaxTemp = changchunMaxTemp;
+	}
+	
+	@ExcelField(title="长春最低气温", align=2, sort=11)
+	public Double getChangchunMinTemp() {
+		return changchunMinTemp;
+	}
+
+	public void setChangchunMinTemp(Double changchunMinTemp) {
+		this.changchunMinTemp = changchunMinTemp;
+	}
+	
+	@ExcelField(title="沈阳最高气温", align=2, sort=12)
+	public Double getShenyangMaxTemp() {
+		return shenyangMaxTemp;
+	}
+
+	public void setShenyangMaxTemp(Double shenyangMaxTemp) {
+		this.shenyangMaxTemp = shenyangMaxTemp;
+	}
+	
+	@ExcelField(title="沈阳最低气温", align=2, sort=13)
+	public Double getShenyangMinTemp() {
+		return shenyangMinTemp;
+	}
+
+	public void setShenyangMinTemp(Double shenyangMinTemp) {
+		this.shenyangMinTemp = shenyangMinTemp;
+	}
+	
+	@ExcelField(title="哈尔滨最高气温", align=2, sort=14)
+	public Double getHaerbinMaxTemp() {
+		return haerbinMaxTemp;
+	}
+
+	public void setHaerbinMaxTemp(Double haerbinMaxTemp) {
+		this.haerbinMaxTemp = haerbinMaxTemp;
+	}
+	
+	@ExcelField(title="哈尔滨最低气温", align=2, sort=15)
+	public Double getHaerbinMinTemp() {
+		return haerbinMinTemp;
+	}
+
+	public void setHaerbinMinTemp(Double haerbinMinTemp) {
+		this.haerbinMinTemp = haerbinMinTemp;
+	}
+	
+}

+ 49 - 0
src/main/java/com/jeeplus/modules/echarts/entity/PieClass.java

@@ -0,0 +1,49 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.echarts.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-05-26
+ */
+public class PieClass extends DataEntity<PieClass> {
+	
+	private static final long serialVersionUID = 1L;
+	private String className;		// 班级
+	private Integer num;		// 人数
+	
+	public PieClass() {
+		super();
+	}
+
+	public PieClass(String id){
+		super(id);
+	}
+
+	@Length(min=0, max=64, message="班级长度必须介于 0 和 64 之间")
+	@ExcelField(title="班级", align=2, sort=7)
+	public String getClassName() {
+		return className;
+	}
+
+	public void setClassName(String className) {
+		this.className = className;
+	}
+	
+	@ExcelField(title="人数", align=2, sort=8)
+	public Integer getNum() {
+		return num;
+	}
+
+	public void setNum(Integer num) {
+		this.num = num;
+	}
+	
+}

+ 50 - 0
src/main/java/com/jeeplus/modules/echarts/service/ChinaWeatherDataBeanService.java

@@ -0,0 +1,50 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.echarts.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.echarts.entity.ChinaWeatherDataBean;
+import com.jeeplus.modules.echarts.dao.ChinaWeatherDataBeanDao;
+
+/**
+ * 城市气温Service
+ * @author lgf
+ * @version 2016-06-02
+ */
+@Service
+@Transactional(readOnly = true)
+public class ChinaWeatherDataBeanService extends CrudService<ChinaWeatherDataBeanDao, ChinaWeatherDataBean> {
+
+	public ChinaWeatherDataBean get(String id) {
+		return super.get(id);
+	}
+	
+	public List<ChinaWeatherDataBean> findList(ChinaWeatherDataBean chinaWeatherDataBean) {
+		return super.findList(chinaWeatherDataBean);
+	}
+	
+	public Page<ChinaWeatherDataBean> findPage(Page<ChinaWeatherDataBean> page, ChinaWeatherDataBean chinaWeatherDataBean) {
+		return super.findPage(page, chinaWeatherDataBean);
+	}
+	
+	@Transactional(readOnly = false)
+	public void save(ChinaWeatherDataBean chinaWeatherDataBean) {
+		super.save(chinaWeatherDataBean);
+	}
+	
+	@Transactional(readOnly = false)
+	public void delete(ChinaWeatherDataBean chinaWeatherDataBean) {
+		super.delete(chinaWeatherDataBean);
+	}
+	
+	
+	
+	
+}

+ 50 - 0
src/main/java/com/jeeplus/modules/echarts/service/PieClassService.java

@@ -0,0 +1,50 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.echarts.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.echarts.entity.PieClass;
+import com.jeeplus.modules.echarts.dao.PieClassDao;
+
+/**
+ * 班级Service
+ * @author lgf
+ * @version 2016-05-26
+ */
+@Service
+@Transactional(readOnly = true)
+public class PieClassService extends CrudService<PieClassDao, PieClass> {
+
+	public PieClass get(String id) {
+		return super.get(id);
+	}
+	
+	public List<PieClass> findList(PieClass pieClass) {
+		return super.findList(pieClass);
+	}
+	
+	public Page<PieClass> findPage(Page<PieClass> page, PieClass pieClass) {
+		return super.findPage(page, pieClass);
+	}
+	
+	@Transactional(readOnly = false)
+	public void save(PieClass pieClass) {
+		super.save(pieClass);
+	}
+	
+	@Transactional(readOnly = false)
+	public void delete(PieClass pieClass) {
+		super.delete(pieClass);
+	}
+	
+	
+	
+	
+}

+ 81 - 0
src/main/java/com/jeeplus/modules/echarts/web/BarController.java

@@ -0,0 +1,81 @@
+package com.jeeplus.modules.echarts.web;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+
+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;
+
+@Controller
+@RequestMapping(value = "${adminPath}/echarts/bar")
+public class BarController extends BaseController {
+	private static final long serialVersionUID = -6886697421555222670L;
+	
+	private List<String> xAxisData;
+	private Map<String,List<Double>> yAxisData;
+	private Map<String,Integer> yAxisIndex;
+	
+	@RequestMapping(value = {"index", ""})
+	public String index( HttpServletRequest request, HttpServletResponse response, Model model) {
+		
+		//x轴数据
+		request.setAttribute("xAxisData", getxAxisData());
+		//y轴数据
+		request.setAttribute("yAxisData", getyAxisData());
+		//Y轴双轴情况下的位置定位
+		request.setAttribute("yAxisIndex", getyAxisIndex());
+		
+		return "modules/echarts/bar";
+	}
+	
+	public List<String> getxAxisData(){
+		xAxisData = new ArrayList<String>();
+		xAxisData.add("2015-10-10");
+		xAxisData.add("2015-10-11");
+		xAxisData.add("2015-10-12");
+		xAxisData.add("2015-10-13");
+		xAxisData.add("2015-10-14");
+		return xAxisData;
+	}
+	
+	public Map<String,List<Double>> getyAxisData(){
+		Random random = new Random();
+		yAxisData = new HashMap<String,List<Double>>();
+		
+		List<Double> data1 = new ArrayList<Double>();
+		data1.add(random.nextDouble());
+		data1.add(random.nextDouble());
+		data1.add(random.nextDouble());
+		data1.add(random.nextDouble());
+		data1.add(random.nextDouble());
+		yAxisData.put("柱状一", data1);
+		
+		List<Double> data2 = new ArrayList<Double>();
+		data2.add(random.nextDouble());
+		data2.add(random.nextDouble());
+		data2.add(random.nextDouble());
+		data2.add(random.nextDouble());
+		data2.add(random.nextDouble());
+		yAxisData.put("柱状二", data2);
+		
+		return yAxisData;
+	}
+	
+	public Map<String,Integer> getyAxisIndex(){
+		yAxisIndex = new HashMap<String,Integer>();
+		yAxisIndex.put("柱状一", 0);
+		yAxisIndex.put("柱状二", 1);
+		return yAxisIndex;
+	}
+	
+	
+
+}

+ 268 - 0
src/main/java/com/jeeplus/modules/echarts/web/ChinaWeatherDataBeanController.java

@@ -0,0 +1,268 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.echarts.web;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+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.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.echarts.entity.ChinaWeatherDataBean;
+import com.jeeplus.modules.echarts.service.ChinaWeatherDataBeanService;
+
+/**
+ * 城市气温Controller
+ * @author lgf
+ * @version 2016-05-26
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/echarts/chinaWeatherDataBean")
+public class ChinaWeatherDataBeanController extends BaseController {
+
+	@Autowired
+	private ChinaWeatherDataBeanService chinaWeatherDataBeanService;
+	
+	@ModelAttribute
+	public ChinaWeatherDataBean get(@RequestParam(required=false) String id) {
+		ChinaWeatherDataBean entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = chinaWeatherDataBeanService.get(id);
+		}
+		if (entity == null){
+			entity = new ChinaWeatherDataBean();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 城市气温列表页面
+	 */
+	@RequiresPermissions("echarts:chinaWeatherDataBean:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(ChinaWeatherDataBean chinaWeatherDataBean, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<ChinaWeatherDataBean> page = chinaWeatherDataBeanService.findPage(new Page<ChinaWeatherDataBean>(request, response), chinaWeatherDataBean); 
+		model.addAttribute("page", page);
+		
+		
+		//折线图列表数据
+		//X轴的数据
+		List<String> xAxisData= new ArrayList<String>();
+		//Y轴的数据
+		Map<String,List<Double>> yAxisData = new HashMap<String,List<Double>>();
+		//Y轴双轴情况下的位置定位
+		Map<String,Integer> yAxisIndex = new HashMap<String,Integer>();
+		
+		List<ChinaWeatherDataBean> weatherDataList= chinaWeatherDataBeanService.findList(chinaWeatherDataBean);
+		
+		List<Double> beijingMaxTemp = new ArrayList<Double>();
+		List<Double> beijingMinTemp = new ArrayList<Double>();
+		List<Double> changchunMaxTemp = new ArrayList<Double>();
+		List<Double> changchunMinTemp = new ArrayList<Double>();
+		List<Double> shenyangMaxTemp = new ArrayList<Double>();
+		List<Double> shenyangMinTemp = new ArrayList<Double>();
+		List<Double> haerbinMaxTemp = new ArrayList<Double>();
+		List<Double> haerbinMinTemp = new ArrayList<Double>();
+		
+		for(ChinaWeatherDataBean chinaWeatherDataBeanTemp:weatherDataList){
+			//x轴数据
+			xAxisData.add(chinaWeatherDataBeanTemp.getDatestr().toLocaleString());
+			//北京最高温度
+			beijingMaxTemp.add(chinaWeatherDataBeanTemp.getBeijingMaxTemp());
+			//北京最低温度
+			beijingMinTemp.add(chinaWeatherDataBeanTemp.getBeijingMinTemp());
+			//长春最高温度
+			changchunMaxTemp.add(chinaWeatherDataBeanTemp.getChangchunMaxTemp());
+			//长春最高温度
+			changchunMinTemp.add(chinaWeatherDataBeanTemp.getChangchunMinTemp());
+			//沈阳最高温度
+			shenyangMaxTemp.add(chinaWeatherDataBeanTemp.getShenyangMaxTemp());
+			//沈阳最高温度
+			shenyangMinTemp.add(chinaWeatherDataBeanTemp.getShenyangMinTemp());
+			//哈尔滨最高温度
+			haerbinMaxTemp.add(chinaWeatherDataBeanTemp.getHaerbinMaxTemp());
+			//哈尔滨最高温度
+			haerbinMinTemp.add(chinaWeatherDataBeanTemp.getHaerbinMinTemp());
+			
+		}
+		
+		//y轴数据
+		yAxisData.put("北京 最高温度", beijingMaxTemp);
+		yAxisData.put("北京 最低温度", beijingMinTemp);
+		yAxisData.put("长春 最高温度", changchunMaxTemp);
+		yAxisData.put("长春 最低温度", changchunMinTemp);
+		yAxisData.put("沈阳 最高温度", shenyangMaxTemp);
+		yAxisData.put("沈阳 最低温度", shenyangMinTemp);
+		yAxisData.put("哈尔滨 最高温度", haerbinMinTemp);
+		yAxisData.put("哈尔滨 最低温度", haerbinMinTemp);
+		
+		//Y轴双轴情况下的位置定位
+		yAxisIndex.put("北京 最高温度", 0);//0表示Y轴左轴
+		yAxisIndex.put("长春 最高温度", 0);//0表示Y轴左轴
+		yAxisIndex.put("沈阳 最高温度", 0);//0表示Y轴左轴
+		yAxisIndex.put("哈尔滨 最高温度", 0);//0表示Y轴左轴
+		yAxisIndex.put("北京 最低温度", 1);//1表示Y轴右轴
+		yAxisIndex.put("长春 最低温度", 1);//1表示Y轴右轴
+		yAxisIndex.put("沈阳 最低温度", 1);//1表示Y轴右轴
+		yAxisIndex.put("哈尔滨 最低温度", 1);//1表示Y轴右轴
+		
+		request.setAttribute("yAxisIndex", yAxisIndex);
+		request.setAttribute("xAxisData", xAxisData);
+		request.setAttribute("yAxisData", yAxisData);
+		
+		
+		
+		return "modules/echarts/chinaWeatherDataBeanList";
+	}
+
+	/**
+	 * 查看,增加,编辑城市气温表单页面
+	 */
+	@RequiresPermissions(value={"echarts:chinaWeatherDataBean:view","echarts:chinaWeatherDataBean:add","echarts:chinaWeatherDataBean:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(ChinaWeatherDataBean chinaWeatherDataBean, Model model) {
+		model.addAttribute("chinaWeatherDataBean", chinaWeatherDataBean);
+		return "modules/echarts/chinaWeatherDataBeanForm";
+	}
+
+	/**
+	 * 保存城市气温
+	 */
+	@RequiresPermissions(value={"echarts:chinaWeatherDataBean:add","echarts:chinaWeatherDataBean:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	public String save(ChinaWeatherDataBean chinaWeatherDataBean, Model model, RedirectAttributes redirectAttributes) throws Exception{
+		if (!beanValidator(model, chinaWeatherDataBean)){
+			return form(chinaWeatherDataBean, model);
+		}
+		if(!chinaWeatherDataBean.getIsNewRecord()){//编辑表单保存
+			ChinaWeatherDataBean t = chinaWeatherDataBeanService.get(chinaWeatherDataBean.getId());//从数据库取出记录的值
+			MyBeanUtils.copyBeanNotNull2Bean(chinaWeatherDataBean, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+			chinaWeatherDataBeanService.save(t);//保存
+		}else{//新增表单保存
+			chinaWeatherDataBeanService.save(chinaWeatherDataBean);//保存
+		}
+		addMessage(redirectAttributes, "保存城市气温成功");
+		return "redirect:"+Global.getAdminPath()+"/echarts/chinaWeatherDataBean/?repage";
+	}
+	
+	/**
+	 * 删除城市气温
+	 */
+	@RequiresPermissions("echarts:chinaWeatherDataBean:del")
+	@RequestMapping(value = "delete")
+	public String delete(ChinaWeatherDataBean chinaWeatherDataBean, RedirectAttributes redirectAttributes) {
+		chinaWeatherDataBeanService.delete(chinaWeatherDataBean);
+		addMessage(redirectAttributes, "删除城市气温成功");
+		return "redirect:"+Global.getAdminPath()+"/echarts/chinaWeatherDataBean/?repage";
+	}
+	
+	/**
+	 * 批量删除城市气温
+	 */
+	@RequiresPermissions("echarts:chinaWeatherDataBean:del")
+	@RequestMapping(value = "deleteAll")
+	public String deleteAll(String ids, RedirectAttributes redirectAttributes) {
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			chinaWeatherDataBeanService.delete(chinaWeatherDataBeanService.get(id));
+		}
+		addMessage(redirectAttributes, "删除城市气温成功");
+		return "redirect:"+Global.getAdminPath()+"/echarts/chinaWeatherDataBean/?repage";
+	}
+	
+	/**
+	 * 导出excel文件
+	 */
+	@RequiresPermissions("echarts:chinaWeatherDataBean:export")
+    @RequestMapping(value = "export", method=RequestMethod.POST)
+    public String exportFile(ChinaWeatherDataBean chinaWeatherDataBean, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "城市气温"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            Page<ChinaWeatherDataBean> page = chinaWeatherDataBeanService.findPage(new Page<ChinaWeatherDataBean>(request, response, -1), chinaWeatherDataBean);
+    		new ExportExcel("城市气温", ChinaWeatherDataBean.class).setDataList(page.getList()).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导出城市气温记录失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/echarts/chinaWeatherDataBean/?repage";
+    }
+
+	/**
+	 * 导入Excel数据
+
+	 */
+	@RequiresPermissions("echarts:chinaWeatherDataBean: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<ChinaWeatherDataBean> list = ei.getDataList(ChinaWeatherDataBean.class);
+			for (ChinaWeatherDataBean chinaWeatherDataBean : list){
+				try{
+					chinaWeatherDataBeanService.save(chinaWeatherDataBean);
+					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()+"/echarts/chinaWeatherDataBean/?repage";
+    }
+	
+	/**
+	 * 下载导入城市气温数据模板
+	 */
+	@RequiresPermissions("echarts:chinaWeatherDataBean:import")
+    @RequestMapping(value = "import/template")
+    public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "城市气温数据导入模板.xlsx";
+    		List<ChinaWeatherDataBean> list = Lists.newArrayList(); 
+    		new ExportExcel("城市气温数据", ChinaWeatherDataBean.class, 1).setDataList(list).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入模板下载失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/echarts/chinaWeatherDataBean/?repage";
+    }
+	
+	
+	
+
+}

+ 97 - 0
src/main/java/com/jeeplus/modules/echarts/web/LineController.java

@@ -0,0 +1,97 @@
+package com.jeeplus.modules.echarts.web;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+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.web.BaseController;
+import com.jeeplus.modules.echarts.entity.ChinaWeatherDataBean;
+import com.jeeplus.modules.echarts.service.ChinaWeatherDataBeanService;
+@Controller
+@RequestMapping(value = "${adminPath}/echarts/line")
+public class LineController extends BaseController {
+	
+	private static final long serialVersionUID = -6886697421555222670L;
+	
+	@Autowired
+	private ChinaWeatherDataBeanService chinaWeatherDataBeanService;
+	
+	@RequestMapping(value = {"index", ""})
+	public String index(ChinaWeatherDataBean chinaWeatherDataBean, HttpServletRequest request, HttpServletResponse response, Model model) {
+		
+		//X轴的数据
+		List<String> xAxisData= new ArrayList<String>();
+		//Y轴的数据
+		Map<String,List<Double>> yAxisData = new HashMap<String,List<Double>>();
+		//Y轴双轴情况下的位置定位
+		Map<String,Integer> yAxisIndex = new HashMap<String,Integer>();
+		
+		List<ChinaWeatherDataBean> weatherDataList= chinaWeatherDataBeanService.findList(chinaWeatherDataBean);
+		
+		List<Double> beijingMaxTemp = new ArrayList<Double>();
+		List<Double> beijingMinTemp = new ArrayList<Double>();
+		List<Double> changchunMaxTemp = new ArrayList<Double>();
+		List<Double> changchunMinTemp = new ArrayList<Double>();
+		List<Double> shenyangMaxTemp = new ArrayList<Double>();
+		List<Double> shenyangMinTemp = new ArrayList<Double>();
+		List<Double> haerbinMaxTemp = new ArrayList<Double>();
+		List<Double> haerbinMinTemp = new ArrayList<Double>();
+		
+		for(ChinaWeatherDataBean chinaWeatherDataBeanTemp:weatherDataList){
+			//x轴数据
+			xAxisData.add(chinaWeatherDataBeanTemp.getDatestr().toLocaleString());
+			//北京最高温度
+			beijingMaxTemp.add(chinaWeatherDataBeanTemp.getBeijingMaxTemp());
+			//北京最低温度
+			beijingMinTemp.add(chinaWeatherDataBeanTemp.getBeijingMinTemp());
+			//长春最高温度
+			changchunMaxTemp.add(chinaWeatherDataBeanTemp.getChangchunMaxTemp());
+			//长春最高温度
+			changchunMinTemp.add(chinaWeatherDataBeanTemp.getChangchunMinTemp());
+			//沈阳最高温度
+			shenyangMaxTemp.add(chinaWeatherDataBeanTemp.getShenyangMaxTemp());
+			//沈阳最高温度
+			shenyangMinTemp.add(chinaWeatherDataBeanTemp.getShenyangMinTemp());
+			//哈尔滨最高温度
+			haerbinMaxTemp.add(chinaWeatherDataBeanTemp.getHaerbinMaxTemp());
+			//哈尔滨最高温度
+			haerbinMinTemp.add(chinaWeatherDataBeanTemp.getHaerbinMinTemp());
+			
+		}
+		
+		//y轴数据
+		yAxisData.put("北京 最高温度", beijingMaxTemp);
+		yAxisData.put("北京 最低温度", beijingMinTemp);
+		yAxisData.put("长春 最高温度", changchunMaxTemp);
+		yAxisData.put("长春 最低温度", changchunMinTemp);
+		yAxisData.put("沈阳 最高温度", shenyangMaxTemp);
+		yAxisData.put("沈阳 最低温度", shenyangMinTemp);
+		yAxisData.put("哈尔滨 最高温度", haerbinMinTemp);
+		yAxisData.put("哈尔滨 最低温度", haerbinMinTemp);
+		
+		//Y轴双轴情况下的位置定位
+		yAxisIndex.put("北京 最高温度", 0);//0表示Y轴左轴
+		yAxisIndex.put("长春 最高温度", 0);//0表示Y轴左轴
+		yAxisIndex.put("沈阳 最高温度", 0);//0表示Y轴左轴
+		yAxisIndex.put("哈尔滨 最高温度", 0);//0表示Y轴左轴
+		yAxisIndex.put("北京 最低温度", 1);//1表示Y轴右轴
+		yAxisIndex.put("长春 最低温度", 1);//1表示Y轴右轴
+		yAxisIndex.put("沈阳 最低温度", 1);//1表示Y轴右轴
+		yAxisIndex.put("哈尔滨 最低温度", 1);//1表示Y轴右轴
+		
+		request.setAttribute("yAxisIndex", yAxisIndex);
+		request.setAttribute("xAxisData", xAxisData);
+		request.setAttribute("yAxisData", yAxisData);
+		return "modules/echarts/line";
+	}
+	
+}

+ 51 - 0
src/main/java/com/jeeplus/modules/echarts/web/LineDoubleNumController.java

@@ -0,0 +1,51 @@
+package com.jeeplus.modules.echarts.web;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Random;
+
+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;
+@Controller
+@RequestMapping(value = "${adminPath}/echarts/linedoublenum")
+public class LineDoubleNumController extends BaseController {
+	private static final long serialVersionUID = -6886697421555222670L;
+	
+	private Map<String,Double[][]> axisDataArr;
+
+	@RequestMapping(value = {"index", ""})
+	public String index( HttpServletRequest request, HttpServletResponse response, Model model) {
+
+		//x+y轴数据Double[x轴数据][y轴数据]
+		request.setAttribute("axisDataArr", getaxisDataArr());
+		return "modules/echarts/lineDoubleNum";
+	}
+	
+	public Map<String,Double[][]> getaxisDataArr(){
+		
+		Random random = new Random();
+		axisDataArr = new HashMap<String,Double[][]>();
+		
+		Double[][] data1 = new Double[10][2];
+		for(int i=0;i<10;i++){
+			data1[i][0]=i+0.0;
+			data1[i][1]=random.nextInt(10)+0.0;
+		}
+		axisDataArr.put("曲线一", data1);
+		
+		Double[][] data2 = new Double[10][2];
+		for(int i=0;i<10;i++){
+			data2[i][0]=i+1.0;
+			data2[i][1]=random.nextInt(10)+0.0;
+		}
+		axisDataArr.put("曲线二", data2);
+		
+		return axisDataArr;
+	}	
+
+}

+ 206 - 0
src/main/java/com/jeeplus/modules/echarts/web/PieClassController.java

@@ -0,0 +1,206 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.echarts.web;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+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.echarts.entity.PieClass;
+import com.jeeplus.modules.echarts.service.PieClassService;
+
+/**
+ * 班级Controller
+ * @author lgf
+ * @version 2016-05-26
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/echarts/pieClass")
+public class PieClassController extends BaseController {
+
+	@Autowired
+	private PieClassService pieClassService;
+	
+	@ModelAttribute
+	public PieClass get(@RequestParam(required=false) String id) {
+		PieClass entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = pieClassService.get(id);
+		}
+		if (entity == null){
+			entity = new PieClass();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 班级列表页面
+	 */
+	@RequiresPermissions("echarts:pieClass:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(PieClass pieClass, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<PieClass> page = pieClassService.findPage(new Page<PieClass>(request, response), pieClass); 
+		model.addAttribute("page", page);
+		
+		//生成报表数据
+		Map<String,Object> orientData = new HashMap<String,Object>();
+		List<PieClass> list = pieClassService.findList(pieClass);
+		for(PieClass pie:list){
+			orientData.put(pie.getClassName(), pie.getNum());
+		}
+		model.addAttribute("orientData", orientData);
+		return "modules/echarts/pieClassList";
+	}
+
+	/**
+	 * 查看,增加,编辑班级表单页面
+	 */
+	@RequiresPermissions(value={"echarts:pieClass:view","echarts:pieClass:add","echarts:pieClass:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(PieClass pieClass, Model model) {
+		model.addAttribute("pieClass", pieClass);
+		return "modules/echarts/pieClassForm";
+	}
+
+	/**
+	 * 保存班级
+	 */
+	@RequiresPermissions(value={"echarts:pieClass:add","echarts:pieClass:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	public String save(PieClass pieClass, Model model, RedirectAttributes redirectAttributes) throws Exception{
+		if (!beanValidator(model, pieClass)){
+			return form(pieClass, model);
+		}
+		if(!pieClass.getIsNewRecord()){//编辑表单保存
+			PieClass t = pieClassService.get(pieClass.getId());//从数据库取出记录的值
+			MyBeanUtils.copyBeanNotNull2Bean(pieClass, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+			pieClassService.save(t);//保存
+		}else{//新增表单保存
+			pieClassService.save(pieClass);//保存
+		}
+		addMessage(redirectAttributes, "保存班级成功");
+		return "redirect:"+Global.getAdminPath()+"/echarts/pieClass/?repage";
+	}
+	
+	/**
+	 * 删除班级
+	 */
+	@RequiresPermissions("echarts:pieClass:del")
+	@RequestMapping(value = "delete")
+	public String delete(PieClass pieClass, RedirectAttributes redirectAttributes) {
+		pieClassService.delete(pieClass);
+		addMessage(redirectAttributes, "删除班级成功");
+		return "redirect:"+Global.getAdminPath()+"/echarts/pieClass/?repage";
+	}
+	
+	/**
+	 * 批量删除班级
+	 */
+	@RequiresPermissions("echarts:pieClass:del")
+	@RequestMapping(value = "deleteAll")
+	public String deleteAll(String ids, RedirectAttributes redirectAttributes) {
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			pieClassService.delete(pieClassService.get(id));
+		}
+		addMessage(redirectAttributes, "删除班级成功");
+		return "redirect:"+Global.getAdminPath()+"/echarts/pieClass/?repage";
+	}
+	
+	/**
+	 * 导出excel文件
+	 */
+	@RequiresPermissions("echarts:pieClass:export")
+    @RequestMapping(value = "export", method=RequestMethod.POST)
+    public String exportFile(PieClass pieClass, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "班级"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            Page<PieClass> page = pieClassService.findPage(new Page<PieClass>(request, response, -1), pieClass);
+    		new ExportExcel("班级", PieClass.class).setDataList(page.getList()).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导出班级记录失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/echarts/pieClass/?repage";
+    }
+
+	/**
+	 * 导入Excel数据
+
+	 */
+	@RequiresPermissions("echarts:pieClass: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<PieClass> list = ei.getDataList(PieClass.class);
+			for (PieClass pieClass : list){
+				try{
+					pieClassService.save(pieClass);
+					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()+"/echarts/pieClass/?repage";
+    }
+	
+	/**
+	 * 下载导入班级数据模板
+	 */
+	@RequiresPermissions("echarts:pieClass:import")
+    @RequestMapping(value = "import/template")
+    public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "班级数据导入模板.xlsx";
+    		List<PieClass> list = Lists.newArrayList(); 
+    		new ExportExcel("班级数据", PieClass.class, 1).setDataList(list).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入模板下载失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/echarts/pieClass/?repage";
+    }
+	
+	
+	
+
+}

+ 34 - 0
src/main/java/com/jeeplus/modules/echarts/web/PieController.java

@@ -0,0 +1,34 @@
+package com.jeeplus.modules.echarts.web;
+import java.util.HashMap;
+import java.util.Map;
+
+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;
+@Controller
+@RequestMapping(value = "${adminPath}/echarts/pie")
+public class PieController extends BaseController {
+	
+	private static final long serialVersionUID = 7375363226310112119L;
+	
+	private Map<String,Object> orientData;
+	@RequestMapping(value = {"index", ""})
+	public String index( HttpServletRequest request, HttpServletResponse response, Model model) {
+		request.setAttribute("orientData", getorientData());
+		return "modules/echarts/pie";
+	}
+	public Map<String,Object> getorientData(){
+		orientData = new HashMap<String,Object>();
+		orientData.put("直接访问", 335);
+		orientData.put("邮件营销", 310);
+		orientData.put("联盟广告", 234);
+		orientData.put("视频广告", 135);
+		orientData.put("搜索引擎", 1548);
+		return orientData;
+	}
+}

+ 46 - 0
src/main/java/com/jeeplus/modules/echarts/web/RadarController.java

@@ -0,0 +1,46 @@
+package com.jeeplus.modules.echarts.web;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+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;
+@Controller
+@RequestMapping(value = "${adminPath}/echarts/radar")
+public class RadarController extends BaseController {
+	
+	private static final long serialVersionUID = 7375363226310112119L;
+	
+	private List<Map<String,Object>> orientData;
+	@RequestMapping(value = {"index", ""})
+	public String index( HttpServletRequest request, HttpServletResponse response, Model model) {
+		request.setAttribute("orientData", getorientData8());
+		return "modules/echarts/radar";
+		
+	}
+	public List<Map<String,Object>> getorientData8(){
+		orientData = new ArrayList<Map<String,Object>>();
+		
+		Double[] dataArr1 = new Double[]{0.1*100,0.2*100,0.3*100,0.1*100,0.05*100,0.05*100,0.1*100,0.1*100};
+		Map<String,Object> mapData1 = new HashMap<String,Object>();
+		mapData1.put("dataArr", dataArr1);
+		mapData1.put("title", "玫瑰图1");
+		orientData.add(mapData1);
+		
+		Double[] dataArr2 = new Double[]{0.05*100,0.05*100,0.1*100,0.1*100,0.1*100,0.2*100,0.3*100,0.1*100};
+		Map<String,Object> mapData2 = new HashMap<String,Object>();
+		mapData2.put("dataArr", dataArr2);
+		mapData2.put("title", "玫瑰图2");
+		orientData.add(mapData2);
+		
+		return orientData;
+		
+	}
+}

+ 60 - 0
src/main/java/com/jeeplus/modules/esignature/kinggridserver/KingGridServer.java

@@ -0,0 +1,60 @@
+package com.jeeplus.modules.esignature.kinggridserver;
+
+import com.jeeplus.modules.esignature.utils.HttpRequest;
+import com.jeeplus.modules.esignature.utils.MD5;
+
+public class KingGridServer {
+	/**
+	 * 信签服务器地址
+	 */
+	//public static final String SERVER_URL = "http://192.168.0.55:8081/tosignserver";
+	public static final String SERVER_URL = "http://171.34.78.70:8081/tosignserver";
+	/**
+	 * 信签服务器对接应用ID
+	 */
+	public static final String APP_ID = "king";
+	/**
+	 * 信签服务器对接应用密钥
+	 */
+	public static final String APP_SECURITY = "e3f55030d473095d";
+	
+	/**
+	 * 测试签署用户编码
+	 */
+	//public static final String SIGNER_CODE= "lidongzhang";
+	public static final String SIGNER_CODE= "fgy201804101542";
+
+	/**
+	 * 模板创建合同使用的模板编码
+	 */
+	public static final String CONTRACT_TPL_CODE= "testTemplate";
+
+	/**
+	 * 生成信签请求操作对象
+	 * @param url
+	 * @return
+	 */
+	public static HttpRequest createHttpRequest(String url){
+		String requestUrl;
+		if(SERVER_URL.endsWith("/")){
+			requestUrl =  SERVER_URL.substring(0, SERVER_URL.length()-1)+url;
+		}else{
+			requestUrl = SERVER_URL+url;
+		}
+		HttpRequest httpRequest = new HttpRequest(requestUrl);
+		
+		/**
+		 * 如果是云服务,需要添加应用id到header
+		 * 如果是私有云,可以不用设置
+		 */
+		httpRequest.addHeader("app_id", APP_ID);
+		String  time = System.currentTimeMillis()+"";
+		httpRequest.addHeader("time", time);
+		httpRequest.addHeader("sign", MD5.toMD5(APP_ID+"."+time+'.'+APP_SECURITY));
+		
+		return httpRequest;
+		
+	}
+	
+	
+}

+ 45 - 0
src/main/java/com/jeeplus/modules/esignature/service/contract/ContractDocService.java

@@ -0,0 +1,45 @@
+package com.jeeplus.modules.esignature.service.contract;
+
+import com.jeeplus.modules.esignature.kinggridserver.KingGridServer;
+import com.jeeplus.modules.esignature.utils.HttpRequest;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.UUID;
+
+/**
+ * 文档签名接口
+ * @author Administrator
+ *
+ */
+public class ContractDocService {
+	public static void main(String[] args) throws IOException {
+		String contractid = "doc_contractid_test1";
+		HttpRequest request = KingGridServer.createHttpRequest("/api/cnt/sign");
+		InputStream is = null;
+		try{
+			is = ContractService.class.getResourceAsStream("/kinggrid/demo.pdf");
+			request.addInputStream("docx_file", "/kinggrid/demo.pdf", is);
+			request.addParam("contract_name", "测试合同");
+			request.addParam("contract_id", contractid);
+			request.addParam("biz_id", UUID.randomUUID().toString().replaceAll("-", ""));
+			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+			//设置业务时间参数
+			request.addParam("biz_time", sdf.format(new Date()));
+			//设置签署人的编码
+			request.addParam("signer_info", "[{code:\"fgy20180410\",seal_code:\"\" , fontsize:50,offsetX:100,y:123,x:100}]" );
+			//在第一页的以左下角为原点偏移
+			//request.addParam("signatures", "[{ y:680,x:200,pageno:\"1\"}]");
+			
+			request.send();
+			System.out.println(request.resultToString());
+		}finally{
+			if(is!=null){
+				is.close();
+			}
+		}
+	}
+	
+}

+ 150 - 0
src/main/java/com/jeeplus/modules/esignature/service/contract/ContractService.java

@@ -0,0 +1,150 @@
+package com.jeeplus.modules.esignature.service.contract;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.jeeplus.modules.esignature.kinggridserver.KingGridServer;
+import com.jeeplus.modules.esignature.utils.HttpRequest;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.UUID;
+
+/**
+ * 合同相关测试接口
+ * @author Administrator
+ *
+ */
+public class ContractService {
+	public static void main(String[] args) throws IOException {
+		String contractid = "contractid_test10";
+		JSONObject json = createContract(contractid);
+		System.out.println(json);
+		if(json.getInteger("code") == 1){//创建成功
+			downFiles(json.getJSONArray("doc_last_urls"), "d:/"+contractid);
+		}
+		json = signContract(contractid, KingGridServer.SIGNER_CODE);
+		if(json.getInteger("code") == 1){//签署成功
+			downFiles(json.getJSONArray("record_saved_urls"), "d:/"+contractid);
+		}else{
+			System.out.println(json);
+		}
+		
+	}
+	
+	/**
+	 * 下载多个文件保存在文件夹
+	 * @param urls
+	 * @param savePath
+	 * @throws IOException
+	 */
+	public static final void downFiles(JSONArray urls , String savePath) throws IOException{
+		for (Object url : urls) {
+			downFile((String)url, savePath);
+		}
+	}
+	
+	/**
+	 * 下载文件保存
+	 * @param url
+	 * @param savePath
+	 * @throws IOException 
+	 */
+	public static final void downFile(String url , String savePath) throws IOException{
+		HttpRequest request = new HttpRequest(url);
+		request.send();
+		int code = request.getResponseCode();
+		if(code==200){
+			FileOutputStream fos = null;
+			try{
+				String fileName = savePath;
+				if(!(savePath.endsWith("/")|| savePath.endsWith("\\"))){
+					fileName +="/";
+				}
+				fileName+=request.getDownFileName();
+				File file  = new File(fileName);
+				file.getParentFile().mkdirs();
+				fos = new FileOutputStream(file);
+				System.out.println("保存文件至:"+fileName);
+				request.result(fos);
+			}finally{
+				if(fos!=null){
+					fos.close();
+				}
+			}
+		}else{
+			System.out.println("错误信息:"+request.resultToString());
+		}
+	}
+	
+	
+	
+	/**
+	 * 创建合同
+	 * @throws IOException 
+	 */
+	public static JSONObject createContract(String contractid) throws IOException{
+		HttpRequest request = KingGridServer.createHttpRequest("/api/contract/create");
+		InputStream is = null;
+		try{
+			is = ContractService.class.getResourceAsStream("/demo.docx");
+			request.addInputStream("docx_file", "demo.docx", is);
+			//{"姓名":"李东长","cardname_ID":"360111198708080899","year":"2018","month":"01","day":"01"}
+			JSONObject xml_metadata = new JSONObject(true);
+			xml_metadata.put("姓名", "李东长");
+			xml_metadata.put("cardname_ID", "360111198708080899");
+			xml_metadata.put("year", "2018");
+			xml_metadata.put("month", "01");
+			xml_metadata.put("day", "01");
+			
+			request.addParam("doc_metadata",xml_metadata.toJSONString());
+			
+			
+			//设置合同ID
+			request.addParam("contract_id", contractid);
+			//设置合同名称参数
+			request.addParam("contract_name", "测试合同");
+			//设置该合同需要几方签署
+			request.addParam("party_count", "1");
+
+			//设置业务编码参数
+			request.addParam("biz_id", UUID.randomUUID().toString().replaceAll("-", ""));
+			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+			//设置业务时间参数
+			request.addParam("biz_time", sdf.format(new Date()));
+			
+			
+			request.send();
+			return JSONObject.parseObject(request.resultToString());
+			
+		}finally{
+			if(is!=null){
+				is.close();
+			}
+		}
+	}
+	
+	/**
+	 * 签署合同
+	 * @throws IOException 
+	 */
+	public static JSONObject signContract(String contractid , String signer_code ) throws IOException{
+		HttpRequest request = KingGridServer.createHttpRequest("/api/contract/exec");
+		request.addParam("contract_id", contractid);
+		request.addParam("biz_id", UUID.randomUUID().toString().replaceAll("-", ""));
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		//设置业务时间参数
+		request.addParam("biz_time", sdf.format(new Date()));
+		//设置签署人的编码
+		request.addParam("signer_code", signer_code );
+		//在第一页的以左下角为原点偏移
+		request.addParam("signatures", "[{ y:680,x:200,pageno:\"1\"}]");
+		
+		request.send();
+		return JSONObject.parseObject(request.resultToString());
+		
+	}
+}

+ 138 - 0
src/main/java/com/jeeplus/modules/esignature/service/contract/ContractWithTemplateService.java

@@ -0,0 +1,138 @@
+package com.jeeplus.modules.esignature.service.contract;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.jeeplus.modules.esignature.kinggridserver.KingGridServer;
+import com.jeeplus.modules.esignature.utils.HttpRequest;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.UUID;
+
+/**
+ * 合同相关测试(使用模板)接口
+ * @author Administrator
+ *
+ */
+public class ContractWithTemplateService {
+	public static void main(String[] args) throws IOException {
+		String contractid = "template_contractid_test01";
+		JSONObject json = generateContract(contractid , KingGridServer.CONTRACT_TPL_CODE);
+		System.out.println(json);
+		if(json.getInteger("code") == 1){//创建成功
+			downFiles(json.getJSONArray("doc_last_urls"), "d:/"+contractid);
+		}
+		json = signContract(contractid, KingGridServer.SIGNER_CODE);
+		if(json.getInteger("code") == 1){//签署成功
+			downFiles(json.getJSONArray("record_saved_urls"), "d:/"+contractid);
+		}else{
+			System.out.println(json);
+		}
+		
+	}
+	
+	/**
+	 * 下载多个文件保存在文件夹
+	 * @param urls
+	 * @param savePath
+	 * @throws IOException
+	 */
+	public static final void downFiles(JSONArray urls , String savePath) throws IOException{
+		for (Object url : urls) {
+			downFile((String)url, savePath);
+		}
+	}
+	
+	/**
+	 * 下载文件保存
+	 * @param url
+	 * @param savePath
+	 * @throws IOException 
+	 */
+	public static final void downFile(String url , String savePath) throws IOException{
+		HttpRequest request = new HttpRequest(url);
+		request.send();
+		int code = request.getResponseCode();
+		if(code==200){
+			FileOutputStream fos = null;
+			try{
+				String fileName = savePath;
+				if(!(savePath.endsWith("/")|| savePath.endsWith("\\"))){
+					fileName +="/";
+				}
+				fileName+=request.getDownFileName();
+				File file  = new File(fileName);
+				file.getParentFile().mkdirs();
+				fos = new FileOutputStream(file);
+				System.out.println("保存文件至:"+fileName);
+				request.result(fos);
+			}finally{
+				if(fos!=null){
+					fos.close();
+				}
+			}
+		}else{
+			System.out.println("错误信息:"+request.resultToString());
+		}
+	}
+	
+	
+	
+	/**
+	 * 使用模板创建合同
+	 * @throws IOException 
+	 */
+	public static JSONObject generateContract(String contractid , String contract_tpl_code) throws IOException{
+		HttpRequest request = KingGridServer.createHttpRequest("/api/contract/start");
+		//{"姓名":"李东长","cardname_ID":"360111198708080899","year":"2018","month":"01","day":"01"}
+		JSONObject xml_metadata = new JSONObject(true);
+		xml_metadata.put("姓名", "李东长");
+		xml_metadata.put("cardname_ID", "360111198708080899");
+		xml_metadata.put("year", "2018");
+		xml_metadata.put("month", "01");
+		xml_metadata.put("day", "01");
+		
+		
+		request.addParam("contract_tlp_code",contract_tpl_code);
+		
+		request.addParam("doc_metadata",xml_metadata.toJSONString());
+		
+		//设置合同ID
+		request.addParam("contract_id", contractid);
+		//设置合同名称参数
+		request.addParam("contract_name", "测试合同");
+		
+		//设置业务编码参数
+		request.addParam("biz_id", UUID.randomUUID().toString().replaceAll("-", ""));
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		//设置业务时间参数
+		request.addParam("biz_time", sdf.format(new Date()));
+		
+		
+		request.send();
+		return JSONObject.parseObject(request.resultToString());
+		
+	}
+	
+	/**
+	 * 签署合同
+	 * @throws IOException 
+	 */
+	public static JSONObject signContract(String contractid , String signer_code ) throws IOException{
+		HttpRequest request = KingGridServer.createHttpRequest("/api/contract/sign");
+		request.addParam("contract_id", contractid);
+		request.addParam("biz_id", UUID.randomUUID().toString().replaceAll("-", ""));
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		//设置业务时间参数
+		request.addParam("biz_time", sdf.format(new Date()));
+		//设置签署人的编码
+		request.addParam("signer_code", signer_code);
+		
+		request.send();
+		return JSONObject.parseObject(request.resultToString());
+		
+	}
+}

File diff suppressed because it is too large
+ 176 - 0
src/main/java/com/jeeplus/modules/esignature/service/docdeal/DealPdfService.java


+ 160 - 0
src/main/java/com/jeeplus/modules/esignature/service/docdeal/DocConvertPdfService.java

@@ -0,0 +1,160 @@
+package com.jeeplus.modules.esignature.service.docdeal;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jeeplus.modules.esignature.kinggridserver.KingGridServer;
+import com.jeeplus.modules.esignature.utils.HttpRequest;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * 文档转换接口
+ * @author Administrator
+ *
+ */
+public class DocConvertPdfService {
+	public static void main(String[] args) throws IOException {
+		ms_to_pdf("d:/test.pdf");
+	}
+	
+	
+	/**
+	 * office文件数据填充生成PDF
+	 * @param saveFile
+	 * @throws IOException
+	 */
+	public static void ms_to_pdf(String saveFile) throws IOException{
+		HttpRequest request = KingGridServer.createHttpRequest("/api/cnt/msToPDF");
+		InputStream is = null;
+		try{
+			is = DocConvertPdfService.class.getResourceAsStream("/demo.doc");
+			request.addInputStream("ms_file", "demo.doc", is);
+			
+			request.send();
+			int code = request.getResponseCode();
+			System.out.println("状态码:"+code);
+			if(code==200){
+				System.out.println("生成成功");
+				FileOutputStream fos = null;
+				try{
+					File file  = new File(saveFile);
+					file.getParentFile().mkdirs();
+					fos = new FileOutputStream(file);
+					System.out.println("保存文件至:"+saveFile);
+					request.result(fos);
+				}finally{
+					if(fos!=null){
+						fos.close();
+					}
+				}
+			}else{
+				System.out.println("错误信息:"+request.resultToString());
+			}
+			
+		}finally{
+			if(is!=null){
+				is.close();
+			}
+		}
+	}
+	
+	/**
+	 * docx模板文件数据填充生成PDF
+	 * @param saveFile
+	 * @throws IOException
+	 */
+	public static void docx_to_pdf(String saveFile) throws IOException{
+		HttpRequest request = KingGridServer.createHttpRequest("/api/cnt/docxToPDF");
+		InputStream is = null;
+		try{
+			is = DocConvertPdfService.class.getResourceAsStream("/demo.docx");
+			request.addInputStream("docx_file", "demo.docx", is);
+			
+			//{"姓名":"李东长","cardname_ID":"360111198708080899","year":"2018","month":"01","day":"01"}
+			JSONObject xml_metadata = new JSONObject(true);
+			xml_metadata.put("姓名", "李东长");
+			xml_metadata.put("cardname_ID", "360111198708080899");
+			xml_metadata.put("year", "2018");
+			xml_metadata.put("month", "01");
+			xml_metadata.put("day", "01");
+			
+			request.addParam("docx_metadata",xml_metadata.toJSONString());
+			request.send();
+			int code = request.getResponseCode();
+			System.out.println("状态码:"+code);
+			if(code==200){
+				System.out.println("生成成功");
+				FileOutputStream fos = null;
+				try{
+					File file  = new File(saveFile);
+					file.getParentFile().mkdirs();
+					fos = new FileOutputStream(file);
+					System.out.println("保存文件至:"+saveFile);
+					request.result(fos);
+				}finally{
+					if(fos!=null){
+						fos.close();
+					}
+				}
+			}else{
+				System.out.println("错误信息:"+request.resultToString());
+			}
+			
+		}finally{
+			if(is!=null){
+				is.close();
+			}
+		}
+	}
+	
+	/**
+	 * xml模板文件数据填充生成PDF
+	 * @param saveFile
+	 * @throws IOException
+	 */
+	public static void xml_to_pdf(String saveFile) throws IOException{
+		HttpRequest request = KingGridServer.createHttpRequest("/api/cnt/xmlToPDF");
+		InputStream is = null;
+		try{
+			is = DocConvertPdfService.class.getResourceAsStream("/demo.xml");
+			request.addInputStream("xml_file", "demo.xml", is);
+			
+			//{"姓名":"李东长","cardname_ID":"360111198708080899","year":"2018","month":"01","day":"01"}
+			JSONObject xml_metadata = new JSONObject(true);
+			xml_metadata.put("姓名", "李东长");
+			xml_metadata.put("cardname_ID", "360111198708080899");
+			xml_metadata.put("year", "2018");
+			xml_metadata.put("month", "01");
+			xml_metadata.put("day", "01");
+			
+			request.addParam("xml_metadata",xml_metadata.toJSONString());
+			request.send();
+			int code = request.getResponseCode();
+			System.out.println("状态码:"+code);
+			if(code==200){
+				System.out.println("生成成功");
+				FileOutputStream fos = null;
+				try{
+					File file  = new File(saveFile);
+					file.getParentFile().mkdirs();
+					fos = new FileOutputStream(file);
+					System.out.println("保存文件至:"+saveFile);
+					request.result(fos);
+				}finally{
+					if(fos!=null){
+						fos.close();
+					}
+				}
+			}else{
+				System.out.println("错误信息:"+request.resultToString());
+			}
+			
+		}finally{
+			if(is!=null){
+				is.close();
+			}
+		}
+	}
+}

+ 29 - 0
src/main/java/com/jeeplus/modules/esignature/service/other/RealNameAuthenticateService.java

@@ -0,0 +1,29 @@
+package com.jeeplus.modules.esignature.service.other;
+
+import com.jeeplus.modules.esignature.kinggridserver.KingGridServer;
+import com.jeeplus.modules.esignature.utils.HttpRequest;
+
+import java.io.IOException;
+
+/**
+ * 
+ * @author Administrator
+ *
+ */
+public class RealNameAuthenticateService {
+	public static void main(String[] args) throws IOException {
+		HttpRequest request = KingGridServer.createHttpRequest("/api/signer/realNameAuthenticate");
+//		HttpRequest request = new HttpRequest("http://localhost:8080/tosignserver/api/signer/realNameAuthenticate");
+		//设置用户编码
+		request.addParam("signer_name","李东长");
+		//身份证号码
+		request.addParam("signer_idcode", "360103199111180718");
+		//手机号
+		request.addParam("signer_phone", "15797827474");
+		//银行卡号
+		request.addParam("signer_account", "6217002020048760913");
+
+		System.out.println(request.send().resultToString());
+	}
+	
+}

+ 59 - 0
src/main/java/com/jeeplus/modules/esignature/service/signer/SignerService.java

@@ -0,0 +1,59 @@
+package com.jeeplus.modules.esignature.service.signer;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jeeplus.modules.esignature.kinggridserver.KingGridServer;
+import com.jeeplus.modules.esignature.utils.HttpRequest;
+
+import java.io.IOException;
+
+public class SignerService {
+	public static void main(String[] args) throws IOException {
+		String signer_code = KingGridServer.SIGNER_CODE;
+		JSONObject json = createSigner(signer_code , "安琪拉" , "360111198708089867");
+		System.out.println(json);
+	}
+	
+	
+	/**
+	 * 创建个人用户
+	 * @throws IOException 
+	 */
+	public static JSONObject createSigner(String signer_code , String name , String idcode) throws IOException{
+		HttpRequest request = KingGridServer.createHttpRequest("/api/signer/create");
+		//	签署用户编码
+		request.addParam("signer_code", signer_code);
+		//签署用户名称
+		request.addParam("signer_name", name);
+		//签署用户手机号码
+		request.addParam("signer_phone", "18771066108");
+		//签署用户手机号码
+		request.addParam("signer_idcode", idcode);
+		
+		request.send();
+		JSONObject jsonObject = JSONObject.parseObject(request.resultToString());
+		return jsonObject;
+	}
+	
+	/**
+	 * 创建企业用户
+	 * @throws IOException 
+	 */
+	public static JSONObject createCompanySigner(String signer_code) throws IOException{
+		
+		HttpRequest request = KingGridServer.createHttpRequest("/api/signer/create");
+		//设置用户编码
+		request.addParam("signer_code",signer_code);
+		//设置用户编码
+		request.addParam("signer_name", "金格科技股份有限公司");
+		
+		request.addParam("signer_phone", "18770066807");
+		
+		//设置企业类型
+		request.addParam("signer_type", "2");
+		request.addParam("signer_idtype", "2");
+		request.addParam("signer_idcode", "9136010674863060XM");
+		
+		return JSONObject.parseObject(request.resultToString());
+	}
+	
+}

+ 52 - 0
src/main/java/com/jeeplus/modules/esignature/utils/Byte2Hex.java

@@ -0,0 +1,52 @@
+package com.jeeplus.modules.esignature.utils;
+
+import java.util.Formatter;
+
+/**
+ * <p>
+ * 字节 16进制字串转换工具类
+ * </p>
+ * 
+ * @author hubin
+ * @Date 2016-01-20
+ */
+public class Byte2Hex {
+
+	/**
+	 * 
+	 * 字节转换为 16 进制字符串
+	 * 
+	 * @param b
+	 * 			字节
+	 * @return
+	 */
+	public static String byte2Hex( byte b ) {
+		String hex = Integer.toHexString(b);
+		if ( hex.length() > 2 ) {
+			hex = hex.substring(hex.length() - 2);
+		}
+		while ( hex.length() < 2 ) {
+			hex = "0" + hex;
+		}
+		return hex;
+	}
+
+
+	/**
+	 * 
+	 * 字节数组转换为 16 进制字符串
+	 * 
+	 * @param bytes
+	 * 			字节数组
+	 * @return
+	 */
+	public static String byte2Hex( byte[] bytes ) {
+		Formatter formatter = new Formatter();
+		for ( byte b : bytes ) {
+			formatter.format("%02x", b);
+		}
+		String hash = formatter.toString();
+		formatter.close();
+		return hash;
+	}
+}

+ 39 - 0
src/main/java/com/jeeplus/modules/esignature/utils/FileHolder.java

@@ -0,0 +1,39 @@
+package com.jeeplus.modules.esignature.utils;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.InputStream;
+
+public 
+class FileHolder {
+	private String filename;
+	
+	private File file;
+	
+	private InputStream is ;
+	
+	public FileHolder(File file) {
+		this.filename = file.getName();
+		this.file = file;
+	}
+	
+	public FileHolder(String filename , InputStream is) {
+		this.filename = filename;
+		this.is = is;
+	}
+	
+	public InputStream getInputStream() throws FileNotFoundException{
+		if(is == null){
+			return new FileInputStream(file);
+		}
+		return is;
+	}
+
+	public String getFilename() {
+		return filename;
+	}
+	
+	
+}
+

+ 402 - 0
src/main/java/com/jeeplus/modules/esignature/utils/HttpRequest.java

@@ -0,0 +1,402 @@
+package com.jeeplus.modules.esignature.utils;
+
+import javax.net.ssl.*;
+import java.io.*;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.net.URLDecoder;
+import java.net.URLEncoder;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+import java.util.*;
+import java.util.Map.Entry;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+
+/**
+ * HTTP 简单封装
+ * @author Administrator
+ *
+ */
+public class HttpRequest {
+	
+	/**
+	 * https 域名校验
+	 */
+	private class TrustAnyHostnameVerifier implements HostnameVerifier {
+		public boolean verify(String hostname, SSLSession session) {
+			return true;
+		}
+	}
+	
+	/**
+	 * https 证书管理
+	 */
+	private class TrustAnyTrustManager implements X509TrustManager {
+		public X509Certificate[] getAcceptedIssuers() {
+			return null;  
+		}
+		public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
+		}
+		public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
+		}
+	}
+	
+	private static String CHARSET = "UTF-8";
+	
+	private static final SSLSocketFactory sslSocketFactory = initSSLSocketFactory();
+	private static final TrustAnyHostnameVerifier trustAnyHostnameVerifier = new HttpRequest(null).new TrustAnyHostnameVerifier();
+	
+	private static SSLSocketFactory initSSLSocketFactory() {
+		try {
+			TrustManager[] tm = {new HttpRequest(null).new TrustAnyTrustManager() };
+			SSLContext sslContext = SSLContext.getInstance("TLS");	// ("TLS", "SunJSSE");
+			sslContext.init(null, tm, new java.security.SecureRandom());
+			return sslContext.getSocketFactory();
+		}
+		catch (Exception e) {
+			throw new RuntimeException(e);
+		}
+	}
+	
+	
+	private static String end = "\r\n";
+	private static String PREFIX = "--";
+	
+	public String url;
+	
+	private String requestMethod = "POST";
+	
+	
+	private int readTimeout =30000;
+	
+	protected Map<String,String> headers = new LinkedHashMap<String, String>();
+	protected Map<String , List<FileHolder>> fileMap =  new LinkedHashMap<String, List<FileHolder>>();
+
+	protected Map<String,List<String>> params = new LinkedHashMap<String, List<String>>();
+
+	HttpURLConnection conn;
+
+	private int responseCode;
+
+	private String charset = CHARSET;
+
+	public HttpRequest(String url){
+		this.url = url;
+	}
+
+	/**
+	 * 添加header信息
+	 * @param key
+	 * @param value
+	 */
+	public HttpRequest addHeader(String key , String value){
+		this.headers.put(key, value);
+		return this;
+	}
+
+	public HttpRequest addHeaders(Map<String,String> maps){
+		this.headers.putAll(maps);
+		return this;
+	}
+
+
+	public String getCharset() {
+		return charset;
+	}
+
+	public void setCharset(String charset) {
+		this.charset = charset;
+	}
+
+	/**
+	 * 添加参数
+	 * @param key
+	 * @param value
+	 */
+	public HttpRequest addParam(String key , String value){
+		List<String> files = params.get(key);
+		if(files == null){
+			files = new ArrayList<String>();
+		}
+		files.add(value);
+		this.params.put(key, files);
+		return this;
+	}
+
+
+
+	public HttpRequest addInputStream(String key , String filename , InputStream is){
+		List<FileHolder> files = fileMap.get(key);
+		if(files == null){
+			files = new ArrayList<FileHolder>();
+		}
+		files.add(new FileHolder(filename ,is ));
+		this.fileMap.put(key, files);
+		return this;
+	}
+
+	public HttpRequest addFile(String key , File file){
+		List<FileHolder> files = fileMap.get(key);
+		if(files == null){
+			files = new ArrayList<FileHolder>();
+		}
+		files.add(new FileHolder(file));
+		this.fileMap.put(key, files);
+		return this;
+	}
+
+
+	private void writeFile(OutputStream out, InputStream fis , String name , String filename) throws IOException{
+
+		out.write((PREFIX + boundary + end).getBytes(charset));
+    	String contentDisposition = "Content-Disposition: form-data; name=\"" + name
+                 + "\"; filename=\"" + filename + "\""+end;
+
+    	out.write(contentDisposition.getBytes(charset));
+    	out.write(("Content-Type: application/octet-stream"+end).getBytes(charset));
+    	out.write(end.getBytes(charset));
+
+		byte[] buffer = new byte[1024];
+		for (int n = -1; (n = fis.read(buffer)) != -1;) {
+			out.write(buffer, 0, n);
+		}
+    	out.write(end.getBytes(charset));
+
+	}
+
+
+	private void writeFiles(OutputStream out) throws IOException{
+		Set<String> keySet = fileMap.keySet();
+        for (Iterator<String> it = keySet.iterator(); it.hasNext();) {
+            String name = it.next();
+            List<FileHolder> value = fileMap.get(name);
+
+            for (FileHolder fileHolder : value) {
+            	
+            	InputStream fis = null;
+            	try{
+            		fis = fileHolder.getInputStream();
+            		writeFile(out, fis, name, fileHolder.getFilename());
+            	}finally{
+            		if(fis!=null){
+            			try{
+            				fis.close();
+            			}catch(Exception e){
+            				
+            			}
+            		}
+            	}
+			}
+        }  
+        out.write((PREFIX + boundary + PREFIX + end).getBytes(charset));
+	}
+	
+	private void writeParams(OutputStream out) throws  IOException{
+		Set<String> keySet = params.keySet();  
+		StringBuffer sb = new StringBuffer();
+		int i = 0;
+        for (Iterator<String> it = keySet.iterator(); it.hasNext();) {  
+            String name = it.next();  
+            List<String> values = params.get(name);
+            for (String string : values) {
+            	if(i>0){
+            		sb.append("&");
+            	}
+            	sb.append(name).append("=").append(URLEncoder.encode(string , charset));
+            	i++;
+			}
+        }
+        out.write(sb.toString().getBytes(charset));
+	}
+	
+	
+	private void writeParamsWithFile(OutputStream out) throws  IOException{
+		Set<String> keySet = params.keySet();  
+		StringBuffer sb = new StringBuffer();
+        for (Iterator<String> it = keySet.iterator(); it.hasNext();) {  
+            String name = it.next();  
+            List<String> values = params.get(name);  
+            for (String string : values) {
+            	sb.append(PREFIX).append(boundary).append(end);//分界符  
+                sb.append("Content-Disposition: form-data; name=\"" + name + "\"" + end);  
+                //sb.append("Content-Type: text/plain; charset=" + charset + end);  
+                sb.append(end);  
+                sb.append(string);  
+                sb.append(end);
+			}
+        }  
+        out.write(sb.toString().getBytes(charset));
+	}
+	
+	private String boundary = "----TosignFormBoundary5TGBNHY67UJM";
+	
+	
+	
+	public HttpRequest open() throws IOException{
+		URL _url = new URL(url);
+		conn = (HttpURLConnection)_url.openConnection();
+		if (conn instanceof HttpsURLConnection) {
+			((HttpsURLConnection)conn).setSSLSocketFactory(sslSocketFactory);
+			((HttpsURLConnection)conn).setHostnameVerifier(trustAnyHostnameVerifier);
+		}
+		
+		conn.setRequestMethod(this.requestMethod);
+		conn.setDoInput(true); //允许输入流  
+        conn.setDoOutput(true); //允许输出流  
+        conn.setUseCaches(false); //不允许使用缓存  
+		
+		conn.setConnectTimeout(10000);
+		conn.setReadTimeout(readTimeout);
+		
+		boolean hasUploadFile = !fileMap.isEmpty();
+		
+		if(hasUploadFile){
+			conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);  
+	    }else{
+	    	conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded;charset=" + charset);
+	    }
+		
+		conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36");
+		if (headers != null && !headers.isEmpty())
+			for (Entry<String, String> entry : headers.entrySet())
+				conn.setRequestProperty(entry.getKey(), entry.getValue());
+		
+		return this;
+		
+	}
+	
+	
+	public int getReadTimeout() {
+		return readTimeout;
+	}
+
+	public void setReadTimeout(int readTimeout) {
+		this.readTimeout = readTimeout;
+	}
+
+	public HttpRequest write(byte[] data) throws IOException{
+		OutputStream out = conn.getOutputStream();
+		out.write(data);
+		return this;
+	}
+	
+	
+	public HttpRequest request() throws IOException{
+		boolean hasUploadFile = !fileMap.isEmpty();
+		OutputStream out = conn.getOutputStream();
+		if(hasUploadFile){
+			writeParamsWithFile(out);
+			writeFiles(out);
+		}else{
+			writeParams(out);
+		}
+		
+		out.flush();
+		out.close();
+		responseCode = conn.getResponseCode();
+		return this;
+	}
+	
+	
+	/**
+	 * 发送请求
+	 * @return 返回状态码 requestCode
+	 * @throws IOException 
+	 */
+	public HttpRequest send() throws IOException{
+		open();
+		request();
+		return this;
+	}
+	
+	
+	public int getResponseCode() {
+		return responseCode;
+	}
+
+	
+	/**
+	 * 将响应结果以string返回
+	 * @return
+	 * @throws IOException
+	 */
+	public String resultToString() throws IOException{
+		 String _charset = charset;
+         String contentType = conn.getContentType();
+         if(StrKit.notBlank(contentType)){
+        	 Pattern pattern = Pattern.compile("charset=\\S*");  
+        	 Matcher matcher = pattern.matcher(conn.getContentType());  
+             if (matcher.find()) {  
+            	 _charset = matcher.group().replace("charset=", "");  
+             }  
+         }
+        
+		ByteArrayOutputStream baos = new ByteArrayOutputStream();
+		result(baos);
+		return new String(baos.toByteArray() , _charset);
+	}
+	
+	
+	public String getDownFileName() throws IOException{
+        String contentDisposition = URLDecoder.decode(conn.getHeaderField("content-Disposition"), "UTF-8");
+        System.out.println(contentDisposition);
+        // 匹配文件名
+        Pattern pattern = Pattern.compile(".*filename=(.*)");
+        Matcher matcher = pattern.matcher(contentDisposition);
+        System.out.println(matcher.groupCount());
+        System.out.println(matcher.matches());
+        System.out.println(matcher.group(1));
+        String filename = matcher.group(1);
+		return filename.substring(1,filename.length()-1);
+	}
+	
+	
+	/**
+	 * 将响应结果写入输出流,主要用于接收服务返回的文件
+	 * @param os
+	 * @throws IOException
+	 */
+	public void result(OutputStream os ) throws IOException{
+		InputStream inputStream = null;
+		try {
+			if(getResponseCode() >=400 && getResponseCode()!=404){
+				inputStream = conn.getErrorStream();
+			}else{
+				inputStream = conn.getInputStream();
+			}
+			
+			byte[] buffer = new byte[2048];
+			for (int n = -1; (n = inputStream.read(buffer)) != -1;) {
+				os.write(buffer, 0, n);
+				os.flush();
+			}
+		}
+		
+		finally {
+			if (inputStream != null) {
+				try {
+					inputStream.close();
+				} catch (IOException e) {
+					
+				}
+			}
+			conn.disconnect();  
+		}
+	}
+
+	public HttpURLConnection getConn() {
+		return conn;
+	}
+
+	public String getRequestMethod() {
+		return requestMethod;
+	}
+
+	public void setRequestMethod(String requestMethod) {
+		this.requestMethod = requestMethod;
+	}
+	
+	
+}

+ 103 - 0
src/main/java/com/jeeplus/modules/esignature/utils/MD5.java

@@ -0,0 +1,103 @@
+package com.jeeplus.modules.esignature.utils;
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.security.MessageDigest;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.logging.Logger;
+
+
+public class MD5 {
+
+	private static final Logger logger = Logger.getLogger("MD5");
+
+	/**
+	 * @Description 字符串加密为MD5 中文加密一致通用,必须转码处理: plainText.getBytes("UTF-8")
+	 * @param plainText
+	 *            需要加密的字符串
+	 * @return
+	 */
+	public static String toMD5(String plainText) {
+		StringBuffer rlt = new StringBuffer();
+		try {
+			rlt.append(md5String(plainText.getBytes("UTF-8")));
+		} catch (UnsupportedEncodingException e) {
+			logger.severe(" CipherHelper toMD5 exception.");
+			e.printStackTrace();
+		}
+		return rlt.toString();
+	}
+	
+	
+
+	/**
+	 * MD5 参数签名生成算法
+	 * 
+	 * @param HashMap<String,String>
+	 *            params 请求参数集,所有参数必须已转换为字符串类型
+	 * @param String
+	 *            secret 签名密钥
+	 * @return 签名
+	 * @throws IOException
+	 */
+	public static String getSignature(HashMap<String, String> params, String secret) {
+		Map<String, String> sortedParams = new TreeMap<String, String>(params);
+		Set<Entry<String, String>> entrys = sortedParams.entrySet();
+		StringBuilder basestring = new StringBuilder();
+		for (Entry<String, String> param : entrys) {
+			basestring.append(param.getKey()).append("=").append(param.getValue());
+		}
+		return getSignature(basestring.toString(), secret);
+	}
+
+	/**
+	 * MD5 参数签名生成算法
+	 * 
+	 * @param String
+	 *            sigstr 签名字符串
+	 * @param String
+	 *            secret 签名密钥
+	 * @return 签名
+	 * @throws IOException
+	 */
+	public static String getSignature(String sigstr, String secret) {
+		StringBuilder basestring = new StringBuilder(sigstr);
+		basestring.append("#");
+		basestring.append(toMD5(secret));
+		return toMD5(basestring.toString());
+	}
+
+	public static byte[] md5Raw(byte[] data) {
+		byte[] md5buf = null;
+		try {
+			MessageDigest md5 = MessageDigest.getInstance("MD5");
+			md5buf = md5.digest(data);
+		} catch (Exception e) {
+			md5buf = null;
+			logger.severe("md5Raw error.");
+			e.printStackTrace();
+		}
+		return md5buf;
+	}
+
+	public static String md5String(byte[] data) {
+		String md5Str = "";
+		try {
+			MessageDigest md5 = MessageDigest.getInstance("MD5");
+			byte[] buf = md5.digest(data);
+			for (int i = 0; i < buf.length; i++) {
+				md5Str += Byte2Hex.byte2Hex(buf[i]);
+			}
+		} catch (Exception e) {
+			md5Str = null;
+			logger.severe("md5String error.");
+			e.printStackTrace();
+		}
+		return md5Str;
+	}
+
+}

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

@@ -0,0 +1,32 @@
+package com.jeeplus.modules.esignature.utils;
+
+public class StrKit {
+	
+	public static boolean notBlank(String str) {
+		return !isBlank(str);
+	}
+	
+	public static boolean isBlank(String str) {
+		if (str == null) {
+			return true;
+		}
+		int len = str.length();
+		if (len == 0) {
+			return true;
+		}
+		for (int i = 0; i < len; i++) {
+			switch (str.charAt(i)) {
+			case ' ':
+			case '\t':
+			case '\n':
+			case '\r':
+			// case '\b':
+			// case '\f':
+				break;
+			default:
+				return false;
+			}
+		}
+		return true;
+	}
+}

+ 171 - 0
src/main/java/com/jeeplus/modules/esignature/web/EsignatureController.java

@@ -0,0 +1,171 @@
+package com.jeeplus.modules.esignature.web;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jeeplus.common.utils.FileUtils;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.modules.esignature.kinggridserver.KingGridServer;
+import com.jeeplus.modules.esignature.service.signer.SignerService;
+import com.jeeplus.modules.esignature.utils.HttpRequest;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.UUID;
+
+
+/**
+ * 电子签章Controller
+ * @author fgy
+ * @version 2018-04-10
+ */
+@SuppressWarnings("all")
+@Controller
+@RequestMapping(value = "${adminPath}/esignature/esignature")
+public class EsignatureController extends BaseController{
+
+    @RequiresPermissions("esignature:esignature:demoView")
+    @RequestMapping("demoView")
+    public String demoView(HttpServletRequest request, Model model, RedirectAttributes redirectAttributes){
+
+        return "modules/workcontractinfo/demoView";
+    }
+
+    /**
+     * 创建个人用户
+     * @return
+     */
+    @RequestMapping("createSigner")
+    @ResponseBody
+    public String createSigner(HttpServletRequest request, Model model){
+        String result = "";
+        JSONObject jsonObject = new JSONObject();
+        String signer_code = request.getParameter("signer_code");
+        String signer_name = request.getParameter("signer_name");
+        String signer_idcode = request.getParameter("singer_idcode");
+        try {
+            jsonObject = SignerService.createSigner(signer_code, signer_name, signer_idcode);
+            result = jsonObject.toJSONString();
+        }catch (IOException e){
+            e.printStackTrace();
+        }
+        return result;
+    }
+
+    /**
+     * 创建企业用户
+     */
+    @RequestMapping("createCompanySigner")
+    public JSONObject createCompanySigner(HttpServletRequest request, Model model){
+        JSONObject jsonObject = new JSONObject();
+
+        return jsonObject;
+    }
+
+    /**
+     * 签章
+     */
+    @RequestMapping("sign")
+    @ResponseBody
+    public String sign(HttpServletRequest req, Model model, MultipartFile doc_file){
+        String result = "";
+        String contractId = req.getParameter("contractId");
+        String contractName = req.getParameter("contractName");
+        String bizId = req.getParameter("bizId");
+        String signerCode = req.getParameter("signerCode");
+        if(doc_file!=null && !doc_file.isEmpty() &&doc_file.getSize()>0){
+            HttpRequest request = KingGridServer.createHttpRequest("/api/cnt/sign");
+            InputStream is = null;
+            String realPath = req.getSession().getServletContext().getRealPath("esignature_upload/"+System.currentTimeMillis());
+            try{
+                new File(realPath).mkdirs();
+                String fullName = realPath + "/" +doc_file.getOriginalFilename();
+                File f = new File(fullName);
+                FileUtils.copyInputStreamToFile(doc_file.getInputStream(),f);
+
+                is = new FileInputStream(new File(fullName));
+                request.addInputStream("docx_file", fullName, is);
+                request.addParam("contract_name", contractName);
+                request.addParam("contract_id", contractId);
+                request.addParam("biz_id", StringUtils.isBlank(bizId)?UUID.randomUUID().toString().replaceAll("-", ""):bizId);
+                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                //设置业务时间参数
+                request.addParam("biz_time", sdf.format(new Date()));
+                //设置签署人的编码
+                request.addParam("signer_info", "[{code:\""+signerCode+"\",seal_code:\"\" , fontsize:50,offsetX:200,y:400,x:200}]" );
+
+
+                request.send();
+
+                result = request.resultToString();
+                System.out.println(result);
+            }catch (IOException e){
+                e.printStackTrace();
+            }
+            finally{
+                if(is!=null){
+                    try {
+                        is.close();
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+                }
+                boolean b = FileUtils.deleteDirectory(realPath);
+            }
+        }
+
+        return result;
+    }
+
+
+
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 28 - 0
src/main/java/com/jeeplus/modules/exampleeconomics/dao/ExampleEconomicsDao.java

@@ -0,0 +1,28 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.exampleeconomics.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.exampleeconomics.entity.ExampleEconomics;
+import com.jeeplus.modules.examplesingle.entity.ExampleSingle;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 经济指标DAO接口
+ * @author ssrh
+ * @version 2018-08-29
+ */
+@MyBatisDao
+public interface ExampleEconomicsDao extends CrudDao<ExampleEconomics> {
+
+    int deleteByEId(String eId);
+    List<ExampleEconomics> getCount(@Param("companyId")String companyId, @Param("areaId")String areaId, @Param("dictId")String dictId,@Param("indexId")String indexId);
+
+    int delteByIndexId(@Param("eId")String eId,@Param("indexId")String indexId);
+    ExampleEconomics findEconomics(ExampleEconomics exampleEconomics);
+
+}

+ 163 - 0
src/main/java/com/jeeplus/modules/exampleeconomics/entity/ExampleEconomics.java

@@ -0,0 +1,163 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.exampleeconomics.entity;
+
+
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+
+import java.math.BigDecimal;
+
+/**
+ * 经济指标Entity
+ * @author ssrh
+ * @version 2018-08-29
+ */
+public class ExampleEconomics extends DataEntity<ExampleEconomics> {
+	
+	private static final long serialVersionUID = 1L;
+	private String exampleId;		// 概况id
+	private String exampleindicesId;		// 项id
+	private String indexId;		// 指标id
+	private String unit;		// 项单位
+	private String digits;		// 位数
+	private String name;		// 主要分项工程
+	private String money;		// 工程造价
+	private String cost;		// 单位造价
+	private String proportion;		// 占造价比例
+	private BigDecimal counts;
+	private BigDecimal avgs;
+	private BigDecimal sums;
+	private BigDecimal mins;
+	private BigDecimal maxs;
+	
+	public ExampleEconomics() {
+		super();
+	}
+
+	public ExampleEconomics(String id){
+		super(id);
+	}
+
+
+	public String getExampleId() {
+		return exampleId;
+	}
+
+	public void setExampleId(String exampleId) {
+		this.exampleId = exampleId;
+	}
+	
+
+	public String getExampleindicesId() {
+		return exampleindicesId;
+	}
+
+	public void setExampleindicesId(String exampleindicesId) {
+		this.exampleindicesId = exampleindicesId;
+	}
+	
+
+	public String getIndexId() {
+		return indexId;
+	}
+
+	public void setIndexId(String indexId) {
+		this.indexId = indexId;
+	}
+	
+
+	public String getUnit() {
+		return unit;
+	}
+
+	public void setUnit(String unit) {
+		this.unit = unit;
+	}
+	
+
+	public String getDigits() {
+		return digits;
+	}
+
+	public void setDigits(String digits) {
+		this.digits = digits;
+	}
+	
+	@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 String getMoney() {
+		return money;
+	}
+
+	public void setMoney(String money) {
+		this.money = money;
+	}
+	
+	@ExcelField(title="单位造价", align=2, sort=3)
+	public String getCost() {
+		return cost;
+	}
+
+	public void setCost(String cost) {
+		this.cost = cost;
+	}
+	
+	@ExcelField(title="占造价比例", align=2, sort=4)
+	public String getProportion() {
+		return proportion;
+	}
+
+	public void setProportion(String proportion) {
+		this.proportion = proportion;
+	}
+
+	public BigDecimal getCounts() {
+		return counts;
+	}
+
+	public void setCounts(BigDecimal counts) {
+		this.counts = counts;
+	}
+
+	public BigDecimal getAvgs() {
+		return avgs;
+	}
+
+	public void setAvgs(BigDecimal avgs) {
+		this.avgs = avgs;
+	}
+
+	public BigDecimal getMins() {
+		return mins;
+	}
+
+	public void setMins(BigDecimal mins) {
+		this.mins = mins;
+	}
+
+	public BigDecimal getMaxs() {
+		return maxs;
+	}
+
+	public void setMaxs(BigDecimal maxs) {
+		this.maxs = maxs;
+	}
+
+	public BigDecimal getSums() {
+		return sums;
+	}
+
+	public void setSums(BigDecimal sums) {
+		this.sums = sums;
+	}
+}

+ 63 - 0
src/main/java/com/jeeplus/modules/exampleeconomics/service/ExampleEconomicsService.java

@@ -0,0 +1,63 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.exampleeconomics.service;
+
+import java.util.List;
+
+import com.jeeplus.modules.examplesingle.dao.ExampleSingleDao;
+import com.jeeplus.modules.examplesingle.entity.ExampleSingle;
+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.exampleeconomics.entity.ExampleEconomics;
+import com.jeeplus.modules.exampleeconomics.dao.ExampleEconomicsDao;
+
+/**
+ * 经济指标Service
+ * @author ssrh
+ * @version 2018-08-29
+ */
+@Service
+@Transactional(readOnly = true)
+public class ExampleEconomicsService extends CrudService<ExampleEconomicsDao, ExampleEconomics> {
+	@Autowired
+	private ExampleEconomicsDao exampleEconomicsDao;
+	public ExampleEconomics get(String id) {
+		return super.get(id);
+	}
+	public List<ExampleEconomics> getCount(String companyId,String areaId,String dictId,String indexId) {
+		return dao.getCount(companyId,areaId,dictId,indexId);
+	}
+
+	public List<ExampleEconomics> findList(ExampleEconomics exampleEconomics) {
+		return super.findList(exampleEconomics);
+	}
+	
+	public Page<ExampleEconomics> findPage(Page<ExampleEconomics> page, ExampleEconomics exampleEconomics) {
+		return super.findPage(page, exampleEconomics);
+	}
+	
+	@Transactional(readOnly = false)
+	public void save(ExampleEconomics exampleEconomics) {
+		super.save(exampleEconomics);
+	}
+	
+	@Transactional(readOnly = false)
+	public void delete(ExampleEconomics exampleEconomics) {
+		super.delete(exampleEconomics);
+	}
+
+
+	@Transactional(readOnly = false)
+	public void delteByIndexId(String eId,String indexId) {
+		exampleEconomicsDao.delteByIndexId(eId,indexId);
+	}
+	public ExampleEconomics findEconomics(ExampleEconomics exampleEconomics) {
+		return dao.findEconomics(exampleEconomics);
+	}
+
+}

+ 196 - 0
src/main/java/com/jeeplus/modules/exampleeconomics/web/ExampleEconomicsController.java

@@ -0,0 +1,196 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.exampleeconomics.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.exampleeconomics.entity.ExampleEconomics;
+import com.jeeplus.modules.exampleeconomics.service.ExampleEconomicsService;
+
+/**
+ * 经济指标Controller
+ * @author ssrh
+ * @version 2018-08-29
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/exampleeconomics/exampleEconomics")
+public class ExampleEconomicsController extends BaseController {
+
+	@Autowired
+	private ExampleEconomicsService exampleEconomicsService;
+	
+	@ModelAttribute
+	public ExampleEconomics get(@RequestParam(required=false) String id) {
+		ExampleEconomics entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = exampleEconomicsService.get(id);
+		}
+		if (entity == null){
+			entity = new ExampleEconomics();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 经济指标列表页面
+	 */
+	@RequiresPermissions("exampleeconomics:exampleEconomics:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(ExampleEconomics exampleEconomics, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<ExampleEconomics> page = exampleEconomicsService.findPage(new Page<ExampleEconomics>(request, response), exampleEconomics); 
+		model.addAttribute("page", page);
+		return "modules/exampleeconomics/exampleEconomicsList";
+	}
+
+	/**
+	 * 查看,增加,编辑经济指标表单页面
+	 */
+	@RequiresPermissions(value={"exampleeconomics:exampleEconomics:view","exampleeconomics:exampleEconomics:add","exampleeconomics:exampleEconomics:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(ExampleEconomics exampleEconomics, Model model) {
+		model.addAttribute("exampleEconomics", exampleEconomics);
+		return "modules/exampleeconomics/exampleEconomicsForm";
+	}
+
+	/**
+	 * 保存经济指标
+	 */
+	@RequiresPermissions(value={"exampleeconomics:exampleEconomics:add","exampleeconomics:exampleEconomics:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	public String save(ExampleEconomics exampleEconomics, Model model, RedirectAttributes redirectAttributes) throws Exception{
+		if (!beanValidator(model, exampleEconomics)){
+			return form(exampleEconomics, model);
+		}
+		if(!exampleEconomics.getIsNewRecord()){//编辑表单保存
+			ExampleEconomics t = exampleEconomicsService.get(exampleEconomics.getId());//从数据库取出记录的值
+			MyBeanUtils.copyBeanNotNull2Bean(exampleEconomics, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+			exampleEconomicsService.save(t);//保存
+		}else{//新增表单保存
+			exampleEconomicsService.save(exampleEconomics);//保存
+		}
+		addMessage(redirectAttributes, "保存经济指标成功");
+		return "redirect:"+Global.getAdminPath()+"/exampleeconomics/exampleEconomics/?repage";
+	}
+	
+	/**
+	 * 删除经济指标
+	 */
+	@RequiresPermissions("exampleeconomics:exampleEconomics:del")
+	@RequestMapping(value = "delete")
+	public String delete(ExampleEconomics exampleEconomics, RedirectAttributes redirectAttributes) {
+		exampleEconomicsService.delete(exampleEconomics);
+		addMessage(redirectAttributes, "删除经济指标成功");
+		return "redirect:"+Global.getAdminPath()+"/exampleeconomics/exampleEconomics/?repage";
+	}
+	
+	/**
+	 * 批量删除经济指标
+	 */
+	@RequiresPermissions("exampleeconomics:exampleEconomics:del")
+	@RequestMapping(value = "deleteAll")
+	public String deleteAll(String ids, RedirectAttributes redirectAttributes) {
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			exampleEconomicsService.delete(exampleEconomicsService.get(id));
+		}
+		addMessage(redirectAttributes, "删除经济指标成功");
+		return "redirect:"+Global.getAdminPath()+"/exampleeconomics/exampleEconomics/?repage";
+	}
+	
+	/**
+	 * 导出excel文件
+	 */
+	@RequiresPermissions("exampleeconomics:exampleEconomics:export")
+    @RequestMapping(value = "export", method=RequestMethod.POST)
+    public String exportFile(ExampleEconomics exampleEconomics, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "经济指标"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            Page<ExampleEconomics> page = exampleEconomicsService.findPage(new Page<ExampleEconomics>(request, response, -1), exampleEconomics);
+    		new ExportExcel("经济指标", ExampleEconomics.class).setDataList(page.getList()).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导出经济指标记录失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/exampleeconomics/exampleEconomics/?repage";
+    }
+
+	/**
+	 * 导入Excel数据
+
+	 */
+	@RequiresPermissions("exampleeconomics:exampleEconomics: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<ExampleEconomics> list = ei.getDataList(ExampleEconomics.class);
+			for (ExampleEconomics exampleEconomics : list){
+				try{
+					exampleEconomicsService.save(exampleEconomics);
+					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()+"/exampleeconomics/exampleEconomics/?repage";
+    }
+	
+	/**
+	 * 下载导入经济指标数据模板
+	 */
+	@RequiresPermissions("exampleeconomics:exampleEconomics:import")
+    @RequestMapping(value = "import/template")
+    public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "经济指标数据导入模板.xlsx";
+    		List<ExampleEconomics> list = Lists.newArrayList(); 
+    		new ExportExcel("经济指标数据", ExampleEconomics.class, 1).setDataList(list).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入模板下载失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/exampleeconomics/exampleEconomics/?repage";
+    }
+	
+	
+	
+
+}

+ 27 - 0
src/main/java/com/jeeplus/modules/exampleexpend/dao/ExampleExpendDao.java

@@ -0,0 +1,27 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.exampleexpend.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.exampleeconomics.entity.ExampleEconomics;
+import com.jeeplus.modules.exampleexpend.entity.ExampleExpend;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 主要工料价格及消耗量指标DAO接口
+ * @author ssrh
+ * @version 2018-08-29
+ */
+@MyBatisDao
+public interface ExampleExpendDao extends CrudDao<ExampleExpend> {
+    int deleteByEId(String eId);
+
+    List<ExampleExpend> getCount(@Param("companyId")String companyId, @Param("areaId")String areaId, @Param("dictId")String dictId,@Param("indexId")String indexId);
+
+    int delteByIndexId(@Param("eId")String eId,@Param("indexId")String indexId);
+    ExampleExpend findExpend(ExampleExpend exampleExpend);
+}

+ 175 - 0
src/main/java/com/jeeplus/modules/exampleexpend/entity/ExampleExpend.java

@@ -0,0 +1,175 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.exampleexpend.entity;
+
+
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+
+import java.math.BigDecimal;
+
+/**
+ * 主要工料价格及消耗量指标Entity
+ * @author ssrh
+ * @version 2018-08-29
+ */
+public class ExampleExpend extends DataEntity<ExampleExpend> {
+	
+	private static final long serialVersionUID = 1L;
+	private String exampleId;		// 概况id
+	private String exampleindicesId;		// 项id
+	private String indexId;		// 指标id
+	private String unit;		// 单位
+	private String digits;		// 位数
+	private String name;		// 工料名称
+	private String count;		// 数量
+	private String price;		// 单价
+	private String quota;		// 单位指标
+	private BigDecimal counts;
+	private BigDecimal avgs;
+	private BigDecimal sums;
+	private BigDecimal mins;
+	private BigDecimal maxs;
+	private String remarks;	// 备注
+
+	@Override
+	@ExcelField(title="备注", align=2, sort=6)
+	public String getRemarks() {
+		return remarks;
+	}
+
+	@Override
+	public void setRemarks(String remarks) {
+		this.remarks = remarks;
+	}
+
+	public ExampleExpend() {
+		super();
+	}
+
+	public ExampleExpend(String id){
+		super(id);
+	}
+
+
+	public String getExampleId() {
+		return exampleId;
+	}
+
+	public void setExampleId(String exampleId) {
+		this.exampleId = exampleId;
+	}
+	
+
+	public String getExampleindicesId() {
+		return exampleindicesId;
+	}
+
+	public void setExampleindicesId(String exampleindicesId) {
+		this.exampleindicesId = exampleindicesId;
+	}
+	
+
+	public String getIndexId() {
+		return indexId;
+	}
+
+	public void setIndexId(String indexId) {
+		this.indexId = indexId;
+	}
+
+	@ExcelField(title="单位", align=2, sort=2)
+	public String getUnit() {
+		return unit;
+	}
+
+	public void setUnit(String unit) {
+		this.unit = unit;
+	}
+	
+
+	public String getDigits() {
+		return digits;
+	}
+
+	public void setDigits(String digits) {
+		this.digits = digits;
+	}
+	
+	@ExcelField(title="工料名称", align=2, sort=1)
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+	
+	@ExcelField(title="数量", align=2, sort=3)
+	public String getCount() {
+		return count;
+	}
+
+	public void setCount(String count) {
+		this.count = count;
+	}
+	
+	@ExcelField(title="单价", align=2, sort=4)
+	public String getPrice() {
+		return price;
+	}
+
+	public void setPrice(String price) {
+		this.price = price;
+	}
+	
+	@ExcelField(title="单位指标", align=2, sort=5)
+	public String getQuota() {
+		return quota;
+	}
+
+	public void setQuota(String quota) {
+		this.quota = quota;
+	}
+
+	public BigDecimal getCounts() {
+		return counts;
+	}
+
+	public void setCounts(BigDecimal counts) {
+		this.counts = counts;
+	}
+
+	public BigDecimal getAvgs() {
+		return avgs;
+	}
+
+	public void setAvgs(BigDecimal avgs) {
+		this.avgs = avgs;
+	}
+
+	public BigDecimal getSums() {
+		return sums;
+	}
+
+	public void setSums(BigDecimal sums) {
+		this.sums = sums;
+	}
+
+	public BigDecimal getMins() {
+		return mins;
+	}
+
+	public void setMins(BigDecimal mins) {
+		this.mins = mins;
+	}
+
+	public BigDecimal getMaxs() {
+		return maxs;
+	}
+
+	public void setMaxs(BigDecimal maxs) {
+		this.maxs = maxs;
+	}
+}

+ 63 - 0
src/main/java/com/jeeplus/modules/exampleexpend/service/ExampleExpendService.java

@@ -0,0 +1,63 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.exampleexpend.service;
+
+import java.util.List;
+
+import com.jeeplus.modules.exampleeconomics.entity.ExampleEconomics;
+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.exampleexpend.entity.ExampleExpend;
+import com.jeeplus.modules.exampleexpend.dao.ExampleExpendDao;
+
+/**
+ * 主要工料价格及消耗量指标Service
+ * @author ssrh
+ * @version 2018-08-29
+ */
+@Service
+@Transactional(readOnly = true)
+public class ExampleExpendService extends CrudService<ExampleExpendDao, ExampleExpend> {
+	@Autowired
+	private ExampleExpendDao exampleExpendDao;
+	public ExampleExpend get(String id) {
+		return super.get(id);
+	}
+
+	public List<ExampleExpend> getCount(String companyId, String areaId, String dictId,String indexId) {
+		return dao.getCount(companyId,areaId,dictId,indexId);
+	}
+
+	public List<ExampleExpend> findList(ExampleExpend exampleExpend) {
+		return super.findList(exampleExpend);
+	}
+	
+	public Page<ExampleExpend> findPage(Page<ExampleExpend> page, ExampleExpend exampleExpend) {
+		return super.findPage(page, exampleExpend);
+	}
+	
+	@Transactional(readOnly = false)
+	public void save(ExampleExpend exampleExpend) {
+		super.save(exampleExpend);
+	}
+	
+	@Transactional(readOnly = false)
+	public void delete(ExampleExpend exampleExpend) {
+		super.delete(exampleExpend);
+	}
+
+
+	@Transactional(readOnly = false)
+	public void delteByIndexId(String eId,String indexId) {
+		exampleExpendDao.delteByIndexId(eId,indexId);
+	}
+
+	public ExampleExpend findExpend(ExampleExpend exampleExpend) {
+		return dao.findExpend(exampleExpend);
+	}
+}

+ 196 - 0
src/main/java/com/jeeplus/modules/exampleexpend/web/ExampleExpendController.java

@@ -0,0 +1,196 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.exampleexpend.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.exampleexpend.entity.ExampleExpend;
+import com.jeeplus.modules.exampleexpend.service.ExampleExpendService;
+
+/**
+ * 主要工料价格及消耗量指标Controller
+ * @author ssrh
+ * @version 2018-08-29
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/exampleexpend/exampleExpend")
+public class ExampleExpendController extends BaseController {
+
+	@Autowired
+	private ExampleExpendService exampleExpendService;
+	
+	@ModelAttribute
+	public ExampleExpend get(@RequestParam(required=false) String id) {
+		ExampleExpend entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = exampleExpendService.get(id);
+		}
+		if (entity == null){
+			entity = new ExampleExpend();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 主要工料价格及消耗量指标列表页面
+	 */
+	@RequiresPermissions("exampleexpend:exampleExpend:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(ExampleExpend exampleExpend, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<ExampleExpend> page = exampleExpendService.findPage(new Page<ExampleExpend>(request, response), exampleExpend); 
+		model.addAttribute("page", page);
+		return "modules/exampleexpend/exampleExpendList";
+	}
+
+	/**
+	 * 查看,增加,编辑主要工料价格及消耗量指标表单页面
+	 */
+	@RequiresPermissions(value={"exampleexpend:exampleExpend:view","exampleexpend:exampleExpend:add","exampleexpend:exampleExpend:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(ExampleExpend exampleExpend, Model model) {
+		model.addAttribute("exampleExpend", exampleExpend);
+		return "modules/exampleexpend/exampleExpendForm";
+	}
+
+	/**
+	 * 保存主要工料价格及消耗量指标
+	 */
+	@RequiresPermissions(value={"exampleexpend:exampleExpend:add","exampleexpend:exampleExpend:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	public String save(ExampleExpend exampleExpend, Model model, RedirectAttributes redirectAttributes) throws Exception{
+		if (!beanValidator(model, exampleExpend)){
+			return form(exampleExpend, model);
+		}
+		if(!exampleExpend.getIsNewRecord()){//编辑表单保存
+			ExampleExpend t = exampleExpendService.get(exampleExpend.getId());//从数据库取出记录的值
+			MyBeanUtils.copyBeanNotNull2Bean(exampleExpend, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+			exampleExpendService.save(t);//保存
+		}else{//新增表单保存
+			exampleExpendService.save(exampleExpend);//保存
+		}
+		addMessage(redirectAttributes, "保存主要工料价格及消耗量指标成功");
+		return "redirect:"+Global.getAdminPath()+"/exampleexpend/exampleExpend/?repage";
+	}
+	
+	/**
+	 * 删除主要工料价格及消耗量指标
+	 */
+	@RequiresPermissions("exampleexpend:exampleExpend:del")
+	@RequestMapping(value = "delete")
+	public String delete(ExampleExpend exampleExpend, RedirectAttributes redirectAttributes) {
+		exampleExpendService.delete(exampleExpend);
+		addMessage(redirectAttributes, "删除主要工料价格及消耗量指标成功");
+		return "redirect:"+Global.getAdminPath()+"/exampleexpend/exampleExpend/?repage";
+	}
+	
+	/**
+	 * 批量删除主要工料价格及消耗量指标
+	 */
+	@RequiresPermissions("exampleexpend:exampleExpend:del")
+	@RequestMapping(value = "deleteAll")
+	public String deleteAll(String ids, RedirectAttributes redirectAttributes) {
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			exampleExpendService.delete(exampleExpendService.get(id));
+		}
+		addMessage(redirectAttributes, "删除主要工料价格及消耗量指标成功");
+		return "redirect:"+Global.getAdminPath()+"/exampleexpend/exampleExpend/?repage";
+	}
+	
+	/**
+	 * 导出excel文件
+	 */
+	@RequiresPermissions("exampleexpend:exampleExpend:export")
+    @RequestMapping(value = "export", method=RequestMethod.POST)
+    public String exportFile(ExampleExpend exampleExpend, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "主要工料价格及消耗量指标"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            Page<ExampleExpend> page = exampleExpendService.findPage(new Page<ExampleExpend>(request, response, -1), exampleExpend);
+    		new ExportExcel("主要工料价格及消耗量指标", ExampleExpend.class).setDataList(page.getList()).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导出主要工料价格及消耗量指标记录失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/exampleexpend/exampleExpend/?repage";
+    }
+
+	/**
+	 * 导入Excel数据
+
+	 */
+	@RequiresPermissions("exampleexpend:exampleExpend: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<ExampleExpend> list = ei.getDataList(ExampleExpend.class);
+			for (ExampleExpend exampleExpend : list){
+				try{
+					exampleExpendService.save(exampleExpend);
+					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()+"/exampleexpend/exampleExpend/?repage";
+    }
+	
+	/**
+	 * 下载导入主要工料价格及消耗量指标数据模板
+	 */
+	@RequiresPermissions("exampleexpend:exampleExpend:import")
+    @RequestMapping(value = "import/template")
+    public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "主要工料价格及消耗量指标数据导入模板.xlsx";
+    		List<ExampleExpend> list = Lists.newArrayList(); 
+    		new ExportExcel("主要工料价格及消耗量指标数据", ExampleExpend.class, 1).setDataList(list).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入模板下载失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/exampleexpend/exampleExpend/?repage";
+    }
+	
+	
+	
+
+}

+ 26 - 0
src/main/java/com/jeeplus/modules/exampleproject/dao/ExampleProjectDao.java

@@ -0,0 +1,26 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.exampleproject.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.exampleexpend.entity.ExampleExpend;
+import com.jeeplus.modules.exampleproject.entity.ExampleProject;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 主要工程量指标DAO接口
+ * @author ssrh
+ * @version 2018-08-29
+ */
+@MyBatisDao
+public interface ExampleProjectDao extends CrudDao<ExampleProject> {
+
+    int deleteByEId(String eId);
+    List<ExampleProject> getCount(@Param("companyId")String companyId, @Param("areaId")String areaId, @Param("dictId")String dictId,@Param("indexId") String indexId);
+    int delteByIndexId(@Param("eId")String eId,@Param("indexId")String indexId);
+    ExampleProject findProject(ExampleProject exampleProject);
+}

+ 152 - 0
src/main/java/com/jeeplus/modules/exampleproject/entity/ExampleProject.java

@@ -0,0 +1,152 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.exampleproject.entity;
+
+
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+
+import java.math.BigDecimal;
+
+/**
+ * 主要工程量指标Entity
+ * @author ssrh
+ * @version 2018-08-29
+ */
+public class ExampleProject extends DataEntity<ExampleProject> {
+	
+	private static final long serialVersionUID = 1L;
+	private String exampleId;		// 概况id
+	private String exampleindicesId;		// 项id
+	private String indexId;		// 指标id
+	private String unit;		// 单位
+	private String digits;		// 位数
+	private String name;		// 工料名称
+	private String count;		// 数量
+	private String quota;		// 单位指标
+	private BigDecimal counts;
+	private BigDecimal avgs;
+	private BigDecimal sums;
+	private BigDecimal mins;
+	private BigDecimal maxs;
+	
+	public ExampleProject() {
+		super();
+	}
+
+	public ExampleProject(String id){
+		super(id);
+	}
+
+
+	public String getExampleId() {
+		return exampleId;
+	}
+
+	public void setExampleId(String exampleId) {
+		this.exampleId = exampleId;
+	}
+	
+
+	public String getExampleindicesId() {
+		return exampleindicesId;
+	}
+
+	public void setExampleindicesId(String exampleindicesId) {
+		this.exampleindicesId = exampleindicesId;
+	}
+	
+
+	public String getIndexId() {
+		return indexId;
+	}
+
+	public void setIndexId(String indexId) {
+		this.indexId = indexId;
+	}
+
+	public String getDigits() {
+		return digits;
+	}
+
+	public void setDigits(String digits) {
+		this.digits = digits;
+	}
+	
+	@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 String getUnit() {
+		return unit;
+	}
+
+	public void setUnit(String unit) {
+		this.unit = unit;
+	}
+
+	@ExcelField(title="数量", align=2, sort=3)
+	public String getCount() {
+		return count;
+	}
+
+	public void setCount(String count) {
+		this.count = count;
+	}
+	
+	@ExcelField(title="单位指标", align=2, sort=4)
+	public String getQuota() {
+		return quota;
+	}
+
+	public void setQuota(String quota) {
+		this.quota = quota;
+	}
+
+	public BigDecimal getCounts() {
+		return counts;
+	}
+
+	public void setCounts(BigDecimal counts) {
+		this.counts = counts;
+	}
+
+	public BigDecimal getAvgs() {
+		return avgs;
+	}
+
+	public void setAvgs(BigDecimal avgs) {
+		this.avgs = avgs;
+	}
+
+	public BigDecimal getSums() {
+		return sums;
+	}
+
+	public void setSums(BigDecimal sums) {
+		this.sums = sums;
+	}
+
+	public BigDecimal getMins() {
+		return mins;
+	}
+
+	public void setMins(BigDecimal mins) {
+		this.mins = mins;
+	}
+
+	public BigDecimal getMaxs() {
+		return maxs;
+	}
+
+	public void setMaxs(BigDecimal maxs) {
+		this.maxs = maxs;
+	}
+}

+ 63 - 0
src/main/java/com/jeeplus/modules/exampleproject/service/ExampleProjectService.java

@@ -0,0 +1,63 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.exampleproject.service;
+
+import java.util.List;
+
+import com.jeeplus.modules.exampleexpend.entity.ExampleExpend;
+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.exampleproject.entity.ExampleProject;
+import com.jeeplus.modules.exampleproject.dao.ExampleProjectDao;
+
+/**
+ * 主要工程量指标Service
+ * @author ssrh
+ * @version 2018-08-29
+ */
+@Service
+@Transactional(readOnly = true)
+public class ExampleProjectService extends CrudService<ExampleProjectDao, ExampleProject> {
+	@Autowired
+	private ExampleProjectDao exampleProjectDao;
+
+	public ExampleProject get(String id) {
+		return super.get(id);
+	}
+
+	public List<ExampleProject> getCount(String companyId, String areaId, String dictId,String indexId) {
+		return dao.getCount(companyId,areaId,dictId,indexId);
+	}
+
+	public List<ExampleProject> findList(ExampleProject exampleProject) {
+		return super.findList(exampleProject);
+	}
+	
+	public Page<ExampleProject> findPage(Page<ExampleProject> page, ExampleProject exampleProject) {
+		return super.findPage(page, exampleProject);
+	}
+	
+	@Transactional(readOnly = false)
+	public void save(ExampleProject exampleProject) {
+		super.save(exampleProject);
+	}
+	
+	@Transactional(readOnly = false)
+	public void delete(ExampleProject exampleProject) {
+		super.delete(exampleProject);
+	}
+
+	@Transactional(readOnly = false)
+	public void delteByIndexId(String eId,String indexId) {
+		exampleProjectDao.delteByIndexId(eId,indexId);
+	}
+	public ExampleProject findProject(ExampleProject exampleProject) {
+		return dao.findProject(exampleProject);
+	}
+	
+}

+ 196 - 0
src/main/java/com/jeeplus/modules/exampleproject/web/ExampleProjectController.java

@@ -0,0 +1,196 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.exampleproject.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.exampleproject.entity.ExampleProject;
+import com.jeeplus.modules.exampleproject.service.ExampleProjectService;
+
+/**
+ * 主要工程量指标Controller
+ * @author ssrh
+ * @version 2018-08-29
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/exampleproject/exampleProject")
+public class ExampleProjectController extends BaseController {
+
+	@Autowired
+	private ExampleProjectService exampleProjectService;
+	
+	@ModelAttribute
+	public ExampleProject get(@RequestParam(required=false) String id) {
+		ExampleProject entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = exampleProjectService.get(id);
+		}
+		if (entity == null){
+			entity = new ExampleProject();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 主要工程量指标列表页面
+	 */
+	@RequiresPermissions("exampleproject:exampleProject:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(ExampleProject exampleProject, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<ExampleProject> page = exampleProjectService.findPage(new Page<ExampleProject>(request, response), exampleProject); 
+		model.addAttribute("page", page);
+		return "modules/exampleproject/exampleProjectList";
+	}
+
+	/**
+	 * 查看,增加,编辑主要工程量指标表单页面
+	 */
+	@RequiresPermissions(value={"exampleproject:exampleProject:view","exampleproject:exampleProject:add","exampleproject:exampleProject:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(ExampleProject exampleProject, Model model) {
+		model.addAttribute("exampleProject", exampleProject);
+		return "modules/exampleproject/exampleProjectForm";
+	}
+
+	/**
+	 * 保存主要工程量指标
+	 */
+	@RequiresPermissions(value={"exampleproject:exampleProject:add","exampleproject:exampleProject:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	public String save(ExampleProject exampleProject, Model model, RedirectAttributes redirectAttributes) throws Exception{
+		if (!beanValidator(model, exampleProject)){
+			return form(exampleProject, model);
+		}
+		if(!exampleProject.getIsNewRecord()){//编辑表单保存
+			ExampleProject t = exampleProjectService.get(exampleProject.getId());//从数据库取出记录的值
+			MyBeanUtils.copyBeanNotNull2Bean(exampleProject, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+			exampleProjectService.save(t);//保存
+		}else{//新增表单保存
+			exampleProjectService.save(exampleProject);//保存
+		}
+		addMessage(redirectAttributes, "保存主要工程量指标成功");
+		return "redirect:"+Global.getAdminPath()+"/exampleproject/exampleProject/?repage";
+	}
+	
+	/**
+	 * 删除主要工程量指标
+	 */
+	@RequiresPermissions("exampleproject:exampleProject:del")
+	@RequestMapping(value = "delete")
+	public String delete(ExampleProject exampleProject, RedirectAttributes redirectAttributes) {
+		exampleProjectService.delete(exampleProject);
+		addMessage(redirectAttributes, "删除主要工程量指标成功");
+		return "redirect:"+Global.getAdminPath()+"/exampleproject/exampleProject/?repage";
+	}
+	
+	/**
+	 * 批量删除主要工程量指标
+	 */
+	@RequiresPermissions("exampleproject:exampleProject:del")
+	@RequestMapping(value = "deleteAll")
+	public String deleteAll(String ids, RedirectAttributes redirectAttributes) {
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			exampleProjectService.delete(exampleProjectService.get(id));
+		}
+		addMessage(redirectAttributes, "删除主要工程量指标成功");
+		return "redirect:"+Global.getAdminPath()+"/exampleproject/exampleProject/?repage";
+	}
+	
+	/**
+	 * 导出excel文件
+	 */
+	@RequiresPermissions("exampleproject:exampleProject:export")
+    @RequestMapping(value = "export", method=RequestMethod.POST)
+    public String exportFile(ExampleProject exampleProject, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "主要工程量指标"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            Page<ExampleProject> page = exampleProjectService.findPage(new Page<ExampleProject>(request, response, -1), exampleProject);
+    		new ExportExcel("主要工程量指标", ExampleProject.class).setDataList(page.getList()).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导出主要工程量指标记录失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/exampleproject/exampleProject/?repage";
+    }
+
+	/**
+	 * 导入Excel数据
+
+	 */
+	@RequiresPermissions("exampleproject:exampleProject: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<ExampleProject> list = ei.getDataList(ExampleProject.class);
+			for (ExampleProject exampleProject : list){
+				try{
+					exampleProjectService.save(exampleProject);
+					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()+"/exampleproject/exampleProject/?repage";
+    }
+	
+	/**
+	 * 下载导入主要工程量指标数据模板
+	 */
+	@RequiresPermissions("exampleproject:exampleProject:import")
+    @RequestMapping(value = "import/template")
+    public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "主要工程量指标数据导入模板.xlsx";
+    		List<ExampleProject> list = Lists.newArrayList(); 
+    		new ExportExcel("主要工程量指标数据", ExampleProject.class, 1).setDataList(list).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入模板下载失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/exampleproject/exampleProject/?repage";
+    }
+	
+	
+	
+
+}

+ 26 - 0
src/main/java/com/jeeplus/modules/examplesingle/dao/ExampleSingleDao.java

@@ -0,0 +1,26 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.examplesingle.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.examplesingle.entity.ExampleSingle;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 单项工程造价指标DAO接口
+ * @author ssrh
+ * @version 2018-08-29
+ */
+@MyBatisDao
+public interface ExampleSingleDao extends CrudDao<ExampleSingle> {
+    List<ExampleSingle> getCount(@Param("companyId")String companyId, @Param("areaId")String areaId, @Param("dictId")String dictId, @Param("indexId")String indexId);
+
+    int deleteByEId(String eId);
+
+    int delteByIndexId(@Param("eId")String eId,@Param("indexId")String indexId);
+    ExampleSingle findSingle(ExampleSingle exampleSingle);
+}

+ 163 - 0
src/main/java/com/jeeplus/modules/examplesingle/entity/ExampleSingle.java

@@ -0,0 +1,163 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.examplesingle.entity;
+
+
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+
+import java.math.BigDecimal;
+
+/**
+ * 单项工程造价指标Entity
+ * @author ssrh
+ * @version 2018-08-29
+ */
+public class ExampleSingle extends DataEntity<ExampleSingle> {
+	
+	private static final long serialVersionUID = 1L;
+	private String exampleId;		// 概况id
+	private String exampleIndicesId;		// 项id
+	private String indexId;		// 指标id
+	private String unit;		// 项单位
+	private String digits;		// 位数
+	private String name;		// 费用名称
+	private String money;		// 金额
+	private String cost;		// 单位造价
+	private String proportion;		// 占造价比例
+	private BigDecimal counts;
+	private BigDecimal avgs;
+	private BigDecimal mins;
+	private BigDecimal maxs;
+	private BigDecimal sums;
+	
+	public ExampleSingle() {
+		super();
+	}
+
+	public ExampleSingle(String id){
+		super(id);
+	}
+
+
+	public String getExampleId() {
+		return exampleId;
+	}
+
+	public void setExampleId(String exampleId) {
+		this.exampleId = exampleId;
+	}
+	
+
+	public String getExampleIndicesId() {
+		return exampleIndicesId;
+	}
+
+	public void setExampleIndicesId(String exampleIndicesId) {
+		this.exampleIndicesId = exampleIndicesId;
+	}
+	
+
+	public String getIndexId() {
+		return indexId;
+	}
+
+	public void setIndexId(String indexId) {
+		this.indexId = indexId;
+	}
+	
+
+	public String getUnit() {
+		return unit;
+	}
+
+	public void setUnit(String unit) {
+		this.unit = unit;
+	}
+	
+
+	public String getDigits() {
+		return digits;
+	}
+
+	public void setDigits(String digits) {
+		this.digits = digits;
+	}
+	
+	@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 String getMoney() {
+		return money;
+	}
+
+	public void setMoney(String money) {
+		this.money = money;
+	}
+	
+	@ExcelField(title="单位造价(元/m2)", align=2, sort=3)
+	public String getCost() {
+		return cost;
+	}
+
+	public void setCost(String cost) {
+		this.cost = cost;
+	}
+	
+	@ExcelField(title="占造价比例(%)", align=2, sort=4)
+	public String getProportion() {
+		return proportion;
+	}
+
+	public void setProportion(String proportion) {
+		this.proportion = proportion;
+	}
+
+	public BigDecimal getCounts() {
+		return counts;
+	}
+
+	public void setCounts(BigDecimal counts) {
+		this.counts = counts;
+	}
+
+	public BigDecimal getAvgs() {
+		return avgs;
+	}
+
+	public void setAvgs(BigDecimal avgs) {
+		this.avgs = avgs;
+	}
+
+	public BigDecimal getMins() {
+		return mins;
+	}
+
+	public void setMins(BigDecimal mins) {
+		this.mins = mins;
+	}
+
+	public BigDecimal getMaxs() {
+		return maxs;
+	}
+
+	public void setMaxs(BigDecimal maxs) {
+		this.maxs = maxs;
+	}
+
+	public BigDecimal getSums() {
+		return sums;
+	}
+
+	public void setSums(BigDecimal sums) {
+		this.sums = sums;
+	}
+}

+ 61 - 0
src/main/java/com/jeeplus/modules/examplesingle/service/ExampleSingleService.java

@@ -0,0 +1,61 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.examplesingle.service;
+
+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.modules.examplesingle.entity.ExampleSingle;
+import com.jeeplus.modules.examplesingle.dao.ExampleSingleDao;
+
+/**
+ * 单项工程造价指标Service
+ * @author ssrh
+ * @version 2018-08-29
+ */
+@Service
+@Transactional(readOnly = true)
+public class ExampleSingleService extends CrudService<ExampleSingleDao, ExampleSingle> {
+	@Autowired
+	private ExampleSingleDao exampleSingleDao;
+	public ExampleSingle get(String id) {
+		return super.get(id);
+	}
+	public List<ExampleSingle> getCount(String companyId,String areaId,String dictId,String indexId) {
+		return dao.getCount(companyId,areaId,dictId,indexId);
+	}
+
+	public List<ExampleSingle> findList(ExampleSingle exampleSingle) {
+		return super.findList(exampleSingle);
+	}
+	
+	public Page<ExampleSingle> findPage(Page<ExampleSingle> page, ExampleSingle exampleSingle) {
+		return super.findPage(page, exampleSingle);
+	}
+	
+	@Transactional(readOnly = false)
+	public void save(ExampleSingle exampleSingle) {
+		super.save(exampleSingle);
+	}
+	
+	@Transactional(readOnly = false)
+	public void delete(ExampleSingle exampleSingle) {
+		super.delete(exampleSingle);
+	}
+	@Transactional(readOnly = false)
+	public void delteByIndexId(String eId,String indexId) {
+		exampleSingleDao.delteByIndexId(eId,indexId);
+	}
+	//根据项id指标id概况id获取对象
+	public ExampleSingle findSingle(ExampleSingle exampleSingle) {
+		return dao.findSingle(exampleSingle);
+	}
+	
+	
+}

+ 196 - 0
src/main/java/com/jeeplus/modules/examplesingle/web/ExampleSingleController.java

@@ -0,0 +1,196 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.examplesingle.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.examplesingle.entity.ExampleSingle;
+import com.jeeplus.modules.examplesingle.service.ExampleSingleService;
+
+/**
+ * 单项工程造价指标Controller
+ * @author ssrh
+ * @version 2018-08-29
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/examplesingle/exampleSingle")
+public class ExampleSingleController extends BaseController {
+
+	@Autowired
+	private ExampleSingleService exampleSingleService;
+	
+	@ModelAttribute
+	public ExampleSingle get(@RequestParam(required=false) String id) {
+		ExampleSingle entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = exampleSingleService.get(id);
+		}
+		if (entity == null){
+			entity = new ExampleSingle();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 单项工程造价指标列表页面
+	 */
+	@RequiresPermissions("examplesingle:exampleSingle:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(ExampleSingle exampleSingle, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<ExampleSingle> page = exampleSingleService.findPage(new Page<ExampleSingle>(request, response), exampleSingle); 
+		model.addAttribute("page", page);
+		return "modules/examplesingle/exampleSingleList";
+	}
+
+	/**
+	 * 查看,增加,编辑单项工程造价指标表单页面
+	 */
+	@RequiresPermissions(value={"examplesingle:exampleSingle:view","examplesingle:exampleSingle:add","examplesingle:exampleSingle:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(ExampleSingle exampleSingle, Model model) {
+		model.addAttribute("exampleSingle", exampleSingle);
+		return "modules/examplesingle/exampleSingleForm";
+	}
+
+	/**
+	 * 保存单项工程造价指标
+	 */
+	@RequiresPermissions(value={"examplesingle:exampleSingle:add","examplesingle:exampleSingle:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	public String save(ExampleSingle exampleSingle, Model model, RedirectAttributes redirectAttributes) throws Exception{
+		if (!beanValidator(model, exampleSingle)){
+			return form(exampleSingle, model);
+		}
+		if(!exampleSingle.getIsNewRecord()){//编辑表单保存
+			ExampleSingle t = exampleSingleService.get(exampleSingle.getId());//从数据库取出记录的值
+			MyBeanUtils.copyBeanNotNull2Bean(exampleSingle, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+			exampleSingleService.save(t);//保存
+		}else{//新增表单保存
+			exampleSingleService.save(exampleSingle);//保存
+		}
+		addMessage(redirectAttributes, "保存单项工程造价指标成功");
+		return "redirect:"+Global.getAdminPath()+"/examplesingle/exampleSingle/?repage";
+	}
+	
+	/**
+	 * 删除单项工程造价指标
+	 */
+	@RequiresPermissions("examplesingle:exampleSingle:del")
+	@RequestMapping(value = "delete")
+	public String delete(ExampleSingle exampleSingle, RedirectAttributes redirectAttributes) {
+		exampleSingleService.delete(exampleSingle);
+		addMessage(redirectAttributes, "删除单项工程造价指标成功");
+		return "redirect:"+Global.getAdminPath()+"/examplesingle/exampleSingle/?repage";
+	}
+	
+	/**
+	 * 批量删除单项工程造价指标
+	 */
+	@RequiresPermissions("examplesingle:exampleSingle:del")
+	@RequestMapping(value = "deleteAll")
+	public String deleteAll(String ids, RedirectAttributes redirectAttributes) {
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			exampleSingleService.delete(exampleSingleService.get(id));
+		}
+		addMessage(redirectAttributes, "删除单项工程造价指标成功");
+		return "redirect:"+Global.getAdminPath()+"/examplesingle/exampleSingle/?repage";
+	}
+	
+	/**
+	 * 导出excel文件
+	 */
+	@RequiresPermissions("examplesingle:exampleSingle:export")
+    @RequestMapping(value = "export", method=RequestMethod.POST)
+    public String exportFile(ExampleSingle exampleSingle, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "单项工程造价指标"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            Page<ExampleSingle> page = exampleSingleService.findPage(new Page<ExampleSingle>(request, response, -1), exampleSingle);
+    		new ExportExcel("单项工程造价指标", ExampleSingle.class).setDataList(page.getList()).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导出单项工程造价指标记录失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/examplesingle/exampleSingle/?repage";
+    }
+
+	/**
+	 * 导入Excel数据
+
+	 */
+	@RequiresPermissions("examplesingle:exampleSingle: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<ExampleSingle> list = ei.getDataList(ExampleSingle.class);
+			for (ExampleSingle exampleSingle : list){
+				try{
+					exampleSingleService.save(exampleSingle);
+					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()+"/examplesingle/exampleSingle/?repage";
+    }
+	
+	/**
+	 * 下载导入单项工程造价指标数据模板
+	 */
+	@RequiresPermissions("examplesingle:exampleSingle:import")
+    @RequestMapping(value = "import/template")
+    public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "单项工程造价指标数据导入模板.xlsx";
+    		List<ExampleSingle> list = Lists.newArrayList(); 
+    		new ExportExcel("单项工程造价指标数据", ExampleSingle.class, 1).setDataList(list).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入模板下载失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/examplesingle/exampleSingle/?repage";
+    }
+	
+	
+	
+
+}

+ 123 - 0
src/main/java/com/jeeplus/modules/filePreview/FileSplit.java

@@ -0,0 +1,123 @@
+package com.jeeplus.modules.filePreview;
+
+import org.apache.commons.codec.binary.Base64;
+
+import java.io.*;
+import java.util.HashMap;
+import java.util.Map;
+
+public class FileSplit {
+    /**
+     * 分割
+     * @param fileName 文件路径
+     * @param Number 分块文件个数
+     * @throws Exception
+     */
+    public void splitByNumber(String fileName,int Number) throws Exception{
+        File oldFile=new File(fileName);
+        BufferedInputStream in=new BufferedInputStream(new FileInputStream(oldFile));
+        String file=encode(in);
+        int length=file.length();
+        System.out.println("字符串长度:"+length);
+        int size=length/Number;
+        int start=0,end=size;
+        BufferedOutputStream out=null;
+        File newFile=null;
+        String str_temp=null;
+        for(int i=0;i<Number-1;i++){
+            str_temp=i+" "+oldFile.getName()+"\n";
+            str_temp+=file.substring(start,end);
+            newFile=new File("F:\\fenge\\"+randNumber()+".file");
+            out=new BufferedOutputStream(new FileOutputStream(newFile));
+            out.write(str_temp.getBytes());
+            out.close();
+            start+=size;
+            end+=size;
+        }
+        str_temp=Number-1+" "+oldFile.getName()+"\n";
+        str_temp+=file.substring(start);
+        newFile=new File("F:\\fenge\\"+randNumber()+".file");
+        out=new BufferedOutputStream(new FileOutputStream(newFile));
+        out.write(str_temp.getBytes());
+        out.close();
+        return;
+    }
+
+    /**
+     * 文件合并
+     * @param path
+     * @throws Exception
+     */
+    public void mergeByName(String path) throws Exception{
+        File file=new File(path);
+        File list[]=file.listFiles();
+        Map<String,String> map=new HashMap<String, String>();
+        String newFileName=null;
+        for(File f:list){
+            BufferedReader reader=new BufferedReader(new InputStreamReader(new FileInputStream(f)));
+            String str_head=reader.readLine();
+            String id=str_head.substring(0,str_head.indexOf(" "));
+            newFileName=str_head.substring(str_head.indexOf(" ")+1);
+            map.put(id,f.getAbsolutePath());
+            reader.close();
+        }
+
+        StringBuffer stringBuffer=new StringBuffer();
+        for(int i=0;i<list.length;i++){
+            File f=new File(map.get(String.valueOf(i)));
+            BufferedReader reader=new BufferedReader(new InputStreamReader(new FileInputStream(f)));
+            reader.readLine();
+            String temp=null;
+            while ((temp=reader.readLine())!=null){
+                stringBuffer.append(temp);
+            }
+            reader.close();
+        }
+        BufferedOutputStream out=new BufferedOutputStream(new FileOutputStream("F:\\hebing\\"+newFileName));
+        out.write(decode(stringBuffer.toString()));
+        out.close();
+    }
+
+    /**
+     * 编码
+     * @param in
+     * @return
+     * @throws IOException
+     */
+    public String encode(InputStream in) throws IOException{
+        byte[] data = new byte[in.available()];
+        in.read(data);
+        return Base64.encodeBase64String(data);
+    }
+
+    /**
+     * 解码
+     * @param base64Str
+     * @return
+     * @throws IOException
+     */
+    public byte[] decode(String base64Str)throws IOException{
+        return Base64.decodeBase64(base64Str);
+    }
+
+    /**
+     * 随机数
+     * @return
+     */
+    public String randNumber(){
+        double number=Math.random();
+        String str= String.valueOf(number);
+        str=str.replace(".","");
+        return str;
+    }
+    public static void main(String[] args){
+        try {
+            //分块
+//            new FileSplit().splitByNumber("F:\\aa.pdf",10);
+            //合并
+            new FileSplit().mergeByName("F:\\fenge\\");
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+}

+ 36 - 0
src/main/java/com/jeeplus/modules/filePreview/OSSRequestSigner.java

@@ -0,0 +1,36 @@
+package com.jeeplus.modules.filePreview;
+
+import com.aliyun.oss.ClientException;
+import com.aliyun.oss.common.auth.Credentials;
+import com.aliyun.oss.common.auth.RequestSigner;
+import com.aliyun.oss.common.auth.ServiceSignature;
+import com.aliyun.oss.common.comm.RequestMessage;
+import com.aliyun.oss.internal.OSSHeaders;
+import com.aliyun.oss.internal.OSSUtils;
+import com.aliyun.oss.internal.SignUtils;
+
+public class OSSRequestSigner  implements RequestSigner{
+    private String httpMethod;
+
+    /* Note that resource path should not have been url-encoded. */
+    private String resourcePath;
+    private Credentials creds;
+
+    public OSSRequestSigner(String httpMethod, String resourcePath, Credentials creds) {
+        this.httpMethod = httpMethod;
+        this.resourcePath = resourcePath;
+        this.creds = creds;
+    }
+
+    @Override
+    public void sign(RequestMessage request) throws ClientException {
+        String accessKeyId = creds.getAccessKeyId();
+        String secretAccessKey = creds.getSecretAccessKey();
+
+        if (accessKeyId.length() > 0 && secretAccessKey.length() > 0) {
+            String canonicalString = SignUtils.buildCanonicalString(httpMethod, resourcePath, request, null);
+            String signature = ServiceSignature.create().computeSignature(secretAccessKey, canonicalString);
+            request.addHeader(OSSHeaders.AUTHORIZATION, OSSUtils.composeRequestAuthorization(accessKeyId, signature));
+        }
+    }
+}

+ 107 - 0
src/main/java/com/jeeplus/modules/filePreview/OssUpload.java

@@ -0,0 +1,107 @@
+package com.jeeplus.modules.filePreview;
+
+import org.apache.commons.codec.binary.Base64;
+
+import javax.crypto.Mac;
+import javax.crypto.spec.SecretKeySpec;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+public class OssUpload {
+    private String ossAccessId = "LTAIi7VuxcgfJR2x";  // 你的访问AK信息
+    private String ossAccessKey = "Q9xF9V7tcnCI28ttUsP8H4GyAhZta7";  // 你的访问AK信息
+    private String ossEndpoint = "http://oss-cn-hangzhou.aliyuncs.com";
+    public void sendPost() throws ParseException {
+        try{
+            final String HTTP_METHOD = "GET";
+            Map<String, String> parameters = new HashMap<String, String>();
+            // 加入请求参数
+            parameters.put("Action", "DescribeRegions");
+            parameters.put("Version", "2014-05-26");
+            parameters.put("AccessKeyId", ossAccessId);
+            parameters.put("TimeStamp", formatIso8601Date(new Date())); //TimeStamp
+            parameters.put("SignatureMethod", "HMAC-SHA1");
+            parameters.put("SignatureVersion", "1.0");
+            parameters.put("SignatureNonce", UUID.randomUUID().toString());
+            parameters.put("Format", "XML");
+
+//            parameters.put("CanonicalizedResource", "/attachment-file/workProjectRemote/12177742302292375/abc7dedc12c0773e866cb3add0ee67ac.pdf?uploads");
+//            parameters.put("Authorization","OSS LTAIi7VuxcgfJR2x:Q9xF9V7tcnCI28ttUsP8H4GyAhZta7=");
+
+            // 对参数进行排序
+            String[] sortedKeys = parameters.keySet().toArray(new String[]{});
+            Arrays.sort(sortedKeys);
+            final String SEPARATOR = "&";
+
+            // 生成stringToSign字符串
+            StringBuilder stringToSign = new StringBuilder();
+            stringToSign.append(HTTP_METHOD).append(SEPARATOR);
+            stringToSign.append(percentEncode("/")).append(SEPARATOR);
+
+            StringBuilder canonicalizedQueryString = new StringBuilder();
+            for(String key : sortedKeys) {
+                // 这里注意对key和value进行编码
+                canonicalizedQueryString.append("&")
+                        .append(percentEncode(key)).append("=")
+                        .append(percentEncode(parameters.get(key)));
+            }
+
+            // 这里注意对canonicalizedQueryString进行编码
+            stringToSign.append(percentEncode(
+                    canonicalizedQueryString.toString().substring(1)));
+
+            System.out.println(stringToSign+"----");
+            System.out.println(canonicalizedQueryString+"----");
+            final String ALGORITHM = "HmacSHA1";
+            final String ENCODING = "UTF-8";
+            String key = "Q9xF9V7tcnCI28ttUsP8H4GyAhZta7&";
+
+            Mac mac = null;
+            mac = Mac.getInstance(ALGORITHM);
+            mac.init(new SecretKeySpec(key.getBytes(ENCODING), ALGORITHM));
+            byte[] signData = mac.doFinal(stringToSign.toString().getBytes(ENCODING));
+            String signature = new String(Base64.encodeBase64(signData));
+            System.out.println(signature);
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 格式化时间
+     */
+    private static final String ISO8601_DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss'Z'";
+    private static String formatIso8601Date(Date date) {
+        SimpleDateFormat df = new SimpleDateFormat(ISO8601_DATE_FORMAT);
+        df.setTimeZone(new SimpleTimeZone(0, "GMT"));
+        return df.format(date);
+    }
+
+    /**
+     * 格式化编码
+     */
+    private static final String ENCODING = "UTF-8";
+
+    private static String percentEncode(String value) throws UnsupportedEncodingException {
+        return value != null ? URLEncoder.encode(value, ENCODING).replace("+", "%20").replace("*", "%2A").replace("%7E", "~") : null;
+    }
+
+
+    public static void main(String[] args) {
+        // 以下是一段计算签名的示例代码
+        //第一个接口
+        String url = "http://ecs.aliyuncs.com/?Signature=nlP6EzL3p7z/UzFSkhcB8lD/iWw=&AccessKeyId=LTAIi7VuxcgfJR2x&Action=DescribeRegions&Format=XML&SignatureMethod=HMAC-SHA1&SignatureNonce=1d320cb5-c794-450b-86ec-68681bb01685&SignatureVersion=1.0&TimeStamp=2017-12-21T02%3A46%3A02Z&Version=2014-05-26";
+        try {
+            new OssUpload().sendPost();
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+
+        String data = formatIso8601Date(new Date());
+        System.out.println(data);
+
+    }
+}

+ 273 - 0
src/main/java/com/jeeplus/modules/filePreview/PreviewController.java

@@ -0,0 +1,273 @@
+package com.jeeplus.modules.filePreview;
+
+
+import com.aliyun.oss.OSSClient;
+import com.aliyun.oss.common.utils.BinaryUtil;
+import com.aliyun.oss.model.PolicyConditions;
+import com.aliyuncs.DefaultAcsClient;
+import com.aliyuncs.exceptions.ClientException;
+import com.aliyuncs.http.MethodType;
+import com.aliyuncs.http.ProtocolType;
+import com.aliyuncs.profile.DefaultProfile;
+import com.aliyuncs.profile.IClientProfile;
+import com.aliyuncs.sts.model.v20150401.AssumeRoleRequest;
+import com.aliyuncs.sts.model.v20150401.AssumeRoleResponse;
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.*;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+@Controller
+@RequestMapping("${adminPath}/previewController")
+public class PreviewController extends BaseController {
+
+
+
+
+
+    /**
+     * 删除信息
+     *
+     * @return
+     */
+    @RequestMapping("/deleteUrl")
+    @ResponseBody
+    public boolean deleteUrl(HttpServletRequest request) {
+        String id = UserUtils.getUser().getId();
+        String realPath = request.getSession().getServletContext().getRealPath("/");
+        File f = new File(realPath + "/webpage/modules/web/" + id + "/");
+        boolean flag = false;
+        if (f.exists()) {
+            flag = deleteDir(f);
+        }
+        return flag;
+    }
+
+    private static boolean deleteDir(File dir) {
+        if (dir.isDirectory()) {
+            String[] children = dir.list();
+            for (int i = 0; i < children.length; i++) {
+                boolean success = deleteDir(new File(dir, children[i]));
+                if (!success) {
+                    return false;
+                }
+            }
+        }
+        // 目录此时为空,可以删除
+        return dir.delete();
+    }
+
+
+//    @RequestMapping("/openexcel")
+//    public String openexcel(HttpServletRequest request, HttpServletResponse response){
+//        PageOfficeCtrl poCtrl=new PageOfficeCtrl(request);
+//        request.setAttribute("poCtrl", poCtrl);
+//        //设置服务页面
+//        poCtrl.setServerPage(request.getContextPath()+"/poserver.zz");
+//        //添加保存按钮
+//        poCtrl.addCustomToolButton("保存并关闭","Save",1);
+//        //设置保存页面
+//        poCtrl.setSaveFilePage("/savefile.do");
+//        //打开excel
+//        poCtrl.webOpen("doc/test.xls", OpenModeType.xlsNormalEdit,"张三");
+//        return "modules/workclientinfo/Excel";
+//    }
+//
+//    @RequestMapping("/openword")
+//    public String openword(@RequestParam(value = "fileUrl") String fileUrl,HttpServletRequest request, HttpServletResponse response){
+//        PageOfficeCtrl poCtrl=new PageOfficeCtrl(request);
+//        request.setAttribute("poCtrl", poCtrl);
+//        //设置服务页面
+//        poCtrl.setServerPage(request.getContextPath()+"/poserver.zz");
+//        //添加保存按钮
+//        poCtrl.addCustomToolButton("保存并关闭","Save",1);
+//        //设置保存的action
+//        poCtrl.setSaveFilePage("/savefile");
+//        //打开word
+//        poCtrl.webOpen(fileUrl,OpenModeType.docAdmin,"张三");
+//        return "modules/workclientinfo/Word";
+//    }
+//
+//    @RequestMapping("/savefile")
+//    public  void  savefile(HttpServletRequest request, HttpServletResponse response){
+//        FileSaver fs = new FileSaver(request, response);
+//        fs.saveToFile(request.getSession().getServletContext().getRealPath("doc/") + "/" + fs.getFileName());
+//        fs.close();
+//    }
+
+    @RequestMapping("/getDirectAccess")
+    @ResponseBody
+    public Map<Object, Object> getDirectAccess(HttpServletRequest request, HttpServletResponse response) {
+        Map<Object, Object> respMap = new HashMap<Object, Object>();
+        Date expiration = new Date();
+        long expireTime = 365 * 10 * 24 * 3600;
+        long expireEndTime = System.currentTimeMillis() + expireTime * 1000;
+
+        ///2050/1/1 许可到期时间
+//
+//        long expireTime = 600;
+//        long expireEndTime = System.currentTimeMillis() + expireTime * 1000;
+//        String host = Global.getAliyunUrl();
+       String accessId = "LTAIzG5m63BhoGa7";
+//        String accessKey = "J0mEs8AYtgGWrfC54cSGgUXHCOOjvS";
+//        PolicyConditions policyConds = new PolicyConditions();
+//        policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 1048576000);
+//        OSSClient client = new OSSClient(host, accessId, accessKey);
+//        try {
+//            Date expiration = new Date(expireEndTime);
+//            String postPolicy = client.generatePostPolicy(expiration, policyConds);
+//            byte[] binaryData = postPolicy.getBytes("utf-8");
+            String encodedPolicy = "eyJleHBpcmF0aW9uIjoiMjA1MC0wMS0wMVQxMjowMDowMC4wMDBaIiwiY29uZGl0aW9ucyI6W1siY29udGVudC1sZW5ndGgtcmFuZ2UiLDAsMTA0ODU3NjAwMF1dfQ==";//BinaryUtil.toBase64String(binaryData);
+            String postSignature = "Sa28845KJOv8TYDRyg2A/+A6RZk=";//client.calculatePostSignature(postPolicy);
+            respMap.put("accessid", accessId);
+            respMap.put("policy", encodedPolicy);
+            respMap.put("signature", postSignature);
+            respMap.put("expire", expireEndTime);
+            respMap.put("host", Global.getAliyunUrl());
+            return respMap;
+//        }catch(Exception e)
+//        {
+//            return respMap;
+//        }
+    }
+    @RequestMapping("/getAccess")
+    @ResponseBody
+    public Map<Object, Object> getAccess(HttpServletRequest request, HttpServletResponse response) {
+
+        // 只有 RAM用户(子账号)才能调用 AssumeRole 接口
+        // 阿里云主账号的AccessKeys不能用于发起AssumeRole请求
+        // 请首先在RAM控制台创建一个RAM用户,并为这个用户创建AccessKeys
+        String accessKeyId =  "LTAIzG5m63BhoGa7";//Global.getAccessKeyId();
+        String accessKeySecret = "J0mEs8AYtgGWrfC54cSGgUXHCOOjvS"; //Global.getAccessKeySecret();
+
+        // RoleArn 需要在 RAM 控制台上获取
+        String roleArn = "acs:ram::1251733816552326:role/stsrole";
+        long durationSeconds = Long.parseLong("900");
+        String policy = "{\n" +
+                "    \"Version\": \"1\", \n" +
+                "    \"Statement\": [\n" +
+                "        {\n" +
+                "            \"Action\": [\n" +
+                "                \"oss:*\"\n" +
+                "            ], \n" +
+                "            \"Resource\": [\n" +
+                "                \"acs:oss:*:*:*\" \n" +
+                "            ], \n" +
+                "            \"Effect\": \"Allow\"\n" +
+                "        }\n" +
+                "    ]\n" +
+                "}";
+//        String policy = null;
+        // RoleSessionName 是临时Token的会话名称,自己指定用于标识你的用户,主要用于审计,或者用于区分Token颁发给谁
+        // 但是注意RoleSessionName的长度和规则,不要有空格,只能有'-' '_' 字母和数字等字符
+        // 具体规则请参考API文档中的格式要求
+        String roleSessionName = "alice-001";
+        // 此处必须为 HTTPS
+        ProtocolType protocolType = ProtocolType.HTTPS;
+        try {
+            final AssumeRoleResponse stsResponse = assumeRole(accessKeyId, accessKeySecret, roleArn, roleSessionName,
+                    policy, protocolType, durationSeconds);
+
+            Map<Object, Object> respMap = new HashMap<Object, Object>();
+            respMap.put("status", "200");
+            respMap.put("AccessKeyId", stsResponse.getCredentials().getAccessKeyId());
+            respMap.put("AccessKeySecret", stsResponse.getCredentials().getAccessKeySecret());
+            respMap.put("SecurityToken", stsResponse.getCredentials().getSecurityToken());
+            respMap.put("Expiration", stsResponse.getCredentials().getExpiration());
+            respMap.put("AliyunUrl", Global.getAliyunUrl());
+            respMap.put("Bucket", Global.getBucketName());
+            respMap.put("Endpoint", Global.getEndpoint());
+            return respMap;
+        } catch (ClientException e) {
+
+            Map<Object, Object> respMap = new HashMap<Object, Object>();
+            respMap.put("status", e.getErrCode());
+            respMap.put("AccessKeyId", "");
+            respMap.put("AccessKeySecret", "");
+            respMap.put("SecurityToken", "");
+            respMap.put("Expiration", "");
+            respMap.put("AliyunUrl", "");
+            respMap.put("Bucket", "");
+            respMap.put("Endpoint", "");
+            return respMap;
+        }
+    }
+
+    public static String ReadJson(String path){
+        //从给定位置获取文件
+        File file = new File(path);
+        BufferedReader reader = null;
+        //返回值,使用StringBuffer
+        StringBuffer data = new StringBuffer();
+        //
+        try {
+            reader = new BufferedReader(new FileReader(file));
+            //每次读取文件的缓存
+            String temp = null;
+            while((temp = reader.readLine()) != null){
+                data.append(temp);
+            }
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }finally {
+            //关闭文件流
+            if (reader != null){
+                try {
+                    reader.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return data.toString();
+    }
+
+    public static final String REGION_CN_HANGZHOU = "cn-hangzhou";
+    public static final String STS_API_VERSION = "2015-04-01";
+    protected AssumeRoleResponse assumeRole(String accessKeyId, String accessKeySecret, String roleArn,
+                                            String roleSessionName, String policy, ProtocolType protocolType, long durationSeconds) throws ClientException
+    {
+        try {
+            // 创建一个 Aliyun Acs Client, 用于发起 OpenAPI 请求
+            IClientProfile profile = DefaultProfile.getProfile(REGION_CN_HANGZHOU, accessKeyId, accessKeySecret);
+            DefaultAcsClient client = new DefaultAcsClient(profile);
+
+            // 创建一个 AssumeRoleRequest 并设置请求参数
+            final AssumeRoleRequest request = new AssumeRoleRequest();
+            request.setVersion(STS_API_VERSION);
+            request.setMethod(MethodType.POST);
+            request.setProtocol(protocolType);
+
+            request.setRoleArn(roleArn);
+            request.setRoleSessionName(roleSessionName);
+            request.setPolicy(policy);
+            request.setDurationSeconds(durationSeconds);
+            // 发起请求,并得到response
+            final AssumeRoleResponse response = client.getAcsResponse(request);
+
+            return response;
+        } catch (ClientException e) {
+            throw e;
+        }
+    }
+    private void response(HttpServletRequest request, HttpServletResponse response, String results) throws IOException {
+        String callbackFunName = request.getParameter("callback");
+        if (callbackFunName==null || callbackFunName.equalsIgnoreCase(""))
+            response.getWriter().println(results);
+        else
+            response.getWriter().println(callbackFunName + "( "+results+" )");
+        response.setStatus(HttpServletResponse.SC_OK);
+        response.flushBuffer();
+    }
+}

+ 27 - 0
src/main/java/com/jeeplus/modules/hr/dao/UserInfoDao.java

@@ -0,0 +1,27 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.hr.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.hr.entity.UserInfo;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 人员基本信息DAO接口
+ * @author fgy
+ * @version 2017-12-06
+ */
+@MyBatisDao
+public interface UserInfoDao extends CrudDao<UserInfo> {
+
+    List<UserInfo> findList(UserInfo userInfo);
+
+    UserInfo findUserInfoByUserIdCompanyId(@Param("userId") String userId, @Param("companyId") String companyId);
+
+    ArrayList<UserInfo> findUserInfoList(UserInfo userInfo);
+}

+ 455 - 0
src/main/java/com/jeeplus/modules/hr/entity/UserInfo.java

@@ -0,0 +1,455 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.hr.entity;
+
+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.Certificate;
+import com.jeeplus.modules.sys.entity.Office;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sysuseroffice.entity.Useroffice;
+import org.hibernate.validator.constraints.Email;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 人员基本信息Entity
+ * @author fgy
+ * @version 2017-12-06
+ */
+public class UserInfo extends DataEntity<UserInfo> {
+	
+	private static final long serialVersionUID = 1L;
+	private String userId;		// 用户id
+	private User user;          //用户
+	private Useroffice  userOffice; //用户所在公司
+	private String companyId;		// 所属公司
+	private Office company;         //所属公司
+	private String officeId;        //所属部门
+	private Office office;          //所属部门
+	private String name;		// 姓名
+	private String nickName;		// 昵称
+	private String gender;		// 性别
+	private String jobNumber;     //工号
+	private String highestDegree;		// 最高学历
+	private String highestSchool;		// 最高学历院校
+	private String highestProfession;		// 最高院校专业
+	private Date highestGraduationTime;		// 最高学历毕业时间
+	private String firstDegree;		// 第一学历
+	private String firstSchool;		// 第一学历院校
+	private String firstProfession;		// 第一学历专业
+	private Date firstGraduationTime;		// 第一学历毕业时间
+	private Date birthday;		// 出生日期
+	private String idCard;		// 身份证号
+	private String professionalTitle;		// 职称
+	private Date professionalGetdate;		// 获取职称日期
+	private String socialInsuranceAccount;		// 社保账号
+	private String medicalInsuranceAccount;		// 医保账号
+	private String bankAccount;		// 银行账号
+	private String providentFundAccount;		// 公积金账号
+	private String qq;		// QQ号
+	private String weixin;		// 微信号
+	private String mobilePhone;		// 联系电话
+	private String email;		// 电子邮件
+	private String isCostengineer;		// 是否造价师(0否,1是)
+	private Date costengineerGetdate;		// 造价师取得日期
+	private Date workstartDate;		// 报到日期
+	private String probationPosition;		// 试用岗位
+	private String probationDuration;		// 试用期(n个月)
+	private Date probationEnddate;		// 试用结束日期
+	private String professionalQualification;		// 职业资格
+	private String engagedJob;		// 从事专业
+	private String otherQualification;		// 其他资质
+	private String personalProfile;		// 个人简介
+	private List<Certificate> certificateList; //人员证书
+
+	public UserInfo() {
+		super();
+	}
+
+	public UserInfo(String id){
+		super(id);
+	}
+
+	@ExcelField(title="用户id", align=2, sort=7)
+	public String getUserId() {
+		return userId;
+	}
+
+	public void setUserId(String userId) {
+		this.userId = userId;
+	}
+	
+	@ExcelField(title="所属公司", align=2, sort=8)
+	public String getCompanyId() {
+		return companyId;
+	}
+
+	public void setCompanyId(String companyId) {
+		this.companyId = companyId;
+	}
+	
+	@ExcelField(title="姓名", align=2, sort=9)
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+	
+	@ExcelField(title="昵称", align=2, sort=10)
+	public String getNickName() {
+		return nickName;
+	}
+
+	public void setNickName(String nickName) {
+		this.nickName = nickName;
+	}
+	
+	@ExcelField(title="性别", dictType="sex", align=2, sort=11)
+	public String getGender() {
+		return gender;
+	}
+
+	public void setGender(String gender) {
+		this.gender = gender;
+	}
+	
+	@ExcelField(title="最高学历", dictType="education_level", align=2, sort=12)
+	public String getHighestDegree() {
+		return highestDegree;
+	}
+
+	public void setHighestDegree(String highestDegree) {
+		this.highestDegree = highestDegree;
+	}
+	
+	@ExcelField(title="最高学历院校", align=2, sort=13)
+	public String getHighestSchool() {
+		return highestSchool;
+	}
+
+	public void setHighestSchool(String highestSchool) {
+		this.highestSchool = highestSchool;
+	}
+	
+	@ExcelField(title="最高院校专业", align=2, sort=14)
+	public String getHighestProfession() {
+		return highestProfession;
+	}
+
+	public void setHighestProfession(String highestProfession) {
+		this.highestProfession = highestProfession;
+	}
+	
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@ExcelField(title="最高学历毕业时间", align=2, sort=15)
+	public Date getHighestGraduationTime() {
+		return highestGraduationTime;
+	}
+
+	public void setHighestGraduationTime(Date highestGraduationTime) {
+		this.highestGraduationTime = highestGraduationTime;
+	}
+	
+	@ExcelField(title="第一学历", dictType="education_level", align=2, sort=16)
+	public String getFirstDegree() {
+		return firstDegree;
+	}
+
+	public void setFirstDegree(String firstDegree) {
+		this.firstDegree = firstDegree;
+	}
+	
+	@ExcelField(title="第一学历院校", align=2, sort=17)
+	public String getFirstSchool() {
+		return firstSchool;
+	}
+
+	public void setFirstSchool(String firstSchool) {
+		this.firstSchool = firstSchool;
+	}
+	
+	@ExcelField(title="第一学历专业", align=2, sort=18)
+	public String getFirstProfession() {
+		return firstProfession;
+	}
+
+	public void setFirstProfession(String firstProfession) {
+		this.firstProfession = firstProfession;
+	}
+	
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@ExcelField(title="第一学历毕业时间", align=2, sort=19)
+	public Date getFirstGraduationTime() {
+		return firstGraduationTime;
+	}
+
+	public void setFirstGraduationTime(Date firstGraduationTime) {
+		this.firstGraduationTime = firstGraduationTime;
+	}
+	
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@ExcelField(title="出生日期", align=2, sort=20)
+	public Date getBirthday() {
+		return birthday;
+	}
+
+	public void setBirthday(Date birthday) {
+		this.birthday = birthday;
+	}
+	
+	@ExcelField(title="身份证号", align=2, sort=21)
+	public String getIdCard() {
+		return idCard;
+	}
+
+	public void setIdCard(String idCard) {
+		this.idCard = idCard;
+	}
+	
+	@ExcelField(title="职称", align=2, sort=22)
+	public String getProfessionalTitle() {
+		return professionalTitle;
+	}
+
+	public void setProfessionalTitle(String professionalTitle) {
+		this.professionalTitle = professionalTitle;
+	}
+	
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@ExcelField(title="获取职称日期", align=2, sort=23)
+	public Date getProfessionalGetdate() {
+		return professionalGetdate;
+	}
+
+	public void setProfessionalGetdate(Date professionalGetdate) {
+		this.professionalGetdate = professionalGetdate;
+	}
+	
+	@ExcelField(title="社保账号", align=2, sort=24)
+	public String getSocialInsuranceAccount() {
+		return socialInsuranceAccount;
+	}
+
+	public void setSocialInsuranceAccount(String socialInsuranceAccount) {
+		this.socialInsuranceAccount = socialInsuranceAccount;
+	}
+	
+	@ExcelField(title="医保账号", align=2, sort=25)
+	public String getMedicalInsuranceAccount() {
+		return medicalInsuranceAccount;
+	}
+
+	public void setMedicalInsuranceAccount(String medicalInsuranceAccount) {
+		this.medicalInsuranceAccount = medicalInsuranceAccount;
+	}
+	
+	@ExcelField(title="银行账号", align=2, sort=26)
+	public String getBankAccount() {
+		return bankAccount;
+	}
+
+	public void setBankAccount(String bankAccount) {
+		this.bankAccount = bankAccount;
+	}
+	
+	@ExcelField(title="公积金账号", align=2, sort=27)
+	public String getProvidentFundAccount() {
+		return providentFundAccount;
+	}
+
+	public void setProvidentFundAccount(String providentFundAccount) {
+		this.providentFundAccount = providentFundAccount;
+	}
+	
+	@ExcelField(title="QQ号", align=2, sort=28)
+	public String getQq() {
+		return qq;
+	}
+
+	public void setQq(String qq) {
+		this.qq = qq;
+	}
+	
+	@ExcelField(title="微信号", align=2, sort=29)
+	public String getWeixin() {
+		return weixin;
+	}
+
+	public void setWeixin(String weixin) {
+		this.weixin = weixin;
+	}
+	
+	@ExcelField(title="联系电话", align=2, sort=30)
+	public String getMobilePhone() {
+		return mobilePhone;
+	}
+
+	public void setMobilePhone(String mobilePhone) {
+		this.mobilePhone = mobilePhone;
+	}
+	
+	@Email(message="电子邮件必须为合法邮箱")
+	@ExcelField(title="电子邮件", align=2, sort=31)
+	public String getEmail() {
+		return email;
+	}
+
+	public void setEmail(String email) {
+		this.email = email;
+	}
+	
+	@ExcelField(title="是否造价师(0否,1是)", dictType="s_costEngineer", align=2, sort=32)
+	public String getIsCostengineer() {
+		return isCostengineer;
+	}
+
+	public void setIsCostengineer(String isCostengineer) {
+		this.isCostengineer = isCostengineer;
+	}
+	
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@ExcelField(title="造价师取得日期", align=2, sort=33)
+	public Date getCostengineerGetdate() {
+		return costengineerGetdate;
+	}
+
+	public void setCostengineerGetdate(Date costengineerGetdate) {
+		this.costengineerGetdate = costengineerGetdate;
+	}
+	
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@ExcelField(title="报到日期", align=2, sort=34)
+	public Date getWorkstartDate() {
+		return workstartDate;
+	}
+
+	public void setWorkstartDate(Date workstartDate) {
+		this.workstartDate = workstartDate;
+	}
+	
+	@ExcelField(title="试用岗位", align=2, sort=35)
+	public String getProbationPosition() {
+		return probationPosition;
+	}
+
+	public void setProbationPosition(String probationPosition) {
+		this.probationPosition = probationPosition;
+	}
+	
+	@ExcelField(title="试用期(n个月)", align=2, sort=36)
+	public String getProbationDuration() {
+		return probationDuration;
+	}
+
+	public void setProbationDuration(String probationDuration) {
+		this.probationDuration = probationDuration;
+	}
+	
+	@ExcelField(title="试用结束日期", align=2, sort=37)
+	public Date getProbationEnddate() {
+		return probationEnddate;
+	}
+
+	public void setProbationEnddate(Date probationEnddate) {
+		this.probationEnddate = probationEnddate;
+	}
+	
+	@ExcelField(title="职业资格", align=2, sort=38)
+	public String getProfessionalQualification() {
+		return professionalQualification;
+	}
+
+	public void setProfessionalQualification(String professionalQualification) {
+		this.professionalQualification = professionalQualification;
+	}
+	
+	@ExcelField(title="从事专业", align=2, sort=39)
+	public String getEngagedJob() {
+		return engagedJob;
+	}
+
+	public void setEngagedJob(String engagedJob) {
+		this.engagedJob = engagedJob;
+	}
+	
+	@ExcelField(title="其他资质", align=2, sort=40)
+	public String getOtherQualification() {
+		return otherQualification;
+	}
+
+	public void setOtherQualification(String otherQualification) {
+		this.otherQualification = otherQualification;
+	}
+	
+	@ExcelField(title="个人简介", align=2, sort=41)
+	public String getPersonalProfile() {
+		return personalProfile;
+	}
+
+	public void setPersonalProfile(String personalProfile) {
+		this.personalProfile = personalProfile;
+	}
+
+	public User getUser() {
+		return user;
+	}
+
+	public void setUser(User user) {
+		this.user = user;
+	}
+
+	public Office getCompany() {
+		return company;
+	}
+
+	public void setCompany(Office company) {
+		this.company = company;
+	}
+
+	public Office getOffice() {
+		return office;
+	}
+
+	public void setOffice(Office office) {
+		this.office = office;
+	}
+
+	public String getOfficeId() {
+		return officeId;
+	}
+
+	public void setOfficeId(String officeId) {
+		this.officeId = officeId;
+	}
+
+
+	public Useroffice getUserOffice() {
+		return userOffice;
+	}
+
+	public void setUserOffice(Useroffice userOffice) {
+		this.userOffice = userOffice;
+	}
+
+	public String getJobNumber() {
+		return jobNumber;
+	}
+
+	public void setJobNumber(String jobNumber) {
+		this.jobNumber = jobNumber;
+	}
+
+	public List<Certificate> getCertificateList() {
+		return certificateList;
+	}
+
+	public void setCertificateList(List<Certificate> certificateList) {
+		this.certificateList = certificateList;
+	}
+}

+ 268 - 0
src/main/java/com/jeeplus/modules/hr/service/UserInfoService.java

@@ -0,0 +1,268 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.hr.service;
+
+import com.google.common.collect.Lists;
+import com.jeeplus.common.oss.OSSClientUtil;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.service.CrudService;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.modules.hr.dao.UserInfoDao;
+import com.jeeplus.modules.hr.entity.UserInfo;
+import com.jeeplus.modules.sys.dao.UserDao;
+import com.jeeplus.modules.sys.entity.Certificate;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.entity.Workattachment;
+import com.jeeplus.modules.sys.service.CertificateService;
+import com.jeeplus.modules.sys.service.OfficeService;
+import com.jeeplus.modules.sys.service.UserService;
+import com.jeeplus.modules.sys.service.WorkattachmentService;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.sysuseroffice.dao.UserofficeDao;
+import com.jeeplus.modules.sysuseroffice.entity.Useroffice;
+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.util.ArrayList;
+import java.util.List;
+
+/**
+ * 人员基本信息Service
+ * @author fgy
+ * @version 2017-12-06
+ */
+@SuppressWarnings("all")
+@Service
+@Transactional(readOnly = true)
+public class UserInfoService extends CrudService<UserInfoDao, UserInfo> {
+
+	@Autowired
+	private UserInfoDao userInfoDao;
+	@Autowired
+	private UserofficeDao userofficeDao;
+	@Autowired
+	private UserDao userDao;
+	@Autowired
+	private UserService userService;
+	@Autowired
+	private OfficeService officeService;
+	@Autowired
+	private WorkattachmentService workattachmentService;
+	@Autowired
+	private CertificateService certificateService;
+
+	public UserInfo get(String id) {
+		UserInfo userInfo = super.get(id);
+		if(userInfo!=null){
+			if(StringUtils.isNotBlank(userInfo.getUserId())){
+				User user = UserUtils.get(userInfo.getUserId());
+				Workattachment jobResume = workattachmentService.getByAttachmentIdAndCompanyIdAndFlag(userInfo.getUserId(), UserUtils.getSelectCompany().getId(), "62");
+				Workattachment userEvaluation = workattachmentService.getByAttachmentIdAndCompanyIdAndFlag(userInfo.getUserId(), UserUtils.getSelectCompany().getId(), "0");
+				Workattachment satisfaction = workattachmentService.getByAttachmentIdAndCompanyIdAndFlag(userInfo.getUserId(), UserUtils.getSelectCompany().getId(), "63");
+				Workattachment certificate = workattachmentService.getByAttachmentIdAndCompanyIdAndFlag(userInfo.getUserId(),UserUtils.getSelectCompany().getId(),"64");
+				if(jobResume!=null){
+					user.setJobResume(jobResume);
+					if(StringUtils.isNotBlank(jobResume.getAttachmentUser())){
+						jobResume.setAttachmentUser(UserUtils.get(jobResume.getAttachmentUser()).getName());
+					}
+				}
+				if(userEvaluation!=null){
+					user.setWorkattachment(userEvaluation);
+					if(StringUtils.isNotBlank(userEvaluation.getAttachmentUser())){
+						userEvaluation.setAttachmentUser(UserUtils.get(userEvaluation.getAttachmentUser()).getName());
+					}
+				}
+				if(satisfaction!=null){
+					user.setSatisfaction(satisfaction);
+					if(StringUtils.isNotBlank(satisfaction.getAttachmentUser())){
+						satisfaction.setAttachmentUser(UserUtils.get(satisfaction.getAttachmentUser()).getName());
+					}
+				}
+				if(StringUtils.isBlank(userInfo.getGender())){
+					userInfo.setGender(user.getSex());
+				}
+				if(StringUtils.isBlank(userInfo.getName())){
+					userInfo.setName(user.getName());
+				}
+				if(StringUtils.isBlank(userInfo.getMobilePhone())){
+					userInfo.setMobilePhone(user.getMobile());
+				}
+				userInfo.setUser(user);
+			}
+			List<Certificate> certificateList = certificateService.getListByUserInfoId(id);
+			if(certificateList!=null && certificateList.size()>0){
+				for(Certificate c : certificateList){
+					Workattachment w = workattachmentService.getByAttachmentIdAndCompanyIdAndFlag(c.getId(),UserUtils.getSelectCompany().getId(),"64");
+					c.setCertificate(w);
+				}
+			}
+			userInfo.setCertificateList(certificateList);
+		}
+
+
+
+		return userInfo;
+	}
+	
+	public List<UserInfo> findList(UserInfo userInfo) {
+		ArrayList<UserInfo> userInfoList = Lists.newArrayList();
+		User user = UserUtils.getUser();
+
+		if(user.isAdmin()){
+
+		}else {
+			userInfo.setCompanyId(UserUtils.getSelectCompany().getId());
+		}
+		ArrayList<UserInfo> list = userInfoDao.findUserInfoList(userInfo);
+
+		if(list != null && list.size()>0){
+			for(int i=0;i<list.size();i++){
+				UserInfo ui = list.get(i);
+				if(ui.getUserOffice()!=null){
+					Useroffice useroffice = ui.getUserOffice();
+					if(StringUtils.isNotBlank(useroffice.getUserId())){
+						User u = UserUtils.get(useroffice.getUserId());
+						String userId = useroffice.getUserId();
+						String companyId = useroffice.getCompanyId();
+						String officeId = useroffice.getOfficeId();
+						if(StringUtils.isNotBlank(userId) && StringUtils.isNotBlank(companyId)){
+							ui = userInfoDao.get(ui.getId());
+							if(ui == null){
+								ui = new UserInfo();
+							}
+						}
+						ui.setUserId(userId);
+						ui.setCompanyId(companyId);
+						ui.setOfficeId(officeId);
+						ui.setCompany(officeService.get(companyId));
+						ui.setOffice(officeService.get(officeId));
+						ui.setUser(u);
+						ui.setUserOffice(useroffice);
+					}
+				}
+				userInfoList.add(ui);
+			}
+		}
+		return userInfoList;
+	}
+
+	public Page<UserInfo> findPage(Page<UserInfo> page, UserInfo userInfo) {
+		userInfo.setPage(page);
+		page.setList(findList(userInfo));
+		return page;
+	}
+	
+	@Transactional(readOnly = false)
+	public void save(UserInfo userInfo) {
+		super.save(userInfo);
+	}
+	
+	@Transactional(readOnly = false)
+	public void delete(UserInfo userInfo) {
+		super.delete(userInfo);
+	}
+
+	//保存人员简历(62)信息
+	@Transactional(readOnly = false)
+    public void saveJobResume(UserInfo ui, MultipartFile file) {
+		if(file!=null && !file.isEmpty() && file.getSize()>0){
+			String userId = ui.getUserId();
+			String fileName = file.getOriginalFilename();
+			String fileType = fileName.substring(fileName.lastIndexOf(".")+ 1);
+			Workattachment w = workattachmentService.getByAttachmentIdAndCompanyIdAndFlag(userId,UserUtils.getSelectCompany().getId(),"62");
+			if(w != null){
+				workattachmentService.deleteFileFromAliyun(w,w==null?"":w.getUrl());
+				workattachmentService.delete(w);
+			}
+			OSSClientUtil ossUtil = new OSSClientUtil();
+			String aliyunPath = ossUtil.uploadFile2OSS(file, "jobResume");
+			Workattachment workattachment = new Workattachment();
+			workattachment.setUrl(aliyunPath);
+			workattachment.setType(fileType);
+			workattachment.setAttachmentId(userId);
+			workattachment.setAttachmentUser(UserUtils.getUser().getId());
+			workattachment.setAttachmentName(fileName);
+			workattachment.setCompanyId(UserUtils.getSelectCompany().getId());
+			workattachment.setAttachmentFlag("62");
+			workattachmentService.save(workattachment);
+
+		}
+    }
+
+	//保存评价表(0)和客户满意表(63)
+	@Transactional(readOnly = false)
+	public void saveEvaluationAndSatisfaction(UserInfo ui, MultipartFile this_upload_files, MultipartFile next_upload_files) {
+		if(this_upload_files!=null && !this_upload_files.isEmpty() && this_upload_files.getSize()>0){
+			String userId = ui.getUserId();
+			String fileName = this_upload_files.getOriginalFilename();
+			String fileType = fileName.substring(fileName.lastIndexOf(".")+ 1);
+			Workattachment w = workattachmentService.getByAttachmentIdAndCompanyIdAndFlag(userId,UserUtils.getSelectCompany().getId(),"0");
+			if(w != null){
+				workattachmentService.deleteFileFromAliyun(w,w==null?"":w.getUrl());
+				workattachmentService.delete(w);
+			}
+			OSSClientUtil ossUtil = new OSSClientUtil();
+			String aliyunPath = ossUtil.uploadFile2OSS(this_upload_files, "userEvaluation");
+			Workattachment workattachment = new Workattachment();
+			workattachment.setUrl(aliyunPath);
+			workattachment.setType(fileType);
+			workattachment.setAttachmentId(userId);
+			workattachment.setAttachmentUser(UserUtils.getUser().getId());
+			workattachment.setAttachmentName(fileName);
+			workattachment.setCompanyId(UserUtils.getSelectCompany().getId());
+			workattachment.setAttachmentFlag("0");
+			workattachmentService.save(workattachment);
+		}
+		if(next_upload_files!=null && !next_upload_files.isEmpty() && next_upload_files.getSize()>0){
+			String userId = ui.getUserId();
+			String fileName = next_upload_files.getOriginalFilename();
+			String fileType = fileName.substring(fileName.lastIndexOf(".")+ 1);
+			Workattachment w = workattachmentService.getByAttachmentIdAndCompanyIdAndFlag(userId,UserUtils.getSelectCompany().getId(),"63");
+			if(w != null){
+				workattachmentService.deleteFileFromAliyun(w,w==null?"":w.getUrl());
+				workattachmentService.delete(w);
+			}
+			OSSClientUtil ossUtil = new OSSClientUtil();
+			String aliyunPath = ossUtil.uploadFile2OSS(next_upload_files, "satisfaction");
+			Workattachment workattachment = new Workattachment();
+			workattachment.setUrl(aliyunPath);
+			workattachment.setType(fileType);
+			workattachment.setAttachmentId(userId);
+			workattachment.setAttachmentUser(UserUtils.getUser().getId());
+			workattachment.setAttachmentName(fileName);
+			workattachment.setCompanyId(UserUtils.getSelectCompany().getId());
+			workattachment.setAttachmentFlag("63");
+			workattachmentService.save(workattachment);
+		}
+
+	}
+	//保存人员证书信息
+	@Transactional(readOnly = false)
+	public void saveCertificate(Certificate certificate, MultipartFile this_upload_files) {
+		certificateService.save(certificate);
+		if(this_upload_files!=null && !this_upload_files.isEmpty() && this_upload_files.getSize()>0){
+			String userId = certificate.getUserId();
+			String fileName = this_upload_files.getOriginalFilename();
+			String fileType = fileName.substring(fileName.lastIndexOf(".")+ 1);
+			Workattachment w = workattachmentService.getByAttachmentIdAndCompanyIdAndFlag(certificate.getId(),UserUtils.getSelectCompany().getId(),"64");
+			if(w != null){
+				workattachmentService.deleteFileFromAliyun(w,w==null?"":w.getUrl());
+				workattachmentService.delete(w);
+			}
+			OSSClientUtil ossUtil = new OSSClientUtil();
+			String aliyunPath = ossUtil.uploadFile2OSS(this_upload_files, "certificate");
+			Workattachment workattachment = new Workattachment();
+			workattachment.setUrl(aliyunPath);
+			workattachment.setType(fileType);
+			workattachment.setAttachmentId(certificate.getId());
+			workattachment.setAttachmentUser(UserUtils.getUser().getId());
+			workattachment.setAttachmentName(fileName);
+			workattachment.setCompanyId(UserUtils.getSelectCompany().getId());
+			workattachment.setAttachmentFlag("64");
+			workattachmentService.save(workattachment);
+		}
+	}
+}

+ 143 - 0
src/main/java/com/jeeplus/modules/hr/web/CertificateController.java

@@ -0,0 +1,143 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.hr.web;
+
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.modules.hr.entity.UserInfo;
+import com.jeeplus.modules.hr.service.UserInfoService;
+import com.jeeplus.modules.sys.entity.Certificate;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.service.UserService;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.sysuseroffice.entity.Useroffice;
+import com.jeeplus.modules.sysuseroffice.service.UserofficeService;
+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.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * 人员证书信息Controller
+ * @author fgy
+ * @version 2017-12-06
+ */
+@SuppressWarnings("all")
+@Controller
+@RequestMapping(value = "${adminPath}/hr/certificate")
+public class CertificateController extends BaseController {
+
+	@Autowired
+	private UserInfoService userInfoService;
+	@Autowired
+	private UserofficeService userofficeService;
+	@Autowired
+	private UserService userService;
+
+	@ModelAttribute
+	public UserInfo get(@RequestParam(value ="id", required=false) String id,
+						@RequestParam(value = "userOfficeId", required = false)String userOfficeId ,
+						@RequestParam(value = "userId", required = false)String userId,
+						@RequestParam(value = "companyId", required = false)String companyId) {
+		UserInfo userInfo = new UserInfo();
+		Useroffice useroffice = new Useroffice();
+		User user = new User();
+		if (StringUtils.isNotBlank(id)){
+			userInfo = userInfoService.get(id);
+		}else{
+			if(StringUtils.isNotBlank(userOfficeId)){
+				useroffice = userofficeService.get(userOfficeId);
+				userInfo.setUserOffice(useroffice);
+			}
+			if(StringUtils.isNotBlank(userId)){
+				user = userService.get(userId);
+				userInfo.setUserId(userId);
+				userInfo.setUser(user);
+			}
+			if(StringUtils.isNotBlank(companyId)){
+				userInfo.setCompanyId(companyId);
+			}
+		}
+		if(StringUtils.isBlank(userInfo.getGender())){
+			userInfo.setGender(user.getSex());
+		}
+		if(StringUtils.isBlank(userInfo.getName())){
+			userInfo.setName(user.getName());
+		}
+		if(StringUtils.isBlank(userInfo.getMobilePhone())){
+			userInfo.setMobilePhone(user.getMobile());
+		}
+		return userInfo;
+	}
+
+	/**
+	 * 人员证书信息列表页面
+	 */
+	@RequiresPermissions("hr:certificate:list")
+	@RequestMapping(value = {"list",""})
+	public String certificateList(UserInfo userInfo, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<UserInfo> page = userInfoService.findPage(new Page<UserInfo>(request, response), userInfo);
+		model.addAttribute("page", page);
+
+		User user = UserUtils.getUser();
+		if(UserUtils.isManager()){
+			return "modules/hr/certificateList";
+		}
+		return "modules/hr/certificateListSimple";
+
+	}
+	/**
+	 * 查看,增加,编辑表单页面
+	 */
+	@RequiresPermissions(value={"hr:certificate:view","hr:certificate:add","hr:certificate:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(UserInfo userInfo, Model model, HttpServletRequest request) {
+		model.addAttribute("userInfo", userInfo);
+
+		if("certificateEdit".equals(request.getParameter("dialog"))){
+			return "modules/hr/certificateForm";
+		}
+		if("certificateView".equals(request.getParameter("dialog"))){
+			return "modules/hr/certificateView";
+		}
+		return "modules/hr/certificateView";
+	}
+	/**
+	 * 打开人员证书添加页面
+	 */
+	@RequiresPermissions(value={"hr:certificate:view","hr:certificate:add","hr:certificate:edit"},logical=Logical.OR)
+	@RequestMapping(value = "certificateAdd")
+	public String certificateAdd(UserInfo userInfo, Model model, HttpServletRequest request) {
+		Certificate certificate = new Certificate();
+		model.addAttribute("certificate", certificate);
+		model.addAttribute("userInfoId",userInfo.getId());
+		model.addAttribute("userId",userInfo.getUserId());
+		return "modules/hr/certificateAdd";
+	}
+
+
+	/**
+	 * 保存人员证书信息
+	 */
+	@RequiresPermissions(value={"hr:certificate:add","hr:certificate:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	public String save(Certificate certificate, Model model, RedirectAttributes redirectAttributes, @RequestParam(value = "this_upload_files",required = false) MultipartFile this_upload_files) throws Exception{
+		userInfoService.saveCertificate(certificate,this_upload_files);//保存证书
+		addMessage(redirectAttributes, "保存人员证书信息成功");
+		return "redirect:"+Global.getAdminPath()+"/hr/certificate/?repage";
+	}
+
+
+}

+ 137 - 0
src/main/java/com/jeeplus/modules/hr/web/EvaluationController.java

@@ -0,0 +1,137 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.hr.web;
+
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.modules.hr.entity.UserInfo;
+import com.jeeplus.modules.hr.service.UserInfoService;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.service.UserService;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.sysuseroffice.entity.Useroffice;
+import com.jeeplus.modules.sysuseroffice.service.UserofficeService;
+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.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * 人员评价及客户满意信息Controller
+ * @author fgy
+ * @version 2017-12-06
+ */
+@SuppressWarnings("all")
+@Controller
+@RequestMapping(value = "${adminPath}/hr/evaluation")
+public class EvaluationController extends BaseController {
+
+	@Autowired
+	private UserInfoService userInfoService;
+	@Autowired
+	private UserofficeService userofficeService;
+	@Autowired
+	private UserService userService;
+
+	@ModelAttribute
+	public UserInfo get(@RequestParam(value ="id", required=false) String id,
+						@RequestParam(value = "userOfficeId", required = false)String userOfficeId ,
+						@RequestParam(value = "userId", required = false)String userId,
+						@RequestParam(value = "companyId", required = false)String companyId) {
+		UserInfo userInfo = new UserInfo();
+		Useroffice useroffice = new Useroffice();
+		User user = new User();
+		if (StringUtils.isNotBlank(id)){
+			userInfo = userInfoService.get(id);
+		}else{
+			if(StringUtils.isNotBlank(userOfficeId)){
+				useroffice = userofficeService.get(userOfficeId);
+				userInfo.setUserOffice(useroffice);
+			}
+			if(StringUtils.isNotBlank(userId)){
+				user = userService.get(userId);
+				userInfo.setUserId(userId);
+				userInfo.setUser(user);
+			}
+			if(StringUtils.isNotBlank(companyId)){
+				userInfo.setCompanyId(companyId);
+			}
+		}
+		if(StringUtils.isBlank(userInfo.getGender())){
+			userInfo.setGender(user.getSex());
+		}
+		if(StringUtils.isBlank(userInfo.getName())){
+			userInfo.setName(user.getName());
+		}
+		if(StringUtils.isBlank(userInfo.getMobilePhone())){
+			userInfo.setMobilePhone(user.getMobile());
+		}
+		return userInfo;
+	}
+
+	/**
+	 * 人员评价及客户满意信息列表页面
+	 */
+	@RequiresPermissions("hr:evaluation:list")
+	@RequestMapping(value = {"list",""})
+	public String evaluationList(UserInfo userInfo, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<UserInfo> page = userInfoService.findPage(new Page<UserInfo>(request, response), userInfo);
+		model.addAttribute("page", page);
+
+		User user = UserUtils.getUser();
+		if(UserUtils.isManager()){
+			return "modules/hr/evaluationList";
+		}
+		return "modules/hr/evaluationListSimple";
+
+	}
+	/**
+	 * 查看,增加,编辑表单页面
+	 */
+	@RequiresPermissions(value={"hr:evaluation:view","hr:evaluation:add","hr:evaluation:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(UserInfo userInfo, Model model, HttpServletRequest request) {
+		model.addAttribute("userInfo", userInfo);
+
+		if("evaluationEdit".equals(request.getParameter("dialog"))){
+			return "modules/hr/evaluationForm";
+		}
+		if("evaluationView".equals(request.getParameter("dialog"))){
+			return "modules/hr/evaluationView";
+		}
+		return "modules/hr/evaluationView";
+	}
+
+	/**
+	 * 保存评价表及客户满意表信息
+	 */
+	@RequiresPermissions(value={"hr:evaluation:add","hr:evaluation:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	public String save(UserInfo userInfo, Model model, RedirectAttributes redirectAttributes,
+					   @RequestParam(value = "execute_file",required = false)MultipartFile this_upload_files,
+					   @RequestParam(value = "manuscript_file",required = false)MultipartFile next_upload_files) throws Exception{
+		if (!beanValidator(model, userInfo)){
+			return form(userInfo, model,null);
+		}
+
+		UserInfo ui = userInfoService.get(userInfo.getId());//从数据库取出记录的值
+		userInfoService.saveEvaluationAndSatisfaction(ui,this_upload_files,next_upload_files);//保存评价表或客户满意表
+
+		addMessage(redirectAttributes, "保存人员评价表和客户满意表信息成功");
+		return "redirect:"+Global.getAdminPath()+"/hr/evaluation/?repage";
+	}
+
+
+}

+ 135 - 0
src/main/java/com/jeeplus/modules/hr/web/JobResumeController.java

@@ -0,0 +1,135 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.hr.web;
+
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.modules.hr.entity.UserInfo;
+import com.jeeplus.modules.hr.service.UserInfoService;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.service.UserService;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.sysuseroffice.entity.Useroffice;
+import com.jeeplus.modules.sysuseroffice.service.UserofficeService;
+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.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * 人员简历信息Controller
+ * @author fgy
+ * @version 2017-12-06
+ */
+@SuppressWarnings("all")
+@Controller
+@RequestMapping(value = "${adminPath}/hr/jobResume")
+public class JobResumeController extends BaseController {
+
+	@Autowired
+	private UserInfoService userInfoService;
+	@Autowired
+	private UserofficeService userofficeService;
+	@Autowired
+	private UserService userService;
+
+	@ModelAttribute
+	public UserInfo get(@RequestParam(value ="id", required=false) String id,
+						@RequestParam(value = "userOfficeId", required = false)String userOfficeId ,
+						@RequestParam(value = "userId", required = false)String userId,
+						@RequestParam(value = "companyId", required = false)String companyId) {
+		UserInfo userInfo = new UserInfo();
+		Useroffice useroffice = new Useroffice();
+		User user = new User();
+		if (StringUtils.isNotBlank(id)){
+			userInfo = userInfoService.get(id);
+		}else{
+			if(StringUtils.isNotBlank(userOfficeId)){
+				useroffice = userofficeService.get(userOfficeId);
+				userInfo.setUserOffice(useroffice);
+			}
+			if(StringUtils.isNotBlank(userId)){
+				user = userService.get(userId);
+				userInfo.setUserId(userId);
+				userInfo.setUser(user);
+			}
+			if(StringUtils.isNotBlank(companyId)){
+				userInfo.setCompanyId(companyId);
+			}
+		}
+		if(StringUtils.isBlank(userInfo.getGender())){
+			userInfo.setGender(user.getSex());
+		}
+		if(StringUtils.isBlank(userInfo.getName())){
+			userInfo.setName(user.getName());
+		}
+		if(StringUtils.isBlank(userInfo.getMobilePhone())){
+			userInfo.setMobilePhone(user.getMobile());
+		}
+		return userInfo;
+	}
+
+	/**
+	 * 人员简历信息列表页面
+	 */
+	@RequiresPermissions("hr:jobResume:list")
+	@RequestMapping(value = {"list",""})
+	public String jobResumeList(UserInfo userInfo, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<UserInfo> page = userInfoService.findPage(new Page<UserInfo>(request, response), userInfo);
+		model.addAttribute("page", page);
+
+		User user = UserUtils.getUser();
+		if(UserUtils.isManager()){
+			return "modules/hr/jobResumeList";
+		}
+		return "modules/hr/jobResumeListSimple";
+
+	}
+	/**
+	 * 查看,增加,编辑表单页面
+	 */
+	@RequiresPermissions(value={"hr:jobResume:view","hr:jobResume:add","hr:jobResume:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(UserInfo userInfo, Model model, HttpServletRequest request) {
+		model.addAttribute("userInfo", userInfo);
+
+		if("jobResumeEdit".equals(request.getParameter("dialog"))){
+			return "modules/hr/jobResumeForm";
+		}
+		if("jobResumeView".equals(request.getParameter("dialog"))){
+			return "modules/hr/jobResumeView";
+		}
+		return "modules/hr/jobResumeView";
+	}
+
+	/**
+	 * 保存人员简历信息
+	 */
+	@RequiresPermissions(value={"hr:jobResume:add","hr:jobResume:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	public String save(UserInfo userInfo, Model model, RedirectAttributes redirectAttributes, @RequestParam(value = "attachment_file",required = false)MultipartFile attachment_file) throws Exception{
+		if (!beanValidator(model, userInfo)){
+			return form(userInfo, model,null);
+		}
+
+		UserInfo ui = userInfoService.get(userInfo.getId());//从数据库取出记录的值
+		userInfoService.saveJobResume(ui,attachment_file);//保存简历
+
+		addMessage(redirectAttributes, "保存人员简历信息成功");
+		return "redirect:"+Global.getAdminPath()+"/hr/jobResume/?repage";
+	}
+
+
+}

+ 241 - 0
src/main/java/com/jeeplus/modules/hr/web/UserInfoController.java

@@ -0,0 +1,241 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.hr.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.hr.entity.UserInfo;
+import com.jeeplus.modules.hr.service.UserInfoService;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.service.UserService;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.sysuseroffice.entity.Useroffice;
+import com.jeeplus.modules.sysuseroffice.service.UserofficeService;
+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 fgy
+ * @version 2017-12-06
+ */
+@SuppressWarnings("all")
+@Controller
+@RequestMapping(value = "${adminPath}/hr/userInfo")
+public class UserInfoController extends BaseController {
+
+	@Autowired
+	private UserInfoService userInfoService;
+	@Autowired
+	private UserofficeService userofficeService;
+	@Autowired
+	private UserService userService;
+	
+	@ModelAttribute
+	public UserInfo get(@RequestParam(value ="id", required=false) String id,
+						@RequestParam(value = "userOfficeId", required = false)String userOfficeId ,
+						@RequestParam(value = "userId", required = false)String userId,
+						@RequestParam(value = "companyId", required = false)String companyId) {
+		UserInfo userInfo = new UserInfo();
+		Useroffice useroffice = new Useroffice();
+		User user = new User();
+		if (StringUtils.isNotBlank(id)){
+			userInfo = userInfoService.get(id);
+		}else{
+			if(StringUtils.isNotBlank(userOfficeId)){
+				useroffice = userofficeService.get(userOfficeId);
+				userInfo.setUserOffice(useroffice);
+			}
+			if(StringUtils.isNotBlank(userId)){
+				user = userService.get(userId);
+				userInfo.setUserId(userId);
+				userInfo.setUser(user);
+			}
+			if(StringUtils.isNotBlank(companyId)){
+				userInfo.setCompanyId(companyId);
+			}
+		}
+		if(StringUtils.isBlank(userInfo.getGender())){
+			userInfo.setGender(user.getSex());
+		}
+		if(StringUtils.isBlank(userInfo.getName())){
+			userInfo.setName(user.getName());
+		}
+		if(StringUtils.isBlank(userInfo.getMobilePhone())){
+			userInfo.setMobilePhone(user.getMobile());
+		}
+		return userInfo;
+	}
+	
+	/**
+	 * 人员基本信息列表页面
+	 */
+	@RequiresPermissions("hr:userInfo:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(UserInfo userInfo, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<UserInfo> page = userInfoService.findPage(new Page<UserInfo>(request, response), userInfo); 
+		model.addAttribute("page", page);
+
+		User user = UserUtils.getUser();
+		if(UserUtils.isManager()){
+			return "modules/hr/userInfoList";
+		}
+		return "modules/hr/userInfoListSimple";
+
+	}
+	/**
+	 * 查看,增加,编辑表单页面
+	 */
+	@RequiresPermissions(value={"hr:userInfo:view","hr:userInfo:add","hr:userInfo:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(UserInfo userInfo, Model model,HttpServletRequest request) {
+		model.addAttribute("userInfo", userInfo);
+
+		if("edit".equals(request.getParameter("dialog"))){
+			return "modules/hr/userInfoForm";
+		}
+		if("view".equals(request.getParameter("dialog"))){
+			return "modules/hr/userInfoView";
+		}
+
+		return "modules/hr/userInfoView";
+	}
+
+	/**
+	 * 保存人员基本信息
+	 */
+	@RequiresPermissions(value={"hr:userInfo:add","hr:userInfo:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	public String save(UserInfo userInfo, Model model, RedirectAttributes redirectAttributes) throws Exception{
+		if (!beanValidator(model, userInfo)){
+			return form(userInfo, model,null);
+		}
+		if(!userInfo.getIsNewRecord()){//编辑表单保存
+			UserInfo t = userInfoService.get(userInfo.getId());//从数据库取出记录的值
+			MyBeanUtils.copyBeanNotNull2Bean(userInfo, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+			userInfoService.save(t);//保存
+		}else{//新增表单保存
+			userInfoService.save(userInfo);//保存
+		}
+		addMessage(redirectAttributes, "保存人员基本信息成功");
+		return "redirect:"+Global.getAdminPath()+"/hr/userInfo/?repage";
+	}
+	
+	/**
+	 * 删除人员基本信息
+	 */
+	@RequiresPermissions("hr:userInfo:del")
+	@RequestMapping(value = "delete")
+	public String delete(UserInfo userInfo, RedirectAttributes redirectAttributes) {
+		userInfoService.delete(userInfo);
+		addMessage(redirectAttributes, "删除人员基本信息成功");
+		return "redirect:"+Global.getAdminPath()+"/hr/userInfo/?repage";
+	}
+	
+	/**
+	 * 批量删除人员基本信息
+	 */
+	@RequiresPermissions("hr:userInfo:del")
+	@RequestMapping(value = "deleteAll")
+	public String deleteAll(String ids, RedirectAttributes redirectAttributes) {
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			userInfoService.delete(userInfoService.get(id));
+		}
+		addMessage(redirectAttributes, "删除人员基本信息成功");
+		return "redirect:"+Global.getAdminPath()+"/hr/userInfo/?repage";
+	}
+	
+	/**
+	 * 导出excel文件
+	 */
+	@RequiresPermissions("hr:userInfo:export")
+    @RequestMapping(value = "export", method=RequestMethod.POST)
+    public String exportFile(UserInfo userInfo, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "人员基本信息"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            Page<UserInfo> page = userInfoService.findPage(new Page<UserInfo>(request, response, -1), userInfo);
+    		new ExportExcel("人员基本信息", UserInfo.class).setDataList(page.getList()).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导出人员基本信息记录失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/hr/userInfo/?repage";
+    }
+
+	/**
+	 * 导入Excel数据
+
+	 */
+	@RequiresPermissions("hr:userInfo: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<UserInfo> list = ei.getDataList(UserInfo.class);
+			for (UserInfo userInfo : list){
+				try{
+					userInfoService.save(userInfo);
+					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()+"/hr/userInfo/?repage";
+    }
+	
+	/**
+	 * 下载导入人员基本信息数据模板
+	 */
+	@RequiresPermissions("hr:userInfo:import")
+    @RequestMapping(value = "import/template")
+    public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "人员基本信息数据导入模板.xlsx";
+    		List<UserInfo> list = Lists.newArrayList(); 
+    		new ExportExcel("人员基本信息数据", UserInfo.class, 1).setDataList(list).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入模板下载失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/hr/userInfo/?repage";
+    }
+	
+	
+	
+
+}

+ 45 - 0
src/main/java/com/jeeplus/modules/iim/dao/ChatHistoryDao.java

@@ -0,0 +1,45 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.iim.dao;
+
+import java.util.List;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.iim.entity.ChatHistory;
+
+/**
+ * 聊天记录DAO接口
+ * @author jeeplus
+ * @version 2015-12-29
+ */
+@MyBatisDao
+public interface ChatHistoryDao extends CrudDao<ChatHistory> {
+	
+	
+	/**
+	 * 查询列表数据
+	 * @param entity
+	 * @return
+	 */
+	public List<ChatHistory> findLogList(ChatHistory entity);
+
+	/**
+	 * 查询列表数据
+	 * @param entity
+	 * @return
+	 */
+	public List<ChatHistory> getIMUserContacts(ChatHistory entity);
+
+
+	/**
+	 * 查询群组列表数据
+	 * @param entity
+	 * @return
+	 */
+	public List<ChatHistory> findGroupLogList(ChatHistory entity);
+	
+	public int findUnReadCount(ChatHistory chatHistory);
+	
+}

+ 19 - 0
src/main/java/com/jeeplus/modules/iim/dao/LayGroupDao.java

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

+ 19 - 0
src/main/java/com/jeeplus/modules/iim/dao/LayGroupUserDao.java

@@ -0,0 +1,19 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.iim.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.iim.entity.LayGroup;
+import com.jeeplus.modules.iim.entity.LayGroupUser;
+
+/**
+ * 群组DAO接口
+ * @author lgf
+ * @version 2016-08-07
+ */
+@MyBatisDao
+public interface LayGroupUserDao extends CrudDao<LayGroupUser> {
+    int deleteUser(LayGroupUser layGroupUser);
+}

+ 20 - 0
src/main/java/com/jeeplus/modules/iim/dao/MailBoxDao.java

@@ -0,0 +1,20 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.iim.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.iim.entity.MailBox;
+
+/**
+ * 发件箱DAO接口
+ * @author jeeplus
+ * @version 2015-11-15
+ */
+@MyBatisDao
+public interface MailBoxDao extends CrudDao<MailBox> {
+	
+	public int getCount(MailBox entity);
+	
+}

+ 18 - 0
src/main/java/com/jeeplus/modules/iim/dao/MailComposeDao.java

@@ -0,0 +1,18 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.iim.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.iim.entity.MailCompose;
+
+/**
+ * 发件箱DAO接口
+ * @author jeeplus
+ * @version 2015-11-15
+ */
+@MyBatisDao
+public interface MailComposeDao extends CrudDao<MailCompose> {
+	public int getCount(MailCompose entity);
+}

+ 18 - 0
src/main/java/com/jeeplus/modules/iim/dao/MailDao.java

@@ -0,0 +1,18 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.iim.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.iim.entity.Mail;
+
+/**
+ * 发件箱DAO接口
+ * @author jeeplus
+ * @version 2015-11-15
+ */
+@MyBatisDao
+public interface MailDao extends CrudDao<Mail> {
+	public int getCount(MailDao entity);
+}

+ 26 - 0
src/main/java/com/jeeplus/modules/iim/dao/MyCalendarDao.java

@@ -0,0 +1,26 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.iim.dao;
+
+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.iim.entity.MyCalendar;
+
+
+/**
+ * 日历DAO接口
+ * @author liugf
+ * @version 2016-04-19
+ */
+@MyBatisDao
+public interface MyCalendarDao extends CrudDao<MyCalendar> {
+	
+	
+	public List<MyCalendar> findListByStart(MyCalendar myCalendar);
+	public List<MyCalendar> findListByDate(MyCalendar myCalendar);
+	public List<MyCalendar> getByUserIdCount(MyCalendar myCalendar);
+}

+ 81 - 0
src/main/java/com/jeeplus/modules/iim/entity/ChatHistory.java

@@ -0,0 +1,81 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.iim.entity;
+
+import org.hibernate.validator.constraints.Length;
+
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+
+/**
+ * 聊天记录Entity
+ * @author jeeplus
+ * @version 2015-12-29
+ */
+public class ChatHistory extends DataEntity<ChatHistory> {
+	
+	private static final long serialVersionUID = 1L;
+	private String userid1;		// userid1 发送者id
+	private String userid2;		// userid2 接收者id
+	private String msg;		// msg
+	private String status;		// status
+	private String type;//聊天类型
+	
+	public ChatHistory() {
+		super();
+	}
+
+	public ChatHistory(String id){
+		super(id);
+	}
+
+	@Length(min=0, max=64, message="userid1长度必须介于 0 和 64 之间")
+	@ExcelField(title="userid1", align=2, sort=1)
+	public String getUserid1() {
+		return userid1;
+	}
+
+	public void setUserid1(String userid1) {
+		this.userid1 = userid1;
+	}
+	
+	@Length(min=0, max=64, message="userid2长度必须介于 0 和 64 之间")
+	@ExcelField(title="userid2", align=2, sort=2)
+	public String getUserid2() {
+		return userid2;
+	}
+
+	public void setUserid2(String userid2) {
+		this.userid2 = userid2;
+	}
+	
+	@Length(min=0, max=1024, message="msg长度必须介于 0 和 1024 之间")
+	@ExcelField(title="msg", align=2, sort=3)
+	public String getMsg() {
+		return msg;
+	}
+
+	public void setMsg(String msg) {
+		this.msg = msg;
+	}
+	
+	@Length(min=0, max=45, message="status长度必须介于 0 和 45 之间")
+	@ExcelField(title="status", align=2, sort=4)
+	public String getStatus() {
+		return status;
+	}
+
+	public void setStatus(String status) {
+		this.status = status;
+	}
+
+	public void setType(String type) {
+		this.type = type;
+	}
+
+	public String getType() {
+		return type;
+	}
+	
+}

+ 69 - 0
src/main/java/com/jeeplus/modules/iim/entity/Friend.java

@@ -0,0 +1,69 @@
+package com.jeeplus.modules.iim.entity;
+
+/**
+ * 好友
+ * @author Swhite
+ *
+ */
+public class Friend {
+	
+	private String id;//用户ID
+	
+	private String username;//用户名
+	
+	private String avatar; //头像
+	
+	private String sign; //签名
+	
+	private String remark;//备注
+
+    private String status;//用户状态
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public String getSign() {
+		return sign;
+	}
+
+	public void setSign(String sign) {
+		this.sign = sign;
+	}
+
+	public void setId(String id) {
+		this.id = id;
+	}
+
+	public String getId() {
+		return id;
+	}
+
+	public String getUsername() {
+		return username;
+	}
+
+	public void setUsername(String username) {
+		this.username = username;
+	}
+
+	public String getAvatar() {
+		return avatar;
+	}
+
+	public void setAvatar(String avatar) {
+		this.avatar = avatar;
+	}
+
+	public String getRemark() {
+		return remark;
+	}
+
+	public void setRemark(String remark) {
+		this.remark = remark;
+	}
+}

+ 52 - 0
src/main/java/com/jeeplus/modules/iim/entity/FriendGroup.java

@@ -0,0 +1,52 @@
+package com.jeeplus.modules.iim.entity;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 好友列表
+ * 
+ * @author Swhite
+ * 
+ */
+public class FriendGroup {
+	private String groupname;// 好友分组名
+	private int id; // 分组ID
+	private int online; // 在线数量
+	private List<Friend> list = new ArrayList<Friend>(); // 分组下的好友列表
+
+	public String getGroupname() {
+		return groupname;
+	}
+
+	public void setGroupname(String groupname) {
+		this.groupname = groupname;
+	}
+
+
+	public int getId() {
+		return id;
+	}
+
+	public void setId(int id) {
+		this.id = id;
+	}
+
+
+	public int getOnline() {
+		return online;
+	}
+
+	public void setOnline(int online) {
+		this.online = online;
+	}
+
+	public List<Friend> getList() {
+		return list;
+	}
+
+	public void setList(List<Friend> list) {
+		this.list = list;
+	}
+
+}

+ 25 - 0
src/main/java/com/jeeplus/modules/iim/entity/LayFileJsonData.java

@@ -0,0 +1,25 @@
+package com.jeeplus.modules.iim.entity;
+
+public class LayFileJsonData {
+	
+	private String name;//文件存储的名字
+	
+	private String src;//文件存储的路径
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setSrc(String src) {
+		this.src = src;
+	}
+
+	public String getSrc() {
+		return src;
+	}
+
+}

+ 60 - 0
src/main/java/com/jeeplus/modules/iim/entity/LayGroup.java

@@ -0,0 +1,60 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.iim.entity;
+
+import org.hibernate.validator.constraints.Length;
+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 lgf
+ * @version 2016-08-07
+ */
+public class LayGroup extends DataEntity<LayGroup> {
+	
+	private static final long serialVersionUID = 1L;
+	private String groupname;		// 群组名
+	private String avatar;		// 群头像
+	private List<LayGroupUser> layGroupUserList = Lists.newArrayList();		// 子表列表
+	
+	public LayGroup() {
+		super();
+	}
+
+	public LayGroup(String id){
+		super(id);
+	}
+
+	@Length(min=0, max=64, message="群组名长度必须介于 0 和 64 之间")
+	@ExcelField(title="群组名", align=2, sort=1)
+	public String getGroupname() {
+		return groupname;
+	}
+
+	public void setGroupname(String groupname) {
+		this.groupname = groupname;
+	}
+	
+	@Length(min=0, max=256, message="群头像长度必须介于 0 和 256 之间")
+	@ExcelField(title="群头像", align=2, sort=2)
+	public String getAvatar() {
+		return avatar;
+	}
+
+	public void setAvatar(String avatar) {
+		this.avatar = avatar;
+	}
+	
+	public List<LayGroupUser> getLayGroupUserList() {
+		return layGroupUserList;
+	}
+
+	public void setLayGroupUserList(List<LayGroupUser> layGroupUserList) {
+		this.layGroupUserList = layGroupUserList;
+	}
+}

+ 41 - 0
src/main/java/com/jeeplus/modules/iim/entity/LayGroupJsonData.java

@@ -0,0 +1,41 @@
+package com.jeeplus.modules.iim.entity;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * LayJson--->Data对象
+ * 
+ * @author Swhite
+ * 
+ */
+public class LayGroupJsonData {
+	
+	private HashMap owner = new HashMap(); // 我的信息
+
+	
+	private List<Friend> list = new ArrayList(); // 群组中的成员列表
+
+
+	public void setOwner(HashMap owner) {
+		this.owner = owner;
+	}
+
+
+	public HashMap getOwner() {
+		return owner;
+	}
+
+
+	public void setList(List<Friend> list) {
+		this.list = list;
+	}
+
+
+	public List<Friend> getList() {
+		return list;
+	}
+
+
+}

+ 61 - 0
src/main/java/com/jeeplus/modules/iim/entity/LayGroupUser.java

@@ -0,0 +1,61 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.iim.entity;
+
+import com.jeeplus.modules.sys.entity.User;
+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-08-07
+ */
+public class LayGroupUser extends DataEntity<LayGroupUser> {
+	
+	private static final long serialVersionUID = 1L;
+	private User user;		// 用户
+	private LayGroup group;		// 群组id 父类
+	private String isAdmin;
+	
+	public LayGroupUser() {
+		super();
+	}
+
+	public LayGroupUser(String id){
+		super(id);
+	}
+
+	public LayGroupUser(LayGroup group){
+		this.group = group;
+	}
+
+	@ExcelField(title="用户", fieldType=User.class, value="user.name", align=2, sort=7)
+	public User getUser() {
+		return user;
+	}
+
+	public void setUser(User user) {
+		this.user = user;
+	}
+	
+	@Length(min=0, max=64, message="群组id长度必须介于 0 和 64 之间")
+	public LayGroup getGroup() {
+		return group;
+	}
+
+	public void setGroup(LayGroup group) {
+		this.group = group;
+	}
+
+	public String getIsAdmin() {
+		return isAdmin;
+	}
+
+	public void setIsAdmin(String isAdmin) {
+		this.isAdmin = isAdmin;
+	}
+}

+ 33 - 0
src/main/java/com/jeeplus/modules/iim/entity/LayJson.java

@@ -0,0 +1,33 @@
+package com.jeeplus.modules.iim.entity;
+
+
+/**
+ * layim的初始化数据
+ * @author Swhite
+ *
+ */
+public class LayJson {
+	
+	private int code = 0;  //0表示成功,其它表示失败
+	private String msg;  //失败信息
+	private Object data; //数据集合
+	public void setMsg(String msg) {
+		this.msg = msg;
+	}
+	public String getMsg() {
+		return msg;
+	}
+	public int getCode() {
+		return code;
+	}
+	public void setCode(int code) {
+		this.code = code;
+	}
+	public Object getData() {
+		return data;
+	}
+	public void setData(Object data) {
+		this.data = data;
+	}
+	
+}

+ 45 - 0
src/main/java/com/jeeplus/modules/iim/entity/LayJsonData.java

@@ -0,0 +1,45 @@
+package com.jeeplus.modules.iim.entity;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * LayJson--->Data对象
+ * 
+ * @author Swhite
+ * 
+ */
+public class LayJsonData {
+	
+	private Object mine; // 我的信息
+
+	private List<FriendGroup> friend = new ArrayList(); // 好友列表
+	
+	private List<LayGroup> group = new ArrayList();//群组列表
+
+	public Object getMine() {
+		return mine;
+	}
+
+	public void setMine(Object mine) {
+		this.mine = mine;
+	}
+
+	public List<FriendGroup> getFriend() {
+		return friend;
+	}
+
+	public void setFriend(List<FriendGroup> friend) {
+		this.friend = friend;
+	}
+
+	public void setGroup(List<LayGroup> group) {
+		this.group = group;
+	}
+
+	public List<LayGroup> getGroup() {
+		return group;
+	}
+
+
+}

+ 75 - 0
src/main/java/com/jeeplus/modules/iim/entity/Mail.java

@@ -0,0 +1,75 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.iim.entity;
+
+import org.hibernate.validator.constraints.Length;
+import java.util.List;
+import com.google.common.collect.Lists;
+import com.jeeplus.common.persistence.DataEntity;
+
+
+/**
+ * 发件箱Entity
+ * @author jeeplus
+ * @version 2015-11-15
+ */
+public class Mail extends DataEntity<Mail> {
+	
+	private static final long serialVersionUID = 1L;
+	private String title;		// 标题
+	private String overview;		// 内容概要
+	private String content;		// 内容
+	private List<MailBox> mailBoxList = Lists.newArrayList();		// 子表列表
+	private List<MailCompose> mailComposeList = Lists.newArrayList();		// 子表列表
+	
+	public Mail() {
+		super();
+	}
+
+	public Mail(String id){
+		super(id);
+	}
+
+	@Length(min=0, max=128, message="标题长度必须介于 0 和 128 之间")
+	public String getTitle() {
+		return title;
+	}
+
+	public void setTitle(String title) {
+		this.title = title;
+	}
+	
+	@Length(min=0, max=128, message="内容概要长度必须介于 0 和 128 之间")
+	public String getOverview() {
+		return overview;
+	}
+
+	public void setOverview(String overview) {
+		this.overview = overview;
+	}
+	
+	@Length(min=0, max=5096, message="内容长度必须介于 0 和 5096 之间")
+	public String getContent() {
+		return content;
+	}
+
+	public void setContent(String content) {
+		this.content = content;
+	}
+	
+	public List<MailBox> getMailBoxList() {
+		return mailBoxList;
+	}
+
+	public void setMailBoxList(List<MailBox> mailBoxList) {
+		this.mailBoxList = mailBoxList;
+	}
+	public List<MailCompose> getMailComposeList() {
+		return mailComposeList;
+	}
+
+	public void setMailComposeList(List<MailCompose> mailComposeList) {
+		this.mailComposeList = mailComposeList;
+	}
+}

+ 81 - 0
src/main/java/com/jeeplus/modules/iim/entity/MailBox.java

@@ -0,0 +1,81 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.iim.entity;
+
+import org.hibernate.validator.constraints.Length;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.modules.sys.entity.User;
+
+
+/**
+ * 发件箱Entity
+ * @author jeeplus
+ * @version 2015-11-15
+ */
+public class MailBox extends DataEntity<MailBox> {
+	
+	private static final long serialVersionUID = 1L;
+	private String readstatus;		// 状态 0 未读 1 已读
+	private User sender;		// 发件人
+	private User receiver;		// 收件人
+	private Date sendtime;		// 发送时间
+	private Mail mail;		// 邮件外键 父类
+
+	public MailBox() {
+		super();
+	}
+
+	public MailBox(String id){
+		super(id);
+	}
+
+	public MailBox(Mail mail){
+		this.mail = mail;
+	}
+
+	@Length(min=0, max=45, message="状态 0 未读 1 已读长度必须介于 0 和 45 之间")
+	public String getReadstatus() {
+		return readstatus;
+	}
+
+	public void setReadstatus(String readstatus) {
+		this.readstatus = readstatus;
+	}
+	
+	public User getSender() {
+		return sender;
+	}
+
+	public void setSender(User sender) {
+		this.sender = sender;
+	}
+	
+	public User getReceiver() {
+		return receiver;
+	}
+
+	public void setReceiver(User receiver) {
+		this.receiver = receiver;
+	}
+	
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	public Date getSendtime() {
+		return sendtime;
+	}
+
+	public void setSendtime(Date sendtime) {
+		this.sendtime = sendtime;
+	}
+	
+	@Length(min=0, max=64, message="邮件外键长度必须介于 0 和 64 之间")
+	public Mail getMail() {
+		return mail;
+	}
+
+	public void setMail(Mail mail) {
+		this.mail = mail;
+	}
+}

+ 150 - 0
src/main/java/com/jeeplus/modules/iim/entity/MailCompose.java

@@ -0,0 +1,150 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.iim.entity;
+
+import org.hibernate.validator.constraints.Length;
+
+import java.util.Date;
+import java.util.List;
+
+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.modules.oa.entity.OaNotifyRecord;
+import com.jeeplus.modules.sys.entity.User;
+
+
+/**
+ * 发件箱Entity
+ * @author jeeplus
+ * @version 2015-11-15
+ */
+public class MailCompose extends DataEntity<MailCompose> {
+	
+	private static final long serialVersionUID = 1L;
+	private String status;		// 状态 0 草稿 1 已发送
+	private String readstatus;		// 状态 0 未读 1 已读
+	private User sender;		// 发送者
+	private User receiver;		// 接收者
+	private List<User> receiverList;		// 接收者
+	private Date sendtime;		// 发送时间
+	private Mail mail;		// 邮件id 父类
+	
+	public MailCompose() {
+		super();
+	}
+
+	public MailCompose(String id){
+		super(id);
+	}
+
+	public MailCompose(Mail mail){
+		this.mail = mail;
+	}
+
+	@Length(min=0, max=45, message="状态 0 草稿 1 已发送长度必须介于 0 和 45 之间")
+	public String getStatus() {
+		return status;
+	}
+
+	public void setStatus(String status) {
+		this.status = status;
+	}
+	
+	@Length(min=0, max=45, message="状态 0 未读 1 已读长度必须介于 0 和 45 之间")
+	public String getReadstatus() {
+		return readstatus;
+	}
+
+	public void setReadstatus(String readstatus) {
+		this.readstatus = readstatus;
+	}
+	
+	public User getSender() {
+		return sender;
+	}
+
+	public void setSender(User sender) {
+		this.sender = sender;
+	}
+	
+	
+	
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	public Date getSendtime() {
+		return sendtime;
+	}
+
+	public void setSendtime(Date sendtime) {
+		this.sendtime = sendtime;
+	}
+	
+	@Length(min=0, max=64, message="邮件id长度必须介于 0 和 64 之间")
+	public Mail getMail() {
+		return mail;
+	}
+
+	public void setMail(Mail mail) {
+		this.mail = mail;
+	}
+
+
+	public void setReceiverList(List<User> receiverList) {
+		this.receiverList = receiverList;
+	}
+
+	public List<User> getReceiverList() {
+		return receiverList;
+	}
+
+
+	/**
+	 * 获取收件人用户ID
+	 * @return
+	 */
+	public String getReceiverIds() {
+		return Collections3.extractToString(receiverList, "user.id", ",") ;
+	}
+	
+	/**
+	 * 设置收件人用户ID
+	 * @return
+	 */
+	public void setReceiverIds(String receiverIds) {
+		this.receiverList = Lists.newArrayList();
+		for (String id : StringUtils.split(receiverIds, ",")){
+			
+			this.receiverList.add(new User(id));
+		}
+	}
+
+	/**
+	 * 获取收件人用户Name
+	 * @return
+	 */
+	public String getReceiverNames() {
+		return Collections3.extractToString(receiverList, "user.name", ",") ;
+	}
+	
+	/**
+	 * 设置发件人用户Name
+	 * @return
+	 */
+	public void setReceiverNames(String receiverNames) {
+		// 什么也不做
+	}
+
+	public void setReceiver(User receiver) {
+		this.receiver = receiver;
+	}
+
+	public User getReceiver() {
+		return receiver;
+	}
+	
+	
+}

+ 109 - 0
src/main/java/com/jeeplus/modules/iim/entity/MailPage.java

@@ -0,0 +1,109 @@
+package com.jeeplus.modules.iim.entity;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.jeeplus.common.persistence.Page;
+
+public class MailPage<T> extends Page<T>{
+	
+	public MailPage(HttpServletRequest request, HttpServletResponse response){
+		super(request, response, -2);
+	}
+	/**
+	 * 默认输出当前分页标签 
+	 * <div class="page">${page}</div>
+	 */
+	@Override
+	public String toString() {
+
+		StringBuilder sb = new StringBuilder();
+		sb.append("<div class=\"\">");
+		sb.append("<div class=\"\">");
+	
+		
+		sb.append("<div class=\"dataTables_paginate paging_simple_numbers\">");
+		
+		sb.append("<ul class=\"pagination\">");
+		
+		if (pageNo == first) {// 如果是首页
+			sb.append("<li class=\"paginate_button previous disabled\"><a href=\"javascript:\">上一页</a></li>\n");
+		} else {
+			sb.append("<li class=\"paginate_button previous\"><a href=\"javascript:\" onclick=\""+funcName+"("+prev+","+pageSize+",'"+funcParam+"');\">上一页</a></li>\n");
+		}
+
+		int begin = pageNo - (length / 2);
+
+		if (begin < first) {
+			begin = first;
+		}
+
+		int end = begin + length - 1;
+
+		if (end >= last) {
+			end = last;
+			begin = end - length + 1;
+			if (begin < first) {
+				begin = first;
+			}
+		}
+
+		if (begin > first) {
+			int i = 0;
+			for (i = first; i < first + slider && i < begin; i++) {
+				sb.append("<li class=\"paginate_button \"><a href=\"javascript:\" onclick=\""+funcName+"("+i+","+pageSize+",'"+funcParam+"');\">"
+						+ (i + 1 - first) + "</a></li>\n");
+			}
+			if (i < begin) {
+				sb.append("<li class=\"paginate_button disabled\"><a href=\"javascript:\">...</a></li>\n");
+			}
+		}
+
+		for (int i = begin; i <= end; i++) {
+			if (i == pageNo) {
+				sb.append("<li class=\"paginate_button active\"><a href=\"javascript:\">" + (i + 1 - first)
+						+ "</a></li>\n");
+			} else {
+				sb.append("<li class=\"paginate_button \"><a href=\"javascript:\" onclick=\""+funcName+"("+i+","+pageSize+",'"+funcParam+"');\">"
+						+ (i + 1 - first) + "</a></li>\n");
+			}
+		}
+
+		if (last - end > slider) {
+			sb.append("<li class=\"paginate_button disabled\"><a href=\"javascript:\">...</a></li>\n");
+			end = last - slider;
+		}
+
+		for (int i = end + 1; i <= last; i++) {
+			sb.append("<li class=\"paginate_button \"><a href=\"javascript:\" onclick=\""+funcName+"("+i+","+pageSize+",'"+funcParam+"');\">"
+					+ (i + 1 - first) + "</a></li>\n");
+		}
+
+		if (pageNo == last) {
+			sb.append("<li class=\"paginate_button next disabled\"><a href=\"javascript:\">下一页 </a></li>\n");
+		} else {
+			sb.append("<li class=\"paginate_button next\"><a href=\"javascript:\" onclick=\""+funcName+"("+next+","+pageSize+",'"+funcParam+"');\">"
+					+ "下一页</a></li>\n");
+		}
+
+		sb.append("<li> <select onChange=\""+funcName+"("+pageNo+",this.value,'"+funcParam+"');\"" +" style=\"padding:4px 5px;height:19px;line-height:19px;\" class=\"btn-sm\">" +
+		        "<option value=\"10\" "+getSelected(pageSize,10)+ ">10</option>" +
+				"<option value=\"25\" "+getSelected(pageSize,25)+ ">25</option>" +
+				"<option value=\"50\" "+getSelected(pageSize,50)+ ">50</option>" +
+				"<option value=\"100\" "+getSelected(pageSize,100)+ ">100</option>" +
+				"</select> </li>\n");
+        sb.append("</ul>");
+        sb.append("</div>");
+        sb.append("</div>");
+        sb.append("</div>");
+//		sb.insert(0,"<ul>\n").append("</ul>\n");
+		
+//		sb.append("<div style=\"clear:both;\"></div>");
+
+//		sb.insert(0,"<div class=\"page\">\n").append("</div>\n");
+		
+		return sb.toString();
+	}
+	
+
+}

+ 51 - 0
src/main/java/com/jeeplus/modules/iim/entity/Mine.java

@@ -0,0 +1,51 @@
+package com.jeeplus.modules.iim.entity;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * layim我的信息
+ * @author Swhite
+ *
+ */
+public class Mine {
+	private String username;//用户名
+	private String id; //id
+	private String status; //状态
+	private String remark; //个性签名
+	private String avatar; //头像
+	
+	
+	
+	public String getUsername() {
+		return username;
+	}
+	public void setUsername(String username) {
+		this.username = username;
+	}
+	public String getId() {
+		return id;
+	}
+	public void setId(String id) {
+		this.id = id;
+	}
+	public String getStatus() {
+		return status;
+	}
+	public void setStatus(String status) {
+		this.status = status;
+	}
+	public String getRemark() {
+		return remark;
+	}
+	public void setRemark(String remark) {
+		this.remark = remark;
+	}
+	public String getAvatar() {
+		return avatar;
+	}
+	public void setAvatar(String avatar) {
+		this.avatar = avatar;
+	}
+
+}

+ 137 - 0
src/main/java/com/jeeplus/modules/iim/entity/MyCalendar.java

@@ -0,0 +1,137 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.iim.entity;
+
+import org.hibernate.validator.constraints.Length;
+
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+import com.jeeplus.modules.sys.entity.User;
+
+/**
+ * 日历Entity
+ * @author liugf
+ * @version 2016-04-19
+ */
+public class MyCalendar extends DataEntity<MyCalendar> {
+	
+	private static final long serialVersionUID = 1L;
+	private String title;		// 事件标题
+	private String start;		// 事件开始时间
+	private String end;		// 事件结束时间
+	private String adllDay;		// 是否为全天时间
+	private String color;		// 时间的背景色
+	private User user;		// 所属用户
+	private String location;	//日程地点  李韵轩新增
+	private String notice;		//提醒时间  李韵轩新增
+    private String count;
+    private String companyId;
+    private String officeId;
+
+    public String getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(String companyId) {
+        this.companyId = companyId;
+    }
+
+    public String getCount() {
+        return count;
+    }
+
+    public void setCount(String count) {
+        this.count = count;
+    }
+
+    public String getLocation() {
+		return location;
+	}
+
+	public void setLocation(String location) {
+		this.location = location;
+	}
+
+	public String getNotice() {
+		return notice;
+	}
+
+	public void setNotice(String notice) {
+		this.notice = notice;
+	}
+
+	public MyCalendar() {
+		super();
+	}
+
+	public MyCalendar(String id){
+		super(id);
+	}
+
+	@Length(min=0, max=64, message="事件标题长度必须介于 0 和 64 之间")
+	@ExcelField(title="事件标题", align=2, sort=1)
+	public String getTitle() {
+		return title;
+	}
+
+	public void setTitle(String title) {
+		this.title = title;
+	}
+	
+	@Length(min=0, max=64, message="事件开始时间长度必须介于 0 和 64 之间")
+	@ExcelField(title="事件开始时间", align=2, sort=2)
+	public String getStart() {
+		return start;
+	}
+
+	public void setStart(String start) {
+		this.start = start;
+	}
+	
+	@Length(min=0, max=64, message="事件结束时间长度必须介于 0 和 64 之间")
+	@ExcelField(title="事件结束时间", align=2, sort=3)
+	public String getEnd() {
+		return end;
+	}
+
+	public void setEnd(String end) {
+		this.end = end;
+	}
+	
+	@Length(min=0, max=64, message="是否为全天时间长度必须介于 0 和 64 之间")
+	@ExcelField(title="是否为全天时间", align=2, sort=4)
+	public String getAdllDay() {
+		return adllDay;
+	}
+
+	public void setAdllDay(String adllDay) {
+		this.adllDay = adllDay;
+	}
+	
+	@Length(min=0, max=64, message="时间的背景色长度必须介于 0 和 64 之间")
+	@ExcelField(title="时间的背景色", align=2, sort=5)
+	public String getColor() {
+		return color;
+	}
+
+	public void setColor(String color) {
+		this.color = color;
+	}
+
+	public void setUser(User user) {
+		this.user = user;
+	}
+
+	public User getUser() {
+		return user;
+	}
+
+	public String getOfficeId() {
+		return officeId;
+	}
+
+	public void setOfficeId(String officeId) {
+		this.officeId = officeId;
+	}
+}

+ 69 - 0
src/main/java/com/jeeplus/modules/iim/service/ChatHistoryService.java

@@ -0,0 +1,69 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.iim.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.iim.dao.ChatHistoryDao;
+import com.jeeplus.modules.iim.entity.ChatHistory;
+
+/**
+ * 聊天记录Service
+ * @author jeeplus
+ * @version 2015-12-29
+ */
+@Service
+@Transactional(readOnly = true)
+public class ChatHistoryService extends CrudService<ChatHistoryDao, ChatHistory> {
+
+	public ChatHistory get(String id) {
+		return super.get(id);
+	}
+	
+	public List<ChatHistory> findList(ChatHistory chatHistory) {
+		return super.findList(chatHistory);
+	}
+	
+	
+	public Page<ChatHistory> findPage(Page<ChatHistory> page, ChatHistory entity) {
+		entity.setPage(page);
+		page.setList(dao.findLogList(entity));
+		return page;
+	}
+	
+	public List<ChatHistory> getIMUserContacts(ChatHistory entity) {
+		return dao.getIMUserContacts(entity);
+	}
+
+	public Page<ChatHistory> findGroupPage(Page<ChatHistory> page, ChatHistory entity) {
+		entity.setPage(page);
+		page.setList(dao.findGroupLogList(entity));
+		return page;
+	}
+	
+	@Transactional(readOnly = false)
+	public void save(ChatHistory chatHistory) {
+		super.save(chatHistory);
+	}
+	@Transactional(readOnly = false)
+	public void insert(ChatHistory chatHistory) {
+		chatHistory.preInsert();
+		dao.insert(chatHistory);
+	}
+
+	@Transactional(readOnly = false)
+	public void delete(ChatHistory chatHistory) {
+		super.delete(chatHistory);
+	}
+	
+	public int findUnReadCount(ChatHistory chatHistory){
+		return dao.findUnReadCount(chatHistory);
+	}
+	
+}

+ 263 - 0
src/main/java/com/jeeplus/modules/iim/service/LayGroupService.java

@@ -0,0 +1,263 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.iim.service;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import com.jeeplus.common.oss.OSSClientUtil;
+import com.jeeplus.common.utils.IdGen;
+import com.jeeplus.modules.sys.entity.Office;
+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.iim.entity.LayGroup;
+import com.jeeplus.modules.iim.dao.LayGroupDao;
+import com.jeeplus.modules.iim.entity.LayGroupUser;
+import com.jeeplus.modules.iim.dao.LayGroupUserDao;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * 群组Service
+ * @author lgf
+ * @version 2016-08-07
+ */
+@Service
+@Transactional(readOnly = true)
+public class LayGroupService extends CrudService<LayGroupDao, LayGroup> {
+
+	@Autowired
+	private LayGroupUserDao layGroupUserDao;
+
+	public LayGroup get(String id) {
+		LayGroup layGroup = super.get(id);
+		if (layGroup!=null){
+			List<LayGroupUser> layGroupUsers = new ArrayList<>();
+			layGroupUsers.addAll(layGroupUserDao.findList(new LayGroupUser(layGroup)));
+			layGroup.setLayGroupUserList(layGroupUsers);
+		}
+		return layGroup;
+	}
+	public LayGroup getNoOwner(String id) {
+		LayGroup layGroup = super.get(id);
+		if (layGroup!=null) {
+			List<LayGroupUser> layGroupUsers = new ArrayList<>();
+			LayGroupUser layGroupUser = new LayGroupUser(layGroup);
+			layGroupUser.setIsAdmin("1");
+			List<LayGroupUser> list = layGroupUserDao.findList(layGroupUser);
+			for (LayGroupUser groupUser : list) {
+				if (groupUser.getIsAdmin().equals("0")) {
+					layGroupUsers.add(groupUser);
+				}
+			}
+			layGroup.setLayGroupUserList(layGroupUsers);
+		}
+		return layGroup;
+	}
+
+	@Transactional(readOnly = false)
+	public int saveUsers(String groupid, String ids) {
+		String idArray[] = ids.split(",");
+		int count = 0;
+		LayGroup group = this.get(groupid);
+		if (group!=null) {
+			for (String id : idArray) {
+				User user = UserUtils.get(id);
+					LayGroupUser lgUser = new LayGroupUser();
+					lgUser.setGroup(group);
+					lgUser.setUser(user);
+					lgUser.setIsAdmin("0");
+					if (layGroupUserDao.findList(lgUser).size() == 0 && !user.getId().equals(group.getCreateBy().getId())) {
+						count++;
+						lgUser.preInsert();
+						layGroupUserDao.insert(lgUser);
+				}
+			}
+		}
+		return count;
+	}
+
+	public List<LayGroup> findList(LayGroup layGroup) {
+		List<LayGroup> layGroupList= new ArrayList<LayGroup>();
+		List<LayGroup> list = super.findList(layGroup);
+		for(LayGroup u:list){
+			layGroupList.add(this.get(u.getId()));
+		}
+		return layGroupList;
+	}
+
+	public List<LayGroup> findGroupList(User user) {
+		List<LayGroup> layGroupList= new ArrayList<LayGroup>();
+		LayGroupUser layGroupUser = new LayGroupUser();
+		layGroupUser.setUser(user);
+		List<LayGroupUser> list = layGroupUserDao.findList(layGroupUser);
+		for(LayGroupUser u:list){
+			layGroupList.add(this.get(u.getGroup().getId()));
+		}
+		return layGroupList;
+	}
+	public List<LayGroup> findGroupListNotOwner(User user) {
+		List<LayGroup> layGroupList= new ArrayList<LayGroup>();
+		LayGroupUser layGroupUser = new LayGroupUser();
+		layGroupUser.setUser(user);
+		layGroupUser.setIsAdmin("0");
+		List<LayGroupUser> list = layGroupUserDao.findList(layGroupUser);
+		for(LayGroupUser u:list){
+			layGroupList.add(this.get(u.getGroup().getId()));
+		}
+		return layGroupList;
+	}
+	public List<LayGroup> findGroupListOwner(User user) {
+		List<LayGroup> layGroupList= new ArrayList<LayGroup>();
+		LayGroupUser layGroupUser = new LayGroupUser();
+		layGroupUser.setUser(user);
+		layGroupUser.setIsAdmin("1");
+		List<LayGroupUser> list = layGroupUserDao.findList(layGroupUser);
+		for(LayGroupUser u:list){
+			layGroupList.add(this.get(u.getGroup().getId()));
+		}
+		return layGroupList;
+	}
+
+	public Page<LayGroup> findPage(Page<LayGroup> page, LayGroup layGroup) {
+		layGroup.setPage(page);
+		page.setList(this.findList(layGroup));
+		return page;
+	}
+
+	@Transactional(readOnly = false)
+	public void save(LayGroup layGroup,MultipartFile[] files) {
+		if(layGroup!=null && StringUtils.isNotBlank(layGroup.getAvatar()) &&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 url = ossClientUtil.uploadFile2OSS(file,"im");
+						layGroup.setAvatar(url);
+					}
+				}
+			}
+		}
+		Boolean save = false;
+		if (layGroup.getIsNewRecord()){
+			save = true;
+		}
+		super.save(layGroup);
+		if (save){
+			LayGroupUser layGroupUser = new LayGroupUser();
+			layGroupUser.setGroup(layGroup);
+			layGroupUser.setUser(UserUtils.getUser());
+			layGroupUser.preInsert();
+			layGroupUser.setIsAdmin("1");
+			layGroupUserDao.insert(layGroupUser);
+		}
+		for (LayGroupUser layGroupUser : layGroup.getLayGroupUserList()){
+			if (layGroupUser.getId() == null){
+				continue;
+			}
+			if (LayGroupUser.DEL_FLAG_NORMAL.equals(layGroupUser.getDelFlag())){
+				if (StringUtils.isBlank(layGroupUser.getId())){
+					layGroupUser.setGroup(layGroup);
+					layGroupUser.setIsAdmin("0");
+					layGroupUser.preInsert();
+					layGroupUserDao.insert(layGroupUser);
+				}else{
+					layGroupUser.preUpdate();
+					layGroupUserDao.update(layGroupUser);
+				}
+			}else{
+				layGroupUserDao.delete(layGroupUser);
+			}
+		}
+	}
+
+
+
+	@Transactional(readOnly = false)
+	public void save(LayGroup layGroup) {
+		Boolean save = false;
+		if (layGroup.getIsNewRecord()){
+			save = true;
+		}
+		super.save(layGroup);
+		if (save){
+			LayGroupUser layGroupUser = new LayGroupUser();
+			layGroupUser.setGroup(layGroup);
+			layGroupUser.setIsAdmin("1");
+			layGroupUser.setUser(UserUtils.getUser());
+			layGroupUser.preInsert();
+			layGroupUserDao.insert(layGroupUser);
+		}
+		for (LayGroupUser layGroupUser : layGroup.getLayGroupUserList()){
+			if (LayGroupUser.DEL_FLAG_NORMAL.equals(layGroupUser.getDelFlag())){
+				if (StringUtils.isBlank(layGroupUser.getId())){
+					layGroupUser.setGroup(layGroup);
+					layGroupUser.preInsert();
+					layGroupUser.setIsAdmin("0");
+					layGroupUserDao.insert(layGroupUser);
+				}else{
+					layGroupUser.preUpdate();
+					layGroupUserDao.update(layGroupUser);
+				}
+			}else{
+				layGroupUserDao.delete(layGroupUser);
+			}
+		}
+	}
+
+	@Transactional(readOnly = false)
+	public void insertLayGroup(LayGroup layGroup,User user,Office comOffice) {
+		layGroup.setId(IdGen.uuid());
+		layGroup.setCreateBy(user);
+		layGroup.setUpdateBy(user);
+		Date date = new Date();
+		layGroup.setCreateDate(date);
+		layGroup.setUpdateDate(date);
+		layGroup.setRemarks(comOffice.getId());
+		if(layGroup==null || StringUtils.isBlank(layGroup.getAvatar()) ){
+			layGroup.setAvatar("https://gangwan-app.oss-cn-hangzhou.aliyuncs.com/app-img/photo/static/qunzhu.png");
+		}
+		dao.insert(layGroup);
+		LayGroupUser layGroupUser = new LayGroupUser();
+		layGroupUser.setGroup(layGroup);
+		layGroupUser.setIsAdmin("1");
+		layGroupUser.setUser(user);
+		layGroupUser.preInsert();
+		layGroupUserDao.insert(layGroupUser);
+	}
+
+	@Transactional(readOnly = false)
+	public void delete(LayGroup layGroup) {
+		super.delete(layGroup);
+		layGroupUserDao.delete(new LayGroupUser(layGroup));
+	}
+	@Transactional(readOnly = false)
+	public int deleteGroupUser(LayGroup layGroup,String userIds) {
+		int count = 0;
+		try {
+			String groupId = layGroup.getId();
+			for (String userId:userIds.split(",")){
+				if (!layGroup.getCreateBy().getId().equals(userId)) {
+					LayGroupUser layGroupUser = new LayGroupUser();
+					layGroupUser.setUser(new User(userId));
+					layGroupUser.setGroup(new LayGroup(groupId));
+					layGroupUserDao.deleteUser(layGroupUser);
+					count++;
+				}
+			}
+		}catch (Exception e){
+
+		}
+		return count;
+	}
+
+}

+ 56 - 0
src/main/java/com/jeeplus/modules/iim/service/MailBoxService.java

@@ -0,0 +1,56 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.iim.service;
+
+import java.util.List;
+
+import com.jeeplus.common.utils.StringUtils;
+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.iim.dao.MailBoxDao;
+import com.jeeplus.modules.iim.entity.MailBox;
+import com.jeeplus.modules.iim.entity.MailPage;
+
+/**
+ * 收件箱Service
+ * @author jeeplus
+ * @version 2015-11-13
+ */
+@Service
+@Transactional(readOnly = true)
+public class MailBoxService extends CrudService<MailBoxDao, MailBox> {
+
+	@Autowired
+	private MailBoxDao mailBoxDao;
+	public MailBox get(String id) {
+		return super.get(id);
+	}
+	
+	public List<MailBox> findList(MailBox mailBox) {
+		return super.findList(mailBox);
+	}
+	
+	public Page<MailBox> findPage(MailPage<MailBox> page, MailBox mailBox) {
+		return super.findPage(page, mailBox);
+	}
+	
+	@Transactional(readOnly = false)
+	public void save(MailBox mailBox) {
+		super.save(mailBox);
+	}
+	
+	@Transactional(readOnly = false)
+	public void delete(MailBox mailBox) {
+		super.delete(mailBox);
+	}
+	
+	public int getCount(MailBox mailBox) {
+		return mailBoxDao.getCount(mailBox);
+	}
+	
+}

+ 56 - 0
src/main/java/com/jeeplus/modules/iim/service/MailComposeService.java

@@ -0,0 +1,56 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.iim.service;
+
+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.modules.iim.dao.MailBoxDao;
+import com.jeeplus.modules.iim.dao.MailComposeDao;
+import com.jeeplus.modules.iim.entity.MailBox;
+import com.jeeplus.modules.iim.entity.MailCompose;
+import com.jeeplus.modules.iim.entity.MailPage;
+
+/**
+ * 发件箱Service
+ * @author jeeplus
+ * @version 2015-11-13
+ */
+@Service
+@Transactional(readOnly = true)
+public class MailComposeService extends CrudService<MailComposeDao, MailCompose> {
+	@Autowired
+	private MailComposeDao mailComposeDao;
+	public MailCompose get(String id) {
+		return super.get(id);
+	}
+	
+	public List<MailCompose> findList(MailCompose mailCompose) {
+		return super.findList(mailCompose);
+	}
+	
+	public Page<MailCompose> findPage(MailPage<MailCompose> page, MailCompose mailCompose) {
+		return super.findPage(page, mailCompose);
+	}
+	
+	@Transactional(readOnly = false)
+	public void save(MailCompose mailCompose) {
+		super.save(mailCompose);
+	}
+	
+	@Transactional(readOnly = false)
+	public void delete(MailCompose mailCompose) {
+		super.delete(mailCompose);
+	}
+
+	public int getCount(MailCompose mailCompose) {
+		return mailComposeDao.getCount(mailCompose);
+	}
+	
+}

+ 135 - 0
src/main/java/com/jeeplus/modules/iim/service/MailService.java

@@ -0,0 +1,135 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.iim.service;
+
+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.iim.dao.MailBoxDao;
+import com.jeeplus.modules.iim.dao.MailComposeDao;
+import com.jeeplus.modules.iim.dao.MailDao;
+import com.jeeplus.modules.iim.entity.Mail;
+import com.jeeplus.modules.iim.entity.MailBox;
+import com.jeeplus.modules.iim.entity.MailCompose;
+
+/**
+ * 发件箱Service
+ * @author jeeplus
+ * @version 2015-11-15
+ */
+@Service
+@Transactional(readOnly = true)
+public class MailService extends CrudService<MailDao, Mail> {
+
+	@Autowired
+	private MailBoxDao mailBoxDao;
+	@Autowired
+	private MailComposeDao mailComposeDao;
+	
+	public Mail get(String id) {
+		Mail mail = super.get(id);
+		mail.setMailBoxList(mailBoxDao.findList(new MailBox(mail)));
+		mail.setMailComposeList(mailComposeDao.findList(new MailCompose(mail)));
+		return mail;
+	}
+	
+	public List<Mail> findList(Mail mail) {
+		return super.findList(mail);
+	}
+	
+	public Page<Mail> findPage(Page<Mail> page, Mail mail) {
+		return super.findPage(page, mail);
+	}
+	
+	@Transactional(readOnly = false)
+	public void save(Mail mail) {
+		super.save(mail);
+		for (MailBox mailBox : mail.getMailBoxList()){
+			if (mailBox.getId() == null){
+				continue;
+			}
+			if (MailBox.DEL_FLAG_NORMAL.equals(mailBox.getDelFlag())){
+				if (StringUtils.isBlank(mailBox.getId())){
+					mailBox.setMail(mail);
+					mailBox.preInsert();
+					mailBoxDao.insert(mailBox);
+				}else{
+					mailBox.preUpdate();
+					mailBoxDao.update(mailBox);
+				}
+			}else{
+				mailBoxDao.delete(mailBox);
+			}
+		}
+		for (MailCompose mailCompose : mail.getMailComposeList()){
+			if (mailCompose.getId() == null){
+				continue;
+			}
+			if (MailCompose.DEL_FLAG_NORMAL.equals(mailCompose.getDelFlag())){
+				if (StringUtils.isBlank(mailCompose.getId())){
+					mailCompose.setMail(mail);
+					mailCompose.preInsert();
+					mailComposeDao.insert(mailCompose);
+				}else{
+					mailCompose.preUpdate();
+					mailComposeDao.update(mailCompose);
+				}
+			}else{
+				mailComposeDao.delete(mailCompose);
+			}
+		}
+	}
+	@Transactional(readOnly = false)
+	public void saveOnlyMain(Mail mail) {
+		super.save(mail);
+		for (MailBox mailBox : mail.getMailBoxList()){
+			if (mailBox.getId() == null){
+				continue;
+			}
+			if (MailBox.DEL_FLAG_NORMAL.equals(mailBox.getDelFlag())){
+				if (StringUtils.isBlank(mailBox.getId())){
+					mailBox.setMail(mail);
+					mailBox.preInsert();
+					mailBoxDao.insert(mailBox);
+				}else{
+					mailBox.preUpdate();
+					mailBoxDao.update(mailBox);
+				}
+			}else{
+				mailBoxDao.delete(mailBox);
+			}
+		}
+		for (MailCompose mailCompose : mail.getMailComposeList()){
+			if (mailCompose.getId() == null){
+				continue;
+			}
+			if (MailCompose.DEL_FLAG_NORMAL.equals(mailCompose.getDelFlag())){
+				if (StringUtils.isBlank(mailCompose.getId())){
+					mailCompose.setMail(mail);
+					mailCompose.preInsert();
+					mailComposeDao.insert(mailCompose);
+				}else{
+					mailCompose.preUpdate();
+					mailComposeDao.update(mailCompose);
+				}
+			}else{
+				mailComposeDao.delete(mailCompose);
+			}
+		}
+	}
+	
+	@Transactional(readOnly = false)
+	public void delete(Mail mail) {
+		super.delete(mail);
+		mailBoxDao.delete(new MailBox(mail));
+		mailComposeDao.delete(new MailCompose(mail));
+	}
+	
+}

+ 154 - 0
src/main/java/com/jeeplus/modules/iim/service/MyCalendarService.java

@@ -0,0 +1,154 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.iim.service;
+
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.service.CrudService;
+import com.jeeplus.common.utils.JPushClientUtil;
+import com.jeeplus.modules.iim.dao.MyCalendarDao;
+import com.jeeplus.modules.iim.entity.MyCalendar;
+import com.jeeplus.modules.pushinfo.entity.Pushinfo;
+import com.jeeplus.modules.pushinfo.service.PushinfoService;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.net.URLDecoder;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 日历Service
+ * 
+ * @author liugf
+ * @version 2016-04-19
+ */
+@Service
+@Transactional(readOnly = true)
+public class MyCalendarService extends CrudService<MyCalendarDao, MyCalendar> {
+	
+	@Autowired
+	private MyCalendarDao myCalendarDao;
+    @Autowired
+    private PushinfoService pushinfoService;
+
+	public MyCalendar get(String id) {
+		return super.get(id);
+	}
+
+	public List<MyCalendar> getByUserIdCount(MyCalendar myCalendar) {
+		return dao.getByUserIdCount(myCalendar);
+	}
+
+	public List<MyCalendar> findList(MyCalendar myCalendar) {
+		return super.findList(myCalendar);
+	}
+
+	public Page<MyCalendar> findPage(Page<MyCalendar> page, MyCalendar myCalendar) {
+		return super.findPage(page, myCalendar);
+	}
+
+	public List<MyCalendar> findListByDate(MyCalendar myCalendar){
+		return myCalendarDao.findListByDate(myCalendar);
+		
+	}
+	
+	@Transactional(readOnly = false)
+	public void save(MyCalendar myCalendar) {
+		super.save(myCalendar);
+	}
+	//pc端
+    //保存修改日历并发推送
+	@Transactional(readOnly = false)
+    public void saveCalender(MyCalendar myCalendar){
+        super.save(myCalendar);
+        Map<String,String> map = new HashMap<>();
+        map.put("id",myCalendar.getId());
+        map.put("type","5001");
+        String title = myCalendar.getTitle();
+        String content = "您有一个新的日程即将开始";
+        String remarks = myCalendar.getStart()+" -- "+myCalendar.getEnd()+"  "+title;
+        String alias = myCalendar.getUser().getId();
+        String time = myCalendar.getNotice()+":00";
+        JPushClientUtil.sendNotificationToAliasByTime(title,content,map,alias,time);
+        Pushinfo pushinfo = new Pushinfo();
+        pushinfo.setCurrentUser(UserUtils.getUser());
+        pushinfo.setRemarks(remarks);
+        pushinfo.setUserId(UserUtils.getUser().getId());
+        pushinfo.setType("5001");
+        pushinfo.setPushId(myCalendar.getId());
+        pushinfo.setTitle("日程");
+        pushinfo.setContent(content);
+        pushinfo.setPushUserId(UserUtils.getUser().getId());
+        pushinfo.setParentType("singleNowCalendar");
+        pushinfo.setMobile("ios,android");
+        pushinfo.setCompanyId(myCalendar.getCompanyId());
+        pushinfoService.save(pushinfo);
+    }
+
+
+	@Transactional(readOnly = false)
+	public void delete(MyCalendar myCalendar) {
+		super.delete(myCalendar);
+	}
+
+	//APP端
+	@Transactional(readOnly = false)
+	public MyCalendar saveCalendar(HashMap<String, String> requestMap) throws Exception{
+//		String userId = requestMap.get("userId");
+        String calendarId = URLDecoder.decode(requestMap.get("calendarId")==null?"":requestMap.get("calendarId"), "UTF-8");
+        String title = URLDecoder.decode(requestMap.get("title")==null?"":requestMap.get("title"), "UTF-8");
+        String location = URLDecoder.decode(requestMap.get("location")==null?"":requestMap.get("location"), "UTF-8");
+        String startTime = URLDecoder.decode(requestMap.get("startTime")==null?"":requestMap.get("startTime"), "UTF-8");
+        String endTime = URLDecoder.decode(requestMap.get("endTime")==null?"":requestMap.get("endTime"), "UTF-8");
+        String noticeTime = URLDecoder.decode(requestMap.get("noticeTime")==null?"":requestMap.get("noticeTime"), "UTF-8");
+        String companyId = UserUtils.getSelectCompany().getId();
+        MyCalendar myCalendar = new MyCalendar();
+		try {
+            User user = UserUtils.getUser();
+            if(calendarId != null && !calendarId.equals("")){
+                myCalendar =super.get(calendarId);
+            }
+            myCalendar.setUser(user);
+            myCalendar.setTitle(title);
+            myCalendar.setLocation(location);
+            myCalendar.setStart(startTime);
+            myCalendar.setEnd(endTime);
+            myCalendar.setNotice(noticeTime);
+            myCalendar.setCompanyId(companyId);
+            myCalendar.setOfficeId(UserUtils.getSelectOffice().getId());
+            super.save(myCalendar);
+            Map extras = new HashMap();
+            String content="您有一个日程即将开始";
+            extras.put("id", myCalendar.getId());
+            extras.put("type","5001");
+            String remarks = startTime + "--" + endTime + " "+title;
+            //UserUtils.getSelectCompany();
+            String aliase = user.getId();
+            String time = noticeTime+":00";
+            JPushClientUtil.sendNotificationToAliasByTime(title, content, extras, aliase, time);
+            Pushinfo pushinfo = new Pushinfo();
+            pushinfo.setCurrentUser(UserUtils.getUser());
+            pushinfo.setRemarks(remarks);
+            pushinfo.setUserId(UserUtils.getUser().getId());
+            pushinfo.setType("5001");
+            pushinfo.setPushId(myCalendar.getId());
+            pushinfo.setTitle("日程");
+            pushinfo.setContent(content);
+            pushinfo.setPushUserId(UserUtils.getUser().getId());
+            pushinfo.setParentType("singleNowCalendar");
+            pushinfo.setMobile("ios,android");
+            pushinfo.setCompanyId(companyId);
+            pushinfoService.save(pushinfo);
+            return myCalendar;
+        }catch (Exception e){
+            return myCalendar;
+        }
+
+	}
+
+}

+ 53 - 0
src/main/java/com/jeeplus/modules/iim/utils/DateUtil.java

@@ -0,0 +1,53 @@
+package com.jeeplus.modules.iim.utils;
+
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * 日期及时间处理函数
+ * 
+ * @author liugf
+ */
+public class DateUtil {
+
+	private static final String DEFAULT_PATTERN = "yyyy-MM-dd HH:mm:ss";
+
+	/**
+	 * 字符串时间转LONG
+	 * @param sdate
+	 * @return
+	 */
+	public static long string2long(String sdate){
+		if(sdate.length() < 11){
+			sdate = sdate + " 00:00:00";
+		}
+		SimpleDateFormat sdf= new SimpleDateFormat(DEFAULT_PATTERN);
+		Date dt2 = null;
+		try {
+			dt2 = sdf.parse(sdate);
+		} catch (ParseException e) {
+				e.printStackTrace();
+		}
+		//继续转换得到秒数的long型
+		long lTime = dt2.getTime() / 1000;
+		return lTime;
+	}
+	
+	/**
+	 * LONG时间转字符串
+	 * @param ldate
+	 * @return
+	 */
+	public static String long2string(long ldate){
+		SimpleDateFormat sdf= new SimpleDateFormat(DEFAULT_PATTERN);
+		//前面的ldate是秒数,先乘1000得到毫秒数,再转为java.util.Date类型
+		java.util.Date dt = new Date(ldate * 1000);  
+		String sDateTime = sdf.format(dt);  //得到精确到秒的表示
+		if(sDateTime.endsWith("00:00:00")){
+			sDateTime = sDateTime.substring(0,10);
+		}
+		return sDateTime;
+	}
+}

+ 197 - 0
src/main/java/com/jeeplus/modules/iim/web/ChatHistoryController.java

@@ -0,0 +1,197 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.iim.web;
+
+import java.text.SimpleDateFormat;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+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.servlet.mvc.support.RedirectAttributes;
+
+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.web.BaseController;
+import com.jeeplus.modules.iim.entity.ChatHistory;
+import com.jeeplus.modules.iim.service.ChatHistoryService;
+import com.jeeplus.modules.sys.utils.UserUtils;
+
+/**
+ * 聊天记录Controller
+ * @author jeeplus
+ * @version 2015-12-29
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/iim/chatHistory")
+public class ChatHistoryController extends BaseController {
+
+	@Autowired
+	private ChatHistoryService chatHistoryService;
+	
+	@ModelAttribute
+	public ChatHistory get(@RequestParam(required=false) String id) {
+		ChatHistory entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = chatHistoryService.get(id);
+		}
+		if (entity == null){
+			entity = new ChatHistory();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 聊天列表页面
+	 */
+	@RequestMapping(value = {"list", ""})
+	public String list(ChatHistory chatHistory, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page pg = new Page<ChatHistory>(request, response);
+		Page<ChatHistory> page;
+		if("group".equals(chatHistory.getType())){
+			
+			page = chatHistoryService.findGroupPage(pg, chatHistory); 
+			
+		}else{
+			page = chatHistoryService.findPage(pg, chatHistory); 
+		}
+	
+		model.addAttribute("chatHistory", chatHistory);
+		model.addAttribute("page", page);
+		return "modules/iim/chatHistoryList";
+	}
+
+	/**
+	 * 查看,增加,编辑聊天表单页面
+	 */
+	@RequestMapping(value = "form")
+	public String form(ChatHistory chatHistory, Model model) {
+		model.addAttribute("chatHistory", chatHistory);
+		return "modules/iim/chatHistoryForm";
+	}
+
+	/**
+	 * 保存聊天
+	 */
+	@RequestMapping(value = "save")
+	public String save(ChatHistory chatHistory, Model model, RedirectAttributes redirectAttributes) {
+		if (!beanValidator(model, chatHistory)){
+			return form(chatHistory, model);
+		}
+		chatHistoryService.save(chatHistory);
+		addMessage(redirectAttributes, "保存聊天成功");
+		return "redirect:"+Global.getAdminPath()+"/iim/chatHistory/?repage";
+	}
+	
+	/**
+	 * 删除聊天
+	 */
+	@RequestMapping(value = "delete")
+	public String delete(ChatHistory chatHistory, RedirectAttributes redirectAttributes) {
+		chatHistoryService.delete(chatHistory);
+		addMessage(redirectAttributes, "删除聊天成功");
+		return "redirect:"+Global.getAdminPath()+"/iim/chatHistory/?repage";
+	}
+	
+	/**
+	 * 批量删除聊天
+	 */
+	@RequestMapping(value = "deleteAll")
+	public String deleteAll(String ids, RedirectAttributes redirectAttributes) {
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			chatHistoryService.delete(chatHistoryService.get(id));
+		}
+		addMessage(redirectAttributes, "删除聊天成功");
+		return "redirect:"+Global.getAdminPath()+"/iim/chatHistory/?repage";
+	}
+	
+	/**
+	 * 导出excel文件
+	 */
+	@RequiresPermissions("iim:chatHistory:view")
+    @RequestMapping(value = "export", method=RequestMethod.POST)
+    public String exportFile(ChatHistory chatHistory, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "聊天"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            Page<ChatHistory> page = chatHistoryService.findPage(new Page<ChatHistory>(request, response, -1), chatHistory);
+    		new ExportExcel("聊天", ChatHistory.class).setDataList(page.getList()).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导出聊天记录失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/iim/chatHistory/?repage";
+    }
+
+	/**
+	 * 获取聊天记录
+	 */
+	@ResponseBody
+	@RequestMapping(value = "getChats")
+	public AjaxJson getChats(ChatHistory chatHistory, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<ChatHistory> page = chatHistoryService.findPage(new Page<ChatHistory>(request, response), chatHistory); 
+		List<ChatHistory> list = page.getList();
+		for(ChatHistory c : list){
+			if(c.getStatus().equals("0")){
+				if(c.getUserid2().equals(UserUtils.getUser().getLoginName())){//把发送给我的信息标记为已读
+					c.setStatus("1");//标记为已读
+					chatHistoryService.save(c);
+				}
+				
+			}
+		}
+		AjaxJson j = new AjaxJson();
+		j.setMsg("获取聊天记录成功!");
+		j.put("data", page.getList());
+		return j;
+	}
+	
+	/**
+	 * 获取未读条数
+	 */
+	@ResponseBody
+	@RequestMapping(value = "findUnReadCount")
+	public AjaxJson  findUnReadCount(ChatHistory chatHistory, HttpServletRequest request, HttpServletResponse response, Model model) {
+		AjaxJson j = new AjaxJson();
+		int size = chatHistoryService.findUnReadCount(chatHistory); 
+		j.setMsg("获取未读条数成功!");
+		j.put("num", size);
+		
+		return j;
+		
+	}
+
+	
+	/**
+	 * 发送聊天内容(手机端)
+	 */
+	
+	@ResponseBody
+	@RequestMapping(value = "sendChats")
+	public  AjaxJson  sendChats(ChatHistory chatHistory, HttpServletRequest request, HttpServletResponse response, Model model) {
+		AjaxJson j = new AjaxJson();
+		j.setMsg("消息发送成功!");
+		chatHistory.setStatus("0");//标记未读
+		chatHistoryService.save(chatHistory);
+		
+		return j;
+	}
+	
+	
+
+
+}

+ 544 - 0
src/main/java/com/jeeplus/modules/iim/web/ContactController.java

@@ -0,0 +1,544 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.iim.web;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.*;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadPoolExecutor;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.jeeplus.common.json.AjaxJson;
+import com.jeeplus.common.oss.OSSClientUtil;
+import com.jeeplus.common.utils.*;
+import com.jeeplus.modules.sysuseroffice.entity.Useroffice;
+import com.jeeplus.modules.sysuseroffice.service.UserofficeService;
+import org.codehaus.jackson.map.ObjectMapper;
+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 org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.modules.iim.entity.Friend;
+import com.jeeplus.modules.iim.entity.FriendGroup;
+import com.jeeplus.modules.iim.entity.LayFileJsonData;
+import com.jeeplus.modules.iim.entity.LayGroup;
+import com.jeeplus.modules.iim.entity.LayGroupJsonData;
+import com.jeeplus.modules.iim.entity.LayGroupUser;
+import com.jeeplus.modules.iim.entity.LayJson;
+import com.jeeplus.modules.iim.entity.LayJsonData;
+import com.jeeplus.modules.iim.entity.Mine;
+import com.jeeplus.modules.iim.service.LayGroupService;
+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.service.OfficeService;
+import com.jeeplus.modules.sys.service.SystemService;
+import com.jeeplus.modules.sys.utils.UserUtils;
+
+/**
+ * 联系人Controller
+ * 
+ * @author jeeplus(seven修改)
+ * @version 2016-6-23
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/iim/contact")
+public class ContactController extends BaseController {
+
+	@Autowired
+	private SystemService systemService;
+
+	@Autowired
+	private LayGroupService layGroupService;
+	@Autowired
+	private UserofficeService userofficeService;
+
+
+	@Autowired
+	private UserDao userDao;
+
+	@Autowired
+	private OfficeService officeService;
+
+	private ExecutorService poolExecutor = Executors.newFixedThreadPool(10);
+
+	/**
+	 * 打开通讯录
+	 * 
+	 * @param user
+	 * @param request
+	 * @param response
+	 * @param model
+	 * @return
+	 */
+	@RequestMapping(value = { "index", "" })
+	public String index(User user, HttpServletRequest request, HttpServletResponse response, Model model) {
+		List<User> list = systemService.findUser(user);
+		model.addAttribute("list", list);
+		return "modules/iim/contacts";
+	}
+
+	/**
+	 * 查找
+	 * 
+	 * @param u
+	 * @param request
+	 * @param response
+	 * @param model
+	 * @return
+	 */
+	@RequestMapping(value = "searchUsers")
+	public String searchUsers(User u, HttpServletRequest request, HttpServletResponse response, Model model) {
+		User user = UserUtils.getUser();
+		if(! user.isAdmin()) {
+			if (StringUtils.isNotBlank(u.getMobile()) || StringUtils.isNotBlank(u.getName())) {
+				List<User> users = userDao.findFriendByMobileOrName(u);
+				model.addAttribute("list", users);
+			}else if(StringUtils.isNotBlank(u.getComId()) && u.getComId().equals("comId")) {
+				Useroffice useroffice = new Useroffice();
+				List<Office> companyList = UserUtils.getAllCompany(user);
+				List companyIds = new ArrayList();
+				for (Office office : companyList) {
+					companyIds.add(office.getId());
+				}
+				useroffice.setCompanyIds(companyIds);
+				useroffice.setDelFlag("0");
+				List<Useroffice> list = new ArrayList<Useroffice>();
+				if(StringUtils.isEmpty(u.getName())&&StringUtils.isEmpty(u.getMobile())){
+					list = userofficeService.searchUsers(useroffice);
+				}
+				if(StringUtils.isNotEmpty(u.getName())&&StringUtils.isEmpty(u.getMobile())){
+					useroffice.setName(u.getName());
+					list = userofficeService.searchUsers(useroffice);
+				}
+				if (StringUtils.isEmpty(u.getName())&&StringUtils.isNotEmpty(u.getMobile())) {
+					useroffice.setMobile(u.getMobile());
+					list = userofficeService.searchUsers(useroffice);
+				}
+				if (StringUtils.isNotEmpty(u.getName())&&StringUtils.isNotEmpty(u.getMobile())) {
+					useroffice.setName(u.getName());
+					useroffice.setMobile(u.getMobile());
+					list = userofficeService.searchUsers(useroffice);
+				}
+				List<User> friends = new ArrayList<User>();
+				for (int i = 0; i < list.size(); i++) {
+					User u1 = UserUtils.get(list.get(i).getUserId());
+					if(u1!=null&&u1.getCompany().getName().equals(user.getCompany().getName())&&!u1.getLoginName().equals(user.getLoginName())){
+						friends.add(u1);
+					}
+				}
+				// 我的好友--->常用联系人
+				User currentUser = UserUtils.getUser();
+				friends.addAll(userDao.findFriends(currentUser));
+				List<User> users = new ArrayList<>();
+				if (StringUtils.isNotBlank(u.getMobile())) {
+					if (StringUtils.isNotBlank(u.getName())){
+						for (User user1:friends){
+							if (user1.getMobile().equals(u.getMobile())){
+								if(user1.getName().contains(u.getName())) {
+									users.add(user1);
+								}
+								break;
+							}
+						}
+					}else {
+						for (User user1:friends){
+							if (user1.getMobile().equals(u.getMobile())){
+								users.add(user1);
+								break;
+							}
+						}
+					}
+
+					model.addAttribute("list", users);
+				}else if (StringUtils.isNotBlank(u.getName())){
+					for (User user1 : friends) {
+						if (user1.getName().contains(u.getName())) {
+							users.add(user1);
+						}
+					}
+					model.addAttribute("list", users);
+				}else {
+					users.addAll(friends);
+					model.addAttribute("list", users);
+				}
+			}else {
+				model.addAttribute("list", null);
+			}
+		}else{
+			List<User> friends = userDao.searchUsers(u);
+			model.addAttribute("list", friends);
+		}
+		/*
+		User u = UserUtils.getUser();
+		if(! u.isAdmin()){
+			user.setCompany(UserUtils.getSelectCompany());
+		}
+		List<User> friends = userDao.searchUsers(user);*/
+
+
+		return "modules/iim/search_user";
+	}
+
+	/**
+	 * 添加好友--->常用联系人
+	 */
+	@RequestMapping(value = "addFriend")
+	public String addFriend(String ids, RedirectAttributes redirectAttributes) {
+		String idArray[] = ids.split(",");
+		User currentUser = UserUtils.getUser();
+		for (String id : idArray) {
+			if (userDao.findFriend(currentUser.getId(), id) == null) {
+
+				userDao.insertFriend(IdGen.uuid(), currentUser.getId(), id,"0","0");// 添加对方为好友
+				userDao.insertFriend(IdGen.uuid(), id,
+				 currentUser.getId(),"0","1");//同时把自己添加为对方的好友
+			}
+		}
+		addMessage(redirectAttributes, "添加好友成功");
+		return "redirect:" + Global.getAdminPath() + "/iim/contact/myFriends/?repage";
+	}
+
+	/**
+	 * 删除好友
+	 */
+	@RequestMapping(value = "delFriend")
+	public String delFriend(String id, RedirectAttributes redirectAttributes) {
+		User friend = UserUtils.get(id);
+		User currentUser = UserUtils.getUser();
+		if (friend != null && userDao.findFriend(currentUser.getId(), friend.getId()) != null) {
+			userDao.deleteFriend(currentUser.getId(), friend.getId());// 删除好友
+			userDao.deleteFriend(friend.getId(),
+					currentUser.getId());//同时把自己从对方的好友列表删除
+		}
+
+		return "redirect:" + Global.getAdminPath() + "/iim/contact/myFriends/?repage";
+	}
+	/**
+	 * 确认通过好友
+	 */
+	@RequestMapping(value = "friendAudit")
+	public String friendAudit(String id, RedirectAttributes redirectAttributes) {
+		User friend = UserUtils.get(id);
+		User currentUser = UserUtils.getUser();
+		if (friend != null && userDao.findFriend(currentUser.getId(), friend.getId()) == null) {
+			userDao.friendAudit(currentUser.getId(), friend.getId());// 确认通过好友
+			userDao.friendAudit(friend.getId(),
+					currentUser.getId());//同时把自己从对方的好友列表确认通过好友
+		}
+
+		return "redirect:" + Global.getAdminPath() + "/iim/contact/myFriends/?repage";
+	}
+	/**
+	 * 拒绝通过好友
+	 */
+	@RequestMapping(value = "friendAuditNo")
+	public String friendAuditNo(String id, RedirectAttributes redirectAttributes) {
+		User friend = UserUtils.get(id);
+		User currentUser = UserUtils.getUser();
+		if (friend != null && userDao.findFriend(currentUser.getId(), friend.getId()) == null) {
+			userDao.friendAuditNo(currentUser.getId(), friend.getId());// 确认通过好友
+			userDao.friendAuditNo(friend.getId(),
+					currentUser.getId());//同时把自己从对方的好友列表确认通过好友
+		}
+
+		return "redirect:" + Global.getAdminPath() + "/iim/contact/myFriends/?repage";
+	}
+
+	/**
+	 * 打开我的好友列表--->常用联系人列表
+	 * 
+	 * @param user
+	 * @param request
+	 * @param response
+	 * @param model
+	 * @return
+	 */
+	@RequestMapping(value = "myFriends")
+	public String myFriends(User user, HttpServletRequest request, HttpServletResponse response, Model model) {
+		User currentUser = UserUtils.getUser();
+		List<User> friends = userDao.findFriends(currentUser);
+		model.addAttribute("list", friends);
+		List<User> friendsAudit = userDao.findFriendsAudit(currentUser);
+		model.addAttribute("listAudit", friendsAudit);
+		return "modules/iim/myFriends";
+	}
+
+	/**
+	 * 打开我的好友列表--->常用联系人列表
+	 *
+	 * @param user
+	 * @param request
+	 * @param response
+	 * @param model
+	 * @return
+	 */
+	@RequestMapping(value = "myFriendsAudit")
+	public String myFriendsAudit(User user, HttpServletRequest request, HttpServletResponse response, Model model) {
+		User currentUser = UserUtils.getUser();
+		List<User> friends = userDao.findFriendsAudit(currentUser);
+		model.addAttribute("list", friends);
+		return "modules/iim/myFriends";
+	}
+
+	/**
+	 * 打开聊天窗口
+	 * 
+	 * @param user
+	 * @param request
+	 * @param response
+	 * @param model
+	 * @return
+	 */
+	@RequestMapping(value = "layerIM")
+	public String layerIM(User user, HttpServletRequest request, HttpServletResponse response, Model model) {
+		List<User> list = systemService.findUser(user);
+		model.addAttribute("list", list);
+		return "modules/iim/layerIM";
+	}
+
+	/**
+	 * layim初始化信息
+	 * 
+	 * @param user
+	 * @param request
+	 * @param response
+	 * @param model
+	 * @return
+	 */
+	@RequestMapping(value = "friend")
+	@ResponseBody
+	public LayJson getFriend(User user, HttpServletRequest request, HttpServletResponse response, Model model) {
+		LayJsonData data = new LayJsonData();
+
+		data.getFriend().clear();
+		LayJson j = new LayJson();
+		j.setCode(0);
+		// 我的个人信息
+		Mine m = new Mine();
+		m.setId(UserUtils.getUser().getId());
+		m.setUsername(UserUtils.getUser().getName());
+		m.setStatus("online");
+		m.setRemark(UserUtils.getUser().getSign());
+		m.setAvatar(UserUtils.getUser().getPhoto());
+		data.setMine(m);
+
+		// 我的好友--->常用联系人
+		User currentUser = UserUtils.getUser();
+		List<User> friends = userDao.findFriends(currentUser);
+		FriendGroup friendGroup = new FriendGroup();
+		friendGroup.setGroupname("我的好友");
+		friendGroup.setId(1);
+		friendGroup.setOnline(friends.size());
+		for (User u : friends) {
+			Friend friend = new Friend();
+			friend.setId(u.getId());
+			friend.setUsername(u.getName());
+			friend.setAvatar(u.getPhoto());
+			friend.setSign(u.getSign());
+			friendGroup.getList().add(friend);
+		}
+		data.getFriend().add(friendGroup);
+
+		// 按部门显示联系人
+		//List<Office> officeList = officeService.findList(false);
+		Office company = UserUtils.getSelectCompany();
+		if(!"1".equals(company.getId())){
+			List<Office> officeList = officeService.findByParentIdsCompany(UserUtils.getSelectCompany(), UserUtils.getSelectOffice());
+			int index = 1;
+			for (Office office : officeList) {
+				user.setOffice(office);
+				user.setCompany(UserUtils.getSelectCompany());
+				List<User> users = userDao.findListByOffice(user);
+				FriendGroup fgroup = new FriendGroup();
+				fgroup.setGroupname(office.getName());
+				fgroup.setOnline(users.size());
+				fgroup.setId(++index);
+				for (User u : users) {
+				    if(currentUser.getId().equals(u.getId())){
+				        continue;
+                    }
+					Friend friend = new Friend();
+					friend.setId(u.getId());
+					friend.setAvatar(u.getPhoto());
+					friend.setUsername(u.getName());
+					friend.setSign(u.getSign());
+					fgroup.getList().add(friend);
+				}
+				data.getFriend().add(fgroup);
+			}
+		}
+
+		// 不属于任何部门的联系人
+		/*user.setOffice(null);
+		List<User> users = userDao.findListByOffice(user);
+		FriendGroup group = new FriendGroup();
+		group.setGroupname("未分组");
+		group.setOnline(users.size());
+		group.setId(++index);
+		for (User u : users) {
+			Friend friend = new Friend();
+			friend.setId(u.getLoginName());
+			friend.setUsername(u.getName());
+			friend.setAvatar(u.getPhoto());
+			friend.setSign(u.getSign());
+			group.getList().add(friend);
+		}
+		data.getFriend().add(group);*/
+
+		// 用户自己创建的群组和属于的群组
+
+		// 查找我属于的群组
+		List<LayGroup> memberLayGroupList = layGroupService.findGroupList(UserUtils.getUser());
+
+		for (LayGroup g : memberLayGroupList) {
+			data.getGroup().add(g);
+		}
+
+		j.setData(data);
+		return j;
+	}
+
+	/**
+	 * 群组成员接口
+	 * 
+	 * @return
+	 */
+	@RequestMapping(value = "getMembers")
+	@ResponseBody
+	public LayJson getMembers(LayGroup group) {
+		LayGroupJsonData data = new LayGroupJsonData();
+		group = layGroupService.get(group.getId());
+		// 设置群主
+		data.getOwner().put("username", group.getCreateBy().getName());
+		data.getOwner().put("id", group.getCreateBy().getId());
+		data.getOwner().put("avatar", group.getCreateBy().getPhoto());
+		data.getOwner().put("sign", group.getCreateBy().getSign());
+		// 将群主添加到群聊第一个
+
+		List<LayGroupUser> zlist = group.getLayGroupUserList();
+		for (LayGroupUser lgUser : zlist) {
+			Friend friend = new Friend();
+			friend.setUsername(lgUser.getUser().getName());
+			friend.setId(lgUser.getUser().getId());
+			friend.setAvatar(lgUser.getUser().getPhoto());
+			friend.setSign(lgUser.getUser().getSign());
+			data.getList().add(friend);
+		}
+
+		LayJson j = new LayJson();
+		j.setData(data);
+		return j;
+	}
+
+	@ResponseBody
+	@RequestMapping(value = { "uploadImage", "uploadFile" })
+	public String uploadImage(HttpServletRequest request, HttpServletResponse response, MultipartFile file)
+			throws IllegalStateException, IOException {
+		String filepath = "";
+		String content = null;
+		LayFileJsonData data = new LayFileJsonData();
+		String contentType = "";
+		// 判断文件是否为空
+		if (!file.isEmpty()) {
+		    contentType = file.getContentType();
+			// 文件保存路径
+            String realPath ="messages/"+DateUtils.formatDate(new Date())+"/"+ UserUtils.getPrincipal() + "/";
+            OSSClientUtil ossUtil = new OSSClientUtil();
+            String newName = System.currentTimeMillis()+"-"+file.getOriginalFilename();
+
+            ossUtil.uploadFile2OSS(file.getInputStream(),realPath,newName);
+            filepath = Global.getAliDownloadUrl() + "/" + realPath + newName;
+
+			data.setName(file.getOriginalFilename());
+			data.setSrc(filepath);
+		}
+		ObjectMapper mapper = new ObjectMapper();
+		HashMap<String, Object> map = new HashMap<String, Object>();
+		map.put("code", "0");
+		map.put("data", data);
+
+		content = mapper.writeValueAsString(map);
+ 		return content;
+	}
+
+
+    @RequestMapping(value = "friendStatus")
+    @ResponseBody
+    public AjaxJson getFriendStatus(User user,boolean flag,String status, HttpServletRequest request, HttpServletResponse response, Model model) {
+        AjaxJson data = new AjaxJson();
+        StringBuilder stringBuilder = new StringBuilder();
+        // 我的好友--->常用联系人
+        User currentUser = UserUtils.getUser();
+        List<User> friends = userDao.findFriends(currentUser);
+        List<String> ids = null;
+        if(friends!=null&&friends.size()>0) {
+            ids = new ArrayList<>(friends.size());
+            for (User u : friends) {
+                if ("online".equals(SmackUtils.IsUserOnLine(u.getId()))) {
+                    stringBuilder.append(u.getId()).append(",");
+                }
+                ids.add(u.getId());
+            }
+        }
+
+        // 按部门显示联系人
+        //List<Office> officeList = officeService.findList(false);
+        Office company = UserUtils.getSelectCompany();
+        if(!"1".equals(company.getId())){
+            List<Office> officeList = officeService.findByParentIdsCompany(UserUtils.getSelectCompany(), UserUtils.getSelectOffice());
+            for (Office office : officeList) {
+                user.setOffice(office);
+                user.setCompany(UserUtils.getSelectCompany());
+                List<User> users = userDao.findListByOffice(user);
+                for (User u : users) {
+                    if((ids!=null&&ids.contains(u.getId()))||currentUser.getId().equals(u.getId())){
+                        continue;
+                    }
+//                    if("online".equals(SmackUtils.IsUserOnLine(u.getId()))){
+//                        stringBuilder.append(u.getId()).append(",");
+//                    }
+                }
+            }
+        }
+        final String users = stringBuilder.toString();
+        data.getBody().put("userStr", users);
+        if(flag){
+            if(StringUtils.isBlank(status)){
+                status = "online";
+            }
+            final JSONObject body = new JSONObject();
+            body.put("id",currentUser.getId());
+            body.put("status",status);
+            final String string = body.toJSONString();
+            if(StringUtils.isNotBlank(users)) {
+                poolExecutor.execute(new Runnable() {
+                    @Override
+                    public void run() {
+                        String[] split = users.split(",");
+                        Set<String> set = new HashSet<>(split.length * 2);
+                        set.addAll(Arrays.asList(split));
+                        for (String u : set) {
+                            //SmackUtils.sendSmackMessage(u, string, "_online_all_status_");
+                        }
+                    }
+                });
+            }
+        }
+        return data;
+    }
+}

+ 50 - 0
src/main/java/com/jeeplus/modules/iim/web/EasemobGroupController.java

@@ -0,0 +1,50 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.iim.web;
+
+import com.jeeplus.common.web.BaseController;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+/**
+ * 环信群组Controller
+ * @author fgy
+ * @version 2018-03-08
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/iim/easemobGroup")
+public class EasemobGroupController extends BaseController {
+
+	/*@Autowired
+	private EasemobInfoService easemobInfoService;
+	@Autowired
+	private UserDao userDao;
+
+    @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<EasemobInfo> list = new ArrayList<EasemobInfo>();
+		//当前用户加入过的环信群组
+		EasemobInfo easemobInfo = new EasemobInfo();
+		easemobInfo.setUserId(UserUtils.getUser().getId());//当前登录用户所加入的环信群组
+		easemobInfo.setDelFlag("0");
+		List<EasemobInfo> easemobGroups = easemobInfoService.findByUser(easemobInfo);
+		list.addAll(easemobGroups);
+	    for (int i=0; i<list.size(); i++){
+			EasemobInfo easemob = list.get(i);
+			if (StringUtils.isBlank(extId) || (extId!=null && !extId.equals(easemob.getId()))){
+				Map<String, Object> map = Maps.newHashMap();
+				map.put("id", easemob.getGroupId());
+				map.put("name", easemob.getGroupName());
+				mapList.add(map);
+			}
+	   }
+	   return mapList;
+	}*/
+
+	
+
+}

+ 288 - 0
src/main/java/com/jeeplus/modules/iim/web/LayGroupController.java

@@ -0,0 +1,288 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.iim.web;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.ConstraintViolationException;
+
+import com.jeeplus.common.oss.OSSClientUtil;
+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.google.common.collect.Maps;
+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.iim.dao.LayGroupUserDao;
+import com.jeeplus.modules.iim.entity.LayGroup;
+import com.jeeplus.modules.iim.entity.LayGroupUser;
+import com.jeeplus.modules.iim.service.LayGroupService;
+import com.jeeplus.modules.sys.utils.UserUtils;
+
+/**
+ * 群组Controller
+ * @author lgf
+ * @version 2016-08-07
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/iim/layGroup")
+public class LayGroupController extends BaseController {
+
+	@Autowired
+	private LayGroupService layGroupService;
+	
+	@Autowired
+	private LayGroupUserDao layGroupUserDao;
+
+	@ModelAttribute
+	public LayGroup get(@RequestParam(required=false) String id) {
+		LayGroup entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = layGroupService.get(id);
+		}
+		if (entity == null){
+			entity = new LayGroup();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 群组列表页面
+	 */
+	@RequestMapping(value = {"list", ""})
+	public String list(LayGroup layGroup, HttpServletRequest request, HttpServletResponse response, Model model) {
+		//查找我属于的群组
+		List<LayGroup> memberLayGroupList = layGroupService.findGroupList(UserUtils.getUser());
+		model.addAttribute("layGrouplist", memberLayGroupList);
+		return "modules/iim/layGroupList";
+	}
+
+	/**
+	 * 查看,增加,编辑群组表单页面
+	 */
+	@RequestMapping(value = "form")
+	public String form(LayGroup layGroup, Model model) {
+		model.addAttribute("layGroup", layGroup);
+		return "modules/iim/layGroupForm";
+	}
+	
+	/**
+	 * 添加群组成员--->常用联系人
+	 */
+	@RequestMapping(value = "addUser")
+	public String addUser(String ids, String groupid, RedirectAttributes redirectAttributes) {
+		int c = ids.split(",").length;
+		int count = layGroupService.saveUsers(groupid,ids);
+		if (c == count){
+			addMessage(redirectAttributes, "添加组员成功");
+		}else {
+			addMessage(redirectAttributes, "新增成员共" + ids.split(",").length + "个," + count + "个成员新增成功! " + "," + (ids.split(",").length-count) + "个成员已存在!");
+		}
+		return "redirect:"+Global.getAdminPath()+"/iim/layGroup/?repage";
+	}
+	/**
+	 * 保存群组
+	 */
+	@RequestMapping(value = "save")
+	public String save(LayGroup layGroup, Model model,
+					   @RequestParam(value = "this_upload_files",required = false)MultipartFile[] this_upload_files,HttpServletRequest request, RedirectAttributes redirectAttributes) throws Exception{
+		if (!beanValidator(model, layGroup)){
+			return form(layGroup, model);
+		}
+		if(layGroup==null || StringUtils.isBlank(layGroup.getAvatar()) || this_upload_files==null){
+			layGroup.setAvatar("https://gangwan-app.oss-cn-hangzhou.aliyuncs.com/app-img/photo/static/qunzhu.png");
+		}
+		if(!layGroup.getIsNewRecord()){//编辑表单保存
+			LayGroup t = layGroupService.get(layGroup.getId());//从数据库取出记录的值
+			MyBeanUtils.copyBeanNotNull2Bean(layGroup, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+            /*String avatar = layGroup.getAvatar();
+            if (avatar!=null && !avatar.equals("") && avatar.contains("userfiles")){
+                avatar = layGroup.getAvatar().replace("|","");
+                InputStream inputStream = null;
+                HttpURLConnection httpURLConnection;
+                try {
+                    URL url = new URL(request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+ avatar);
+                    httpURLConnection = (HttpURLConnection) url.openConnection();
+                    // 设置网络连接超时时间
+                    httpURLConnection.setConnectTimeout(3000);
+                    // 设置应用程序要从网络连接读取数据
+                    httpURLConnection.setDoInput(true);
+
+                    httpURLConnection.setRequestMethod("GET");
+                    int responseCode = httpURLConnection.getResponseCode();
+                    if (responseCode == 200) {
+                        // 从服务器返回一个输入流
+                        inputStream = httpURLConnection.getInputStream();
+
+                    }
+                    OSSClientUtil ossUtil =new OSSClientUtil();
+                    String[] arr = avatar.split("/");
+                    logger.info("arr[arr.length-1]="+arr[arr.length-1]);
+                    String photoName = System.currentTimeMillis()+arr[arr.length-1];
+                    ossUtil.uploadFile2OSS(inputStream, Global.getRqcode(),photoName);
+                    layGroup.setAvatar(Global.getAliyunUrl()+"/"+Global.getRqcode() + photoName);
+                } catch (MalformedURLException e) {
+                    e.printStackTrace();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                } finally {
+                    inputStream.close();
+                }
+            }*/
+			layGroupService.save(t,this_upload_files);//保存
+		}else{//新增表单保存
+			layGroupService.save(layGroup,this_upload_files);//保存
+		}
+		addMessage(redirectAttributes, "保存群组成功");
+		return "redirect:"+Global.getAdminPath()+"/iim/layGroup/?repage";
+	}
+	
+	/**
+	 * 删除群组
+	 */
+	@RequestMapping(value = "delete")
+	public String delete(LayGroup layGroup, RedirectAttributes redirectAttributes) {
+		layGroupService.delete(layGroup);
+		addMessage(redirectAttributes, "解散群组成功");
+		return "redirect:"+Global.getAdminPath()+"/iim/layGroup/?repage";
+	}
+	
+	/**
+	 * 退出群组
+	 */
+	@RequestMapping(value = "logout")
+	public String logout(LayGroupUser layGroupUser, RedirectAttributes redirectAttributes) {
+		layGroupUserDao.delete(layGroupUserDao.findList(layGroupUser).get(0));
+		addMessage(redirectAttributes, "退出群组成功");
+		return "redirect:"+Global.getAdminPath()+"/iim/layGroup/?repage";
+	}
+	
+	/**
+	 * 批量删除群组
+	 */
+	@RequestMapping(value = "deleteAll")
+	public String deleteAll(String ids, RedirectAttributes redirectAttributes) {
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			layGroupService.delete(layGroupService.get(id));
+		}
+		addMessage(redirectAttributes, "删除群组成功");
+		return "redirect:"+Global.getAdminPath()+"/iim/layGroup/?repage";
+	}
+	
+	/**
+	 * 导出excel文件
+	 */
+    @RequestMapping(value = "export", method=RequestMethod.POST)
+    public String exportFile(LayGroup layGroup, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "群组"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            Page<LayGroup> page = layGroupService.findPage(new Page<LayGroup>(request, response, -1), layGroup);
+    		new ExportExcel("群组", LayGroup.class).setDataList(page.getList()).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导出群组记录失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/iim/layGroup/?repage";
+    }
+
+	/**
+	 * 导入Excel数据
+
+	 */
+    @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<LayGroup> list = ei.getDataList(LayGroup.class);
+			for (LayGroup layGroup : list){
+				try{
+					layGroupService.save(layGroup);
+					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()+"/iim/layGroup/?repage";
+    }
+	
+	/**
+	 * 下载导入群组数据模板
+	 */
+    @RequestMapping(value = "import/template")
+    public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "群组数据导入模板.xlsx";
+    		List<LayGroup> list = Lists.newArrayList(); 
+    		new ExportExcel("群组数据", LayGroup.class, 1).setDataList(list).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入模板下载失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/iim/layGroup/?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<LayGroup> list = new ArrayList<LayGroup>();
+		LayGroup layGroup = new LayGroup();
+		List<LayGroup> ownerLayGroupList = layGroupService.findList(layGroup);
+		List<LayGroup> memberLayGroupList = layGroupService.findGroupList(UserUtils.getUser());	
+		list.addAll(ownerLayGroupList);
+		list.addAll(memberLayGroupList);
+		   for (int i=0; i<list.size(); i++){
+			LayGroup g = list.get(i);
+			if (StringUtils.isBlank(extId) || (extId!=null && !extId.equals(g.getId()))){
+				Map<String, Object> map = Maps.newHashMap();
+				map.put("id", g.getId());
+				map.put("name", g.getGroupname());
+				mapList.add(map);
+			}
+		  }
+		return mapList;
+	}
+
+	
+
+}

+ 162 - 0
src/main/java/com/jeeplus/modules/iim/web/MailBoxController.java

@@ -0,0 +1,162 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.iim.web;
+
+import java.util.Date;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.jeeplus.common.websocket.onchat.ChatServerPool;
+import org.java_websocket.WebSocket;
+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.servlet.mvc.support.RedirectAttributes;
+
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.modules.iim.entity.MailBox;
+import com.jeeplus.modules.iim.entity.MailCompose;
+import com.jeeplus.modules.iim.entity.MailPage;
+import com.jeeplus.modules.iim.service.MailBoxService;
+import com.jeeplus.modules.iim.service.MailComposeService;
+import com.jeeplus.modules.sys.utils.UserUtils;
+
+/**
+ * 收件箱Controller
+ * @author jeeplus
+ * @version 2015-11-13
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/iim/mailBox")
+public class MailBoxController extends BaseController {
+
+	@Autowired
+	private MailComposeService mailComposeService;
+	
+	@Autowired
+	private MailBoxService mailBoxService;
+	
+	@ModelAttribute
+	public MailBox get(@RequestParam(required=false) String id) {
+		MailBox entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = mailBoxService.get(id);
+		}
+		if (entity == null){
+			entity = new MailBox();
+		}
+		return entity;
+	}
+	
+	@RequestMapping(value = {"list", ""})
+	public String list(MailBox mailBox, HttpServletRequest request, HttpServletResponse response, Model model) {
+		mailBox.setReceiver(UserUtils.getUser());
+		Page<MailBox> page = mailBoxService.findPage(new MailPage<MailBox>(request, response), mailBox); 
+		model.addAttribute("page", page);
+		
+		//查询未读的条数
+		MailBox serachBox = new MailBox();
+		serachBox.setReadstatus("0");
+		serachBox.setReceiver(UserUtils.getUser());
+		model.addAttribute("noReadCount", mailBoxService.getCount(serachBox));
+		
+		//查询总条数
+		MailBox serachBox2 = new MailBox();
+		serachBox2.setReceiver(UserUtils.getUser());
+		model.addAttribute("mailBoxCount", mailBoxService.getCount(serachBox2));
+		
+		//查询已发送条数
+		MailCompose serachBox3 = new MailCompose();
+		serachBox3.setSender(UserUtils.getUser());
+		serachBox3.setStatus("1");//已发送
+		model.addAttribute("mailComposeCount", mailComposeService.getCount(serachBox3));
+		
+		//查询草稿箱条数
+		MailCompose serachBox4 = new MailCompose();
+		serachBox4.setSender(UserUtils.getUser());
+		serachBox4.setStatus("0");//草稿
+		model.addAttribute("mailDraftCount", mailComposeService.getCount(serachBox4));
+	
+		return "modules/iim/mailBoxList";
+	}
+
+	@RequestMapping(value = "detail")
+	public String detail(MailBox mailBox, Model model) {
+		if(mailBox.getReadstatus().equals("0")){//更改未读状态为已读状态
+			mailBox.setReadstatus("1");//1表示已读
+			mailBoxService.save(mailBox);
+			UserUtils.pushMeIm("");
+			/*List<WebSocket> toUserConns = ChatServerPool.getWebSocketByUser(UserUtils.getUser().getId());
+			for (WebSocket toUserConn : toUserConns) {
+				String message = "{\"useType\":\"sys_me\"}";
+				ChatServerPool.sendMessageToUser(toUserConn, message);//同时向本人发送消息
+			}*/
+		}
+		model.addAttribute("mailBox", mailBox);
+		//查询未读的条数
+		MailBox serachBox = new MailBox();
+		serachBox.setReadstatus("0");
+		serachBox.setReceiver(UserUtils.getUser());
+		model.addAttribute("noReadCount", mailBoxService.getCount(serachBox));
+		
+		//查询总条数
+		MailBox serachBox2 = new MailBox();
+		serachBox2.setReceiver(UserUtils.getUser());
+		model.addAttribute("mailBoxCount", mailBoxService.getCount(serachBox2));
+		
+		//查询已发送条数
+		MailCompose serachBox3 = new MailCompose();
+		serachBox3.setSender(UserUtils.getUser());
+		serachBox3.setStatus("1");//已发送
+		model.addAttribute("mailComposeCount", mailComposeService.getCount(serachBox3));
+		
+		//查询草稿箱条数
+		MailCompose serachBox4 = new MailCompose();
+		serachBox4.setSender(UserUtils.getUser());
+		serachBox4.setStatus("0");//草稿
+		model.addAttribute("mailDraftCount", mailComposeService.getCount(serachBox4));
+		return "modules/iim/mailBoxDetail";
+	}
+
+	@RequestMapping(value = "save")
+	public String save(MailBox mailBox, Model model, RedirectAttributes redirectAttributes) {
+		if (!beanValidator(model, mailBox)){
+			return detail(mailBox, model);
+		}
+	    Date date = new Date(System.currentTimeMillis());
+		mailBox.setSender( UserUtils.getUser());
+		mailBox.setSendtime(date);
+		mailBoxService.save(mailBox);
+		addMessage(redirectAttributes, "保存站内信成功");
+		return "redirect:"+Global.getAdminPath()+"/iim/mailBox/?repage";
+	}
+	
+	@RequestMapping(value = "delete")
+	public String delete(MailBox mailBox, RedirectAttributes redirectAttributes) {
+		mailBoxService.delete(mailBox);
+		addMessage(redirectAttributes, "删除站内信成功");
+		return "redirect:"+Global.getAdminPath()+"/iim/mailBox/?repage";
+	}
+
+	/**
+	 * 批量删除
+	 */
+	@RequestMapping(value = "deleteAll")
+	public String deleteAll(String ids, RedirectAttributes redirectAttributes) {
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			mailBoxService.delete(mailBoxService.get(id));
+		}
+		addMessage(redirectAttributes, "删除站内信成功");
+		return "redirect:"+Global.getAdminPath()+"/iim/mailBox/?repage";
+	}
+}

+ 310 - 0
src/main/java/com/jeeplus/modules/iim/web/MailComposeController.java

@@ -0,0 +1,310 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.iim.web;
+
+import java.util.Date;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.jeeplus.common.websocket.onchat.ChatServerPool;
+import org.java_websocket.WebSocket;
+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.servlet.mvc.support.RedirectAttributes;
+
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.modules.iim.entity.MailBox;
+import com.jeeplus.modules.iim.entity.MailCompose;
+import com.jeeplus.modules.iim.entity.MailPage;
+import com.jeeplus.modules.iim.service.MailBoxService;
+import com.jeeplus.modules.iim.service.MailComposeService;
+import com.jeeplus.modules.iim.service.MailService;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.service.SystemService;
+import com.jeeplus.modules.sys.utils.UserUtils;
+
+/**
+ * 发件箱Controller
+ * @author jeeplus
+ * @version 2015-11-13
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/iim/mailCompose")
+public class MailComposeController extends BaseController {
+
+	@Autowired
+	private MailComposeService mailComposeService;
+	
+	@Autowired
+	private MailBoxService mailBoxService;
+	
+	@Autowired
+	private SystemService systemService;
+	
+	@Autowired
+	private MailService mailService;
+	
+	@ModelAttribute
+	public MailCompose get(@RequestParam(required=false) String id) {
+		MailCompose entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = mailComposeService.get(id);
+		}
+		if (entity == null){
+			entity = new MailCompose();
+		}
+		return entity;
+	}
+	
+	
+	
+	/*
+	 * 写站内信
+	 */
+	@RequestMapping(value = {"sendLetter"})
+	public String sendLetter(User user, HttpServletRequest request, HttpServletResponse response, Model model) {
+		user = systemService.getUser(user.getId());
+		model.addAttribute("receiver", user);
+		
+		//查询未读的条数
+		MailBox serachBox = new MailBox();
+		serachBox.setReadstatus("0");
+		serachBox.setReceiver(UserUtils.getUser());
+		model.addAttribute("noReadCount", mailBoxService.getCount(serachBox));
+		
+		//查询总条数
+		MailBox serachBox2 = new MailBox();
+		serachBox2.setReceiver(UserUtils.getUser());
+		model.addAttribute("mailBoxCount", mailBoxService.getCount(serachBox2));
+		
+		//查询已发送条数
+		MailCompose serachBox3 = new MailCompose();
+		serachBox3.setSender(UserUtils.getUser());
+		serachBox3.setStatus("1");//已发送
+		model.addAttribute("mailComposeCount", mailComposeService.getCount(serachBox3));
+		
+		//查询草稿箱条数
+		MailCompose serachBox4 = new MailCompose();
+		serachBox4.setSender(UserUtils.getUser());
+		serachBox4.setStatus("0");//草稿
+		model.addAttribute("mailDraftCount", mailComposeService.getCount(serachBox4));
+		
+		return "modules/iim/mail_send";
+	}
+	
+	/*
+	 * 回复站内信
+	 */
+	@RequestMapping(value = {"replyLetter"})
+	public String replyLetter(MailBox mailBox, HttpServletRequest request, HttpServletResponse response, Model model) {
+		model.addAttribute("mailBox",  mailBoxService.get(mailBox.getId()));
+		
+		//查询未读的条数
+		MailBox serachBox = new MailBox();
+		serachBox.setReadstatus("0");
+		serachBox.setReceiver(UserUtils.getUser());
+		model.addAttribute("noReadCount", mailBoxService.getCount(serachBox));
+		
+		//查询总条数
+		MailBox serachBox2 = new MailBox();
+		serachBox2.setReceiver(UserUtils.getUser());
+		model.addAttribute("mailBoxCount", mailBoxService.getCount(serachBox2));
+		
+		//查询已发送条数
+		MailCompose serachBox3 = new MailCompose();
+		serachBox3.setSender(UserUtils.getUser());
+		serachBox3.setStatus("1");//已发送
+		model.addAttribute("mailComposeCount", mailComposeService.getCount(serachBox3));
+		
+		//查询草稿箱条数
+		MailCompose serachBox4 = new MailCompose();
+		serachBox4.setSender(UserUtils.getUser());
+		serachBox4.setStatus("0");//草稿
+		model.addAttribute("mailDraftCount", mailComposeService.getCount(serachBox4));
+		
+		return "modules/iim/mail_reply";
+	}
+	
+	@RequestMapping(value = {"list", ""})
+	public String list(MailCompose mailCompose, HttpServletRequest request, HttpServletResponse response, Model model) {
+		
+		Page<MailCompose> page = mailComposeService.findPage(new MailPage<MailCompose>(request, response), mailCompose); 
+		model.addAttribute("page", page);
+		
+		//查询未读的条数
+		MailBox serachBox = new MailBox();
+		serachBox.setReadstatus("0");
+		serachBox.setReceiver(UserUtils.getUser());
+		model.addAttribute("noReadCount", mailBoxService.getCount(serachBox));
+		
+		//查询总条数
+		MailBox serachBox2 = new MailBox();
+		serachBox2.setReceiver(UserUtils.getUser());
+		model.addAttribute("mailBoxCount", mailBoxService.getCount(serachBox2));
+		
+		//查询已发送条数
+		MailCompose serachBox3 = new MailCompose();
+		serachBox3.setSender(UserUtils.getUser());
+		serachBox3.setStatus("1");//已发送
+		model.addAttribute("mailComposeCount", mailComposeService.getCount(serachBox3));
+		
+		//查询草稿箱条数
+		MailCompose serachBox4 = new MailCompose();
+		serachBox4.setSender(UserUtils.getUser());
+		serachBox4.setStatus("0");//草稿
+		model.addAttribute("mailDraftCount", mailComposeService.getCount(serachBox4));
+		
+		
+		if(mailCompose.getStatus()== null || mailCompose.getStatus().equals("0")){
+			return "modules/iim/mailDraftList";//草稿箱
+		}
+		return "modules/iim/mailComposeList";//已发送
+	}
+
+	@RequestMapping(value = "detail")//打开已发送信件
+	public String detail(MailCompose mailCompose, Model model) {
+		model.addAttribute("mailCompose", mailCompose);
+		
+		
+		//查询未读的条数
+		MailBox serachBox = new MailBox();
+		serachBox.setReadstatus("0");
+		serachBox.setReceiver(UserUtils.getUser());
+		model.addAttribute("noReadCount", mailBoxService.getCount(serachBox));
+		
+		//查询总条数
+		MailBox serachBox2 = new MailBox();
+		serachBox2.setReceiver(UserUtils.getUser());
+		model.addAttribute("mailBoxCount", mailBoxService.getCount(serachBox2));
+		
+		//查询已发送条数
+		MailCompose serachBox3 = new MailCompose();
+		serachBox3.setSender(UserUtils.getUser());
+		serachBox3.setStatus("1");//已发送
+		model.addAttribute("mailComposeCount", mailComposeService.getCount(serachBox3));
+		
+		//查询草稿箱条数
+		MailCompose serachBox4 = new MailCompose();
+		serachBox4.setSender(UserUtils.getUser());
+		serachBox4.setStatus("0");//草稿
+		model.addAttribute("mailDraftCount", mailComposeService.getCount(serachBox4));
+		
+		return "modules/iim/mailComposeDetail";
+	}
+	
+	@RequestMapping(value = "draftDetail")//打开草稿
+	public String draftDetail(MailCompose mailCompose, Model model) {
+		//查询未读的条数
+		MailBox serachBox = new MailBox();
+		serachBox.setReadstatus("0");
+		serachBox.setReceiver(UserUtils.getUser());
+		model.addAttribute("noReadCount", mailBoxService.getCount(serachBox));
+		
+		//查询总条数
+		MailBox serachBox2 = new MailBox();
+		serachBox2.setReceiver(UserUtils.getUser());
+		model.addAttribute("mailBoxCount", mailBoxService.getCount(serachBox2));
+		
+		//查询已发送条数
+		MailCompose serachBox3 = new MailCompose();
+		serachBox3.setSender(UserUtils.getUser());
+		serachBox3.setStatus("1");//已发送
+		model.addAttribute("mailComposeCount", mailComposeService.getCount(serachBox3));
+		
+		//查询草稿箱条数
+		MailCompose serachBox4 = new MailCompose();
+		serachBox4.setSender(UserUtils.getUser());
+		serachBox4.setStatus("0");//草稿
+		model.addAttribute("mailDraftCount", mailComposeService.getCount(serachBox4));
+		
+		mailCompose = mailComposeService.get(mailCompose.getId());
+		model.addAttribute("mailCompose", mailCompose);
+		return "modules/iim/mailDraftDetail";
+	}
+
+	@RequestMapping(value = "save")
+	public String save(MailCompose mailCompose, Model model, HttpServletRequest request, HttpServletResponse response) {
+		if (!beanValidator(model, mailCompose.getMail())){
+			return detail(mailCompose, model);
+		}
+		mailService.saveOnlyMain(mailCompose.getMail());
+		Date date = new Date(System.currentTimeMillis());
+		mailCompose.setSender(UserUtils.getUser());
+		mailCompose.setSendtime(date);
+		for(User receiver : mailCompose.getReceiverList()){
+			mailCompose.setReceiver(receiver);
+			mailCompose.setId(null);//标记为新纪录,每次往发件箱插入一条记录
+			mailComposeService.save(mailCompose);//0 显示在草稿箱,1 显示在已发送需同时保存到收信人的收件箱。
+
+			if(mailCompose.getStatus().equals("1"))//已发送,同时保存到收信人的收件箱
+			{
+				UserUtils.pushIm(receiver.getId(),"未读邮件 "+mailCompose.getMail().getTitle());
+				/*List<WebSocket> toUserConns = ChatServerPool.getWebSocketByUser(receiver.getId());
+				for (WebSocket toUserConn : toUserConns) {
+					String message = "{\"to\":\""+receiver.getId()+"\"," +
+							"\"msg\":\"未读邮件 "+mailCompose.getMail().getTitle()+"\"," +
+							"\"useType\":\"sys\"}";
+					ChatServerPool.sendMessageToUser(toUserConn, message);//同时向本人发送消息
+				}*/
+				MailBox mailBox = new MailBox();
+				mailBox.setReadstatus("0");
+				mailBox.setReceiver(receiver);
+				mailBox.setSender(UserUtils.getUser());
+				mailBox.setMail(mailCompose.getMail());
+				mailBox.setSendtime(date);
+				mailBoxService.save(mailBox);
+			}
+		}
+		
+		request.setAttribute("mailCompose", mailCompose);
+		return "modules/iim/mail_compose_success";
+	}
+	
+	@RequestMapping(value = "delete")
+	public String delete(MailCompose mailCompose, RedirectAttributes redirectAttributes) {
+		mailComposeService.delete(mailCompose);
+		addMessage(redirectAttributes, "删除站内信成功");
+		return "redirect:"+Global.getAdminPath()+"/iim/mailCompose/?repage&orderBy=sendtime desc&status="+mailCompose.getStatus();
+	}
+	
+	/**
+	 * 批量删除已发送
+	 */
+	@RequestMapping(value = "deleteAllCompose")
+	public String deleteAllCompose(String ids, Model model, RedirectAttributes redirectAttributes) {
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			mailComposeService.delete(mailComposeService.get(id));
+		}
+		
+		
+		
+		
+		addMessage(redirectAttributes, "删除邮件成功");
+		return "redirect:"+Global.getAdminPath()+"/iim/mailCompose/?repage&status=1&orderBy=sendtime desc";
+	}
+	
+	/**
+	 * 批量删除草稿箱
+	 */
+	@RequestMapping(value = "deleteAllDraft")
+	public String deleteAllDraft(String ids, RedirectAttributes redirectAttributes) {
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			mailComposeService.delete(mailComposeService.get(id));
+		}
+		addMessage(redirectAttributes, "删除邮件成功");
+		return "redirect:"+Global.getAdminPath()+"/iim/mailCompose/?repage&status=0&orderBy=sendtime desc";
+	}
+
+}

+ 93 - 0
src/main/java/com/jeeplus/modules/iim/web/MailController.java

@@ -0,0 +1,93 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.iim.web;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+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.servlet.mvc.support.RedirectAttributes;
+
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.modules.iim.entity.Mail;
+import com.jeeplus.modules.iim.service.MailService;
+
+/**
+ * 发件箱Controller
+ * @author jeeplus
+ * @version 2015-11-15
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/iim/mail")
+public class MailController extends BaseController {
+
+	@Autowired
+	private MailService mailService;
+	
+	@ModelAttribute
+	public Mail get(@RequestParam(required=false) String id) {
+		Mail entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = mailService.get(id);
+		}
+		if (entity == null){
+			entity = new Mail();
+		}
+		return entity;
+	}
+	
+	@RequiresPermissions("iim:mail:view")
+	@RequestMapping(value = {"list", ""})
+	public String list(Mail mail, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<Mail> page = mailService.findPage(new Page<Mail>(request, response), mail); 
+		model.addAttribute("page", page);
+		return "modules/iim/mailList";
+	}
+
+	@RequiresPermissions("iim:mail:view")
+	@RequestMapping(value = "form")
+	public String form(Mail mail, Model model) {
+		model.addAttribute("mail", mail);
+		return "modules/iim/mailForm";
+	}
+
+	@RequestMapping(value = "save")
+	public String save(Mail mail, Model model, RedirectAttributes redirectAttributes) {
+		if (!beanValidator(model, mail)){
+			return form(mail, model);
+		}
+		mailService.save(mail);
+		addMessage(redirectAttributes, "删除站内信成功");
+		return "redirect:"+Global.getAdminPath()+"/iim/mail/?repage";
+	}
+	
+	@RequestMapping(value = "delete")
+	public String delete(Mail mail, RedirectAttributes redirectAttributes) {
+		mailService.delete(mail);
+		addMessage(redirectAttributes, "删除站内信成功");
+		return "redirect:"+Global.getAdminPath()+"/iim/mail/?repage";
+	}
+	/**
+	 * 批量删除
+	 */
+	@RequestMapping(value = "deleteAll")
+	public String deleteAll(String ids, RedirectAttributes redirectAttributes) {
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			mailService.delete(mailService.get(id));
+		}
+		addMessage(redirectAttributes, "删除站内信成功");
+		return "redirect:"+Global.getAdminPath()+"/iim/mail/?repage";
+	}
+
+}

+ 364 - 0
src/main/java/com/jeeplus/modules/iim/web/MyCalendarController.java

@@ -0,0 +1,364 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.iim.web;
+
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.modules.iim.entity.MyCalendar;
+import com.jeeplus.modules.iim.service.MyCalendarService;
+import com.jeeplus.modules.iim.utils.DateUtil;
+import com.jeeplus.modules.sys.utils.UserUtils;
+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 javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * 日历Controller
+ * 
+ * @author liugf
+ * @version 2016-04-19
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/iim/myCalendar")
+public class MyCalendarController extends BaseController {
+
+	@Autowired
+	private MyCalendarService myCalendarService;
+
+	@ModelAttribute
+	public MyCalendar get(@RequestParam(required = false) String id) {
+		MyCalendar entity = null;
+		if (StringUtils.isNotBlank(id)) {
+			entity = myCalendarService.get(id);
+		}
+		if (entity == null) {
+			entity = new MyCalendar();
+		}
+		return entity;
+	}
+
+	/**
+	 * 日历页面
+	 */
+	@RequestMapping(value = { "index", "" })
+	public String index(MyCalendar myCalendar, HttpServletRequest request, HttpServletResponse response, Model model) {
+		myCalendar.setUser(UserUtils.getUser());
+		myCalendar.setCompanyId(UserUtils.getUser().getComId());
+		return "modules/iim/myCalendar";
+	}
+
+	/**
+	 * 打开添加框
+	 */
+	@RequestMapping(value = "addform")
+	public String addform(@RequestParam("date") String date ,HttpServletRequest request,HttpServletResponse response,Model model){
+
+		MyCalendar myCalendar = new MyCalendar();
+		myCalendar.setUser(UserUtils.getUser());
+		myCalendar.setCompanyId(UserUtils.getUser().getComId());
+
+		String endDate = date;
+		String noticeDate = date;
+
+		//将鼠标点击的这一天作为日程开始的第一天
+		model.addAttribute("date",date);
+		model.addAttribute("enddate",endDate);
+		model.addAttribute("noticedate",noticeDate);
+		model.addAttribute("myCalendar",myCalendar);
+		return "modules/iim/myCalendarForm-add";
+	}
+
+	/**
+	 *   打开编辑框
+	 * @param myCalendar
+	 * @param request
+	 * @param response
+	 * @param model
+	 * @return
+	 */
+	@RequestMapping(value = "editform")
+	public String editform(MyCalendar myCalendar, HttpServletRequest request, HttpServletResponse response, Model model) {
+
+		String title = myCalendar.getTitle();// 事件标题
+		String  location = myCalendar.getLocation();
+		String start = myCalendar.getStart();// 事件开始时间
+		String end = myCalendar.getEnd();// 结束时间
+		String notice = myCalendar.getNotice();//提醒时间
+		//String allDay = myCalendar.getAdllDay();// 是否为全天事件
+		String color = myCalendar.getColor();// 事件的背景
+
+		myCalendar.setUser(UserUtils.getUser());
+		myCalendar.setCompanyId(UserUtils.getUser().getComId());
+
+		String start_d = "";
+		String start_h = "";
+		String start_m = "";
+
+		String end_d = "";
+		String end_h = "";
+		String end_m = "";
+
+		String notice_d = "";
+		String notice_h = "";
+		String notice_m = "";
+
+		if(!StringUtils.isBlank(start) && start.length()>=16){
+			start_d = start.substring(5,7)+"/"+start.substring(8,10)+"/"+start.substring(0,4);
+			start_h = start.substring(11, 13);
+			start_m = start.substring(14);
+		}
+		if(!StringUtils.isBlank(end) && end.length()>=16){
+			end_d = end.substring(5,7)+"/"+end.substring(8,10)+"/"+end.substring(0,4);
+			end_h = end.substring(11, 13);
+			end_m = end.substring(14);
+		}
+		if(!StringUtils.isBlank(notice) && notice.length()>=16){
+			notice_d = notice.substring(5,7)+"/"+notice.substring(8,10)+"/"+notice.substring(0,4);
+			notice_h = notice.substring(11,13);
+			notice_m = notice.substring(14);
+		}
+
+		model.addAttribute("title", title);
+		model.addAttribute("location",location);
+		model.addAttribute("color", color);
+		model.addAttribute("start",start);
+		model.addAttribute("start_d", start_d);
+		model.addAttribute("start_h", start_h);
+		model.addAttribute("start_m", start_m);
+		model.addAttribute("end", end);
+		model.addAttribute("end_d", end_d);
+		model.addAttribute("end_h", end_h);
+		model.addAttribute("end_m", end_m);
+		model.addAttribute("notice",notice);
+		model.addAttribute("notice_d",notice_d);
+		model.addAttribute("notice_h",notice_h);
+		model.addAttribute("notice_m",notice_m);
+		//model.addAttribute("allDay", allDay);
+		return "modules/iim/myCalendarForm-edit";
+	}
+
+	/**
+	 * 初始化日历界面,显示出当月的所有日程
+	 */
+	@RequiresPermissions("user")
+	@ResponseBody
+	@RequestMapping(value = "findList")
+	protected List<MyCalendar> doPost(MyCalendar myCalendar, HttpServletRequest request, HttpServletResponse response,Model model) throws ServletException, IOException {
+
+		myCalendar.setUser(UserUtils.getUser());
+		myCalendar.setCompanyId(UserUtils.getUser().getComId());
+		List<MyCalendar> list = myCalendarService.findList(myCalendar);
+
+		return list;
+	}
+
+	/**
+	 * 保存新建的日程 (是否“全天”暂且不论)
+	 */
+	@RequiresPermissions("user")
+	@ResponseBody
+	@RequestMapping(value = "add")
+	public String add(MyCalendar myCalendar, HttpServletRequest request, HttpServletResponse response, Model model) {
+
+		String events = request.getParameter("event");// 事件内容
+		String location = request.getParameter("location");
+		//String isallday = request.getParameter("allDay").equals("1")?"1":"0";// 是否是全天事件
+		String startdate = request.getParameter("startdate");
+		String enddate = request.getParameter("enddate");
+		String noticedate = request.getParameter("noticedate");
+
+		String s_time = request.getParameter("s_hour") + ":"
+				+ request.getParameter("s_minute") /*+ ":00"*/;
+		String e_time = request.getParameter("e_hour") + ":"
+				+ request.getParameter("e_minute") /*+ ":00"*/;
+		String n_time = request.getParameter("n_hour") + ":"
+				+ request.getParameter("n_minute") ;
+		String start = "";
+		String end = "";
+		String notice = "";
+
+		start = startdate + " " + s_time;
+		end = enddate + " " + e_time;
+		notice = noticedate + " " +n_time;
+
+		start = transTo(start);
+		end = transTo(end);
+		notice = transTo(notice);
+
+		String[] colors = { "#360", "#f30", "#06c" };
+		int index = (int) (Math.random() * colors.length);
+		myCalendar.setUser(UserUtils.getUser());
+		myCalendar.setTitle(events);
+		myCalendar.setLocation(location);
+		myCalendar.setStart(start);
+		myCalendar.setEnd(end);
+		myCalendar.setNotice(notice);
+		myCalendar.setCompanyId(UserUtils.getUser().getComId());
+		//myCalendar.setAdllDay(isallday);
+		myCalendar.setColor(colors[index]);
+		myCalendarService.saveCalender(myCalendar);
+
+		return "1";
+	}
+
+	/**
+	 * 修改日程
+	 */
+	@RequiresPermissions("user")
+	@ResponseBody
+	@RequestMapping(value = "edit")
+	public String edit(MyCalendar myCalendar, HttpServletRequest request, HttpServletResponse response, Model model) {
+
+		String events = request.getParameter("event");// 事件内容
+		String location = request.getParameter("location");
+		//String isallday = request.getParameter("isallday");// 是否是全天事件
+		String startdate = request.getParameter("startdate");
+		String enddate = request.getParameter("enddate");
+		String noticedate = request.getParameter("noticedate");
+
+		String s_time = request.getParameter("s_hour") + ":"
+				+ request.getParameter("s_minute") ;
+		String e_time = request.getParameter("e_hour") + ":"
+				+ request.getParameter("e_minute");
+		String n_time = request.getParameter("n_hour") + ":"
+				+ request.getParameter("n_minute") ;
+
+		String start = startdate + " " + s_time;
+		String end = enddate + " " + e_time;
+		String notice = noticedate + " " +n_time;
+
+		start = transTo(start);
+		end = transTo(end);
+		notice = transTo(notice);
+
+
+		String[] colors = { "#360", "#f30", "#06c" };
+		int index = (int) (Math.random() * colors.length);
+		myCalendar.setTitle(events);
+		myCalendar.setLocation(location);
+		myCalendar.setStart(start);
+		myCalendar.setEnd(end);
+		myCalendar.setNotice(notice);
+		myCalendar.setColor(colors[index]);
+		myCalendar.setUser(UserUtils.getUser());
+		myCalendar.setCompanyId(UserUtils.getUser().getComId());
+		myCalendarService.saveCalender(myCalendar);
+
+		model.addAttribute("myCalendar", myCalendar);
+
+		return "1";
+	}
+
+	/**
+	 * 删除日历
+	 */
+	@RequiresPermissions("user")
+	@ResponseBody
+	@RequestMapping(value = "del")
+	public String del(MyCalendar myCalendar,
+			RedirectAttributes redirectAttributes) {
+
+		myCalendarService.delete(myCalendar);
+		return "1";
+
+	}
+
+	/**
+	 * 縮放日歷
+	 */
+	@RequiresPermissions("user")
+	@ResponseBody
+	@RequestMapping(value = "resize")
+	public String resize(MyCalendar myCalendar, HttpServletRequest request, HttpServletResponse response, Model model) {
+
+		myCalendar.setUser(UserUtils.getUser());
+		myCalendar.setCompanyId(UserUtils.getUser().getComId());
+		Integer daydiff = Integer.parseInt(request.getParameter("daydiff")) * 24 * 60 * 60;
+		Integer minudiff = Integer.parseInt(request.getParameter("minudiff")) * 60;
+		String start = myCalendar.getStart();
+		long lstart = DateUtil.string2long(start);
+		String end = myCalendar.getEnd();
+		Integer difftime = daydiff + minudiff;
+		if ("".equals(end)) {
+			myCalendar.setEnd(DateUtil.long2string(lstart + difftime));
+			myCalendarService.save(myCalendar);
+		} else {
+			long lend = DateUtil.string2long(end);
+			myCalendar.setEnd(DateUtil.long2string(lend + difftime));
+			myCalendarService.save(myCalendar);
+		}
+		return "1";
+	}
+
+	/**
+	 * 拖拽日历
+	 */
+	@RequiresPermissions("user")
+	@ResponseBody
+	@RequestMapping(value = "drag")
+	public String drag(MyCalendar myCalendar, HttpServletRequest request, HttpServletResponse response, Model model) {
+
+		myCalendar.setUser(UserUtils.getUser());
+		myCalendar.setCompanyId(UserUtils.getUser().getComId());
+		Integer daydiff = Integer.parseInt(request.getParameter("daydiff")) * 24 * 60 * 60;
+		Integer minudiff = Integer.parseInt(request.getParameter("minudiff")) * 60;
+		String allday = request.getParameter("allday");
+		//String start = myCalendar.getStart();
+		String start = myCalendar.getStart()+":00"; //时间转换工具类不能转换2017-09-07 19:09 的格式
+		long lstart = DateUtil.string2long(start);
+
+		String end = myCalendar.getEnd();
+		if ("true".equals(allday)) {
+			if ("".equals(end)) {
+				myCalendar.setStart(DateUtil.long2string(lstart + daydiff));
+				myCalendarService.save(myCalendar);
+			} else {
+				long lend = DateUtil.string2long(end);
+				myCalendar.setStart(DateUtil.long2string(lstart + daydiff));
+				myCalendar.setEnd(DateUtil.long2string(lend + daydiff));
+				myCalendarService.save(myCalendar);
+			}
+		} else {
+			Integer difftime = daydiff + minudiff;
+			if ("".equals(end)) {
+				myCalendar.setStart(DateUtil.long2string(lstart + difftime));
+				myCalendarService.save(myCalendar);
+			} else {
+				long lend = DateUtil.string2long(end);
+				myCalendar.setStart(DateUtil.long2string(lstart + difftime));
+				myCalendar.setEnd(DateUtil.long2string(lend + difftime));
+				myCalendarService.save(myCalendar);
+			}
+		}
+		return "1";
+	}
+
+	//将 09/10/2017 08:20 转换为 2017-09-10 08:20
+	public String transTo(String dateStr){
+		if(dateStr.indexOf("/")>0){
+			String str1 = dateStr.substring(0,10);
+			String str2 = "";
+			if(dateStr.length()>10){
+				str2 = dateStr.substring(10);
+			}
+			String[] arr = str1.split("/");
+			dateStr = arr[2]+"-"+arr[0]+"-"+arr[1]+str2;
+			return dateStr;
+		}
+		return dateStr;
+	}
+
+}

+ 22 - 0
src/main/java/com/jeeplus/modules/isignature/dao/ISignatureDocumentDao.java

@@ -0,0 +1,22 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.isignature.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.isignature.entity.ISignatureDocument;
+
+/**
+ * 电子签章信息DAO接口
+ * @author fgy
+ * @version 2018-04-17
+ */
+@MyBatisDao
+public interface ISignatureDocumentDao extends CrudDao<ISignatureDocument> {
+
+    void updateSelective(ISignatureDocument iSignatureDocument);
+
+    ISignatureDocument getByRecordId(String recordId);
+    int getCount(String workContractId);
+}

+ 112 - 0
src/main/java/com/jeeplus/modules/isignature/entity/ISignatureDocument.java

@@ -0,0 +1,112 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.isignature.entity;
+
+
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+
+/**
+ * 电子签章信息Entity
+ * @author fgy
+ * @version 2018-04-17
+ */
+public class ISignatureDocument extends DataEntity<ISignatureDocument> {
+	
+	private static final long serialVersionUID = 1L;
+	private String recordId;		// 文档编号
+	private String subject;		// 文档主题
+	private String type;		// 文档类型
+	private String status;		// 文档状态
+	private String companyId;		// 当前公司
+	private String filePath; // 文档存储地址
+	private String fileName; //文档名
+	private String imagePath; //图片存储地址
+	private String isignatureStatus;//是否已签章0是1否
+
+	public String getIsignatureStatus() {
+		return isignatureStatus;
+	}
+
+	public void setIsignatureStatus(String isignatureStatus) {
+		this.isignatureStatus = isignatureStatus;
+	}
+
+	public ISignatureDocument() {
+		super();
+	}
+
+	public ISignatureDocument(String id){
+		super(id);
+	}
+
+	@ExcelField(title="文档编号", align=2, sort=7)
+	public String getRecordId() {
+		return recordId;
+	}
+
+	public void setRecordId(String recordId) {
+		this.recordId = recordId;
+	}
+	
+	@ExcelField(title="文档主题", align=2, sort=8)
+	public String getSubject() {
+		return subject;
+	}
+
+	public void setSubject(String subject) {
+		this.subject = subject;
+	}
+	
+	@ExcelField(title="文档类型", align=2, sort=9)
+	public String getType() {
+		return type;
+	}
+
+	public void setType(String type) {
+		this.type = type;
+	}
+	
+	@ExcelField(title="文档状态", align=2, sort=10)
+	public String getStatus() {
+		return status;
+	}
+
+	public void setStatus(String status) {
+		this.status = status;
+	}
+	
+	@ExcelField(title="当前公司", align=2, sort=11)
+	public String getCompanyId() {
+		return companyId;
+	}
+
+	public void setCompanyId(String companyId) {
+		this.companyId = companyId;
+	}
+
+	public String getFilePath() {
+		return filePath;
+	}
+
+	public void setFilePath(String filePath) {
+		this.filePath = filePath;
+	}
+
+	public String getFileName() {
+		return fileName;
+	}
+
+	public void setFileName(String fileName) {
+		this.fileName = fileName;
+	}
+
+	public String getImagePath() {
+		return imagePath;
+	}
+
+	public void setImagePath(String imagePath) {
+		this.imagePath = imagePath;
+	}
+}

+ 171 - 0
src/main/java/com/jeeplus/modules/isignature/entity/iDBManager2000.java

@@ -0,0 +1,171 @@
+package com.jeeplus.modules.isignature.entity;
+
+import java.sql.*;
+import java.lang.*;
+import java.text.*;
+import java.util.*;
+
+/**
+ * <p>Title: iWebOffice�����ĵ�SQL����</p>
+ * <p>Description: </p>
+ * <p>Copyright: Copyright (c) 2005</p>
+ * <p>Company: www.goldgrid.com</p>
+ * @author ����
+ * @version 1.0
+ */
+
+public class iDBManager2000 {
+
+  public String UserName= null;
+  public String PassWord= null;
+  public String ClassString = null;
+  public String ConnectionString = null;
+
+  public Connection Conn;
+  public Statement Stmt;
+
+  public iDBManager2000() {
+	//For ODBC
+    //ClassString="sun.jdbc.odbc.JdbcOdbcDriver";
+    //ConnectionString=("jdbc:odbc:DBDemo");
+   
+
+
+    //For Access Driver
+    /*ClassString="sun.jdbc.odbc.JdbcOdbcDriver";
+    ConnectionString=("jdbc:odbc:Driver={MicroSoft Access Driver (*.mdb)};DBQ=C:\\dbdemo.mdb;ImplicitCommitSync=Yes;MaxBufferSize=512;MaxScanRows=128;PageTimeout=5;SafeTransactions=0;Threads=3;UserCommitSync=Yes;").replace('\\','/');
+    */
+
+    //For SQLServer Driver
+    /*ClassString="com.microsoft.jdbc.sqlserver.SQLServerDriver";
+    ConnectionString="jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=pdfDBDemo;User=pdfDBDemo;Password=pdfDBDemo";
+	*/
+
+    //For Oracle Driver
+    //ClassString="oracle.jdbc.driver.OracleDriver";
+    //ConnectionString="jdbc:oracle:thin:@hstation:1521:dbdemo";
+    //UserName="system";
+    //PassWord="manager";
+
+    //For MySQL Driver
+//    ClassString="org.gjt.mm.mysql.Driver";
+ //   ConnectionString="jdbc:mysql://localhost/PDF2015";
+    UserName="root";
+    PassWord="123456";
+    ClassString="com.mysql.jdbc.Driver";
+    //ConnectionString="jdbc:mysql://localhost/pdf2015?user=root&password=root&useUnicode=true&characterEncoding=gb2312";
+    ConnectionString="jdbc:mysql://127.0.0.1:3306/ruihuaoa-activity-testenv?useUnicode=true&characterEncoding=utf-8";
+
+    //For Sybase Driver
+    //ClassString="com.sybase.jdbc.SybDriver";
+    //ConnectionString="jdbc:sybase:Tds:localhost:5007/tsdata"; //tsdataΪ������ݿ���
+    //Properties sysProps = System.getProperties();
+    //SysProps.put("user","userid");
+    //SysProps.put("password","user_password");
+    //If using Sybase then DriverManager.getConnection(ConnectionString,sysProps);
+
+   
+  }
+
+  public boolean OpenConnection() {
+   boolean mResult=true;
+   try
+   {
+     Class.forName(ClassString);
+     if ((UserName==null) && (PassWord==null))
+     {
+       Conn= DriverManager.getConnection(ConnectionString);
+     }
+     else
+     {
+       Conn= DriverManager.getConnection(ConnectionString,UserName,PassWord);
+     }
+
+     Stmt=Conn.createStatement();
+     mResult=true;
+   }
+   catch(Exception e)
+   {
+     System.out.println(e.toString());
+     mResult=false;
+   }
+   return (mResult);
+  }
+
+  //�ر����ݿ�����
+  public void CloseConnection() {
+    try {
+      Stmt.close();
+      Conn.close();
+    }
+    catch (Exception e) {
+      System.out.println(e.toString());
+    }
+  }
+
+  public String GetDateTime() {
+    Calendar cal = Calendar.getInstance();
+    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+    String mDateTime = formatter.format(cal.getTime());
+    return (mDateTime);
+  }
+
+  public java.sql.Date GetDate() {
+    java.sql.Date mDate;
+    Calendar cal = Calendar.getInstance();
+    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
+    String mDateTime = formatter.format(cal.getTime());
+    return (java.sql.Date.valueOf(mDateTime));
+  }
+
+  public int GetMaxID(String vTableName, String vFieldName) {
+    boolean mConnect = false;
+    int mResult = 0;
+    String mSql = new String();
+    mSql = "select max(" + vFieldName + ")+1 as MaxID from " + vTableName;
+    if (Conn == null) {
+      if (this.OpenConnection()) {
+        mConnect = true;
+      }
+    }
+
+    try {
+      ResultSet result = ExecuteQuery(mSql);
+      if (result.next()) {
+        mResult = result.getInt("MaxID");
+      }
+      result.close();
+    }
+    catch (Exception e) {
+      System.out.println(e.toString());
+    }
+
+    if(mConnect){
+      this.CloseConnection();
+    }
+
+    return (mResult);
+  }
+
+  public ResultSet ExecuteQuery(String SqlString) {
+    ResultSet result = null;
+    try {
+      result = Stmt.executeQuery(SqlString);
+    }
+    catch (Exception e) {
+      System.out.println(e.toString());
+    }
+    return (result);
+  }
+
+  public int ExecuteUpdate(String SqlString) {
+    int result = 0;
+    try {
+      result = Stmt.executeUpdate(SqlString);
+    }
+    catch (Exception e) {
+      System.out.println(e.toString());
+    }
+    return (result);
+  }
+}

+ 74 - 0
src/main/java/com/jeeplus/modules/isignature/service/ConverterDocument.java

@@ -0,0 +1,74 @@
+package com.jeeplus.modules.isignature.service;
+
+import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection;
+import com.artofsolving.jodconverter.openoffice.converter.OpenOfficeDocumentConverter;
+import com.sun.star.awt.Size;
+import com.sun.star.beans.PropertyValue;
+import com.sun.star.lang.XComponent;
+import com.sun.star.uno.UnoRuntime;
+import com.sun.star.view.PaperFormat;
+import com.sun.star.view.XPrintable;
+
+public class ConverterDocument extends OpenOfficeDocumentConverter {
+
+
+    public ConverterDocument(OpenOfficeConnection connection) {
+        super(connection);
+    }
+
+
+
+
+    public final static Size A5, A4, A3;
+    public final static Size B4, B5, B6;
+    public final static Size KaoqinReport;
+
+    static {
+        A5 = new Size(14800, 21000);
+        A4 = new Size(21000, 29700);
+        A3 = new Size(29700, 42000);
+
+        B4 = new Size(25000, 35300);
+        B5 = new Size(17600, 25000);
+        B6 = new Size(12500, 17600);
+
+        KaoqinReport = new Size(29700, 27940);  //最大限度  宽 1600000
+    }
+
+
+
+    @Override
+    protected void refreshDocument(XComponent document) {
+        super.refreshDocument(document);
+
+        // The default paper format and orientation is A4 and portrait. To
+        // change paper orientation
+        // re set page size
+        XPrintable xPrintable = (XPrintable) UnoRuntime.queryInterface(XPrintable.class, document);
+        PropertyValue[] printerDesc = new PropertyValue[2];
+
+        // Paper Orientation
+//  printerDesc[0] = new PropertyValue();
+//  printerDesc[0].Name = "PaperOrientation";
+//  printerDesc[0].Value = PaperOrientation.PORTRAIT;
+
+        // Paper Format
+        printerDesc[0] = new PropertyValue();
+        printerDesc[0].Name = "PaperFormat";
+        printerDesc[0].Value = PaperFormat.USER;
+
+        // Paper Size
+        printerDesc[1] = new PropertyValue();
+        printerDesc[1].Name = "PaperSize";
+        printerDesc[1].Value = KaoqinReport;
+
+        try {
+            xPrintable.setPrinter(printerDesc);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+    }
+
+
+}

+ 225 - 0
src/main/java/com/jeeplus/modules/isignature/service/ISignatureDocumentService.java

@@ -0,0 +1,225 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.isignature.service;
+
+//import DBstep.iMsgServer2000;
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.oss.OSSClientUtil;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.service.CrudService;
+import com.jeeplus.common.utils.DateUtils;
+import com.jeeplus.common.utils.Office2PdfUtil;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.modules.isignature.dao.ISignatureDocumentDao;
+import com.jeeplus.modules.isignature.entity.ISignatureDocument;
+import com.jeeplus.modules.isignature.workthread.ImageConvertThread;
+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.utils.UserUtils;
+import org.apache.commons.io.FilenameUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.io.*;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 电子签章信息Service
+ * @author fgy
+ * @version 2018-04-17
+ */
+@Service
+@Transactional(readOnly = true)
+public class ISignatureDocumentService extends CrudService<ISignatureDocumentDao, ISignatureDocument> {
+
+    private static final String[] PDF = new String[]{"PDF","pdf"};
+    private static final String[] OFFICE = new String[]{"doc","DOC","xls","XLS","ppt","PPT","docx","DOCX","xlsx","XLSX","pptx","PPTX"};
+
+	@Autowired
+	private WorkattachmentDao workattachmentDao;
+
+	public ISignatureDocument get(String id) {
+		return super.get(id);
+	}
+	
+	public List<ISignatureDocument> findList(ISignatureDocument iSignatureDocument) {
+		return super.findList(iSignatureDocument);
+	}
+	
+	public Page<ISignatureDocument> findPage(Page<ISignatureDocument> page, ISignatureDocument iSignatureDocument) {
+		return super.findPage(page, iSignatureDocument);
+	}
+	
+	@Transactional(readOnly = false)
+	public void save(ISignatureDocument iSignatureDocument) {
+		super.save(iSignatureDocument);
+	}
+	
+	@Transactional(readOnly = false)
+	public void delete(ISignatureDocument iSignatureDocument) {
+		super.delete(iSignatureDocument);
+	}
+
+	/**
+	 * 更新签章文档
+	 * @param iMsgBody
+	 */
+//	@Transactional(readOnly = false)
+//	public void update(iMsgServer2000 iMsgBody){
+//		String id = iMsgBody.GetMsgByName("RECORDID");//取得文档编号
+//		String filename = iMsgBody.GetMsgByName("FILENAME");//取得文档名称
+////		String filetype = iMsgBody.GetMsgByName("FILETYPE");//取得文档类型
+//		String filepath = iMsgBody.GetMsgByName("FILEPATH");//取得文档存储路径
+//		byte[] bytes = iMsgBody.MsgFileBody();
+//		logger.info("保存签章文档,文档号:{},文档名称:{}",id,filename);
+//
+//		OSSClientUtil ossClientUtil = new OSSClientUtil();
+//		ByteArrayInputStream byteArrayInputStream = null;
+//		ByteArrayOutputStream imageOutputStream = null;
+//		ByteArrayInputStream imageInputStream = null;
+//		byteArrayInputStream = new ByteArrayInputStream(bytes);
+//		imageInputStream = new ByteArrayInputStream(bytes);
+//		String pathString = getPathString(filepath, filename);
+//		pathString = pathString.replace(filename,"");
+//		logger.info("文档保存路径:{}",pathString);
+//		ossClientUtil.uploadFile2OSS(byteArrayInputStream, pathString, filename);
+//		logger.info("成功保存签章文档");
+//		//转图片保存 文件大会慢,之后转异步处理
+//		new Thread(new ImageConvertThread(imageInputStream,pathString,filename,ossClientUtil)).start();
+//
+////		filepath = Global.getAliyunUrl() + "/" + Global.getISignature() + filename;
+//		String imagePath = Office2PdfUtil.convertPdfFileName(filepath);
+//		ISignatureDocument iSignatureDocument = new ISignatureDocument(id);
+//		iSignatureDocument.setFilePath(filepath);
+//		iSignatureDocument.setFileName(filename);
+//		iSignatureDocument.setUpdateBy(UserUtils.getUser());
+//		iSignatureDocument.setUpdateDate(new Date());
+//		iSignatureDocument.setImagePath(imagePath);
+//        iSignatureDocument.setIsignatureStatus("0");
+//		dao.updateSelective(iSignatureDocument);
+//		return;
+//	}
+
+	/**
+	 * 创建待签章文档
+	 * @param fileUrl
+	 * @param fileName
+	 * @param recordId
+	 * @param subject
+	 */
+	public void createIsignature(String fileUrl,String fileName,String recordId,String subject){
+	    if(!FilenameUtils.isExtension(fileName,PDF)&&!FilenameUtils.isExtension(fileName,OFFICE)){
+	        return;
+        }
+		ByteArrayOutputStream byteArrayOutputStream = null;
+		ByteArrayInputStream byteArrayInputStream = null;
+		InputStream inputStream = null;
+		ByteArrayInputStream imageInputStream = null;
+		try {
+			byte[] fileBytes = this.load(fileUrl, fileName);
+			inputStream = new ByteArrayInputStream(fileBytes);
+			String  newFileName = fileName;
+			if (!FilenameUtils.isExtension(fileName,PDF)){
+				newFileName = FilenameUtils.removeExtension(fileName)+".pdf";
+				byteArrayOutputStream = Office2PdfUtil.officeStream2PDF(inputStream, fileName);
+				byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
+				imageInputStream  = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
+			}else {
+				ByteArrayOutputStream baos = new ByteArrayOutputStream();
+				byte[] buffer = new byte[1024];
+				int len;
+				while ((len = inputStream.read(buffer)) > -1 ) {
+					baos.write(buffer, 0, len);
+				}
+				baos.flush();
+				byteArrayInputStream = new ByteArrayInputStream(baos.toByteArray());
+				imageInputStream  = new ByteArrayInputStream(baos.toByteArray());
+			}
+			newFileName = System.currentTimeMillis()+"-"+newFileName;
+			OSSClientUtil ossClientUtil = new OSSClientUtil();
+			String iSignaturePath = Global.getISignature()+ DateUtils.formatDate(new Date(),null)+"/";
+//			String iSignaturePath = Global.getISignature();
+			ossClientUtil.uploadFile2OSS(byteArrayInputStream,iSignaturePath,newFileName);
+
+			//转图片保存 文件大会慢,之后转异步处理
+			new Thread(new ImageConvertThread(imageInputStream, iSignaturePath, newFileName,ossClientUtil)).start();
+
+			String filePath = Global.getAliDownloadUrl() + "/" + iSignaturePath + newFileName;
+			String imagePath = Office2PdfUtil.convertPdfFileName(filePath);
+			ISignatureDocument iSignatureDocument = new ISignatureDocument();
+			User user = UserUtils.getUser();
+			iSignatureDocument.setCreateDate(new Date());
+			iSignatureDocument.setCreateBy(user);
+			iSignatureDocument.setUpdateDate(new Date());
+			iSignatureDocument.setUpdateBy(user);
+			iSignatureDocument.setFilePath(filePath);
+			iSignatureDocument.setFileName(newFileName);
+			iSignatureDocument.setCompanyId(user.getComId());
+			iSignatureDocument.setRecordId(recordId);
+			iSignatureDocument.setSubject(subject);
+			iSignatureDocument.setType("PDF");
+			iSignatureDocument.setImagePath(imagePath);
+			iSignatureDocument.setIsignatureStatus("1");
+//			iSignatureDocument.setStatus(Status);
+			this.save(iSignatureDocument);
+		} catch (Exception e) {
+			logger.error("创建电子签章PDF异常,文件名:{}",fileName,e);
+		}finally {
+			if (inputStream!=null){
+				try {
+					inputStream.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+		}
+	}
+
+	/**
+	 * 加载签章文件
+	 * @param filePath
+	 * @param fileName
+	 * @return
+	 */
+	public byte[] load(String filePath, String fileName) {
+		OSSClientUtil ossClientUtil = new OSSClientUtil();
+		String key = getPathString(filePath, fileName);
+		byte[] bytes = ossClientUtil.downBytesByStream(key, fileName);
+		return bytes;
+	}
+
+	private String getPathString(String filePath, String fileName) {
+		String aliyunUrl = Global.getAliyunUrl();
+		String aliDownloadUrl = Global.getAliDownloadUrl();
+		String cons = "";
+		if (filePath.contains(aliyunUrl)){
+			cons = aliyunUrl;
+		}else if (filePath.contains("http://gangwan-app.oss-cn-hangzhou.aliyuncs.com")){
+			cons = "http://gangwan-app.oss-cn-hangzhou.aliyuncs.com";
+		}else {
+			cons = aliDownloadUrl;
+		}
+		String key = filePath.split(cons+"/")[1];
+		logger.info("-----------------------------------------");
+		logger.info("fileName="+fileName);
+		logger.info("key="+key);
+		logger.info("-----------------------------------------");
+		return key;
+	}
+
+	public ISignatureDocument getByRecordId(String recordId) {
+		return dao.getByRecordId(recordId);
+	}
+	public ISignatureDocument getByRImagePath(String imagePath) {
+		Workattachment workattachment = workattachmentDao.getByUrl(imagePath);
+		if(workattachment!=null && StringUtils.isNotBlank(workattachment.getId())) {
+			return dao.getByRecordId(workattachment.getId());
+		}else {
+			return  new ISignatureDocument();
+		}
+	}
+}

+ 212 - 0
src/main/java/com/jeeplus/modules/isignature/web/ISignatureDocumentController.java

@@ -0,0 +1,212 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.isignature.web;
+
+//import DBstep.iMsgServer2000;
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.oss.OSSClientUtil;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.utils.Office2PdfUtil;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.modules.isignature.entity.ISignatureDocument;
+import com.jeeplus.modules.isignature.service.ISignatureDocumentService;
+import com.jeeplus.modules.projectcontentinfo.entity.ProjectReportData;
+import com.jeeplus.modules.projectcontentinfo.service.ProjectReportDataService;
+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.workcontractinfo.entity.WorkContractInfo;
+import com.jeeplus.modules.workcontractinfo.service.WorkContractInfoService;
+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.servlet.ModelAndView;
+import org.springframework.web.servlet.view.RedirectView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.*;
+
+/**
+ * 电子签章信息Controller
+ * @author fgy
+ * @version 2018-04-17
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/isignature/iSignatureDocument")
+public class ISignatureDocumentController extends BaseController {
+
+	@Autowired
+	private ProjectReportDataService projectReportDataService;
+	@Autowired
+	private ISignatureDocumentService iSignatureDocumentService;
+	@Autowired
+	private WorkattachmentService workattachmentService;
+	@Autowired
+	private WorkContractInfoService workContractInfoService;
+
+	@ModelAttribute
+	public ISignatureDocument get(@RequestParam(required=false) String id) {
+		ISignatureDocument entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = iSignatureDocumentService.get(id);
+		}
+		if (entity == null){
+			entity = new ISignatureDocument();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 电子签章信息列表页面
+	 */
+	@RequestMapping(value = {"list", ""})
+	public String list(ISignatureDocument iSignatureDocument, HttpServletRequest request, HttpServletResponse response, Model model) {
+		iSignatureDocument.setCompanyId(UserUtils.getSelectCompany().getId());
+		iSignatureDocument.setCreateBy(UserUtils.getUser());
+		Page<ISignatureDocument> page = iSignatureDocumentService.findPage(new Page<ISignatureDocument>(request,response), iSignatureDocument);
+		model.addAttribute("page",page);
+		return "modules/isignature/iSignatureDocumentList";
+	}
+
+	/**
+	 * 编辑
+	 * @return
+	 */
+	@RequestMapping(value = "sign")
+	public String edit(ISignatureDocument iSignatureDocument, HttpServletRequest request,Model model,HttpServletResponse response) {
+		ISignatureDocument iSignatureDocument1 = iSignatureDocumentService.getByRecordId(iSignatureDocument.getRecordId());
+		//查询
+		String path="";
+		String type=request.getParameter("type");
+		model.addAttribute("iSignatureDocument",iSignatureDocument1);
+		Workattachment workattachment=workattachmentService.get(iSignatureDocument.getRecordId());
+		if("contract".equals(type)){
+			WorkContractInfo workContractInfo=workContractInfoService.get(workattachment.getAttachmentId());
+			if(workContractInfo!=null&&workContractInfo.getContractNumPath()!=null){
+				path=workContractInfo.getContractNumPath();
+				model.addAttribute("contractNum",workContractInfo.getContractNum());
+			}
+		}
+		if("report".equals(type)){
+			ProjectReportData projectReportData=projectReportDataService.get(workattachment.getAttachmentId());
+			if(projectReportData!=null&&projectReportData.getNumberPath()!=null){
+				path=projectReportData.getNumberPath();
+				model.addAttribute("contractNum",projectReportData.getNumber());
+			}
+		}
+		model.addAttribute("contractNumPath",path);
+		return "modules/isignature/DocumentEdit";
+	}
+
+	/**
+	 * 编辑
+	 * @return
+	 */
+	@RequestMapping(value = "saveP")
+	public ModelAndView saveP(HttpServletRequest request,HttpServletResponse response) {
+		return new ModelAndView(new RedirectView("list"));
+	}
+
+
+	/**
+	 * 查看,增加,编辑电子签章信息表单页面
+	 */
+	@RequestMapping(value = "form")
+	public String form(ISignatureDocument iSignatureDocument, Model model) {
+		if (StringUtils.isNotBlank(iSignatureDocument.getRecordId())){
+			ISignatureDocument iSignatureDocument1 = iSignatureDocumentService.getByRecordId(iSignatureDocument.getRecordId());
+			model.addAttribute("iSignatureDocument", iSignatureDocument1);
+		}else if(StringUtils.isNotBlank(iSignatureDocument.getImagePath())){
+			ISignatureDocument iSignatureDocument1 = iSignatureDocumentService.getByRImagePath(iSignatureDocument.getImagePath());
+			model.addAttribute("iSignatureDocument", iSignatureDocument1);
+		}
+
+		return "modules/isignature/iSignatureDocumentForm";
+	}
+
+	/**
+	 * 保存电子签章信息
+	 */
+	@RequestMapping(value = "save")
+	public void save(HttpServletRequest request,HttpServletResponse response) throws Exception{
+//		iMsgServer2000 iMsgBody = new iMsgServer2000();
+//		iMsgBody.Load(request);
+//		iSignatureDocumentService.update(iMsgBody);
+////		addMessage(redirectAttributes, "保存电子签章信息成功");
+//		iMsgBody.MsgTextClear();
+//		iMsgBody.MsgFileClear();
+//		iMsgBody.Send(response);
+	}
+
+	@RequestMapping(value = "load")
+	public void load(HttpServletRequest request,HttpServletResponse response) throws Exception{
+//		iMsgServer2000 iMsgBody = new iMsgServer2000();
+//		iMsgBody.Load(request);
+//		String id = iMsgBody.GetMsgByName("RECORDID");
+//		String filePath = iMsgBody.GetMsgByName("FILEPATH");
+//		String fileName = iMsgBody.GetMsgByName("FILENAME");
+//		logger.info("电子签章插件加载文档信息,文档号:{},文件路径:{},文件名:{}",id,filePath,fileName);
+//		byte [] bytes = null;
+//		bytes = iSignatureDocumentService.load(filePath,fileName);
+//		//测试代码开始---->
+//		FileInputStream inputStream = null;
+//		try{
+//			File file = new File("C:\\Users\\ssrh\\Desktop\\userTest7.pdf");
+//			inputStream =new FileInputStream(file);
+//			bytes = new byte[(int) file.length()];
+//			inputStream.read(bytes);
+//		}finally {
+//			inputStream.close();
+//		}
+		//<----测试代码结束
+//		iMsgBody.SetMsgByName("FILENAME",fileName);
+//		iMsgBody.MsgFileBody(bytes);					//将文件信息打包
+//		iMsgBody.SetMsgByName("STATUS", "打开成功!");			//设置状态信息
+//		iMsgBody.Send(response);
+	}
+
+	@RequestMapping("seeFile")
+	public void seeFile(HttpServletResponse response,HttpServletRequest request,String fileUrl,String fileName){
+        byte[] fileBytes = iSignatureDocumentService.load(fileUrl, fileName);
+        InputStream inputStream = new ByteArrayInputStream(fileBytes);
+        try {
+            Office2PdfUtil.officeStream2PDF(inputStream,response.getOutputStream(),fileName);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+
+    /**
+     * 下载附件
+     */
+    @RequestMapping("/download")
+    public void downLoadAttach(ISignatureDocument iSignatureDocument,HttpServletRequest request, HttpServletResponse response) throws IOException {
+        iSignatureDocument = iSignatureDocumentService.getByRecordId(iSignatureDocument.getRecordId());
+        if(iSignatureDocument == null){
+            return;
+        }
+        String filePath = iSignatureDocument.getFilePath();
+        String aliyunUrl = Global.getAliyunUrl();
+        String aliDownloadUrl = Global.getAliDownloadUrl();
+        String cons = "";
+        if (filePath.contains(aliyunUrl)){
+            cons = aliyunUrl;
+        }else if (filePath.contains("http://gangwan-app.oss-cn-hangzhou.aliyuncs.com")){
+            cons = "http://gangwan-app.oss-cn-hangzhou.aliyuncs.com";
+        }else {
+            cons = aliDownloadUrl;
+        }
+        final String[] arr = filePath.split(cons + "/");
+        String key = arr[1];
+        new OSSClientUtil().downByStream(key, iSignatureDocument.getFileName(), response,request.getHeader("USER-AGENT"));
+    }
+}

+ 39 - 0
src/main/java/com/jeeplus/modules/isignature/workthread/ImageConvertThread.java

@@ -0,0 +1,39 @@
+package com.jeeplus.modules.isignature.workthread;
+
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.oss.OSSClientUtil;
+import com.jeeplus.common.utils.Office2PdfUtil;
+import org.apache.commons.io.FilenameUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+
+public class ImageConvertThread implements Runnable{
+
+    private static Logger logger = LoggerFactory.getLogger(ImageConvertThread.class);
+    private ByteArrayInputStream imageInputStream;
+    private String pathString;
+    private String newFileName;
+    private OSSClientUtil ossClientUtil;
+
+    public ImageConvertThread(ByteArrayInputStream imageInputStream, String pathString, String newFileName, OSSClientUtil ossClientUtil) {
+        this.imageInputStream = imageInputStream;
+        this.pathString = pathString;
+        this.newFileName = newFileName;
+        this.ossClientUtil = ossClientUtil;
+    }
+
+    @Override
+    public void run() {
+        logger.info("开始异步保存预览图片信息,文件名:{}",newFileName);
+        String imageName = newFileName;
+        if (FilenameUtils.isExtension(newFileName,new String[]{"PDF","pdf"})) {
+            ByteArrayOutputStream imageOutputStream = Office2PdfUtil.pdfToImage(imageInputStream, newFileName);
+            imageName = Office2PdfUtil.convertPdfFileName(newFileName);
+            imageInputStream = new ByteArrayInputStream(imageOutputStream.toByteArray());
+        }
+        ossClientUtil.uploadFile2OSS(imageInputStream, pathString,imageName);
+    }
+}

+ 43 - 0
src/main/java/com/jeeplus/modules/leaveapply/dao/LeaveApplyDao.java

@@ -0,0 +1,43 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.leaveapply.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.leaveapply.entity.LeaveApply;
+import com.jeeplus.modules.leaveapply.entity.LeaveDetail;
+import com.jeeplus.modules.workborrowmangement.entity.WorkBorrowMangement;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 请假申请DAO接口
+ * @author ssrh
+ * @version 2018-09-10
+ */
+@MyBatisDao
+public interface LeaveApplyDao extends CrudDao<LeaveApply> {
+    void updateProcessIdAndStatus(LeaveApply leaveApply);
+    public List<LeaveApply> getCount(LeaveApply leaveApply);
+
+    /**
+     * 根据时间和档案id查询数据
+     * @param staffId,time
+     * @return
+     */
+    public LeaveApply getByStaffIdAndTime(@Param("staffId")String staffId, @Param("time")String time);
+    public String getMaxTime(@Param("staffId")String staffId, @Param("id")String id);
+    public int findHisTime(LeaveApply leaveApply);
+    public int findHisDate(LeaveApply leaveApply);
+    public List<LeaveApply> getMange(LeaveApply leaveApply);
+    LeaveApply getSumDays(String staffId);
+    int updateDetailFlat(LeaveApply leaveApply);
+    int deleteDetail(LeaveApply leaveApply);
+    int updateBack(LeaveApply leaveApply);
+    int updateLongTime(LeaveApply leaveApply);
+    int getResetState(String staffId);
+     public List<LeaveApply> getBackTaskList();
+
+}

+ 0 - 0
src/main/java/com/jeeplus/modules/leaveapply/dao/LeaveCountDao.java


Some files were not shown because too many files changed in this diff