Enford 5 年之前
父节点
当前提交
1a48d277a6
共有 100 个文件被更改,包括 22663 次插入0 次删除
  1. 21 0
      src/main/java/com/jeeplus/modules/project/dao/ArchivedirectoryDao.java
  2. 19 0
      src/main/java/com/jeeplus/modules/project/dao/BidInformationDao.java
  3. 31 0
      src/main/java/com/jeeplus/modules/project/dao/ProjectDao.java
  4. 32 0
      src/main/java/com/jeeplus/modules/project/dao/ProjectDepositManagementDao.java
  5. 19 0
      src/main/java/com/jeeplus/modules/project/dao/ProjectEvaluationRecordDao.java
  6. 19 0
      src/main/java/com/jeeplus/modules/project/dao/ProjectgeneralDao.java
  7. 19 0
      src/main/java/com/jeeplus/modules/project/dao/WorkprojectgroupDao.java
  8. 77 0
      src/main/java/com/jeeplus/modules/project/entity/Archivedirectory.java
  9. 205 0
      src/main/java/com/jeeplus/modules/project/entity/BidInformation.java
  10. 154 0
      src/main/java/com/jeeplus/modules/project/entity/Project.java
  11. 231 0
      src/main/java/com/jeeplus/modules/project/entity/ProjectDepositManagement.java
  12. 121 0
      src/main/java/com/jeeplus/modules/project/entity/ProjectEvaluationRecord.java
  13. 187 0
      src/main/java/com/jeeplus/modules/project/entity/Projectgeneral.java
  14. 67 0
      src/main/java/com/jeeplus/modules/project/entity/Workprojectgroup.java
  15. 56 0
      src/main/java/com/jeeplus/modules/project/service/ArchivedirectoryService.java
  16. 50 0
      src/main/java/com/jeeplus/modules/project/service/BidInformationService.java
  17. 115 0
      src/main/java/com/jeeplus/modules/project/service/ProjectDepositManagementService.java
  18. 50 0
      src/main/java/com/jeeplus/modules/project/service/ProjectEvaluationRecordService.java
  19. 85 0
      src/main/java/com/jeeplus/modules/project/service/ProjectService.java
  20. 50 0
      src/main/java/com/jeeplus/modules/project/service/ProjectgeneralService.java
  21. 50 0
      src/main/java/com/jeeplus/modules/project/service/WorkprojectgroupService.java
  22. 202 0
      src/main/java/com/jeeplus/modules/project/web/ArchivedirectoryController.java
  23. 223 0
      src/main/java/com/jeeplus/modules/project/web/BidInformationController.java
  24. 395 0
      src/main/java/com/jeeplus/modules/project/web/ProjectController.java
  25. 236 0
      src/main/java/com/jeeplus/modules/project/web/ProjectDepositManagementController.java
  26. 194 0
      src/main/java/com/jeeplus/modules/project/web/ProjectDepositReturnController.java
  27. 196 0
      src/main/java/com/jeeplus/modules/project/web/ProjectEvaluationRecordController.java
  28. 197 0
      src/main/java/com/jeeplus/modules/project/web/ProjectgeneralController.java
  29. 196 0
      src/main/java/com/jeeplus/modules/project/web/WorkprojectgroupController.java
  30. 26 0
      src/main/java/com/jeeplus/modules/projectcontentinfo/dao/ProjectBasedDataDao.java
  31. 24 0
      src/main/java/com/jeeplus/modules/projectcontentinfo/dao/ProjectContentChangeDao.java
  32. 35 0
      src/main/java/com/jeeplus/modules/projectcontentinfo/dao/ProjectContentDataDao.java
  33. 69 0
      src/main/java/com/jeeplus/modules/projectcontentinfo/dao/ProjectReportChangeDao.java
  34. 22 0
      src/main/java/com/jeeplus/modules/projectcontentinfo/dao/ProjectReportDataCompanyDao.java
  35. 74 0
      src/main/java/com/jeeplus/modules/projectcontentinfo/dao/ProjectReportDataDao.java
  36. 19 0
      src/main/java/com/jeeplus/modules/projectcontentinfo/dao/ProjectReportDataInfoDao.java
  37. 21 0
      src/main/java/com/jeeplus/modules/projectcontentinfo/dao/ProjectReportDataMonthDao.java
  38. 19 0
      src/main/java/com/jeeplus/modules/projectcontentinfo/dao/ProjectReportDataOfficeDao.java
  39. 32 0
      src/main/java/com/jeeplus/modules/projectcontentinfo/dao/ProjectReportRecordDao.java
  40. 42 0
      src/main/java/com/jeeplus/modules/projectcontentinfo/dao/ProjectcontentinfoDao.java
  41. 169 0
      src/main/java/com/jeeplus/modules/projectcontentinfo/entity/ProjectBasedData.java
  42. 192 0
      src/main/java/com/jeeplus/modules/projectcontentinfo/entity/ProjectContentData.java
  43. 27 0
      src/main/java/com/jeeplus/modules/projectcontentinfo/entity/ProjectContentDataRelevance.java
  44. 59 0
      src/main/java/com/jeeplus/modules/projectcontentinfo/entity/ProjectContractContentAlterData.java
  45. 564 0
      src/main/java/com/jeeplus/modules/projectcontentinfo/entity/ProjectReportData.java
  46. 113 0
      src/main/java/com/jeeplus/modules/projectcontentinfo/entity/ProjectReportDataCompany.java
  47. 167 0
      src/main/java/com/jeeplus/modules/projectcontentinfo/entity/ProjectReportDataInfo.java
  48. 94 0
      src/main/java/com/jeeplus/modules/projectcontentinfo/entity/ProjectReportDataMonth.java
  49. 94 0
      src/main/java/com/jeeplus/modules/projectcontentinfo/entity/ProjectReportDataOffice.java
  50. 296 0
      src/main/java/com/jeeplus/modules/projectcontentinfo/entity/ProjectReportRecord.java
  51. 188 0
      src/main/java/com/jeeplus/modules/projectcontentinfo/entity/Projectcontentinfo.java
  52. 80 0
      src/main/java/com/jeeplus/modules/projectcontentinfo/service/ProjectBasedDataService.java
  53. 192 0
      src/main/java/com/jeeplus/modules/projectcontentinfo/service/ProjectContentDataService.java
  54. 934 0
      src/main/java/com/jeeplus/modules/projectcontentinfo/service/ProjectReportChangeService.java
  55. 1451 0
      src/main/java/com/jeeplus/modules/projectcontentinfo/service/ProjectReportDataService.java
  56. 708 0
      src/main/java/com/jeeplus/modules/projectcontentinfo/service/ProjectReportRecordService.java
  57. 204 0
      src/main/java/com/jeeplus/modules/projectcontentinfo/service/ProjectReportStatisticsService.java
  58. 1272 0
      src/main/java/com/jeeplus/modules/projectcontentinfo/service/ProjectcontentinfoService.java
  59. 204 0
      src/main/java/com/jeeplus/modules/projectcontentinfo/web/ProjectBasedDataController.java
  60. 251 0
      src/main/java/com/jeeplus/modules/projectcontentinfo/web/ProjectContentDataController.java
  61. 236 0
      src/main/java/com/jeeplus/modules/projectcontentinfo/web/ProjectReportDataController.java
  62. 349 0
      src/main/java/com/jeeplus/modules/projectcontentinfo/web/ProjectReportRecordController.java
  63. 419 0
      src/main/java/com/jeeplus/modules/projectcontentinfo/web/ProjectReportStatisticsController.java
  64. 1448 0
      src/main/java/com/jeeplus/modules/projectcontentinfo/web/ProjectcontentinfoController.java
  65. 27 0
      src/main/java/com/jeeplus/modules/projectcontroltable/dao/ProjectControlTableDao.java
  66. 176 0
      src/main/java/com/jeeplus/modules/projectcontroltable/entity/ProjectControlTable.java
  67. 743 0
      src/main/java/com/jeeplus/modules/projectcontroltable/service/ProjectControlTableService.java
  68. 286 0
      src/main/java/com/jeeplus/modules/projectcontroltable/web/ProjectControlTableController.java
  69. 24 0
      src/main/java/com/jeeplus/modules/projectrecord/dao/ProjectClientLinkmanDao.java
  70. 24 0
      src/main/java/com/jeeplus/modules/projectrecord/dao/ProjectRecordsAlterDao.java
  71. 33 0
      src/main/java/com/jeeplus/modules/projectrecord/dao/ProjectRecordsDao.java
  72. 30 0
      src/main/java/com/jeeplus/modules/projectrecord/dao/WorkProjectUserDao.java
  73. 572 0
      src/main/java/com/jeeplus/modules/projectrecord/entity/ProjectRecords.java
  74. 518 0
      src/main/java/com/jeeplus/modules/projectrecord/entity/ProjectRecordsAlter.java
  75. 25 0
      src/main/java/com/jeeplus/modules/projectrecord/enums/AlterStatusEnum.java
  76. 29 0
      src/main/java/com/jeeplus/modules/projectrecord/enums/ProjectStatusEnum.java
  77. 977 0
      src/main/java/com/jeeplus/modules/projectrecord/service/ProjectRecordsAlterService.java
  78. 1140 0
      src/main/java/com/jeeplus/modules/projectrecord/service/ProjectRecordsService.java
  79. 537 0
      src/main/java/com/jeeplus/modules/projectrecord/web/ProjectRecordsAlterController.java
  80. 642 0
      src/main/java/com/jeeplus/modules/projectrecord/web/ProjectRecordsController.java
  81. 204 0
      src/main/java/com/jeeplus/modules/projectrecord/web/ProjectRecordsUserController.java
  82. 17 0
      src/main/java/com/jeeplus/modules/projectreportnum/dao/ProjectReportNumDao.java
  83. 44 0
      src/main/java/com/jeeplus/modules/projectreportnum/entity/ReportNum.java
  84. 84 0
      src/main/java/com/jeeplus/modules/projectreportnum/service/ProjectReportNumService.java
  85. 82 0
      src/main/java/com/jeeplus/modules/projectreportnum/web/ProjectReportFindController.java
  86. 188 0
      src/main/java/com/jeeplus/modules/projectreportnum/web/ProjectReportNumController.java
  87. 31 0
      src/main/java/com/jeeplus/modules/pushinfo/dao/PushinfoDao.java
  88. 131 0
      src/main/java/com/jeeplus/modules/pushinfo/entity/Pushinfo.java
  89. 91 0
      src/main/java/com/jeeplus/modules/pushinfo/service/PushinfoService.java
  90. 196 0
      src/main/java/com/jeeplus/modules/pushinfo/web/PushinfoController.java
  91. 22 0
      src/main/java/com/jeeplus/modules/ruralprojectrecords/dao/RuralProjectClientLinkmanDao.java
  92. 23 0
      src/main/java/com/jeeplus/modules/ruralprojectrecords/dao/RuralProjectRecordsAlterDao.java
  93. 33 0
      src/main/java/com/jeeplus/modules/ruralprojectrecords/dao/RuralProjectRecordsDao.java
  94. 29 0
      src/main/java/com/jeeplus/modules/ruralprojectrecords/dao/RuralWorkProjectUserDao.java
  95. 571 0
      src/main/java/com/jeeplus/modules/ruralprojectrecords/entity/RuralProjectRecords.java
  96. 516 0
      src/main/java/com/jeeplus/modules/ruralprojectrecords/entity/RuralProjectRecordsAlter.java
  97. 25 0
      src/main/java/com/jeeplus/modules/ruralprojectrecords/enums/AlterStatusEnum.java
  98. 29 0
      src/main/java/com/jeeplus/modules/ruralprojectrecords/enums/ProjectStatusEnum.java
  99. 973 0
      src/main/java/com/jeeplus/modules/ruralprojectrecords/service/RuralProjectRecordsAlterService.java
  100. 0 0
      src/main/java/com/jeeplus/modules/ruralprojectrecords/service/RuralProjectRecordsService.java

+ 21 - 0
src/main/java/com/jeeplus/modules/project/dao/ArchivedirectoryDao.java

@@ -0,0 +1,21 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.project.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.project.entity.Archivedirectory;
+
+import java.util.List;
+
+/**
+ * 归档目录DAO接口
+ * @author 姚儒彬
+ * @version 2017-10-11
+ */
+@MyBatisDao
+public interface ArchivedirectoryDao extends CrudDao<Archivedirectory> {
+    public List<Archivedirectory> getbidInformationById(String id);
+	
+}

+ 19 - 0
src/main/java/com/jeeplus/modules/project/dao/BidInformationDao.java

@@ -0,0 +1,19 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.project.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.project.entity.BidInformation;
+
+/**
+ * 标段信息DAO接口
+ * @author 姚儒彬
+ * @version 2017-10-11
+ */
+@MyBatisDao
+public interface BidInformationDao extends CrudDao<BidInformation> {
+
+	
+}

+ 31 - 0
src/main/java/com/jeeplus/modules/project/dao/ProjectDao.java

@@ -0,0 +1,31 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.project.dao;
+
+import com.jeeplus.modules.workclientinfo.entity.WorkClientLinkman;
+import com.jeeplus.modules.workcontractinfo.entity.WorkContractInfo;
+import com.jeeplus.modules.project.entity.Projectgeneral;
+import com.jeeplus.modules.project.entity.ProjectEvaluationRecord;
+import com.jeeplus.modules.project.entity.Workprojectgroup;
+import java.util.List;
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.project.entity.Project;
+
+/**
+ * 项目表DAO接口
+ * @author fgy
+ * @version 2017-10-12
+ */
+@MyBatisDao
+public interface ProjectDao extends CrudDao<Project> {
+
+	public List<WorkClientLinkman> findListByentrustCompany(WorkClientLinkman entrustCompany);
+	public List<WorkContractInfo> findListBycontractInfo(WorkContractInfo contractInfo);
+	public List<Projectgeneral> findListByprojectGeneral(Projectgeneral projectGeneral);
+	public List<WorkClientLinkman> findListByworkClientLinkman(WorkClientLinkman workClientLinkman);
+	public List<ProjectEvaluationRecord> findListByprojectEvaluationRecord(ProjectEvaluationRecord projectEvaluationRecord);
+	public List<Workprojectgroup> findListByworkprojectgroup(Workprojectgroup workprojectgroup);
+	
+}

+ 32 - 0
src/main/java/com/jeeplus/modules/project/dao/ProjectDepositManagementDao.java

@@ -0,0 +1,32 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.project.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.project.entity.ProjectDepositManagement;
+
+/**
+ * 保证金管理DAO接口
+ * @author yangfan
+ * @version 2017-10-11
+ */
+@MyBatisDao
+public interface ProjectDepositManagementDao extends CrudDao<ProjectDepositManagement> {
+
+    /**
+     * 更新流程实例ID
+     * @param projectDepositManagement
+     * @return
+     */
+    public int updateProcessInstanceId(ProjectDepositManagement projectDepositManagement);
+
+    /**
+     * 根据流程实例ID获取Leave
+     * @param processInstanceId
+     * @return
+     */
+    public ProjectDepositManagement getByProcessInstanceId(String processInstanceId);
+
+}

+ 19 - 0
src/main/java/com/jeeplus/modules/project/dao/ProjectEvaluationRecordDao.java

@@ -0,0 +1,19 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.project.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.project.entity.ProjectEvaluationRecord;
+
+/**
+ * 招标代理评价记录表DAO接口
+ * @author liuw
+ * @version 2017-10-12
+ */
+@MyBatisDao
+public interface ProjectEvaluationRecordDao extends CrudDao<ProjectEvaluationRecord> {
+
+	
+}

+ 19 - 0
src/main/java/com/jeeplus/modules/project/dao/ProjectgeneralDao.java

@@ -0,0 +1,19 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.project.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.project.entity.Projectgeneral;
+
+/**
+ * 项目概况DAO接口
+ * @author 姚儒彬
+ * @version 2017-10-11
+ */
+@MyBatisDao
+public interface ProjectgeneralDao extends CrudDao<Projectgeneral> {
+
+	
+}

+ 19 - 0
src/main/java/com/jeeplus/modules/project/dao/WorkprojectgroupDao.java

@@ -0,0 +1,19 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.project.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.project.entity.Workprojectgroup;
+
+/**
+ * 项目组信息表DAO接口
+ * @author yangfan
+ * @version 2017-10-11
+ */
+@MyBatisDao
+public interface WorkprojectgroupDao extends CrudDao<Workprojectgroup> {
+
+	
+}

+ 77 - 0
src/main/java/com/jeeplus/modules/project/entity/Archivedirectory.java

@@ -0,0 +1,77 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.project.entity;
+
+
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+
+/**
+ * 归档目录Entity
+ * @author 姚儒彬
+ * @version 2017-10-11
+ */
+public class Archivedirectory extends DataEntity<Archivedirectory> {
+	
+	private static final long serialVersionUID = 1L;
+	private int seq;             //序号
+	private String name;		// 名称
+	private String number;		// 数量
+	private String pageNumber;		// 页码
+	private String bidInformationId;		// 标段信息表主键
+	
+	public Archivedirectory() {
+		super();
+	}
+
+	public Archivedirectory(String id){
+		super(id);
+	}
+
+	@ExcelField(title="序号", align=2, sort=7)
+	public int getSeq() {
+		return seq;
+	}
+
+	public void setSeq(int seq) {
+		this.seq = seq;
+	}
+
+	@ExcelField(title="名称", align=2, sort=7)
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+	
+	@ExcelField(title="数量", align=2, sort=8)
+	public String getNumber() {
+		return number;
+	}
+
+	public void setNumber(String number) {
+		this.number = number;
+	}
+	
+	@ExcelField(title="页码", align=2, sort=9)
+	public String getPageNumber() {
+		return pageNumber;
+	}
+
+	public void setPageNumber(String pageNumber) {
+		this.pageNumber = pageNumber;
+	}
+	
+	@ExcelField(title="标段信息表主键", align=2, sort=10)
+	public String getBidInformationId() {
+		return bidInformationId;
+	}
+
+	public void setBidInformationId(String bidInformationId) {
+		this.bidInformationId = bidInformationId;
+	}
+	
+}

+ 205 - 0
src/main/java/com/jeeplus/modules/project/entity/BidInformation.java

@@ -0,0 +1,205 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.project.entity;
+
+
+import com.google.common.collect.Lists;
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.common.utils.Collections3;
+import com.jeeplus.common.utils.IdGen;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.work.entity.report.WorkReportRecord;
+import com.jeeplus.modules.workclientinfo.entity.WorkClientInfo;
+import com.jeeplus.modules.workcontractinfo.entity.WorkContractInfo;
+
+import java.util.List;
+
+/**
+ * 标段信息Entity
+ * @author 姚儒彬
+ * @version 2017-10-11
+ */
+public class BidInformation extends DataEntity<BidInformation> {
+	
+	private static final long serialVersionUID = 1L;
+	private String bidOpeningTime;		// 开标时间
+	private String winningBidNumber;		// 中标通知书编号
+	private String centralInvestmentOnline;		// 中央投资网是否上传(0否,1是)
+	private String tendereeArchives;		// 招标人是否承存档(0否,1是)
+	private String paperArchiving;		// 纸质归档(0否,1是)
+	private String timeOfWinningBid;		// 中标通知书发放时间
+	private String filingTime;		// 备案时间
+	private String firstAcceptanceTime;		// 首次接收时间
+	private String finalArchivingTime;		// 最终归档时间
+	private String processInstanceId;		// 流程实例ID
+	private String status;		// 归档状态
+	private String projectId;		// 项目表主键
+	private Project project;    //项目表
+	private Workprojectgroup workprojectgroup; //项目组信息表
+	private WorkClientInfo workClientInfo;   //客户信息表
+	private Archivedirectory archivedirectory; //归档目录表
+	private List<Archivedirectory> archivedirectoryList = Lists.newArrayList();
+	
+	public BidInformation() {
+		super();
+	}
+
+	public BidInformation(String id){
+		super(id);
+	}
+
+	@ExcelField(title="开标时间", align=2, sort=7)
+	public String getBidOpeningTime() {
+		return bidOpeningTime;
+	}
+
+	public void setBidOpeningTime(String bidOpeningTime) {
+		this.bidOpeningTime = bidOpeningTime;
+	}
+	
+	@ExcelField(title="中标通知书编号", align=2, sort=8)
+	public String getWinningBidNumber() {
+		return winningBidNumber;
+	}
+
+	public void setWinningBidNumber(String winningBidNumber) {
+		this.winningBidNumber = winningBidNumber;
+	}
+	
+	@ExcelField(title="中央投资网是否上传(0否,1是)", dictType="", align=2, sort=9)
+	public String getCentralInvestmentOnline() {
+		return centralInvestmentOnline;
+	}
+
+	public void setCentralInvestmentOnline(String centralInvestmentOnline) {
+		this.centralInvestmentOnline = centralInvestmentOnline;
+	}
+	
+	@ExcelField(title="招标人是否承存档(0否,1是)", dictType="", align=2, sort=10)
+	public String getTendereeArchives() {
+		return tendereeArchives;
+	}
+
+	public void setTendereeArchives(String tendereeArchives) {
+		this.tendereeArchives = tendereeArchives;
+	}
+	
+	@ExcelField(title="纸质归档(0否,1是)", dictType="", align=2, sort=11)
+	public String getPaperArchiving() {
+		return paperArchiving;
+	}
+
+	public void setPaperArchiving(String paperArchiving) {
+		this.paperArchiving = paperArchiving;
+	}
+	
+	@ExcelField(title="中标通知书发放时间", align=2, sort=12)
+	public String getTimeOfWinningBid() {
+		return timeOfWinningBid;
+	}
+
+	public void setTimeOfWinningBid(String timeOfWinningBid) {
+		this.timeOfWinningBid = timeOfWinningBid;
+	}
+	
+	@ExcelField(title="备案时间", align=2, sort=13)
+	public String getFilingTime() {
+		return filingTime;
+	}
+
+	public void setFilingTime(String filingTime) {
+		this.filingTime = filingTime;
+	}
+	
+	@ExcelField(title="首次接收时间", align=2, sort=14)
+	public String getFirstAcceptanceTime() {
+		return firstAcceptanceTime;
+	}
+
+	public void setFirstAcceptanceTime(String firstAcceptanceTime) {
+		this.firstAcceptanceTime = firstAcceptanceTime;
+	}
+	
+	@ExcelField(title="最终归档时间", align=2, sort=15)
+	public String getFinalArchivingTime() {
+		return finalArchivingTime;
+	}
+
+	public void setFinalArchivingTime(String finalArchivingTime) {
+		this.finalArchivingTime = finalArchivingTime;
+	}
+	
+	@ExcelField(title="流程实例ID", align=2, sort=16)
+	public String getProcessInstanceId() {
+		return processInstanceId;
+	}
+
+	public void setProcessInstanceId(String processInstanceId) {
+		this.processInstanceId = processInstanceId;
+	}
+	
+	@ExcelField(title="归档状态", align=2, sort=17)
+	public String getStatus() {
+		return status;
+	}
+
+	public void setStatus(String status) {
+		this.status = status;
+	}
+	
+	@ExcelField(title="项目表主键", align=2, sort=18)
+	public String getProjectId() {
+		return projectId;
+	}
+
+	public void setProjectId(String projectId) {
+		this.projectId = projectId;
+	}
+
+	@ExcelField(title="项目信息", align=2, sort=19)
+	public Project getProject() {
+		return project;
+	}
+
+	public void setProject(Project project) {
+		this.project = project;
+	}
+
+	@ExcelField(title="项目组信息", align=2, sort=20)
+	public Workprojectgroup getWorkprojectgroup() {
+		return workprojectgroup;
+	}
+
+	public void setWorkprojectgroup(Workprojectgroup workprojectgroup) {
+		this.workprojectgroup = workprojectgroup;
+	}
+
+	@ExcelField(title="客户信息表", align=2, sort=21)
+	public WorkClientInfo getWorkClientInfo() {
+		return workClientInfo;
+	}
+
+	public void setWorkClientInfo(WorkClientInfo workClientInfo) {
+		this.workClientInfo = workClientInfo;
+	}
+
+	@ExcelField(title="归档目录表", align=2, sort=22)
+	public Archivedirectory getArchivedirectory() {
+		return archivedirectory;
+	}
+
+	public void setArchivedirectory(Archivedirectory archivedirectory) {
+		this.archivedirectory = archivedirectory;
+	}
+
+	public List<Archivedirectory> getArchivedirectoryList() {
+		return archivedirectoryList;
+	}
+	public void setArchivedirectoryList(List<Archivedirectory> archivedirectoryList) {
+		this.archivedirectoryList = archivedirectoryList;
+	}
+
+}

+ 154 - 0
src/main/java/com/jeeplus/modules/project/entity/Project.java

@@ -0,0 +1,154 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.project.entity;
+
+import com.jeeplus.modules.workclientinfo.entity.WorkClientLinkman;
+import javax.validation.constraints.NotNull;
+import com.jeeplus.modules.workcontractinfo.entity.WorkContractInfo;
+import com.jeeplus.modules.project.entity.Projectgeneral;
+import com.jeeplus.modules.project.entity.ProjectEvaluationRecord;
+import com.jeeplus.modules.project.entity.Workprojectgroup;
+
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+
+/**
+ * 项目表Entity
+ * @author fgy
+ * @version 2017-10-12
+ */
+public class Project extends DataEntity<Project> {
+	
+	private static final long serialVersionUID = 1L;
+	private String status;		// 项目状态(0:项目登记、1:项目评标、2:项目归档)
+	private String projectNumber;		// 项目编号
+	private String projectName;		// 项目名称
+	private String tendereeType;		// 招标方式(0:直接发包:1:”竞争性谈判、2:公开招标、3:邀请招标、4:其他)
+	private String batch;		// 批次
+	private String investmentAmounts;		// 投资额
+	private WorkClientLinkman entrustCompany;		// 委托单位
+	private WorkContractInfo contractInfo;		// 合同信息
+	private Projectgeneral projectGeneral;		// 项目概况
+	private WorkClientLinkman workClientLinkman;		// 投标单位
+	private ProjectEvaluationRecord projectEvaluationRecord;		// 评标记录
+	private Workprojectgroup workprojectgroup;		// 项目组信息
+	
+	public Project() {
+		super();
+	}
+
+	public Project(String id){
+		super(id);
+	}
+
+	@ExcelField(title="项目状态(0:项目登记、1:项目评标、2:项目归档)", dictType="", align=2, sort=1)
+	public String getStatus() {
+		return status;
+	}
+
+	public void setStatus(String status) {
+		this.status = status;
+	}
+	
+	@ExcelField(title="项目编号", align=2, sort=2)
+	public String getProjectNumber() {
+		return projectNumber;
+	}
+
+	public void setProjectNumber(String projectNumber) {
+		this.projectNumber = projectNumber;
+	}
+	
+	@ExcelField(title="项目名称", align=2, sort=3)
+	public String getProjectName() {
+		return projectName;
+	}
+
+	public void setProjectName(String projectName) {
+		this.projectName = projectName;
+	}
+	
+	@ExcelField(title="招标方式(0:直接发包:1:”竞争性谈判、2:公开招标、3:邀请招标、4:其他)", dictType="", align=2, sort=4)
+	public String getTendereeType() {
+		return tendereeType;
+	}
+
+	public void setTendereeType(String tendereeType) {
+		this.tendereeType = tendereeType;
+	}
+	
+	@ExcelField(title="批次", align=2, sort=5)
+	public String getBatch() {
+		return batch;
+	}
+
+	public void setBatch(String batch) {
+		this.batch = batch;
+	}
+	
+	@ExcelField(title="投资额", align=2, sort=6)
+	public String getInvestmentAmounts() {
+		return investmentAmounts;
+	}
+
+	public void setInvestmentAmounts(String investmentAmounts) {
+		this.investmentAmounts = investmentAmounts;
+	}
+	
+	@NotNull(message="委托单位不能为空")
+	@ExcelField(title="委托单位", align=2, sort=7)
+	public WorkClientLinkman getEntrustCompany() {
+		return entrustCompany;
+	}
+
+	public void setEntrustCompany(WorkClientLinkman entrustCompany) {
+		this.entrustCompany = entrustCompany;
+	}
+	
+	@ExcelField(title="合同信息", align=2, sort=8)
+	public WorkContractInfo getContractInfo() {
+		return contractInfo;
+	}
+
+	public void setContractInfo(WorkContractInfo contractInfo) {
+		this.contractInfo = contractInfo;
+	}
+	
+	@ExcelField(title="项目概况", align=2, sort=9)
+	public Projectgeneral getProjectGeneral() {
+		return projectGeneral;
+	}
+
+	public void setProjectGeneral(Projectgeneral projectGeneral) {
+		this.projectGeneral = projectGeneral;
+	}
+	
+	@ExcelField(title="投标单位", align=2, sort=10)
+	public WorkClientLinkman getWorkClientLinkman() {
+		return workClientLinkman;
+	}
+
+	public void setWorkClientLinkman(WorkClientLinkman workClientLinkman) {
+		this.workClientLinkman = workClientLinkman;
+	}
+	
+	@ExcelField(title="评标记录", align=2, sort=11)
+	public ProjectEvaluationRecord getProjectEvaluationRecord() {
+		return projectEvaluationRecord;
+	}
+
+	public void setProjectEvaluationRecord(ProjectEvaluationRecord projectEvaluationRecord) {
+		this.projectEvaluationRecord = projectEvaluationRecord;
+	}
+	
+	@ExcelField(title="项目组信息", align=2, sort=12)
+	public Workprojectgroup getWorkprojectgroup() {
+		return workprojectgroup;
+	}
+
+	public void setWorkprojectgroup(Workprojectgroup workprojectgroup) {
+		this.workprojectgroup = workprojectgroup;
+	}
+	
+}

+ 231 - 0
src/main/java/com/jeeplus/modules/project/entity/ProjectDepositManagement.java

@@ -0,0 +1,231 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.project.entity;
+
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.google.common.collect.Lists;
+import com.jeeplus.common.persistence.ActEntity;
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.utils.DictUtils;
+import org.activiti.engine.history.HistoricProcessInstance;
+import org.activiti.engine.repository.ProcessDefinition;
+import org.activiti.engine.runtime.ProcessInstance;
+import org.activiti.engine.task.Task;
+import org.hibernate.validator.constraints.Length;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 保证金管理Entity
+ * @author yangfan
+ * @version 2017-10-11
+ */
+public class ProjectDepositManagement extends ActEntity<ProjectDepositManagement> {
+	
+	private static final long serialVersionUID = 1L;
+	private String depositAmount;		// 保证金金额
+	private String projectId;		// 项目主键
+	private String status;		// 状态
+	private String processInstanceId;		// 实例流程id
+	private Project project;		// 项目名称
+	private String projectName;		// 项目名称
+	private String clientName;		// 递交单位
+	private String clientId;		// 递交单位
+	private Date openbidTime;		// 开标时间
+	private String name;
+	private String ids;
+	private String idNames;
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String getProjectName() {
+		return projectName;
+	}
+
+	public void setProjectName(String projectName) {
+		this.projectName = projectName;
+	}
+
+	public String getClientId() {
+		return clientId;
+	}
+
+	public void setClientId(String clientId) {
+		this.clientId = clientId;
+	}
+
+	public String getClientName() {
+		return clientName;
+	}
+
+	public void setClientName(String clientName) {
+		this.clientName = clientName;
+	}
+
+	public Date getOpenbidTime() {
+		return openbidTime;
+	}
+
+	public void setOpenbidTime(Date openbidTime) {
+		this.openbidTime = openbidTime;
+	}
+
+	@ExcelField(title="项目信息", align=2, sort=6)
+	public Project getProject() {
+		return project;
+	}
+
+	public void setProject(Project project) {
+		this.project = project;
+	}
+	
+	public ProjectDepositManagement() {
+		super();
+	}
+
+	public ProjectDepositManagement(String id){
+		super(id);
+	}
+
+	@ExcelField(title="保证金金额", align=2, sort=7)
+	public String getDepositAmount() {
+		return depositAmount;
+	}
+
+	public void setDepositAmount(String depositAmount) {
+		this.depositAmount = depositAmount;
+	}
+	
+	@ExcelField(title="项目主键", align=2, sort=8)
+	public String getProjectId() {
+		return projectId;
+	}
+
+	public void setProjectId(String projectId) {
+		this.projectId = projectId;
+	}
+	
+	@ExcelField(title="状态", align=2, sort=9)
+	public String getStatus() {
+		return status;
+	}
+
+	public void setStatus(String status) {
+		this.status = status;
+	}
+
+	// -- 临时属性 --//
+	// 流程任务
+	private Task task;
+	private Map<String, Object> variables;
+	// 运行中的流程实例
+	private ProcessInstance processInstance;
+	// 历史的流程实例
+	private HistoricProcessInstance historicProcessInstance;
+	// 流程定义
+	private ProcessDefinition processDefinition;
+
+	public String getProcessInstanceId() {
+		return processInstanceId;
+	}
+
+	public void setProcessInstanceId(String processInstanceId) {
+		this.processInstanceId = processInstanceId;
+	}
+
+	public User getUser() {
+		return createBy;
+	}
+
+	public void setUser(User user) {
+		this.createBy = user;
+	}
+
+	public Task getTask() {
+		return task;
+	}
+
+	public void setTask(Task task) {
+		this.task = task;
+	}
+
+	public Map<String, Object> getVariables() {
+		return variables;
+	}
+
+	public void setVariables(Map<String, Object> variables) {
+		this.variables = variables;
+	}
+
+	public ProcessInstance getProcessInstance() {
+		return processInstance;
+	}
+
+	public void setProcessInstance(ProcessInstance processInstance) {
+		this.processInstance = processInstance;
+	}
+
+	public HistoricProcessInstance getHistoricProcessInstance() {
+		return historicProcessInstance;
+	}
+
+	public void setHistoricProcessInstance(HistoricProcessInstance historicProcessInstance) {
+		this.historicProcessInstance = historicProcessInstance;
+	}
+
+	public ProcessDefinition getProcessDefinition() {
+		return processDefinition;
+	}
+
+	public void setProcessDefinition(ProcessDefinition processDefinition) {
+		this.processDefinition = processDefinition;
+	}
+
+	public String getIds() {
+		List<String> idList = Lists.newArrayList();
+		if (StringUtils.isNotBlank(ids)) {
+			String ss = ids.trim().replace(" ", ",").replace(" ", ",").replace(",", ",").replace("'", "");
+			for (String s : ss.split(",")) {
+				// if(s.matches("\\d*")) {
+				idList.add("'" + s + "'");
+				// }
+			}
+		}
+		return StringUtils.join(idList, ",");
+	}
+
+	public void setIds(String ids) {
+		this.ids = ids;
+	}
+
+	public String getIdNames() {
+		List<String> idList = Lists.newArrayList();
+		if (StringUtils.isNotBlank(idNames)) {
+			String ss = idNames.trim().replace(" ", ",").replace(" ", ",").replace(",", ",").replace("'", "");
+			for (String s : ss.split(",")) {
+				// if(s.matches("\\d*")) {
+				idList.add("'" + s + "'");
+				// }
+			}
+		}
+		return StringUtils.join(idList, ",");
+	}
+
+	public void setIdNames(String idNames) {
+		this.idNames = idNames;
+	}
+	
+}

+ 121 - 0
src/main/java/com/jeeplus/modules/project/entity/ProjectEvaluationRecord.java

@@ -0,0 +1,121 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.project.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 liuw
+ * @version 2017-10-12
+ */
+public class ProjectEvaluationRecord extends DataEntity<ProjectEvaluationRecord> {
+	
+	private static final long serialVersionUID = 1L;
+	private String clientId;		// 中标单位
+	private String bidsuccessMoney;		// 中标金额
+	private String duration;		// 工期
+	private String projectManager;		// 中标项目经理
+	private Date openbidMime;		// 开标时间
+	private String openbidPlace;		// 开标地点
+	private Date assessbidTime;		// 评标时间
+	private String assessbidPlace;		// 评标地点
+	private String projectId;		// 项目主键
+	
+	public ProjectEvaluationRecord() {
+		super();
+	}
+
+	public ProjectEvaluationRecord(String id){
+		super(id);
+	}
+
+	@ExcelField(title="中标单位", align=2, sort=7)
+	public String getClientId() {
+		return clientId;
+	}
+
+	public void setClientId(String clientId) {
+		this.clientId = clientId;
+	}
+	
+	@ExcelField(title="中标金额", align=2, sort=8)
+	public String getBidsuccessMoney() {
+		return bidsuccessMoney;
+	}
+
+	public void setBidsuccessMoney(String bidsuccessMoney) {
+		this.bidsuccessMoney = bidsuccessMoney;
+	}
+	
+	@ExcelField(title="工期", align=2, sort=9)
+	public String getDuration() {
+		return duration;
+	}
+
+	public void setDuration(String duration) {
+		this.duration = duration;
+	}
+	
+	@ExcelField(title="中标项目经理", align=2, sort=10)
+	public String getProjectManager() {
+		return projectManager;
+	}
+
+	public void setProjectManager(String projectManager) {
+		this.projectManager = projectManager;
+	}
+	
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@ExcelField(title="开标时间", align=2, sort=11)
+	public Date getOpenbidMime() {
+		return openbidMime;
+	}
+
+	public void setOpenbidMime(Date openbidMime) {
+		this.openbidMime = openbidMime;
+	}
+	
+	@ExcelField(title="开标地点", align=2, sort=12)
+	public String getOpenbidPlace() {
+		return openbidPlace;
+	}
+
+	public void setOpenbidPlace(String openbidPlace) {
+		this.openbidPlace = openbidPlace;
+	}
+	
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@ExcelField(title="评标时间", align=2, sort=13)
+	public Date getAssessbidTime() {
+		return assessbidTime;
+	}
+
+	public void setAssessbidTime(Date assessbidTime) {
+		this.assessbidTime = assessbidTime;
+	}
+	
+	@ExcelField(title="评标地点", align=2, sort=14)
+	public String getAssessbidPlace() {
+		return assessbidPlace;
+	}
+
+	public void setAssessbidPlace(String assessbidPlace) {
+		this.assessbidPlace = assessbidPlace;
+	}
+	
+	@ExcelField(title="项目主键", align=2, sort=15)
+	public String getProjectId() {
+		return projectId;
+	}
+
+	public void setProjectId(String projectId) {
+		this.projectId = projectId;
+	}
+	
+}

+ 187 - 0
src/main/java/com/jeeplus/modules/project/entity/Projectgeneral.java

@@ -0,0 +1,187 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.project.entity;
+
+
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+
+/**
+ * 项目概况Entity
+ * @author 姚儒彬
+ * @version 2017-10-11
+ */
+public class Projectgeneral extends DataEntity<Projectgeneral> {
+	
+	private static final long serialVersionUID = 1L;
+	private String demandDepartment;		// 需求部门
+	private String projectType;		// 工程类型(0机电、1房建、2市政、3交通、4政府采购、5其他)
+	private String constructionSite;		// 建设地点
+	private String supervisionUnit;		// 监督单位
+	private String serviceClassification;		// 服务分类
+	private String fundAttribute;		// 资金属性
+	private String assetNature;		// 资产性质
+	private String tenderScope;		// 招标范围
+	private String onlineBidding;		// 是否网上招投标(0否,1是)
+	private String evaluationExpert;		// 是否录入评标专家(0否,1是)
+	private String priceCeiling;		// 最高限价(0否,1是)
+	private String bidPriceOrBidControlPrice;		// 标底或招标控制价(0否,1是)
+	private String bidPriceOrBidControlPriceMoney;		// 标底或招标控制价(元)
+	private String bidEvaluationOfficer;		// 评标委员会负责人
+	private String bidEvaluationStaff;		// 与评标活动有关工作人员
+	private String projectId;		// 项目主键
+	
+	public Projectgeneral() {
+		super();
+	}
+
+	public Projectgeneral(String id){
+		super(id);
+	}
+
+	@ExcelField(title="需求部门", align=2, sort=7)
+	public String getDemandDepartment() {
+		return demandDepartment;
+	}
+
+	public void setDemandDepartment(String demandDepartment) {
+		this.demandDepartment = demandDepartment;
+	}
+	
+	@ExcelField(title="工程类型(0机电、1房建、2市政、3交通、4政府采购、5其他)", dictType="", align=2, sort=8)
+	public String getProjectType() {
+		return projectType;
+	}
+
+	public void setProjectType(String projectType) {
+		this.projectType = projectType;
+	}
+	
+	@ExcelField(title="建设地点", align=2, sort=9)
+	public String getConstructionSite() {
+		return constructionSite;
+	}
+
+	public void setConstructionSite(String constructionSite) {
+		this.constructionSite = constructionSite;
+	}
+	
+	@ExcelField(title="监督单位", align=2, sort=10)
+	public String getSupervisionUnit() {
+		return supervisionUnit;
+	}
+
+	public void setSupervisionUnit(String supervisionUnit) {
+		this.supervisionUnit = supervisionUnit;
+	}
+	
+	@ExcelField(title="服务分类", align=2, sort=11)
+	public String getServiceClassification() {
+		return serviceClassification;
+	}
+
+	public void setServiceClassification(String serviceClassification) {
+		this.serviceClassification = serviceClassification;
+	}
+	
+	@ExcelField(title="资金属性", align=2, sort=12)
+	public String getFundAttribute() {
+		return fundAttribute;
+	}
+
+	public void setFundAttribute(String fundAttribute) {
+		this.fundAttribute = fundAttribute;
+	}
+	
+	@ExcelField(title="资产性质", align=2, sort=13)
+	public String getAssetNature() {
+		return assetNature;
+	}
+
+	public void setAssetNature(String assetNature) {
+		this.assetNature = assetNature;
+	}
+	
+	@ExcelField(title="招标范围", align=2, sort=14)
+	public String getTenderScope() {
+		return tenderScope;
+	}
+
+	public void setTenderScope(String tenderScope) {
+		this.tenderScope = tenderScope;
+	}
+	
+	@ExcelField(title="是否网上招投标(0否,1是)", dictType="", align=2, sort=15)
+	public String getOnlineBidding() {
+		return onlineBidding;
+	}
+
+	public void setOnlineBidding(String onlineBidding) {
+		this.onlineBidding = onlineBidding;
+	}
+	
+	@ExcelField(title="是否录入评标专家(0否,1是)", dictType="", align=2, sort=16)
+	public String getEvaluationExpert() {
+		return evaluationExpert;
+	}
+
+	public void setEvaluationExpert(String evaluationExpert) {
+		this.evaluationExpert = evaluationExpert;
+	}
+	
+	@ExcelField(title="最高限价(0否,1是)", dictType="", align=2, sort=17)
+	public String getPriceCeiling() {
+		return priceCeiling;
+	}
+
+	public void setPriceCeiling(String priceCeiling) {
+		this.priceCeiling = priceCeiling;
+	}
+	
+	@ExcelField(title="标底或招标控制价(0否,1是)", dictType="", align=2, sort=18)
+	public String getBidPriceOrBidControlPrice() {
+		return bidPriceOrBidControlPrice;
+	}
+
+	public void setBidPriceOrBidControlPrice(String bidPriceOrBidControlPrice) {
+		this.bidPriceOrBidControlPrice = bidPriceOrBidControlPrice;
+	}
+	
+	@ExcelField(title="标底或招标控制价(元)", align=2, sort=19)
+	public String getBidPriceOrBidControlPriceMoney() {
+		return bidPriceOrBidControlPriceMoney;
+	}
+
+	public void setBidPriceOrBidControlPriceMoney(String bidPriceOrBidControlPriceMoney) {
+		this.bidPriceOrBidControlPriceMoney = bidPriceOrBidControlPriceMoney;
+	}
+	
+	@ExcelField(title="评标委员会负责人", align=2, sort=20)
+	public String getBidEvaluationOfficer() {
+		return bidEvaluationOfficer;
+	}
+
+	public void setBidEvaluationOfficer(String bidEvaluationOfficer) {
+		this.bidEvaluationOfficer = bidEvaluationOfficer;
+	}
+	
+	@ExcelField(title="与评标活动有关工作人员", align=2, sort=21)
+	public String getBidEvaluationStaff() {
+		return bidEvaluationStaff;
+	}
+
+	public void setBidEvaluationStaff(String bidEvaluationStaff) {
+		this.bidEvaluationStaff = bidEvaluationStaff;
+	}
+	
+	@ExcelField(title="项目主键", align=2, sort=22)
+	public String getProjectId() {
+		return projectId;
+	}
+
+	public void setProjectId(String projectId) {
+		this.projectId = projectId;
+	}
+	
+}

+ 67 - 0
src/main/java/com/jeeplus/modules/project/entity/Workprojectgroup.java

@@ -0,0 +1,67 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.project.entity;
+
+
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+
+/**
+ * 项目组信息表Entity
+ * @author yangfan
+ * @version 2017-10-11
+ */
+public class Workprojectgroup extends DataEntity<Workprojectgroup> {
+	
+	private static final long serialVersionUID = 1L;
+	private String leader;		// 项目组负责人
+	private String memberIds;		// 项目组成员
+	private String listPreparation;		// 清单编制
+	private String projectId;		// 项目主键
+	
+	public Workprojectgroup() {
+		super();
+	}
+
+	public Workprojectgroup(String id){
+		super(id);
+	}
+
+	@ExcelField(title="项目组负责人", align=2, sort=7)
+	public String getLeader() {
+		return leader;
+	}
+
+	public void setLeader(String leader) {
+		this.leader = leader;
+	}
+	
+	@ExcelField(title="项目组成员", align=2, sort=8)
+	public String getMemberIds() {
+		return memberIds;
+	}
+
+	public void setMemberIds(String memberIds) {
+		this.memberIds = memberIds;
+	}
+	
+	@ExcelField(title="清单编制", align=2, sort=9)
+	public String getListPreparation() {
+		return listPreparation;
+	}
+
+	public void setListPreparation(String listPreparation) {
+		this.listPreparation = listPreparation;
+	}
+	
+	@ExcelField(title="项目主键", align=2, sort=10)
+	public String getProjectId() {
+		return projectId;
+	}
+
+	public void setProjectId(String projectId) {
+		this.projectId = projectId;
+	}
+	
+}

+ 56 - 0
src/main/java/com/jeeplus/modules/project/service/ArchivedirectoryService.java

@@ -0,0 +1,56 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.project.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.project.entity.Archivedirectory;
+import com.jeeplus.modules.project.dao.ArchivedirectoryDao;
+
+/**
+ * 归档目录Service
+ * @author 姚儒彬
+ * @version 2017-10-11
+ */
+@Service
+@Transactional(readOnly = true)
+public class ArchivedirectoryService extends CrudService<ArchivedirectoryDao, Archivedirectory> {
+
+	public Archivedirectory get(String id) {
+		return super.get(id);
+	}
+
+	public List<Archivedirectory> findList(Archivedirectory archivedirectory) {
+		return super.findList(archivedirectory);
+	}
+	
+	public Page<Archivedirectory> findPage(Page<Archivedirectory> page, Archivedirectory archivedirectory) {
+		return super.findPage(page, archivedirectory);
+	}
+	
+	@Transactional(readOnly = false)
+	public void save(Archivedirectory archivedirectory) {
+		super.save(archivedirectory);
+	}
+	
+	@Transactional(readOnly = false)
+	public void delete(Archivedirectory archivedirectory) {
+		super.delete(archivedirectory);
+	}
+
+	@Autowired
+	private ArchivedirectoryDao archivedirectoryDao;
+
+	public List<Archivedirectory> getbidInformationById(String id) {
+		return archivedirectoryDao.getbidInformationById(id);
+	}
+
+	
+}

+ 50 - 0
src/main/java/com/jeeplus/modules/project/service/BidInformationService.java

@@ -0,0 +1,50 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.project.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.project.entity.BidInformation;
+import com.jeeplus.modules.project.dao.BidInformationDao;
+
+/**
+ * 标段信息Service
+ * @author 姚儒彬
+ * @version 2017-10-11
+ */
+@Service
+@Transactional(readOnly = true)
+public class BidInformationService extends CrudService<BidInformationDao, BidInformation> {
+
+	public BidInformation get(String id) {
+		return super.get(id);
+	}
+	
+	public List<BidInformation> findList(BidInformation bidInformation) {
+		return super.findList(bidInformation);
+	}
+	
+	public Page<BidInformation> findPage(Page<BidInformation> page, BidInformation bidInformation) {
+		return super.findPage(page, bidInformation);
+	}
+	
+	@Transactional(readOnly = false)
+	public void save(BidInformation bidInformation) {
+		super.save(bidInformation);
+	}
+	
+	@Transactional(readOnly = false)
+	public void delete(BidInformation bidInformation) {
+		super.delete(bidInformation);
+	}
+	
+	
+	
+	
+}

+ 115 - 0
src/main/java/com/jeeplus/modules/project/service/ProjectDepositManagementService.java

@@ -0,0 +1,115 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.project.service;
+
+import java.util.List;
+import java.util.Map;
+
+import com.google.common.collect.Maps;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.modules.act.service.ActTaskService;
+import com.jeeplus.modules.act.utils.ActUtils;
+import com.jeeplus.modules.oa.entity.Leave;
+import com.jeeplus.modules.sys.dao.UserDao;
+import com.jeeplus.modules.workapprovalcopy.service.ApprovalCopyService;
+import org.activiti.engine.*;
+import org.activiti.engine.runtime.ProcessInstance;
+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.project.entity.ProjectDepositManagement;
+import com.jeeplus.modules.project.dao.ProjectDepositManagementDao;
+
+/**
+ * 保证金管理Service
+ * @author yangfan
+ * @version 2017-10-11
+ */
+@Service
+@Transactional(readOnly = true)
+public class ProjectDepositManagementService extends CrudService<ProjectDepositManagementDao, ProjectDepositManagement> {
+	@Autowired
+	private ProjectDepositManagementDao projectDepositManagementDao;
+	@Autowired
+	private RuntimeService runtimeService;
+	@Autowired
+	protected TaskService taskService;
+	@Autowired
+	protected HistoryService historyService;
+	@Autowired
+	protected RepositoryService repositoryService;
+	@Autowired
+	private IdentityService identityService;
+	@Autowired
+	private UserDao userDao;
+	@Autowired
+	private ApprovalCopyService approvalCopyService;
+
+	@Autowired
+	private ActTaskService actTaskService;
+
+	public ProjectDepositManagement get(String id) {
+		return super.get(id);
+	}
+	
+	public List<ProjectDepositManagement> findList(ProjectDepositManagement projectDepositManagement) {
+		return super.findList(projectDepositManagement);
+	}
+	
+	public Page<ProjectDepositManagement> findPage(Page<ProjectDepositManagement> page, ProjectDepositManagement projectDepositManagement) {
+		projectDepositManagement.setPage(page);
+		List<ProjectDepositManagement> list = dao.findList(projectDepositManagement);
+		page.setList(list);
+		return page;
+	}
+
+	/**
+	 * 启动流程
+	 * @param
+	 */
+	@Transactional(readOnly = false)
+	public void startProcessInstanceByKey(ProjectDepositManagement projectDepositManagement, Map<String, Object> variables) {
+		// 用来设置启动流程的人员ID,引擎会自动把用户ID保存到activiti:initiator中
+		identityService.setAuthenticatedUserId(projectDepositManagement.getCurrentUser().getId());
+		// 启动流程
+		String businessKey = projectDepositManagement.getId().toString();
+		variables.put("type", "deposit");
+		variables.put("busId", businessKey);
+		variables.put("title", projectDepositManagement.getRemarks());//设置标题;
+		ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(ActUtils.PD_DEPOSIT[0], businessKey, variables);
+		projectDepositManagement.setProcessInstance(processInstance);
+		// 更新流程实例ID
+		projectDepositManagement.setProcessInstanceId(processInstance.getId());
+		projectDepositManagementDao.updateProcessInstanceId(projectDepositManagement);
+		projectDepositManagement.setStatus("2");
+		projectDepositManagement.preUpdate();
+		projectDepositManagementDao.update(projectDepositManagement);
+	}
+	
+	@Transactional(readOnly = false)
+	public void save(ProjectDepositManagement projectDepositManagement) {
+		super.save(projectDepositManagement);
+	}
+	
+	@Transactional(readOnly = false)
+	public void delete(ProjectDepositManagement projectDepositManagement) {
+		super.delete(projectDepositManagement);
+	}
+
+	/**
+	 * 获取流程详细Leave
+	 * @param processInstanceId
+	 */
+	@SuppressWarnings("unchecked")
+	public ProjectDepositManagement getByProcessInstanceId(String processInstanceId) {
+		ProjectDepositManagement projectDepositManagement = projectDepositManagementDao.getByProcessInstanceId(processInstanceId);
+		return projectDepositManagement;
+	}
+	
+	
+	
+}

+ 50 - 0
src/main/java/com/jeeplus/modules/project/service/ProjectEvaluationRecordService.java

@@ -0,0 +1,50 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.project.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.project.entity.ProjectEvaluationRecord;
+import com.jeeplus.modules.project.dao.ProjectEvaluationRecordDao;
+
+/**
+ * 招标代理评价记录表Service
+ * @author liuw
+ * @version 2017-10-12
+ */
+@Service
+@Transactional(readOnly = true)
+public class ProjectEvaluationRecordService extends CrudService<ProjectEvaluationRecordDao, ProjectEvaluationRecord> {
+
+	public ProjectEvaluationRecord get(String id) {
+		return super.get(id);
+	}
+	
+	public List<ProjectEvaluationRecord> findList(ProjectEvaluationRecord projectEvaluationRecord) {
+		return super.findList(projectEvaluationRecord);
+	}
+	
+	public Page<ProjectEvaluationRecord> findPage(Page<ProjectEvaluationRecord> page, ProjectEvaluationRecord projectEvaluationRecord) {
+		return super.findPage(page, projectEvaluationRecord);
+	}
+	
+	@Transactional(readOnly = false)
+	public void save(ProjectEvaluationRecord projectEvaluationRecord) {
+		super.save(projectEvaluationRecord);
+	}
+	
+	@Transactional(readOnly = false)
+	public void delete(ProjectEvaluationRecord projectEvaluationRecord) {
+		super.delete(projectEvaluationRecord);
+	}
+	
+	
+	
+	
+}

+ 85 - 0
src/main/java/com/jeeplus/modules/project/service/ProjectService.java

@@ -0,0 +1,85 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.project.service;
+
+import java.util.List;
+
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.jeeplus.modules.workclientinfo.entity.WorkClientLinkman;
+import com.jeeplus.modules.workcontractinfo.entity.WorkContractInfo;
+import com.jeeplus.modules.project.entity.Projectgeneral;
+import com.jeeplus.modules.project.entity.ProjectEvaluationRecord;
+import com.jeeplus.modules.project.entity.Workprojectgroup;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.service.CrudService;
+import com.jeeplus.modules.project.entity.Project;
+import com.jeeplus.modules.project.dao.ProjectDao;
+
+/**
+ * 项目表Service
+ * @author fgy
+ * @version 2017-10-12
+ */
+@Service
+@Transactional(readOnly = true)
+public class ProjectService extends CrudService<ProjectDao, Project> {
+
+	public Project get(String id) {
+		return super.get(id);
+	}
+	
+	public List<Project> findList(Project project) {
+		return super.findList(project);
+	}
+	
+	public Page<Project> findPage(Page<Project> page, Project project) {
+		return super.findPage(page, project);
+	}
+	
+	@Transactional(readOnly = false)
+	public void save(Project project) {
+		super.save(project);
+	}
+	
+	@Transactional(readOnly = false)
+	public void delete(Project project) {
+		super.delete(project);
+	}
+	
+	public Page<WorkClientLinkman> findPageByentrustCompany(Page<WorkClientLinkman> page, WorkClientLinkman entrustCompany) {
+		entrustCompany.setPage(page);
+		page.setList(dao.findListByentrustCompany(entrustCompany));
+		return page;
+	}
+	public Page<WorkContractInfo> findPageBycontractInfo(Page<WorkContractInfo> page, WorkContractInfo contractInfo) {
+		contractInfo.setPage(page);
+		page.setList(dao.findListBycontractInfo(contractInfo));
+		return page;
+	}
+	public Page<Projectgeneral> findPageByprojectGeneral(Page<Projectgeneral> page, Projectgeneral projectGeneral) {
+		projectGeneral.setPage(page);
+		page.setList(dao.findListByprojectGeneral(projectGeneral));
+		return page;
+	}
+	public Page<WorkClientLinkman> findPageByworkClientLinkman(Page<WorkClientLinkman> page, WorkClientLinkman workClientLinkman) {
+		workClientLinkman.setPage(page);
+		page.setList(dao.findListByworkClientLinkman(workClientLinkman));
+		return page;
+	}
+	public Page<ProjectEvaluationRecord> findPageByprojectEvaluationRecord(Page<ProjectEvaluationRecord> page, ProjectEvaluationRecord projectEvaluationRecord) {
+		projectEvaluationRecord.setPage(page);
+		page.setList(dao.findListByprojectEvaluationRecord(projectEvaluationRecord));
+		return page;
+	}
+	public Page<Workprojectgroup> findPageByworkprojectgroup(Page<Workprojectgroup> page, Workprojectgroup workprojectgroup) {
+		workprojectgroup.setPage(page);
+		page.setList(dao.findListByworkprojectgroup(workprojectgroup));
+		return page;
+	}
+	
+	
+	
+}

+ 50 - 0
src/main/java/com/jeeplus/modules/project/service/ProjectgeneralService.java

@@ -0,0 +1,50 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.project.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.project.entity.Projectgeneral;
+import com.jeeplus.modules.project.dao.ProjectgeneralDao;
+
+/**
+ * 项目概况Service
+ * @author 姚儒彬
+ * @version 2017-10-11
+ */
+@Service
+@Transactional(readOnly = true)
+public class ProjectgeneralService extends CrudService<ProjectgeneralDao, Projectgeneral> {
+
+	public Projectgeneral get(String id) {
+		return super.get(id);
+	}
+	
+	public List<Projectgeneral> findList(Projectgeneral projectgeneral) {
+		return super.findList(projectgeneral);
+	}
+	
+	public Page<Projectgeneral> findPage(Page<Projectgeneral> page, Projectgeneral projectgeneral) {
+		return super.findPage(page, projectgeneral);
+	}
+	
+	@Transactional(readOnly = false)
+	public void save(Projectgeneral projectgeneral) {
+		super.save(projectgeneral);
+	}
+	
+	@Transactional(readOnly = false)
+	public void delete(Projectgeneral projectgeneral) {
+		super.delete(projectgeneral);
+	}
+	
+	
+	
+	
+}

+ 50 - 0
src/main/java/com/jeeplus/modules/project/service/WorkprojectgroupService.java

@@ -0,0 +1,50 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.project.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.project.entity.Workprojectgroup;
+import com.jeeplus.modules.project.dao.WorkprojectgroupDao;
+
+/**
+ * 项目组信息表Service
+ * @author yangfan
+ * @version 2017-10-11
+ */
+@Service
+@Transactional(readOnly = true)
+public class WorkprojectgroupService extends CrudService<WorkprojectgroupDao, Workprojectgroup> {
+
+	public Workprojectgroup get(String id) {
+		return super.get(id);
+	}
+	
+	public List<Workprojectgroup> findList(Workprojectgroup workprojectgroup) {
+		return super.findList(workprojectgroup);
+	}
+	
+	public Page<Workprojectgroup> findPage(Page<Workprojectgroup> page, Workprojectgroup workprojectgroup) {
+		return super.findPage(page, workprojectgroup);
+	}
+	
+	@Transactional(readOnly = false)
+	public void save(Workprojectgroup workprojectgroup) {
+		super.save(workprojectgroup);
+	}
+	
+	@Transactional(readOnly = false)
+	public void delete(Workprojectgroup workprojectgroup) {
+		super.delete(workprojectgroup);
+	}
+	
+	
+	
+	
+}

+ 202 - 0
src/main/java/com/jeeplus/modules/project/web/ArchivedirectoryController.java

@@ -0,0 +1,202 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.project.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.project.entity.Archivedirectory;
+import com.jeeplus.modules.project.service.ArchivedirectoryService;
+
+/**
+ * 归档目录Controller
+ * @author 姚儒彬
+ * @version 2017-10-11
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/project/archivedirectory")
+public class ArchivedirectoryController extends BaseController {
+
+	@Autowired
+	private ArchivedirectoryService archivedirectoryService;
+	
+	@ModelAttribute
+	public Archivedirectory get(@RequestParam(required=false) String id) {
+		Archivedirectory entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = archivedirectoryService.get(id);
+		}
+		if (entity == null){
+			entity = new Archivedirectory();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 归档目录列表页面
+	 */
+	@RequiresPermissions("project:archivedirectory:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(Archivedirectory archivedirectory, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<Archivedirectory> page = archivedirectoryService.findPage(new Page<Archivedirectory>(request, response), archivedirectory); 
+		model.addAttribute("page", page);
+		return "modules/project/archivedirectoryList";
+	}
+
+	/**
+	 * 查看,增加,编辑归档目录表单页面
+	 */
+	@RequiresPermissions(value={"project:archivedirectory:view","project:archivedirectory:add","project:archivedirectory:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(Archivedirectory archivedirectory, Model model,String bidInformationId) {
+		archivedirectory.setBidInformationId(bidInformationId);
+		model.addAttribute("archivedirectory", archivedirectory);
+		return "modules/project/archivedirectoryForm";
+	}
+
+	/**
+	 * 查看归档目录表单页面
+	 */
+	@RequiresPermissions(value={"project:archivedirectory:view"},logical=Logical.OR)
+	@RequestMapping(value = "forms")
+	public String forms(Archivedirectory archivedirectory, Model model,String bidInformationId) {
+		archivedirectory.setBidInformationId(bidInformationId);
+		model.addAttribute("archivedirectory", archivedirectory);
+		return "modules/project/archivedirectoryForms";
+	}
+
+	/**
+	 * 保存归档目录
+	 */
+	@RequiresPermissions(value={"project:archivedirectory:add","project:archivedirectory:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	public String save(Archivedirectory archivedirectory, Model model, RedirectAttributes redirectAttributes) throws Exception{
+		if (!beanValidator(model, archivedirectory)){
+			return form(archivedirectory, model,"");
+		}
+		archivedirectoryService.save(archivedirectory);//保存
+		addMessage(redirectAttributes, "保存归档目录成功");
+		return "redirect:"+Global.getAdminPath()+"/project/archivedirectory/?repage";
+	}
+	
+	/**
+	 * 删除归档目录
+	 */
+	@RequiresPermissions("project:archivedirectory:del")
+	@RequestMapping(value = "delete")
+	public String delete(Archivedirectory archivedirectory, RedirectAttributes redirectAttributes) {
+		archivedirectoryService.delete(archivedirectory);
+		addMessage(redirectAttributes, "删除归档目录成功");
+		return "redirect:"+Global.getAdminPath()+"/project/archivedirectory/?repage";
+	}
+	
+	/**
+	 * 批量删除归档目录
+	 */
+	@RequiresPermissions("project:archivedirectory:del")
+	@RequestMapping(value = "deleteAll")
+	public String deleteAll(String ids, RedirectAttributes redirectAttributes) {
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			archivedirectoryService.delete(archivedirectoryService.get(id));
+		}
+		addMessage(redirectAttributes, "删除归档目录成功");
+		return "redirect:"+Global.getAdminPath()+"/project/archivedirectory/?repage";
+	}
+	
+	/**
+	 * 导出excel文件
+	 */
+	@RequiresPermissions("project:archivedirectory:export")
+    @RequestMapping(value = "export", method=RequestMethod.POST)
+    public String exportFile(Archivedirectory archivedirectory, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "归档目录"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            Page<Archivedirectory> page = archivedirectoryService.findPage(new Page<Archivedirectory>(request, response, -1), archivedirectory);
+    		new ExportExcel("归档目录", Archivedirectory.class).setDataList(page.getList()).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导出归档目录记录失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/project/archivedirectory/?repage";
+    }
+
+	/**
+	 * 导入Excel数据
+
+	 */
+	@RequiresPermissions("project:archivedirectory: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<Archivedirectory> list = ei.getDataList(Archivedirectory.class);
+			for (Archivedirectory archivedirectory : list){
+				try{
+					archivedirectoryService.save(archivedirectory);
+					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()+"/project/archivedirectory/?repage";
+    }
+	
+	/**
+	 * 下载导入归档目录数据模板
+	 */
+	@RequiresPermissions("project:archivedirectory:import")
+    @RequestMapping(value = "import/template")
+    public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "归档目录数据导入模板.xlsx";
+    		List<Archivedirectory> list = Lists.newArrayList(); 
+    		new ExportExcel("归档目录数据", Archivedirectory.class, 1).setDataList(list).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入模板下载失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/project/archivedirectory/?repage";
+    }
+	
+	
+	
+
+}

+ 223 - 0
src/main/java/com/jeeplus/modules/project/web/BidInformationController.java

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

+ 395 - 0
src/main/java/com/jeeplus/modules/project/web/ProjectController.java

@@ -0,0 +1,395 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.project.web;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.ConstraintViolationException;
+
+import com.jeeplus.modules.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.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import com.jeeplus.modules.workclientinfo.entity.WorkClientLinkman;
+import com.jeeplus.modules.workcontractinfo.entity.WorkContractInfo;
+import com.jeeplus.modules.project.entity.Projectgeneral;
+import com.jeeplus.modules.project.entity.ProjectEvaluationRecord;
+import com.jeeplus.modules.project.entity.Workprojectgroup;
+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.project.entity.Project;
+import com.jeeplus.modules.project.service.ProjectService;
+
+/**
+ * 项目表Controller
+ * @author fgy
+ * @version 2017-10-12
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/project/project")
+public class ProjectController extends BaseController {
+
+	@Autowired
+	private WorkContractInfoService workContractInfoService;
+	@Autowired
+	private ProjectService projectService;
+	
+	@ModelAttribute
+	public Project get(@RequestParam(required=false) String id) {
+		Project entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = projectService.get(id);
+		}
+		if (entity == null){
+			entity = new Project();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 项目列表页面
+	 */
+	@RequiresPermissions("project:project:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(Project project, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<Project> page = projectService.findPage(new Page<Project>(request, response), project); 
+		model.addAttribute("page", page);
+		return "modules/project/projectList";
+	}
+
+	/**
+	 * 查看,增加,编辑项目表单页面
+	 */
+	@RequiresPermissions(value={"project:project:view","project:project:add","project:project:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(Project project, Model model,@RequestParam(value = "readAttr",required = false)String readAttr) {
+		model.addAttribute("disabled",readAttr==null||"".equals(readAttr)?"":"disabled");
+		model.addAttribute("project", project);
+		return "modules/project/projectForm";
+	}
+
+	/**
+	 * 保存项目
+	 */
+	@RequiresPermissions(value={"project:project:add","project:project:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	public String save(Project project, Model model, RedirectAttributes redirectAttributes) throws Exception{
+		if (!beanValidator(model, project)){
+			return form(project, model,"");
+		}
+		if(!project.getIsNewRecord()){//编辑表单保存
+			Project t = projectService.get(project.getId());//从数据库取出记录的值
+			MyBeanUtils.copyBeanNotNull2Bean(project, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+			projectService.save(t);//保存
+		}else{//新增表单保存
+			projectService.save(project);//保存
+		}
+		addMessage(redirectAttributes, "保存项目成功");
+		return "redirect:"+Global.getAdminPath()+"/project/project/?repage";
+	}
+	
+	/**
+	 * 删除项目
+	 */
+	@RequiresPermissions("project:project:del")
+	@RequestMapping(value = "delete")
+	public String delete(Project project, RedirectAttributes redirectAttributes) {
+		projectService.delete(project);
+		addMessage(redirectAttributes, "删除项目成功");
+		return "redirect:"+Global.getAdminPath()+"/project/project/?repage";
+	}
+	
+	/**
+	 * 批量删除项目
+	 */
+	@RequiresPermissions("project:project:del")
+	@RequestMapping(value = "deleteAll")
+	public String deleteAll(String ids, RedirectAttributes redirectAttributes) {
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			projectService.delete(projectService.get(id));
+		}
+		addMessage(redirectAttributes, "删除项目成功");
+		return "redirect:"+Global.getAdminPath()+"/project/project/?repage";
+	}
+
+	/**
+	 * 选择项目
+	 */
+	@RequestMapping(value = "selectProject")
+	public String selectbiddingCompany(Project project, String url, String fieldLabels, String fieldKeys, String searchLabel, String searchKey, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<Project> page = projectService.findPage(new Page<Project>(request, response),  project);
+		try {
+			fieldLabels = URLDecoder.decode(fieldLabels, "UTF-8");
+			fieldKeys = URLDecoder.decode(fieldKeys, "UTF-8");
+			searchLabel = URLDecoder.decode(searchLabel, "UTF-8");
+			searchKey = URLDecoder.decode(searchKey, "UTF-8");
+		} catch (UnsupportedEncodingException e) {
+			e.printStackTrace();
+		}
+		model.addAttribute("labelNames", fieldLabels.split("\\|"));
+		model.addAttribute("labelValues", fieldKeys.split("\\|"));
+		model.addAttribute("fieldLabels", fieldLabels);
+		model.addAttribute("fieldKeys", fieldKeys);
+		model.addAttribute("url", url);
+		model.addAttribute("searchLabel", searchLabel);
+		model.addAttribute("searchKey", searchKey);
+		model.addAttribute("obj", project);
+		model.addAttribute("page", page);
+		return "modules/sys/gridselectproject";
+	}
+
+	/**
+	 * 导出excel文件
+	 */
+	@RequiresPermissions("project:project:export")
+    @RequestMapping(value = "export", method=RequestMethod.POST)
+    public String exportFile(Project project, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "项目"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            Page<Project> page = projectService.findPage(new Page<Project>(request, response, -1), project);
+    		new ExportExcel("项目", Project.class).setDataList(page.getList()).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导出项目记录失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/project/project/?repage";
+    }
+
+	/**
+	 * 导入Excel数据
+
+	 */
+	@RequiresPermissions("project:project: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<Project> list = ei.getDataList(Project.class);
+			for (Project project : list){
+				try{
+					projectService.save(project);
+					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()+"/project/project/?repage";
+    }
+	
+	/**
+	 * 下载导入项目数据模板
+	 */
+	@RequiresPermissions("project:project:import")
+    @RequestMapping(value = "import/template")
+    public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "项目数据导入模板.xlsx";
+    		List<Project> list = Lists.newArrayList(); 
+    		new ExportExcel("项目数据", Project.class, 1).setDataList(list).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入模板下载失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/project/project/?repage";
+    }
+	
+	
+	/**
+	 * 选择委托单位
+	 */
+	@RequestMapping(value = "selectentrustCompany")
+	public String selectentrustCompany(WorkClientLinkman entrustCompany, String url, String fieldLabels, String fieldKeys, String searchLabel, String searchKey, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<WorkClientLinkman> page = projectService.findPageByentrustCompany(new Page<WorkClientLinkman>(request, response),  entrustCompany);
+		try {
+			fieldLabels = URLDecoder.decode(fieldLabels, "UTF-8");
+			fieldKeys = URLDecoder.decode(fieldKeys, "UTF-8");
+			searchLabel = URLDecoder.decode(searchLabel, "UTF-8");
+			searchKey = URLDecoder.decode(searchKey, "UTF-8");
+		} catch (UnsupportedEncodingException e) {
+			e.printStackTrace();
+		}
+		model.addAttribute("labelNames", fieldLabels.split("\\|"));
+		model.addAttribute("labelValues", fieldKeys.split("\\|"));
+		model.addAttribute("fieldLabels", fieldLabels);
+		model.addAttribute("fieldKeys", fieldKeys);
+		model.addAttribute("url", url);
+		model.addAttribute("searchLabel", searchLabel);
+		model.addAttribute("searchKey", searchKey);
+		model.addAttribute("obj", entrustCompany);
+		model.addAttribute("page", page);
+		return "modules/sys/gridselectproject";
+	}
+	/**
+	 * 选择合同信息
+	 */
+	@RequestMapping(value = "selectcontractInfo")
+	public String selectcontractInfo(WorkContractInfo contractInfo, String url, String fieldLabels, String fieldKeys, String searchLabel, String searchKey, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<WorkContractInfo> page = projectService.findPageBycontractInfo(new Page<WorkContractInfo>(request, response),  contractInfo);
+		try {
+			fieldLabels = URLDecoder.decode(fieldLabels, "UTF-8");
+			fieldKeys = URLDecoder.decode(fieldKeys, "UTF-8");
+			searchLabel = URLDecoder.decode(searchLabel, "UTF-8");
+			searchKey = URLDecoder.decode(searchKey, "UTF-8");
+		} catch (UnsupportedEncodingException e) {
+			e.printStackTrace();
+		}
+		model.addAttribute("labelNames", fieldLabels.split("\\|"));
+		model.addAttribute("labelValues", fieldKeys.split("\\|"));
+		model.addAttribute("fieldLabels", fieldLabels);
+		model.addAttribute("fieldKeys", fieldKeys);
+		model.addAttribute("url", url);
+		model.addAttribute("searchLabel", searchLabel);
+		model.addAttribute("searchKey", searchKey);
+		model.addAttribute("obj", contractInfo);
+		model.addAttribute("page", page);
+		return "modules/sys/project_contractSelect";
+	}
+
+	/**
+	 * 根据 合同信息 的id,查询该条合同的具体数据
+	 * @param contractInfoId
+	 * @return
+	 */
+	@RequestMapping("/getSelectedContractInfoById")
+	public String getSelectedContractInfoById(String contractInfoId,Model model){
+		WorkContractInfo workContractInfo = workContractInfoService.get(contractInfoId);
+		model.addAttribute("selectedContractInfoId",workContractInfo.getId()) ;
+		return "modules/project/projectForm";
+	}
+	/**
+	 * 选择项目概况
+	 */
+	@RequestMapping(value = "selectprojectGeneral")
+	public String selectprojectGeneral(Projectgeneral projectGeneral, String url, String fieldLabels, String fieldKeys, String searchLabel, String searchKey, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<Projectgeneral> page = projectService.findPageByprojectGeneral(new Page<Projectgeneral>(request, response),  projectGeneral);
+		try {
+			fieldLabels = URLDecoder.decode(fieldLabels, "UTF-8");
+			fieldKeys = URLDecoder.decode(fieldKeys, "UTF-8");
+			searchLabel = URLDecoder.decode(searchLabel, "UTF-8");
+			searchKey = URLDecoder.decode(searchKey, "UTF-8");
+		} catch (UnsupportedEncodingException e) {
+			e.printStackTrace();
+		}
+		model.addAttribute("labelNames", fieldLabels.split("\\|"));
+		model.addAttribute("labelValues", fieldKeys.split("\\|"));
+		model.addAttribute("fieldLabels", fieldLabels);
+		model.addAttribute("fieldKeys", fieldKeys);
+		model.addAttribute("url", url);
+		model.addAttribute("searchLabel", searchLabel);
+		model.addAttribute("searchKey", searchKey);
+		model.addAttribute("obj", projectGeneral);
+		model.addAttribute("page", page);
+		return "modules/sys/gridselect";
+	}
+	/**
+	 * 选择投标单位
+	 */
+	@RequestMapping(value = "selectworkClientLinkman")
+	public String selectworkClientLinkman(WorkClientLinkman workClientLinkman, String url, String fieldLabels, String fieldKeys, String searchLabel, String searchKey, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<WorkClientLinkman> page = projectService.findPageByworkClientLinkman(new Page<WorkClientLinkman>(request, response),  workClientLinkman);
+		try {
+			fieldLabels = URLDecoder.decode(fieldLabels, "UTF-8");
+			fieldKeys = URLDecoder.decode(fieldKeys, "UTF-8");
+			searchLabel = URLDecoder.decode(searchLabel, "UTF-8");
+			searchKey = URLDecoder.decode(searchKey, "UTF-8");
+		} catch (UnsupportedEncodingException e) {
+			e.printStackTrace();
+		}
+		model.addAttribute("labelNames", fieldLabels.split("\\|"));
+		model.addAttribute("labelValues", fieldKeys.split("\\|"));
+		model.addAttribute("fieldLabels", fieldLabels);
+		model.addAttribute("fieldKeys", fieldKeys);
+		model.addAttribute("url", url);
+		model.addAttribute("searchLabel", searchLabel);
+		model.addAttribute("searchKey", searchKey);
+		model.addAttribute("obj", workClientLinkman);
+		model.addAttribute("page", page);
+		return "modules/sys/gridselect";
+	}
+	/**
+	 * 选择评标记录
+	 */
+	@RequestMapping(value = "selectprojectEvaluationRecord")
+	public String selectprojectEvaluationRecord(ProjectEvaluationRecord projectEvaluationRecord, String url, String fieldLabels, String fieldKeys, String searchLabel, String searchKey, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<ProjectEvaluationRecord> page = projectService.findPageByprojectEvaluationRecord(new Page<ProjectEvaluationRecord>(request, response),  projectEvaluationRecord);
+		try {
+			fieldLabels = URLDecoder.decode(fieldLabels, "UTF-8");
+			fieldKeys = URLDecoder.decode(fieldKeys, "UTF-8");
+			searchLabel = URLDecoder.decode(searchLabel, "UTF-8");
+			searchKey = URLDecoder.decode(searchKey, "UTF-8");
+		} catch (UnsupportedEncodingException e) {
+			e.printStackTrace();
+		}
+		model.addAttribute("labelNames", fieldLabels.split("\\|"));
+		model.addAttribute("labelValues", fieldKeys.split("\\|"));
+		model.addAttribute("fieldLabels", fieldLabels);
+		model.addAttribute("fieldKeys", fieldKeys);
+		model.addAttribute("url", url);
+		model.addAttribute("searchLabel", searchLabel);
+		model.addAttribute("searchKey", searchKey);
+		model.addAttribute("obj", projectEvaluationRecord);
+		model.addAttribute("page", page);
+		return "modules/sys/gridselect";
+	}
+	/**
+	 * 选择项目组信息
+	 */
+	@RequestMapping(value = "selectworkprojectgroup")
+	public String selectworkprojectgroup(Workprojectgroup workprojectgroup, String url, String fieldLabels, String fieldKeys, String searchLabel, String searchKey, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<Workprojectgroup> page = projectService.findPageByworkprojectgroup(new Page<Workprojectgroup>(request, response),  workprojectgroup);
+		try {
+			fieldLabels = URLDecoder.decode(fieldLabels, "UTF-8");
+			fieldKeys = URLDecoder.decode(fieldKeys, "UTF-8");
+			searchLabel = URLDecoder.decode(searchLabel, "UTF-8");
+			searchKey = URLDecoder.decode(searchKey, "UTF-8");
+		} catch (UnsupportedEncodingException e) {
+			e.printStackTrace();
+		}
+		model.addAttribute("labelNames", fieldLabels.split("\\|"));
+		model.addAttribute("labelValues", fieldKeys.split("\\|"));
+		model.addAttribute("fieldLabels", fieldLabels);
+		model.addAttribute("fieldKeys", fieldKeys);
+		model.addAttribute("url", url);
+		model.addAttribute("searchLabel", searchLabel);
+		model.addAttribute("searchKey", searchKey);
+		model.addAttribute("obj", workprojectgroup);
+		model.addAttribute("page", page);
+		return "modules/sys/gridselect";
+	}
+	
+
+}

+ 236 - 0
src/main/java/com/jeeplus/modules/project/web/ProjectDepositManagementController.java

@@ -0,0 +1,236 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.project.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 com.google.common.collect.Maps;
+import com.jeeplus.modules.sys.entity.Office;
+import com.jeeplus.modules.sys.entity.Role;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import org.apache.shiro.authz.annotation.Logical;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.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.project.entity.ProjectDepositManagement;
+import com.jeeplus.modules.project.service.ProjectDepositManagementService;
+
+/**
+ * 保证金管理Controller
+ * @author yangfan
+ * @version 2017-10-11
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/project/projectDepositManagement")
+public class ProjectDepositManagementController extends BaseController {
+
+	@Autowired
+	private ProjectDepositManagementService projectDepositManagementService;
+	
+	@ModelAttribute
+	public ProjectDepositManagement get(@RequestParam(required=false) String id) {
+		ProjectDepositManagement entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = projectDepositManagementService.get(id);
+		}
+		if (entity == null){
+			entity = new ProjectDepositManagement();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 保证金管理列表页面
+	 */
+	@RequiresPermissions("project:projectDepositManagement:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(ProjectDepositManagement projectDepositManagement, HttpServletRequest request, HttpServletResponse response, Model model) {
+		//projectDepositManagement.setStatus("123");
+		Page<ProjectDepositManagement> page = projectDepositManagementService.findPage(new Page<ProjectDepositManagement>(request, response), projectDepositManagement);
+		model.addAttribute("page", page);
+		ProjectDepositManagement pro = new ProjectDepositManagement();
+		if (page.getList()!=null && page.getList().size()>0){
+			pro = page.getList().get(0);
+		}
+		model.addAttribute("userId", pro==null||pro.getCreateBy()==null?"":pro.getCreateBy().getId());
+		Role role = UserUtils.getSelectRole().get(0);
+
+		model.addAttribute("role", role);
+		return "modules/project/projectDepositManagementList";
+	}
+
+	/**
+	 * 查看,增加,编辑保证金管理表单页面
+	 */
+	@RequiresPermissions(value={"project:projectDepositManagement:view","project:projectDepositManagement:add","project:projectDepositManagement:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(ProjectDepositManagement projectDepositManagement, Model model) {
+		if(StringUtils.isNotBlank(projectDepositManagement.getName()) && projectDepositManagement.getName().equals("view")){
+			model.addAttribute("disabled","disabled");
+			model.addAttribute("status","view");
+		}else if(StringUtils.isNotBlank(projectDepositManagement.getName()) && projectDepositManagement.getName().equals("edit")){
+			model.addAttribute("disabled","disabled");
+			model.addAttribute("status","edit");
+		}
+		model.addAttribute("projectDepositManagement", projectDepositManagement);
+		return "modules/project/projectDepositManagementForm";
+	}
+
+	/**
+	 * 查看,增加,编辑保证金管理表单页面
+	 */
+	@RequestMapping(value = "formArrival")
+	public String formArrival(ProjectDepositManagement projectDepositManagement, Model model, RedirectAttributes redirectAttributes) {
+		model.addAttribute("projectDepositManagement", projectDepositManagement);
+		Map<String, Object> variables = Maps.newHashMap();
+		Role role = UserUtils.getSelectRole().get(0);
+		StringBuffer buffer = DateUtils.getByEnnme(role.getEnname());
+		buffer.append("cw");
+		variables.put("enname",buffer.toString());
+		projectDepositManagementService.startProcessInstanceByKey(projectDepositManagement,variables);
+		addMessage(redirectAttributes, "保证金到账确认成功");
+		return "redirect:"+Global.getAdminPath()+"/project/projectDepositManagement/?repage";
+	}
+
+	/**
+	 * 保存保证金管理
+	 */
+	@RequiresPermissions(value={"project:projectDepositManagement:add","project:projectDepositManagement:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	public String save(ProjectDepositManagement projectDepositManagement, Model model, RedirectAttributes redirectAttributes) throws Exception{
+		if (!beanValidator(model, projectDepositManagement)){
+			return form(projectDepositManagement, model);
+		}
+		if(!projectDepositManagement.getIsNewRecord()){//编辑表单保存
+			ProjectDepositManagement t = projectDepositManagementService.get(projectDepositManagement.getId());//从数据库取出记录的值
+			MyBeanUtils.copyBeanNotNull2Bean(projectDepositManagement, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+			projectDepositManagementService.save(t);//保存
+		}else{//新增表单保存
+			projectDepositManagement.setStatus("1");
+			projectDepositManagementService.save(projectDepositManagement);//保存
+		}
+		addMessage(redirectAttributes, "保存保证金管理成功");
+		return "redirect:"+Global.getAdminPath()+"/project/projectDepositManagement/?repage";
+	}
+	
+	/**
+	 * 删除保证金管理
+	 */
+	@RequiresPermissions("project:projectDepositManagement:del")
+	@RequestMapping(value = "delete")
+	public String delete(ProjectDepositManagement projectDepositManagement, RedirectAttributes redirectAttributes) {
+		projectDepositManagementService.delete(projectDepositManagement);
+		addMessage(redirectAttributes, "删除保证金管理成功");
+		return "redirect:"+Global.getAdminPath()+"/project/projectDepositManagement/?repage";
+	}
+	
+	/**
+	 * 批量删除保证金管理
+	 */
+	@RequiresPermissions("project:projectDepositManagement:del")
+	@RequestMapping(value = "deleteAll")
+	public String deleteAll(String ids, RedirectAttributes redirectAttributes) {
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			projectDepositManagementService.delete(projectDepositManagementService.get(id));
+		}
+		addMessage(redirectAttributes, "删除保证金管理成功");
+		return "redirect:"+Global.getAdminPath()+"/project/projectDepositManagement/?repage";
+	}
+
+	/**
+	 * 导出excel文件
+	 */
+	@RequiresPermissions("project:projectDepositManagement:export")
+    @RequestMapping(value = "export", method=RequestMethod.POST)
+    public String exportFile(ProjectDepositManagement projectDepositManagement, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "保证金管理"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            Page<ProjectDepositManagement> page = projectDepositManagementService.findPage(new Page<ProjectDepositManagement>(request, response, -1), projectDepositManagement);
+    		new ExportExcel("保证金管理", ProjectDepositManagement.class).setDataList(page.getList()).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导出保证金管理记录失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/project/projectDepositManagement/?repage";
+    }
+
+	/**
+	 * 导入Excel数据
+
+	 */
+	@RequiresPermissions("project:projectDepositManagement: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<ProjectDepositManagement> list = ei.getDataList(ProjectDepositManagement.class);
+			for (ProjectDepositManagement projectDepositManagement : list){
+				try{
+					projectDepositManagementService.save(projectDepositManagement);
+					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()+"/project/projectDepositManagement/?repage";
+    }
+	
+	/**
+	 * 下载导入保证金管理数据模板
+	 */
+	@RequiresPermissions("project:projectDepositManagement:import")
+    @RequestMapping(value = "import/template")
+    public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "保证金管理数据导入模板.xlsx";
+    		List<ProjectDepositManagement> list = Lists.newArrayList(); 
+    		new ExportExcel("保证金管理数据", ProjectDepositManagement.class, 1).setDataList(list).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入模板下载失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/project/projectDepositManagement/?repage";
+    }
+	
+	
+	
+
+}

+ 194 - 0
src/main/java/com/jeeplus/modules/project/web/ProjectDepositReturnController.java

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

+ 196 - 0
src/main/java/com/jeeplus/modules/project/web/ProjectEvaluationRecordController.java

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

+ 197 - 0
src/main/java/com/jeeplus/modules/project/web/ProjectgeneralController.java

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

+ 196 - 0
src/main/java/com/jeeplus/modules/project/web/WorkprojectgroupController.java

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

+ 26 - 0
src/main/java/com/jeeplus/modules/projectcontentinfo/dao/ProjectBasedDataDao.java

@@ -0,0 +1,26 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.projectcontentinfo.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.projectcontentinfo.entity.ProjectBasedData;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 依据性资料DAO接口
+ * @author 杨帆
+ * @version 2018-06-05
+ */
+@MyBatisDao
+public interface ProjectBasedDataDao extends CrudDao<ProjectBasedData> {
+
+    ProjectBasedData getNumber(ProjectBasedData projectBasedData);
+
+    List<ProjectBasedData> findReportBased(@Param("reportId") String reportId, @Param("type") String type);
+
+    List<ProjectBasedData> queryListByContentId(String contentId);
+}

+ 24 - 0
src/main/java/com/jeeplus/modules/projectcontentinfo/dao/ProjectContentChangeDao.java

@@ -0,0 +1,24 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.projectcontentinfo.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.projectcontentinfo.entity.ProjectContentDataRelevance;
+import com.jeeplus.modules.projectcontentinfo.entity.Projectcontentinfo;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 工作内容管理DAO接口
+ * @author yangfan
+ * @version 2018-06-04
+ */
+@MyBatisDao
+public interface ProjectContentChangeDao extends CrudDao<Projectcontentinfo> {
+    List<Projectcontentinfo> getByInfoId(@Param("infoId")String infoId);
+    int deleteChange(Projectcontentinfo projectcontentinfo);
+    int saveProjectContentDataRelevanceInfo(ProjectContentDataRelevance projectContentDataRelevance);
+}

+ 35 - 0
src/main/java/com/jeeplus/modules/projectcontentinfo/dao/ProjectContentDataDao.java

@@ -0,0 +1,35 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.projectcontentinfo.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.projectcontentinfo.entity.ProjectContentData;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * 工作内容详情DAO接口
+ * @author yangfan
+ * @version 2018-06-05
+ */
+@MyBatisDao
+public interface ProjectContentDataDao extends CrudDao<ProjectContentData> {
+
+    Integer querySerialNum(ProjectContentData projectContentData);
+
+    int deleteBasedData(@Param("contentId") String contentId, @Param("basedId") String basedId);
+    void deleteReportDataInfo(@Param("contentId") String contentId, @Param("reportId") String reportId,@Param("type") String type);
+    void saveReportContent(@Param("contentId") String contentId, @Param("reportId") String reportId,@Param("type") String type);
+    void deleteReportDataMenu(@Param("linkId") String linkId,@Param("projectId") String projectId,@Param("reportId") String reportId);
+
+    void batchInsertBaseData(HashMap<String, Object> map);
+
+    void deleteBasedByContentId(String contentId);
+    List<ProjectContentData> findReportContent(@Param("reportId") String reportId,@Param("type") String type);
+    Integer countByBaseId(String basedId);
+    String findByLinkId(@Param("contentId") String contentId,@Param("projectId") String projectId);
+}

+ 69 - 0
src/main/java/com/jeeplus/modules/projectcontentinfo/dao/ProjectReportChangeDao.java

@@ -0,0 +1,69 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.projectcontentinfo.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.projectcontentinfo.entity.ProjectReportData;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 报告详情DAO接口
+ * @author yangfan
+ * @version 2018-06-05
+ */
+@MyBatisDao
+public interface ProjectReportChangeDao extends CrudDao<ProjectReportData> {
+
+    ProjectReportData getNumber(ProjectReportData projectReportData);
+    public int changeProjectReportData(ProjectReportData projectReportData);
+    public int changeBerforProjectReportData(ProjectReportData projectReportData);
+
+    ProjectReportData findByBefore(ProjectReportData projectReportData);
+    /**
+     * 修改作废信息
+     * @param projectReportData
+     * @return
+     */
+    public int saveInvalid(ProjectReportData projectReportData);
+    /**
+     * 更新流程实例ID
+     * @return
+     */
+    public int updateProcessInstanceId(ProjectReportData projectReportData);
+
+    /**
+     * 根据流程实例ID获取WorkReimbursement
+     * @param processInstanceId
+     * @return
+     */
+    public ProjectReportData getByProcessInstanceId(String processInstanceId);
+    /**
+     * 更新流程实例ID
+     * @return
+     */
+    public int updateInvalidProcessInstanceId(ProjectReportData projectReportData);
+
+    public void deleteReportDataInfo(@Param("reportId") String reportId);
+    public void deleteReportDataBased(@Param("reportId") String reportId);
+    public void deleteContentChange(@Param("infoId") String infoId);
+
+
+    /**
+     * 根据流程实例ID获取WorkReimbursement
+     * @param processInstanceId
+     * @return
+     */
+    public ProjectReportData getByInvalidProcessInstanceId(String processInstanceId);
+
+    /**
+     * 更新流程实例ID
+     * @return
+     */
+    public void deleteTree(ProjectReportData projectReportData);
+
+    void reportNumber(@Param("reportId") String reportId,@Param("number") String number);
+}

+ 22 - 0
src/main/java/com/jeeplus/modules/projectcontentinfo/dao/ProjectReportDataCompanyDao.java

@@ -0,0 +1,22 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.projectcontentinfo.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.projectcontentinfo.entity.ProjectReportData;
+import com.jeeplus.modules.projectcontentinfo.entity.ProjectReportDataCompany;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 报告详情DAO接口
+ * @author yangfan
+ * @version 2018-06-05
+ */
+@MyBatisDao
+public interface ProjectReportDataCompanyDao extends CrudDao<ProjectReportDataCompany> {
+
+}

+ 74 - 0
src/main/java/com/jeeplus/modules/projectcontentinfo/dao/ProjectReportDataDao.java

@@ -0,0 +1,74 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.projectcontentinfo.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.projectcontentinfo.entity.ProjectReportData;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 报告详情DAO接口
+ * @author yangfan
+ * @version 2018-06-05
+ */
+@MyBatisDao
+public interface ProjectReportDataDao extends CrudDao<ProjectReportData> {
+
+    ProjectReportData getNoInvalid(@Param("id") String id);
+
+    ProjectReportData getNumber(ProjectReportData projectReportData);
+
+    int updateFileStatus(ProjectReportData projectReportData);
+
+    List<ProjectReportData> findInvalidList(ProjectReportData projectReportData);
+
+    List<ProjectReportData> findInfoList(ProjectReportData projectReportData);
+    List<ProjectReportData> findInfoListByStatus(ProjectReportData projectReportData);
+    /**
+     * 更新流程实例ID
+     * @return
+     */
+    public int updateProcessInstanceId(ProjectReportData projectReportData);
+
+    /**
+     * 修改作废信息
+     * @param projectReportData
+     * @return
+     */
+    public int saveInvalid(ProjectReportData projectReportData);
+
+    /**
+     * 根据流程实例ID获取WorkReimbursement
+     * @param processInstanceId
+     * @return
+     */
+    public ProjectReportData getByProcessInstanceId(String processInstanceId);
+    /**
+     * 更新流程实例ID
+     * @return
+     */
+    public int updateInvalidProcessInstanceId(ProjectReportData projectReportData);
+    public void deleteReportDataInfo( @Param("reportId") String reportId);
+    public void deleteReportDataBased( @Param("reportId") String reportId);
+    public void deleteContentChange(@Param("infoId") String infoId);
+    public String getChangeId(@Param("id") String id);
+
+    /**
+     * 根据流程实例ID获取WorkReimbursement
+     * @param invalidProcessInstanceId
+     * @return
+     */
+    public ProjectReportData getByInvalidProcessInstanceId(String invalidProcessInstanceId);
+
+    void reportNumber(@Param("reportId") String reportId,@Param("number") String number,@Param("url") String url);
+
+    int updateUpId(@Param("id")String id,@Param("upId")String upId);
+
+    List<ProjectReportData> findByProjectId(String projectId);
+
+    ProjectReportData findByNum(String number);
+}

+ 19 - 0
src/main/java/com/jeeplus/modules/projectcontentinfo/dao/ProjectReportDataInfoDao.java

@@ -0,0 +1,19 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.projectcontentinfo.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.projectcontentinfo.entity.ProjectReportDataInfo;
+import com.jeeplus.modules.projectcontentinfo.entity.ProjectReportDataOffice;
+
+/**
+ * 报告详情DAO接口
+ * @author yangfan
+ * @version 2018-06-05
+ */
+@MyBatisDao
+public interface ProjectReportDataInfoDao extends CrudDao<ProjectReportDataInfo> {
+
+}

+ 21 - 0
src/main/java/com/jeeplus/modules/projectcontentinfo/dao/ProjectReportDataMonthDao.java

@@ -0,0 +1,21 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.projectcontentinfo.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.projectcontentinfo.entity.ProjectReportDataMonth;
+
+import java.util.List;
+
+/**
+ * 报告详情DAO接口
+ * @author yangfan
+ * @version 2018-06-05
+ */
+@MyBatisDao
+public interface ProjectReportDataMonthDao extends CrudDao<ProjectReportDataMonth> {
+    List<ProjectReportDataMonth> findByCompanyList(ProjectReportDataMonth projectReportDataMonth);
+    List<ProjectReportDataMonth> findByOfficeList(ProjectReportDataMonth projectReportDataMonth);
+}

+ 19 - 0
src/main/java/com/jeeplus/modules/projectcontentinfo/dao/ProjectReportDataOfficeDao.java

@@ -0,0 +1,19 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.projectcontentinfo.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.projectcontentinfo.entity.ProjectReportDataOffice;
+import com.jeeplus.modules.workreimbursementcount.entity.WorkInvoiceOffice;
+
+/**
+ * 报告详情DAO接口
+ * @author yangfan
+ * @version 2018-06-05
+ */
+@MyBatisDao
+public interface ProjectReportDataOfficeDao extends CrudDao<ProjectReportDataOffice> {
+    ProjectReportDataOffice findOfficeListSum(ProjectReportDataOffice workInvoiceOffice);
+}

+ 32 - 0
src/main/java/com/jeeplus/modules/projectcontentinfo/dao/ProjectReportRecordDao.java

@@ -0,0 +1,32 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.projectcontentinfo.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.projectcontentinfo.entity.ProjectReportRecord;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.web.bind.annotation.RequestParam;
+
+/**
+ * 报告归档DAO接口
+ * @author 杨帆
+ * @version 2018-06-22
+ */
+@MyBatisDao
+public interface ProjectReportRecordDao extends CrudDao<ProjectReportRecord> {
+    public String getNumber(@Param("reportId") String reportId);
+    /**
+     * 更新流程实例ID
+     * @return
+     */
+    public int updateProcessInstanceId(ProjectReportRecord workReimbursement);
+
+    /**
+     * 根据流程实例ID获取WorkReimbursement
+     * @param processInstanceId
+     * @return
+     */
+    public ProjectReportRecord getByProcessInstanceId(String processInstanceId);
+}

+ 42 - 0
src/main/java/com/jeeplus/modules/projectcontentinfo/dao/ProjectcontentinfoDao.java

@@ -0,0 +1,42 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.projectcontentinfo.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.projectcontentinfo.entity.Projectcontentinfo;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 工作内容管理DAO接口
+ * @author yangfan
+ * @version 2018-06-04
+ */
+@MyBatisDao
+public interface ProjectcontentinfoDao extends CrudDao<Projectcontentinfo> {
+
+	Projectcontentinfo findByType(Projectcontentinfo projectcontentinfo);
+	Projectcontentinfo getByInfoId(@Param("infoId")String infoId);
+	Projectcontentinfo findByInfoId(Projectcontentinfo projectcontentinfo);
+	List<Projectcontentinfo> findListByProject(Projectcontentinfo projectcontentinfo);
+	List<Projectcontentinfo> findByParentIds(@Param("projectId")String projectId,@Param("parentId")String parentId);
+	List<Projectcontentinfo> findListByProjectAndType(Projectcontentinfo projectcontentinfo);
+	List<Projectcontentinfo> findListByProjectAndTypes(Projectcontentinfo projectcontentinfo);
+	List<Projectcontentinfo> findListByProjectAndDictType(Projectcontentinfo projectcontentinfo);
+	List<Projectcontentinfo> findListByProjectType(Projectcontentinfo projectcontentinfo);
+	void deleteInfoId(Projectcontentinfo projectcontentinfo);
+
+    Integer queryMaxSort(Projectcontentinfo projectcontentinfo);
+
+    List<Projectcontentinfo> findListByParentSelective(Projectcontentinfo projectcontentinfo);
+
+    void deleteByParentAndLinkId(Projectcontentinfo projectcontentinfo);
+
+    void deleteInfosByParent(String parentIds);
+    void updateByLinkId(@Param("linkId")String linkId,@Param("dataName")String dataName);
+
+    List<Projectcontentinfo> findType(@Param("projectId")String projectId,@Param("type")String type);
+}

+ 169 - 0
src/main/java/com/jeeplus/modules/projectcontentinfo/entity/ProjectBasedData.java

@@ -0,0 +1,169 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.projectcontentinfo.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.projectrecord.entity.ProjectRecords;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.entity.Workattachment;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 依据性资料Entity
+ * @author 杨帆
+ * @version 2018-06-05
+ */
+public class ProjectBasedData extends DataEntity<ProjectBasedData> {
+	
+	private static final long serialVersionUID = 1L;
+	private String companyId;		// 公司id
+	private String officeId;		// 部门id
+	private String name;		// 资料名称
+	private String number;		// 资料编号
+	private String type;		// 资料类别
+	private String provider;		// 资料提供者
+	private Date provideDate;		// 提供日期
+	private ProjectRecords project;		// 项目id
+	private String uploadEnvironment;		// 上传环节
+	private User uploadUser;		// 上传人
+    @JsonFormat(pattern="yyyy-MM-dd")
+    private Date uploadDate;		// 上传日期
+	private List<Workattachment> workAttachments;
+	private Date startDate;
+	private Date endDate;
+    private String typeLabel;
+
+	public ProjectBasedData() {
+		super();
+	}
+
+	public ProjectBasedData(String id){
+		super(id);
+	}
+
+	public String getCompanyId() {
+		return companyId;
+	}
+
+	public void setCompanyId(String companyId) {
+		this.companyId = companyId;
+	}
+
+	public String getOfficeId() {
+		return officeId;
+	}
+
+	public void setOfficeId(String officeId) {
+		this.officeId = officeId;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String getNumber() {
+		return number;
+	}
+
+	public void setNumber(String number) {
+		this.number = number;
+	}
+
+	public String getType() {
+		return type;
+	}
+
+	public void setType(String type) {
+		this.type = type;
+	}
+
+	public String getProvider() {
+		return provider;
+	}
+
+	public void setProvider(String provider) {
+		this.provider = provider;
+	}
+
+	public ProjectRecords getProject() {
+		return project;
+	}
+
+	public void setProject(ProjectRecords project) {
+		this.project = project;
+	}
+
+	public String getUploadEnvironment() {
+		return uploadEnvironment;
+	}
+
+	public void setUploadEnvironment(String uploadEnvironment) {
+		this.uploadEnvironment = uploadEnvironment;
+	}
+
+	public User getUploadUser() {
+		return uploadUser;
+	}
+
+	public void setUploadUser(User uploadUser) {
+		this.uploadUser = uploadUser;
+	}
+
+	public Date getProvideDate() {
+		return provideDate;
+	}
+
+	public void setProvideDate(Date provideDate) {
+		this.provideDate = provideDate;
+	}
+
+	public Date getUploadDate() {
+		return uploadDate;
+	}
+
+	public void setUploadDate(Date uploadDate) {
+		this.uploadDate = uploadDate;
+	}
+
+	public List<Workattachment> getWorkAttachments() {
+		return workAttachments;
+	}
+
+	public void setWorkAttachments(List<Workattachment> workAttachments) {
+		this.workAttachments = workAttachments;
+	}
+
+	public Date getStartDate() {
+		return startDate;
+	}
+
+	public void setStartDate(Date startDate) {
+		this.startDate = startDate;
+	}
+
+	public Date getEndDate() {
+		return endDate;
+	}
+
+	public void setEndDate(Date endDate) {
+		this.endDate = endDate;
+	}
+
+    public String getTypeLabel() {
+        return typeLabel;
+    }
+
+    public void setTypeLabel(String typeLabel) {
+        this.typeLabel = typeLabel;
+    }
+}

+ 192 - 0
src/main/java/com/jeeplus/modules/projectcontentinfo/entity/ProjectContentData.java

@@ -0,0 +1,192 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.projectcontentinfo.entity;
+
+
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+import com.jeeplus.modules.projectcontroltable.entity.ProjectControlTable;
+import com.jeeplus.modules.projectrecord.entity.ProjectRecords;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.entity.Workattachment;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 工作内容详情Entity
+ * @author yangfan
+ * @version 2018-06-05
+ */
+public class ProjectContentData extends DataEntity<ProjectContentData> {
+	
+	private static final long serialVersionUID = 1L;
+	private String companyId;		// 公司id
+	private String officeId;		// 部门id
+	private ProjectRecords project;		// 项目id
+	private String name;		// 工作内容名称
+	private String number;		// 工作内容编号
+	private String type;		// 工作内容类型
+	private User master;		// 负责人
+	private String contentDetailsId;		// 内容详情id
+	private Date startDate;
+	private Date endDate;
+    private String contentDetail;
+    private List detailObject;
+    private Integer parentType;
+    private String extId;
+	private List<ProjectControlTable> projectControlTableList;
+	private List<Workattachment> workAttachments;
+	private List<ProjectBasedData> projectBasedDataList;
+
+    public List getDetailObject() {
+        return detailObject;
+    }
+
+    public void setDetailObject(List detailObject) {
+        this.detailObject = detailObject;
+    }
+
+    public ProjectContentData() {
+		super();
+	}
+
+	public ProjectContentData(String id){
+		super(id);
+	}
+
+	@ExcelField(title="公司id", align=2, sort=7)
+	public String getCompanyId() {
+		return companyId;
+	}
+
+	public void setCompanyId(String companyId) {
+		this.companyId = companyId;
+	}
+	
+	@ExcelField(title="部门id", align=2, sort=8)
+	public String getOfficeId() {
+		return officeId;
+	}
+
+	public void setOfficeId(String officeId) {
+		this.officeId = officeId;
+	}
+
+    public ProjectRecords getProject() {
+        return project;
+    }
+
+    public void setProject(ProjectRecords project) {
+        this.project = project;
+    }
+
+    @ExcelField(title="工作内容名称", align=2, sort=10)
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+	
+	@ExcelField(title="工作内容编号", align=2, sort=11)
+	public String getNumber() {
+		return number;
+	}
+
+	public void setNumber(String number) {
+		this.number = number;
+	}
+	
+	@ExcelField(title="工作内容类型", align=2, sort=12)
+	public String getType() {
+		return type;
+	}
+
+	public void setType(String type) {
+		this.type = type;
+	}
+
+    public User getMaster() {
+        return master;
+    }
+
+    public void setMaster(User master) {
+        this.master = master;
+    }
+
+    @ExcelField(title="内容详情id", align=2, sort=14)
+	public String getContentDetailsId() {
+		return contentDetailsId;
+	}
+
+	public void setContentDetailsId(String contentDetailsId) {
+		this.contentDetailsId = contentDetailsId;
+	}
+
+	public Date getStartDate() {
+		return startDate;
+	}
+
+	public void setStartDate(Date startDate) {
+		this.startDate = startDate;
+	}
+
+	public Date getEndDate() {
+		return endDate;
+	}
+
+	public void setEndDate(Date endDate) {
+		this.endDate = endDate;
+	}
+
+    public String getContentDetail() {
+        return contentDetail;
+    }
+
+    public void setContentDetail(String contentDetail) {
+        this.contentDetail = contentDetail;
+    }
+
+    public void setParentType(Integer parentType) {
+        this.parentType = parentType;
+    }
+
+    public Integer getParentType() {
+        return parentType;
+    }
+
+    public String getExtId() {
+        return extId;
+    }
+
+    public void setExtId(String extId) {
+        this.extId = extId;
+    }
+
+	public List<ProjectControlTable> getProjectControlTableList() {
+		return projectControlTableList;
+	}
+
+	public void setProjectControlTableList(List<ProjectControlTable> projectControlTableList) {
+		this.projectControlTableList = projectControlTableList;
+	}
+
+    public List<Workattachment> getWorkAttachments() {
+        return workAttachments;
+    }
+
+    public void setWorkAttachments(List<Workattachment> workAttachments) {
+        this.workAttachments = workAttachments;
+    }
+
+    public List<ProjectBasedData> getProjectBasedDataList() {
+        return projectBasedDataList;
+    }
+
+    public void setProjectBasedDataList(List<ProjectBasedData> projectBasedDataList) {
+        this.projectBasedDataList = projectBasedDataList;
+    }
+}

+ 27 - 0
src/main/java/com/jeeplus/modules/projectcontentinfo/entity/ProjectContentDataRelevance.java

@@ -0,0 +1,27 @@
+package com.jeeplus.modules.projectcontentinfo.entity;
+
+/**
+ * 合同id、动态合同id关联表
+ * @author 徐滕
+ * @version 2020-03-25
+ */
+public class ProjectContentDataRelevance {
+    private String projectContentId;
+    private String projectContentDynamicId;
+
+    public String getProjectContentId() {
+        return projectContentId;
+    }
+
+    public void setProjectContentId(String projectContentId) {
+        this.projectContentId = projectContentId;
+    }
+
+    public String getProjectContentDynamicId() {
+        return projectContentDynamicId;
+    }
+
+    public void setProjectContentDynamicId(String projectContentDynamicId) {
+        this.projectContentDynamicId = projectContentDynamicId;
+    }
+}

+ 59 - 0
src/main/java/com/jeeplus/modules/projectcontentinfo/entity/ProjectContractContentAlterData.java

@@ -0,0 +1,59 @@
+package com.jeeplus.modules.projectcontentinfo.entity;
+
+import com.jeeplus.common.persistence.DataEntity;
+import org.apache.poi.ss.formula.functions.T;
+
+import java.math.BigDecimal;
+
+/**
+ * 项目合同数据修改展示信息表
+ * @author 徐滕
+ * @version 2020-03-25
+ */
+public class ProjectContractContentAlterData extends DataEntity<T>  {
+    private BigDecimal reviewAmt;
+    private BigDecimal setAmt;
+    private String contentId;
+    private String name;
+    private String typeName;
+
+    public BigDecimal getReviewAmt() {
+        return reviewAmt;
+    }
+
+    public void setReviewAmt(BigDecimal reviewAmt) {
+        this.reviewAmt = reviewAmt;
+    }
+
+    public BigDecimal getSetAmt() {
+        return setAmt;
+    }
+
+    public void setSetAmt(BigDecimal setAmt) {
+        this.setAmt = setAmt;
+    }
+
+    public String getContentId() {
+        return contentId;
+    }
+
+    public void setContentId(String contentId) {
+        this.contentId = contentId;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getTypeName() {
+        return typeName;
+    }
+
+    public void setTypeName(String typeName) {
+        this.typeName = typeName;
+    }
+}

+ 564 - 0
src/main/java/com/jeeplus/modules/projectcontentinfo/entity/ProjectReportData.java

@@ -0,0 +1,564 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.projectcontentinfo.entity;
+
+
+import com.jeeplus.common.persistence.ActEntity;
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+import com.jeeplus.modules.projectrecord.entity.ProjectRecords;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.entity.Workattachment;
+import com.jeeplus.modules.workcontent.entity.WorkContentType;
+import com.jeeplus.modules.workcontent.web.WorkContentTypeController;
+import com.jeeplus.modules.workreview.entity.WorkReviewAudit;
+import com.jeeplus.modules.workreview.entity.WorkReviewStandard;
+import org.activiti.engine.history.HistoricProcessInstance;
+import org.activiti.engine.repository.ProcessDefinition;
+import org.activiti.engine.runtime.ProcessInstance;
+import org.activiti.engine.task.Task;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 报告详情Entity
+ * @author yangfan
+ * @version 2018-06-05
+ */
+public class ProjectReportData extends ActEntity<ProjectReportData> {
+	
+	private static final long serialVersionUID = 1L;
+	private String companyId;		// 公司id
+	private String officeId;		// 部门id
+	private String officeName;		// 部门id
+	private ProjectRecords project;		// 项目id
+	private String name;		// 报告名称
+	private String number;		// 报告编号
+	private String type;		// 工作内容类型
+	private String achievementType;		// 成功类型
+	private String reviewStandard;		// 复核标准
+	private User signCostOne;		// 签字造价师一
+	private User signCostTwo;		// 签字造价师二
+	private User master;		// 负责人
+	private Date reportDate;		// 报告日期
+	private String fileStatus;		// 归档状态
+	private String status;		// 报告状态 1待归档 2已归档
+	private String invalidStatus;		// 报告作废状态
+	private Date startDate;
+	private Date endDate;
+	private List<Workattachment> workAttachments;
+	private String processInstanceId; // 流程实例编号
+	private String invalidProcessInstanceId; // 流程实例编号
+	private String home;
+	private List<ProjectContentData> projectContentDataList;
+	private List<ProjectBasedData> projectBasedDataList;
+	private List<WorkReviewAudit> projectReviewList;
+	private String reportId;
+	private String numberPath;
+
+	public String getNumberPath() {
+		return numberPath;
+	}
+
+	public void setNumberPath(String numberPath) {
+		this.numberPath = numberPath;
+	}
+
+	private ProjectReportData beforeEntity;
+	private Integer beforeCount;
+	private String clientName;
+	private String contractNum;
+	private String contractName;
+	private String projectMaster;
+	private String projectMasterId;
+	private Date createStartDate;
+	private Date createEndDate;
+	private Date createDate;
+	private String typeName;
+	private String projectName;
+	private String projectNum;
+	private String signCostOneName;
+	private String signCostTwoName;
+	private String masterName;
+	private String upId;
+
+
+	private Double reviewFee;  //送审价
+	private Double approvalFee;  //审定价
+	private Double contractFee;   //合同价
+	private Double verifyFee;    //核增核减额
+	private Double verifyRate;    //核增核减率
+	private Double consultFee;    //咨询标的额
+	private Double buildingFee;   //土建额
+	private Double installFee;    //安装额
+
+	public String getUpId() {
+		return upId;
+	}
+
+	public void setUpId(String upId) {
+		this.upId = upId;
+	}
+
+
+	public String getReportType() {
+		return reportType;
+	}
+
+	public void setReportType(String reportType) {
+		this.reportType = reportType;
+	}
+
+	private String reportType;		// 签章类型 电子章/实体章
+	// 流程任务
+	private Task task;
+	private Map<String, Object> variables;
+	// 运行中的流程实例
+	private ProcessInstance processInstance;
+	// 历史的流程实例
+	private HistoricProcessInstance historicProcessInstance;
+	// 流程定义
+	private ProcessDefinition processDefinition;
+	
+	public ProjectReportData() {
+		super();
+	}
+
+	public ProjectReportData(String id){
+		super(id);
+	}
+
+	public String getCompanyId() {
+		return companyId;
+	}
+
+	public void setCompanyId(String companyId) {
+		this.companyId = companyId;
+	}
+	
+	public String getOfficeId() {
+		return officeId;
+	}
+
+	public void setOfficeId(String officeId) {
+		this.officeId = officeId;
+	}
+
+	@Override
+	public void setCreateDate(Date createDate) {
+		this.createDate = createDate;
+	}
+
+	public void setProject(ProjectRecords project) {
+		this.project = project;
+	}
+	
+	public void setName(String name) {
+		this.name = name;
+	}
+	
+	@ExcelField(title="报告编号", align=2, sort=1)
+	public String getNumber() {
+		return number;
+	}
+
+	@ExcelField(title="报告名称", align=2, sort=2)
+	public String getName() {
+		return name;
+	}
+
+	public String getType() {
+		return type;
+	}
+	@ExcelField(title="工作内容类型", align=2, sort=3)
+	public String getTypeName() {
+		return WorkContentTypeController.getContentTypeName(this.type,"");
+	}
+
+	@ExcelField(title="成果类型", align=2, sort=4,mainDictType = "achievement_type")
+	public String getAchievementType() {
+		return achievementType;
+	}
+
+	public User getSignCostOne() {
+		return signCostOne;
+	}
+
+	@ExcelField(title="签字造价师一", align=2, sort=5)
+	public String getSignCostOneName() {
+		return this.signCostOne.getName();
+	}
+
+	@ExcelField(title="签字造价师二", align=2, sort=6)
+	public String getSignCostTwoName() {
+		return this.signCostTwo.getName();
+	}
+
+	public User getSignCostTwo() {
+		return signCostTwo;
+	}
+
+	@ExcelField(title="复核标准", align=2, sort=7,dictType = "reviewStandard")
+	public String getReviewStandard() {
+		return reviewStandard;
+	}
+
+	@ExcelField(title="报告状态", align=2, sort=8,dictType = "audit_state")
+	public String getStatus() {
+		return status;
+	}
+
+	@ExcelField(title="报告日期", align=2, sort=9)
+	public Date getReportDate() {
+		return reportDate;
+	}
+
+	@ExcelField(title="归档状态", align=2, sort=10,dictType = "record_state")
+	public String getFileStatus() {
+		return fileStatus;
+	}
+
+	@ExcelField(title="负责人", align=2, sort=11)
+	public String getMasterName() {
+		return this.master.getName();
+	}
+
+	@ExcelField(title="所属部门", align=2, sort=12)
+	public String getOfficeName() {
+		return officeName;
+	}
+
+	@ExcelField(title="创建时间", align=2, sort=13)
+	@Override
+	public Date getCreateDate() {
+		return createDate;
+	}
+
+	public ProjectRecords getProject() {
+		return project;
+	}
+
+	@ExcelField(title="所属项目", align=2, sort=14)
+	public String getProjectName() {
+		return this.project.getProjectName();
+	}
+
+	@ExcelField(title="项目负责人", align=2, sort=15)
+	public String getProjectMaster() {
+		return projectMaster;
+	}
+
+	@ExcelField(title="合同编号", align=2, sort=16)
+	public String getContractNum() {
+		return contractNum;
+	}
+
+	@ExcelField(title="主委托方", align=2, sort=17)
+	public String getClientName() {
+		return clientName;
+	}
+
+	public void setNumber(String number) {
+		this.number = number;
+	}
+	
+	public void setType(String type) {
+		this.type = type;
+	}
+	
+	public void setAchievementType(String achievementType) {
+		this.achievementType = achievementType;
+	}
+	
+	public void setReviewStandard(String reviewStandard) {
+		this.reviewStandard = reviewStandard;
+	}
+
+	public void setSignCostOne(User signCostOne) {
+		this.signCostOne = signCostOne;
+	}
+	
+	public void setSignCostTwo(User signCostTwo) {
+		this.signCostTwo = signCostTwo;
+	}
+	
+	public void setMaster(User master) {
+		this.master = master;
+	}
+	
+	public void setReportDate(Date reportDate) {
+		this.reportDate = reportDate;
+	}
+	
+	public void setFileStatus(String fileStatus) {
+		this.fileStatus = fileStatus;
+	}
+	
+	public void setStatus(String status) {
+		this.status = status;
+	}
+
+	public String getInvalidStatus() {
+		return invalidStatus;
+	}
+
+	public void setInvalidStatus(String invalidStatus) {
+		this.invalidStatus = invalidStatus;
+	}
+
+	public Date getStartDate() {
+		return startDate;
+	}
+
+	public void setStartDate(Date startDate) {
+		this.startDate = startDate;
+	}
+
+	public Date getEndDate() {
+		return endDate;
+	}
+
+	public void setEndDate(Date endDate) {
+		this.endDate = endDate;
+	}
+
+	public List<Workattachment> getWorkAttachments() {
+		return workAttachments;
+	}
+
+	public void setWorkAttachments(List<Workattachment> workAttachments) {
+		this.workAttachments = workAttachments;
+	}
+
+	public String getProcessInstanceId() {
+		return processInstanceId;
+	}
+
+	public void setProcessInstanceId(String processInstanceId) {
+		this.processInstanceId = processInstanceId;
+	}
+
+	public Task getTask() {
+		return task;
+	}
+
+	public void setTask(Task task) {
+		this.task = task;
+	}
+
+	public Map<String, Object> getVariables() {
+		return variables;
+	}
+
+	public void setVariables(Map<String, Object> variables) {
+		this.variables = variables;
+	}
+
+	public ProcessInstance getProcessInstance() {
+		return processInstance;
+	}
+
+	public void setProcessInstance(ProcessInstance processInstance) {
+		this.processInstance = processInstance;
+	}
+
+	public HistoricProcessInstance getHistoricProcessInstance() {
+		return historicProcessInstance;
+	}
+
+	public void setHistoricProcessInstance(HistoricProcessInstance historicProcessInstance) {
+		this.historicProcessInstance = historicProcessInstance;
+	}
+
+	public ProcessDefinition getProcessDefinition() {
+		return processDefinition;
+	}
+
+	public void setProcessDefinition(ProcessDefinition processDefinition) {
+		this.processDefinition = processDefinition;
+	}
+
+	public String getHome() {
+		return home;
+	}
+
+	public void setHome(String home) {
+		this.home = home;
+	}
+
+	public List<ProjectContentData> getProjectContentDataList() {
+		return projectContentDataList;
+	}
+
+	public void setProjectContentDataList(List<ProjectContentData> projectContentDataList) {
+		this.projectContentDataList = projectContentDataList;
+	}
+
+	public String getReportId() {
+		return reportId;
+	}
+
+	public void setReportId(String reportId) {
+		this.reportId = reportId;
+	}
+
+	public ProjectReportData getBeforeEntity() {
+		return beforeEntity;
+	}
+
+	public void setBeforeEntity(ProjectReportData beforeEntity) {
+		this.beforeEntity = beforeEntity;
+	}
+
+	public Integer getBeforeCount() {
+		return beforeCount;
+	}
+
+	public void setBeforeCount(Integer beforeCount) {
+		this.beforeCount = beforeCount;
+	}
+
+	public String getInvalidProcessInstanceId() {
+		return invalidProcessInstanceId;
+	}
+
+	public void setInvalidProcessInstanceId(String invalidProcessInstanceId) {
+		this.invalidProcessInstanceId = invalidProcessInstanceId;
+	}
+
+	public void setOfficeName(String officeName) {
+		this.officeName = officeName;
+	}
+
+	public void setClientName(String clientName) {
+		this.clientName = clientName;
+	}
+
+	public void setContractNum(String contractNum) {
+		this.contractNum = contractNum;
+	}
+
+	public void setProjectMaster(String projectMaster) {
+		this.projectMaster = projectMaster;
+	}
+
+	public Date getCreateStartDate() {
+		return createStartDate;
+	}
+
+	public void setCreateStartDate(Date createStartDate) {
+		this.createStartDate = createStartDate;
+	}
+
+	public Date getCreateEndDate() {
+		return createEndDate;
+	}
+
+	public void setCreateEndDate(Date createEndDate) {
+		this.createEndDate = createEndDate;
+	}
+
+	public String getProjectMasterId() {
+		return projectMasterId;
+	}
+
+	public void setProjectMasterId(String projectMasterId) {
+		this.projectMasterId = projectMasterId;
+	}
+
+	public String getContractName() {
+		return contractName;
+	}
+
+	public String getProjectNum() {
+		return this.project.getProjectId();
+	}
+	public User getMaster() {
+		return master;
+	}
+
+	public List<ProjectBasedData> getProjectBasedDataList() {
+		return projectBasedDataList;
+	}
+
+	public void setProjectBasedDataList(List<ProjectBasedData> projectBasedDataList) {
+		this.projectBasedDataList = projectBasedDataList;
+	}
+
+	public List<WorkReviewAudit> getProjectReviewList() {
+		return projectReviewList;
+	}
+
+	public void setProjectReviewList(List<WorkReviewAudit> projectReviewList) {
+		this.projectReviewList = projectReviewList;
+	}
+
+
+	public Double getReviewFee() {
+		return reviewFee;
+	}
+
+	public void setReviewFee(Double reviewFee) {
+		this.reviewFee = reviewFee;
+	}
+
+	public Double getApprovalFee() {
+		return approvalFee;
+	}
+
+	public void setApprovalFee(Double approvalFee) {
+		this.approvalFee = approvalFee;
+	}
+
+	public Double getContractFee() {
+		return contractFee;
+	}
+
+	public void setContractFee(Double contractFee) {
+		this.contractFee = contractFee;
+	}
+
+	public Double getVerifyFee() {
+		return verifyFee;
+	}
+
+	public void setVerifyFee(Double verifyFee) {
+		this.verifyFee = verifyFee;
+	}
+
+	public Double getVerifyRate() {
+		return verifyRate;
+	}
+
+	public void setVerifyRate(Double verifyRate) {
+		this.verifyRate = verifyRate;
+	}
+
+	public Double getConsultFee() {
+		return consultFee;
+	}
+
+	public void setConsultFee(Double consultFee) {
+		this.consultFee = consultFee;
+	}
+
+	public Double getBuildingFee() {
+		return buildingFee;
+	}
+
+	public void setBuildingFee(Double buildingFee) {
+		this.buildingFee = buildingFee;
+	}
+
+	public Double getInstallFee() {
+		return installFee;
+	}
+
+	public void setInstallFee(Double installFee) {
+		this.installFee = installFee;
+	}
+}

+ 113 - 0
src/main/java/com/jeeplus/modules/projectcontentinfo/entity/ProjectReportDataCompany.java

@@ -0,0 +1,113 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.projectcontentinfo.entity;
+
+
+import com.jeeplus.common.persistence.ActEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+import com.jeeplus.modules.projectrecord.entity.ProjectRecords;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.entity.Workattachment;
+import com.jeeplus.modules.workcontent.web.WorkContentTypeController;
+import org.activiti.engine.history.HistoricProcessInstance;
+import org.activiti.engine.repository.ProcessDefinition;
+import org.activiti.engine.runtime.ProcessInstance;
+import org.activiti.engine.task.Task;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 报告详情Entity
+ * @author yangfan
+ * @version 2018-06-05
+ */
+public class ProjectReportDataCompany extends ActEntity<ProjectReportDataCompany> {
+
+	private static final long serialVersionUID = 1L;
+	private int type;//公司类型
+	private String companyId;		// 公司id
+	private String officeId;		// 部门id
+	private String name; //分公司
+	private int reportCount;// 报告数量
+	private String date;
+	private Date reportDate;
+	private String check;
+	private String sign;
+
+	public String getSign() {
+		return sign;
+	}
+
+	public void setSign(String sign) {
+		this.sign = sign;
+	}
+
+	public String getCompanyId() {
+		return companyId;
+	}
+
+	public void setCompanyId(String companyId) {
+		this.companyId = companyId;
+	}
+
+	public String getOfficeId() {
+		return officeId;
+	}
+
+	public void setOfficeId(String officeId) {
+		this.officeId = officeId;
+	}
+
+	@ExcelField(title = "分公司", align = 2, sort = 1)
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	@ExcelField(title = "报告数量", align = 2, sort = 2)
+	public int getReportCount() {
+		return reportCount;
+	}
+
+	public void setReportCount(int reportCount) {
+		this.reportCount = reportCount;
+	}
+
+	public int getType() {
+		return type;
+	}
+
+	public void setType(int type) {
+		this.type = type;
+	}
+
+	public String getDate() {
+		return date;
+	}
+
+	public void setDate(String date) {
+		this.date = date;
+	}
+
+	public Date getReportDate() {
+		return reportDate;
+	}
+
+	public void setReportDate(Date reportDate) {
+		this.reportDate = reportDate;
+	}
+
+	public String getCheck() {
+		return check;
+	}
+
+	public void setCheck(String check) {
+		this.check = check;
+	}
+}

+ 167 - 0
src/main/java/com/jeeplus/modules/projectcontentinfo/entity/ProjectReportDataInfo.java

@@ -0,0 +1,167 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.projectcontentinfo.entity;
+
+
+import com.jeeplus.common.persistence.ActEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+import com.jeeplus.modules.projectrecord.entity.ProjectRecords;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.entity.Workattachment;
+import com.jeeplus.modules.workcontent.web.WorkContentTypeController;
+import org.activiti.engine.history.HistoricProcessInstance;
+import org.activiti.engine.repository.ProcessDefinition;
+import org.activiti.engine.runtime.ProcessInstance;
+import org.activiti.engine.task.Task;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 报告详情Entity
+ * @author yangfan
+ * @version 2018-06-05
+ */
+public class ProjectReportDataInfo extends ActEntity<ProjectReportDataInfo> {
+
+	private static final long serialVersionUID = 1L;
+	private String companyId;		// 公司id
+	private String officeId;		// 部门id
+	private String officeName;		// 部门id
+	private String name;		// 报告名称
+	private String number;		// 报告编号
+	private String type;		// 工作内容类型
+	private String achievementType;		// 成功类型
+	private User signCostOne;		// 签字造价师一
+	private User signCostTwo;		// 签字造价师二
+	private User master;		// 负责人
+	private Date reportDate;		// 报告日期
+	private String masterName;
+	private String signCostOneName;
+	private String signCostTwoName;
+	private String typeName;
+	private String date;
+
+	public String getCompanyId() {
+		return companyId;
+	}
+
+	public void setCompanyId(String companyId) {
+		this.companyId = companyId;
+	}
+
+	public String getOfficeId() {
+		return officeId;
+	}
+
+	public void setOfficeId(String officeId) {
+		this.officeId = officeId;
+	}
+
+	public String getOfficeName() {
+		return officeName;
+	}
+
+	public void setOfficeName(String officeName) {
+		this.officeName = officeName;
+	}
+
+	@ExcelField(title = "报告名称", align = 2, sort = 2)
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	@ExcelField(title = "报告编号", align = 2, sort = 1)
+	public String getNumber() {
+		return number;
+	}
+
+	public void setNumber(String number) {
+		this.number = number;
+	}
+
+	@ExcelField(title="工作内容类型", align=2, sort=3)
+	public String getTypeName() {
+		return WorkContentTypeController.getContentTypeName(this.type,"");
+	}
+
+
+	public String getType() {
+		return type;
+	}
+
+	public void setType(String type) {
+		this.type = type;
+	}
+
+	@ExcelField(title="成果类型", align=2, sort=4,mainDictType = "achievement_type")
+	public String getAchievementType() {
+		return achievementType;
+	}
+
+	public void setAchievementType(String achievementType) {
+		this.achievementType = achievementType;
+	}
+
+	@ExcelField(title="报告日期", align=2, sort=5)
+	public Date getReportDate() {
+		return reportDate;
+	}
+
+	@ExcelField(title="签字造价师1", align=2, sort=6)
+	public String getSignCostOneName() {
+		return this.signCostOne.getName();
+	}
+
+	@ExcelField(title="签字造价师2", align=2, sort=7)
+	public String getSignCostTwoName() {
+		return this.signCostTwo.getName();
+	}
+
+	@ExcelField(title="负责人", align=2, sort=8)
+	public String getMasterName() {
+		return this.master.getName();
+	}
+
+	public User getSignCostOne() {
+		return signCostOne;
+	}
+
+	public void setSignCostOne(User signCostOne) {
+		this.signCostOne = signCostOne;
+	}
+
+	public User getSignCostTwo() {
+		return signCostTwo;
+	}
+
+	public void setSignCostTwo(User signCostTwo) {
+		this.signCostTwo = signCostTwo;
+	}
+
+	public User getMaster() {
+		return master;
+	}
+
+	public void setMaster(User master) {
+		this.master = master;
+	}
+
+	public void setReportDate(Date reportDate) {
+		this.reportDate = reportDate;
+	}
+
+	public String getDate() {
+		return date;
+	}
+
+	public void setDate(String date) {
+		this.date = date;
+	}
+}

+ 94 - 0
src/main/java/com/jeeplus/modules/projectcontentinfo/entity/ProjectReportDataMonth.java

@@ -0,0 +1,94 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.projectcontentinfo.entity;
+
+
+import com.jeeplus.common.persistence.ActEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+
+import java.util.Date;
+
+/**
+ * 报告详情Entity
+ * @author yangfan
+ * @version 2018-06-05
+ */
+public class ProjectReportDataMonth extends ActEntity<ProjectReportDataMonth> {
+
+	private static final long serialVersionUID = 1L;
+	private String type;//公司/部门
+	private String companyId;		// 公司id
+	private String officeId;		// 部门id
+	private String name; //月份
+	private int reportCount;// 报告数量
+	private String date;
+	private Date reportDate;
+	private String sign;
+
+	public String getSign() {
+		return sign;
+	}
+
+	public void setSign(String sign) {
+		this.sign = sign;
+	}
+
+	public String getCompanyId() {
+		return companyId;
+	}
+
+	public void setCompanyId(String companyId) {
+		this.companyId = companyId;
+	}
+
+	public String getOfficeId() {
+		return officeId;
+	}
+
+	public void setOfficeId(String officeId) {
+		this.officeId = officeId;
+	}
+
+	@ExcelField(title = "月份", align = 2, sort = 1)
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	@ExcelField(title = "报告数量", align = 2, sort = 2)
+	public int getReportCount() {
+		return reportCount;
+	}
+
+	public void setReportCount(int reportCount) {
+		this.reportCount = reportCount;
+	}
+
+	public String getType() {
+		return type;
+	}
+
+	public void setType(String type) {
+		this.type = type;
+	}
+
+	public String getDate() {
+		return date;
+	}
+
+	public void setDate(String date) {
+		this.date = date;
+	}
+
+	public Date getReportDate() {
+		return reportDate;
+	}
+
+	public void setReportDate(Date reportDate) {
+		this.reportDate = reportDate;
+	}
+}

+ 94 - 0
src/main/java/com/jeeplus/modules/projectcontentinfo/entity/ProjectReportDataOffice.java

@@ -0,0 +1,94 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.projectcontentinfo.entity;
+
+
+import com.jeeplus.common.persistence.ActEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+
+import java.util.Date;
+
+/**
+ * 报告详情Entity
+ * @author yangfan
+ * @version 2018-06-05
+ */
+public class ProjectReportDataOffice extends ActEntity<ProjectReportDataOffice> {
+
+	private static final long serialVersionUID = 1L;
+	private String type;//部门类型
+	private String companyId;		// 公司id
+	private String officeId;		// 部门id
+	private String name; //部门
+	private int reportCount;// 报告数量
+	private String date;
+	private Date reportDate;
+	private String check;
+
+	public String getCompanyId() {
+		return companyId;
+	}
+
+	public void setCompanyId(String companyId) {
+		this.companyId = companyId;
+	}
+
+	public String getOfficeId() {
+		return officeId;
+	}
+
+	public void setOfficeId(String officeId) {
+		this.officeId = officeId;
+	}
+
+	@ExcelField(title = "部门", align = 2, sort = 1)
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	@ExcelField(title = "报告数量", align = 2, sort = 2)
+	public int getReportCount() {
+		return reportCount;
+	}
+
+	public void setReportCount(int reportCount) {
+		this.reportCount = reportCount;
+	}
+
+	public String getType() {
+		return type;
+	}
+
+	public void setType(String type) {
+		this.type = type;
+	}
+
+	public String getDate() {
+		return date;
+	}
+
+	public void setDate(String date) {
+		this.date = date;
+	}
+
+	public Date getReportDate() {
+		return reportDate;
+	}
+
+	public void setReportDate(Date reportDate) {
+		this.reportDate = reportDate;
+	}
+
+	public String getCheck() {
+		return check;
+	}
+
+	public void setCheck(String check) {
+		this.check = check;
+	}
+}

+ 296 - 0
src/main/java/com/jeeplus/modules/projectcontentinfo/entity/ProjectReportRecord.java

@@ -0,0 +1,296 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.projectcontentinfo.entity;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import com.google.common.collect.Lists;
+import com.jeeplus.common.persistence.ActEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.entity.Workattachment;
+import org.activiti.engine.history.HistoricProcessInstance;
+import org.activiti.engine.repository.ProcessDefinition;
+import org.activiti.engine.runtime.ProcessInstance;
+import org.activiti.engine.task.Task;
+
+/**
+ * 报告归档Entity
+ * @author 杨帆
+ * @version 2018-06-22
+ */
+public class ProjectReportRecord extends ActEntity<ProjectReportRecord> {
+	
+	private static final long serialVersionUID = 1L;
+	private ProjectReportData report;		// 报告id
+	private String companyId;		// 公司id
+	private String officeId;		// 部门id
+	private String recordNum;		// 归档申请编号
+	private String fileNum;		// 档案号
+	private String name;		// 档案名称
+	private Date recordDate;		// 归档日期
+	private String status;		// 归档申请状态
+	private String processInstanceId;		// 流程号
+	private Date startDate; //开始日期
+	private Date endDate; //结束日期
+	private String clientName;
+	private String contractNum;
+	private String projectName;
+	private String projectNum;
+	private String contractName;
+	private int numberCount;
+	private String view;
+	private String home;
+	private User signCostOne;		// 签字造价师一
+	private User signCostTwo;		// 签字造价师二
+
+	public ProjectReportRecord() {
+		super();
+	}
+
+	public ProjectReportRecord(String id){
+		super(id);
+	}
+
+	// 流程任务
+	private Task task;
+	private Map<String, Object> variables;
+	// 运行中的流程实例
+	private ProcessInstance processInstance;
+	// 历史的流程实例
+	private HistoricProcessInstance historicProcessInstance;
+	// 流程定义
+	private ProcessDefinition processDefinition;
+
+	private List<Workattachment> workAttachments = Lists.newArrayList();
+
+	public List<Workattachment> getWorkAttachments() {
+		return workAttachments;
+	}
+
+	public void setWorkAttachments(List<Workattachment> workAttachments) {
+		this.workAttachments = workAttachments;
+	}
+
+	@ExcelField(title="公司id", align=2, sort=8)
+	public String getCompanyId() {
+		return companyId;
+	}
+
+	public void setCompanyId(String companyId) {
+		this.companyId = companyId;
+	}
+	
+	@ExcelField(title="部门id", align=2, sort=9)
+	public String getOfficeId() {
+		return officeId;
+	}
+
+	public void setOfficeId(String officeId) {
+		this.officeId = officeId;
+	}
+	
+	@ExcelField(title="归档申请编号", align=2, sort=10)
+	public String getRecordNum() {
+		return recordNum;
+	}
+
+	public void setRecordNum(String recordNum) {
+		this.recordNum = recordNum;
+	}
+	
+	@ExcelField(title="档案号", align=2, sort=11)
+	public String getFileNum() {
+		return fileNum;
+	}
+
+	public void setFileNum(String fileNum) {
+		this.fileNum = fileNum;
+	}
+	
+	@ExcelField(title="档案名称", align=2, sort=12)
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+	
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@ExcelField(title="归档日期", align=2, sort=13)
+	public Date getRecordDate() {
+		return recordDate;
+	}
+
+	public void setRecordDate(Date recordDate) {
+		this.recordDate = recordDate;
+	}
+	
+	@ExcelField(title="归档状态", align=2, sort=14)
+	public String getStatus() {
+		return status;
+	}
+
+	public void setStatus(String status) {
+		this.status = status;
+	}
+	
+	@ExcelField(title="流程号", align=2, sort=15)
+	public String getProcessInstanceId() {
+		return processInstanceId;
+	}
+
+	public void setProcessInstanceId(String processInstanceId) {
+		this.processInstanceId = processInstanceId;
+	}
+
+	public ProjectReportData getReport() {
+		return report;
+	}
+
+	public void setReport(ProjectReportData report) {
+		this.report = report;
+	}
+
+	public Date getStartDate() {
+		return startDate;
+	}
+
+	public void setStartDate(Date startDate) {
+		this.startDate = startDate;
+	}
+
+	public Date getEndDate() {
+		return endDate;
+	}
+
+	public void setEndDate(Date endDate) {
+		this.endDate = endDate;
+	}
+
+	public String getClientName() {
+		return clientName;
+	}
+
+	public void setClientName(String clientName) {
+		this.clientName = clientName;
+	}
+
+	public String getContractNum() {
+		return contractNum;
+	}
+
+	public void setContractNum(String contractNum) {
+		this.contractNum = contractNum;
+	}
+
+	public String getContractName() {
+		return contractName;
+	}
+
+	public void setContractName(String contractName) {
+		this.contractName = contractName;
+	}
+
+	public Task getTask() {
+		return task;
+	}
+
+	public void setTask(Task task) {
+		this.task = task;
+	}
+
+	public Map<String, Object> getVariables() {
+		return variables;
+	}
+
+	public void setVariables(Map<String, Object> variables) {
+		this.variables = variables;
+	}
+
+	public ProcessInstance getProcessInstance() {
+		return processInstance;
+	}
+
+	public void setProcessInstance(ProcessInstance processInstance) {
+		this.processInstance = processInstance;
+	}
+
+	public HistoricProcessInstance getHistoricProcessInstance() {
+		return historicProcessInstance;
+	}
+
+	public void setHistoricProcessInstance(HistoricProcessInstance historicProcessInstance) {
+		this.historicProcessInstance = historicProcessInstance;
+	}
+
+	public ProcessDefinition getProcessDefinition() {
+		return processDefinition;
+	}
+
+	public void setProcessDefinition(ProcessDefinition processDefinition) {
+		this.processDefinition = processDefinition;
+	}
+
+	public String getProjectName() {
+		return projectName;
+	}
+
+	public void setProjectName(String projectName) {
+		this.projectName = projectName;
+	}
+
+	public String getProjectNum() {
+		return projectNum;
+	}
+
+	public void setProjectNum(String projectNum) {
+		this.projectNum = projectNum;
+	}
+
+	public int getNumberCount() {
+		return numberCount;
+	}
+
+	public void setNumberCount(int numberCount) {
+		this.numberCount = numberCount;
+	}
+
+	public String getView() {
+		return view;
+	}
+
+	public void setView(String view) {
+		this.view = view;
+	}
+
+	public String getHome() {
+		return home;
+	}
+
+	public void setHome(String home) {
+		this.home = home;
+	}
+
+	public User getSignCostOne() {
+		return signCostOne;
+	}
+
+	public void setSignCostOne(User signCostOne) {
+		this.signCostOne = signCostOne;
+	}
+
+	public User getSignCostTwo() {
+		return signCostTwo;
+	}
+
+	public void setSignCostTwo(User signCostTwo) {
+		this.signCostTwo = signCostTwo;
+	}
+}

+ 188 - 0
src/main/java/com/jeeplus/modules/projectcontentinfo/entity/Projectcontentinfo.java

@@ -0,0 +1,188 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.projectcontentinfo.entity;
+
+
+import com.jeeplus.common.persistence.TreeEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+import com.jeeplus.modules.projectrecord.entity.ProjectRecords;
+import com.jeeplus.modules.sys.entity.Workattachment;
+
+import java.util.List;
+
+/**
+ * 工作内容管理Entity
+ * @author yangfan
+ * @version 2018-06-04
+ */
+public class Projectcontentinfo extends TreeEntity<Projectcontentinfo> {
+	
+	private static final long serialVersionUID = 1L;
+	private ProjectRecords project;		// 项目id
+	private String companyId;		// 公司id
+	private String officeId;		// 部门id
+	private String name;		// 名称
+	private String type;		// 类型
+	private String dictType;		// 字典类型
+	private String infoId; //详情页id
+	private ProjectBasedData projectBasedData;
+	private ProjectContentData projectContentData;
+	private ProjectReportData projectReportData;
+	private String view;
+	private List<Workattachment> workAttachments;
+	private String edit;
+	private String linkId;//引用ID
+	private String home;
+	private String change;
+
+	public Projectcontentinfo() {
+		super();
+	}
+
+	public Projectcontentinfo(String id){
+		super(id);
+	}
+
+	@Override
+	public Projectcontentinfo getParent() {
+		return parent;
+	}
+
+	@Override
+	public void setParent(Projectcontentinfo parent) {
+		this.parent = parent;
+	}
+
+	@ExcelField(title="项目id", align=2, sort=10)
+	public ProjectRecords getProject() {
+		return project;
+	}
+
+	public void setProject(ProjectRecords project) {
+		this.project = project;
+	}
+	
+	@ExcelField(title="公司id", align=2, sort=11)
+	public String getCompanyId() {
+		return companyId;
+	}
+
+	public void setCompanyId(String companyId) {
+		this.companyId = companyId;
+	}
+	
+	@ExcelField(title="部门id", align=2, sort=12)
+	public String getOfficeId() {
+		return officeId;
+	}
+
+	public void setOfficeId(String officeId) {
+		this.officeId = officeId;
+	}
+	
+	@ExcelField(title="名称", align=2, sort=13)
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String getType() {
+		return type;
+	}
+
+	public void setType(String type) {
+		this.type = type;
+	}
+
+	public String getDictType() {
+		return dictType;
+	}
+
+	public void setDictType(String dictType) {
+		this.dictType = dictType;
+	}
+
+	public String getInfoId() {
+		return infoId;
+	}
+
+	public void setInfoId(String infoId) {
+		this.infoId = infoId;
+	}
+
+	public ProjectBasedData getProjectBasedData() {
+		return projectBasedData;
+	}
+
+	public void setProjectBasedData(ProjectBasedData projectBasedData) {
+		this.projectBasedData = projectBasedData;
+	}
+
+	public ProjectContentData getProjectContentData() {
+		return projectContentData;
+	}
+
+	public void setProjectContentData(ProjectContentData projectContentData) {
+		this.projectContentData = projectContentData;
+	}
+
+	public ProjectReportData getProjectReportData() {
+		return projectReportData;
+	}
+
+	public void setProjectReportData(ProjectReportData projectReportData) {
+		this.projectReportData = projectReportData;
+	}
+
+	public String getView() {
+		return view;
+	}
+
+	public void setView(String view) {
+		this.view = view;
+	}
+
+	public List<Workattachment> getWorkAttachments() {
+		return workAttachments;
+	}
+
+	public void setWorkAttachments(List<Workattachment> workAttachments) {
+		this.workAttachments = workAttachments;
+	}
+
+	public String getEdit() {
+		return edit;
+	}
+
+	public void setEdit(String edit) {
+		this.edit = edit;
+	}
+
+    public String getLinkId() {
+        return linkId;
+    }
+
+    public void setLinkId(String linkId) {
+        this.linkId = linkId;
+    }
+
+	public String getHome() {
+		return home;
+	}
+
+	public void setHome(String home) {
+		this.home = home;
+	}
+
+	public String getChange() {
+		return change;
+	}
+
+	public void setChange(String change) {
+		this.change = change;
+	}
+}

+ 80 - 0
src/main/java/com/jeeplus/modules/projectcontentinfo/service/ProjectBasedDataService.java

@@ -0,0 +1,80 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.projectcontentinfo.service;
+
+import java.util.List;
+
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.modules.project.entity.Project;
+import com.jeeplus.modules.projectrecord.entity.ProjectRecords;
+import com.jeeplus.modules.sys.dao.WorkattachmentDao;
+import com.jeeplus.modules.sys.entity.Workattachment;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.workclientinfo.dao.WorkClientAttachmentDao;
+import com.jeeplus.modules.workclientinfo.entity.WorkClientAttachment;
+import com.jeeplus.modules.workcontractinfo.entity.WorkContractInfo;
+import com.jeeplus.modules.workcontractinfo.service.WorkContractInfoService;
+import com.jeeplus.modules.workreimbursement.utils.VarStr;
+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.projectcontentinfo.entity.ProjectBasedData;
+import com.jeeplus.modules.projectcontentinfo.dao.ProjectBasedDataDao;
+
+/**
+ * 依据性资料Service
+ * @author 杨帆
+ * @version 2018-06-05
+ */
+@Service
+@Transactional(readOnly = true)
+public class ProjectBasedDataService extends CrudService<ProjectBasedDataDao, ProjectBasedData> {
+	@Autowired
+	private WorkattachmentDao workattachmentDao;
+
+	public ProjectBasedData get(String id) {
+		ProjectBasedData projectBasedData = super.get(id);
+		if(projectBasedData!=null) {
+            Workattachment workattachment = new Workattachment();
+            workattachment.setAttachmentId(id);
+            workattachment.setAttachmentFlag("84");
+            projectBasedData.setWorkAttachments(workattachmentDao.findList(workattachment));
+        }
+		return projectBasedData;
+	}
+
+	public String getNumber(ProjectRecords projectRecords) {
+		if (projectRecords!=null && StringUtils.isNotBlank(projectRecords.getId())){
+			ProjectBasedData projectBasedData = new ProjectBasedData();
+			projectBasedData.setProject(projectRecords);
+			ProjectBasedData value = dao.getNumber(projectBasedData);
+			if (value==null || StringUtils.isBlank(value.getNumber())){
+				return "001";
+			}else {
+				return UserUtils.getNumber(value.getNumber());
+			}
+		}else {
+			return "001";
+		}
+
+	}
+
+	public List<ProjectBasedData> findList(ProjectBasedData projectBasedData) {
+		return super.findList(projectBasedData);
+	}
+	
+	public Page<ProjectBasedData> findPage(Page<ProjectBasedData> page, ProjectBasedData projectBasedData) {
+		return super.findPage(page, projectBasedData);
+	}
+	
+	@Transactional(readOnly = false)
+	public void save(ProjectBasedData projectBasedData) {
+		super.save(projectBasedData);
+	}
+
+
+}

+ 192 - 0
src/main/java/com/jeeplus/modules/projectcontentinfo/service/ProjectContentDataService.java

@@ -0,0 +1,192 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.projectcontentinfo.service;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.modules.projectcontentinfo.dao.ProjectBasedDataDao;
+import com.jeeplus.modules.projectcontentinfo.dao.ProjectcontentinfoDao;
+import com.jeeplus.modules.projectcontentinfo.entity.ProjectBasedData;
+import com.jeeplus.modules.projectcontentinfo.entity.Projectcontentinfo;
+import com.jeeplus.modules.sys.dao.WorkattachmentDao;
+import com.jeeplus.modules.sys.entity.Workattachment;
+import com.jeeplus.modules.workreview.entity.WorkReviewAudit;
+import com.jeeplus.modules.workreview.entity.WorkReviewStandard;
+import com.jeeplus.modules.workreview.service.WorkReviewStandardService;
+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.projectcontentinfo.entity.ProjectContentData;
+import com.jeeplus.modules.projectcontentinfo.dao.ProjectContentDataDao;
+
+/**
+ * 工作内容详情Service
+ * @author yangfan
+ * @version 2018-06-05
+ */
+@Service
+@Transactional(readOnly = true)
+public class ProjectContentDataService extends CrudService<ProjectContentDataDao, ProjectContentData> {
+
+    @Autowired
+    private WorkattachmentDao workattachmentDao;
+    @Autowired
+    private ProjectBasedDataDao projectBasedDataDao;
+    @Autowired
+    private ProjectcontentinfoDao projectcontentinfoDao;
+    @Autowired
+    private WorkReviewStandardService workReviewStandardService;
+
+	public ProjectContentData get(String id) {
+        ProjectContentData projectContentData = super.get(id);
+        if(projectContentData!=null){
+            Workattachment workattachment = new Workattachment();
+            workattachment.setAttachmentId(id);
+            projectContentData.setWorkAttachments(workattachmentDao.findList(workattachment));
+        }
+        return projectContentData;
+    }
+
+    public void queryBasedData(ProjectContentData projectContentData){
+	    if (projectContentData==null || StringUtils.isBlank(projectContentData.getId()))return;
+        List<ProjectBasedData> list = projectBasedDataDao.queryListByContentId(projectContentData.getId());
+        projectContentData.setProjectBasedDataList(list);
+    }
+	
+	public List<ProjectContentData> findList(ProjectContentData projectContentData) {
+		return super.findList(projectContentData);
+	}
+	
+	public Page<ProjectContentData> findPage(Page<ProjectContentData> page, ProjectContentData projectContentData) {
+		return super.findPage(page, projectContentData);
+	}
+	
+	@Transactional(readOnly = false)
+	public void save(ProjectContentData projectContentData) {
+	    if(StringUtils.isBlank(projectContentData.getNumber())){
+	        Integer serialNum = dao.querySerialNum(projectContentData);
+            if (serialNum==null){
+                serialNum=0;
+            }
+            serialNum+=1;
+            String num = String.valueOf(serialNum);
+            StringBuffer sb = new StringBuffer();
+            for(int x = 0; x < (3 - num.length()); x++) {
+                sb.append("0");
+            }
+            sb.append(num);
+            projectContentData.setNumber(sb.toString());
+        }
+		super.save(projectContentData);
+	}
+	
+	@Transactional(readOnly = false)
+	public void delete(ProjectContentData projectContentData) {
+	    //删除附件
+	    if(projectContentData.getWorkAttachments()!=null&&!projectContentData.getWorkAttachments().isEmpty()){
+            for (Workattachment workattachment : projectContentData.getWorkAttachments()) {
+                workattachmentDao.delete(workattachment);
+            }
+        }
+        //删除资料关联
+        dao.deleteBasedByContentId(projectContentData.getId());
+		super.delete(projectContentData);
+	}
+
+    @Transactional(readOnly = false)
+    public void saveBasedData(String contentId,List<ProjectBasedData> projectBasedDataList) {
+        Iterator<ProjectBasedData> iterator = projectBasedDataList.iterator();
+        while (iterator.hasNext()){
+            ProjectBasedData basedData = iterator.next();
+            if(basedData==null||StringUtils.isBlank(basedData.getId())){
+                iterator.remove();
+            }
+        }
+        HashMap<String, Object> map = new HashMap<>(5);
+        map.put("contentId", contentId);
+        map.put("projectBasedDataList", projectBasedDataList);
+        dao.batchInsertBaseData(map);
+    }
+
+    @Transactional(readOnly = false)
+    public void deleteBased(String contentId,String basedId) {
+        int i = dao.deleteBasedData(contentId, basedId);
+        if(i==0){
+            return;
+        }
+        //删除菜单
+        Projectcontentinfo parent = projectcontentinfoDao.getByInfoId(contentId);
+        Projectcontentinfo select2 = new Projectcontentinfo();
+        select2.setParent(parent);
+        select2.setProject(parent.getProject());
+        select2.setName("依据资料");
+        List<Projectcontentinfo> infos = projectcontentinfoDao.findListByParentSelective(select2);
+        Projectcontentinfo projectcontentinfo = infos.get(0);
+        select2.setParent(projectcontentinfo);
+        select2.setName(null);
+//        select2.setLinkId(basedId);
+        select2.setInfoId(basedId);
+        //删除当前菜单
+        projectcontentinfoDao.deleteByParentAndLinkId(select2);
+        //是否删除父级菜单
+        select2.setInfoId(null);
+        select2.setLinkId(null);
+        List<Projectcontentinfo> sonList = projectcontentinfoDao.findListByParentSelective(select2);
+        if(sonList==null || sonList.isEmpty()){
+            projectcontentinfoDao.delete(projectcontentinfo);
+        }
+    }
+
+    @Transactional(readOnly = false)
+    public void deleteContent(String contentId,String reportId,String projectId,String type) {
+        //String linkId = dao.findByLinkId(contentId,projectId);
+        dao.deleteReportDataInfo(contentId,reportId,type);
+        dao.deleteReportDataMenu(contentId,projectId,reportId);
+    }
+    @Transactional(readOnly = false)
+    public void saveReportContent(String contentId,String reportId,String type) {
+        dao.saveReportContent(contentId,reportId,type);
+    }
+
+    public Integer countBased(String basedId) {
+        return dao.countByBaseId(basedId);
+    }
+    public List<WorkReviewAudit> findListReviewAudit(String reviewId,String name,String infoId) {
+        WorkReviewStandard workReviewStandard = new WorkReviewStandard();
+        workReviewStandard.setStandardDetail(name);
+        String reviewIds = "0,"+reviewId+",";
+        workReviewStandard.setParentIds(reviewIds);
+        workReviewStandard.setType(reviewId);
+        List<WorkReviewStandard> workReviewStandards = workReviewStandardService.findListByType(workReviewStandard);
+        List<WorkReviewAudit> workReviewAudits = new ArrayList<>();
+        for (WorkReviewStandard reviewStandard:workReviewStandards){
+            int orderNum = Integer.parseInt(reviewStandard.getOrderNum());
+            if (orderNum>999){
+                WorkReviewAudit workReviewAudit = new WorkReviewAudit();
+                workReviewAudit.setReportId(infoId);
+                workReviewAudit.setMaxDeduct(reviewStandard.getMaxDeduct());
+                workReviewAudit.setOrderNum(reviewStandard.getOrderNum());
+                workReviewAudit.setStandardDetail(reviewStandard.getStandardDetail());
+                workReviewAudit.setSort(reviewStandard.getSort());
+                workReviewAudit.setId(reviewStandard.getId());
+                if (orderNum>999 && orderNum<2000){
+					workReviewAudit.setType("1");
+					workReviewAudit.setParent(new WorkReviewAudit("0"));
+					workReviewAudit.setParentIds("0,");
+                }
+                if (StringUtils.isNotBlank(workReviewAudit.getType())) {
+                    workReviewAudits.add(workReviewAudit);
+                }
+            }
+        }
+        return workReviewAudits;
+    }
+}

+ 934 - 0
src/main/java/com/jeeplus/modules/projectcontentinfo/service/ProjectReportChangeService.java

@@ -0,0 +1,934 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.projectcontentinfo.service;
+
+import com.google.common.collect.Maps;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.service.CrudService;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.websocket.onchat.ChatServerPool;
+import com.jeeplus.modules.act.entity.Act;
+import com.jeeplus.modules.act.service.ActTaskService;
+import com.jeeplus.modules.projectcontentinfo.dao.ProjectBasedDataDao;
+import com.jeeplus.modules.projectcontentinfo.dao.ProjectContentDataDao;
+import com.jeeplus.modules.projectcontentinfo.dao.ProjectReportChangeDao;
+import com.jeeplus.modules.projectcontentinfo.dao.ProjectReportDataDao;
+import com.jeeplus.modules.projectcontentinfo.entity.ProjectReportData;
+import com.jeeplus.modules.projectcontentinfo.entity.ProjectReportRecord;
+import com.jeeplus.modules.projectrecord.entity.ProjectRecords;
+import com.jeeplus.modules.projectrecord.service.ProjectRecordsService;
+import com.jeeplus.modules.sys.dao.WorkattachmentDao;
+import com.jeeplus.modules.sys.entity.Office;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.entity.Workattachment;
+import com.jeeplus.modules.sys.service.OfficeService;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.workactivity.dao.WorkActivityProcessDao;
+import com.jeeplus.modules.workactivity.entity.Activity;
+import com.jeeplus.modules.workactivity.entity.WorkActivityProcess;
+import com.jeeplus.modules.workactivity.service.ActivityService;
+import com.jeeplus.modules.workactivity.service.WorkActivityProcessService;
+import com.jeeplus.modules.workactivitymenu.entity.WorkActivityMenu;
+import com.jeeplus.modules.workactivitymenu.service.WorkActivityMenuService;
+import com.jeeplus.modules.workcontent.web.WorkContentTypeController;
+import com.jeeplus.modules.workprojectnotify.entity.WorkProjectNotify;
+import com.jeeplus.modules.workprojectnotify.service.WorkProjectNotifyService;
+import com.jeeplus.modules.workprojectnotify.util.UtilNotify;
+import com.jeeplus.modules.workreview.dao.WorkReviewAuditDao;
+import com.jeeplus.modules.workreview.entity.WorkReviewAudit;
+import org.activiti.engine.*;
+import org.activiti.engine.history.HistoricProcessInstance;
+import org.activiti.engine.runtime.ProcessInstance;
+import org.activiti.engine.task.Task;
+import org.java_websocket.WebSocket;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 报告变更变更详情Service
+ * @author yangfan
+ * @version 2018-06-05
+ */
+@Service
+@Transactional(readOnly = true)
+public class ProjectReportChangeService extends CrudService<ProjectReportChangeDao, ProjectReportData> {
+
+	@Autowired
+	private WorkattachmentDao workattachmentDao;
+	@Autowired
+	private RuntimeService runtimeService;
+	@Autowired
+	protected TaskService taskService;
+	@Autowired
+	private ProjectBasedDataDao projectBasedDataDao;
+	@Autowired
+	protected HistoryService historyService;
+	@Autowired
+	protected RepositoryService repositoryService;
+	@Autowired
+	private IdentityService identityService;
+	@Autowired
+	private ActTaskService actTaskService;
+	@Autowired
+	private WorkProjectNotifyService workProjectNotifyService;
+	@Autowired
+	private WorkActivityMenuService workActivityMenuService;
+	@Autowired
+	private WorkActivityProcessService workActivityProcessService;
+	@Autowired
+	private ActivityService activityService;
+	@Autowired
+	private WorkActivityProcessDao workActivityProcessDao;
+	@Autowired
+	private ProjectContentDataDao projectContentDataDao;
+	@Autowired
+	private ProjectReportRecordService projectReportRecordService;
+	@Autowired
+	private ProjectRecordsService projectRecordsService;
+	@Autowired
+	private OfficeService officeService;
+	@Autowired
+	private WorkReviewAuditDao workReviewAuditDao;
+	@Autowired
+	private ProjectReportDataDao projectReportDataDao;
+
+	public ProjectReportData get(String id) {
+		ProjectReportData projectReportData = super.get(id);
+		if (projectReportData!=null && StringUtils.isNotBlank(projectReportData.getId())) {
+			List<Workattachment> list = new ArrayList<>();
+			Workattachment workattachment = new Workattachment();
+			workattachment.setAttachmentId(id);
+			workattachment.setAttachmentFlag("87");
+			list.addAll(workattachmentDao.findList(workattachment));
+			Workattachment attachment = new Workattachment();
+			attachment.setAttachmentId(projectReportData.getReportId());
+			attachment.setAttachmentFlag("86");
+			list.addAll(workattachmentDao.findList(attachment));
+			projectReportData.setWorkAttachments(list);
+			/*if (projectReportData.getSignCostOne() != null && StringUtils.isNotBlank(projectReportData.getSignCostOne().getId())) {
+				projectReportData.setSignCostOne(UserUtils.get(projectReportData.getSignCostOne().getId()));
+			}
+			if (projectReportData.getSignCostTwo() != null && StringUtils.isNotBlank(projectReportData.getSignCostTwo().getId())) {
+				projectReportData.setSignCostTwo(UserUtils.get(projectReportData.getSignCostTwo().getId()));
+			}*/
+			projectReportData.setProjectContentDataList(projectContentDataDao.findReportContent(projectReportData.getId(), "2"));
+			projectReportData.setProjectBasedDataList(projectBasedDataDao.findReportBased(projectReportData.getId(),"4"));
+			WorkReviewAudit workReviewAudit = new WorkReviewAudit();
+			workReviewAudit.setType("1");
+			workReviewAudit.setReportId(projectReportData.getId());
+			workReviewAudit.setCompanyId(projectReportData.getCompanyId());
+			projectReportData.setProjectReviewList(workReviewAuditDao.findList(workReviewAudit));
+		}
+		return projectReportData;
+	}
+	public List<Workattachment> getWorkattachments(String id) {
+		ProjectReportData projectReportData = super.get(id);
+		if (projectReportData!=null && StringUtils.isNotBlank(projectReportData.getId())) {
+			List<Workattachment> list = new ArrayList<>();
+			Workattachment workattachment = new Workattachment();
+			workattachment.setAttachmentId(id);
+			workattachment.setAttachmentFlag("87");
+			list.addAll(workattachmentDao.findList(workattachment));
+			Workattachment attachment = new Workattachment();
+			attachment.setAttachmentId(projectReportData.getReportId());
+			attachment.setAttachmentFlag("86");
+			list.addAll(workattachmentDao.findList(attachment));
+			return list;
+		}else {
+			return new ArrayList<>();
+		}
+	}
+
+	public ProjectReportData getBefore(String id) {
+		ProjectReportData projectReportData = super.get(id);
+		List<Workattachment> list = new ArrayList<>();
+		Workattachment attachment = new Workattachment();
+		String reportId = projectReportData.getReportId();
+		if (StringUtils.isBlank(reportId)){
+			reportId = id;
+		}
+		attachment.setAttachmentId(reportId);
+		attachment.setAttachmentFlag("86");
+		list.addAll(workattachmentDao.findList(attachment));
+		projectReportData.setWorkAttachments(list);
+		/*if (projectReportData.getSignCostOne()!=null && StringUtils.isNotBlank(projectReportData.getSignCostOne().getId())){
+			projectReportData.setSignCostOne(UserUtils.get(projectReportData.getSignCostOne().getId()));
+		}
+		if (projectReportData.getSignCostTwo()!=null && StringUtils.isNotBlank(projectReportData.getSignCostTwo().getId())){
+			projectReportData.setSignCostTwo(UserUtils.get(projectReportData.getSignCostTwo().getId()));
+		}*/
+		if (reportId.equals(id)){
+			projectReportData.setProjectContentDataList(projectContentDataDao.findReportContent(reportId,"1"));
+			projectReportData.setProjectBasedDataList(projectBasedDataDao.findReportBased(projectReportData.getId(),"3"));
+		}else {
+			projectReportData.setProjectContentDataList(projectContentDataDao.findReportContent(reportId,"2"));
+			projectReportData.setProjectBasedDataList(projectBasedDataDao.findReportBased(projectReportData.getId(),"4"));
+		}
+		/*projectReportData.setProjectContentDataList(projectContentDataDao.findReportContent(projectReportData.getId(), "2"));
+		projectReportData.setProjectBasedDataList(projectBasedDataDao.findReportBased(projectReportData.getId(),"4"));*/
+		WorkReviewAudit workReviewAudit = new WorkReviewAudit();
+		workReviewAudit.setType("1");
+		workReviewAudit.setReportId(projectReportData.getId());
+		workReviewAudit.setCompanyId(projectReportData.getCompanyId());
+		projectReportData.setProjectReviewList(workReviewAuditDao.findList(workReviewAudit));
+		return projectReportData;
+	}
+	public ProjectReportData findByBefore(ProjectReportData reportData) {
+		ProjectReportData projectReportData = dao.findByBefore(reportData);
+
+		return projectReportData;
+	}
+
+	public List<ProjectReportData> findList(ProjectReportData projectReportData) {
+		return super.findList(projectReportData);
+	}
+	
+	public Page<ProjectReportData> findPage(Page<ProjectReportData> page, ProjectReportData projectReportData) {
+		return super.findPage(page, projectReportData);
+	}
+
+
+	@Transactional(readOnly = false)
+	public void reportNumber(String reportId,String number) {
+		dao.reportNumber(reportId,number);
+	}
+
+	@Transactional(readOnly = false)
+	public void save(ProjectReportData projectReportData) {
+		super.save(projectReportData);
+	}
+	@Transactional(readOnly = false)
+	public void update(ProjectReportData projectReportData) {
+		projectReportData.preUpdate();
+		dao.update(projectReportData);
+	}
+	@Transactional(readOnly = false)
+	public void insert(ProjectReportData projectReportData) {
+		dao.insert(projectReportData);
+	}
+	@Transactional(readOnly = false)
+	public void saveInvalid(ProjectReportData projectReportData) {
+		dao.saveInvalid(projectReportData);
+	}
+
+	@Transactional(readOnly = false)
+	public void delete(ProjectReportData projectReportData) {
+		//dao.deleteContentChange(projectReportData.getId());
+		dao.deleteReportDataInfo(projectReportData.getId());
+		super.delete(projectReportData);
+	}
+	@Transactional(readOnly = false)
+	public void deleteReportDataInfo(ProjectReportData projectReportData) {
+		dao.deleteReportDataInfo(projectReportData.getId());
+	}
+	@Transactional(readOnly = false)
+	public void deleteReportDataBased(ProjectReportData projectReportData) {
+		dao.deleteReportDataBased(projectReportData.getId());
+	}
+	@Transactional(readOnly = false)
+	public void deleteTree(ProjectReportData projectReportData) {
+		dao.deleteTree(projectReportData);
+	}
+	@Transactional(readOnly = false)
+	public void changeProjectReportData(ProjectReportData projectReportData) {
+		projectReportData.setId(projectReportData.getReportId());
+		dao.changeProjectReportData(projectReportData);
+	}
+
+	/**
+	 * 提交存储
+	 * @param projectReportData
+	 * @param variables
+	 */
+	@Transactional(readOnly = false)
+	public String save(ProjectReportData projectReportData,Map<String, Object> variables,String processInstanceId,List<User> masters) {
+		User user = UserUtils.getUser();
+		Boolean insert = false;
+		if (StringUtils.isBlank(projectReportData.getId())){
+			projectReportData.preInsert();
+			insert = true;
+		}
+		ProjectRecords projectRecords = projectRecordsService.get(projectReportData.getProject());
+		Office recordsOffice =officeService.get(projectRecords.getOffice());
+		String title = "报告名称:"+projectReportData.getName();
+		String str =  "变更编号"+projectReportData.getNumber()+",报告名称:"+projectReportData.getName()+",工作内容类型:"+ WorkContentTypeController.getContentTypeName(projectReportData.getType(),"")+",项目所属部门:"+recordsOffice.getName()+",负责人:"+user.getName();
+
+		//String title = "报告变更变更发起人:"+user.getName()+",报告变更名称:"+projectReportData.getName()+"待审批!";
+		//String str =  "报告变更变更发起人:"+user.getName()+",报告变更名称:"+projectReportData.getName()+",报告变更编号:"+projectReportData.getNumber()+" 待审批!";
+		// 用来设置启动流程的人员ID,引擎会自动把用户ID保存到activiti:initiator中
+		identityService.setAuthenticatedUserId(user.getId());
+		// 启动流程
+		String businessKey = projectReportData.getId().toString();
+		WorkActivityMenu workActivityMenu = workActivityMenuService.findByParentAndOffice("9864872f45b84acd893010e66a3db2c8", recordsOffice);
+		// 启动流程
+		String processType = workActivityMenu.getProcessType();
+		StringBuffer buffer = new StringBuffer();
+		Activity activity = new Activity();
+		WorkProjectNotify workProjectNotify = UtilNotify
+				.saveNotify(projectReportData.getId(),
+						null,
+						projectReportData.getCompanyId(),
+						title,
+						str,
+						"46",
+						"0",
+						"待审批",
+						""
+				);
+		List<User> users = new ArrayList<>();
+		if (insert) {
+			this.insert(projectReportData);
+		}else {
+			this.save(projectReportData);
+		}
+//		List<User> bmzrs = UserUtils.getByRoleActivityEnname("bmzr",2,recordsOffice.getId(),"12",projectReportData.getCreateBy());
+//		List<User> bzshbygs = UserUtils.getByRoleActivityEnname("bzshbyg",3,recordsOffice.getId(),"12",projectReportData.getCreateBy());
+		List<User> bzshbs = UserUtils.getByRoleActivityEnname("bzshb",3,recordsOffice.getId(),"12",projectReportData.getCreateBy());
+//		List<User> fglds = UserUtils.getByRoleActivityEnname("fgld",2,recordsOffice.getId(),"12",projectReportData.getCreateBy());
+//		List<User> fgzlfzs = UserUtils.getByRoleActivityEnname("zlfgld",3,recordsOffice.getId(),"12",projectReportData.getCreateBy());
+		List<User> glydas = UserUtils.getByRoleActivityEnname("bggdgly",3,recordsOffice.getId(),"12",projectReportData.getCreateBy());
+		List<User> gzrs = UserUtils.getByRoleActivityEnname("gzr",3,recordsOffice.getId(),"12",projectReportData.getCreateBy());
+
+		if (StringUtils.isNotBlank(workActivityMenu.getId())) {
+			workProjectNotify.setNotifyRole("");
+			workActivityMenu = workActivityMenuService.get(workActivityMenu.getId());
+			List<Activity> activities = workActivityMenu.getActivities();
+			for (Activity a : activities) {
+				String encount = a.getEncount();
+				String enlist = a.getEnlist();
+				if (a.getRole()!=null && StringUtils.isNotBlank(a.getRole().getEnname())){
+					List enusers = UserUtils.getByRoleActivityEnnames(a.getRole().getEnname(),recordsOffice.getId(),"8",projectReportData.getCreateBy());
+					if (enusers.size()==0){
+							/*dao.delete(projectReportData);
+							for (Workattachment workattachment : projectReportData.getWorkAttachments()) {
+								workattachmentDao.delete(workattachment);
+							}*/
+						projectReportData.setStatus("1");
+						this.save(projectReportData);
+						return "报告变更变更流程审批人不能为空,角色"+a.getRole().getName()+"下无用户,请联系管理员!";
+					}
+					variables.put(enlist, enusers);
+					variables.put(encount, enusers.size());
+				}
+				if (a.getDelFlag().equals("0") && a.getCount() == 1) {
+					activity = a;
+				}
+			}
+			buffer.append(activity.getRole().getEnname());
+			if (activity != null && StringUtils.isNotBlank(activity.getId())) {
+				//角色审批
+				if (StringUtils.isNotBlank(activity.getRole().getEnname())) {
+					users = UserUtils.getByRoleActivityEnnames(activity.getRole().getEnname(),recordsOffice.getId(),"8",projectReportData.getCreateBy());
+				}
+				//人员审批
+				if (StringUtils.isNotBlank(activity.getUser().getId())) {
+					users.add(activity.getUser());
+				}
+			}
+			workProjectNotify.setId("");
+		} else {
+				/*variables.put("masterList", masters);
+				variables.put("bmzrList", bmzrs);
+				variables.put("bzshbList", bzshbs);
+				variables.put("fgldList", fglds);
+				variables.put("fgzlfzList", fgzlfzs);
+				variables.put("glydaList", glydas);
+				variables.put("gzrList", gzrs);*/
+			if (masters.size()==0 ){
+				projectReportData.setStatus("1");
+				this.save(projectReportData);
+			}
+			if (masters.size()==0){
+				return "报告变更变更流程审批人不能为空,项目负责人下无用户,请联系管理员!";
+			}
+				/*if (bmzrs.size()==0){
+					return "报告变更变更流程审批人不能为空,角色部门负责人下无用户,请联系管理员!";
+				}
+				if (fglds.size()==0){
+					return "报告变更变更流程审批人不能为空,角色分管领导下无用户,请联系管理员!";
+				}
+				if (bzshbs.size()==0){
+					return "报告变更变更流程审批人不能为空,标准审核部下无用户,请联系管理员!";
+				}
+				if (fgzlfzs.size()==0){
+					return "报告变更变更流程审批人不能为空,分管质量副总下无用户,请联系管理员!";
+				}
+				if (glydas.size()==0){
+					return "报告变更变更流程审批人不能为空,档案管理员下无用户,请联系管理员!";
+				}
+				if (gzrs.size()==0){
+					return "报告变更变更流程审批人不能为空,盖章人下无用户,请联系管理员!";
+				}*/
+				/*variables.put("bmzrcount",bmzrs.size());
+				variables.put("bzshbcount",bzshbs.size());
+				variables.put("fgldcount",fglds.size());
+				variables.put("fgzlfzcount",fgzlfzs.size());
+				variables.put("glydacount",glydas.size());
+				variables.put("gzrcount",gzrs.size());*/
+			processType = "reportAudit";
+			users.addAll(masters);
+			variables.put("masterList", masters);
+			variables.put("mastercount", masters.size());
+		}
+		for (User u : users){
+			workProjectNotify.setUser(u);
+			workProjectNotify.setId("");
+			workProjectNotify.setNotifyRole("项目负责人审批");
+			workProjectNotifyService
+					.save(workProjectNotify);
+//			Map<String,Object> extras = new HashMap<>();
+//			extras.put("type","7001");
+//			extras.put("id",workProjectNotify.getId());
+//			extras.put("procDefKey","46");
+//			UserUtils.pushInfoToApp(title,str,extras,u.getId());
+//			UserUtils.pushIm(u.getId(),"报告变更变更发起人:\" + user.getName() + \",报告变更名称:\"+ projectReportData.getName() + \" 待审批!");
+		}
+		variables.put("type", processType);
+		variables.put("busId", businessKey);
+		variables.put("title", "审批单:" + projectReportData.getNumber());//设置标题;
+
+		ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processType, businessKey, variables);
+
+		projectReportData.setProcessInstance(processInstance);
+		if (StringUtils.isNotBlank(processInstanceId)) {
+			workActivityProcessService.updateProcessInstanceId(processInstance.getId(),processInstanceId);
+			workActivityProcessService.deleteProcessInstanceId(processInstanceId);
+			workActivityProcessService.deleteProcessIdAuditUsers(processInstanceId);
+		}
+		// 更新流程实例ID
+		projectReportData.setProcessInstanceId(processInstance.getId());
+		dao.updateProcessInstanceId(projectReportData);
+		projectReportDataDao.updateUpId(projectReportData.getReportId(),processInstance.getId());
+		List<Activity> list = workActivityMenu.getActivities();
+		if (list != null && list.size() != 0) {
+			workActivityProcessService.saveList(list, processInstance.getId());
+		} else {
+			WorkActivityProcess workActivityProcess = new WorkActivityProcess();
+			workActivityProcess.setCount(1);
+			workActivityProcess.setProcessKey(processType);
+			workActivityProcess.setProcessInstanceId(processInstance.getId());
+			workActivityProcess.setIsApproval("0");
+			workActivityProcessService.insert(workActivityProcess);
+			workActivityProcess.setCount(2);
+			workActivityProcessService.insert(workActivityProcess);
+			workActivityProcess.setCount(3);
+			workActivityProcessService.insert(workActivityProcess);
+			workActivityProcess.setCount(4);
+			workActivityProcessService.insert(workActivityProcess);
+//			workActivityProcess.setCount(5);
+//			workActivityProcessService.insert(workActivityProcess);
+//			workActivityProcess.setCount(6);
+//			workActivityProcessService.insert(workActivityProcess);
+//			workActivityProcess.setCount(7);
+//			workActivityProcessService.insert(workActivityProcess);
+//			workActivityProcess.setCount(8);
+//			workActivityProcessService.insert(workActivityProcess);
+			workActivityProcessService.insertAuditsByType(masters,processInstance.getId(),1,1);
+//			workActivityProcessService.insertAuditsByType(bmzrs,processInstance.getId(),2,0);
+//			workActivityProcessService.insertAuditsByType(bzshbygs,processInstance.getId(),3,0);
+			workActivityProcessService.insertAuditsByType(bzshbs,processInstance.getId(),2,0);
+//			workActivityProcessService.insertAuditsByType(fglds,processInstance.getId(),5,0);
+//			workActivityProcessService.insertAuditsByType(fgzlfzs,processInstance.getId(),6,0);
+			workActivityProcessService.insertAuditsByType(glydas,processInstance.getId(),4,0);
+			workActivityProcessService.insertAuditsByType(gzrs,processInstance.getId(),3,0);
+		}
+		return "true";
+	}
+
+	/**
+	 * 合同作废:强制撤销
+	 * @param projectReportData
+	 */
+	@Transactional(readOnly = false)
+	public void cancelInvalidate(ProjectReportData projectReportData) {
+		try {
+			String invalidateProcessInstanceId = projectReportData.getProcessInstanceId();
+			//将流程图中尚未走到的task的流程追踪信息逻辑删除,添加一条"撤销"流程追踪信息
+			WorkActivityProcess process = new WorkActivityProcess();
+			process.setProcessInstanceId(projectReportData.getProcessInstanceId());
+			process.setIsApproval("0");
+			//List<WorkActivityProcess> processList1 = workActivityProcessService.findByProcInsId(process);
+			WorkActivityProcess workActivityProcess = new WorkActivityProcess();
+			workActivityProcess.setProcessInstanceId(projectReportData.getProcessInstanceId());
+			List<WorkActivityProcess> processList = workActivityProcessService.findList(workActivityProcess);
+			WorkProjectNotify notify = new WorkProjectNotify();
+			notify.setNotifyId(projectReportData.getId());
+			List<User> userList = workProjectNotifyService.readByNotifyId(notify);
+			if (userList!=null && userList.size()!=0) {
+				for (User u : userList) {
+					User user = UserUtils.get(u.getId());
+					UserUtils.pushMeIm(user.getId());
+				}
+			}
+			if(processList!=null && processList.size()>0){
+				for (int i =0;i<processList.size();i++) {
+					WorkActivityProcess p = processList.get(i);
+					if(StringUtils.isNotBlank(p.getIsApproval()) && "0".equals(p.getIsApproval())){
+						p.setDelFlag("1");
+						p.setIsApproval("-1");
+						workActivityProcessDao.updateDelFlagAndIsApproval(p);
+					}
+				}
+				WorkActivityProcess pro = new WorkActivityProcess();
+				pro.setId("");
+				pro.preInsert();
+				pro.setDelFlag("0");
+				pro.setRemarks("[强制撤销]");
+				pro.setProcessKey(processList.get(0).getProcessKey());
+				pro.setIsApproval("1");
+				pro.setProcessInstanceId(processList.get(0).getProcessInstanceId());
+				pro.setCount(0);
+				workActivityProcessDao.insert(pro);
+			}
+
+			//结束该流程,设为"撤销"状态
+			actTaskService.endProcessInstance(invalidateProcessInstanceId,"报告变更变更-强制撤销");
+			projectReportData.setStatus("3");
+			update(projectReportData);
+
+		}catch (ActivitiObjectNotFoundException e){
+			System.err.println("报告变更变更撤销异常,因为这个流程已不存在!");
+			e.printStackTrace();
+		}
+		catch (Exception e) {
+			e.printStackTrace();
+		}
+
+	}
+
+
+	/**
+	 * 审核流程
+	 * @param reportData
+	 */
+	@Transactional(readOnly = false)
+	public String auditSave(ProjectReportData reportData,List<User> auditUsers) {
+		String flag = reportData.getAct().getFlag();
+		Act act = reportData.getAct();
+		ProjectReportData projectReportData = null;
+		// 对不同环节的业务逻辑进行操作
+		String taskDefKey = act.getTaskDefKey();
+		if (!"modifyApply".equals(taskDefKey) && !taskDefKey.contains("audit")  ) {
+			actTaskService.claim(act.getTaskId(), UserUtils.getUser().getId());
+			projectReportData = get(reportData.getId());
+		}else {
+			projectReportData = reportData;
+			flag = "yes";
+		}
+		User user= UserUtils.get(projectReportData.getCreateBy().getId());
+		ProjectRecords projectRecords = projectRecordsService.get(projectReportData.getProject());
+		projectRecordsService.getQueryProjectMasters(projectRecords);
+		Office recordsOffice =officeService.get(projectRecords.getOffice());
+		String title = "报告名称:"+projectReportData.getName();
+		String str =  "变更编号"+projectReportData.getNumber()+",报告名称:"+projectReportData.getName()+",工作内容类型:"+ WorkContentTypeController.getContentTypeName(projectReportData.getType(),"")+",项目所属部门:"+recordsOffice.getName()+",负责人:"+user.getName();
+		if (StringUtils.isBlank(act.getComment())){
+			act.setComment(flag.equals("yes")?"同意":"驳回");
+		}
+		String comment = "";
+		if (projectReportData.getStatus().equals("4")){
+			comment = ("yes".equals(flag)?"[重新申请] ":"[已撤销] ");
+		}else {
+			comment = ("yes".equals(flag)?"[同意] ":"[驳回] ")+act.getComment();
+		}
+		//yes 的时候状态为审核通过 否则为未通过
+		//1 审核中 2 未通过
+		projectReportData.setStatus(("yes".equals(flag) ? "2" : "4"));
+		Map<String, Object> vars = Maps.newHashMap();
+		//业务逻辑对应的条件表达式
+		String exp = "";
+		String taskCount = "";
+		String notifyRole = "";
+		int key = 0;
+		String enname = "";
+		List<Activity> activitieList = activityService.getByProcessInstanceId(projectReportData.getProcessInstanceId());
+		WorkActivityMenu workActivityMenu = new WorkActivityMenu();
+		if (activitieList != null && activitieList.size() != 0) {
+			workActivityMenu.setProcessType(activitieList.get(0).getProcessKey());
+			workActivityMenu.setActivities(activitieList);
+		}
+
+		WorkActivityProcess workActivityProcess = new WorkActivityProcess();
+		WorkActivityProcess selectProcess = new WorkActivityProcess();
+		selectProcess.setProcessInstanceId(projectReportData.getProcessInstanceId());
+		List<WorkActivityProcess> workActivityProcesses = workActivityProcessService.findList(selectProcess);
+		List<Activity> activities = workActivityMenu.getActivities();
+		if (StringUtils.isNotBlank(workActivityMenu.getProcessType()) && !workActivityMenu.getProcessType().equals("reportAudit")) {
+			key = 1;
+			for (int i = 0; i < workActivityProcesses.size(); i++) {
+				WorkActivityProcess activityProcess = workActivityProcesses.get(i);
+				if (taskDefKey.equals(activityProcess.getActivityTask()) && !taskDefKey.equals("modifyApply")) {
+					taskCount = activityProcess.getCount()+"";
+					workActivityProcess = activityProcess;
+					if (!workActivityProcess.getIsApproval().equals("0")) {
+						workActivityProcess.setId("");
+					}
+					exp = "pass";
+					if (!"yes".equals(flag)) {
+						projectReportData.setStatus("4");
+						String returnBack = "-1";
+						workActivityProcess.setIsApproval("2");
+						for (Activity activity : activities) {
+							if (activity.getCount() == activityProcess.getCount()) {
+								notifyRole = activity.getName();
+								returnBack = activity.getReturnBack();
+								break;
+							}
+						}
+						if (returnBack.equals("0")) {
+							workActivityProcess.setId("");
+						}
+
+					} else {
+						workActivityProcess.setIsApproval("1");
+					}
+				}else if(taskDefKey.equals("modifyApply")){
+					notifyRole = "调整报告变更";
+					taskCount = "0";
+					exp = "pass";
+					workActivityProcess.setId("");
+					workActivityProcess.setCount(0);
+					if (!"yes".equals(flag)) {
+						projectReportData.setStatus("3");
+						workActivityProcess.setIsApproval("2");
+					} else {
+						workActivityProcess.setIsApproval("1");
+					}
+					break;
+				}
+			}
+		} else {
+			workActivityMenu.setProcessType("reportAudit");
+			for (int i = 0; i < workActivityProcesses.size(); i++) {
+				WorkActivityProcess activityProcess = workActivityProcesses.get(i);
+				String count = activityProcess.getCount() + "";
+				workActivityProcess = activityProcess;
+				if (!workActivityProcess.getIsApproval().equals("0")) {
+					workActivityProcess.setId("");
+				}
+				// 审核环节
+				if ("master".equals(taskDefKey) && count.contains("1")) {
+					taskCount = "1";
+					exp = "pass";
+					if ("yes".equals(flag)) {
+						workActivityProcessService.insertAuditsByType(auditUsers,reportData.getProcessInstanceId(),2,1);
+
+						notifyRole = "标准审核部审批";
+						workActivityProcess.setIsApproval("1");
+						enname = "bzshb";
+						vars.put("bzshbList", auditUsers);
+						vars.put("bzshbcount",auditUsers.size());
+					} else {
+						notifyRole = "调整报告";
+						workActivityProcess.setIsApproval("2");
+					}
+					break;
+				}else if ("bzshb".equals(taskDefKey) && count.contains("2")) {
+					taskCount = "2";
+					exp = "pass";
+					if ("yes".equals(flag)) {
+						workActivityProcessService.insertAuditsByType(auditUsers,reportData.getProcessInstanceId(),5,1);
+
+						notifyRole = "盖章人盖章";
+						workActivityProcess.setIsApproval("1");
+						enname = "gzr";
+						vars.put("gzrList", auditUsers);
+						vars.put("gzrcount",auditUsers.size());
+					} else {
+						notifyRole = "调整报告";
+						workActivityProcess.setIsApproval("2");
+					}
+					break;
+				}else if ("gzr".equals(taskDefKey) && count.contains("3")) {
+					taskCount = "3";
+					exp = "pass";
+					if ("yes".equals(flag)) {
+						notifyRole = "审批通过";
+						workActivityProcess.setIsApproval("1");
+					} else {
+						notifyRole = "调整报告";
+						workActivityProcess.setIsApproval("2");
+					}
+					break;
+				} else if ("modifyApply".equals(taskDefKey)&& count.contains("0")) {
+					notifyRole = "负责人审批";
+					taskCount = "0";
+					exp = "pass";
+					workActivityProcess.setCount(0);
+					enname = "master";
+					if (!"yes".equals(flag)) {
+						projectReportData.setStatus("3");
+					}
+					break;
+				}
+			}
+		}
+		// 设置意见
+		act.setComment(("yes".equals(flag) ? "[同意] " : "[驳回] ") + act.getComment());
+		projectReportData.preUpdate();
+		// 提交流程任务
+		vars.put(exp, "yes".equals(flag) ? true : false);
+		vars.put("passs", true);
+		workActivityProcessService.updateProcess(workActivityProcess,workActivityMenu,key,taskCount,projectReportData.getProcessInstanceId(),taskDefKey,"modifyApply",flag,comment, activities);
+		// 提交流程任务
+		actTaskService.complete(act.getTaskId(), act.getProcInsId(), act.getComment(), vars);
+		boolean state = actTaskService.isProcessEnd(act.getProcInsId());
+		List<User> users = new ArrayList<>();
+		List<User> userList = new ArrayList<>();
+		boolean status = false;
+		if (!state) {
+//            str = "yes".equals(flag)?"您的报销单审核:已通过":"您的报销单审核:未通过";
+			users.add(projectReportData.getCreateBy());
+			if ("yes".equals(flag)) {
+				str =  "变更编号"+projectReportData.getNumber()+",报告名称:"+projectReportData.getName()+",工作内容类型:"+ WorkContentTypeController.getContentTypeName(projectReportData.getType(),"")+",项目所属部门:"+recordsOffice.getName();
+
+				projectReportData.setStatus("5");
+				status = true;
+				WorkProjectNotify notify = new WorkProjectNotify();
+				notify.setNotifyId(projectReportData.getId());
+				userList = workProjectNotifyService.readByNotifyId(notify);
+				workProjectNotifyService
+						.save(UtilNotify
+								.saveNotify(projectReportData.getId(),
+										projectReportData.getCreateBy(),
+										projectReportData.getCompanyId(),
+										title,
+										str,
+										"46",
+										"0",
+										"待通知",
+										notifyRole));
+			} else {
+				WorkProjectNotify notify = new WorkProjectNotify();
+				notify.setNotifyId(projectReportData.getId());
+				userList = workProjectNotifyService.readByNotifyId(notify);
+				if (StringUtils.isNotBlank(projectReportData.getStatus()) && !projectReportData.getStatus().equals("3")){
+					projectReportData.setStatus("4");
+					workProjectNotifyService
+							.save(UtilNotify
+									.saveNotify(projectReportData.getId(),
+											projectReportData.getCreateBy(),
+											projectReportData.getCompanyId(),
+											title,
+											str,
+											"46",
+											"0",
+											"待通知",
+											notifyRole));
+				}
+			}
+			workActivityProcessService.deleteProcessIdAuditUsers(projectReportData.getProcessInstanceId());
+		} else {
+			if (StringUtils.isNotBlank(workActivityMenu.getProcessType()) && !workActivityMenu.getProcessType().equals("reportAudit")) {
+				WorkProjectNotify notify = new WorkProjectNotify();
+				notify.setNotifyId(projectReportData.getId());
+				userList = workProjectNotifyService.readByNotifyId(notify);
+				WorkProjectNotify workProjectNotify = UtilNotify
+						.saveNotify(projectReportData.getId(),
+								new User(),
+								projectReportData.getCompanyId(),
+								title,
+								str,
+								"46",
+								"0",
+								"待审批",
+								notifyRole);
+				List<WorkProjectNotify> workProjectNotifys = activityService.getByFlagAndTaskDefKeyList(
+						activities,
+						workProjectNotify,
+						taskDefKey,
+						flag,
+						taskCount,
+						projectReportData.getCreateBy(),
+						user.getOffice().getId(),
+						"8");
+				for (WorkProjectNotify workProjectNotify1:workProjectNotifys){
+					users.add(workProjectNotify1.getUser());
+					workProjectNotify1.setId("");
+					workProjectNotify1.setIsNewRecord(false);
+					workProjectNotifyService
+							.save(workProjectNotify1);
+					if (!"modifyApply".equals(taskDefKey)){
+						Map<String,Object> extras = new HashMap<>();
+						if ("glyda".equals(taskDefKey)){
+							extras.put("type","7003");
+						}else if("zlfgld".equals(taskDefKey)  ){
+							extras.put("type","7002");
+						}else {
+							extras.put("type","7001");
+						}
+						extras.put("id",workProjectNotify.getId());
+						extras.put("procDefKey","46");
+						UserUtils.pushInfoToApp(title,str,extras,workProjectNotify1.getUser().getId());
+
+					}
+				}
+
+			} else {
+				if (!"yes".equals(flag)) {
+					WorkProjectNotify notify = new WorkProjectNotify();
+					notify.setNotifyId(projectReportData.getId());
+					userList = workProjectNotifyService.readByNotifyId(notify);
+					workProjectNotifyService
+							.save(UtilNotify
+									.saveNotify(projectReportData.getId(),
+											projectReportData.getCreateBy(),
+											projectReportData.getCompanyId(),
+											title,
+											str,
+											"46",
+											"0",
+											"重新申请",
+											notifyRole));
+					users.add( projectReportData.getCreateBy());
+				} else {
+					if (StringUtils.isNotBlank(enname)) {
+						WorkProjectNotify notify = new WorkProjectNotify();
+						notify.setNotifyId(projectReportData.getId());
+						userList = workProjectNotifyService.readByNotifyId(notify);
+						WorkProjectNotify workProjectNotify = UtilNotify
+								.saveNotify(projectReportData.getId(),
+										new User(),
+										projectReportData.getCompanyId(),
+										title,
+										str,
+										"46",
+										"0",
+										"待审批",
+										notifyRole);
+						users.addAll(auditUsers);
+						for (User user1 : users) {
+							workProjectNotify.setUser(user1);
+							workProjectNotify.setId("");
+							workProjectNotify.setIsNewRecord(false);
+							workProjectNotifyService
+									.save(workProjectNotify);
+							if (!"modifyApply".equals(taskDefKey)){
+								Map<String,Object> extras = new HashMap<>();
+								if ("zlfgld".equals(taskDefKey)  ){
+									extras.put("type","7002");
+								}else if("glyda".equals(taskDefKey)  ){
+									extras.put("type","7003");
+								}else {
+									extras.put("type","7001");
+								}
+								extras.put("id",workProjectNotify.getId());
+								extras.put("procDefKey","46");
+								UserUtils.pushInfoToApp(title,str,extras,user1.getId());
+
+							}
+						}
+					}else {
+						WorkProjectNotify notify = new WorkProjectNotify();
+						notify.setNotifyId(projectReportData.getId());
+						userList = workProjectNotifyService.readByNotifyId(notify);
+						users.add(projectReportData.getCreateBy());
+						workProjectNotifyService
+								.save(UtilNotify
+										.saveNotify(projectReportData.getId(),
+												projectReportData.getCreateBy(),
+												projectReportData.getCompanyId(),
+												title,
+												str,
+												"46",
+												"0",
+												"重新申请",
+												notifyRole));
+					}
+				}
+			}
+		}
+		if (users!=null && users.size()!=0) {
+			for (User u : users) {
+				UserUtils.pushIm(u.getId(),title);
+			}
+		}
+		if (users!=null && userList.size()!=0) {
+			for (User u : userList) {
+				UserUtils.pushMeIm(u.getId());
+			}
+		}
+		dao.update(projectReportData);
+		if (status){
+			List<Workattachment> attachmentList = projectReportData.getWorkAttachments();
+			for (Workattachment workattachment : attachmentList){
+				if (workattachment.DEL_FLAG_NORMAL.equals(workattachment.getDelFlag())) {
+					workattachment.setAttachmentId(projectReportData.getReportId());
+					workattachment.setAttachmentFlag("86");
+					workattachment.setAttachmentUser(UserUtils.getUser().getId());
+					if (StringUtils.isBlank(workattachment.getId()) || "null".equals(workattachment.getId())) {
+						workattachment.preInsert();
+						workattachmentDao.insert(workattachment);
+					} else {
+						workattachment.preUpdate();
+						workattachmentDao.update(workattachment);
+					}
+				} else {
+					workattachmentDao.delete(workattachment);
+				}
+			}
+			ProjectReportRecord projectReportRecord = new ProjectReportRecord();
+			projectReportRecord.setReport(new ProjectReportData(projectReportData.getReportId()));
+			List<ProjectReportRecord> projectReportRecords = projectReportRecordService.findList(projectReportRecord);
+			if (projectReportRecords!=null && projectReportRecords.size()!=0){
+				for (ProjectReportRecord reportRecord:projectReportRecords){
+					if (!"5".equals(reportRecord.getStatus())){
+						projectReportData.setFileStatus("2");
+						if ("2".equals(reportRecord.getStatus())){
+							projectReportRecordService.cancelInvalidate(reportRecord);
+						}
+					}
+				}
+			}
+			if (StringUtils.isBlank(projectReportData.getFileStatus())){
+				projectReportData.setFileStatus("1");
+			}
+			projectReportData.setId(projectReportData.getReportId());
+			dao.changeBerforProjectReportData(projectReportData);
+
+		}
+		if (!"yes".equals(flag)){
+			workReviewAuditDao.delReviewAudit(projectReportData.getId());
+		}
+		return "报告变更保存审核意见成功!";
+	}
+
+	public Act getByAct(String processInstanceId){
+		Act act = new Act();
+		HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
+		ProcessInstance processInstance = actTaskService.getProcIns(processInstanceId);
+		if (processInstance!=null) {
+			List<Task> taskList = actTaskService.getCurrentTaskList(processInstance);
+			if(taskList!=null && taskList.size()>1){
+				for (Task taskInfok:taskList) {
+					if (taskInfok.getAssignee().equals(UserUtils.getUser().getId())) {
+						act.setTaskId(taskInfok.getId());
+						act.setTaskName(taskInfok.getName());
+						act.setTaskDefKey(taskInfok.getTaskDefinitionKey());
+						act.setProcDefId(taskInfok.getProcessDefinitionId());
+						act.setProcInsId(taskInfok.getProcessInstanceId());
+						act.setTask(taskInfok);
+					}
+				}
+			}else {
+				Task task = actTaskService.getCurrentTaskInfo(processInstance);
+				act.setTaskId(task.getId());
+				act.setTaskName(task.getName());
+				act.setTaskDefKey(task.getTaskDefinitionKey());
+				act.setProcDefId(task.getProcessDefinitionId());
+				act.setProcInsId(task.getProcessInstanceId());
+				act.setTask(task);
+			}
+		}
+		return  act;
+	}
+
+
+
+}

文件差异内容过多而无法显示
+ 1451 - 0
src/main/java/com/jeeplus/modules/projectcontentinfo/service/ProjectReportDataService.java


+ 708 - 0
src/main/java/com/jeeplus/modules/projectcontentinfo/service/ProjectReportRecordService.java

@@ -0,0 +1,708 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.projectcontentinfo.service;
+
+import java.util.*;
+
+import com.google.common.collect.Maps;
+import com.jeeplus.common.utils.MenuStatusEnum;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.websocket.onchat.ChatServerPool;
+import com.jeeplus.modules.act.entity.Act;
+import com.jeeplus.modules.act.service.ActTaskService;
+import com.jeeplus.modules.projectcontentinfo.entity.ProjectReportData;
+import com.jeeplus.modules.sys.dao.WorkattachmentDao;
+import com.jeeplus.modules.sys.entity.Office;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.entity.Workattachment;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.workactivity.dao.WorkActivityProcessDao;
+import com.jeeplus.modules.workactivity.entity.Activity;
+import com.jeeplus.modules.workactivity.entity.WorkActivityProcess;
+import com.jeeplus.modules.workactivity.service.ActivityService;
+import com.jeeplus.modules.workactivity.service.WorkActivityProcessService;
+import com.jeeplus.modules.workactivitymenu.entity.WorkActivityMenu;
+import com.jeeplus.modules.workactivitymenu.service.WorkActivityMenuService;
+import com.jeeplus.modules.workprojectnotify.entity.WorkProjectNotify;
+import com.jeeplus.modules.workprojectnotify.service.WorkProjectNotifyService;
+import com.jeeplus.modules.workprojectnotify.util.UtilNotify;
+import org.activiti.engine.*;
+import org.activiti.engine.runtime.ProcessInstance;
+import org.activiti.engine.task.Task;
+import org.java_websocket.WebSocket;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.service.CrudService;
+import com.jeeplus.modules.projectcontentinfo.entity.ProjectReportRecord;
+import com.jeeplus.modules.projectcontentinfo.dao.ProjectReportRecordDao;
+
+/**
+ * 报告归档归档Service
+ * @author 杨帆
+ * @version 2018-06-22
+ */
+@Service
+@Transactional(readOnly = true)
+public class ProjectReportRecordService extends CrudService<ProjectReportRecordDao, ProjectReportRecord> {
+	@Autowired
+	private WorkattachmentDao workattachmentDao;
+	@Autowired
+	private RuntimeService runtimeService;
+	@Autowired
+	protected TaskService taskService;
+	@Autowired
+	protected HistoryService historyService;
+	@Autowired
+	protected RepositoryService repositoryService;
+	@Autowired
+	private IdentityService identityService;
+	@Autowired
+	private ActTaskService actTaskService;
+	@Autowired
+	private WorkProjectNotifyService workProjectNotifyService;
+	@Autowired
+	private WorkActivityMenuService workActivityMenuService;
+	@Autowired
+	private WorkActivityProcessService workActivityProcessService;
+	@Autowired
+	private ActivityService activityService;
+	@Autowired
+	private WorkActivityProcessDao workActivityProcessDao;
+	@Autowired
+	private ProjectReportDataService projectReportDataService;
+	public ProjectReportRecord get(String id) {
+		ProjectReportRecord projectReportRecord= super.get(id);
+		if (projectReportRecord!=null && StringUtils.isNotBlank(projectReportRecord.getId())){
+			Workattachment workattachment = new Workattachment();
+			workattachment.setAttachmentId(id);
+			workattachment.setAttachmentFlag("99");
+			projectReportRecord.setWorkAttachments(workattachmentDao.findList(workattachment));
+		}
+		if (projectReportRecord.getSignCostOne()!=null && StringUtils.isNotBlank(projectReportRecord.getSignCostOne().getId())){
+			User signCostOne = UserUtils.get(projectReportRecord.getSignCostOne().getId());
+			projectReportRecord.setSignCostOne(signCostOne);
+		}
+		if (projectReportRecord.getSignCostTwo()!=null && StringUtils.isNotBlank(projectReportRecord.getSignCostTwo().getId())){
+			User signCostTwo = UserUtils.get(projectReportRecord.getSignCostTwo().getId());
+			projectReportRecord.setSignCostTwo(signCostTwo);
+		}
+		return super.get(id);
+	}
+	public int getNumber(String reportId) {
+		String number = dao.getNumber(reportId);
+		if (StringUtils.isNotBlank(number)){
+			return Integer.parseInt(number)+1;
+		}else {
+			return 1;
+		}
+	}
+
+	public List<ProjectReportRecord> findList(ProjectReportRecord projectReportRecord) {
+		return super.findList(projectReportRecord);
+	}
+	
+	public Page<ProjectReportRecord> findPage(Page<ProjectReportRecord> page, ProjectReportRecord projectReportRecord) {
+		projectReportRecord.getSqlMap().put("dsf", dataScopeFilter(projectReportRecord.getCurrentUser(), "o", "u","s", MenuStatusEnum.PROJECT_REPORTRECORD.getValue()));
+		return super.findPage(page, projectReportRecord);
+	}
+	
+	@Transactional(readOnly = false)
+	public void save(ProjectReportRecord projectReportRecord) {
+		ProjectReportData projectReportData =projectReportRecord.getReport();
+		projectReportData.setFileStatus("2");
+		projectReportDataService.updateFileStatus(projectReportData);
+		if (projectReportRecord.getIsNewRecord()){
+			projectReportRecord.preInsert();
+			projectReportRecord.setCreateDate(new Date());
+			dao.insert(projectReportRecord);
+		}else{
+			projectReportRecord.preUpdate();
+			dao.update(projectReportRecord);
+		}
+		saveWorkattachments(projectReportRecord);
+	}
+	@Transactional(readOnly = false)
+	public void insert(ProjectReportRecord projectReportRecord) {
+		dao.insert(projectReportRecord);
+	}
+	@Transactional(readOnly = false)
+	public void saveWorkattachments(ProjectReportRecord projectReportRecord) {
+		List<Workattachment> workattachments = projectReportRecord.getWorkAttachments();
+		if (workattachments!=null && workattachments.size()!=0){
+			for (Workattachment workattachment:workattachments){
+				if (workattachment.getId() == null) {
+					continue;
+				}
+				if (workattachment.DEL_FLAG_NORMAL.equals(workattachment.getDelFlag())) {
+					workattachment.setAttachmentId(projectReportRecord.getId());
+					workattachment.setAttachmentFlag("99");
+					workattachment.setAttachmentUser(UserUtils.getUser().getId());
+					if (StringUtils.isBlank(workattachment.getId()) || "null".equals(workattachment.getId())) {
+						workattachment.preInsert();
+						workattachmentDao.insert(workattachment);
+					} else {
+						workattachment.preUpdate();
+						workattachmentDao.update(workattachment);
+					}
+				} else {
+					workattachmentDao.delete(workattachment);
+				}
+			}
+		}
+
+	}
+
+	/**
+	 * 提交存储
+	 * @param projectReportRecord
+	 * @param variables
+	 */
+	@Transactional(readOnly = false)
+	public String save(ProjectReportRecord projectReportRecord, Map<String, Object> variables, String processInstanceId) {
+
+		User user = UserUtils.getUser();
+		Boolean insert = false;
+		if (StringUtils.isBlank(projectReportRecord.getId())){
+			projectReportRecord.setCompanyId(user.getComId());
+			projectReportRecord.setOfficeId(user.getOffice().getId());
+			projectReportRecord.preInsert();
+			insert = true;
+		}
+		saveWorkattachments(projectReportRecord);
+		String title =  "报告名称:"+projectReportRecord.getReport().getName();
+		String str = "归档申请编号:"+projectReportRecord.getRecordNum()+ ",主委托方:"+projectReportRecord.getClientName()+",申请人:"+user.getName()+",所属部门:"+UserUtils.getSelectOffice().getName();
+		// 用来设置启动流程的人员ID,引擎会自动把用户ID保存到activiti:initiator中
+		identityService.setAuthenticatedUserId(user.getId());
+		// 启动流程
+		String businessKey = projectReportRecord.getId().toString();
+		Office office = UserUtils.getSelectOffice();
+		WorkActivityMenu workActivityMenu = workActivityMenuService.findByParentAndOffice("5864872f45b84acd893010e66a3db2c8", office);
+		// 启动流程
+		String processType = workActivityMenu.getProcessType();
+		StringBuffer buffer = new StringBuffer();
+		Activity activity = new Activity();
+		WorkProjectNotify workProjectNotify = UtilNotify
+				.saveNotify(projectReportRecord.getId(),
+						null,
+						projectReportRecord.getCompanyId(),
+						title,
+						str,
+						"51",
+						"0",
+						"待审批",
+						""
+				);
+		List<User> users = new ArrayList<>();
+		if (insert) {
+			this.insert(projectReportRecord);
+		}else {
+			this.save(projectReportRecord);
+		}
+		List<User> bggdglys = UserUtils.getByRoleActivityEnname("bggdgly",3,office.getId(),"10",projectReportRecord.getCreateBy());
+		if (StringUtils.isNotBlank(workActivityMenu.getId())) {
+			workProjectNotify.setNotifyRole("");
+			workActivityMenu = workActivityMenuService.get(workActivityMenu.getId());
+			List<Activity> activities = workActivityMenu.getActivities();
+			for (Activity a : activities) {
+				String encount = a.getEncount();
+				String enlist = a.getEnlist();
+				if (a.getRole()!=null && StringUtils.isNotBlank(a.getRole().getEnname())){
+					List enusers = UserUtils.getByRoleActivityEnnames(a.getRole().getEnname(),office.getId(),"10",projectReportRecord.getCreateBy());
+					if (enusers.size()==0){
+						projectReportRecord.setStatus("1");
+						this.save(projectReportRecord);
+						return "报告归档流程审批人不能为空,角色"+a.getRole().getName()+"下无用户,请联系管理员!";
+					}
+					variables.put(enlist, enusers);
+					variables.put(encount, enusers.size());
+				}
+				if (a.getDelFlag().equals("0") && a.getCount() == 1) {
+					activity = a;
+				}
+			}
+			buffer.append(activity.getRole().getEnname());
+			if (activity != null && StringUtils.isNotBlank(activity.getId())) {
+				//角色审批
+				if (StringUtils.isNotBlank(activity.getRole().getEnname())) {
+					users = UserUtils.getByRoleActivityEnnames(activity.getRole().getEnname(),office.getId(),"10",projectReportRecord.getCreateBy());
+				}
+				//人员审批
+				if (StringUtils.isNotBlank(activity.getUser().getId())) {
+					users.add(activity.getUser());
+				}
+			}
+			workProjectNotify.setId("");
+		} else {
+			variables.put("bggdglyList", bggdglys);
+			if (bggdglys.size()==0){
+				projectReportRecord.setStatus("1");
+				this.save(projectReportRecord);
+				return "流程审批人不能为空,报告归档管理员下无用户,请联系管理员!";
+			}
+			variables.put("bggdglycount",bggdglys.size());
+			processType = "reportRecord";
+			users.addAll(bggdglys);
+		}
+		for (User u : users){
+			workProjectNotify.setUser(u);
+			workProjectNotify.setId("");
+			workProjectNotify.setNotifyRole("档案管理员审批");
+			workProjectNotifyService
+					.save(workProjectNotify);
+			Map<String,Object> extras = new HashMap<>();
+			extras.put("type","7001");
+			extras.put("id",workProjectNotify.getId());
+			extras.put("procDefKey","51");
+			UserUtils.pushInfoToApp(title,str,extras,u.getId());
+			UserUtils.pushIm(u.getId(),str);
+
+				/*List<WebSocket> toUserConns = ChatServerPool.getWebSocketByUser(u.getId());
+				for (WebSocket toUserConn:toUserConns) {
+					String message = "{\"to\":\""+u.getId()+"\"," +
+							"\"msg\":\"审批信息 \"," +
+							"\"useType\":\"sys\"}";
+					ChatServerPool.sendMessageToUser(toUserConn, message);//同时向本人发送消息
+				}*/
+		}
+		variables.put("type", processType);
+		variables.put("busId", businessKey);
+		variables.put("title", "报告归档编号:" + projectReportRecord.getRecordNum());//设置标题;
+
+		ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processType, businessKey, variables);
+
+		projectReportRecord.setProcessInstance(processInstance);
+		if (StringUtils.isNotBlank(processInstanceId)) {
+			workActivityProcessService.updateProcessInstanceId(processInstance.getId(),processInstanceId);
+			workActivityProcessService.deleteProcessInstanceId(processInstanceId);
+			workActivityProcessService.deleteProcessIdAuditUsers(processInstanceId);
+		}
+		ProjectReportData projectReportData =projectReportRecord.getReport();
+		projectReportData.setFileStatus("2");
+		projectReportDataService.updateFileStatus(projectReportData);
+		// 更新流程实例ID
+		projectReportRecord.setProcessInstanceId(processInstance.getId());
+		dao.updateProcessInstanceId(projectReportRecord);
+		List<Activity> list = workActivityMenu.getActivities();
+		if (list != null && list.size() != 0) {
+			workActivityProcessService.saveList(list, processInstance.getId());
+		} else {
+			WorkActivityProcess workActivityProcess = new WorkActivityProcess();
+			workActivityProcess.setCount(1);
+			workActivityProcess.setProcessKey(processType);
+			workActivityProcess.setProcessInstanceId(processInstance.getId());
+			workActivityProcess.setIsApproval("0");
+			workActivityProcessService.insert(workActivityProcess);
+			workActivityProcessService.insertAuditsByType(bggdglys,processInstance.getId(),1,1);
+		}
+		return "true";
+	}
+
+	/**
+	 * 报告:强制撤销
+	 * @param projectReportRecord
+	 */
+	@Transactional(readOnly = false)
+	public void 	cancelInvalidate(ProjectReportRecord projectReportRecord){
+		String invalidateProcessInstanceId = projectReportRecord.getProcessInstanceId();
+		//将流程图中尚未走到的task的流程追踪信息逻辑删除,添加一条"撤销"流程追踪信息
+		WorkActivityProcess process = new WorkActivityProcess();
+		process.setProcessInstanceId(projectReportRecord.getProcessInstanceId());
+		process.setIsApproval("0");
+		WorkActivityProcess workActivityProcess = new WorkActivityProcess();
+		workActivityProcess.setProcessInstanceId(projectReportRecord.getProcessInstanceId());
+		List<WorkActivityProcess> processList = workActivityProcessService.findList(workActivityProcess);
+		WorkProjectNotify notify = new WorkProjectNotify();
+		notify.setNotifyId(projectReportRecord.getId());
+		List<User> userList = workProjectNotifyService.readByNotifyId(notify);
+		if (userList!=null && userList.size()!=0) {
+			for (User u : userList) {
+				User user = UserUtils.get(u.getId());
+				UserUtils.pushMeIm(user.getId());
+			}
+		}
+		if(processList!=null && processList.size()>0){
+			for (int i =0;i<processList.size();i++) {
+				WorkActivityProcess p = processList.get(i);
+				if(StringUtils.isNotBlank(p.getIsApproval()) && "0".equals(p.getIsApproval())){
+					p.setIsApproval("-1");
+					p.setDelFlag("1");
+					workActivityProcessDao.updateDelFlagAndIsApproval(p);
+				}
+			}
+			WorkActivityProcess pro = new WorkActivityProcess();
+			pro.setId("");
+			pro.preInsert();
+			pro.setDelFlag("0");
+			pro.setRemarks("[强制撤销]");
+			pro.setProcessKey(processList.get(0).getProcessKey());
+			pro.setIsApproval("1");
+			pro.setProcessInstanceId(processList.get(0).getProcessInstanceId());
+			pro.setCount(0);
+			workActivityProcessDao.insert(pro);
+		}
+
+		//结束该流程,设为"撤销"状态
+		try {
+			actTaskService.endProcessInstance(invalidateProcessInstanceId,"报告归档-强制撤销");
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		projectReportRecord.setStatus("3");
+		projectReportRecord.preUpdate();
+		save(projectReportRecord);
+
+	}
+
+	/**
+	 * 审核流程
+	 * @param reportRecord
+	 */
+	@Transactional(readOnly = false)
+	public String auditSave(ProjectReportRecord reportRecord,List<User> auditUsers) {
+		String flag = reportRecord.getAct().getFlag();
+		ProjectReportRecord projectReportRecord = null;
+		// 对不同环节的业务逻辑进行操作
+		Act act = reportRecord.getAct();
+		String taskDefKey = act.getTaskDefKey();
+		if (!"modifyApply".equals(taskDefKey) && !taskDefKey.contains("audit")  ) {
+			actTaskService.claim(act.getTaskId(), UserUtils.getUser().getId());
+			projectReportRecord = get(reportRecord.getId());
+		}else {
+			projectReportRecord = reportRecord;
+			saveWorkattachments(reportRecord);
+			flag = "yes";
+		}
+		User user= UserUtils.get(projectReportRecord.getCreateBy().getId());
+		//String str = "报告归档发起人:"+user.getName()+",报告归档编号:"+projectReportRecord.getRecordNum()+",报告名称:"+projectReportRecord.getReport().getName();
+		String title =  "报告名称:"+projectReportRecord.getReport().getName();
+		String str = "归档申请编号:"+projectReportRecord.getRecordNum()+ ",主委托方:"+projectReportRecord.getClientName()+",申请人:"+user.getName()+",所属部门:"+UserUtils.getSelectOffice().getName();
+
+		if (StringUtils.isBlank(act.getComment())){
+			act.setComment(flag.equals("yes")?"同意":"驳回");
+		}
+		String comment = "";
+		if (projectReportRecord.getStatus().equals("4")){
+			comment = ("yes".equals(flag)?"[重新申请] ":"[已撤销] ");
+		}else {
+			comment = ("yes".equals(flag)?"[同意] ":"[驳回] ")+act.getComment();
+		}
+		//yes 的时候状态为审核通过 否则为未通过
+		//1 审核中 2 未通过
+		projectReportRecord.setStatus(("yes".equals(flag) ? "2" : "4"));
+		Map<String, Object> vars = Maps.newHashMap();
+		//业务逻辑对应的条件表达式
+		String exp = "";
+		String taskCount = "";
+		String notifyRole = "";
+		int key = 0;
+		String enname = "";
+		List<Activity> activitieList = activityService.getByProcessInstanceId(projectReportRecord.getProcessInstanceId());
+		WorkActivityMenu workActivityMenu = new WorkActivityMenu();
+		if (activitieList != null && activitieList.size() != 0) {
+			workActivityMenu.setProcessType(activitieList.get(0).getProcessKey());
+			workActivityMenu.setActivities(activitieList);
+		}
+
+		WorkActivityProcess workActivityProcess = new WorkActivityProcess();
+		WorkActivityProcess selectProcess = new WorkActivityProcess();
+		selectProcess.setProcessInstanceId(projectReportRecord.getProcessInstanceId());
+		List<WorkActivityProcess> workActivityProcesses = workActivityProcessService.findList(selectProcess);
+		List<Activity> activities = workActivityMenu.getActivities();
+		if (StringUtils.isNotBlank(workActivityMenu.getProcessType()) && !workActivityMenu.getProcessType().equals("reportRecord")) {
+			key = 1;
+			for (int i = 0; i < workActivityProcesses.size(); i++) {
+				WorkActivityProcess activityProcess = workActivityProcesses.get(i);
+				if (taskDefKey.equals(activityProcess.getActivityTask()) && !taskDefKey.equals("modifyApply")) {
+					taskCount = activityProcess.getCount()+"";
+					workActivityProcess = activityProcess;
+					if (!workActivityProcess.getIsApproval().equals("0")) {
+						workActivityProcess.setId("");
+					}
+					exp = "pass";
+					if (!"yes".equals(flag)) {
+						projectReportRecord.setStatus("4");
+						workActivityProcess.setIsApproval("2");
+						String returnBack = "-1";
+						for (Activity activity : activities) {
+							if (activity.getCount() == activityProcess.getCount()) {
+								notifyRole = activity.getName();
+								returnBack = activity.getReturnBack();
+								break;
+							}
+						}
+						if (returnBack.equals("0")) {
+							workActivityProcess.setId("");
+						}
+
+					} else {
+						workActivityProcess.setIsApproval("1");
+					}
+				}else if(taskDefKey.equals("modifyApply")){
+					taskCount = "0";
+					notifyRole = "调整报告";
+					exp = "pass";
+					workActivityProcess.setId("");
+					workActivityProcess.setCount(0);
+					if (!"yes".equals(flag)) {
+						projectReportRecord.setStatus("3");
+						workActivityProcess.setIsApproval("2");
+					} else {
+						workActivityProcess.setIsApproval("1");
+					}
+					break;
+				}
+			}
+		} else {
+			workActivityMenu.setProcessType("reportRecord");
+			for (int i = 0; i < workActivityProcesses.size(); i++) {
+				WorkActivityProcess activityProcess = workActivityProcesses.get(i);
+				workActivityProcess = activityProcess;
+				String count = activityProcess.getCount() + "";
+				if (!workActivityProcess.getIsApproval().equals("0")) {
+					workActivityProcess.setId("");
+				}
+				// 审核环节
+				if ("bggdgly".equals(taskDefKey) && count.contains("1")) {
+					taskCount = "1";
+					exp = "pass";
+					if ("yes".equals(flag)) {
+						notifyRole = "审批通过";
+						workActivityProcess.setIsApproval("1");
+					} else {
+						notifyRole = "调整报告归档";
+						workActivityProcess.setIsApproval("2");
+					}
+					break;
+				}else if ("modifyApply".equals(taskDefKey)&& count.contains("0")) {
+					notifyRole = "报告归档管理员审批";
+					taskCount = "0";
+					exp = "pass";
+					workActivityProcess.setCount(0);
+					enname = "bggdgly";
+					if (!"yes".equals(flag)) {
+						projectReportRecord.setStatus("3");
+					}
+					break;
+				} else if ("apply_end".equals(taskDefKey)) {
+				}
+
+			}
+		}
+		// 设置意见
+		act.setComment(("yes".equals(flag) ? "[同意] " : "[驳回] ") + act.getComment());
+		projectReportRecord.preUpdate();
+		// 提交流程任务
+		vars.put(exp, "yes".equals(flag) ? true : false);
+		vars.put("passs", true);
+		workActivityProcessService.updateProcess(workActivityProcess,workActivityMenu,key,taskCount,projectReportRecord.getProcessInstanceId(),taskDefKey,"modifyApply",flag,comment, activities);
+		// 提交流程任务
+		actTaskService.complete(act.getTaskId(), act.getProcInsId(), act.getComment(), vars);
+		boolean state = actTaskService.isProcessEnd(act.getProcInsId());
+		List<User> users = new ArrayList<>();
+		List<User> userList = new ArrayList<>();
+		if (!state) {
+//            str = "yes".equals(flag)?"您的报销单审核:已通过":"您的报销单审核:未通过";
+			users.add(projectReportRecord.getCreateBy());
+			if ("yes".equals(flag)) {
+				ProjectReportData projectReportData =projectReportRecord.getReport();
+				projectReportData.setFileStatus("3");
+				projectReportDataService.updateFileStatus(projectReportData);
+				projectReportRecord.setStatus("5");
+				WorkProjectNotify notify = new WorkProjectNotify();
+				notify.setNotifyId(projectReportRecord.getId());
+				userList = workProjectNotifyService.readByNotifyId(notify);
+				String str2 = "归档申请编号:"+projectReportRecord.getRecordNum()+ ",主委托方:"+projectReportRecord.getClientName();
+				workProjectNotifyService
+						.save(UtilNotify
+								.saveNotify(projectReportRecord.getId(),
+										projectReportRecord.getCreateBy(),
+										projectReportRecord.getCompanyId(),
+										title,
+										str2,
+										"51",
+										"0",
+										"待通知",
+										notifyRole));
+
+			} else {
+				WorkProjectNotify notify = new WorkProjectNotify();
+				notify.setNotifyId(projectReportRecord.getId());
+				userList = workProjectNotifyService.readByNotifyId(notify);
+				if (StringUtils.isNotBlank(projectReportRecord.getStatus()) && !projectReportRecord.getStatus().equals("3")){
+					projectReportRecord.setStatus("4");
+					workProjectNotifyService
+							.save(UtilNotify
+									.saveNotify(projectReportRecord.getId(),
+											projectReportRecord.getCreateBy(),
+											projectReportRecord.getCompanyId(),
+											title,
+											str,
+											"51",
+											"0",
+											"待通知",
+											notifyRole));
+				}
+			}
+			workActivityProcessService.deleteProcessIdAuditUsers(projectReportRecord.getProcessInstanceId());
+		} else {
+			if (StringUtils.isNotBlank(workActivityMenu.getProcessType()) && !workActivityMenu.getProcessType().equals("reportRecord")) {
+				WorkProjectNotify notify = new WorkProjectNotify();
+				notify.setNotifyId(projectReportRecord.getId());
+				userList = workProjectNotifyService.readByNotifyId(notify);
+				WorkProjectNotify workProjectNotify = UtilNotify
+						.saveNotify(projectReportRecord.getId(),
+								new User(),
+								projectReportRecord.getCompanyId(),
+								title,
+								str,
+								"51",
+								"0",
+								"待审批",
+								notifyRole);
+				List<WorkProjectNotify> workProjectNotifys = activityService.getByFlagAndTaskDefKeyList(
+						activities,
+						workProjectNotify,
+						taskDefKey,
+						flag,
+						taskCount,
+						projectReportRecord.getCreateBy(),
+						user.getOffice().getId(),
+						"10");
+				for (WorkProjectNotify workProjectNotify1:workProjectNotifys){
+					users.add(workProjectNotify1.getUser());
+					workProjectNotify1.setId("");
+					workProjectNotify1.setIsNewRecord(false);
+					workProjectNotifyService
+							.save(workProjectNotify1);
+				}
+
+			} else {
+				if (!"yes".equals(flag)) {
+					WorkProjectNotify notify = new WorkProjectNotify();
+					notify.setNotifyId(projectReportRecord.getId());
+					userList = workProjectNotifyService.readByNotifyId(notify);
+					workProjectNotifyService
+							.save(UtilNotify
+									.saveNotify(projectReportRecord.getId(),
+											projectReportRecord.getCreateBy(),
+											projectReportRecord.getCompanyId(),
+											title,
+											str,
+											"51",
+											"0",
+											"重新申请",
+											notifyRole));
+					users.add( projectReportRecord.getCreateBy());
+				} else {
+					if (StringUtils.isNotBlank(enname)) {
+						WorkProjectNotify notify = new WorkProjectNotify();
+						notify.setNotifyId(projectReportRecord.getId());
+						userList = workProjectNotifyService.readByNotifyId(notify);
+						WorkProjectNotify workProjectNotify = UtilNotify
+								.saveNotify(projectReportRecord.getId(),
+										new User(),
+										projectReportRecord.getCompanyId(),
+										title,
+										str,
+										"51",
+										"0",
+										"待审批",
+										notifyRole);
+						users.addAll(auditUsers);
+						for (User user1 : users) {
+							workProjectNotify.setUser(user1);
+							workProjectNotify.setId("");
+							workProjectNotify.setIsNewRecord(false);
+							workProjectNotifyService
+									.save(workProjectNotify);
+						}
+					}else {
+						WorkProjectNotify notify = new WorkProjectNotify();
+						notify.setNotifyId(projectReportRecord.getId());
+						userList = workProjectNotifyService.readByNotifyId(notify);
+						users.add(projectReportRecord.getCreateBy());
+						workProjectNotifyService
+								.save(UtilNotify
+										.saveNotify(projectReportRecord.getId(),
+												projectReportRecord.getCreateBy(),
+												projectReportRecord.getCompanyId(),
+												title,
+												str,
+												"51",
+												"0",
+												"重新申请",
+												notifyRole));
+					}
+				}
+			}
+		}
+		if (users!=null && users.size()!=0) {
+			for (User u : users) {
+				UserUtils.pushIm(u.getId(),title);
+			}
+		}
+		if (users!=null && userList.size()!=0) {
+			for (User u : userList) {
+				UserUtils.pushMeIm(u.getId());
+			}
+		}
+		dao.update(projectReportRecord);
+		return "保存审核意见成功!";
+	}
+
+
+	@Transactional(readOnly = false)
+	public void delete(ProjectReportRecord reportRecord) {
+		ProjectReportRecord projectReportRecord = get(reportRecord.getId());
+		if (projectReportRecord.getWorkAttachments() != null && projectReportRecord.getWorkAttachments().size() != 0) {
+			for (Workattachment workattachment : projectReportRecord.getWorkAttachments()) {
+				workattachmentDao.delete(workattachment);
+			}
+		}
+		if (StringUtils.isNotBlank(projectReportRecord.getProcessInstanceId())){
+			workActivityProcessService.deleteProcessInstanceId(projectReportRecord.getProcessInstanceId());
+		}
+		ProjectReportData reportData = projectReportDataService.get(projectReportRecord.getReport().getId());
+		if ("2".equals(reportData.getFileStatus())){
+			reportData.setFileStatus("1");
+			projectReportDataService.updateFileStatus(reportData);
+		}
+		super.delete(projectReportRecord);
+	}
+
+	public Act getByAct(String processInstanceId){
+		Act act = new Act();
+		ProcessInstance processInstance = actTaskService.getProcIns(processInstanceId);
+		if (processInstance!=null) {
+			List<Task> taskList = actTaskService.getCurrentTaskList(processInstance);
+			if(taskList!=null && taskList.size()>1){
+				for (Task taskInfok:taskList) {
+					if (taskInfok.getAssignee().equals(UserUtils.getUser().getId())) {
+						act.setTaskId(taskInfok.getId());
+						act.setTaskDefKey(taskInfok.getTaskDefinitionKey());
+						act.setTaskName(taskInfok.getName());
+						act.setProcInsId(taskInfok.getProcessInstanceId());
+						act.setProcDefId(taskInfok.getProcessDefinitionId());
+						act.setTask(taskInfok);
+					}
+				}
+			}else {
+				Task task = actTaskService.getCurrentTaskInfo(processInstance);
+				act.setTaskId(task.getId());
+				act.setTaskDefKey(task.getTaskDefinitionKey());
+				act.setTaskName(task.getName());
+				act.setProcInsId(task.getProcessInstanceId());
+				act.setProcDefId(task.getProcessDefinitionId());
+				act.setTask(task);
+			}
+		}
+		return  act;
+	}
+	
+	
+	
+}

+ 204 - 0
src/main/java/com/jeeplus/modules/projectcontentinfo/service/ProjectReportStatisticsService.java

@@ -0,0 +1,204 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.projectcontentinfo.service;
+
+import com.jeeplus.common.service.CrudService;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.modules.projectcontentinfo.dao.ProjectReportDataCompanyDao;
+import com.jeeplus.modules.projectcontentinfo.dao.ProjectReportDataInfoDao;
+import com.jeeplus.modules.projectcontentinfo.dao.ProjectReportDataMonthDao;
+import com.jeeplus.modules.projectcontentinfo.dao.ProjectReportDataOfficeDao;
+import com.jeeplus.modules.projectcontentinfo.entity.ProjectReportDataCompany;
+import com.jeeplus.modules.projectcontentinfo.entity.ProjectReportDataInfo;
+import com.jeeplus.modules.projectcontentinfo.entity.ProjectReportDataMonth;
+import com.jeeplus.modules.projectcontentinfo.entity.ProjectReportDataOffice;
+import com.jeeplus.modules.sys.entity.Office;
+import com.jeeplus.modules.sys.service.OfficeService;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.modules.workreimbursementcount.entity.WorkInvoiceCompany;
+import com.jeeplus.modules.workreimbursementcount.entity.WorkInvoiceMonth;
+import com.jeeplus.modules.workreimbursementcount.entity.WorkInvoiceOffice;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 合同评价表Service
+ * @author 杨帆
+ * @version 2018-03-23
+ */
+@Service
+@Transactional(readOnly = true)
+public class ProjectReportStatisticsService extends CrudService<ProjectReportDataInfoDao, ProjectReportDataInfo> {
+    @Autowired
+    private ProjectReportDataOfficeDao projectReportDataOfficeDao;
+    @Autowired
+    private ProjectReportDataCompanyDao projectReportDataCompanyDao;
+    @Autowired
+    private ProjectReportDataMonthDao projectReportDataMonthDao;
+    @Autowired
+    private OfficeService officeService;
+    public List<ProjectReportDataCompany> findCompanyList(ProjectReportDataCompany projectReportDataCompany) {
+        String companyId=projectReportDataCompany.getCompanyId();
+        if (StringUtils.isBlank(companyId)){
+            companyId=UserUtils.getSelectCompany().getId();
+            projectReportDataCompany.setCompanyId(companyId);
+        }
+        List<ProjectReportDataCompany> list = findList(projectReportDataCompany,companyId);
+        return list;
+    }
+    public List<ProjectReportDataCompany> findBranchList(ProjectReportDataCompany projectReportDataCompany) {
+        String companyId=projectReportDataCompany.getCompanyId();
+        if (StringUtils.isBlank(companyId)){
+            companyId= UserUtils.getSelectBranchOffice();
+            projectReportDataCompany.setCompanyId(companyId);
+        }
+        List<ProjectReportDataCompany> list = findList(projectReportDataCompany,companyId);
+        return list;
+    }
+    public List<ProjectReportDataCompany> findList(ProjectReportDataCompany projectReportDataCompany,String companyId) {
+        List<ProjectReportDataCompany> projectReportDataCompanys = projectReportDataCompanyDao.findList(projectReportDataCompany);
+        List<ProjectReportDataCompany> listSign=new ArrayList<>();
+        if (projectReportDataCompanys!=null && projectReportDataCompanys.size()!=0) {
+            int reportCountTotal = 0;
+            int reportCount = 0;
+            int count = 0;
+            ProjectReportDataCompany dataTatol = new ProjectReportDataCompany();
+            ProjectReportDataCompany data = new ProjectReportDataCompany();
+            String name = "";
+            for (int i=0 ; i<projectReportDataCompanys.size();i++) {
+                ProjectReportDataCompany company = projectReportDataCompanys.get(i);
+                if(company.getId().equals(companyId)){
+                    company.setSign("1");
+                }else{
+                    company.setSign("2");
+                }
+                listSign.add(company);
+            }
+            for (int i=0 ; i<listSign.size();i++) {
+                ProjectReportDataCompany reportDataCompany = listSign.get(i);
+                if (companyId.equals(reportDataCompany.getId())){
+                    count = i;
+                    name = reportDataCompany.getName();
+                    data = reportDataCompany;
+                    reportCountTotal = reportDataCompany.getReportCount();
+                    reportDataCompany.setName("合计");
+                }else {
+                    reportCount += reportDataCompany.getReportCount();
+                }
+            }
+            if (StringUtils.isNotBlank(name)){
+                dataTatol.setId(data.getId());
+                dataTatol.setSign("1");
+                dataTatol.setReportCount(reportCountTotal-reportCount);
+                dataTatol.setName(name);
+                listSign.set(count,dataTatol);
+                listSign.add(data);
+            }else {
+                dataTatol.setName("合计");
+                dataTatol.setReportCount(reportCount);
+                listSign.add(dataTatol);
+            }
+
+        }
+        return listSign;
+    }
+    public List<ProjectReportDataOffice> findListByOffice(ProjectReportDataOffice projectReportDataOffice) {
+        if (StringUtils.isBlank(projectReportDataOffice.getCompanyId())){
+            projectReportDataOffice.setCompanyId(UserUtils.getSelectBranchOffice());
+        }
+        List<ProjectReportDataOffice> list = projectReportDataOfficeDao.findList(projectReportDataOffice);
+        List<ProjectReportDataOffice> listSum=new ArrayList<>();
+        if(list!=null&&list.size()>0){
+            for(ProjectReportDataOffice projectReportDataOffice1:list){
+                ProjectReportDataOffice projectReportDataOffice2=new ProjectReportDataOffice();
+                projectReportDataOffice2.setCompanyId(projectReportDataOffice1.getId());
+                projectReportDataOffice2.setDate(projectReportDataOffice.getDate());
+                ProjectReportDataOffice w= projectReportDataOfficeDao.findOfficeListSum(projectReportDataOffice2);
+                if(w.getId()!=null){
+                    projectReportDataOffice1.setReportCount(w.getReportCount());
+                }
+                listSum.add(projectReportDataOffice1);
+            }
+        }
+        if (listSum!=null && listSum.size()!=0) {
+            int reportCountTotal = 0;
+            ProjectReportDataOffice dataTatol = new ProjectReportDataOffice();
+            for (ProjectReportDataOffice reportDataOffice:listSum){
+                reportCountTotal += reportDataOffice.getReportCount();
+            }
+            dataTatol.setReportCount(reportCountTotal);
+            dataTatol.setName("合计");
+            listSum.add(dataTatol);
+        }
+        return listSum;
+    }
+    public Page<ProjectReportDataInfo> findPageByInfo(Page<ProjectReportDataInfo> page,ProjectReportDataInfo projectReportDataInfo) {
+        if (StringUtils.isBlank(projectReportDataInfo.getOfficeId())){
+            projectReportDataInfo.setOfficeId(UserUtils.getSelectOffice().getId());
+        }
+        projectReportDataInfo.setPage(page);
+        page.setList(dao.findList(projectReportDataInfo));
+        return page;
+    }
+
+    public List<ProjectReportDataMonth> findMonthCompanyList(ProjectReportDataMonth projectReportDataMonth) {
+        Office company = null;
+        if (StringUtils.isBlank(projectReportDataMonth.getCompanyId())){
+            company =  UserUtils.getSelectCompany();
+            projectReportDataMonth.setCompanyId(company.getId());
+        }
+        List<ProjectReportDataMonth> list = new ArrayList<>();
+        List<ProjectReportDataMonth> listSign=new ArrayList<>();
+        list = projectReportDataMonthDao.findList(projectReportDataMonth);
+        for (int i=0 ; i<list.size();i++) {
+            ProjectReportDataMonth w = list.get(i);
+            w.setSign("1");
+            listSign.add(w);
+        }
+        if (listSign!=null && listSign.size()!=0) {
+            int reportCount = 0;
+            ProjectReportDataMonth dataTatol = new ProjectReportDataMonth();
+            ProjectReportDataMonth data = new ProjectReportDataMonth();
+            for (int i=0 ; i<listSign.size();i++) {
+                ProjectReportDataMonth reportDataMonth = listSign.get(i);
+                reportCount += reportDataMonth.getReportCount();
+            }
+            if (listSign!=null && listSign.size()!=0){
+                dataTatol.setReportCount(reportCount);
+                dataTatol.setName("合计");
+                listSign.add(dataTatol);
+            }
+        }
+        return listSign;
+    }
+
+    public List<ProjectReportDataMonth> findOfficeCompanyList(ProjectReportDataMonth projectReportDataMonth) {
+        if (StringUtils.isBlank(projectReportDataMonth.getCompanyId())){
+            projectReportDataMonth.setCompanyId(UserUtils.getSelectCompany().getId());
+        }
+        List<ProjectReportDataMonth> projectReportDataMonths = projectReportDataMonthDao.findByOfficeList(projectReportDataMonth);
+        if (projectReportDataMonths!=null && projectReportDataMonths.size()!=0) {
+            int reportCount = 0;
+            ProjectReportDataMonth dataTatol = new ProjectReportDataMonth();
+            ProjectReportDataMonth data = new ProjectReportDataMonth();
+            for (int i=0 ; i<projectReportDataMonths.size();i++) {
+                ProjectReportDataMonth reportDataMonth = projectReportDataMonths.get(i);
+                reportCount += reportDataMonth.getReportCount();
+            }
+            if (projectReportDataMonths!=null && projectReportDataMonths.size()!=0){
+                dataTatol.setName("合计");
+                dataTatol.setReportCount(reportCount);
+                projectReportDataMonths.add(dataTatol);
+            }
+        }
+        return projectReportDataMonths;
+    }
+
+}

文件差异内容过多而无法显示
+ 1272 - 0
src/main/java/com/jeeplus/modules/projectcontentinfo/service/ProjectcontentinfoService.java


+ 204 - 0
src/main/java/com/jeeplus/modules/projectcontentinfo/web/ProjectBasedDataController.java

@@ -0,0 +1,204 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.projectcontentinfo.web;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.ConstraintViolationException;
+
+import com.jeeplus.common.json.AjaxJson;
+import org.apache.shiro.authz.annotation.Logical;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import 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.projectcontentinfo.entity.ProjectBasedData;
+import com.jeeplus.modules.projectcontentinfo.service.ProjectBasedDataService;
+
+/**
+ * 依据性资料Controller
+ * @author 杨帆
+ * @version 2018-06-05
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/projectcontentinfo/projectBasedData")
+public class ProjectBasedDataController extends BaseController {
+
+	@Autowired
+	private ProjectBasedDataService projectBasedDataService;
+	
+	@ModelAttribute
+	public ProjectBasedData get(@RequestParam(required=false) String id) {
+		ProjectBasedData entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = projectBasedDataService.get(id);
+		}
+		if (entity == null){
+			entity = new ProjectBasedData();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 依据性资料列表页面
+	 */
+	@RequiresPermissions("projectcontentinfo:projectBasedData:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(ProjectBasedData projectBasedData, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<ProjectBasedData> page = projectBasedDataService.findPage(new Page<ProjectBasedData>(request, response), projectBasedData); 
+		model.addAttribute("page", page);
+		return "modules/projectcontentinfo/projectBasedDataList";
+	}
+
+	/**
+	 * 查看,增加,编辑依据性资料表单页面
+	 */
+	@RequiresPermissions(value={"projectcontentinfo:projectBasedData:view","projectcontentinfo:projectBasedData:add","projectcontentinfo:projectBasedData:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(ProjectBasedData projectBasedData, Model model) {
+		model.addAttribute("projectBasedData", projectBasedData);
+		return "modules/projectcontentinfo/projectBasedDataForm";
+	}
+
+	/**
+	 * 保存依据性资料
+	 */
+	@RequiresPermissions(value={"projectcontentinfo:projectBasedData:add","projectcontentinfo:projectBasedData:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	public String save(ProjectBasedData projectBasedData, Model model, RedirectAttributes redirectAttributes) throws Exception{
+		if (!beanValidator(model, projectBasedData)){
+			return form(projectBasedData, model);
+		}
+		if(!projectBasedData.getIsNewRecord()){//编辑表单保存
+			ProjectBasedData t = projectBasedDataService.get(projectBasedData.getId());//从数据库取出记录的值
+			MyBeanUtils.copyBeanNotNull2Bean(projectBasedData, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+			projectBasedDataService.save(t);//保存
+		}else{//新增表单保存
+			projectBasedDataService.save(projectBasedData);//保存
+		}
+		addMessage(redirectAttributes, "保存依据性资料成功");
+		return "redirect:"+Global.getAdminPath()+"/projectcontentinfo/projectBasedData/?repage";
+	}
+	
+	/**
+	 * 删除依据性资料
+	 */
+	@RequiresPermissions("projectcontentinfo:projectBasedData:del")
+	@RequestMapping(value = "delete")
+	public String delete(ProjectBasedData projectBasedData, RedirectAttributes redirectAttributes) {
+		projectBasedDataService.delete(projectBasedData);
+		addMessage(redirectAttributes, "删除依据性资料成功");
+		return "redirect:"+Global.getAdminPath()+"/projectcontentinfo/projectBasedData/?repage";
+	}
+	
+	/**
+	 * 批量删除依据性资料
+	 */
+	@RequiresPermissions("projectcontentinfo:projectBasedData:del")
+	@RequestMapping(value = "deleteAll")
+	public String deleteAll(String ids, RedirectAttributes redirectAttributes) {
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			projectBasedDataService.delete(projectBasedDataService.get(id));
+		}
+		addMessage(redirectAttributes, "删除依据性资料成功");
+		return "redirect:"+Global.getAdminPath()+"/projectcontentinfo/projectBasedData/?repage";
+	}
+	
+	/**
+	 * 导出excel文件
+	 */
+	@RequiresPermissions("projectcontentinfo:projectBasedData:export")
+    @RequestMapping(value = "export", method=RequestMethod.POST)
+    public String exportFile(ProjectBasedData projectBasedData, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "依据性资料"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            Page<ProjectBasedData> page = projectBasedDataService.findPage(new Page<ProjectBasedData>(request, response, -1), projectBasedData);
+    		new ExportExcel("依据性资料", ProjectBasedData.class).setDataList(page.getList()).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导出依据性资料记录失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/projectcontentinfo/projectBasedData/?repage";
+    }
+
+	/**
+	 * 导入Excel数据
+
+	 */
+	@RequiresPermissions("projectcontentinfo:projectBasedData: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<ProjectBasedData> list = ei.getDataList(ProjectBasedData.class);
+			for (ProjectBasedData projectBasedData : list){
+				try{
+					projectBasedDataService.save(projectBasedData);
+					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()+"/projectcontentinfo/projectBasedData/?repage";
+    }
+	
+	/**
+	 * 下载导入依据性资料数据模板
+	 */
+	@RequiresPermissions("projectcontentinfo:projectBasedData:import")
+    @RequestMapping(value = "import/template")
+    public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "依据性资料数据导入模板.xlsx";
+    		List<ProjectBasedData> list = Lists.newArrayList(); 
+    		new ExportExcel("依据性资料数据", ProjectBasedData.class, 1).setDataList(list).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入模板下载失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/projectcontentinfo/projectBasedData/?repage";
+    }
+
+
+    @RequestMapping("selectList")
+    public String gridSelect(ProjectBasedData projectBasedData,Model model,String searchLabel,HttpServletRequest request,HttpServletResponse response) throws UnsupportedEncodingException {
+        Page<ProjectBasedData> page = projectBasedDataService.findPage(new Page<ProjectBasedData>(request,response), projectBasedData);
+		String searchLabel1 = URLDecoder.decode(searchLabel,"utf-8");
+        model.addAttribute("obj", projectBasedData);
+        model.addAttribute("page", page);
+        model.addAttribute("searchLabel",searchLabel1);
+        return "modules/sys/gridselectProjbasedata";
+    }
+
+}

+ 251 - 0
src/main/java/com/jeeplus/modules/projectcontentinfo/web/ProjectContentDataController.java

@@ -0,0 +1,251 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.projectcontentinfo.web;
+
+import com.google.common.collect.Lists;
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.json.AjaxJson;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.utils.DateUtils;
+import com.jeeplus.common.utils.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.projectcontentinfo.entity.ProjectContentData;
+import com.jeeplus.modules.projectcontentinfo.service.ProjectContentDataService;
+import com.jeeplus.modules.workreview.entity.WorkReviewAudit;
+import com.jeeplus.modules.workreview.entity.WorkReviewStandard;
+import org.apache.shiro.authz.annotation.Logical;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.ConstraintViolationException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.util.List;
+
+/**
+ * 工作内容详情Controller
+ * @author yangfan
+ * @version 2018-06-05
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/projectcontentinfo/projectContentData")
+public class ProjectContentDataController extends BaseController {
+
+	@Autowired
+	private ProjectContentDataService projectContentDataService;
+	
+	@ModelAttribute
+	public ProjectContentData get(@RequestParam(required=false) String id) {
+		ProjectContentData entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = projectContentDataService.get(id);
+		}
+		if (entity == null){
+			entity = new ProjectContentData();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 工作内容详情列表页面
+	 */
+	@RequiresPermissions("projectcontentinfo:projectContentData:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(ProjectContentData projectContentData, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<ProjectContentData> page = projectContentDataService.findPage(new Page<ProjectContentData>(request, response), projectContentData); 
+		model.addAttribute("page", page);
+		return "modules/projectcontentinfo/projectContentDataList";
+	}
+
+	/**
+	 * 查看,增加,编辑工作内容详情表单页面
+	 */
+	@RequiresPermissions(value={"projectcontentinfo:projectContentData:view","projectcontentinfo:projectContentData:add","projectcontentinfo:projectContentData:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(ProjectContentData projectContentData, HttpServletRequest request,Model model) {
+		String view = request.getParameter("view");
+		if("control".equals(view)){
+			view = "modules/projectcontroltable/projectControlTableForm";
+		}else{
+			view = "modules/projectcontentinfo/projectContentDataForm";
+		}
+		model.addAttribute("projectContentData", projectContentData);
+		return "modules/projectcontentinfo/projectContentDataForm";
+	}
+
+	/**
+	 * 保存工作内容详情
+	 */
+	@RequiresPermissions(value={"projectcontentinfo:projectContentData:add","projectcontentinfo:projectContentData:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	public String save(ProjectContentData projectContentData, HttpServletRequest request,Model model, RedirectAttributes redirectAttributes) throws Exception{
+		if (!beanValidator(model, projectContentData)){
+			return form(projectContentData, request,model);
+		}
+		if(!projectContentData.getIsNewRecord()){//编辑表单保存
+			ProjectContentData t = projectContentDataService.get(projectContentData.getId());//从数据库取出记录的值
+			MyBeanUtils.copyBeanNotNull2Bean(projectContentData, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+			projectContentDataService.save(t);//保存
+		}else{//新增表单保存
+			projectContentDataService.save(projectContentData);//保存
+		}
+		addMessage(redirectAttributes, "保存工作内容详情成功");
+		return "redirect:"+Global.getAdminPath()+"/projectcontentinfo/projectContentData/?repage";
+	}
+	
+	/**
+	 * 删除工作内容详情
+	 */
+	@RequiresPermissions("projectcontentinfo:projectContentData:del")
+	@RequestMapping(value = "delete")
+	public String delete(ProjectContentData projectContentData, RedirectAttributes redirectAttributes) {
+		projectContentDataService.delete(projectContentData);
+		addMessage(redirectAttributes, "删除工作内容详情成功");
+		return "redirect:"+Global.getAdminPath()+"/projectcontentinfo/projectContentData/?repage";
+	}
+	
+	/**
+	 * 批量删除工作内容详情
+	 */
+	@RequiresPermissions("projectcontentinfo:projectContentData:del")
+	@RequestMapping(value = "deleteAll")
+	public String deleteAll(String ids, RedirectAttributes redirectAttributes) {
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			projectContentDataService.delete(projectContentDataService.get(id));
+		}
+		addMessage(redirectAttributes, "删除工作内容详情成功");
+		return "redirect:"+Global.getAdminPath()+"/projectcontentinfo/projectContentData/?repage";
+	}
+	
+	/**
+	 * 导出excel文件
+	 */
+	@RequiresPermissions("projectcontentinfo:projectContentData:export")
+    @RequestMapping(value = "export", method=RequestMethod.POST)
+    public String exportFile(ProjectContentData projectContentData, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "工作内容详情"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            Page<ProjectContentData> page = projectContentDataService.findPage(new Page<ProjectContentData>(request, response, -1), projectContentData);
+    		new ExportExcel("工作内容详情", ProjectContentData.class).setDataList(page.getList()).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导出工作内容详情记录失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/projectcontentinfo/projectContentData/?repage";
+    }
+
+	/**
+	 * 导入Excel数据
+
+	 */
+	@RequiresPermissions("projectcontentinfo:projectContentData: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<ProjectContentData> list = ei.getDataList(ProjectContentData.class);
+			for (ProjectContentData projectContentData : list){
+				try{
+					projectContentDataService.save(projectContentData);
+					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()+"/projectcontentinfo/projectContentData/?repage";
+    }
+	
+	/**
+	 * 下载导入工作内容详情数据模板
+	 */
+	@RequiresPermissions("projectcontentinfo:projectContentData:import")
+    @RequestMapping(value = "import/template")
+    public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "工作内容详情数据导入模板.xlsx";
+    		List<ProjectContentData> list = Lists.newArrayList(); 
+    		new ExportExcel("工作内容详情数据", ProjectContentData.class, 1).setDataList(list).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入模板下载失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/projectcontentinfo/projectContentData/?repage";
+    }
+
+    @RequestMapping("selectcontent")
+	public String gridSelect(ProjectContentData projectContentData, String searchLabel ,HttpServletRequest request, HttpServletResponse response, Model model) throws UnsupportedEncodingException {
+        Page<ProjectContentData> page = projectContentDataService.findPage(new Page<ProjectContentData>(request, response), projectContentData);
+        model.addAttribute("obj", projectContentData);
+        model.addAttribute("page", page);
+		searchLabel = URLDecoder.decode(searchLabel, "UTF-8");
+        model.addAttribute("searchLabel",searchLabel);
+	    return "modules/sys/gridselectProjcontent";
+    }
+    @RequestMapping("selectcontentData")
+	public String gridSelectData(ProjectContentData projectContentData, String searchLabel ,HttpServletRequest request, HttpServletResponse response, Model model) throws UnsupportedEncodingException {
+        Page<ProjectContentData> page = projectContentDataService.findPage(new Page<ProjectContentData>(request, response), projectContentData);
+        model.addAttribute("obj", projectContentData);
+        model.addAttribute("page", page);
+		searchLabel = URLDecoder.decode(searchLabel, "UTF-8");
+        model.addAttribute("searchLabel",searchLabel);
+	    return "modules/sys/gridselectProjcontentData";
+    }
+
+
+    @RequestMapping("ajaxdelete")
+    @ResponseBody
+    public AjaxJson deleteBased(String contentId,String basedId){
+        AjaxJson ajaxJson = new AjaxJson();
+        try {
+            if (StringUtils.isNotBlank(contentId)) {
+                projectContentDataService.deleteBased(contentId, basedId);
+            }
+            Integer count = projectContentDataService.countBased(basedId);
+            ajaxJson.getBody().put("inuse", count == null ? true : count > 0);
+        }catch (Exception e){
+            logger.error("删除依据资料异常!",e);
+            ajaxJson.setSuccess(false);
+            ajaxJson.setMsg("删除依据资料失败");
+        }
+        return  ajaxJson;
+    }
+    @RequestMapping("addReview")
+    @ResponseBody
+    public AjaxJson addReview(String reviewId,String name ,String infoId){
+        AjaxJson ajaxJson = new AjaxJson();
+        try {
+			List<WorkReviewAudit> workReviewAudits = projectContentDataService.findListReviewAudit(reviewId,name,infoId);
+			ajaxJson.getBody().put("list",workReviewAudits);
+			ajaxJson.setMsg("获取数据成功");
+        }catch (Exception e){
+            logger.error("获取数据异常!",e);
+            ajaxJson.setSuccess(false);
+            ajaxJson.setMsg("获取数据异常");
+        }
+        return  ajaxJson;
+    }
+}

+ 236 - 0
src/main/java/com/jeeplus/modules/projectcontentinfo/web/ProjectReportDataController.java

@@ -0,0 +1,236 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.projectcontentinfo.web;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.ConstraintViolationException;
+
+import com.jeeplus.modules.act.entity.Act;
+import com.jeeplus.modules.projectcontentinfo.entity.ProjectReportRecord;
+import com.jeeplus.modules.projectcontentinfo.entity.Projectcontentinfo;
+import com.jeeplus.modules.projectcontentinfo.service.ProjectReportChangeService;
+import com.jeeplus.modules.projectcontentinfo.service.ProjectcontentinfoService;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.workreview.entity.WorkReviewAudit;
+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.projectcontentinfo.entity.ProjectReportData;
+import com.jeeplus.modules.projectcontentinfo.service.ProjectReportDataService;
+
+/**
+ * 报告详情Controller
+ * @author yangfan
+ * @version 2018-06-05
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/projectcontentinfo/projectReportData")
+public class ProjectReportDataController extends BaseController {
+
+	@Autowired
+	private ProjectReportDataService projectReportDataService;
+	@Autowired
+	private ProjectReportChangeService projectReportChangeService;
+	@Autowired
+	private ProjectcontentinfoService projectcontentinfoService;
+
+	@ModelAttribute
+	public ProjectReportData get(@RequestParam(required=false) String id) {
+		ProjectReportData entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = projectReportDataService.get(id);
+		}
+		if (entity == null){
+			entity = new ProjectReportData();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 报告详情列表页面
+	 */
+	@RequiresPermissions("projectcontentinfo:projectReportData:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(ProjectReportData projectReportData, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<ProjectReportData> page = projectReportDataService.findInfoPage(new Page<ProjectReportData>(request, response), projectReportData);
+		model.addAttribute("page", page);
+		return "modules/projectcontentinfo/projectReportDataList";
+	}
+
+	/**
+	 * 查看,增加,编辑报告详情表单页面
+	 */
+	@RequestMapping(value = "form")
+	public String form(ProjectReportData reportData, Model model) {
+		String id = reportData.getId();
+		ProjectReportData projectReportData;
+		Projectcontentinfo projectcontentinfo;
+		String view = "reportAudit";
+		if (StringUtils.isNotBlank(projectReportDataService.getChangeId(id))){
+			id = projectReportDataService.getChangeId(id);
+			projectReportData = projectReportChangeService.get(id);
+			List<Projectcontentinfo> projectcontentinfos = projectcontentinfoService.getByChangeInfoId(projectReportData.getId());
+			projectcontentinfo = projectcontentinfos.get(0);
+			view = "reportChangeAudit";
+		}else {
+			projectReportData = projectReportDataService.get(id);
+			projectcontentinfo = projectcontentinfoService.getByInfoId(projectReportData.getId());
+		}
+		projectcontentinfo.setProjectReportData(projectReportData);
+		model.addAttribute("projectId", projectcontentinfo.getProject().getId());
+		model.addAttribute("id", projectcontentinfo.getId());
+		model.addAttribute("projectcontentinfo", projectcontentinfo);
+		return "modules/projectcontentinfo/"+view;
+	}
+
+	/**
+	 * 保存报告详情
+	 */
+	@RequiresPermissions(value={"projectcontentinfo:projectReportData:add","projectcontentinfo:projectReportData:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	public String save(ProjectReportData projectReportData, Model model, RedirectAttributes redirectAttributes) throws Exception{
+		if (!beanValidator(model, projectReportData)){
+			return form(projectReportData, model);
+		}
+		if(!projectReportData.getIsNewRecord()){//编辑表单保存
+			ProjectReportData t = projectReportDataService.get(projectReportData.getId());//从数据库取出记录的值
+			MyBeanUtils.copyBeanNotNull2Bean(projectReportData, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+			projectReportDataService.save(t);//保存
+		}else{//新增表单保存
+			projectReportDataService.save(projectReportData);//保存
+		}
+		addMessage(redirectAttributes, "保存报告详情成功");
+		return "redirect:"+Global.getAdminPath()+"/projectcontentinfo/projectReportData/?repage";
+	}
+
+	@RequestMapping("selectreportData")
+	public String gridSelectData(ProjectReportData projectReportData, String searchLabel , HttpServletRequest request, HttpServletResponse response, Model model) throws UnsupportedEncodingException {
+		searchLabel = URLDecoder.decode(searchLabel, "UTF-8");
+		projectReportData.setFileStatus("1");
+		Page<ProjectReportData> page = projectReportDataService.findInfoPageByStatus(new Page<ProjectReportData>(request, response), projectReportData);
+		model.addAttribute("obj", projectReportData);
+		model.addAttribute("page", page);
+		model.addAttribute("searchLabel",searchLabel);
+		return "modules/sys/gridselectreportrecord";
+	}
+	
+	/**
+	 * 删除报告详情
+	 */
+	@RequiresPermissions("projectcontentinfo:projectReportData:del")
+	@RequestMapping(value = "delete")
+	public String delete(ProjectReportData projectReportData, RedirectAttributes redirectAttributes) {
+		projectReportDataService.delete(projectReportData);
+		addMessage(redirectAttributes, "删除报告详情成功");
+		return "redirect:"+Global.getAdminPath()+"/projectcontentinfo/projectReportData/?repage";
+	}
+	
+	/**
+	 * 批量删除报告详情
+	 */
+	@RequiresPermissions("projectcontentinfo:projectReportData:del")
+	@RequestMapping(value = "deleteAll")
+	public String deleteAll(String ids, RedirectAttributes redirectAttributes) {
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			projectReportDataService.delete(projectReportDataService.get(id));
+		}
+		addMessage(redirectAttributes, "删除报告详情成功");
+		return "redirect:"+Global.getAdminPath()+"/projectcontentinfo/projectReportData/?repage";
+	}
+	
+	/**
+	 * 导出excel文件
+	 */
+	@RequiresPermissions("projectcontentinfo:projectReportData:export")
+    @RequestMapping(value = "export", method=RequestMethod.POST)
+    public String exportFile(ProjectReportData projectReportData, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "报告明细"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            Page<ProjectReportData> page = projectReportDataService.findInfoPage(new Page<ProjectReportData>(request, response, -1), projectReportData);
+    		new ExportExcel("报告明细", ProjectReportData.class).setDataList(page.getList()).write(response, fileName,request.getHeader("USER-AGENT")).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导出报告详情记录失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/projectcontentinfo/projectReportData/?repage";
+    }
+
+	/**
+	 * 导入Excel数据
+
+	 */
+	@RequiresPermissions("projectcontentinfo:projectReportData: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<ProjectReportData> list = ei.getDataList(ProjectReportData.class);
+			for (ProjectReportData projectReportData : list){
+				try{
+					projectReportDataService.save(projectReportData);
+					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()+"/projectcontentinfo/projectReportData/?repage";
+    }
+	
+	/**
+	 * 下载导入报告详情数据模板
+	 */
+	@RequiresPermissions("projectcontentinfo:projectReportData:import")
+    @RequestMapping(value = "import/template")
+    public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "报告详情数据导入模板.xlsx";
+    		List<ProjectReportData> list = Lists.newArrayList(); 
+    		new ExportExcel("报告详情数据", ProjectReportData.class, 1).setDataList(list).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入模板下载失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/projectcontentinfo/projectReportData/?repage";
+    }
+	
+	
+	
+
+}

+ 349 - 0
src/main/java/com/jeeplus/modules/projectcontentinfo/web/ProjectReportRecordController.java

@@ -0,0 +1,349 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.projectcontentinfo.web;
+
+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 javax.validation.ConstraintViolationException;
+
+import com.jeeplus.modules.act.entity.Act;
+import com.jeeplus.modules.act.service.ActTaskService;
+import com.jeeplus.modules.projectcontentinfo.entity.ProjectReportData;
+import com.jeeplus.modules.projectcontentinfo.entity.Projectcontentinfo;
+import com.jeeplus.modules.projectrecord.entity.ProjectRecords;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import org.activiti.engine.runtime.ProcessInstance;
+import org.activiti.engine.task.Task;
+import org.apache.shiro.authz.annotation.Logical;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+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.projectcontentinfo.entity.ProjectReportRecord;
+import com.jeeplus.modules.projectcontentinfo.service.ProjectReportRecordService;
+
+/**
+ * 报告归档Controller
+ * @author 杨帆
+ * @version 2018-06-22
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/projectcontentinfo/projectReportRecord")
+public class ProjectReportRecordController extends BaseController {
+
+	@Autowired
+	private ProjectReportRecordService projectReportRecordService;
+	@Autowired
+	private ActTaskService actTaskService;
+
+	@ModelAttribute
+	public ProjectReportRecord get(@RequestParam(required=false) String id) {
+		ProjectReportRecord entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = projectReportRecordService.get(id);
+		}
+		if (entity == null){
+			entity = new ProjectReportRecord();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 报告归档列表页面
+	 */
+	@RequiresPermissions("projectcontentinfo:projectReportRecord:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(ProjectReportRecord projectReportRecord, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<ProjectReportRecord> page = projectReportRecordService.findPage(new Page<ProjectReportRecord>(request, response), projectReportRecord); 
+		model.addAttribute("page", page);
+		return "modules/projectcontentinfo/projectReportRecordList";
+	}
+
+	/**
+	 * 查看,增加,编辑报告归档表单页面
+	 */
+	@RequestMapping(value = "form")
+	public String form(ProjectReportRecord projectReportRecord, Model model) {
+		if(StringUtils.isBlank(projectReportRecord.getId())){
+			projectReportRecord.setCreateDate(new Date());
+			projectReportRecord.setCreateBy(UserUtils.getUser());
+		}
+		model.addAttribute("projectReportRecord", projectReportRecord);
+		if (StringUtils.isNotBlank(projectReportRecord.getView()) && projectReportRecord.getView().equals("view")){
+			return "modules/projectcontentinfo/projectReportRecordView";
+		}else if (StringUtils.isNotBlank(projectReportRecord.getView()) && projectReportRecord.getView().equals("modiftApply")){
+			ProcessInstance processInstance = actTaskService.getProcIns(projectReportRecord.getProcessInstanceId());
+			if (processInstance!=null) {
+				Task taskInfok = actTaskService.getCurrentTaskInfo(processInstance);
+				Act act = new Act();
+				act.setTaskId(taskInfok.getId());
+				act.setTaskName(taskInfok.getName());
+				act.setProcDefId(taskInfok.getProcessDefinitionId());
+				act.setTaskDefKey(taskInfok.getTaskDefinitionKey());
+				act.setProcInsId(taskInfok.getProcessInstanceId());
+				act.setTask(taskInfok);
+				projectReportRecord.setAct(act);
+			}
+			return "modules/projectcontentinfo/projectReportRecordModiftApply";
+		}
+		return "modules/projectcontentinfo/projectReportRecordForm";
+	}
+
+	/**
+	 * 保存报告归档
+	 */
+	@RequestMapping(value = "save")
+	public String save(ProjectReportRecord projectReportRecord, Model model, RedirectAttributes redirectAttributes) throws Exception{
+		if (!beanValidator(model, projectReportRecord)){
+			return form(projectReportRecord, model);
+		}
+		try {
+			User user = projectReportRecord.getCreateBy();
+			String sta = projectReportRecord.getStatus();
+			if(user!=null && !UserUtils.getUser().getId().equals(user.getId()) && StringUtils.isNotBlank(user.getId())){
+				addMessage(redirectAttributes, "您不是申请人,无法修改");
+				return "redirect:"+Global.getAdminPath()+"/workreimbursement/workReimbursement/?repage";
+			}
+			//状态设置为审核中
+			projectReportRecord.setStatus("2");
+			String processInstanceId ="";
+			if (user!=null && StringUtils.isNotBlank(user.getId()) && StringUtils.isNotBlank(sta) && "3".equals(sta)){
+				processInstanceId = projectReportRecordService.get(projectReportRecord.getId()).getProcessInstanceId();
+			}
+			Map<String, Object> variables = new HashMap<>();
+			if(!projectReportRecord.getIsNewRecord()){//编辑表单保存
+				ProjectReportRecord t = projectReportRecordService.get(projectReportRecord.getId());//从数据库取出记录的值
+				MyBeanUtils.copyBeanNotNull2Bean(projectReportRecord, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+				projectReportRecordService.save(projectReportRecord,variables,processInstanceId);//保存
+			}else {//新增表单保存
+				projectReportRecordService.save(projectReportRecord,variables,processInstanceId);//保存
+			}
+
+			addMessage(redirectAttributes, "保存报告归档成功");
+		}catch (Exception e){
+			addMessage(redirectAttributes, "保存报告归档失败");
+		}
+		return "redirect:"+Global.getAdminPath()+"/projectcontentinfo/projectReportRecord/?repage";
+	}
+	/**
+	 * 保存报告归档
+	 */
+	@RequestMapping(value = "store")
+	public String store(ProjectReportRecord projectReportRecord, Model model, RedirectAttributes redirectAttributes) throws Exception{
+		if (!beanValidator(model, projectReportRecord)){
+			return form(projectReportRecord, model);
+		}
+		if(!projectReportRecord.getIsNewRecord()){//编辑表单保存
+			ProjectReportRecord t = projectReportRecordService.get(projectReportRecord.getId());//从数据库取出记录的值
+			MyBeanUtils.copyBeanNotNull2Bean(projectReportRecord, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+			projectReportRecordService.save(t);//保存
+		}else{//新增表单保存
+			User user = UserUtils.getUser();
+			projectReportRecord.setCompanyId(user.getComId());
+			projectReportRecord.setOfficeId(user.getOffice().getId());
+			projectReportRecord.setStatus("1");
+			projectReportRecordService.save(projectReportRecord);//保存
+		}
+		addMessage(redirectAttributes, "保存报告归档成功");
+		return "redirect:"+Global.getAdminPath()+"/projectcontentinfo/projectReportRecord/?repage";
+	}
+	/**
+	 * 保存报告归档
+	 */
+	@RequestMapping(value = "getNumber")
+	@ResponseBody
+	public Map<String,Object> getNumber(@RequestParam(required=false) String reportId, Model model, RedirectAttributes redirectAttributes) throws Exception{
+		Map<String,Object> map = new HashMap<>();
+		try {
+			int count = projectReportRecordService.getNumber(reportId);
+			map.put("numberCount",count>9?count+"":"0"+count);
+		}catch (Exception e){
+			logger.error("Exception e"+e);
+			map.put("numberCount","01");
+		}
+		return map;
+	}
+
+	/**
+	 * 读取单个实体流程
+	 * @return
+	 */
+	@RequestMapping(value = "getProcessOne")
+	public String getProcessOne(ProjectReportRecord projectReportRecord,Model model) {
+		model.addAttribute("processInstanceId", projectReportRecord.getProcessInstanceId());
+		return "modules/workreimbursement/workReimbursementTrack";
+	}
+
+	//报告流程审批
+	@RequestMapping(value = {"auditSave"})
+	public String auditSave(ProjectReportRecord projectReportRecord, HttpServletRequest request, HttpServletResponse response, Model model,
+							  RedirectAttributes redirectAttributes) {
+		try {
+			// 对不同环节的业务逻辑进行操作
+			List<User> users = UserUtils.getByProssType(projectReportRecord.getProcessInstanceId(),1);
+			String flag = projectReportRecord.getAct().getFlag();
+			if ("yes".equals(flag) && (users==null || users.size()==0)){
+				addMessage(redirectAttributes, "审批失败,审批人为空,请联系管理员!");
+			}else {
+				String str = projectReportRecordService.auditSave(projectReportRecord,users);
+				addMessage(redirectAttributes, str);
+			}
+		}catch (Exception e){
+			logger.error("Exception e:"+e);
+			addMessage(redirectAttributes, "报告归档流程审批失败");
+		}
+		if (StringUtils.isNotBlank(projectReportRecord.getHome()) && projectReportRecord.getHome().equals("home")){
+			return "redirect:" + Global.getAdminPath() + "/home/?repage";
+		}else {
+			//报告变更
+			Page<ProjectReportRecord> page = projectReportRecordService.findPage(new Page<ProjectReportRecord>(request, response), projectReportRecord);
+			model.addAttribute("page", page);
+			return "modules/projectcontentinfo/projectReportRecordList";
+		}
+	}
+
+	/**
+	 * 删除报告归档
+	 */
+	@RequestMapping(value = "delete")
+	public String delete(ProjectReportRecord projectReportRecord, RedirectAttributes redirectAttributes) {
+		try {
+			String sta = projectReportRecord.getStatus();
+			if("5".equals(sta)){
+				addMessage(redirectAttributes, "报告归档已归档,无法删除");
+				return "redirect:"+Global.getAdminPath()+"/projectcontentinfo/projectReportRecord/?repage";
+			}else if("2".equals(sta)){
+				addMessage(redirectAttributes, "报告归档正在审核中,无法删除");
+				return "redirect:"+Global.getAdminPath()+"/projectcontentinfo/projectReportRecord/?repage";
+			}
+			projectReportRecordService.delete(projectReportRecord);
+			addMessage(redirectAttributes, "删除报告归档成功");
+		}catch (Exception e){
+				addMessage(redirectAttributes, "删除报告归档失败");
+		}
+		return "redirect:"+Global.getAdminPath()+"/projectcontentinfo/projectReportRecord/?repage";
+	}
+
+	/**
+	 * 报告归档:强制撤回
+	 */
+	@RequestMapping("cancelInvalidate")
+	public String cancelInvalidate(ProjectReportRecord projectReportRecord,RedirectAttributes redirectAttributes){
+		try {
+			if(projectReportRecord.getStatus().equals("5")){
+				addMessage(redirectAttributes, "报告归档已审批通过,无法撤回");
+			}else{
+				projectReportRecordService.cancelInvalidate(projectReportRecord);
+				addMessage(redirectAttributes, "强制撤回报告归档成功");
+			}
+		}catch (Exception e){
+			addMessage(redirectAttributes, "强制撤回报告归档失败");
+		}
+		return "redirect:"+Global.getAdminPath()+"/projectcontentinfo/projectReportRecord/?repage";
+	}
+
+	/**
+	 * 批量删除报告归档
+	 */
+	@RequiresPermissions("projectcontentinfo:projectReportRecord:del")
+	@RequestMapping(value = "deleteAll")
+	public String deleteAll(String ids, RedirectAttributes redirectAttributes) {
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			projectReportRecordService.delete(projectReportRecordService.get(id));
+		}
+		addMessage(redirectAttributes, "删除报告归档成功");
+		return "redirect:"+Global.getAdminPath()+"/projectcontentinfo/projectReportRecord/?repage";
+	}
+
+	/**
+	 * 导出excel文件
+	 */
+	@RequiresPermissions("projectcontentinfo:projectReportRecord:export")
+    @RequestMapping(value = "export", method=RequestMethod.POST)
+    public String exportFile(ProjectReportRecord projectReportRecord, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "报告归档"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            Page<ProjectReportRecord> page = projectReportRecordService.findPage(new Page<ProjectReportRecord>(request, response, -1), projectReportRecord);
+    		new ExportExcel("报告归档", ProjectReportRecord.class).setDataList(page.getList()).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导出报告归档记录失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/projectcontentinfo/projectReportRecord/?repage";
+    }
+
+	/**
+	 * 导入Excel数据
+
+	 */
+	@RequiresPermissions("projectcontentinfo:projectReportRecord: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<ProjectReportRecord> list = ei.getDataList(ProjectReportRecord.class);
+			for (ProjectReportRecord projectReportRecord : list){
+				try{
+					projectReportRecordService.save(projectReportRecord);
+					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()+"/projectcontentinfo/projectReportRecord/?repage";
+    }
+	
+	/**
+	 * 下载导入报告归档数据模板
+	 */
+	@RequiresPermissions("projectcontentinfo:projectReportRecord:import")
+    @RequestMapping(value = "import/template")
+    public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "报告归档数据导入模板.xlsx";
+    		List<ProjectReportRecord> list = Lists.newArrayList(); 
+    		new ExportExcel("报告归档数据", ProjectReportRecord.class, 1).setDataList(list).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入模板下载失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/projectcontentinfo/projectReportRecord/?repage";
+    }
+	
+	
+	
+
+}

+ 419 - 0
src/main/java/com/jeeplus/modules/projectcontentinfo/web/ProjectReportStatisticsController.java

@@ -0,0 +1,419 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.projectcontentinfo.web;
+
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.utils.DateUtils;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.utils.excel.ExportExcel;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.modules.projectcontentinfo.entity.ProjectReportDataCompany;
+import com.jeeplus.modules.projectcontentinfo.entity.ProjectReportDataInfo;
+import com.jeeplus.modules.projectcontentinfo.entity.ProjectReportDataMonth;
+import com.jeeplus.modules.projectcontentinfo.entity.ProjectReportDataOffice;
+import com.jeeplus.modules.projectcontentinfo.service.ProjectReportStatisticsService;
+import com.jeeplus.modules.sys.dao.OfficeDao;
+import com.jeeplus.modules.sys.entity.Office;
+import com.jeeplus.modules.sys.service.OfficeService;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.method.P;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * 合同评价表Controller
+ * @author 杨帆
+ * @version 2018-03-23
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/projectreportstatistics/projectreportstatistics")
+public class ProjectReportStatisticsController extends BaseController {
+
+	@Autowired
+	private ProjectReportStatisticsService projectReportStatisticsService;
+	@Autowired
+	private OfficeService officeService;
+	@Autowired
+	private OfficeDao officeDao;
+
+	private List<String> xAxisData;
+	private Map<String,List<Double>> yAxisData;
+	private Map<String,Integer> yAxisIndex;
+	private Map<String,Object> orientData;
+
+	/**
+	 * 合同评价信息列表页面
+	 */
+	@RequiresPermissions("projectreportstatistics:projectreportstatistics:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(ProjectReportDataCompany projectReportDataCompany, HttpServletRequest request,
+					   HttpServletResponse response, Model model,RedirectAttributes redirectAttributes) {
+		int count = UserUtils.getSelectRoleMax();
+		model.addAttribute("roleMax",count);
+		if (count == 4){
+			if (StringUtils.isBlank(projectReportDataCompany.getDate())){
+				projectReportDataCompany.setDate(getYear(new Date()));
+			}
+			if (StringUtils.isNotBlank(projectReportDataCompany.getCheck()) && projectReportDataCompany.getCheck().equals("1")){
+				ProjectReportDataMonth projectReportDataMonth = new ProjectReportDataMonth();
+				projectReportDataMonth.setCompanyId(projectReportDataCompany.getCompanyId());
+				projectReportDataMonth.setOfficeId(projectReportDataCompany.getOfficeId());
+				projectReportDataMonth.setDate(projectReportDataCompany.getDate());
+				List<ProjectReportDataMonth> list = new ArrayList<>();
+				list = projectReportStatisticsService.findMonthCompanyList(projectReportDataMonth);
+				model.addAttribute("list", list);
+				model.addAttribute("showName", "月份");
+				request.setAttribute("xAxisData", getxAxisData(list, 3));
+				request.setAttribute("yAxisData", getyAxisData(list, 3));
+				request.setAttribute("orientData", getorientData(list, 3));
+			}else {
+				if(StringUtils.isNotBlank(projectReportDataCompany.getCompanyId())){
+					request.setAttribute("backState",1);
+				}
+				model.addAttribute("showName", "分公司");
+				List<ProjectReportDataCompany> list = projectReportStatisticsService.findCompanyList(projectReportDataCompany);
+				model.addAttribute("list", list);
+				request.setAttribute("xAxisData", getxAxisData(list, 1));
+				request.setAttribute("yAxisData", getyAxisData(list, 1));
+				request.setAttribute("orientData", getorientData(list, 1));
+			}
+		}else if (count == 3){
+			if(isOffice()){//如果所在分公司下没有子公司
+				return "redirect:"+Global.getAdminPath()+"/projectreportstatistics/projectreportstatistics/officeList?repage";
+			}
+			if (StringUtils.isBlank(projectReportDataCompany.getDate())){
+				projectReportDataCompany.setDate(getYear(new Date()));
+			}
+			if (StringUtils.isNotBlank(projectReportDataCompany.getCheck()) && projectReportDataCompany.getCheck().equals("1")){
+				ProjectReportDataMonth projectReportDataMonth = new ProjectReportDataMonth();
+				projectReportDataMonth.setCompanyId(projectReportDataCompany.getCompanyId());
+				projectReportDataMonth.setOfficeId(projectReportDataCompany.getOfficeId());
+				projectReportDataMonth.setDate(projectReportDataCompany.getDate());
+				List<ProjectReportDataMonth> list = new ArrayList<>();
+				list = projectReportStatisticsService.findMonthCompanyList(projectReportDataMonth);
+				model.addAttribute("list", list);
+				model.addAttribute("showName", "月份");
+				request.setAttribute("xAxisData", getxAxisData(list, 3));
+				request.setAttribute("yAxisData", getyAxisData(list, 3));
+				request.setAttribute("orientData", getorientData(list, 3));
+			}else {
+				if(StringUtils.isNotBlank(projectReportDataCompany.getCompanyId())){
+					request.setAttribute("backState",1);
+				}
+				model.addAttribute("showName", "分公司");
+				List<ProjectReportDataCompany> list = projectReportStatisticsService.findBranchList(projectReportDataCompany);
+				model.addAttribute("list", list);
+				request.setAttribute("xAxisData", getxAxisData(list, 1));
+				request.setAttribute("yAxisData", getyAxisData(list, 1));
+				request.setAttribute("orientData", getorientData(list, 1));
+			}
+			return "modules/projectreportstatistics/projectReportCompanyList";
+		}else if (count == 2){
+			return "redirect:"+Global.getAdminPath()+"/projectreportstatistics/projectreportstatistics/infoList?repage";
+		}else {
+			request.setAttribute("xAxisData",new ArrayList<>());
+			request.setAttribute("yAxisData",new HashMap<String,List<Double>>());
+			request.setAttribute("orientData",new HashMap<String,Object>());
+			model.addAttribute("list", new ArrayList<>());
+		}
+		return "modules/projectreportstatistics/projectReportCompanyList";
+	}
+
+	/**
+	 * 合同评价信息列表页面
+	 */
+	@RequiresPermissions("projectreportstatistics:projectreportstatistics:list")
+	@RequestMapping(value = "officeList")
+	public String officeList(ProjectReportDataOffice projectReportDataOffice, HttpServletRequest request,
+							 HttpServletResponse response, Model model,RedirectAttributes redirectAttributes) {
+		int count = UserUtils.getSelectRoleMax();
+		model.addAttribute("roleMax",count);
+		if (StringUtils.isBlank(projectReportDataOffice.getDate())){
+			Date date = new Date();
+			projectReportDataOffice.setDate(getYear(date));
+		}
+		if (StringUtils.isNotBlank(projectReportDataOffice.getCheck()) && projectReportDataOffice.getCheck().equals("1")){
+			ProjectReportDataMonth projectReportDataMonth = new ProjectReportDataMonth();
+			projectReportDataMonth.setOfficeId(projectReportDataOffice.getOfficeId());
+			projectReportDataMonth.setCompanyId(projectReportDataOffice.getCompanyId());
+			projectReportDataMonth.setDate(projectReportDataOffice.getDate());
+			List<ProjectReportDataMonth> list = projectReportStatisticsService.findOfficeCompanyList(projectReportDataMonth);
+			model.addAttribute("list", list);
+			model.addAttribute("showName", "月份");
+			request.setAttribute("xAxisData", getxAxisData(list, 3));
+			request.setAttribute("yAxisData", getyAxisData(list, 3));
+			request.setAttribute("orientData", getorientData(list, 3));
+		}else {
+			if(StringUtils.isNotBlank(projectReportDataOffice.getCompanyId())){
+				request.setAttribute("backState",1);
+			}
+			List<ProjectReportDataOffice> list = projectReportStatisticsService.findListByOffice(projectReportDataOffice);
+			model.addAttribute("list", list);
+			model.addAttribute("showName", "部门");
+			request.setAttribute("xAxisData", getxAxisData(list, 2));
+			request.setAttribute("yAxisData", getyAxisData(list, 2));
+			request.setAttribute("orientData", getorientData(list, 2));
+		}
+
+		return "modules/projectreportstatistics/projectReportOfficeList";
+	}
+
+	/**
+	 * 合同评价信息列表页面
+	 */
+	@RequiresPermissions("projectreportstatistics:projectreportstatistics:list")
+	@RequestMapping(value = "infoList")
+	public String infoList(ProjectReportDataInfo projectReportDataInfo, HttpServletRequest request, HttpServletResponse response, Model model) {
+		int count = UserUtils.getSelectRoleMax();
+		model.addAttribute("roleMax",count);
+		if(StringUtils.isNotBlank(projectReportDataInfo.getOfficeId())){
+			request.setAttribute("backState",1);
+		}
+		if (StringUtils.isBlank(projectReportDataInfo.getDate())){
+			Date date = new Date();
+			projectReportDataInfo.setDate(getYear(date));
+		}
+		Page<ProjectReportDataInfo> page = projectReportStatisticsService.findPageByInfo(new Page<ProjectReportDataInfo>(request, response),projectReportDataInfo);
+		model.addAttribute("page",page);
+		return "modules/projectreportstatistics/projectReportInfoList";
+	}
+
+	/**
+	 * 导出excel文件
+	 */
+	@RequiresPermissions("projectreportstatistics:projectreportstatistics:export")
+    @RequestMapping(value = "export", method=RequestMethod.POST)
+    public String exportFile(ProjectReportDataCompany projectReportDataCompany, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+			if (StringUtils.isBlank(projectReportDataCompany.getCheck())){
+				String fileName = "合同统计表-分公司"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+				List<ProjectReportDataCompany> list = projectReportStatisticsService.findCompanyList(projectReportDataCompany);
+				String agent = request.getHeader("USER-AGENT");
+				new ExportExcel("合同统计表-分公司", ProjectReportDataCompany.class).setDataList(list).write(response, fileName,agent).dispose();
+				return null;
+			}else {
+				String fileName = "合同统计表-分公司"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+				ProjectReportDataMonth projectReportDataMonth = new ProjectReportDataMonth();
+				projectReportDataMonth.setCompanyId(projectReportDataCompany.getCompanyId());
+				projectReportDataMonth.setOfficeId(projectReportDataCompany.getOfficeId());
+				projectReportDataMonth.setDate(projectReportDataCompany.getDate());
+				List<ProjectReportDataMonth> list = new ArrayList<>();
+				if (StringUtils.isBlank(projectReportDataCompany.getCompanyId()) || StringUtils.isBlank(projectReportDataCompany.getName())){
+					list = projectReportStatisticsService.findMonthCompanyList(projectReportDataMonth);
+				}else {
+					list = projectReportStatisticsService.findMonthCompanyList(projectReportDataMonth);
+				}
+				String agent = request.getHeader("USER-AGENT");
+				new ExportExcel("合同统计表-分公司", ProjectReportDataCompany.class).setDataList(list).write(response, fileName,agent).dispose();
+				return null;
+			}
+
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导出合同统计表-分公司记录失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/projectreportstatistics/projectreportstatistics/list?repage";
+    }
+	/**
+	 * 导出excel文件
+	 */
+	@RequiresPermissions("projectreportstatistics:projectreportstatistics:export")
+	@RequestMapping(value = "exportOffice", method=RequestMethod.POST)
+	public String exportFileOffice(ProjectReportDataOffice projectReportDataOffice, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+			if (StringUtils.isBlank(projectReportDataOffice.getCheck())) {
+				String fileName = "合同统计表-部门" + DateUtils.getDate("yyyyMMddHHmmss") + ".xlsx";
+				List<ProjectReportDataOffice> list = projectReportStatisticsService.findListByOffice(projectReportDataOffice);
+				String agent = request.getHeader("USER-AGENT");
+				new ExportExcel("合同统计表-部门", ProjectReportDataOffice.class).setDataList(list).write(response, fileName, agent).dispose();
+				return null;
+			}else {
+				String fileName = "合同统计表-部门"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+				ProjectReportDataMonth projectReportDataMonth = new ProjectReportDataMonth();
+				projectReportDataMonth.setOfficeId(projectReportDataOffice.getOfficeId());
+				projectReportDataMonth.setDate(projectReportDataOffice.getDate());
+				projectReportDataMonth.setCompanyId(projectReportDataOffice.getCompanyId());
+				List<ProjectReportDataMonth> list = projectReportStatisticsService.findOfficeCompanyList(projectReportDataMonth);
+				String agent = request.getHeader("USER-AGENT");
+				new ExportExcel("合同统计表-部门", ProjectReportDataOffice.class).setDataList(list).write(response, fileName,agent).dispose();
+				return null;
+			}
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导出合同统计表-部门记录失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/projectreportstatistics/projectreportstatistics/officeList?repage";
+	}
+
+	/**
+	 * 导出excel文件
+	 */
+	@RequiresPermissions("projectreportstatistics:projectreportstatistics:export")
+	@RequestMapping(value = "exportInfo", method=RequestMethod.POST)
+	public String exportFileInfo(ProjectReportDataInfo ProjectReportDataInfo, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+			String fileName = "合同统计表-明细"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+			Page<ProjectReportDataInfo> page = projectReportStatisticsService.findPageByInfo(new Page<ProjectReportDataInfo>(request, response),ProjectReportDataInfo);
+			String agent = request.getHeader("USER-AGENT");
+			new ExportExcel("合同统计表-明细", ProjectReportDataInfo.class).setDataList(page.getList()).write(response, fileName,agent).dispose();
+			return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导出合同统计表-明细记录失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/projectreportstatistics/projectreportstatistics/infoList?repage";
+	}
+
+	public List<String> getxAxisData(List list,int type){
+		xAxisData = new ArrayList<String>();
+		if (type == 1){
+			for(ProjectReportDataCompany w:(List<ProjectReportDataCompany>)list){
+				if (!w.getName().equals("合计"))
+				xAxisData.add(w.getName());
+			}
+		}else if (type == 2){
+			for(ProjectReportDataOffice w:(List<ProjectReportDataOffice>)list){
+				if (!w.getName().equals("合计"))
+				xAxisData.add(w.getName());
+			}
+		}else{
+			for(ProjectReportDataMonth w:(List<ProjectReportDataMonth>)list){
+				if (!w.getName().equals("合计"))
+					xAxisData.add(w.getName());
+			}
+		}
+
+		return xAxisData;
+	}
+
+	public Map<String,List<Double>> getyAxisData(List list,int type){
+		Random random = new Random();
+		yAxisData = new HashMap<String,List<Double>>();
+		List<Double> data = new ArrayList<Double>();
+		if (type == 1){
+			for(ProjectReportDataCompany w:(List<ProjectReportDataCompany>)list){
+				if (!w.getName().equals("合计"))
+				data.add((double)w.getReportCount());
+			}
+		}else if (type == 2){
+			for(ProjectReportDataOffice w:(List<ProjectReportDataOffice>)list){
+				if (!w.getName().equals("合计"))
+				data.add((double)w.getReportCount());
+			}
+		}else{
+			for(ProjectReportDataMonth w:(List<ProjectReportDataMonth>)list){
+				if (!w.getName().equals("合计"))
+					data.add((double)w.getReportCount());
+			}
+		}
+		yAxisData.put("报告数量", data);
+		return yAxisData;
+	}
+	//饼图
+	public Map<String,Object> getorientData(List list,int type){
+		orientData = new HashMap<String,Object>();
+		List<Integer> data = new ArrayList<Integer>();
+		if (type == 1){
+			for(ProjectReportDataCompany w:(List<ProjectReportDataCompany>)list){
+				if (!w.getName().equals("合计"))
+				orientData.put(w.getName(),w.getReportCount());
+			}
+		}else if (type == 2){
+			for(ProjectReportDataOffice w:(List<ProjectReportDataOffice>)list){
+				if (!w.getName().equals("合计"))
+				orientData.put(w.getName(),w.getReportCount());
+			}
+		}else{
+			for(ProjectReportDataMonth w:(List<ProjectReportDataMonth>)list){
+				if (!w.getName().equals("合计"))
+					orientData.put(w.getName(),w.getReportCount());
+			}
+		}
+		return orientData;
+	}
+
+	public static String getYear(Date date){
+		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+		String str = format.format(date);
+		return str.substring(0,4);
+	}
+
+	public static Map<String,String> getDate(){
+		Map<String,String> map = new HashMap<>();
+		Calendar cale = null;
+		cale = Calendar.getInstance();
+		int year = cale.get(Calendar.YEAR);
+		int month = cale.get(Calendar.MONTH) + 1;
+		int day = cale.get(Calendar.DATE);
+		int hour = cale.get(Calendar.HOUR_OF_DAY);
+		int minute = cale.get(Calendar.MINUTE);
+		int second = cale.get(Calendar.SECOND);
+		int dow = cale.get(Calendar.DAY_OF_WEEK);
+		int dom = cale.get(Calendar.DAY_OF_MONTH);
+		int doy = cale.get(Calendar.DAY_OF_YEAR);
+		//System.out.println("Current Date: " + cale.getTime());
+		map.put("date",cale.getTime()+"");
+		//System.out.println("Year: " + year);
+		map.put("year",year+"");
+		//System.out.println("Month: " + month);
+		map.put("month",month+"");
+		//System.out.println("Day: " + day);
+		map.put("day",day+"");
+		//System.out.println("Hour: " + hour);
+		map.put("hour",hour+"");
+		//System.out.println("Minute: " + minute);
+		map.put("minute",minute+"");
+		//System.out.println("Second: " + second);
+		map.put("second",second+"");
+		//System.out.println("Day of Week: " + dow);
+		map.put("dow",dow+"");
+		//System.out.println("Day of Month: " + dom);
+		map.put("dom",dom+"");
+		//System.out.println("Day of Year: " + doy);
+		map.put("doy",doy+"");
+
+
+		// 获取当月第一天和最后一天
+		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+		String firstday, lastday;
+		// 获取前月的第一天
+		cale = Calendar.getInstance();
+		cale.add(Calendar.MONTH, 0);
+		cale.set(Calendar.DAY_OF_MONTH, 1);
+		firstday = format.format(cale.getTime());
+		// 获取前月的最后一天
+		cale = Calendar.getInstance();
+		cale.add(Calendar.MONTH, 1);
+		cale.set(Calendar.DAY_OF_MONTH, 0);
+		lastday = format.format(cale.getTime());
+		System.out.println("本月第一天和最后一天分别是 : " + firstday + " and " + lastday);
+		// 获取当前日期字符串
+		Date d = new Date();
+		System.out.println("当前日期字符串1:" + format.format(d));
+		System.out.println("当前日期字符串2:" + year + "/" + month + "/" + day + " "
+				+ hour + ":" + minute + ":" + second);
+		map.put("dateStr1",format.format(d));
+		map.put("dateStr2",year + "/" + month + "/" + day + " "
+				+ hour + ":" + minute + ":" + second);
+		return map;
+	}
+	//分公司下是否存在子公司
+	public Boolean isOffice(){
+		String companyId= UserUtils.getSelectBranchOffice();
+		List<Office>office=	officeDao.getAllBranch(companyId);
+		if(office!=null&&office.size()>0){
+			return false;
+		}else{
+			return true;
+		}
+	}
+}

文件差异内容过多而无法显示
+ 1448 - 0
src/main/java/com/jeeplus/modules/projectcontentinfo/web/ProjectcontentinfoController.java


+ 27 - 0
src/main/java/com/jeeplus/modules/projectcontroltable/dao/ProjectControlTableDao.java

@@ -0,0 +1,27 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.projectcontroltable.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.projectcontroltable.entity.ProjectControlTable;
+
+import java.util.List;
+
+/**
+ * 过程控制表DAO接口
+ * @author 马鹏波
+ * @version 2018-06-08
+ */
+@MyBatisDao
+public interface ProjectControlTableDao extends CrudDao<ProjectControlTable> {
+
+    public List<ProjectControlTable> getControlData(ProjectControlTable projectControlTable);
+
+    public int delControlData(ProjectControlTable projectControlTable);
+
+    int updatePfId(ProjectControlTable projectControlTable);
+
+    public List<ProjectControlTable> findListById(ProjectControlTable projectControlTable);
+}

+ 176 - 0
src/main/java/com/jeeplus/modules/projectcontroltable/entity/ProjectControlTable.java

@@ -0,0 +1,176 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.projectcontroltable.entity;
+
+import com.google.common.collect.Lists;
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.entity.Workattachment;
+import com.jeeplus.modules.workcommunicaterecord.entity.WorkCommunicateRecord;
+import com.jeeplus.modules.workdevicerecord.entity.WorkDeviceXjRecord;
+import com.jeeplus.modules.workexplore.entity.WorkExplore;
+import com.jeeplus.modules.workhandbill.entity.WorkHandBill;
+import com.jeeplus.modules.workinfolist.entity.WorkInfoList;
+import com.jeeplus.modules.worklog.entity.WorkLog;
+import com.jeeplus.modules.worklog.entity.WorkMeeting;
+import com.jeeplus.modules.workprojectcalc.entity.WorkProjectCalcBuild;
+import com.jeeplus.modules.workprojectcalc.entity.WorkProjectCalcDecor;
+
+import java.util.List;
+
+/**
+ * 过程控制表Entity
+ * @author 马鹏波
+ * @version 2018-06-08
+ */
+public class ProjectControlTable extends DataEntity<ProjectControlTable> {
+	
+	private static final long serialVersionUID = 1L;
+	private String tName;		// 表格名称
+	private String tType;		// 表格类型
+	private User tUser;		// 负责人
+	private String pfId;
+	private String processName;
+	private List<Workattachment> workAttachments;
+	private WorkDeviceXjRecord workDeviceXjRecord;
+	private WorkInfoList workInfoList;
+	private WorkExplore workExplore;
+	private WorkCommunicateRecord workCommunicateRecord;
+	private List<WorkProjectCalcBuild> workProjectCalcBuildList = Lists.newArrayList();
+	private List<WorkProjectCalcDecor> workProjectCalcDecorList = Lists.newArrayList();
+	private WorkHandBill workHandBill;
+	private WorkLog  workLog;
+	private WorkMeeting workMeeting;
+
+	public ProjectControlTable() {
+		super();
+	}
+
+	public ProjectControlTable(String id){
+		super(id);
+	}
+
+	@ExcelField(title="表格名称", align=2, sort=7)
+	public String gettName() {
+		return tName;
+	}
+
+	public void settName(String tName) {
+		this.tName = tName;
+	}
+
+	@ExcelField(title="表格类型", align=2, sort=8)
+	public String gettType() {
+		return tType;
+	}
+
+	public void settType(String tType) {
+		this.tType = tType;
+	}
+
+	public User gettUser() {
+		return tUser;
+	}
+
+	public void settUser(User tUser) {
+		this.tUser = tUser;
+	}
+
+	public String getPfId() {
+		return pfId;
+	}
+
+	public void setPfId(String pfId) {
+		this.pfId = pfId;
+	}
+
+	public List<Workattachment> getWorkAttachments() {
+		return workAttachments;
+	}
+
+	public void setWorkAttachments(List<Workattachment> workAttachments) {
+		this.workAttachments = workAttachments;
+	}
+
+	public String getProcessName() {
+		return processName;
+	}
+
+	public void setProcessName(String processName) {
+		this.processName = processName;
+	}
+
+	public WorkDeviceXjRecord getWorkDeviceXjRecord() {
+		return workDeviceXjRecord;
+	}
+
+	public void setWorkDeviceXjRecord(WorkDeviceXjRecord workDeviceXjRecord) {
+		this.workDeviceXjRecord = workDeviceXjRecord;
+	}
+
+	public WorkInfoList getWorkInfoList() {
+		return workInfoList;
+	}
+
+	public void setWorkInfoList(WorkInfoList workInfoList) {
+		this.workInfoList = workInfoList;
+	}
+
+	public WorkExplore getWorkExplore() {
+		return workExplore;
+	}
+
+	public void setWorkExplore(WorkExplore workExplore) {
+		this.workExplore = workExplore;
+	}
+
+	public WorkCommunicateRecord getWorkCommunicateRecord() {
+		return workCommunicateRecord;
+	}
+
+	public void setWorkCommunicateRecord(WorkCommunicateRecord workCommunicateRecord) {
+		this.workCommunicateRecord = workCommunicateRecord;
+	}
+
+	public List<WorkProjectCalcBuild> getWorkProjectCalcBuildList() {
+		return workProjectCalcBuildList;
+	}
+
+	public void setWorkProjectCalcBuildList(List<WorkProjectCalcBuild> workProjectCalcBuildList) {
+		this.workProjectCalcBuildList = workProjectCalcBuildList;
+	}
+
+	public List<WorkProjectCalcDecor> getWorkProjectCalcDecorList() {
+		return workProjectCalcDecorList;
+	}
+
+	public void setWorkProjectCalcDecorList(List<WorkProjectCalcDecor> workProjectCalcDecorList) {
+		this.workProjectCalcDecorList = workProjectCalcDecorList;
+	}
+
+	public WorkHandBill getWorkHandBill() {
+		return workHandBill;
+	}
+
+	public void setWorkHandBill(WorkHandBill workHandBill) {
+		this.workHandBill = workHandBill;
+	}
+
+	public WorkLog getWorkLog() {
+		return workLog;
+	}
+
+	public void setWorkLog(WorkLog workLog) {
+		this.workLog = workLog;
+	}
+
+	public WorkMeeting getWorkMeeting() {
+		return workMeeting;
+	}
+
+	public void setWorkMeeting(WorkMeeting workMeeting) {
+		this.workMeeting = workMeeting;
+	}
+}

+ 743 - 0
src/main/java/com/jeeplus/modules/projectcontroltable/service/ProjectControlTableService.java

@@ -0,0 +1,743 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.projectcontroltable.service;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.Lists;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.service.CrudService;
+import com.jeeplus.modules.projectcontentinfo.dao.ProjectcontentinfoDao;
+import com.jeeplus.modules.projectcontentinfo.entity.Projectcontentinfo;
+import com.jeeplus.modules.projectcontroltable.dao.ProjectControlTableDao;
+import com.jeeplus.modules.projectcontroltable.entity.ProjectControlTable;
+import com.jeeplus.modules.sys.dao.WorkattachmentDao;
+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.workclientinfo.entity.WorkClientAttachment;
+import com.jeeplus.modules.workcommunicaterecord.dao.WorkCommunicateContentDao;
+import com.jeeplus.modules.workcommunicaterecord.dao.WorkCommunicateRecordDao;
+import com.jeeplus.modules.workcommunicaterecord.entity.WorkCommunicateContent;
+import com.jeeplus.modules.workcommunicaterecord.entity.WorkCommunicateRecord;
+import com.jeeplus.modules.workcommunicaterecord.service.WorkCommunicateContentService;
+import com.jeeplus.modules.workcommunicaterecord.service.WorkCommunicateRecordService;
+import com.jeeplus.modules.workdevicerecord.dao.WorkDeviceRecordDao;
+import com.jeeplus.modules.workdevicerecord.dao.WorkDeviceXjRecordDao;
+import com.jeeplus.modules.workdevicerecord.entity.WorkDeviceRecord;
+import com.jeeplus.modules.workdevicerecord.entity.WorkDeviceXjRecord;
+import com.jeeplus.modules.workdevicerecord.service.WorkDeviceRecordService;
+import com.jeeplus.modules.workdevicerecord.service.WorkDeviceXjRecordService;
+import com.jeeplus.modules.workexplore.dao.WorkExploreDao;
+import com.jeeplus.modules.workexplore.entity.WorkExplore;
+import com.jeeplus.modules.workexplore.service.WorkExploreService;
+import com.jeeplus.modules.workhandbill.dao.WorkHandBillDao;
+import com.jeeplus.modules.workhandbill.dao.WorkHandBillDetailDao;
+import com.jeeplus.modules.workhandbill.entity.WorkHandBill;
+import com.jeeplus.modules.workhandbill.entity.WorkHandBillDetail;
+import com.jeeplus.modules.workhandbill.service.WorkHandBillDetailService;
+import com.jeeplus.modules.workhandbill.service.WorkHandBillService;
+import com.jeeplus.modules.workinfolist.dao.WorkInfoListDao;
+import com.jeeplus.modules.workinfolist.entity.WorkInfoList;
+import com.jeeplus.modules.workinfolist.service.WorkInfoListService;
+import com.jeeplus.modules.worklog.dao.WorkLogDao;
+import com.jeeplus.modules.worklog.dao.WorkMeetingDao;
+import com.jeeplus.modules.worklog.entity.WorkLog;
+import com.jeeplus.modules.worklog.entity.WorkMeeting;
+import com.jeeplus.modules.workprojectcalc.dao.WorkProjectCalcBuildDao;
+import com.jeeplus.modules.workprojectcalc.dao.WorkProjectCalcDecorDao;
+import com.jeeplus.modules.workprojectcalc.entity.WorkProjectCalcBuild;
+import com.jeeplus.modules.workprojectcalc.entity.WorkProjectCalcDecor;
+import com.jeeplus.modules.workprojectcalc.service.WorkProjectCalcBuildService;
+import com.jeeplus.modules.workprojectcalc.service.WorkProjectCalcDecorService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * 过程控制表Service
+ * @author 马鹏波
+ * @version 2018-06-08
+ */
+@Service
+@Transactional(readOnly = true)
+public class ProjectControlTableService extends CrudService<ProjectControlTableDao, ProjectControlTable> {
+	@Autowired
+	private ProjectControlTableDao projectControlTableDao;
+	@Autowired
+	private WorkHandBillDetailDao workHandBillDetailDao;
+	@Autowired
+	private WorkHandBillDao workHandBillDao;
+	@Autowired
+	private WorkExploreDao workExploreDao;
+	@Autowired
+	private WorkInfoListDao workInfoListDao;
+	@Autowired
+	private WorkDeviceXjRecordDao workDeviceXjRecordDao;
+	@Autowired
+	private WorkProjectCalcDecorDao workProjectCalcDecorDao;
+	@Autowired
+	private WorkProjectCalcBuildDao workProjectCalcBuildDao;
+	@Autowired
+	private WorkDeviceRecordDao workDeviceRecordDao;
+	@Autowired
+	private WorkCommunicateRecordDao workCommunicateRecordDao;
+	@Autowired
+	private WorkCommunicateContentDao workCommunicateContentDao;
+	@Autowired
+	private WorkattachmentDao workattachmentDao;
+	@Autowired
+	private WorkattachmentService workattachmentService;
+    @Autowired
+    private ProjectcontentinfoDao projectcontentinfoDao;
+    @Autowired
+    private WorkHandBillService workHandBillService;
+    @Autowired
+    private WorkHandBillDetailService workHandBillDetailService;
+    @Autowired
+    private WorkDeviceXjRecordService workDeviceXjRecordService;
+    @Autowired
+    private WorkDeviceRecordService workDeviceRecordService;
+    @Autowired
+    private WorkExploreService workExploreService;
+    @Autowired
+    private WorkInfoListService workInfoListService;
+    @Autowired
+    private WorkCommunicateRecordService workCommunicateRecordService;
+    @Autowired
+    private WorkCommunicateContentService workCommunicateContentService;
+    @Autowired
+    private WorkProjectCalcDecorService workProjectCalcDecorService;
+    @Autowired
+    private WorkProjectCalcBuildService workProjectCalcBuildService;
+    @Autowired
+	private WorkLogDao workLogDao;
+    @Autowired
+	private WorkMeetingDao workMeetingDao;
+
+
+
+	public ProjectControlTable get(String id) {
+		return super.get(id);
+	}
+	
+	public List<ProjectControlTable> findList(ProjectControlTable projectControlTable) {
+		return super.findList(projectControlTable);
+	}
+	
+	public Page<ProjectControlTable> findPage(Page<ProjectControlTable> page, ProjectControlTable projectControlTable) {
+		return super.findPage(page, projectControlTable);
+	}
+	
+	@Transactional(readOnly = false)
+	public void save(ProjectControlTable projectControlTable) {
+		super.save(projectControlTable);
+		String s = projectControlTable.gettType();
+		if ("01".equals(s)) {
+			execDeviceRecord(projectControlTable);
+		} else if ("02".equals(s)) {
+			execInfoList(projectControlTable);
+		} else if ("03".equals(s)) {
+			execExplore(projectControlTable);
+		} else if ("04".equals(s)) {
+			execCommunicate(projectControlTable);
+		} else if ("05".equals(s)) {
+			execproject(projectControlTable);
+		} else if ("06".equals(s)) {
+			execHandBill(projectControlTable);
+		} else if("07".equals(s)){
+            execLog(projectControlTable);
+		}  else if("08".equals(s)){
+            execMeeting(projectControlTable);
+		}
+
+		List<Workattachment> workAttachments = projectControlTable.getWorkAttachments();
+		if(workAttachments != null) {
+			//附件信息
+			for (Workattachment workattachment : workAttachments) {
+				if (WorkClientAttachment.DEL_FLAG_NORMAL.equals(workattachment.getDelFlag())) {
+					workattachment.setAttachmentId(projectControlTable.getId());
+					if ("01".equals(s)) {	//设备询价记录
+						workattachment.setAttachmentFlag("88");
+					} else if ("02".equals(s)) {	//补充资料
+						workattachment.setAttachmentFlag("89");
+					} else if ("03".equals(s)) {	//现场踏勘
+						workattachment.setAttachmentFlag("90");
+					} else if ("04".equals(s)) {	//沟通记录
+						workattachment.setAttachmentFlag("91");
+					} else if ("05".equals(s)) {	//工程量计算底稿
+						workattachment.setAttachmentFlag("92");
+					} else if ("06".equals(s)) {	// 交接单
+						workattachment.setAttachmentFlag("93");
+					} else if("07".equals(s)){      //日志
+						workattachment.setAttachmentFlag("93");
+					} else if("08".equals(s)){      //会议
+						workattachment.setAttachmentFlag("93");
+					}
+					workattachment.setAttachmentUser(UserUtils.getUser().getId());
+					if (Strings.isNullOrEmpty(workattachment.getId()) || "null".equals(workattachment.getId())) {
+						workattachment.preInsert();
+						workattachmentDao.insert(workattachment);
+					} else {
+						workattachment.preUpdate();
+						workattachmentDao.update(workattachment);
+					}
+				} else {
+					workattachmentDao.delete(workattachment);
+				}
+			}
+		}
+	}
+
+	/**
+	 * 执行设备询价记录
+	 * @param projectControlTable
+	 */
+	public void execDeviceRecord(ProjectControlTable projectControlTable){
+		WorkDeviceXjRecord workDeviceXjRecord = projectControlTable.getWorkDeviceXjRecord();
+		if(workDeviceXjRecord != null){
+			if(WorkDeviceXjRecord.DEL_FLAG_NORMAL.equals(workDeviceXjRecord.getDelFlag())){
+				if(workDeviceXjRecord.getIsNewRecord()){
+					workDeviceXjRecord.setProjectId(projectControlTable.getId());
+					workDeviceXjRecord.preInsert();
+					workDeviceXjRecordDao.insert(workDeviceXjRecord);
+				}else{
+					workDeviceXjRecord.preUpdate();
+					workDeviceXjRecordDao.update(workDeviceXjRecord);
+				}
+			}else{
+				workDeviceXjRecordDao.delete(workDeviceXjRecord);
+			}
+			List<WorkDeviceRecord> workDeviceRecordList = workDeviceXjRecord.getWorkDeviceRecordList();
+			if(workDeviceRecordList != null){
+				for(WorkDeviceRecord workDeviceRecord:workDeviceRecordList){
+					if(WorkDeviceRecord.DEL_FLAG_NORMAL.equals(workDeviceRecord.getDelFlag())){
+						workDeviceRecord.setDeviceXjId(workDeviceXjRecord.getId());
+						if(workDeviceRecord.getIsNewRecord()){
+							workDeviceRecord.preInsert();
+							workDeviceRecordDao.insert(workDeviceRecord);
+						}else{
+							workDeviceRecord.preUpdate();
+							workDeviceRecordDao.update(workDeviceRecord);
+						}
+					}else{
+						workDeviceRecordDao.delete(workDeviceRecord);
+					}
+				}
+			}
+		}
+	}
+
+	/**
+	 * 执行补充资料清单
+	 * @param projectControlTable
+	 */
+	public void execInfoList(ProjectControlTable projectControlTable){
+		WorkInfoList workInfoList = projectControlTable.getWorkInfoList();
+		if(workInfoList != null){
+			if(workInfoList.DEL_FLAG_NORMAL.equals(workInfoList.getDelFlag())){
+				if(workInfoList.getIsNewRecord()){
+					workInfoList.setProjectId(projectControlTable.getId());
+					workInfoList.preInsert();
+					workInfoListDao.insert(workInfoList);
+				}else{
+					workInfoList.preUpdate();
+					workInfoListDao.update(workInfoList);
+				}
+			}else{
+				workInfoListDao.delete(workInfoList);
+			}
+		}
+	}
+
+	/**
+	 * 现场踏勘记录
+	 * @param projectControlTable
+	 */
+	public void execExplore(ProjectControlTable projectControlTable){
+		WorkExplore workExplore = projectControlTable.getWorkExplore();
+		if(workExplore != null){
+			if(WorkExplore.DEL_FLAG_NORMAL.equals(workExplore.getDelFlag())){
+				if(workExplore.getIsNewRecord()){
+					workExplore.setProjectId(projectControlTable.getId());
+					workExplore.preInsert();
+					workExploreDao.insert(workExplore);
+				}else{
+					workExplore.preUpdate();
+					workExploreDao.update(workExplore);
+				}
+			}else{
+				workExploreDao.delete(workExplore);
+			}
+		}
+	}
+
+	/**
+	 *	沟通记录表
+	 * @param projectControlTable
+	 */
+	public void execCommunicate(ProjectControlTable projectControlTable){
+		WorkCommunicateRecord workCommunicateRecord = projectControlTable.getWorkCommunicateRecord();
+		if(workCommunicateRecord != null){
+			if(WorkCommunicateRecord.DEL_FLAG_NORMAL.equals(workCommunicateRecord.getDelFlag())){
+				if(workCommunicateRecord.getIsNewRecord()){
+					workCommunicateRecord.setProjectId(projectControlTable.getId());
+					workCommunicateRecord.preInsert();
+					workCommunicateRecordDao.insert(workCommunicateRecord);
+				}else{
+					workCommunicateRecord.preUpdate();
+					workCommunicateRecordDao.update(workCommunicateRecord);
+				}
+			}else{
+				workCommunicateRecordDao.delete(workCommunicateRecord);
+			}
+			List<WorkCommunicateContent> workCommunicateContentList = workCommunicateRecord.getWorkCommunicateContentList();
+			if(workCommunicateContentList != null){
+				for(WorkCommunicateContent workCommunicateContent:workCommunicateContentList){
+					if(WorkCommunicateContent.DEL_FLAG_NORMAL.equals(workCommunicateContent.getDelFlag())){
+						workCommunicateContent.setCommunicateId(workCommunicateRecord.getId());
+						if(workCommunicateContent.getIsNewRecord()){
+							workCommunicateContent.preInsert();
+							workCommunicateContentDao.insert(workCommunicateContent);
+						}else{
+							workCommunicateContent.preUpdate();
+							workCommunicateContentDao.update(workCommunicateContent);
+						}
+					}else{
+						workCommunicateContentDao.delete(workCommunicateContent);
+					}
+				}
+			}
+		}
+	}
+	/**
+	 *	工程量计算底稿
+	 * @param projectControlTable
+	 */
+	public void execproject(ProjectControlTable projectControlTable){
+		List<WorkProjectCalcDecor> workProjectCalcDecorList = projectControlTable.getWorkProjectCalcDecorList();
+		if(workProjectCalcDecorList != null){
+			for(WorkProjectCalcDecor workProjectCalcDecor:workProjectCalcDecorList){
+				if(WorkProjectCalcDecor.DEL_FLAG_NORMAL.equals(workProjectCalcDecor.getDelFlag())){
+					workProjectCalcDecor.setProjectId(projectControlTable.getId());
+					if(workProjectCalcDecor.getIsNewRecord()){
+						workProjectCalcDecor.preInsert();
+						workProjectCalcDecorDao.insert(workProjectCalcDecor);
+					}else{
+						workProjectCalcDecor.preUpdate();
+						workProjectCalcDecorDao.update(workProjectCalcDecor);
+					}
+				}else{
+					workProjectCalcDecorDao.delete(workProjectCalcDecor);
+				}
+			}
+		}
+		List<WorkProjectCalcBuild> workProjectCalcBuildList = projectControlTable.getWorkProjectCalcBuildList();
+		if(workProjectCalcBuildList != null){
+			for(WorkProjectCalcBuild workProjectCalcBuild:workProjectCalcBuildList){
+				if(WorkProjectCalcBuild.DEL_FLAG_NORMAL.equals(workProjectCalcBuild.getDelFlag())){
+					workProjectCalcBuild.setProjectId(projectControlTable.getId());
+					if(workProjectCalcBuild.getIsNewRecord()){
+						workProjectCalcBuild.preInsert();
+						workProjectCalcBuildDao.insert(workProjectCalcBuild);
+					}else{
+						workProjectCalcBuild.preUpdate();
+						workProjectCalcBuildDao.update(workProjectCalcBuild);
+					}
+				}else{
+					workProjectCalcBuildDao.delete(workProjectCalcBuild);
+				}
+			}
+		}
+	}
+	/**
+	 *	日志
+	 * @param projectControlTable
+	 */
+	public void execLog(ProjectControlTable projectControlTable){
+		WorkLog workLog = projectControlTable.getWorkLog();
+		if(workLog != null){
+			if(WorkLog.DEL_FLAG_NORMAL.equals(workLog.getDelFlag())){
+				if(workLog.getIsNewRecord()){
+					workLog.setProjectId(projectControlTable.getId());
+					workLog.preInsert();
+					workLogDao.insert(workLog);
+				}else{
+					workLog.preUpdate();
+					workLogDao.update(workLog);
+				}
+			}else{
+				workLogDao.delete(workLog);
+			}
+		}
+	}
+
+	/**
+	 *	会议
+	 * @param projectControlTable
+	 */
+	public void execMeeting(ProjectControlTable projectControlTable){
+		WorkMeeting workMeeting = projectControlTable.getWorkMeeting();
+
+		if(workMeeting != null){
+			if(WorkLog.DEL_FLAG_NORMAL.equals(workMeeting.getDelFlag())){
+				if(workMeeting.getIsNewRecord()){
+					workMeeting.setProjectId(projectControlTable.getId());
+					workMeeting.preInsert();
+					workMeetingDao.insert(workMeeting);
+				}else{
+					workMeeting.preUpdate();
+					workMeetingDao.update(workMeeting);
+				}
+			}else{
+				workMeetingDao.delete(workMeeting);
+			}
+		}
+	}
+
+	/**
+	 *	交接单
+	 * @param projectControlTable
+	 */
+	public void execHandBill(ProjectControlTable projectControlTable){
+		WorkHandBill workHandBill = projectControlTable.getWorkHandBill();
+		if(workHandBill != null){
+			if(WorkHandBill.DEL_FLAG_NORMAL.equals(workHandBill.getDelFlag())){
+				if(workHandBill.getIsNewRecord()){
+					workHandBill.setProjectId(projectControlTable.getId());
+					workHandBill.preInsert();
+					workHandBillDao.insert(workHandBill);
+				}else{
+					workHandBill.preUpdate();
+					workHandBillDao.update(workHandBill);
+				}
+			}else{
+				workHandBillDao.delete(workHandBill);
+			}
+			List<WorkHandBillDetail> workHandBillDetailList = workHandBill.getWorkHandBillDetailList();
+			if(workHandBillDetailList != null){
+				for(WorkHandBillDetail workHandBillDetail:workHandBillDetailList){
+					if(WorkHandBillDetail.DEL_FLAG_NORMAL.equals(workHandBillDetail.getDelFlag())){
+						workHandBillDetail.setBillId(workHandBill.getId());
+						if(workHandBillDetail.getIsNewRecord()){
+							workHandBillDetail.preInsert();
+							workHandBillDetailDao.insert(workHandBillDetail);
+						}else{
+							workHandBillDetail.preUpdate();
+							workHandBillDetailDao.update(workHandBillDetail);
+						}
+					}else{
+						workHandBillDetailDao.delete(workHandBillDetail);
+					}
+				}
+			}
+		}
+	}
+
+	@Transactional(readOnly = false)
+	public void delete(ProjectControlTable projectControlTable) {
+		super.delete(projectControlTable);
+	}
+
+	public List<ProjectControlTable> getControlData(String projectId,String projectContentDataId){
+			ProjectControlTable projectControlTable = new ProjectControlTable();
+			projectControlTable.setPfId(projectId);
+			List<ProjectControlTable> controlData = projectControlTableDao.getControlData(projectControlTable);
+			projectControlTable.setPfId(projectContentDataId);
+			List<ProjectControlTable> controlData1 = projectControlTableDao.getControlData(projectControlTable);
+			controlData.addAll(controlData1);
+			return controlData;
+	}
+
+	@Transactional(readOnly = false)
+	public boolean deleteAllData(String projectId,String projectContentDataId){
+		ProjectControlTable projectControlTable = new ProjectControlTable();
+		ProjectControlTable existRecord = null;
+		//表格控制临时数据
+		List<ProjectControlTable> controlData = Lists.newArrayList();
+		if(!Strings.isNullOrEmpty(projectContentDataId)){
+			projectControlTable.setId(projectContentDataId);
+			controlData = projectControlTableDao.findListById(projectControlTable);
+            existRecord = controlData.get(0);
+		}else{
+			projectControlTable.setPfId(projectId);
+			controlData = projectControlTableDao.getControlData(projectControlTable);
+		}
+
+
+		boolean flag = false;
+		for (ProjectControlTable projectControlTables:controlData){
+			String tableId = projectControlTables.getId();
+			String s = projectControlTables.gettType();
+			//删除临时的表格控制数据
+			int i = projectControlTableDao.delete(projectControlTables);
+			if(i > 0) {
+				if ("06".equals(s)) {
+					//删除交接单数据
+					WorkHandBill workHandBill = new WorkHandBill();
+					workHandBill.setProjectId(tableId);
+					WorkHandBill listByProjectId = workHandBillDao.findListByProjectId(workHandBill);
+					int i1 = workHandBillDao.deleteByProId(workHandBill);
+					if(i1 > 0){
+						//交接单详情数据
+						WorkHandBillDetail workHandBillDetail = new WorkHandBillDetail();
+						workHandBillDetail.setBillId(listByProjectId.getId());
+						int i2 = workHandBillDetailDao.deleteByBillId(workHandBillDetail);
+						if(i2 >= 0){
+							flag = true;
+						}else {
+							break;
+						}
+					}else {
+						break;
+					}
+					List<Workattachment> listOfAttachment = workattachmentDao.getListOfAttachment(tableId, "93");
+					for (Workattachment workattachment:listOfAttachment){
+						workattachmentService.deleteFileFromAliyun(workattachment,workattachment.getUrl());
+					}
+				}else if("02".equals(s)){
+					//删除补充资料清单
+					WorkInfoList workInfoList = new WorkInfoList();
+					workInfoList.setProjectId(tableId);
+					int i3 = workInfoListDao.deleteByProId(workInfoList);
+					if(i3 > 0){
+						flag = true;
+					}else{
+						break;
+					}
+
+					List<Workattachment> listOfAttachment = workattachmentDao.getListOfAttachment(tableId, "89");
+					for (Workattachment workattachment:listOfAttachment){
+						workattachmentService.deleteFileFromAliyun(workattachment,workattachment.getUrl());
+					}
+				}else if("03".equals(s)){
+					//现场踏勘记录
+					WorkExplore workExplore = new WorkExplore();
+					workExplore.setProjectId(tableId);
+					int i4 = workExploreDao.deleteByProId(workExplore);
+					if(i4 > 0){
+						flag = true;
+					}else{
+						break;
+					}
+					List<Workattachment> listOfAttachment = workattachmentDao.getListOfAttachment(tableId, "90");
+					for (Workattachment workattachment:listOfAttachment){
+						workattachmentService.deleteFileFromAliyun(workattachment,workattachment.getUrl());
+					}
+				}else if("04".equals(s)){
+					//删除沟通记录表
+					WorkCommunicateRecord workCommunicateRecord = new WorkCommunicateRecord();
+					workCommunicateRecord.setProjectId(tableId);
+					WorkCommunicateRecord workRecord = workCommunicateRecordDao.findListByProId(workCommunicateRecord);
+					int i5 = workCommunicateRecordDao.deleteByProId(workCommunicateRecord);
+					if(i5 > 0){
+						WorkCommunicateContent workCommunicateContent = new WorkCommunicateContent();
+						workCommunicateContent.setCommunicateId(workRecord.getId());
+						int i2 = workCommunicateContentDao.deleteByProId(workCommunicateContent);
+						if(i2 >= 0){
+							flag = true;
+						}else {
+							break;
+						}
+					}else{
+						break;
+					}
+					List<Workattachment> listOfAttachment = workattachmentDao.getListOfAttachment(tableId, "91");
+					for (Workattachment workattachment:listOfAttachment){
+						workattachmentService.deleteFileFromAliyun(workattachment,workattachment.getUrl());
+					}
+				}else if("05".equals(s)){
+					//删除工程量计算底稿
+					boolean f = false;
+					boolean f1 = false;
+					WorkProjectCalcBuild workProjectCalcBuild = new WorkProjectCalcBuild();
+					workProjectCalcBuild.setProjectId(tableId);
+					int i6 = workProjectCalcBuildDao.deleteByProId(workProjectCalcBuild);
+					if(i6 >= 0){
+						f = true;
+					}else{
+						break;
+					}
+					WorkProjectCalcDecor workProjectCalcDecor = new WorkProjectCalcDecor();
+					workProjectCalcDecor.setProjectId(tableId);
+					int i7 = workProjectCalcDecorDao.deleteByProId(workProjectCalcDecor);
+					if(i7 >= 0){
+						f1 = true;
+					}else{
+						break;
+					}
+					List<Workattachment> listOfAttachment = workattachmentDao.getListOfAttachment(tableId, "92");
+					for (Workattachment workattachment:listOfAttachment){
+						workattachmentService.deleteFileFromAliyun(workattachment,workattachment.getUrl());
+					}
+					if(f && f1){
+						flag = true;
+					}
+				}else if("01".equals(s)){
+					//删除设备询价记录
+					WorkDeviceXjRecord workDeviceXjRecord = new WorkDeviceXjRecord();
+					workDeviceXjRecord.setProjectId(tableId);
+					WorkDeviceXjRecord listByXjId = workDeviceXjRecordDao.findListByXjId(workDeviceXjRecord);
+					int i8 = workDeviceXjRecordDao.deleteByProId(workDeviceXjRecord);
+					if(i8 > 0){
+						WorkDeviceRecord workDeviceRecord = new WorkDeviceRecord();
+						workDeviceRecord.setDeviceXjId(listByXjId.getId());
+						int i2 = workDeviceRecordDao.deleteByProId(workDeviceRecord);
+						if(i2 >= 0){
+							flag = true;
+						}else {
+							break;
+						}
+					}else{
+						break;
+					}
+					List<Workattachment> listOfAttachment = workattachmentDao.getListOfAttachment(tableId, "88");
+					for (Workattachment workattachment:listOfAttachment){
+						workattachmentService.deleteFileFromAliyun(workattachment,workattachment.getUrl());
+					}
+				}else if("07".equals(s)){
+					//日志
+					WorkLog workLog = new WorkLog();
+					workLog.setProjectId(tableId);
+					int i4 = workLogDao.deleteByProId(workLog);
+					if(i4 > 0){
+						flag = true;
+					}else{
+						break;
+					}
+					List<Workattachment> listOfAttachment = workattachmentDao.getListOfAttachment(tableId, "93");
+					for (Workattachment workattachment:listOfAttachment){
+						workattachmentService.deleteFileFromAliyun(workattachment,workattachment.getUrl());
+					}
+				}else if("08".equals(s)){
+					//会议
+					WorkMeeting workMeeting = new WorkMeeting();
+					workMeeting.setProjectId(tableId);
+					int i4 = workMeetingDao.deleteByProId(workMeeting);
+					if(i4 > 0){
+						flag = true;
+					}else{
+						break;
+					}
+					List<Workattachment> listOfAttachment = workattachmentDao.getListOfAttachment(tableId, "93");
+					for (Workattachment workattachment:listOfAttachment){
+						workattachmentService.deleteFileFromAliyun(workattachment,workattachment.getUrl());
+					}
+				}
+			}
+
+		}
+		if(existRecord!=null){
+		    this.deleteCtrlMenu(existRecord);
+        }
+		return flag;
+	}
+
+    public ProjectControlTable getById(String infoId) {
+        ProjectControlTable projectControlTable = this.get(infoId);
+        if(projectControlTable!=null) {
+            projectControlTable.setWorkAttachments(workattachmentService.getListByAttachmentIdAndFlag(infoId, ""));
+        }
+        return projectControlTable;
+    }
+
+    private void deleteCtrlMenu(ProjectControlTable controlTable){
+        //删除菜单
+        Projectcontentinfo parent = projectcontentinfoDao.getByInfoId(controlTable.getPfId());
+        if(parent==null)return;
+        Projectcontentinfo select2 = new Projectcontentinfo();
+        select2.setParent(parent);
+        select2.setProject(parent.getProject());
+        select2.setName(controlTable.getProcessName());
+        List<Projectcontentinfo> infos = projectcontentinfoDao.findListByParentSelective(select2);
+        Projectcontentinfo projectcontentinfo = infos.get(0);
+        select2.setParent(projectcontentinfo);
+        select2.setName(null);
+        select2.setInfoId(controlTable.getId());
+        //删除当前菜单
+        projectcontentinfoDao.deleteByParentAndLinkId(select2);
+        //是否删除父级菜单
+        select2.setInfoId(null);
+        List<Projectcontentinfo> sonList = projectcontentinfoDao.findListByParentSelective(select2);
+        if(sonList==null || sonList.isEmpty()){
+            projectcontentinfoDao.delete(projectcontentinfo);
+        }
+    }
+
+    public String getDetailInfo(ProjectControlTable projectControlTable) {
+	    if(projectControlTable==null){
+	        return null;
+        }
+        String s = projectControlTable.gettType();
+        String flag = "";
+        if ("06".equals(s)) {
+            WorkHandBill workHandBill = new WorkHandBill();
+            workHandBill.setProjectId(projectControlTable.getId());
+            workHandBill = workHandBillService.findListByProjectId(workHandBill);
+            WorkHandBillDetail workHandBillDetail = new WorkHandBillDetail();
+            workHandBillDetail.setBillId(workHandBill.getId());
+            List<WorkHandBillDetail> listByBillId = workHandBillDetailService.findListByBillId(workHandBillDetail);
+            workHandBill.setWorkHandBillDetailList(listByBillId);
+            projectControlTable.setWorkHandBill(workHandBill);
+            flag = "93";
+        } else if ("02".equals(s)) {
+            WorkInfoList workInfoList = new WorkInfoList();
+            workInfoList.setProjectId(projectControlTable.getId());
+            WorkInfoList listByProId = workInfoListService.findListByProId(workInfoList);
+            projectControlTable.setWorkInfoList(listByProId);
+            flag = "89";
+        } else if ("03".equals(s)) {
+            WorkExplore workExplore = new WorkExplore();
+            workExplore.setProjectId(projectControlTable.getId());
+            WorkExplore listByProId = workExploreService.findListByProId(workExplore);
+            projectControlTable.setWorkExplore(listByProId);
+            flag = "90";
+        } else if ("04".equals(s)) {
+            WorkCommunicateRecord workCommunicateRecord = new WorkCommunicateRecord();
+            workCommunicateRecord.setProjectId(projectControlTable.getId());
+            workCommunicateRecord = workCommunicateRecordService.findListByProId(workCommunicateRecord);
+            WorkCommunicateContent workCommunicateContent = new WorkCommunicateContent();
+            workCommunicateContent.setCommunicateId(workCommunicateRecord.getId());
+            List<WorkCommunicateContent> listByCommunicateId = workCommunicateContentService.findListByCommunicateId(workCommunicateContent);
+            workCommunicateRecord.setWorkCommunicateContentList(listByCommunicateId);
+            projectControlTable.setWorkCommunicateRecord(workCommunicateRecord);
+            flag = "91";
+        } else if ("05".equals(s)) {
+            WorkProjectCalcBuild workProjectCalcBuild = new WorkProjectCalcBuild();
+            workProjectCalcBuild.setProjectId(projectControlTable.getId());
+            List<WorkProjectCalcBuild> list1 = workProjectCalcBuildService.findList(workProjectCalcBuild);
+            projectControlTable.setWorkProjectCalcBuildList(list1);
+            WorkProjectCalcDecor workProjectCalcDecor = new WorkProjectCalcDecor();
+            workProjectCalcDecor.setProjectId(projectControlTable.getId());
+            List<WorkProjectCalcDecor> list = workProjectCalcDecorService.findList(workProjectCalcDecor);
+            projectControlTable.setWorkProjectCalcDecorList(list);
+            flag = "92";
+        } else if ("01".equals(s)) {
+            WorkDeviceXjRecord workDeviceXjRecord = new WorkDeviceXjRecord();
+            workDeviceXjRecord.setProjectId(projectControlTable.getId());
+            workDeviceXjRecord = workDeviceXjRecordService.findListByXjId(workDeviceXjRecord);
+            WorkDeviceRecord workDeviceRecord = new WorkDeviceRecord();
+            workDeviceRecord.setDeviceXjId(workDeviceXjRecord.getId());
+            List<WorkDeviceRecord> listByXjId1 = workDeviceRecordService.findListByXjId(workDeviceRecord);
+            workDeviceXjRecord.setWorkDeviceRecordList(listByXjId1);
+            projectControlTable.setWorkDeviceXjRecord(workDeviceXjRecord);
+            flag = "88";
+        }else if ("07".equals(s)) {
+			WorkLog workLog = new WorkLog();
+			workLog.setProjectId(projectControlTable.getId());
+			WorkLog listByProId = workLogDao.findListByProId(workLog);
+			projectControlTable.setWorkLog(listByProId);
+			flag = "93";
+		}else if("08".equals(s)){
+			WorkMeeting workMeeting = new WorkMeeting();
+			workMeeting.setProjectId(projectControlTable.getId());
+			WorkMeeting listByProId = workMeetingDao.findListByProId(workMeeting);
+			projectControlTable.setWorkMeeting(listByProId);
+			flag = "93";
+
+		}
+		return flag;
+    }
+}

+ 286 - 0
src/main/java/com/jeeplus/modules/projectcontroltable/web/ProjectControlTableController.java

@@ -0,0 +1,286 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.projectcontroltable.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.projectcontentinfo.entity.ProjectContentData;
+import com.jeeplus.modules.projectcontroltable.entity.ProjectControlTable;
+import com.jeeplus.modules.projectcontroltable.service.ProjectControlTableService;
+import com.jeeplus.modules.projectrecord.entity.ProjectRecords;
+import com.jeeplus.modules.projectrecord.service.ProjectRecordsService;
+import com.jeeplus.modules.sys.entity.Area;
+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.workcommunicaterecord.entity.WorkCommunicateContent;
+import com.jeeplus.modules.workcommunicaterecord.entity.WorkCommunicateRecord;
+import com.jeeplus.modules.workcommunicaterecord.service.WorkCommunicateContentService;
+import com.jeeplus.modules.workcommunicaterecord.service.WorkCommunicateRecordService;
+import com.jeeplus.modules.workdevicerecord.entity.WorkDeviceRecord;
+import com.jeeplus.modules.workdevicerecord.entity.WorkDeviceXjRecord;
+import com.jeeplus.modules.workdevicerecord.service.WorkDeviceRecordService;
+import com.jeeplus.modules.workdevicerecord.service.WorkDeviceXjRecordService;
+import com.jeeplus.modules.workexplore.entity.WorkExplore;
+import com.jeeplus.modules.workexplore.service.WorkExploreService;
+import com.jeeplus.modules.workhandbill.entity.WorkHandBill;
+import com.jeeplus.modules.workhandbill.entity.WorkHandBillDetail;
+import com.jeeplus.modules.workhandbill.service.WorkHandBillDetailService;
+import com.jeeplus.modules.workhandbill.service.WorkHandBillService;
+import com.jeeplus.modules.workinfolist.entity.WorkInfoList;
+import com.jeeplus.modules.workinfolist.service.WorkInfoListService;
+import com.jeeplus.modules.workprojectcalc.entity.WorkProjectCalcBuild;
+import com.jeeplus.modules.workprojectcalc.entity.WorkProjectCalcDecor;
+import com.jeeplus.modules.workprojectcalc.service.WorkProjectCalcBuildService;
+import com.jeeplus.modules.workprojectcalc.service.WorkProjectCalcDecorService;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.ConstraintViolationException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 过程控制表Controller
+ * @author 马鹏波
+ * @version 2018-06-08
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/projectcontroltable/projectControlTable")
+public class ProjectControlTableController extends BaseController {
+
+	@Autowired
+	private ProjectControlTableService projectControlTableService;
+	@Autowired
+	private WorkattachmentService workattachmentService;
+	@Autowired
+	private ProjectRecordsService projectRecordsService;
+
+	@ModelAttribute
+	public ProjectControlTable get(@RequestParam(required=false) String id) {
+		ProjectControlTable entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = projectControlTableService.get(id);
+		}
+		if (entity == null){
+			entity = new ProjectControlTable();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 过程控制表列表页面
+	 */
+//	@RequiresPermissions("projectcontroltable:projectControlTable:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(ProjectControlTable projectControlTable, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<ProjectControlTable> page = projectControlTableService.findPage(new Page<ProjectControlTable>(request, response), projectControlTable); 
+		model.addAttribute("page", page);
+		return "modules/projectcontroltable/projectControlTableList";
+	}
+
+	/**
+	 * 查看,增加,编辑过程控制表表单页面
+	 */
+//	@RequiresPermissions(value={"projectcontroltable:projectControlTable:view","projectcontroltable:projectControlTable:add","projectcontroltable:projectControlTable:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(ProjectControlTable projectControlTable, HttpServletRequest request,Model model) {
+		String view = request.getParameter("view");
+		if("view".equals(view)){
+			view = "modules/projectcontroltable/projectControlTableFormView";
+		}else{
+			view = "modules/projectcontroltable/projectControlTableForm";
+			if(projectControlTable.getPfId()!= null){
+				ProjectRecords projectRecords = projectRecordsService.get(projectControlTable.getPfId());
+				Area area = projectRecords.getArea();
+				String city = projectRecords.getCity();
+				model.addAttribute("city",city);
+				model.addAttribute("area", area);
+			}
+		}
+		if(!projectControlTable.getIsNewRecord()){
+            String flag = projectControlTableService.getDetailInfo(projectControlTable);
+			List<Workattachment> listByAttachmentIdAndFlag = workattachmentService.getListByAttachmentIdAndFlag(projectControlTable.getId(), flag);
+			projectControlTable.setWorkAttachments(listByAttachmentIdAndFlag);
+		}
+
+		model.addAttribute("projectControlTable", projectControlTable);
+		return view;
+	}
+
+	/**
+	 * 保存过程控制表
+	 */
+//	@RequiresPermissions(value={"projectcontroltable:projectControlTable:add","projectcontroltable:projectControlTable:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	@ResponseBody
+	public String save(ProjectControlTable projectControlTable, HttpServletRequest request,Model model, RedirectAttributes redirectAttributes) throws Exception{
+		if (!beanValidator(model, projectControlTable)){
+			return form(projectControlTable, request,model);
+		}
+		if(!projectControlTable.getIsNewRecord()){//编辑表单保存
+			ProjectControlTable t = projectControlTableService.get(projectControlTable.getId());//从数据库取出记录的值
+			MyBeanUtils.copyBeanNotNull2Bean(projectControlTable, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+			projectControlTableService.save(t);//保存
+		}else{//新增表单保存
+			String id = UserUtils.getSelectCompany().getId();
+			String userId = UserUtils.getUser().getId(); //当前登陆人
+			String projectId = id + userId + projectControlTable.getPfId();	//项目编号
+			projectControlTable.setPfId(projectId);
+			projectControlTableService.save(projectControlTable);//保存
+		}
+		addMessage(redirectAttributes, "保存过程控制表成功");
+		return projectControlTable.getId();
+	}
+	
+	/**
+	 * 删除过程控制表
+	 */
+//	@RequiresPermissions("projectcontroltable:projectControlTable:del")
+	@RequestMapping(value = "delete")
+	public String delete(ProjectControlTable projectControlTable, RedirectAttributes redirectAttributes) {
+		projectControlTableService.delete(projectControlTable);
+		addMessage(redirectAttributes, "删除过程控制表成功");
+		return "redirect:"+Global.getAdminPath()+"/projectcontroltable/projectControlTable/?repage";
+	}
+	
+	/**
+	 * 批量删除过程控制表
+	 */
+//	@RequiresPermissions("projectcontroltable:projectControlTable:del")
+	@RequestMapping(value = "deleteAll")
+	public String deleteAll(String ids, RedirectAttributes redirectAttributes) {
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			projectControlTableService.delete(projectControlTableService.get(id));
+		}
+		addMessage(redirectAttributes, "删除过程控制表成功");
+		return "redirect:"+Global.getAdminPath()+"/projectcontroltable/projectControlTable/?repage";
+	}
+	
+	/**
+	 * 导出excel文件
+	 */
+	@RequiresPermissions("projectcontroltable:projectControlTable:export")
+    @RequestMapping(value = "export", method=RequestMethod.POST)
+    public String exportFile(ProjectControlTable projectControlTable, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "过程控制表"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            Page<ProjectControlTable> page = projectControlTableService.findPage(new Page<ProjectControlTable>(request, response, -1), projectControlTable);
+    		new ExportExcel("过程控制表", ProjectControlTable.class).setDataList(page.getList()).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导出过程控制表记录失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/projectcontroltable/projectControlTable/?repage";
+    }
+
+	/**
+	 * 导入Excel数据
+
+	 */
+	@RequiresPermissions("projectcontroltable:projectControlTable: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<ProjectControlTable> list = ei.getDataList(ProjectControlTable.class);
+			for (ProjectControlTable projectControlTable : list){
+				try{
+					projectControlTableService.save(projectControlTable);
+					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()+"/projectcontroltable/projectControlTable/?repage";
+    }
+	
+	/**
+	 * 下载导入过程控制表数据模板
+	 */
+	@RequiresPermissions("projectcontroltable:projectControlTable:import")
+    @RequestMapping(value = "import/template")
+    public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "过程控制表数据导入模板.xlsx";
+    		List<ProjectControlTable> list = Lists.newArrayList(); 
+    		new ExportExcel("过程控制表数据", ProjectControlTable.class, 1).setDataList(list).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入模板下载失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/projectcontroltable/projectControlTable/?repage";
+    }
+
+    @RequestMapping("getControlData")
+    @ResponseBody
+	public Map<Object,Object> getControlData(HttpServletRequest request){
+		Map<Object,Object> map = new HashMap<>();
+		String projectId = request.getParameter("projectId");
+		String projectContentId = request.getParameter("proId");
+		String id = UserUtils.getSelectCompany().getId();
+		String userId = UserUtils.getUser().getId();
+		projectId = id+userId+projectId;
+		List<ProjectControlTable> controlData = projectControlTableService.getControlData(projectId,projectContentId);
+		ProjectContentData projectContentData = new ProjectContentData();
+		projectContentData.setProjectControlTableList(controlData);
+		map.put("list",projectContentData);
+		return map;
+	}
+
+
+	/**
+	 * 删除所有数据
+	 * @param request
+	 * @return
+	 */
+	@RequestMapping("delControlData")
+	@ResponseBody
+	public Map<Object,Object> delControlData(HttpServletRequest request){
+		Map<Object,Object> map = new HashMap<>();
+		String projectId = request.getParameter("projectId");
+		String flag = request.getParameter("flag");
+		String projectContentId = request.getParameter("projectContentId");
+		String id = UserUtils.getSelectCompany().getId();
+		String userId = UserUtils.getUser().getId();
+		projectId = id+userId+projectId;
+		//点击删除 ,不是初始化删除时
+		boolean b = false;
+		if(!"del".equals(flag)){
+			b = projectControlTableService.deleteAllData(projectId,"");
+		}else{
+			b = projectControlTableService.deleteAllData(projectId,projectContentId);
+		}
+		map.put("flag",b);
+		return map;
+	}
+}

+ 24 - 0
src/main/java/com/jeeplus/modules/projectrecord/dao/ProjectClientLinkmanDao.java

@@ -0,0 +1,24 @@
+package com.jeeplus.modules.projectrecord.dao;
+
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.workclientinfo.entity.WorkClientLinkman;
+import com.jeeplus.modules.workprequalification.entity.WorkProjectLinkman;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+@MyBatisDao
+public interface ProjectClientLinkmanDao {
+
+    public void batchInsert(Map map);
+
+    public void deleteProjectLinkmans(@Param("projectId") String projectId,@Param("isEntrust")int isEntrust);
+
+    /**
+     * 根据姓名和委托方(office)查询联系人详细信息
+     * @param workClientLinkman
+     * @return
+     */
+    public WorkClientLinkman getLinkManByNameAndOffice(WorkClientLinkman workClientLinkman);
+}

+ 24 - 0
src/main/java/com/jeeplus/modules/projectrecord/dao/ProjectRecordsAlterDao.java

@@ -0,0 +1,24 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.projectrecord.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.projectrecord.entity.ProjectRecords;
+import com.jeeplus.modules.projectrecord.entity.ProjectRecordsAlter;
+
+/**
+ * 项目登记DAO接口
+ * @author ppt
+ * @version 2018-05-02
+ */
+@MyBatisDao
+public interface ProjectRecordsAlterDao extends CrudDao<ProjectRecordsAlter> {
+
+    void updateProcessIdAndStatus(ProjectRecordsAlter projectRecords);
+
+    void updateSelectiveById(ProjectRecordsAlter projectRecords);
+
+    int countAlter(String projectId);
+}

+ 33 - 0
src/main/java/com/jeeplus/modules/projectrecord/dao/ProjectRecordsDao.java

@@ -0,0 +1,33 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.projectrecord.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.projectrecord.entity.ProjectRecords;
+
+import java.util.List;
+
+/**
+ * 项目登记DAO接口
+ * @author ppt
+ * @version 2018-05-02
+ */
+@MyBatisDao
+public interface ProjectRecordsDao extends CrudDao<ProjectRecords> {
+
+
+    void updateProcessIdAndStatus(ProjectRecords projectRecords);
+
+    void updateSelectiveById(ProjectRecords projectRecords);
+
+    List<ProjectRecords> findListByStatus(ProjectRecords projectRecords);
+
+    void updateSelectiveByProjectId(ProjectRecords records);
+
+    ProjectRecords findUseableByProjectId(String projectId);
+    List<ProjectRecords> findPageByRe(ProjectRecords records);
+    int queryCount(ProjectRecords records);
+    int queryCountByStatus(ProjectRecords records);
+}

+ 30 - 0
src/main/java/com/jeeplus/modules/projectrecord/dao/WorkProjectUserDao.java

@@ -0,0 +1,30 @@
+package com.jeeplus.modules.projectrecord.dao;
+
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.projectrecord.entity.ProjectRecords;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.workstaff.entity.WorkStaffBasicInfo;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@MyBatisDao
+public interface WorkProjectUserDao {
+
+    public void batchInsert(Map map);
+
+    public void deleteProjectMembers(@Param("projectId") String projectId, @Param("isMaster")String isMaster );
+    public List<User> isDelFalg(@Param("projectId") String projectId, @Param("delFlag")String delFlag );
+    public int insertUsers(ProjectRecords records);
+    public int deleteUsers(ProjectRecords records);
+
+    List<User> queryProjectUsers(@Param("projectId")String projectId, @Param("isMaster")String isMaster);
+    List<User> projectUsers(@Param("projectId")String projectId);
+    List<User> queryAllProjectUsers(@Param("projectId")String projectId);
+    void deleteProjectMasterMembers(HashMap<String, Object> map);
+
+    int reInsertUser(ProjectRecords projectRecords);
+//    int reInsertUser(@Param("projectId")String projectId,@Param("userId")String userId);
+}

+ 572 - 0
src/main/java/com/jeeplus/modules/projectrecord/entity/ProjectRecords.java

@@ -0,0 +1,572 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.projectrecord.entity;
+
+import com.google.common.collect.Lists;
+import com.jeeplus.common.persistence.ActEntity;
+import com.jeeplus.modules.projectcontentinfo.entity.ProjectReportData;
+import com.jeeplus.modules.sys.entity.Area;
+
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+import com.jeeplus.modules.sys.entity.Office;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.workclientinfo.entity.WorkClientAttachment;
+import com.jeeplus.modules.workclientinfo.entity.WorkClientLinkman;
+import com.jeeplus.modules.workcontractinfo.entity.WorkContractInfo;
+import org.hibernate.validator.constraints.NotBlank;
+
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 项目登记Entity
+ * @author ppt
+ * @version 2018-05-02
+ */
+public class ProjectRecords extends ActEntity<ProjectRecords> {
+
+	public static final String SERIAL_BIZCODE ="1";
+	private static final long serialVersionUID = 1L;
+	@NotNull(message = "合同信息不能为空")
+	private WorkContractInfo workContractInfo;		// 合同id
+	private String projectId;		// 项目编号
+	@NotBlank(message = "项目名称不能为空")
+	private String projectName;		// 项目名称
+	private String scaleType;		// 规模类型
+	private String scaleUnit;		// 规模单位
+	private Double scaleQuantity;		// 规模数量
+	private Area area;		// 项目所在地
+	private String projectSite;		// 建设地点
+	private String province;  //项目所在省
+	private String city;  //项目所在市
+	private String county;//项目所在区
+	private String projectStructure;   //工程结构
+	private String onGroundNum;    //地上层数
+	private String underGroundNum;    //地下层数
+	private String buildingScale;    //建筑规模
+	private String measuringUnit;     //规模单位
+	private String projectUse;        //工程用途
+	private Double installFees;      //安装造价
+	private Double buildingFees;      //土建造价
+	private Double buildingPercent;    //土建百分比
+	private Double installPercent;     //安装百分比
+	private Double unitFees;     //单位造价
+	private Double buildingUnitFees;  //土建单位造价
+	private Double installUnitFees;    //安装单位造价
+	private Double totalFees;        //总合同额
+
+	private ProjectReportData reportData;//报告
+
+	public ProjectReportData getReportData() {
+		return reportData;
+	}
+
+	public void setReportData(ProjectReportData reportData) {
+		this.reportData = reportData;
+	}
+
+	@NotNull(message = "委托方联系人不能为空")
+	private List<WorkClientLinkman> workClientLinkmanList;		// 委托方联系人
+	private List<WorkClientLinkman> workConstructionLinkmanList;		// 施工方及联系人
+	@NotBlank(message = "工程概况不能为空")
+	private String projectDesc;		// 工程概况
+	@NotNull(message = "项目负责人不能为空")
+	private List<User> projectLeaders; //项目负责人
+
+	private List<User> projectMembers;  //项目组成员
+
+	private String leaderNameStr;
+	private String leaderIds;
+	private String memberNameStr;
+	private String memberIds;
+
+	private String processInstanceId;
+
+	private Office company;
+	private Office office;
+	private Integer projectStatus;//项目状态
+
+	private String auditType;
+
+	private String alterProcessId;
+	private String userIds;
+	private String delUserIds;
+	private List<User> users;
+	private String userId;
+
+	private String home;
+	private Date beginDate;
+	private Date endDate;
+	private int membercount;
+	private List<WorkClientAttachment> workAttachments = Lists.newArrayList();
+
+	private List<ProjectReportData> projectReportData = Lists.newArrayList();
+
+	public ProjectRecords() {
+		super();
+	}
+
+	public ProjectRecords(String id){
+		super(id);
+	}
+
+	public WorkContractInfo getWorkContractInfo() {
+		return workContractInfo;
+	}
+
+	public void setWorkContractInfo(WorkContractInfo contract) {
+		this.workContractInfo = contract;
+	}
+	
+	@ExcelField(title="项目编号", align=2, sort=1)
+	public String getProjectId() {
+		return projectId;
+	}
+
+	public void setProjectId(String projectId) {
+		this.projectId = projectId;
+	}
+	
+	@ExcelField(title="项目名称", align=2, sort=2)
+	public String getProjectName() {
+		return projectName;
+	}
+
+	public void setProjectName(String projectName) {
+		this.projectName = projectName;
+	}
+	
+	@ExcelField(title="规模类型", align=2, sort=9)
+	public String getScaleType() {
+		return scaleType;
+	}
+
+	public void setScaleType(String scaleType) {
+		this.scaleType = scaleType;
+	}
+	
+	@ExcelField(title="规模单位", align=2, sort=10)
+	public String getScaleUnit() {
+		return scaleUnit;
+	}
+
+	public void setScaleUnit(String scaleUnit) {
+		this.scaleUnit = scaleUnit;
+	}
+	
+	@ExcelField(title="规模数量", align=2, sort=11)
+	public Double getScaleQuantity() {
+		return scaleQuantity;
+	}
+
+	public void setScaleQuantity(Double scaleQuantity) {
+		this.scaleQuantity = scaleQuantity;
+	}
+	
+	@ExcelField(title="项目所在地", align=2, sort=12)
+	public Area getArea() {
+		return area;
+	}
+
+	public void setArea(Area area) {
+		this.area = area;
+	}
+	
+	@ExcelField(title="建设地点", align=2, sort=13)
+	public String getProjectSite() {
+		return projectSite;
+	}
+
+	public void setProjectSite(String projectSite) {
+		this.projectSite = projectSite;
+	}
+
+	public List<WorkClientLinkman> getWorkClientLinkmanList() {
+		return workClientLinkmanList;
+	}
+
+	public void setWorkClientLinkmanList(List<WorkClientLinkman> workClientLinkmanList) {
+		this.workClientLinkmanList = workClientLinkmanList;
+	}
+
+	@ExcelField(title="工程概况", align=2, sort=16)
+	public String getProjectDesc() {
+		return projectDesc;
+	}
+	@ExcelField(title="特殊要求", align=2, sort=17)
+	public String getRemarks() {
+		return remarks;
+	}
+	@ExcelField(title="创建日期", align=2, sort=18)
+	public Date getCreateDate() {
+		return createDate;
+	}
+
+	public void setProjectDesc(String projectDesc) {
+		this.projectDesc = projectDesc;
+	}
+
+	public List<User> getProjectLeaders() {
+		return projectLeaders;
+	}
+
+	public void setProjectLeaders(List<User> projectLeaders) {
+		this.projectLeaders = projectLeaders;
+	}
+
+	public List<User> getProjectMembers() {
+		return projectMembers;
+	}
+
+	public void setProjectMembers(List<User> projectMembers) {
+		this.projectMembers = projectMembers;
+	}
+
+	public List<WorkClientLinkman> getWorkConstructionLinkmanList() {
+		return workConstructionLinkmanList;
+	}
+
+	public void setWorkConstructionLinkmanList(List<WorkClientLinkman> workConstructionLinkmanList) {
+		this.workConstructionLinkmanList = workConstructionLinkmanList;
+	}
+
+    @ExcelField(title="项目状态", align=2, sort=19,dictType = "audit_state")
+	public Integer getProjectStatus() {
+		return projectStatus;
+	}
+
+	public void setProjectStatus(Integer projectStatus) {
+		this.projectStatus = projectStatus;
+	}
+
+	@ExcelField(title="负责人", align=2, sort=8)
+	public String getLeaderNameStr() {
+		return leaderNameStr;
+	}
+
+	public void setLeaderNameStr(String leaderNameStr) {
+		this.leaderNameStr = leaderNameStr;
+	}
+
+	public String getMemberNameStr() {
+		return memberNameStr;
+	}
+
+	public void setMemberNameStr(String memberNameStr) {
+		this.memberNameStr = memberNameStr;
+	}
+
+	public String getLeaderIds() {
+		return leaderIds;
+	}
+
+	public void setLeaderIds(String leaderIds) {
+		this.leaderIds = leaderIds;
+	}
+
+	public String getMemberIds() {
+		return memberIds;
+	}
+
+	public void setMemberIds(String memberIds) {
+		this.memberIds = memberIds;
+	}
+
+	public String getProcessInstanceId() {
+		return processInstanceId;
+	}
+
+	public void setProcessInstanceId(String processInstanceId) {
+		this.processInstanceId = processInstanceId;
+	}
+
+	public String getAuditType() {
+		return auditType;
+	}
+
+	public void setAuditType(String auditType) {
+		this.auditType = auditType;
+	}
+
+	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 getAlterProcessId() {
+		return alterProcessId;
+	}
+
+	public void setAlterProcessId(String alterProcessId) {
+		this.alterProcessId = alterProcessId;
+	}
+
+	public List<WorkClientAttachment> getWorkAttachments() {
+		return workAttachments;
+	}
+
+	public void setWorkAttachments(List<WorkClientAttachment> workAttachments) {
+		this.workAttachments = workAttachments;
+	}
+
+	public String getUserIds() {
+		return userIds;
+	}
+
+	public void setUserIds(String userIds) {
+		this.userIds = userIds;
+	}
+
+	public String getDelUserIds() {
+		return delUserIds;
+	}
+
+	public void setDelUserIds(String delUserIds) {
+		this.delUserIds = delUserIds;
+	}
+
+	public List<User> getUsers() {
+		return users;
+	}
+
+	public void setUsers(List<User> users) {
+		this.users = users;
+	}
+
+	public String getUserId() {
+		return userId;
+	}
+
+	public void setUserId(String userId) {
+		this.userId = userId;
+	}
+	@ExcelField(title="合同名称", align=2, sort=4)
+	public String getContractName() {
+		if (workContractInfo!=null) {
+			return workContractInfo.getName();
+		}else {
+			return "";
+		}
+	}
+	@ExcelField(title="合同编号", align=2, sort=3)
+	public String getContractNumber() {
+		if (workContractInfo!=null) {
+			return workContractInfo.getContractNum();
+		}else {
+			return "";
+		}
+	}
+	@ExcelField(title="合同金额", align=2, sort=5)
+	public String getContractPrice() {
+		if (workContractInfo!=null) {
+			return workContractInfo.getContractPrice();
+		}else {
+			return "";
+		}
+	}
+	@ExcelField(title="工程分类", align=2, sort=7)
+	public String getContractType() {
+		if (workContractInfo!=null) {
+			return workContractInfo.getConstructionProjectTypeStr();
+		}else {
+			return "";
+		}
+	}
+	@ExcelField(title="主委托方", align=2, sort=6)
+	public String getClientName() {
+		if (workContractInfo!=null && workContractInfo.getClient()!=null){
+			return workContractInfo.getClient().getName();
+		}else {
+			return "";
+		}
+	}
+
+    public String getHome() {
+        return home;
+    }
+
+    public void setHome(String home) {
+        this.home = home;
+    }
+
+    public Date getBeginDate() {
+        return beginDate;
+    }
+
+    public void setBeginDate(Date beginDate) {
+        this.beginDate = beginDate;
+    }
+
+    public Date getEndDate() {
+        return endDate;
+    }
+
+    public void setEndDate(Date endDate) {
+        this.endDate = endDate;
+    }
+
+	public int getMembercount() {
+		return membercount;
+	}
+
+	public void setMembercount(int membercount) {
+		this.membercount = membercount;
+	}
+
+	public String getProvince() {
+		return province;
+	}
+
+	public void setProvince(String province) {
+		this.province = province;
+	}
+
+	public String getCity() {
+		return city;
+	}
+
+	public void setCity(String city) {
+		this.city = city;
+	}
+
+	public String getCounty() {
+		return county;
+	}
+
+	public void setCounty(String county) {
+		this.county = county;
+	}
+
+	public String getProjectStructure() {
+		return projectStructure;
+	}
+
+	public void setProjectStructure(String projectStructure) {
+		this.projectStructure = projectStructure;
+	}
+
+	public String getOnGroundNum() {
+		return onGroundNum;
+	}
+
+	public void setOnGroundNum(String onGroundNum) {
+		this.onGroundNum = onGroundNum;
+	}
+
+	public String getUnderGroundNum() {
+		return underGroundNum;
+	}
+
+	public void setUnderGroundNum(String underGroundNum) {
+		this.underGroundNum = underGroundNum;
+	}
+
+	public String getBuildingScale() {
+		return buildingScale;
+	}
+
+	public void setBuildingScale(String buildingScale) {
+		this.buildingScale = buildingScale;
+	}
+
+	public String getMeasuringUnit() {
+		return measuringUnit;
+	}
+
+	public void setMeasuringUnit(String measuringUnit) {
+		this.measuringUnit = measuringUnit;
+	}
+
+	public String getProjectUse() {
+		return projectUse;
+	}
+
+	public void setProjectUse(String projectUse) {
+		this.projectUse = projectUse;
+	}
+
+	public Double getInstallFees() {
+		return installFees;
+	}
+
+	public void setInstallFees(Double installFees) {
+		this.installFees = installFees;
+	}
+
+	public Double getBuildingFees() {
+		return buildingFees;
+	}
+
+	public void setBuildingFees(Double buildingFees) {
+		this.buildingFees = buildingFees;
+	}
+
+	public Double getBuildingPercent() {
+		return buildingPercent;
+	}
+
+	public void setBuildingPercent(Double buildingPercent) {
+		this.buildingPercent = buildingPercent;
+	}
+
+	public Double getInstallPercent() {
+		return installPercent;
+	}
+
+	public void setInstallPercent(Double installPercent) {
+		this.installPercent = installPercent;
+	}
+
+	public Double getUnitFees() {
+		return unitFees;
+	}
+
+	public void setUnitFees(Double unitFees) {
+		this.unitFees = unitFees;
+	}
+
+	public Double getBuildingUnitFees() {
+		return buildingUnitFees;
+	}
+
+	public void setBuildingUnitFees(Double buildingUnitFees) {
+		this.buildingUnitFees = buildingUnitFees;
+	}
+
+	public Double getInstallUnitFees() {
+		return installUnitFees;
+	}
+
+	public void setInstallUnitFees(Double installUnitFees) {
+		this.installUnitFees = installUnitFees;
+	}
+
+	public Double getTotalFees() {
+		return totalFees;
+	}
+
+	public void setTotalFees(Double totalFees) {
+		this.totalFees = totalFees;
+	}
+
+	public List<ProjectReportData> getProjectReportData() {
+		return projectReportData;
+	}
+
+	public void setProjectReportData(List<ProjectReportData> projectReportData) {
+		this.projectReportData = projectReportData;
+	}
+}

+ 518 - 0
src/main/java/com/jeeplus/modules/projectrecord/entity/ProjectRecordsAlter.java

@@ -0,0 +1,518 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.projectrecord.entity;
+
+import com.google.common.collect.Lists;
+import com.jeeplus.common.persistence.ActEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+import com.jeeplus.modules.sys.entity.Area;
+import com.jeeplus.modules.sys.entity.Office;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.workclientinfo.entity.WorkClientAttachment;
+import com.jeeplus.modules.workclientinfo.entity.WorkClientLinkman;
+import com.jeeplus.modules.workcontractinfo.entity.WorkContractInfo;
+import org.hibernate.validator.constraints.NotBlank;
+
+import javax.validation.constraints.NotNull;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+import java.util.UUID;
+
+/**
+ * 项目登记Entity
+ * @author ppt
+ * @version 2018-05-02
+ */
+public class ProjectRecordsAlter extends ActEntity<ProjectRecordsAlter> {
+
+	private static final long serialVersionUID = 1L;
+	@NotNull(message = "合同信息不能为空")
+	private WorkContractInfo workContractInfo;		// 合同id
+	private String projectId;		// 项目编号
+	@NotBlank(message = "项目名称不能为空")
+	private String projectName;		// 项目名称
+	private String scaleType;		// 规模类型
+	private String scaleUnit;		// 规模单位
+	private Double scaleQuantity;		// 规模数量
+	private Area area;		// 项目所在地
+	private String projectSite;		// 建设地点
+	private String province;  //项目所在省
+	private String city;  //项目所在市
+	private String county;//项目所在区
+	private String projectStructure;   //工程结构
+	private String onGroundNum;    //地上层数
+	private String underGroundNum;    //地下层数
+	private String buildingScale;    //建筑规模
+	private String measuringUnit;     //规模单位
+	private String projectUse;        //工程用途
+	private Double installFees;      //安装造价
+	private Double buildingFees;      //土建造价
+	private Double buildingPercent;    //土建百分比
+	private Double installPercent;     //安装百分比
+	private Double unitFees;     //单位造价
+	private Double buildingUnitFees;  //土建单位造价
+	private Double installUnitFees;    //安装单位造价
+	private Double totalFees;        //总合同额
+
+	@NotNull(message = "委托方联系人不能为空")
+	private List<WorkClientLinkman> workClientLinkmanList;		// 委托方联系人
+	private List<WorkClientLinkman> workConstructionLinkmanList;		// 施工方及联系人
+	@NotBlank(message = "工程概况不能为空")
+	private String projectDesc;		// 工程概况
+	@NotNull(message = "项目负责人不能为空")
+	private List<User> projectLeaders; //项目负责人
+	private List<User> projectMembers;  //项目组成员
+
+	private String leaderNameStr;
+	private String leaderIds;
+	private String memberNameStr;
+	private String memberIds;
+
+	private String processInstanceId;
+
+	private Office company;
+	private Office office;
+	private int projectStatus;//项目状态
+
+	private String auditType;
+	@NotBlank(message = "变更原因不能为空")
+	private String alterReason;
+
+	private ProjectRecords alterBeforeRecords;
+
+	private Date beginDate;
+	private Date endDate;
+
+	private String home;
+
+	private String alterProjectId;
+
+    private List<WorkClientAttachment> workAttachments = Lists.newArrayList();
+
+	public ProjectRecordsAlter() {
+		super();
+	}
+
+	public ProjectRecordsAlter(String id){
+		super(id);
+	}
+
+	public WorkContractInfo getWorkContractInfo() {
+		return workContractInfo;
+	}
+
+	public void setWorkContractInfo(WorkContractInfo contract) {
+		this.workContractInfo = contract;
+	}
+	
+	@ExcelField(title="项目编号", align=2, sort=7)
+	public String getProjectId() {
+		return projectId;
+	}
+
+	public void setProjectId(String projectId) {
+		this.projectId = projectId;
+	}
+	
+	@ExcelField(title="项目名称", align=2, sort=8)
+	public String getProjectName() {
+		return projectName;
+	}
+
+	public void setProjectName(String projectName) {
+		this.projectName = projectName;
+	}
+	
+	@ExcelField(title="规模类型", align=2, sort=9)
+	public String getScaleType() {
+		return scaleType;
+	}
+
+	public void setScaleType(String scaleType) {
+		this.scaleType = scaleType;
+	}
+	
+	@ExcelField(title="规模单位", align=2, sort=10)
+	public String getScaleUnit() {
+		return scaleUnit;
+	}
+
+	public void setScaleUnit(String scaleUnit) {
+		this.scaleUnit = scaleUnit;
+	}
+	
+	@ExcelField(title="规模数量", align=2, sort=11)
+	public Double getScaleQuantity() {
+		return scaleQuantity;
+	}
+
+	public void setScaleQuantity(Double scaleQuantity) {
+		this.scaleQuantity = scaleQuantity;
+	}
+	
+	@ExcelField(title="项目所在地", align=2, sort=12)
+	public Area getArea() {
+		return area;
+	}
+
+	public void setArea(Area area) {
+		this.area = area;
+	}
+	
+	@ExcelField(title="建设地点", align=2, sort=13)
+	public String getProjectSite() {
+		return projectSite;
+	}
+
+	public void setProjectSite(String projectSite) {
+		this.projectSite = projectSite;
+	}
+
+	public List<WorkClientLinkman> getWorkClientLinkmanList() {
+		return workClientLinkmanList;
+	}
+
+	public void setWorkClientLinkmanList(List<WorkClientLinkman> workClientLinkmanList) {
+		this.workClientLinkmanList = workClientLinkmanList;
+	}
+
+	@ExcelField(title="工程概况", align=2, sort=16)
+	public String getProjectDesc() {
+		return projectDesc;
+	}
+
+	public void setProjectDesc(String projectDesc) {
+		this.projectDesc = projectDesc;
+	}
+
+	public List<User> getProjectLeaders() {
+		return projectLeaders;
+	}
+
+	public void setProjectLeaders(List<User> projectLeaders) {
+		this.projectLeaders = projectLeaders;
+	}
+
+	public List<User> getProjectMembers() {
+		return projectMembers;
+	}
+
+	public void setProjectMembers(List<User> projectMembers) {
+		this.projectMembers = projectMembers;
+	}
+
+	public List<WorkClientLinkman> getWorkConstructionLinkmanList() {
+		return workConstructionLinkmanList;
+	}
+
+	public void setWorkConstructionLinkmanList(List<WorkClientLinkman> workConstructionLinkmanList) {
+		this.workConstructionLinkmanList = workConstructionLinkmanList;
+	}
+
+	public int getProjectStatus() {
+		return projectStatus;
+	}
+
+	public void setProjectStatus(int projectStatus) {
+		this.projectStatus = projectStatus;
+	}
+
+	public String getLeaderNameStr() {
+		return leaderNameStr;
+	}
+
+	public void setLeaderNameStr(String leaderNameStr) {
+		this.leaderNameStr = leaderNameStr;
+	}
+
+	public String getMemberNameStr() {
+		return memberNameStr;
+	}
+
+	public void setMemberNameStr(String memberNameStr) {
+		this.memberNameStr = memberNameStr;
+	}
+
+	public String getLeaderIds() {
+		return leaderIds;
+	}
+
+	public void setLeaderIds(String leaderIds) {
+		this.leaderIds = leaderIds;
+	}
+
+	public String getMemberIds() {
+		return memberIds;
+	}
+
+	public void setMemberIds(String memberIds) {
+		this.memberIds = memberIds;
+	}
+
+	public String getProcessInstanceId() {
+		return processInstanceId;
+	}
+
+	public void setProcessInstanceId(String processInstanceId) {
+		this.processInstanceId = processInstanceId;
+	}
+
+	public String getAuditType() {
+		return auditType;
+	}
+
+	public void setAuditType(String auditType) {
+		this.auditType = auditType;
+	}
+
+	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 getAlterReason() {
+		return alterReason;
+	}
+
+	public void setAlterReason(String alterReason) {
+		this.alterReason = alterReason;
+	}
+
+	public Date getBeginDate() {
+		return beginDate;
+	}
+
+	public void setBeginDate(Date beginDate) {
+		this.beginDate = beginDate;
+	}
+
+	public Date getEndDate() {
+		return endDate;
+	}
+
+	public void setEndDate(Date endDate) {
+		this.endDate = endDate;
+	}
+
+    public List<WorkClientAttachment> getWorkAttachments() {
+        return workAttachments;
+    }
+
+    public void setWorkAttachments(List<WorkClientAttachment> workAttachments) {
+        this.workAttachments = workAttachments;
+    }
+
+    public ProjectRecords getAlterBeforeRecords() {
+        return alterBeforeRecords;
+    }
+
+    public void setAlterBeforeRecords(ProjectRecords alterBeforeRecords) {
+        this.alterBeforeRecords = alterBeforeRecords;
+    }
+
+    public String getHome() {
+        return home;
+    }
+
+    public void setHome(String home) {
+        this.home = home;
+    }
+
+    public String getAlterProjectId() {
+        return alterProjectId;
+    }
+
+    public void setAlterProjectId(String alterProjectId) {
+        this.alterProjectId = alterProjectId;
+    }
+
+	public String getContractNumber() {
+		if (workContractInfo!=null) {
+			return workContractInfo.getContractNum();
+		}else {
+			return "";
+		}
+	}
+
+	public String getContractName() {
+		if (workContractInfo!=null) {
+			return workContractInfo.getName();
+		}else {
+			return "";
+		}
+	}
+
+	public String getContractPrice() {
+		if (workContractInfo!=null) {
+			return workContractInfo.getContractPrice();
+		}else {
+			return "";
+		}
+	}
+
+	public String getClientName() {
+		if (workContractInfo!=null && workContractInfo.getClient()!=null){
+			return workContractInfo.getClient().getName();
+		}else {
+			return "";
+		}
+	}
+
+	public String getContractType() {
+		if (workContractInfo!=null) {
+			return workContractInfo.getConstructionProjectTypeStr();
+		}else {
+			return "";
+		}
+	}
+
+
+	public String getProvince() {
+		return province;
+	}
+
+	public void setProvince(String province) {
+		this.province = province;
+	}
+
+	public String getCity() {
+		return city;
+	}
+
+	public void setCity(String city) {
+		this.city = city;
+	}
+
+	public String getCounty() {
+		return county;
+	}
+
+	public void setCounty(String county) {
+		this.county = county;
+	}
+
+	public String getProjectStructure() {
+		return projectStructure;
+	}
+
+	public void setProjectStructure(String projectStructure) {
+		this.projectStructure = projectStructure;
+	}
+
+	public String getOnGroundNum() {
+		return onGroundNum;
+	}
+
+	public void setOnGroundNum(String onGroundNum) {
+		this.onGroundNum = onGroundNum;
+	}
+
+	public String getUnderGroundNum() {
+		return underGroundNum;
+	}
+
+	public void setUnderGroundNum(String underGroundNum) {
+		this.underGroundNum = underGroundNum;
+	}
+
+	public String getBuildingScale() {
+		return buildingScale;
+	}
+
+	public void setBuildingScale(String buildingScale) {
+		this.buildingScale = buildingScale;
+	}
+
+	public String getMeasuringUnit() {
+		return measuringUnit;
+	}
+
+	public void setMeasuringUnit(String measuringUnit) {
+		this.measuringUnit = measuringUnit;
+	}
+
+	public String getProjectUse() {
+		return projectUse;
+	}
+
+	public void setProjectUse(String projectUse) {
+		this.projectUse = projectUse;
+	}
+
+	public Double getInstallFees() {
+		return installFees;
+	}
+
+	public void setInstallFees(Double installFees) {
+		this.installFees = installFees;
+	}
+
+	public Double getBuildingFees() {
+		return buildingFees;
+	}
+
+	public void setBuildingFees(Double buildingFees) {
+		this.buildingFees = buildingFees;
+	}
+
+	public Double getBuildingPercent() {
+		return buildingPercent;
+	}
+
+	public void setBuildingPercent(Double buildingPercent) {
+		this.buildingPercent = buildingPercent;
+	}
+
+	public Double getInstallPercent() {
+		return installPercent;
+	}
+
+	public void setInstallPercent(Double installPercent) {
+		this.installPercent = installPercent;
+	}
+
+	public Double getUnitFees() {
+		return unitFees;
+	}
+
+	public void setUnitFees(Double unitFees) {
+		this.unitFees = unitFees;
+	}
+
+	public Double getBuildingUnitFees() {
+		return buildingUnitFees;
+	}
+
+	public void setBuildingUnitFees(Double buildingUnitFees) {
+		this.buildingUnitFees = buildingUnitFees;
+	}
+
+	public Double getInstallUnitFees() {
+		return installUnitFees;
+	}
+
+	public void setInstallUnitFees(Double installUnitFees) {
+		this.installUnitFees = installUnitFees;
+	}
+
+	public Double getTotalFees() {
+		return totalFees;
+	}
+
+	public void setTotalFees(Double totalFees) {
+		this.totalFees = totalFees;
+	}
+}

+ 25 - 0
src/main/java/com/jeeplus/modules/projectrecord/enums/AlterStatusEnum.java

@@ -0,0 +1,25 @@
+package com.jeeplus.modules.projectrecord.enums;
+
+public enum AlterStatusEnum {
+    TSTORE(1,"暂存"),
+    IN_APRL(2,"变更中"),
+    REJECTED(4,"驳回"),
+    RECALL(3,"撤回"),
+    SIGNED(5,"已变更");
+
+    private int value;
+    private String desc;
+
+    AlterStatusEnum(int val, String desc) {
+        this.value = val;
+        this.desc = desc;
+    }
+
+    public int getValue() {
+        return value;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+}

+ 29 - 0
src/main/java/com/jeeplus/modules/projectrecord/enums/ProjectStatusEnum.java

@@ -0,0 +1,29 @@
+package com.jeeplus.modules.projectrecord.enums;
+
+public enum ProjectStatusEnum {
+    TSTORE(1,"暂存"),
+    IN_APRL(2,"审批中"),
+    REJECTED(4,"已驳回"),
+    RECALL(3,"已撤回"),
+    SIGNED(5,"已签"),
+    INVALIDING(6,"作废中"),
+    INVALID(7,"已作废"),
+    ON_CHANGE(8,"变更中"),
+    DONE(9,"已完成");
+
+    private int value;
+    private String desc;
+
+    ProjectStatusEnum(int val, String desc) {
+        this.value = val;
+        this.desc = desc;
+    }
+
+    public int getValue() {
+        return value;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+}

+ 977 - 0
src/main/java/com/jeeplus/modules/projectrecord/service/ProjectRecordsAlterService.java

@@ -0,0 +1,977 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.projectrecord.service;
+
+import com.google.common.collect.Maps;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.service.CrudService;
+import com.jeeplus.common.utils.Collections3;
+import com.jeeplus.common.utils.MenuStatusEnum;
+import com.jeeplus.common.websocket.onchat.ChatServerPool;
+import com.jeeplus.modules.act.entity.Act;
+import com.jeeplus.modules.act.service.ActTaskService;
+import com.jeeplus.modules.act.utils.ProcessDefCache;
+import com.jeeplus.modules.projectrecord.dao.ProjectClientLinkmanDao;
+import com.jeeplus.modules.projectrecord.dao.ProjectRecordsAlterDao;
+import com.jeeplus.modules.projectrecord.entity.ProjectRecords;
+import com.jeeplus.modules.projectrecord.entity.ProjectRecordsAlter;
+import com.jeeplus.modules.projectrecord.enums.AlterStatusEnum;
+import com.jeeplus.modules.projectrecord.enums.ProjectStatusEnum;
+import com.jeeplus.modules.sys.entity.Dict;
+import com.jeeplus.modules.sys.entity.Office;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.service.DictService;
+import com.jeeplus.modules.sys.service.OfficeService;
+import com.jeeplus.modules.sys.utils.DictUtils;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.workactivity.dao.WorkActivityProcessDao;
+import com.jeeplus.modules.workactivity.entity.Activity;
+import com.jeeplus.modules.workactivity.entity.WorkActivityProcess;
+import com.jeeplus.modules.workactivity.service.ActivityService;
+import com.jeeplus.modules.workactivity.service.WorkActivityProcessService;
+import com.jeeplus.modules.workactivitymenu.entity.WorkActivityMenu;
+import com.jeeplus.modules.workactivitymenu.service.WorkActivityMenuService;
+import com.jeeplus.modules.workclientinfo.dao.WorkClientAttachmentDao;
+import com.jeeplus.modules.workclientinfo.dao.WorkClientLinkmanDao;
+import com.jeeplus.modules.workclientinfo.entity.WorkClientAttachment;
+import com.jeeplus.modules.workclientinfo.entity.WorkClientInfo;
+import com.jeeplus.modules.workclientinfo.entity.WorkClientLinkman;
+import com.jeeplus.modules.workcontractinfo.entity.WorkContractInfo;
+import com.jeeplus.modules.workcontractinfo.service.WorkContractInfoService;
+import com.jeeplus.modules.workprojectnotify.entity.WorkProjectNotify;
+import com.jeeplus.modules.workprojectnotify.service.WorkProjectNotifyService;
+import com.jeeplus.modules.workprojectnotify.util.UtilNotify;
+import com.jeeplus.modules.projectrecord.dao.WorkProjectUserDao;
+import org.activiti.engine.ActivitiObjectNotFoundException;
+import org.activiti.engine.HistoryService;
+import org.activiti.engine.IdentityService;
+import org.activiti.engine.RuntimeService;
+import org.activiti.engine.history.HistoricTaskInstance;
+import org.activiti.engine.history.HistoricTaskInstanceQuery;
+import org.activiti.engine.runtime.ProcessInstance;
+import org.apache.commons.beanutils.BeanUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.java_websocket.WebSocket;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 项目登记Service
+ * @author ppt
+ * @version 2018-05-02
+ */
+@Service
+@Transactional(readOnly = true)
+public class ProjectRecordsAlterService extends CrudService<ProjectRecordsAlterDao, ProjectRecordsAlter> {
+
+	@Autowired
+	private WorkProjectUserDao workProjectUserDao;
+	@Autowired
+	private ProjectClientLinkmanDao clientLinkmanDao;
+	@Autowired
+	private WorkClientLinkmanDao workClientLinkmanDao;
+	@Autowired
+	private DictService dictService;
+	@Autowired
+	private IdentityService identityService;
+	@Autowired
+	private OfficeService officeService;
+	@Autowired
+	private ActTaskService actTaskService;
+	@Autowired
+	private WorkActivityMenuService workActivityMenuService;
+	@Autowired
+	private RuntimeService runtimeService;
+	@Autowired
+	private WorkActivityProcessService workActivityProcessService;
+	@Autowired
+	private WorkProjectNotifyService workProjectNotifyService;
+	@Autowired
+	private ActivityService activityService;
+    @Autowired
+    protected HistoryService historyService;
+    @Autowired
+	private  ProjectRecordsService recordsService;
+	@Autowired
+	private WorkContractInfoService contractInfoService;
+    @Autowired
+    private WorkClientAttachmentDao workClientAttachmentDao;
+    @Autowired
+    private WorkActivityProcessDao workActivityProcessDao;
+
+	public ProjectRecordsAlter get(String id) {
+		return super.get(id);
+	}
+
+	public List<ProjectRecordsAlter> findList(ProjectRecordsAlter projectRecords) {
+		return super.findList(projectRecords);
+	}
+
+	public Page<ProjectRecordsAlter> findPage(Page<ProjectRecordsAlter> page, ProjectRecordsAlter projectRecords) {
+		//设置数据权限
+		projectRecords.getSqlMap().put("dsf", dataScopeFilter(projectRecords.getCurrentUser(), "o", "u", "s", MenuStatusEnum.PROJECT_RECORDSALTER.getValue()));
+		projectRecords.setPage(page);
+		List<ProjectRecordsAlter> recordsList = findList(projectRecords);
+		//查询负责人信息
+		for (ProjectRecordsAlter records : recordsList) {
+			List<User> users = workProjectUserDao.queryProjectUsers(records.getId(), "1");
+			records.setProjectLeaders(users);
+		}
+		page.setList(recordsList);
+		return page;
+	}
+
+	@Transactional(readOnly = false)
+	public void saveProject(ProjectRecordsAlter projectRecordsAlter, AlterStatusEnum alterStatus) throws Exception {
+        WorkContractInfo workContractInfo = contractInfoService.get(projectRecordsAlter.getWorkContractInfo().getId());
+		ProjectRecords records = recordsService.get(projectRecordsAlter.getAlterBeforeRecords().getId());
+
+		if(records.getProjectStatus()!=ProjectStatusEnum.SIGNED.getValue() && records.getProjectStatus()!=ProjectStatusEnum.ON_CHANGE.getValue()){
+			throw  new Exception("项目状态发生变动,不能发起变更");
+		}else if(records.getProjectStatus()==ProjectStatusEnum.ON_CHANGE.getValue() && AlterStatusEnum.TSTORE.getValue() != projectRecordsAlter.getProjectStatus()
+                && AlterStatusEnum.REJECTED.getValue() != projectRecordsAlter.getProjectStatus()&&AlterStatusEnum.RECALL.getValue() != projectRecordsAlter.getProjectStatus()){
+            throw  new Exception("项目状态发生变动,不能发起变更");
+        }
+        Integer oldStatus = projectRecordsAlter.getProjectStatus();
+        projectRecordsAlter.setProjectStatus(alterStatus.getValue());
+        //更新原有项目状态信息
+        records.setProjectStatus(ProjectStatusEnum.ON_CHANGE.getValue());
+        records.preUpdate();
+        recordsService.updateSelectiveById(records);
+
+        if(StringUtils.isBlank(projectRecordsAlter.getAlterProjectId())){
+            projectRecordsAlter.setAlterProjectId(projectRecordsAlter.getProjectId()+"-变更-"+this.countAlter(projectRecordsAlter.getProjectId()));
+        }
+		User createBy = projectRecordsAlter.getCreateBy();
+		if(createBy != null){
+			createBy = UserUtils.get(createBy.getId());
+		}else {
+		    createBy = UserUtils.getUser();
+        }
+		Office company= new Office();
+        Office office =  new Office();
+        if(StringUtils.isNotBlank((projectRecordsAlter.getWorkContractInfo().getId()))){
+            //有合同状态
+            workContractInfo = contractInfoService.get(projectRecordsAlter.getWorkContractInfo().getId());
+            company.setId(workContractInfo.getCompanyId());
+//			office.setId(workContractInfo.getChargeCompany());
+            office.setId(UserUtils.getUser().getOffice().getId());
+        }else{
+            //无合同
+            company.setId(UserUtils.getUser().getCompany().getId());
+            office.setId(UserUtils.getUser().getOffice().getId());
+        }
+		projectRecordsAlter.setCompany(company);
+		projectRecordsAlter.setOffice(office);
+		super.save(projectRecordsAlter);
+		//保存项目负责人
+		List<User> leaders = projectRecordsAlter.getProjectLeaders();
+		this.saveProjectUsers(projectRecordsAlter.getId(), leaders, true);
+		//保存委托方联系人
+		List<WorkClientLinkman> workClientLinkmanList = projectRecordsAlter.getWorkClientLinkmanList();
+		this.saveLinkmanInfos(projectRecordsAlter.getId(), workClientLinkmanList, true);
+		//保存施工方联系信息
+		List<WorkClientLinkman> constructionLinkmanList = projectRecordsAlter.getWorkConstructionLinkmanList();
+		this.saveLinkmanInfos(projectRecordsAlter.getId(), constructionLinkmanList, false);
+		this.saveAttachments(projectRecordsAlter);
+		if (AlterStatusEnum.TSTORE.getValue()== projectRecordsAlter.getProjectStatus()||AlterStatusEnum.REJECTED.getValue()==oldStatus)return;
+		//启动审批流程
+		this.startAudit(projectRecordsAlter, projectRecordsAlter.getProcessInstanceId());
+	}
+
+    private int countAlter(String projectId) {
+	    return dao.countAlter(projectId)+1;
+    }
+
+    /**
+	 * 保存委托方和施工方联系人信息
+	 *
+	 * @param projectId
+	 * @param linkmanList
+	 * @param isEntrust   是否委托方
+	 */
+	private void saveLinkmanInfos(String projectId, List<WorkClientLinkman> linkmanList, boolean isEntrust) {
+		assert (projectId != null);
+        if(linkmanList == null || linkmanList.isEmpty()){
+            return;
+        }
+		HashMap<String, Object> map = new HashMap<>(5);
+		map.put("projectId", projectId);
+		map.put("linkmanList", linkmanList);
+		int entrust = 0;
+		if (isEntrust) {
+			entrust = 1;
+		}
+		clientLinkmanDao.deleteProjectLinkmans(projectId, entrust);
+		map.put("isEntrust", entrust);
+		clientLinkmanDao.batchInsert(map);
+	}
+
+	/**
+	 * 保存项目组成员信息
+	 *
+	 * @param projectId
+	 * @param users
+	 * @param isMaster
+	 */
+	private void saveProjectUsers(String projectId, List<User> users, boolean isMaster) {
+		assert (projectId != null);
+		assert (users != null && !users.isEmpty());
+		HashMap<String, Object> map = new HashMap<>(5);
+		List<String> memberIds = new ArrayList<>(users.size());
+		for (User user : users) {
+			memberIds.add(user.getId());
+		}
+		map.put("memberIds", memberIds);
+		map.put("projectId", projectId);
+		String master = null;
+		if (isMaster) {
+			master = "1";
+            workProjectUserDao.deleteProjectMasterMembers(map);
+           /* map.put("isMaster", "0");
+            workProjectUserDao.batchInsert(map);*/
+		} else {
+			master = "0";
+		}
+		workProjectUserDao.deleteProjectMembers(projectId, master);
+		map.put("isMaster", master);
+		workProjectUserDao.batchInsert(map);
+	}
+
+	@Transactional(readOnly = false)
+	public void delete(ProjectRecordsAlter projectRecords) {
+		//删除项目负责人
+		workProjectUserDao.deleteProjectMembers(projectRecords.getId(), "1");
+		//删除项目组成员
+//		workProjectUserDao.deleteProjectMembers(projectRecords.getId(), "0");
+		//删除委托方联系人
+		clientLinkmanDao.deleteProjectLinkmans(projectRecords.getId(), 1);
+		//删除施工方联系人
+		clientLinkmanDao.deleteProjectLinkmans(projectRecords.getId(), 0);
+		super.delete(projectRecords);
+		//修改原项目状态
+		if (projectRecords.getAlterBeforeRecords()!=null){
+			ProjectRecords records = new ProjectRecords();
+			records.preUpdate();
+			records.setId(projectRecords.getAlterBeforeRecords().getId());
+			records.setProjectStatus(ProjectStatusEnum.SIGNED.getValue());
+			recordsService.updateSelectiveById(records);
+		}
+        WorkProjectNotify notify = new WorkProjectNotify();
+        notify.setNotifyId(projectRecords.getId());
+        List<User> users = workProjectNotifyService.readByNotifyId(notify);
+        if (users!=null && users.size()!=0){
+            for (User user:users){
+                UserUtils.pushMeIm(user.getId());
+            }
+        }
+	}
+
+	/**
+	 * 设置项目组成员信息
+	 *
+	 * @param records
+	 */
+	public void queryUserNames(ProjectRecordsAlter records) {
+		//查询负责人信息
+		List<User> users = workProjectUserDao.queryProjectUsers(records.getId(), "1");
+		records.setProjectLeaders(users);
+		records.setLeaderNameStr(Collections3.extractToString(users, "name", ","));
+		records.setLeaderIds(Collections3.extractToString(users, "id", ","));
+
+		//查询项目组成员信息
+		List<User> members = workProjectUserDao.isDelFalg(records.getId(), "");
+		records.setProjectMembers(members);
+		records.setMemberNameStr(Collections3.extractToString(members, "name", ","));
+		records.setMemberIds(Collections3.extractToString(members, "id", ","));
+	}
+
+	/**
+	 * 设置联系人信息
+	 *
+	 * @param projectRecords
+	 */
+	public void queryLinkmanInfos(ProjectRecordsAlter projectRecords) {
+		List<WorkClientLinkman> clientLinkmanList = workClientLinkmanDao.queryProjectLinkmans(projectRecords.getId(), 1);
+		projectRecords.setWorkClientLinkmanList(clientLinkmanList);
+		List<WorkClientLinkman> constructionLinkmanList = workClientLinkmanDao.queryProjectLinkmans(projectRecords.getId(), 0);
+		projectRecords.setWorkConstructionLinkmanList(constructionLinkmanList);
+	}
+
+	/**
+	 * 启动审批流程
+	 *
+	 * @param projectRecordsAlter
+	 */
+    private void startAudit(ProjectRecordsAlter projectRecordsAlter,String processInstanceId) throws Exception {
+        Map<String, Object> variables = new HashMap<String, Object>();
+        identityService.setAuthenticatedUserId(projectRecordsAlter.getCurrentUser().getId());
+        Office office = projectRecordsAlter.getOffice();
+        office = officeService.get(office.getId());
+        projectRecordsAlter.setOffice(office);
+        String contentStr = "项目变更编号:"+projectRecordsAlter.getAlterProjectId()+",项目名称:"+ projectRecordsAlter.getProjectName()+",创建人:"+projectRecordsAlter.getCreateBy().getName()+",所属部门:"+projectRecordsAlter.getOffice().getName();
+        String titleStr = "项目名称:"+ projectRecordsAlter.getProjectName();
+
+        String businessKey = projectRecordsAlter.getId();
+        WorkActivityMenu workActivityMenu = workActivityMenuService.findByParentAndOffice("807c6d4b5623474792fe78ff1fd1cdff", office);
+        // 启动流程
+        String processType = workActivityMenu.getProcessType();
+        StringBuffer buffer = new StringBuffer();
+        Activity activity = new Activity();
+        WorkProjectNotify workProjectNotify = UtilNotify
+                .saveNotify(projectRecordsAlter.getId(),
+                        null,
+                        projectRecordsAlter.getCompany().getId(),
+                        titleStr,
+                        contentStr,
+                        "41",
+                        "0",
+                        "待审批",
+                        ""
+                );
+
+        List<User> users = new ArrayList<>();
+        List<User> bmzrs = UserUtils.getByRoleActivityEnname("bmzr",2,office.getId(),"4",projectRecordsAlter.getCreateBy());
+        if (StringUtils.isNotBlank(workActivityMenu.getId())) {
+            processType = workActivityMenu.getProcessType();
+            workActivityMenu = workActivityMenuService.get(workActivityMenu.getId());
+            List<Activity> activities = workActivityMenu.getActivities();
+            for (Activity a : activities) {
+                String encount = a.getEncount();
+                String enlist = a.getEnlist();
+                if (a.getRole()!=null && StringUtils.isNotBlank(a.getRole().getEnname())){
+                    List enusers = UserUtils.getByRoleActivityEnnames(a.getRole().getEnname(),office.getId(),"8",projectRecordsAlter.getCreateBy());
+                    if (enusers.size()==0){
+                            /*this.delete(projectRecordsAlter);
+                            for (WorkClientAttachment workClientAttachment : projectRecordsAlter.getWorkAttachments()) {
+                                workClientAttachmentDao.delete(workClientAttachment);
+                            }*/
+                        throw new Exception("流程审批人不能为空,角色"+a.getRole().getName()+"下无用户,请联系管理员!");
+                    }
+                    variables.put(enlist, enusers);
+                    variables.put(encount, enusers.size());
+                }
+                if (a.getDelFlag().equals("0") && a.getCount() == 1) {
+                    activity = a;
+                }
+            }
+            buffer.append(activity.getRole().getEnname());
+            if (activity != null && StringUtils.isNotBlank(activity.getId())) {
+                //角色审批
+                if (StringUtils.isNotBlank(activity.getRole().getEnname())) {
+                    users = UserUtils.getByRoleActivityEnnames(activity.getRole().getEnname(),office.getId(),"4",projectRecordsAlter.getCreateBy());
+                }
+                //人员审批
+                if (StringUtils.isNotBlank(activity.getUser().getId())) {
+                    users.add(activity.getUser());
+                }
+            }
+            workProjectNotify.setId("");
+        } else {
+            if (bmzrs==null||bmzrs.size()==0){
+                    /*this.delete(projectRecordsAlter);
+                    if (projectRecordsAlter.getWorkAttachments()!=null) {
+                        for (WorkClientAttachment workClientAttachment : projectRecordsAlter.getWorkAttachments()) {
+                            workClientAttachmentDao.delete(workClientAttachment);
+                        }
+                    }*/
+                throw new Exception("流程审批人不能为空,角色部门负责人下无用户,请联系管理员!");
+            }
+            processType = "projectAlter";
+            variables.put("applyUserId", projectRecordsAlter.getCreateBy().getId());
+            variables.put("bmzrCount",bmzrs.size());
+            variables.put("bmzrList",bmzrs);
+            users.addAll(bmzrs);
+        }
+        List<String> userIds = new ArrayList<>(users.size());
+        for (User u : users){
+            userIds.add(u.getId());
+            workProjectNotify.setUser(u);
+            workProjectNotify.setId("");
+            workProjectNotify.setNotifyRole("部门负责人审批");
+            workProjectNotifyService.save(workProjectNotify);
+            Map<String,Object> extras = new HashMap<>();
+            extras.put("type","7003");
+            extras.put("procDefKey","41");
+            extras.put("id",workProjectNotify.getId());
+            UserUtils.pushInfoToApp(titleStr,contentStr,extras,u.getId());
+        }
+        UserUtils.pushIm(userIds,contentStr);
+
+        variables.put("busId", businessKey);
+        variables.put("type", processType);
+        variables.put("title", "审批单:" + projectRecordsAlter.getProjectName());//设置标题;
+
+        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processType, businessKey, variables);
+        //        projectRecordsAlter.setProcessInstance(processInstance);
+        if (StringUtils.isNotBlank(processInstanceId)) {
+            workActivityProcessService.updateProcessInstanceId(processInstance.getId(),processInstanceId);
+            workActivityProcessService.deleteProcessInstanceId(processInstanceId);
+            workActivityProcessService.deleteProcessIdAuditUsers(processInstanceId);
+        }
+        List<Activity> list = workActivityMenu.getActivities();
+        if (list != null && list.size() != 0) {
+            workActivityProcessService.saveList(list, processInstance.getId());
+        } else {
+            WorkActivityProcess workActivityProcess = new WorkActivityProcess();
+            workActivityProcess.setProcessKey(processType);
+            workActivityProcess.setCount(1);
+            workActivityProcess.setProcessInstanceId(processInstance.getId());
+            workActivityProcess.setIsApproval("0");
+            workActivityProcessService.save(workActivityProcess);
+            workActivityProcessService.insertAuditsByType(bmzrs,processInstance.getId(),1,1);
+
+        }
+        projectRecordsAlter.setProcessInstanceId(processInstance.getId());
+        projectRecordsAlter.setProjectStatus(AlterStatusEnum.IN_APRL.getValue());
+        dao.updateProcessIdAndStatus(projectRecordsAlter);
+        //更新原有项目状态信息
+        ProjectRecords records = recordsService.get(projectRecordsAlter.getAlterBeforeRecords().getId());
+        records.setAlterProcessId(processInstance.getId());
+        records.preUpdate();
+        recordsService.updateSelectiveById(records);
+    }
+
+	@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
+	public void updateSelectiveById(ProjectRecordsAlter projectRecords) {
+		dao.updateSelectiveById(projectRecords);
+	}
+
+	public ProjectRecordsAlter getByProcessInstanceId(String procInsId) {
+		ProjectRecordsAlter records = dao.findUniqueByProperty("process_instance_id", procInsId);
+		if(records!=null) {
+            List<User> users = workProjectUserDao.queryProjectUsers(records.getId(), "1");
+            records.setProjectLeaders(users);
+        }
+		return records;
+	}
+
+    /**
+     * @param projectRecordsAlter
+     * @return
+     */
+	@Transactional(readOnly = false)
+	public String auditSave(ProjectRecordsAlter projectRecordsAlter,List<User> auditUsers) throws Exception {
+        int projectStatus = projectRecordsAlter.getProjectStatus();
+        String taskDefKey = projectRecordsAlter.getAct().getTaskDefKey();
+        if (!"modifyApply".equals(taskDefKey) && !taskDefKey.contains("audit") ) {
+            actTaskService.claim(projectRecordsAlter.getAct().getTaskId(), UserUtils.getUser().getId());
+            List<User> leaders = projectRecordsAlter.getProjectLeaders();
+            this.saveProjectUsers(projectRecordsAlter.getId(), leaders, true);
+        }else {
+            projectRecordsAlter.getAct().setFlag("yes");
+            saveProject(projectRecordsAlter,AlterStatusEnum.IN_APRL);
+        }
+
+        String comment = "";
+        if ( projectStatus == AlterStatusEnum.REJECTED.getValue()) {
+            comment = ("yes".equals(projectRecordsAlter.getAct().getFlag())?"[重新申请] ":"[已撤销] ");
+        }else {
+            comment = ("yes".equals(projectRecordsAlter.getAct().getFlag())?"[同意] ":"[驳回] ")+ projectRecordsAlter.getAct().getComment();
+        }
+
+        if (!"yes".equals(projectRecordsAlter.getAct().getFlag())) {
+            projectRecordsAlter.setProjectStatus(AlterStatusEnum.REJECTED.getValue());
+        }
+
+        User createUser = UserUtils.get(projectRecordsAlter.getCreateBy().getId());
+
+        Map<String, Object> vars = Maps.newHashMap();
+        String notifyRole = "";
+        //业务逻辑对应的条件表达式
+        User user = null;
+        List<Activity> activitieList = activityService.getByProcessInstanceId(projectRecordsAlter.getProcessInstanceId());
+        WorkActivityMenu workActivityMenu = new WorkActivityMenu();
+        if (activitieList != null && activitieList.size() != 0) {
+            workActivityMenu.setProcessType(activitieList.get(0).getProcessKey());
+            workActivityMenu.setActivities(activitieList);
+        }
+
+        WorkActivityProcess workActivityProcess = new WorkActivityProcess();
+        WorkActivityProcess selectProcess = new WorkActivityProcess();
+        selectProcess.setProcessInstanceId(projectRecordsAlter.getProcessInstanceId());
+        List<WorkActivityProcess> workActivityProcesses = workActivityProcessService.findList(selectProcess);
+        List<Activity> activities = workActivityMenu.getActivities();
+        String  taskCount = "1";
+        String enname = "";
+        Office office = officeService.get(projectRecordsAlter.getOffice().getId());
+        projectRecordsAlter.setOffice(office);
+        String notifyStr = "项目变更编号:"+projectRecordsAlter.getAlterProjectId()+",项目名称:"+ projectRecordsAlter.getProjectName();
+        String title = "项目名称:"+ projectRecordsAlter.getProjectName();
+        int key = 0;
+        if (StringUtils.isNotBlank(workActivityMenu.getProcessType()) && !workActivityMenu.getProcessType().equals("projectAlter")) {
+            key = 1;
+            for (int i = 0; i < workActivityProcesses.size(); i++) {
+                WorkActivityProcess activityProcess = workActivityProcesses.get(i);
+                if (taskDefKey.equals("modifyApply")) {
+                    taskCount = "0";
+                    workActivityProcess.setId("");
+                    workActivityProcess.setCount(0);
+                    if (!"yes".equals(projectRecordsAlter.getAct().getFlag())) {
+                        projectRecordsAlter.setProjectStatus(AlterStatusEnum.RECALL.getValue());
+                        workActivityProcess.setIsApproval("2");
+                        vars.put("pass", false);
+                    } else {
+                        vars.put("pass", true);
+                        workActivityProcess.setIsApproval("1");
+                    }
+                    break;
+                } else {
+                    taskCount = activityProcess.getCount()+"";
+                    workActivityProcess = activityProcess;
+                    if (!workActivityProcess.getIsApproval().equals("0")) {
+                        workActivityProcess.setId("");
+                    }
+                    for (Activity activity : activities) {
+                        if (activity.getCount() == activityProcess.getCount()) {
+                            notifyRole = activity.getName();
+                            break;
+                        }
+                    }
+                    if (!"yes".equals(projectRecordsAlter.getAct().getFlag())) {
+                        notifyRole = "调整项目变更";
+                        projectRecordsAlter.setProjectStatus(AlterStatusEnum.REJECTED.getValue());
+                        workActivityProcess.setIsApproval("2");
+                        String returnBack = "-1";
+                        for (Activity activity : activities) {
+                            if (activity.getCount() == activityProcess.getCount()) {
+                                returnBack = activity.getReturnBack();
+                                break;
+                            }
+                        }
+                        if (returnBack.equals("0")) {
+                            workActivityProcess.setId("");
+                        }
+                        vars.put("pass", false);
+                    } else {
+                        workActivityProcess.setIsApproval("1");
+                        vars.put("pass", true);
+                    }
+                    break;
+                }
+            }
+        }else {
+            workActivityMenu.setProcessType("projectAlter");
+            for (int i = 0; i < workActivityProcesses.size(); i++) {
+                WorkActivityProcess activityProcess = workActivityProcesses.get(i);
+                String count = String.valueOf(activityProcess.getCount());
+                workActivityProcess = activityProcess;
+                if (!workActivityProcess.getIsApproval().equals("0")) {
+                    workActivityProcess.setId("");
+                }
+                // 审核环节
+                if ("bmzr".equals(taskDefKey) && "1".equals(count)) {
+                    taskCount = count;
+                    if ("yes".equals(projectRecordsAlter.getAct().getFlag())) {
+                        workActivityProcess.setIsApproval("1");
+                        vars.put("pass", true);
+                        notifyRole = "审批通过";
+                    } else {
+                        workActivityProcess.setIsApproval("2");
+                        vars.put("pass", false);
+                        user = createUser;
+                        notifyRole = "调整项目变更";
+                    }
+                    break;
+                } else if ("modifyApply".equals(taskDefKey) && "0".equals(count)) {
+                    taskCount = "0";
+                    enname = "bmzr";
+                    workActivityProcess.setCount(0);
+                    if("yes".equals(projectRecordsAlter.getAct().getFlag())){
+                        workActivityProcess.setIsApproval("1");
+                        vars.put("pass",true);
+                        notifyRole = "部门负责人审批";
+                    }else{
+                        workActivityProcess.setIsApproval("2");
+                        projectRecordsAlter.setProjectStatus(AlterStatusEnum.RECALL.getValue());
+                        vars.put("pass",false);
+                    }
+                    break;
+                }
+            }
+        }
+        workActivityProcessService.updateProcess(workActivityProcess,workActivityMenu,key,taskCount, projectRecordsAlter.getProcessInstanceId(),taskDefKey,"modifyApply", projectRecordsAlter.getAct().getFlag(),comment, activities);
+        // 设置意见
+        projectRecordsAlter.getAct().setComment(comment);
+        projectRecordsAlter.preUpdate();
+        // 提交流程任务
+        actTaskService.complete(projectRecordsAlter.getAct().getTaskId(), projectRecordsAlter.getAct().getProcInsId(), projectRecordsAlter.getAct().getComment(), vars);
+        boolean state = actTaskService.isProcessEnd(projectRecordsAlter.getAct().getProcInsId());
+        List<User> users = new ArrayList<>();
+        List<User> userList = new ArrayList<>();
+        if(!state) {
+            users.add(projectRecordsAlter.getCreateBy());
+            if ("yes".equals(projectRecordsAlter.getAct().getFlag())) {
+                projectRecordsAlter.setProjectStatus(AlterStatusEnum.SIGNED.getValue());
+                WorkProjectNotify notify = new WorkProjectNotify();
+                notify.setNotifyId(projectRecordsAlter.getId());
+                userList = workProjectNotifyService.readByNotifyId(notify);
+                workProjectNotifyService
+                        .save(UtilNotify
+                                .saveNotify(projectRecordsAlter.getId(),
+                                        projectRecordsAlter.getCreateBy(),
+                                        projectRecordsAlter.getCompany().getId(),
+                                        title,
+                                        notifyStr,
+                                        "41",
+                                        "0",
+                                        "待通知",
+                                        notifyRole));
+            } else {
+                WorkProjectNotify notify = new WorkProjectNotify();
+                notify.setNotifyId(projectRecordsAlter.getId());
+                userList = workProjectNotifyService.readByNotifyId(notify);
+                if (projectRecordsAlter.getProjectStatus()!= AlterStatusEnum.RECALL.getValue()){
+                    projectRecordsAlter.setProjectStatus(AlterStatusEnum.REJECTED.getValue());
+                    workProjectNotifyService
+                            .save(UtilNotify
+                                    .saveNotify(projectRecordsAlter.getId(),
+                                            projectRecordsAlter.getCreateBy(),
+                                            projectRecordsAlter.getCompany().getId(),
+                                            title,
+                                            notifyStr,
+                                            "41",
+                                            "0",
+                                            "待通知",
+                                            notifyRole));
+                }
+            }
+            workActivityProcessService.deleteProcessIdAuditUsers(projectRecordsAlter.getProcessInstanceId());
+        }else{
+            String str = notifyStr +",创建人:"+projectRecordsAlter.getCreateBy().getName()+",所属部门:"+projectRecordsAlter.getOffice().getName();
+            if (StringUtils.isNotBlank(workActivityMenu.getProcessType()) && !workActivityMenu.getProcessType().equals("projectAlter")) {
+                WorkProjectNotify notify = new WorkProjectNotify();
+                notify.setNotifyId(projectRecordsAlter.getId());
+                userList = workProjectNotifyService.readByNotifyId(notify);
+                WorkProjectNotify workProjectNotify = UtilNotify
+                        .saveNotify(projectRecordsAlter.getId(),
+                                new User(),
+                                projectRecordsAlter.getCompany().getId(),
+                                title,
+                                str,
+                                "41",
+                                "0",
+                                "待审批",
+                                notifyRole);
+                String count = taskDefKey.replace("audit","").replace("task","");
+                List<WorkProjectNotify> workProjectNotifys = activityService.getByFlagAndTaskDefKeyList(
+                        activities,
+                        workProjectNotify,
+                        taskDefKey,
+                        projectRecordsAlter.getAct().getFlag(),
+                        count,
+                        projectRecordsAlter.getCreateBy(),
+                        projectRecordsAlter.getOffice().getId(),
+                        "4");
+                for (WorkProjectNotify workProjectNotify1:workProjectNotifys){
+                    users.add(workProjectNotify1.getUser());
+                    workProjectNotify1.setId("");
+                    workProjectNotify1.setIsNewRecord(false);
+                    workProjectNotifyService.save(workProjectNotify1);
+                }
+            }else {
+                if (!"yes".equals(projectRecordsAlter.getAct().getFlag())) {
+                    WorkProjectNotify notify = new WorkProjectNotify();
+                    notify.setNotifyId(projectRecordsAlter.getId());
+                    userList = workProjectNotifyService.readByNotifyId(notify);
+                    WorkProjectNotify workProjectNotify = UtilNotify
+                            .saveNotify(projectRecordsAlter.getId(),
+                                    user,
+                                    projectRecordsAlter.getCompany().getId(),
+                                    title,
+                                    str,
+                                    "41",
+                                    "0",
+                                    "重新申请",
+                                    notifyRole);
+                    workProjectNotifyService.save(workProjectNotify);
+                } else {
+                    if (StringUtils.isNotBlank(enname)) {
+                        WorkProjectNotify notify = new WorkProjectNotify();
+                        notify.setNotifyId(projectRecordsAlter.getId());
+                        userList = workProjectNotifyService.readByNotifyId(notify);
+                        WorkProjectNotify workProjectNotify = UtilNotify
+                                .saveNotify(projectRecordsAlter.getId(),
+                                        new User(),
+                                        projectRecordsAlter.getCompany().getId(),
+                                        title,
+                                        str,
+                                        "41",
+                                        "0",
+                                        "待审批",
+                                        notifyRole);
+                        for (User user1:auditUsers){
+                            users.add(user1);
+                            workProjectNotify.setUser(user1);
+                            workProjectNotify.setId("");
+                            workProjectNotify.setIsNewRecord(false);
+                            workProjectNotifyService.save(workProjectNotify);
+                            Map<String,Object> extras = new HashMap<>();
+                            extras.put("type","7003");
+                            extras.put("procDefKey","41");
+                            extras.put("id",workProjectNotify.getId());
+                            UserUtils.pushInfoToApp(title,str,extras,user1.getId());
+                        }
+                    }else {
+                        WorkProjectNotify notify = new WorkProjectNotify();
+                        notify.setNotifyId(projectRecordsAlter.getId());
+                        userList = workProjectNotifyService.readByNotifyId(notify);
+                        users.add(projectRecordsAlter.getCreateBy());
+                        workProjectNotifyService
+                                .save(UtilNotify
+                                        .saveNotify(projectRecordsAlter.getId(),
+                                                projectRecordsAlter.getCreateBy(),
+                                                projectRecordsAlter.getCompany().getId(),
+                                                title,
+                                                str,
+                                                "41",
+                                                "0",
+                                                "重新申请",
+                                                notifyRole));
+                    }
+                }
+            }
+        }
+
+        if (StringUtils.isNotBlank(title) && users!=null && users.size()!=0) {
+            List<String> userIds = new ArrayList<>(users.size());
+            for (User u : users) {
+                userIds.add(u.getId());
+            }
+            UserUtils.pushIm(userIds,title);
+        }
+        if (userList!=null && userList.size()!=0) {
+            for (User u : userList) {
+                UserUtils.pushMeIm(u.getId());
+            }
+        }
+
+        if(projectRecordsAlter.getProjectStatus()==AlterStatusEnum.SIGNED.getValue()){
+            //更新原有项目状态信息
+            ProjectRecords records = recordsService.get(projectRecordsAlter.getAlterBeforeRecords().getId());
+            recordsService.queryContractInfos(records);
+            recordsService.queryLinkmanInfos(records);
+            recordsService.queryWorkAttachment(records);
+            recordsService.queryUserNames(records);
+            ProjectRecords oldRecords = new ProjectRecords();
+            BeanUtils.copyProperties(oldRecords,records);
+            oldRecords.setId(null);
+            oldRecords.setProjectStatus(ProjectStatusEnum.INVALID.getValue());
+            recordsService.saveProject(oldRecords,ProjectStatusEnum.INVALID);
+            projectRecordsAlter.setAlterBeforeRecords(oldRecords);
+            String rid = records.getId();
+            //查询当前变更信息
+            this.queryLinkmanInfos(projectRecordsAlter);
+            this.queryUserNames(projectRecordsAlter);
+            this.queryContractInfo(projectRecordsAlter);
+            recordsService.queryWorkAttachment(records);
+            List<WorkClientAttachment> workAttachments = records.getWorkAttachments();
+            BeanUtils.copyProperties(records, projectRecordsAlter);
+            if(workAttachments!=null){
+                records.setWorkAttachments(workAttachments);
+            }
+            this.queryWorkAttachment(projectRecordsAlter);
+            if(projectRecordsAlter.getWorkAttachments()!=null){
+                if(records.getWorkAttachments()==null){
+                    records.setWorkAttachments(new ArrayList<WorkClientAttachment>());
+                }
+                for (WorkClientAttachment workClientAttachment : projectRecordsAlter.getWorkAttachments()) {
+                    workClientAttachment.setId(null);
+                    workClientAttachment.setAttachmentId(null);
+                    records.getWorkAttachments().add(workClientAttachment);
+                }
+            }
+            records.setId(rid);
+            records.setProjectStatus(ProjectStatusEnum.SIGNED.getValue());
+            records.setCreateBy(oldRecords.getCreateBy());
+            records.setCreateDate(oldRecords.getCreateDate());
+            records.preUpdate();
+            recordsService.saveProject(records,ProjectStatusEnum.SIGNED);
+        }
+        dao.updateSelectiveById(projectRecordsAlter);
+        return "保存审核意见成功!";
+
+	}
+
+	public void queryContractInfo(ProjectRecordsAlter projectRecords) {
+		WorkContractInfo workContractInfo = contractInfoService.get(projectRecords.getWorkContractInfo().getId());
+		workContractInfo.setConstructionProjectTypeStr(DictUtils.getDictLabel(String.valueOf(workContractInfo.getConstructionProjectType()), "construction_project_type", ""));
+        if(workContractInfo.getWorkClientInfoList()!=null&&!workContractInfo.getWorkClientInfoList().isEmpty()){
+            StringBuilder workClinetInfoIds = new StringBuilder();
+            for (WorkClientInfo workClientInfo : workContractInfo.getWorkClientInfoList()) {
+                workClinetInfoIds.append(workClientInfo.getId()).append(",");
+            }
+            workClinetInfoIds.deleteCharAt(workClinetInfoIds.length()-1);
+            workContractInfo.setWorkClinetInfoIds(workClinetInfoIds.toString());
+        }
+		projectRecords.setWorkContractInfo(workContractInfo);
+	}
+
+	private void notifyProjectLeaders (ProjectRecordsAlter projectRecords, User createUser, String str){
+		List<User> projectLeaders = projectRecords.getProjectLeaders();
+		for (User leader : projectLeaders) {
+			WorkProjectNotify workProjectNotify = UtilNotify
+					.saveNotify(projectRecords.getId(),
+							leader,
+							createUser.getComId(),
+							str,
+							projectRecords.getAct().getComment(),
+							"41",
+							"0",
+							"待审批",
+							"");
+			workProjectNotify.setOfficeId(createUser.getOffice().getId());
+			workProjectNotify.preInsert();
+			workProjectNotify.setCreateBy(projectRecords.getCreateBy());
+			workProjectNotifyService.insert(workProjectNotify);
+		}
+	}
+
+    /**
+     * 获取已办任务
+     * @return
+     */
+    public List<ProjectRecordsAlter> historicList(Act act){
+        String userId = UserUtils.getUser().getId();
+        HistoricTaskInstanceQuery query = historyService.createHistoricTaskInstanceQuery().finished().taskAssignee(userId);
+        // 设置查询条件
+        if (StringUtils.isNotBlank(act.getProcDefKey())){
+            query.processDefinitionKey(act.getProcDefKey());
+        }
+        if (act.getBeginDate() != null){
+            query.taskCompletedAfter(act.getBeginDate());
+        }
+        if (act.getEndDate() != null){
+            query.taskCompletedBefore(act.getEndDate());
+        }
+        // 查询总数
+        List<HistoricTaskInstance> list = query.list();
+        List<ProjectRecordsAlter> list1 = new ArrayList<ProjectRecordsAlter>();
+        Office office = UserUtils.getSelectCompany();
+        String companyId = office==null?"":office.getId();
+        for (HistoricTaskInstance histTask : list) {
+			ProjectRecordsAlter projectRecords = this.getByProcessInstanceId(histTask.getProcessInstanceId());
+            if (projectRecords != null && projectRecords.getCompany().getId().equals(companyId)) {
+                projectRecords.setCreateBy(UserUtils.get(projectRecords.getCreateBy().getId()));
+                historyService.getHistoricIdentityLinksForProcessInstance(histTask.getProcessInstanceId());
+                act.setHistTask(histTask);
+                act.setVars(histTask.getProcessVariables());
+                act.setProcDef(ProcessDefCache.get(histTask.getProcessDefinitionId()));
+                act.setStatus("finish");
+                projectRecords.setAct(act);
+                List<User> users = workProjectUserDao.queryProjectUsers(projectRecords.getId(), "1");
+                projectRecords.setProjectLeaders(users);
+                list1.add(projectRecords);
+            }
+        }
+//        workReimbursement.setPage(page);
+        return list1;
+    }
+
+    public void queryWorkAttachment(ProjectRecordsAlter projectRecords) {
+        WorkClientAttachment attchment = new WorkClientAttachment();
+        attchment.setAttachmentId(projectRecords.getId());
+        List<WorkClientAttachment> attachments = workClientAttachmentDao.findList(attchment);
+        projectRecords.setWorkAttachments(attachments);
+    }
+
+    private void saveAttachments(ProjectRecordsAlter projectRecords) {
+        if (projectRecords.getWorkAttachments()!=null && !projectRecords.getWorkAttachments().isEmpty()) {
+            //保存附件信息
+            for (WorkClientAttachment workClientAttachment : projectRecords.getWorkAttachments()) {
+                if (StringUtils.isBlank(workClientAttachment.getId())&&StringUtils.isNotBlank(workClientAttachment.getAttachmentId())) {
+                    continue;
+                }
+                if (StringUtils.isBlank(workClientAttachment.getId())&&StringUtils.isBlank(workClientAttachment.getUrl())) {
+                    continue;
+                }
+                if (WorkClientAttachment.DEL_FLAG_NORMAL.equals(workClientAttachment.getDelFlag())) {
+                    workClientAttachment.setAttachmentId(projectRecords.getId());
+                    workClientAttachment.setAttachmentFlag("82");
+                    workClientAttachment.setAttachmentUser(UserUtils.getUser().getId());
+                    if (StringUtils.isBlank(workClientAttachment.getId()) || "null".equals(workClientAttachment.getId())) {
+                        workClientAttachment.preInsert();
+                        workClientAttachmentDao.insert(workClientAttachment);
+                    } else {
+                        workClientAttachment.preUpdate();
+                        workClientAttachmentDao.update(workClientAttachment);
+                    }
+                } else {
+                    workClientAttachmentDao.delete(workClientAttachment);
+                }
+            }
+        }
+    }
+
+    public void queryProjectAlterDetail(ProjectRecordsAlter projectRecordsAlter) {
+        //设置合同信息
+        this.queryContractInfo(projectRecordsAlter);
+        //设置项目组成员
+        this.queryUserNames(projectRecordsAlter);
+        //设置委托方联系人信息
+        this.queryLinkmanInfos(projectRecordsAlter);
+        //设置附件信息
+        this.queryWorkAttachment(projectRecordsAlter);
+    }
+
+    @Transactional(readOnly = false)
+    public void cancelProcess(ProjectRecordsAlter projectRecordsAlter) {
+        WorkActivityProcess process = new WorkActivityProcess();
+        process.setProcessInstanceId(projectRecordsAlter.getProcessInstanceId());
+        process.setIsApproval("0");
+        //List<WorkActivityProcess> processList1 = workActivityProcessService.findByProcInsId(process);
+        WorkActivityProcess workActivityProcess = new WorkActivityProcess();
+        workActivityProcess.setProcessInstanceId(projectRecordsAlter.getProcessInstanceId());
+        List<WorkActivityProcess> processList = workActivityProcessService.findList(workActivityProcess);
+        WorkProjectNotify notify = new WorkProjectNotify();
+        notify.setNotifyId(projectRecordsAlter.getId());
+        List<User> userList = workProjectNotifyService.readByNotifyId(notify);
+        if (userList!=null && userList.size()!=0) {
+            for (User u : userList) {
+                User user = UserUtils.get(u.getId());
+                UserUtils.pushIm(u.getId(),"申请人 "+user.getName() +",项目登记审批:"+projectRecordsAlter.getProjectName() +" 强制撤销!");
+                /*List<WebSocket> toUserConns = ChatServerPool.getWebSocketByUser(u.getId());
+                for (WebSocket toUserConn : toUserConns) {
+                    String message = "{\"to\":\""+u.getId()+"\"," +
+                            "\"msg\":\"审批信息 申请人:"+ user.getName()+",项目登记审批:"+projectRecordsAlter.getProjectName() +" 强制撤销!\"," +
+                            "\"useType\":\"sys\"}";
+                    ChatServerPool.sendMessageToUser(toUserConn, message);//同时向本人发送消息
+                    //ChatServerPool.sendMessageToUser(toUserConn, u.getId() + "_sys_审批信息 " + "报销人:" + user.getName() + ",报销编号:" + workReimbursement.getNumber() + " 强制撤销!");//同时向本人发送消息
+                }*/
+            }
+        }
+        if(processList!=null && processList.size()>0) {
+            for (int i = 0; i < processList.size(); i++) {
+                WorkActivityProcess p = processList.get(i);
+                if (StringUtils.isNotBlank(p.getIsApproval()) && "0".equals(p.getIsApproval())) {
+                    p.setIsApproval("-1");
+                    p.setDelFlag("1");
+                    workActivityProcessDao.updateDelFlagAndIsApproval(p);
+                }
+            }
+            WorkActivityProcess pro = new WorkActivityProcess();
+            pro.setId("");
+            pro.setDelFlag("0");
+            pro.preInsert();
+            pro.setRemarks("[强制撤销]");
+            pro.setProcessKey(processList.get(0).getProcessKey());
+            pro.setIsApproval("1");
+            pro.setProcessInstanceId(processList.get(0).getProcessInstanceId());
+            pro.setCount(0);
+            workActivityProcessDao.insert(pro);
+            ProjectRecordsAlter projectRecords = new ProjectRecordsAlter();
+            projectRecords.setId(projectRecordsAlter.getId());
+            projectRecords.setProjectStatus(AlterStatusEnum.RECALL.getValue());
+            projectRecords.preUpdate();
+            this.updateSelectiveById(projectRecords);
+        }
+    }
+}

文件差异内容过多而无法显示
+ 1140 - 0
src/main/java/com/jeeplus/modules/projectrecord/service/ProjectRecordsService.java


+ 537 - 0
src/main/java/com/jeeplus/modules/projectrecord/web/ProjectRecordsAlterController.java

@@ -0,0 +1,537 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.projectrecord.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.act.entity.Act;
+import com.jeeplus.modules.act.service.ActTaskService;
+import com.jeeplus.modules.act.utils.ActUtils;
+import com.jeeplus.modules.projectrecord.entity.ProjectRecords;
+import com.jeeplus.modules.projectrecord.entity.ProjectRecordsAlter;
+import com.jeeplus.modules.projectrecord.enums.AlterStatusEnum;
+import com.jeeplus.modules.projectrecord.enums.ProjectStatusEnum;
+import com.jeeplus.modules.projectrecord.service.ProjectRecordsAlterService;
+import com.jeeplus.modules.projectrecord.service.ProjectRecordsService;
+import com.jeeplus.modules.sys.entity.Office;
+import com.jeeplus.modules.sys.entity.Role;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.utils.DictUtils;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.workactivity.entity.Activity;
+import com.jeeplus.modules.workactivity.service.ActivityService;
+import com.jeeplus.modules.workclientinfo.entity.WorkClientAttachment;
+import com.jeeplus.modules.workcontractinfo.entity.WorkContractInfo;
+import com.jeeplus.modules.workcontractinfo.service.WorkContractInfoService;
+import com.jeeplus.modules.workfullmanage.service.WorkFullRecordService;
+import com.jeeplus.modules.workprojectnotify.entity.WorkProjectNotify;
+import com.jeeplus.modules.workprojectnotify.service.WorkProjectNotifyService;
+import org.activiti.engine.runtime.ProcessInstance;
+import org.activiti.engine.task.Task;
+import org.apache.commons.beanutils.BeanUtils;
+import org.apache.shiro.authz.annotation.Logical;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.ConstraintViolationException;
+import java.lang.reflect.InvocationTargetException;
+import java.util.*;
+
+/**
+ * 项目登记Controller
+ * @author ppt
+ * @version 2018-05-02
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/project/projectRecordsAlter")
+public class ProjectRecordsAlterController extends BaseController {
+
+	@Autowired
+	private ProjectRecordsAlterService projectRecordsAlterService;
+	@Autowired
+	private ProjectRecordsService projectRecordsService;
+
+	@Autowired
+	private WorkContractInfoService contractInfoService;
+	@Autowired
+	private ActTaskService actTaskService;
+	@Autowired
+	private WorkFullRecordService workFullRecordService;
+
+	@Autowired
+	private WorkProjectNotifyService workProjectNotifyService;
+	@Autowired
+	private ActivityService activityService;
+	
+	@ModelAttribute
+	public ProjectRecordsAlter get(@RequestParam(required=false) String id) {
+		ProjectRecordsAlter entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = projectRecordsAlterService.get(id);
+		}
+		if (entity == null){
+			entity = new ProjectRecordsAlter();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 项目列表页面
+	 */
+	@RequiresPermissions("project:projectRecords:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(ProjectRecordsAlter projectRecordsAlter, HttpServletRequest request, HttpServletResponse response, Model model) {
+        if(UserUtils.isManager()){
+            model.addAttribute("flag","1");
+        }
+		Page<ProjectRecordsAlter> page = projectRecordsAlterService.findPage(new Page<ProjectRecordsAlter>(request, response), projectRecordsAlter);
+		model.addAttribute("page", page);
+		return "modules/projectrecord/projectRecordsAlterList";
+	}
+
+	/**
+	 * 查看,增加,编辑项目表单页面
+	 */
+	@RequiresPermissions(value={"project:projectRecords:add","project:projectRecords:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(ProjectRecordsAlter projectRecordsAlter, Model model,RedirectAttributes redirectAttributes) {
+        ProjectRecords projectRecords = new ProjectRecords();
+        if (projectRecordsAlter.getAlterBeforeRecords()!=null&&StringUtils.isNotBlank(projectRecordsAlter.getAlterBeforeRecords().getId())){
+            projectRecords = projectRecordsService.get(projectRecordsAlter.getAlterBeforeRecords().getId());
+            //设置详细信息
+            projectRecordsService.queryProjectDetail(projectRecords);
+        }
+		if (projectRecordsAlter!=null&&StringUtils.isNotBlank(projectRecordsAlter.getId())) {
+		    projectRecordsAlter=projectRecordsAlterService.get(projectRecordsAlter.getId());
+            projectRecordsAlter.setAlterBeforeRecords(projectRecords);
+			//设置合同信息
+            projectRecordsAlterService.queryProjectAlterDetail(projectRecordsAlter);
+		}else {
+            //判断项目状态
+            if (projectRecords.getProjectStatus()!=ProjectStatusEnum.SIGNED.getValue()){
+                addMessage(redirectAttributes, "状态异常,不能发起项目变更");
+                return "redirect:"+Global.getAdminPath()+"/project/projectRecords/?repage";
+            }
+            try {
+                BeanUtils.copyProperties(projectRecordsAlter,projectRecords);
+                projectRecordsAlter.setId(null);
+            } catch (IllegalAccessException e) {
+                e.printStackTrace();
+            } catch (InvocationTargetException e) {
+                e.printStackTrace();
+            }
+            projectRecordsAlter.setAlterBeforeRecords(projectRecords);
+            if(projectRecordsAlter.getWorkAttachments()!=null)projectRecordsAlter.setWorkAttachments(new ArrayList<WorkClientAttachment>());
+            projectRecordsAlter.setCreateBy(UserUtils.getUser());
+            projectRecordsAlter.setCreateDate(new Date());
+		}
+		model.addAttribute("projectRecordsAlter", projectRecordsAlter);
+		return "modules/projectrecord/projectRecordsAlterForm";
+	}
+
+    /**
+	 * 编辑项目表单页面
+	 */
+	@RequiresPermissions(value={"project:projectRecords:edit"},logical=Logical.OR)
+	@RequestMapping(value = "modify")
+	public String modify(ProjectRecordsAlter projectRecordsAlter, Model model,RedirectAttributes redirectAttributes) {
+	    if(StringUtils.isBlank(projectRecordsAlter.getId())){
+            projectRecordsAlter = projectRecordsAlterService.getByProcessInstanceId(projectRecordsAlter.getAct().getProcInsId());
+            projectRecordsAlterService.queryProjectAlterDetail(projectRecordsAlter);
+        }
+        ProjectRecords projectRecords = new ProjectRecords();
+        if (projectRecordsAlter.getAlterBeforeRecords()!=null&&StringUtils.isNotBlank(projectRecordsAlter.getAlterBeforeRecords().getId())){
+            projectRecords = projectRecordsService.get(projectRecordsAlter.getAlterBeforeRecords().getId());
+            //设置项目组成员
+            projectRecordsService.queryUserNames(projectRecords);
+            projectRecordsAlter.setAlterBeforeRecords(projectRecords);
+        }
+        projectRecordsAlter=projectRecordsAlterService.get(projectRecordsAlter.getId());
+        ProcessInstance processInstance = actTaskService.getProcIns(projectRecordsAlter.getProcessInstanceId());
+        if (processInstance!=null) {
+            Task taskInfok = actTaskService.getCurrentTaskInfo(processInstance);
+            Act act = new Act();
+            act.setTaskId(taskInfok.getId());
+            act.setTaskName(taskInfok.getName());
+            act.setTaskDefKey(taskInfok.getTaskDefinitionKey());
+            act.setProcDefId(taskInfok.getProcessDefinitionId());
+            act.setProcInsId(taskInfok.getProcessInstanceId());
+            act.setTask(taskInfok);
+            projectRecordsAlter.setAct(act);
+        }
+
+        projectRecordsAlter.setAlterBeforeRecords(projectRecords);
+        //设置合同信息
+        projectRecordsAlterService.queryProjectAlterDetail(projectRecordsAlter);
+		model.addAttribute("projectRecordsAlter", projectRecordsAlter);
+		return "modules/projectrecord/projectRecordsAlterModify";
+	}
+
+	/**
+	 * 查看
+	 * @param projectRecordsAlter
+	 * @param model
+	 * @return
+	 */
+	@RequiresPermissions(value={"project:projectRecords:view"})
+	@RequestMapping(value = "view")
+	public String view(ProjectRecordsAlter projectRecordsAlter, Model model) {
+	    ProjectRecords projectRecords = null;
+        if (projectRecordsAlter.getAlterBeforeRecords()!=null&&StringUtils.isNotBlank(projectRecordsAlter.getAlterBeforeRecords().getId())){
+            projectRecords = projectRecordsService.get(projectRecordsAlter.getAlterBeforeRecords().getId());
+            //设置详细信息
+            projectRecordsService.queryProjectDetail(projectRecords);
+            projectRecordsAlter.setAlterBeforeRecords(projectRecords);
+        }
+		if (projectRecords!=null&&StringUtils.isNotBlank(projectRecords.getId())) {
+			//设置合同信息
+            projectRecordsAlterService.queryProjectAlterDetail(projectRecordsAlter);
+		}
+		model.addAttribute("projectRecordsAlter", projectRecordsAlter);
+		return "modules/projectrecord/projectRecordsAlterView";
+	}
+
+	/**
+	 * 保存项目
+	 */
+	@RequiresPermissions(value={"project:projectRecords:add","project:projectRecords:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	public String save(ProjectRecordsAlter projectRecords, Model model, RedirectAttributes redirectAttributes) {
+		if (!beanValidator(model, projectRecords)){
+			return form(projectRecords, model,redirectAttributes);
+		}
+        try {
+            if(!projectRecords.getIsNewRecord()){//编辑表单保存
+                ProjectRecordsAlter t = projectRecordsAlterService.get(projectRecords.getId());//从数据库取出记录的值
+                MyBeanUtils.copyBeanNotNull2Bean(projectRecords, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+                projectRecordsAlterService.saveProject(t, AlterStatusEnum.IN_APRL);//保存
+            }else{//新增表单保存
+                projectRecordsAlterService.saveProject(projectRecords,AlterStatusEnum.IN_APRL);//保存
+            }
+            addMessage(model,"保存项目变更成功");
+        } catch (Exception e) {
+            logger.error("保存项目变更异常:",e);
+            addMessage(model,"保存项目变更异常:"+e.getMessage());
+        }
+		return "redirect:"+Global.getAdminPath()+"/project/projectRecordsAlter/?repage";
+	}
+
+	/**
+	 * 保存项目
+	 */
+	@RequiresPermissions(value={"project:projectRecords:add","project:projectRecords:edit"},logical=Logical.OR)
+	@RequestMapping(value = "tstore")
+	public String tStore(ProjectRecordsAlter projectRecords, Model model, RedirectAttributes redirectAttributes) throws Exception{
+		if (!beanValidator(model, projectRecords)){
+			return form(projectRecords, model,redirectAttributes);
+		}
+        try {
+            if(!projectRecords.getIsNewRecord()){//编辑表单保存
+                ProjectRecordsAlter t = projectRecordsAlterService.get(projectRecords.getId());//从数据库取出记录的值
+                MyBeanUtils.copyBeanNotNull2Bean(projectRecords, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+                projectRecordsAlterService.saveProject(t,AlterStatusEnum.TSTORE);//保存
+            }else{//新增表单保存
+                projectRecordsAlterService.saveProject(projectRecords,AlterStatusEnum.TSTORE);//保存
+            }
+            addMessage(model,"暂存项目变更成功");
+        } catch (Exception e) {
+            logger.error("暂存项目变更异常:",e);
+            addMessage(model,"暂存项目变更异常:"+e.getMessage());
+        }
+		return "redirect:"+Global.getAdminPath()+"/project/projectRecordsAlter/?repage";
+	}
+	
+	/**
+	 * 删除项目
+	 */
+	@RequiresPermissions("project:projectRecords:del")
+	@RequestMapping(value = "delete")
+	public String delete(ProjectRecordsAlter projectRecords, RedirectAttributes redirectAttributes) {
+		int status = projectRecords.getProjectStatus();
+		if(status==AlterStatusEnum.TSTORE.getValue()||status==AlterStatusEnum.REJECTED.getValue()||status==AlterStatusEnum.RECALL.getValue()){
+			projectRecordsAlterService.delete(projectRecords);
+			addMessage(redirectAttributes, "删除项目变更记录成功");
+			return "redirect:"+Global.getAdminPath()+"/project/projectRecords/?repage";
+		}else {
+			addMessage(redirectAttributes, "删除项目变更记录失败,只有“暂存”、“驳回”、“撤回”状态的项目才能删除");
+		}
+		return "redirect:"+Global.getAdminPath()+"/project/projectRecordsAlter/?repage";
+	}
+	
+	/**
+	 * 批量删除项目
+	 */
+	@RequiresPermissions("project:projectRecords:del")
+	@RequestMapping(value = "deleteAll")
+	public String deleteAll(String ids, RedirectAttributes redirectAttributes) {
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			projectRecordsAlterService.delete(projectRecordsAlterService.get(id));
+		}
+		addMessage(redirectAttributes, "删除项目成功");
+		return "redirect:"+Global.getAdminPath()+"/project/projectRecordsAlter/?repage";
+	}
+	
+	/**
+	 * 导出excel文件
+	 */
+	@RequiresPermissions("project:projectRecords:export")
+    @RequestMapping(value = "export", method=RequestMethod.POST)
+    public String exportFile(ProjectRecordsAlter projectRecords, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "项目"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            Page<ProjectRecordsAlter> page = projectRecordsAlterService.findPage(new Page<ProjectRecordsAlter>(request, response, -1), projectRecords);
+    		new ExportExcel("项目", ProjectRecords.class).setDataList(page.getList()).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导出项目记录失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/project/projectRecordsAlter/?repage";
+    }
+
+	/**
+	 * 导入Excel数据
+
+	 */
+	@RequiresPermissions("project:projectRecords: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<ProjectRecordsAlter> list = ei.getDataList(ProjectRecordsAlter.class);
+			for (ProjectRecordsAlter projectRecords : list){
+				try{
+					projectRecordsAlterService.save(projectRecords);
+					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()+"/project/projectRecordsAlter/?repage";
+    }
+	
+	/**
+	 * 下载导入项目数据模板
+	 */
+	@RequiresPermissions("project:projectRecords:import")
+    @RequestMapping(value = "import/template")
+    public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "项目数据导入模板.xlsx";
+    		List<ProjectRecordsAlter> list = Lists.newArrayList();
+    		new ExportExcel("项目数据", ProjectRecordsAlter.class, 1).setDataList(list).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入模板下载失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/project/projectRecordsAlter/?repage";
+    }
+	
+	
+	
+	@RequestMapping("getContractInfo")
+	@ResponseBody
+	public WorkContractInfo queryContractInfo(WorkContractInfo  contractInfo){
+		WorkContractInfo workContractInfo = contractInfoService.get(contractInfo.getId());
+		workContractInfo.setConstructionProjectTypeStr(DictUtils.getDictLabel(String.valueOf(workContractInfo.getConstructionProjectType()),"construction_project_type",""));
+		return  workContractInfo;
+	}
+
+	//	审批页面
+	@RequestMapping(value = "projectRecordsAudit")
+	public String projectRecordsAudit(Act act, ProjectRecordsAlter projectRecordsAlter, Model model) {
+		projectRecordsAlter = projectRecordsAlterService.getByProcessInstanceId(act.getProcInsId());
+        ProjectRecords projectRecords = null;
+        if (projectRecordsAlter.getAlterBeforeRecords()!=null&&StringUtils.isNotBlank(projectRecordsAlter.getAlterBeforeRecords().getId())){
+            projectRecords = projectRecordsService.get(projectRecordsAlter.getAlterBeforeRecords().getId());
+            //设置详细信息
+            projectRecordsService.queryProjectDetail(projectRecords);
+            projectRecordsAlter.setAlterBeforeRecords(projectRecords);
+        }
+		if (act.getProcInsId() != null) {
+			if (actTaskService.getProcIns(act.getProcInsId()) != null) {
+				act.setProcIns(actTaskService.getProcIns(act.getProcInsId()));
+			} else {
+				act.setFinishedProcIns(actTaskService.getFinishedProcIns(act.getProcInsId()));
+			}
+		}
+		if (act != null && StringUtils.isNotBlank(act.getTaskId())) {
+			projectRecordsAlter.setAct(act);
+			model.addAttribute("processInstanceId", projectRecordsAlter.getProcessInstanceId());
+		}
+		if (projectRecordsAlter!=null&&StringUtils.isNotBlank(projectRecordsAlter.getId())) {
+            projectRecordsAlterService.queryProjectAlterDetail(projectRecordsAlter);
+
+        }
+		model.addAttribute("projectRecordsAlter", projectRecordsAlter);
+		return "modules/projectrecord/projectRecordsAlterAudit";
+	}
+
+    @RequestMapping(value = "getProcess")
+	public String getProcess(ProjectRecordsAlter projectRecords, Model model,HttpServletRequest request){
+		model.addAttribute("processInstanceId", projectRecords.getProcessInstanceId());
+		return "modules/projectrecord/projectRecordsTask";
+	}
+
+	@RequestMapping(value = "revoke")
+	public String revoke(HttpServletRequest request, RedirectAttributes redirectAttributes) {
+		HashMap<String, String> requestMap = findRequestMap(request);
+		String processInstanceId = requestMap.get("processInstanceId");
+		String id = requestMap.get("id");
+		try {
+            ProjectRecordsAlter projectRecordsAlter = projectRecordsAlterService.get(id);
+            if(5==projectRecordsAlter.getProjectStatus()){
+                addMessage(redirectAttributes, "项目变更已审批通过,无法撤回");
+                return "redirect:"+Global.getAdminPath()+"/project/projectRecordsAlter/?repage";
+            }
+            projectRecordsAlterService.cancelProcess(projectRecordsAlter);
+			addMessage(redirectAttributes, "撤回该项目变更成功");
+		}catch (Exception e){
+			logger.info(e.getMessage());
+			addMessage(redirectAttributes, "撤回项目变更失败");
+		}
+		return "redirect:" + Global.getAdminPath() + "/project/projectRecordsAlter/?repage";
+	}
+
+	/**
+	 * 查询待办任务
+	 *
+	 * @param act
+	 * @param model
+	 * @return
+	 */
+	@RequestMapping("/toDoList")
+	public String queryToList(Act act, Model model) {
+
+		//合同申请流程
+		act.setProcDefKey(ActUtils.PD_PROJECTRECORD[0]);
+		List<Act> list = actTaskService.todoList(act);
+		Office office = UserUtils.getSelectCompany();
+		String companyId = office==null?"":office.getId();
+		List<Activity> activities = activityService.groupByActivityMenu("7854872f45b84acd893010e66a3db2c8",companyId);
+		for (Activity activity:activities){
+			act.setProcDefKey(activity.getProcessKey());
+			list.addAll(actTaskService.todoList(act));
+		}
+
+		Role role = UserUtils.getSelectRole().get(0);
+		List<ProjectRecordsAlter> lists = new ArrayList<ProjectRecordsAlter>();
+		for (Act a : list) {
+			if (a.getTask().getTaskDefinitionKey()!=null && !"modifyApply".equals(a.getTask().getTaskDefinitionKey())) {
+				ProjectRecordsAlter projectRecords = projectRecordsAlterService.getByProcessInstanceId(a.getProcInsId());
+				if (projectRecords==null){continue;}
+				projectRecords.setAuditType("项目登记");
+				if(projectRecords.getProjectStatus()!= AlterStatusEnum.RECALL.getValue()) {
+					User user1 = UserUtils.get(projectRecords.getCreateBy().getId());
+					if (projectRecords != null && user1.getCompany().getId().equals(companyId)) {
+						projectRecords.setCreateBy(user1);
+						if (a.getVars().getMap().get("applyUserId") != null) {
+							User user = UserUtils.get(a.getVars().getMap().get("applyUserId").toString());
+							if (user != null) {
+								a.getVars().getMap().put("applyUserId", UserUtils.get(a.getVars().getMap().get("applyUserId").toString()).getName());
+							}
+						}
+						projectRecords.setAct(a);
+						lists.add(projectRecords);
+					}
+				}
+			}
+		}
+
+		//排除 重新申请|撤销
+		Iterator<ProjectRecordsAlter> it = lists.iterator();
+		while(it.hasNext()){
+			ProjectRecordsAlter w = it.next();
+			if(w.getAct()!=null && w.getAct().getTaskDefKey().equals("reapply")){
+				it.remove();
+			}
+		}
+
+		model.addAttribute("list", lists);
+		return "modules/projectrecord/projectRecordsToDoList";
+	}
+
+	/**
+	 * 审批
+	 * @param projectRecords
+	 * @param model
+	 * @param upload_files
+	 * @param redirectAttributes
+	 * @return
+	 */
+	@RequestMapping("saveAudit")
+	public String saveAudit(ProjectRecordsAlter projectRecords, Model model,
+							@RequestParam(value = "upload_files", required = false) MultipartFile[] upload_files,
+							RedirectAttributes redirectAttributes) {
+		String home = projectRecords.getHome();
+		try {
+			String taskDefKey = projectRecords.getAct().getTaskDefKey();
+			//当状态为未通过时,重新修改数据
+			if ("modifyApply".equals(taskDefKey)) {
+				projectRecords.getAct().setComment("重新申请");
+			}
+			List<User> users = UserUtils.getByProssType(projectRecords.getProcessInstanceId(),1);
+			String flag = projectRecords.getAct().getFlag();
+			if ("yes".equals(flag) && (users==null || users.size()==0)){
+				addMessage(redirectAttributes, "审批失败,审批人为空,请联系管理员!");
+			}else {
+				String str = projectRecordsAlterService.auditSave(projectRecords,users);
+				addMessage(redirectAttributes, str);
+			}
+		}catch (Exception e){
+			addMessage(redirectAttributes, "审批失败:"+e);
+		}
+
+        if (StringUtils.isNotBlank(home) && "home".equals(home)){
+            return "redirect:" + Global.getAdminPath() + "/home/?repage";
+        }else {
+            return "redirect:" + Global.getAdminPath() + "/project/projectRecordsAlter/?repage";
+        }
+	}
+
+	/**
+	 * 查询已办列表
+	 * @return
+	 */
+	@RequestMapping("/queryCompleteList")
+	public String queryCompleteList(Act act,HttpServletRequest request,HttpServletResponse response,Model model){
+		act.setProcDefKey("projectAudit");
+		List<ProjectRecordsAlter> list = projectRecordsAlterService.historicList(act);
+		Office office = UserUtils.getSelectCompany();
+		String companyId = office==null?"":office.getId();
+		List<Activity> activities = activityService.groupByActivityMenu("ggh3125f1f194c82bdea93555c750906",companyId);
+		for (Activity activity:activities){
+			act.setProcDefKey(activity.getProcessKey());
+			list.addAll(projectRecordsAlterService.historicList(act));
+		}
+		model.addAttribute("list",list);
+		return "modules/projectrecord/projectRecordsHistoricList";
+	}
+}

+ 642 - 0
src/main/java/com/jeeplus/modules/projectrecord/web/ProjectRecordsController.java

@@ -0,0 +1,642 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.projectrecord.web;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.oss.OSSClientUtil;
+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.web.BaseController;
+import com.jeeplus.modules.act.entity.Act;
+import com.jeeplus.modules.act.service.ActTaskService;
+import com.jeeplus.modules.act.utils.ActUtils;
+import com.jeeplus.modules.projectrecord.entity.ProjectRecords;
+import com.jeeplus.modules.projectrecord.enums.ProjectStatusEnum;
+import com.jeeplus.modules.projectrecord.service.ProjectRecordsService;
+import com.jeeplus.modules.sys.entity.Office;
+import com.jeeplus.modules.sys.entity.Role;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.utils.DictUtils;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.workactivity.entity.Activity;
+import com.jeeplus.modules.workactivity.service.ActivityService;
+import com.jeeplus.modules.workclientinfo.entity.WorkClientInfo;
+import com.jeeplus.modules.workclientinfo.entity.WorkClientLinkman;
+import com.jeeplus.modules.workclientinfo.service.WorkClientInfoService;
+import com.jeeplus.modules.workcontractinfo.entity.WorkContractInfo;
+import com.jeeplus.modules.workcontractinfo.service.WorkContractInfoService;
+import com.jeeplus.modules.workprojectnotify.entity.WorkProjectNotify;
+import com.jeeplus.modules.workprojectnotify.service.WorkProjectNotifyService;
+import org.activiti.engine.runtime.ProcessInstance;
+import org.activiti.engine.task.Task;
+import org.apache.shiro.authz.annotation.Logical;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+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 java.io.*;
+import java.net.HttpURLConnection;
+import java.net.URLConnection;
+import java.net.URLDecoder;
+import java.util.*;
+
+/**
+ * 项目登记Controller
+ * @author ppt
+ * @version 2018-05-02
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/project/projectRecords")
+public class ProjectRecordsController extends BaseController {
+
+    @Autowired
+    private WorkClientInfoService workClientInfoService;
+
+	@Autowired
+	private ProjectRecordsService projectRecordsService;
+
+	@Autowired
+	private WorkContractInfoService contractInfoService;
+	@Autowired
+	private ActTaskService actTaskService;
+	@Autowired
+	private ActivityService activityService;
+
+	private static String template_path = Global.getProjectTemplatePath()+"咨询工作方案.xlsx";
+	private static String template_name = "咨询工作方案.xlsx";
+
+	@ModelAttribute
+	public ProjectRecords get(@RequestParam(required=false) String id) {
+		ProjectRecords entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = projectRecordsService.get(id);
+		}
+		if (entity == null){
+			entity = new ProjectRecords();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 项目列表页面
+	 */
+	@RequiresPermissions("project:projectRecords:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(ProjectRecords projectRecords, HttpServletRequest request, HttpServletResponse response, Model model) {
+        if(UserUtils.isManager()){
+            model.addAttribute("flag","1");
+        }
+		Page<ProjectRecords> page = projectRecordsService.findPage(new Page<ProjectRecords>(request, response), projectRecords);
+        //无合同状态下,获取委托方的名称
+		List<ProjectRecords> list = page.getList();
+		for (int i = 0; i < list.size(); i++) {
+			ProjectRecords records1 = list.get(i);
+			if (records1.getWorkContractInfo() == null) {
+				projectRecordsService.queryLinkmanInfos(records1);
+				if (records1.getWorkClientLinkmanList() != null && records1.getWorkClientLinkmanList().size() > 0) {
+					WorkClientLinkman linkman = records1.getWorkClientLinkmanList().get(0);
+					WorkContractInfo contractInfo = new WorkContractInfo();
+					contractInfo.setClient(linkman.getClientId());
+					records1.setWorkContractInfo(contractInfo);
+				}
+			}
+		}
+		model.addAttribute("page", page);
+		return "modules/projectrecord/projectRecordsList";
+	}
+
+	/**
+	 * 查看,增加,编辑项目表单页面
+	 */
+	@RequiresPermissions(value={"project:projectRecords:add","project:projectRecords:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(ProjectRecords projectRecords, Model model) {
+		if (projectRecords!=null&&StringUtils.isNotBlank(projectRecords.getId())) {
+			projectRecords = projectRecordsService.get(projectRecords.getId());
+            projectRecordsService.queryProjectDetail(projectRecords);
+		}else {
+		    projectRecords.setCreateBy(UserUtils.getUser());
+		    projectRecords.setCreateDate(new Date());
+        }
+		model.addAttribute("projectRecords", projectRecords);
+		return "modules/projectrecord/projectRecordsForm";
+	}
+
+	/**
+	 * 查看
+	 * @param projectRecords
+	 * @param model
+	 * @return
+	 */
+	@RequiresPermissions(value={"project:projectRecords:view"})
+	@RequestMapping(value = "view")
+	public String view(ProjectRecords projectRecords, Model model) {
+		if (projectRecords!=null&&StringUtils.isNotBlank(projectRecords.getId())) {
+			projectRecordsService.queryProjectDetail(projectRecords);
+		}
+		model.addAttribute("projectRecords", projectRecords);
+		return "modules/projectrecord/projectRecordsView";
+	}
+
+	/**
+	 * 保存项目
+	 */
+	@RequiresPermissions(value={"project:projectRecords:add","project:projectRecords:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	public String save(ProjectRecords projectRecords, Model model, RedirectAttributes redirectAttributes) {
+		if (!beanValidator(model, projectRecords)){
+			return form(projectRecords, model);
+		}
+		try {
+//            projectRecords.setProjectStatus(ProjectStatusEnum.IN_APRL.getValue());
+            if (!projectRecords.getIsNewRecord()) {//编辑表单保存
+                ProjectRecords t = projectRecordsService.get(projectRecords.getId());//从数据库取出记录的值
+                MyBeanUtils.copyBeanNotNull2Bean(projectRecords, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+                projectRecordsService.saveProject(t,ProjectStatusEnum.IN_APRL);//保存
+            } else {//新增表单保存
+                projectRecordsService.saveProject(projectRecords,ProjectStatusEnum.IN_APRL);//保存
+            }
+			addMessage(redirectAttributes, "保存项目成功");
+        }catch (Exception e){
+		    logger.error("保存项目异常:",e);
+            addMessage(redirectAttributes, "保存项目异常:"+e.getMessage());
+        }
+		return "redirect:"+Global.getAdminPath()+"/project/projectRecords/?repage";
+	}
+	/**
+	 * 保存项目
+	 */
+	@RequiresPermissions(value={"project:projectRecords:add","project:projectRecords:edit"},logical=Logical.OR)
+	@RequestMapping(value = "tstore")
+	public String tStore(ProjectRecords projectRecords, Model model, RedirectAttributes redirectAttributes) throws Exception{
+		if (!beanValidator(model, projectRecords)){
+			return form(projectRecords, model);
+		}
+		try {
+//            projectRecords.setProjectStatus(ProjectStatusEnum.TSTORE.getValue());
+            if (!projectRecords.getIsNewRecord()) {//编辑表单保存
+                ProjectRecords t = projectRecordsService.get(projectRecords.getId());//从数据库取出记录的值
+                MyBeanUtils.copyBeanNotNull2Bean(projectRecords, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+                projectRecordsService.saveProject(t,ProjectStatusEnum.TSTORE);//保存
+            } else {//新增表单保存
+                projectRecordsService.saveProject(projectRecords,ProjectStatusEnum.TSTORE);//保存
+            }
+            addMessage(redirectAttributes, "暂存项目成功");
+        }catch (Exception e){
+            logger.error("暂存项目异常:",e);
+            addMessage(redirectAttributes, "暂存项目异常:"+e.getMessage());
+        }
+		return "redirect:"+Global.getAdminPath()+"/project/projectRecords/?repage";
+	}
+
+    /**
+     * 编辑项目表单页面
+     */
+    @RequiresPermissions(value={"project:projectRecords:edit"},logical=Logical.OR)
+    @RequestMapping(value = "modify")
+    public String modify(ProjectRecords projectRecords, Model model,RedirectAttributes redirectAttributes) {
+        projectRecords=projectRecordsService.get(projectRecords.getId());
+        ProcessInstance processInstance = actTaskService.getProcIns(projectRecords.getProcessInstanceId());
+        if (processInstance!=null) {
+            Task taskInfok = actTaskService.getCurrentTaskInfo(processInstance);
+            Act act = new Act();
+            act.setTaskId(taskInfok.getId());
+            act.setTaskName(taskInfok.getName());
+            act.setTaskDefKey(taskInfok.getTaskDefinitionKey());
+            act.setProcDefId(taskInfok.getProcessDefinitionId());
+            act.setProcInsId(taskInfok.getProcessInstanceId());
+            act.setTask(taskInfok);
+            projectRecords.setAct(act);
+        }
+
+        projectRecordsService.queryProjectDetail(projectRecords);
+        model.addAttribute("projectRecords", projectRecords);
+        return "modules/projectrecord/projectRecordsModify";
+    }
+
+	/**
+	 * 删除项目
+	 */
+	@RequiresPermissions("project:projectRecords:del")
+	@RequestMapping(value = "delete")
+	public String delete(ProjectRecords projectRecords, RedirectAttributes redirectAttributes) {
+		int status = projectRecords.getProjectStatus();
+		if(status==ProjectStatusEnum.TSTORE.getValue()||status==ProjectStatusEnum.REJECTED.getValue()||status==ProjectStatusEnum.RECALL.getValue()){
+			projectRecordsService.delete(projectRecords);
+			addMessage(redirectAttributes, "删除项目成功");
+			return "redirect:"+Global.getAdminPath()+"/project/projectRecords/?repage";
+		}else {
+			addMessage(redirectAttributes, "删除项目失败,只有“暂存”、“驳回”、“撤回”状态的项目才能删除");
+		}
+		return "redirect:"+Global.getAdminPath()+"/project/projectRecords/?repage";
+	}
+	
+	/**
+	 * 批量删除项目
+	 */
+	@RequiresPermissions("project:projectRecords:del")
+	@RequestMapping(value = "deleteAll")
+	public String deleteAll(String ids, RedirectAttributes redirectAttributes) {
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			projectRecordsService.delete(projectRecordsService.get(id));
+		}
+		addMessage(redirectAttributes, "删除项目成功");
+		return "redirect:"+Global.getAdminPath()+"/project/projectRecords/?repage";
+	}
+	
+	/**
+	 * 导出excel文件
+	 */
+	@RequiresPermissions("project:projectRecords:export")
+    @RequestMapping(value = "export", method=RequestMethod.POST)
+    public String exportFile(ProjectRecords projectRecords, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "项目"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            Page<ProjectRecords> page = projectRecordsService.findPage(new Page<ProjectRecords>(request, response, -1), projectRecords);
+    		new ExportExcel("项目", ProjectRecords.class).setDataList(page.getList()).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导出项目记录失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/project/projectRecords/?repage";
+    }
+
+	/**
+	 * 下载导入项目数据模板
+	 */
+	@RequiresPermissions("project:projectRecords:import")
+    @RequestMapping(value = "import/template")
+    public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "项目数据导入模板.xlsx";
+    		List<ProjectRecords> list = Lists.newArrayList(); 
+    		new ExportExcel("项目数据", ProjectRecords.class, 1).setDataList(list).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入模板下载失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/project/projectRecords/?repage";
+    }
+	
+	
+	
+	@RequestMapping("getContractInfo")
+	@ResponseBody
+	public WorkContractInfo queryContractInfo(WorkContractInfo  contractInfo){
+		WorkContractInfo workContractInfo = contractInfoService.get(contractInfo.getId());
+		if(workContractInfo==null){
+		    return workContractInfo;
+        }
+		workContractInfo.setConstructionProjectTypeStr(DictUtils.getDictLabel(String.valueOf(workContractInfo.getConstructionProjectType()),"construction_project_type",""));
+		if(workContractInfo.getWorkClientInfoList()!=null&&!workContractInfo.getWorkClientInfoList().isEmpty()){
+            StringBuilder workClinetInfoIds = new StringBuilder();
+            for (WorkClientInfo workClientInfo : workContractInfo.getWorkClientInfoList()) {
+                workClinetInfoIds.append(workClientInfo.getId()).append(",");
+			}
+            workClinetInfoIds.deleteCharAt(workClinetInfoIds.length()-1);
+            workContractInfo.setWorkClinetInfoIds(workClinetInfoIds.toString());
+        }
+		return  workContractInfo;
+	}
+
+	//	审批页面
+	@RequestMapping(value = "projectRecordsAudit")
+	public String workContractInfoAudit(Act act, ProjectRecords projectRecords, Model model) {
+
+		if (act.getProcInsId() != null) {
+			if (actTaskService.getProcIns(act.getProcInsId()) != null) {
+				act.setProcIns(actTaskService.getProcIns(act.getProcInsId()));
+			} else {
+				act.setFinishedProcIns(actTaskService.getFinishedProcIns(act.getProcInsId()));
+			}
+		}
+		if (act != null && StringUtils.isNotBlank(act.getTaskId())) {
+			projectRecords.setAct(act);
+			model.addAttribute("processInstanceId", projectRecords.getProcessInstanceId());
+		}
+		if (projectRecords!=null&&StringUtils.isNotBlank(projectRecords.getId())) {
+            projectRecordsService.queryProjectDetail(projectRecords);
+		}
+		model.addAttribute("projectRecords", projectRecords);
+		return "modules/projectrecord/projectRecordsAudit";
+	}
+
+	@RequestMapping(value = "getProcess")
+	public String getProcess(ProjectRecords projectRecords, Model model,HttpServletRequest request){
+		model.addAttribute("processInstanceId", projectRecords.getProcessInstanceId());
+		return "modules/projectrecord/projectRecordsTask";
+	}
+
+	@RequestMapping(value = "revoke")
+	public String revoke(HttpServletRequest request, RedirectAttributes redirectAttributes) {
+		HashMap<String, String> requestMap = findRequestMap(request);
+		String processInstanceId = requestMap.get("processInstanceId");
+		String id = requestMap.get("id");
+		try {
+            ProjectRecords projectRecords = projectRecordsService.get(id);
+            if(5==projectRecords.getProjectStatus()){
+                addMessage(redirectAttributes, "项目登记已审批通过,无法撤回");
+                return "redirect:"+Global.getAdminPath()+"/project/projectRecords/?repage";
+            }
+            projectRecordsService.cancelProcess(projectRecords);
+			addMessage(redirectAttributes, "撤回该项目登记成功");
+		}catch (Exception e){
+			logger.info(e.getMessage());
+			addMessage(redirectAttributes, "撤回该项目登记失败");
+		}
+		return "redirect:" + Global.getAdminPath() + "/project/projectRecords/?repage";
+	}
+
+	/**
+	 * 查询待办任务
+	 *
+	 * @param act
+	 * @param model
+	 * @return
+	 */
+	@RequestMapping("/toDoList")
+	public String queryToList(Act act, Model model) {
+
+		//合同申请流程
+		act.setProcDefKey(ActUtils.PD_PROJECTRECORD[0]);
+		List<Act> list = actTaskService.todoList(act);
+		Office office = UserUtils.getSelectCompany();
+		String companyId = office==null?"":office.getId();
+		List<Activity> activities = activityService.groupByActivityMenu("7854872f45b84acd893010e66a3db2c8",companyId);
+		for (Activity activity:activities){
+			act.setProcDefKey(activity.getProcessKey());
+			list.addAll(actTaskService.todoList(act));
+		}
+
+		Role role = UserUtils.getSelectRole().get(0);
+		List<ProjectRecords> lists = new ArrayList<ProjectRecords>();
+		for (Act a : list) {
+			if (a.getTask().getTaskDefinitionKey()!=null) {
+				ProjectRecords projectRecords = projectRecordsService.getByProcessInstanceId(a.getProcInsId());
+				if (projectRecords==null){continue;}
+				projectRecordsService.queryContractInfos(projectRecords);
+				projectRecords.setAuditType("项目登记");
+				if(projectRecords.getProjectStatus()!= ProjectStatusEnum.RECALL.getValue()) {
+					User user1 = UserUtils.get(projectRecords.getCreateBy().getId());
+					if (projectRecords != null && user1.getCompany().getId().equals(companyId)) {
+						projectRecords.setCreateBy(user1);
+						if (a.getVars().getMap().get("applyUserId") != null) {
+							User user = UserUtils.get(a.getVars().getMap().get("applyUserId").toString());
+							if (user != null) {
+								a.getVars().getMap().put("applyUserId", UserUtils.get(a.getVars().getMap().get("applyUserId").toString()).getName());
+							}
+						}
+						projectRecords.setAct(a);
+						lists.add(projectRecords);
+					}
+				}
+			}
+		}
+
+		/*------变更--------*/
+		act.setProcDefKey("projectAlter");
+		List<Act> list3 = actTaskService.todoList(act);
+		Office office3 = UserUtils.getSelectCompany();
+		String companyId3 = office3==null?"":office3.getId();
+		List<Activity> activities3 = activityService.groupByActivityMenu("807c6d4b5623474792fe78ff1fd1cdff",companyId3);
+		for (Activity activity:activities3){
+			act.setProcDefKey(activity.getProcessKey());
+			list3.addAll(actTaskService.todoList(act));
+		}
+
+		for (Act a : list3) {
+			ProjectRecords projectRecords = projectRecordsService.getByAlterProcessInstanceId(a.getTask().getProcessInstanceId());
+			if (projectRecords!=null){
+				projectRecordsService.queryContractInfos(projectRecords);
+			}
+			if (projectRecords != null && projectRecords.getCompany().getId().equals(companyId3)&& projectRecords.getProjectStatus()==ProjectStatusEnum.ON_CHANGE.getValue()) {
+				if (a.getVars().getMap().get("applyUserId") != null) {
+					User user = UserUtils.get(a.getVars().getMap().get("applyUserId").toString());
+					if (user != null) {
+						a.getVars().getMap().put("applyUserId", UserUtils.get(a.getVars().getMap().get("applyUserId").toString()).getName());
+					}
+				}
+				projectRecords.setAct(a);
+				projectRecords.setAuditType("项目变更");
+				lists.add(projectRecords);
+			}
+		}
+
+		//排除 重新申请|撤销
+		Iterator<ProjectRecords> it = lists.iterator();
+		while(it.hasNext()){
+			ProjectRecords w = it.next();
+			if(w.getAct()!=null && w.getAct().getTaskDefKey().equals("reapply")){
+				it.remove();
+			}
+		}
+
+		model.addAttribute("list", lists);
+		return "modules/projectrecord/projectRecordsToDoList";
+	}
+
+	/**
+	 * 审批
+	 * @param projectRecords
+	 * @param model
+	 * @param upload_files
+	 * @param redirectAttributes
+	 * @return
+	 */
+	@RequestMapping("saveAudit")
+	public String saveAudit(ProjectRecords projectRecords, Model model,
+							@RequestParam(value = "upload_files", required = false) MultipartFile[] upload_files,
+							RedirectAttributes redirectAttributes)  {
+		String home = projectRecords.getHome();
+		try {
+			String taskDefKey = projectRecords.getAct().getTaskDefKey();
+			//当状态为未通过时,重新修改数据
+			if ("modifyApply".equals(taskDefKey)) {
+				projectRecords.getAct().setComment("重新申请");
+			}
+			List<User> users = UserUtils.getByProssType(projectRecords.getProcessInstanceId(),1);
+			String flag = projectRecords.getAct().getFlag();
+			if ("yes".equals(flag) && (users==null || users.size()==0)){
+				addMessage(redirectAttributes, "审批失败,审批人为空,请联系管理员!");
+			}else {
+				String str = projectRecordsService.auditSave(projectRecords,users);
+				addMessage(redirectAttributes, str);
+			}
+		}catch (Exception e){
+			addMessage(redirectAttributes, "项目登记流程审批失败");
+		}
+
+        if (StringUtils.isNotBlank(home) && "home".equals(home)){
+            return "redirect:" + Global.getAdminPath() + "/home/?repage";
+        }else {
+            return "redirect:" + Global.getAdminPath() + "/project/projectRecords/?repage";
+        }
+	}
+
+	/**
+	 * 查询已办列表
+	 * @return
+	 */
+	@RequestMapping("/queryCompleteList")
+	public String queryCompleteList(Act act,HttpServletRequest request,HttpServletResponse response,Model model){
+		act.setProcDefKey("projectAudit");
+		List<ProjectRecords> list = projectRecordsService.historicList(act);
+		Office office = UserUtils.getSelectCompany();
+		String companyId = office==null?"":office.getId();
+		List<Activity> activities = activityService.groupByActivityMenu("7854872f45b84acd893010e66a3db2c8",companyId);
+		for (Activity activity:activities){
+			act.setProcDefKey(activity.getProcessKey());
+			list.addAll(projectRecordsService.historicList(act));
+		}
+
+		//合同变更
+		act.setProcDefKey("projectAlter");
+		List<Activity> activities3 = activityService.groupByActivityMenu("807c6d4b5623474792fe78ff1fd1cdff",companyId);
+		for (Activity activity:activities3){
+			act.setProcDefKey(activity.getProcessKey());
+			list.addAll(projectRecordsService.historicAlterList(act));
+		}
+		model.addAttribute("list",list);
+		return "modules/projectrecord/projectRecordsHistoricList";
+	}
+
+	/**
+	 * 选择合同
+	 */
+	@RequestMapping(value = "selectcontract")
+	public String selectcontractId(WorkContractInfo contract, String url,String type,String isTotal, String fieldLabels, String fieldKeys, String searchLabel, String searchKey, HttpServletRequest request, HttpServletResponse response, Model model) {
+		if(!"1".equals(UserUtils.getSelectCompany().getId())){
+			contract.setOfficeId(UserUtils.getSelectOffice().getId());
+			contract.setChargeCompany(UserUtils.getSelectOffice().getId());
+			contract.setCreateBy(UserUtils.getUser());
+		}
+		contract.setContractState("5");
+		Page<WorkContractInfo> page = contractInfoService.findPageReceipts(new Page<WorkContractInfo>(request, response),  contract);
+		try {
+			fieldLabels = URLDecoder.decode(fieldLabels, "UTF-8");
+			fieldKeys = URLDecoder.decode(fieldKeys, "UTF-8");
+			searchLabel = URLDecoder.decode(searchLabel, "UTF-8");
+			searchKey = URLDecoder.decode(searchKey, "UTF-8");
+		} catch (UnsupportedEncodingException e) {
+			e.printStackTrace();
+		}
+		model.addAttribute("labelNames", fieldLabels.split("\\|"));
+		model.addAttribute("labelValues", fieldKeys.split("\\|"));
+		model.addAttribute("fieldLabels", fieldLabels);
+		model.addAttribute("fieldKeys", fieldKeys);
+		model.addAttribute("url", url);
+		model.addAttribute("searchLabel", searchLabel);
+		model.addAttribute("searchKey", searchKey);
+		model.addAttribute("type", type);
+		model.addAttribute("isTotal", isTotal);
+		model.addAttribute("obj", contract);
+		model.addAttribute("page", page);
+		return "modules/sys/gridselectContractDetail";
+	}
+
+	@RequestMapping(value = "detailList")
+    @RequiresPermissions("project:projectRecordsDetail:list")
+    public String detailList(ProjectRecords projectRecords, HttpServletRequest request, HttpServletResponse response, Model model) {
+        if(UserUtils.isManager()){
+            model.addAttribute("flag","1");
+        }
+        Page<ProjectRecords> page = projectRecordsService.findPageDetail(new Page<ProjectRecords>(request, response), projectRecords);
+        model.addAttribute("page", page);
+        return "modules/projectrecord/projectRecordsDetailList";
+    }
+
+    /**
+     * 导出excel文件
+     */
+    @RequiresPermissions("project:projectRecordsDetail:export")
+    @RequestMapping(value = "exportDetail", method=RequestMethod.POST)
+    public String exportDetailFile(ProjectRecords projectRecords, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+        try {
+            String fileName = "项目"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            Page<ProjectRecords> page = projectRecordsService.findPageDetail(new Page<ProjectRecords>(request, response, -1), projectRecords);
+            new ExportExcel("项目", ProjectRecords.class).setDataList(page.getList()).write(response, fileName).dispose();
+            return null;
+        } catch (Exception e) {
+            addMessage(redirectAttributes, "导出项目记录失败!失败信息:"+e.getMessage());
+        }
+        return "redirect:"+Global.getAdminPath()+"/project/projectRecords/?repage";
+    }
+
+    /**
+     * 下载导入项目数据模板
+     */
+    @RequiresPermissions("project:projectRecords:edit")
+    @RequestMapping(value = "downloadTemplate")
+    public void downloadTemplate(HttpServletRequest request,HttpServletResponse response) {
+        try {
+            new OSSClientUtil().downByStream(template_path,template_name,response,request.getHeader("USER-AGENT"));
+        } catch (Exception e) {
+            logger.error("项目计划模板下载失败!",e);
+        }
+    }
+
+    /**
+     * 项目登记新增客户管理
+     */
+    @RequestMapping(value = "linkManSave")
+    @ResponseBody
+    public Object linkManSave(WorkClientInfo workClientInfo,
+                                               Model model, RedirectAttributes redirectAttributes,
+                                               HttpServletRequest request
+    ) throws Exception{
+    	Map<String,Object> map = new HashMap<>();
+        try {
+            //保存当前人的公司
+            workClientInfo.setCompanyId(UserUtils.getSelectCompany().getId());
+            workClientInfo.setOfficeId(UserUtils.getSelectOffice().getId());
+            workClientInfoService.save(workClientInfo);//保存
+			WorkClientLinkman linkman = workClientInfo.getWorkClientLinkmanList().get(0);
+			map.put("id",linkman.getId());
+			map.put("clientId",workClientInfo.getId());
+			map.put("clientName",workClientInfo.getName());
+			map.put("linkName",linkman.getName());
+			map.put("linkMobile",linkman.getLinkMobile());
+			map.put("linkPhone",linkman.getLinkPhone());
+			map.put("str","新增客户信息成功!");
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+		return map;
+    }
+
+	/**
+	 *选择合同-Ajax自动映射联系人
+	 * @param clientId
+	 * @return
+	 */
+	@ResponseBody
+	@RequestMapping(value = "getLinkManByClientId")
+    public Map<String, Object> queryWorkClientLinkMen(String clientId){
+		WorkClientLinkman linkman = workClientInfoService.queryLinkManByClientId(clientId);
+		if (linkman != null) {
+			WorkClientInfo workClientInfo = workClientInfoService.get(clientId);
+			Map<String, Object> map = new HashMap<>();
+			map.put("id", linkman.getId());
+			map.put("clientId", workClientInfo.getId());
+			map.put("clientName", workClientInfo.getName());
+			map.put("linkName", linkman.getName());
+			map.put("linkMobile", linkman.getLinkMobile());
+			map.put("linkPhone", linkman.getLinkPhone());
+			return map;
+		}
+		return null;
+	}
+}

+ 204 - 0
src/main/java/com/jeeplus/modules/projectrecord/web/ProjectRecordsUserController.java

@@ -0,0 +1,204 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.projectrecord.web;
+
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.modules.projectrecord.entity.ProjectRecords;
+import com.jeeplus.modules.projectrecord.service.ProjectRecordsService;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.utils.DictUtils;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.workcontractinfo.entity.WorkContractInfo;
+import com.jeeplus.modules.workcontractinfo.service.WorkContractInfoService;
+import com.jeeplus.modules.projectrecord.dao.WorkProjectUserDao;
+import com.jeeplus.modules.workstaff.dao.WorkStaffAchivesDao;
+import com.jeeplus.modules.workstaff.entity.WorkStaffBasicInfo;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 项目登记Controller
+ * @author ppt
+ * @version 2018-05-02
+ */
+@Controller
+	@RequestMapping(value = "${adminPath}/project/projectRecordUsers")
+public class ProjectRecordsUserController extends BaseController {
+
+	@Autowired
+	private ProjectRecordsService projectRecordsService;
+	@Autowired
+	private WorkStaffAchivesDao workStaffAchivesDao;
+
+	@Autowired
+	private WorkContractInfoService contractInfoService;
+	@Autowired
+	private WorkProjectUserDao workProjectUserDao;
+	
+	@ModelAttribute
+	public ProjectRecords get(@RequestParam(required=false) String id) {
+		ProjectRecords entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = projectRecordsService.get(id);
+		}
+		if (entity == null){
+			entity = new ProjectRecords();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 项目列表页面
+	 */
+	@RequiresPermissions("project:projectRecords:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(ProjectRecords projectRecords, HttpServletRequest request, HttpServletResponse response, Model model) {
+		projectRecords.setProjectStatus(5);
+		Page<ProjectRecords> page = projectRecordsService.findPageByStatus(new Page<ProjectRecords>(request, response), projectRecords);
+		model.addAttribute("page", page);
+		return "modules/projectrecord/projectRecordUsersList";
+	}
+
+	/**
+	 * 查看,增加,编辑项目表单页面
+	 */
+	@RequestMapping(value = "form")
+	public String form(ProjectRecords projectRecords, Model model) {
+		if (projectRecords!=null&&StringUtils.isNotBlank(projectRecords.getId())) {
+			//设置合同信息
+			WorkContractInfo workContractInfo = contractInfoService.get(projectRecords.getWorkContractInfo().getId());
+			workContractInfo.setConstructionProjectTypeStr(DictUtils.getDictLabel(String.valueOf(workContractInfo.getConstructionProjectType()), "construction_project_type", ""));
+			projectRecords.setWorkContractInfo(workContractInfo);
+			//设置项目组成员
+			projectRecordsService.queryUserNames(projectRecords);
+			//设置委托方联系人信息
+			projectRecordsService.queryLinkmanInfos(projectRecords);
+			List<User> users = workProjectUserDao.isDelFalg(projectRecords.getId(),"");
+			String userIds = "";
+			String delUserIds = "";
+			for (User user :users){
+				if (user.getDelFlag().equals("0")){
+					userIds += user.getId()+",";
+				}else {
+					delUserIds += user.getId()+",";
+				}
+			}
+			projectRecords.setUserIds(userIds);
+			projectRecords.setDelUserIds(delUserIds);
+			model.addAttribute("users", users);
+		}
+
+		model.addAttribute("projectRecords", projectRecords);
+		return "modules/projectrecord/projectRecordUsersForm";
+	}
+	/**
+	 * 查看,增加,编辑项目表单页面
+	 */
+	@RequestMapping(value = "getProjectRecordUsers")
+	@ResponseBody
+	@Transactional(readOnly = false)
+	public List<Map<String,Object>> getProjectRecordUsers(@RequestParam(required=false) String projectId,@RequestParam(required=false) String ids) {
+		List<Map<String,Object>> list = new ArrayList<>();
+		String[] idArr = ids.split(",");
+		List<User> users = workProjectUserDao.isDelFalg(projectId,"");
+		List<User> userList = new ArrayList<>();
+		String userIds = "";
+		String delUserIds = "";
+		for (User user :users){
+			if (user.getDelFlag().equals("0")){
+				userIds += user.getId()+",";
+			}else {
+				if (ids.contains(user.getId())){
+					delUserIds += user.getId()+",";
+				}
+			}
+		}
+		String names = "";
+		for (String id : idArr){
+			User user = UserUtils.get(id);
+			Map<String,Object> map = new HashMap<>();
+			if (!userIds.contains(id) && !delUserIds.contains(id)){
+				userList.add(new User(id));
+				map.put("id",StringUtils.isBlank(user.getId())?"":user.getId());
+				map.put("name",StringUtils.isBlank(user.getName())?"":user.getName());
+				map.put("officeId",StringUtils.isBlank(user.getOffice().getTopCompany())?"":user.getOffice().getTopCompany());
+				map.put("no",StringUtils.isBlank(user.getNo())?"":user.getNo());
+				map.put("mobile",StringUtils.isBlank(user.getMobile())?"":user.getMobile());
+				map.put("email",StringUtils.isBlank(user.getEmail())?"":user.getEmail());
+				map.put("msg","msg");
+				WorkStaffBasicInfo workStaffBasicInfo=workStaffAchivesDao.getJob(id);
+				if(workStaffBasicInfo!=null&&workStaffBasicInfo.getJobGrade()!=null){
+					map.put("jobName",StringUtils.isBlank(workStaffBasicInfo.getJobGrade().getName())?"":workStaffBasicInfo.getJobGrade().getName());
+				}
+				list.add(map);
+			}else if(delUserIds.contains(id)){
+				map.put("id",StringUtils.isBlank(user.getId())?"":user.getId());
+				map.put("msg","del");
+				list.add(map);
+			}else {
+				names += StringUtils.isBlank(user.getName())?"":(user.getName()+",");
+			}
+		}
+
+		if (userList!=null && userList.size()!=0){
+			ProjectRecords projectRecords = new ProjectRecords();
+			projectRecords.setId(projectId);
+			projectRecords.setUsers(userList);
+			workProjectUserDao.insertUsers(projectRecords);
+		}
+		if (delUserIds!=null){
+			ProjectRecords projectRecords = new ProjectRecords();
+			projectRecords.setId(projectId);
+			for (String id :delUserIds.split(",")){
+				projectRecords.setUserId(id);
+				projectRecords.setDelFlag("0");
+//				workProjectUserDao.deleteUsers(projectRecords);
+				workProjectUserDao.reInsertUser(projectRecords);
+			}
+
+		}
+		if (StringUtils.isNotBlank(names)){
+			Map<String,Object> map = new HashMap<>();
+			names = names.substring(0,names.length()-1);
+			names += "已在成员明细中!";
+			map.put("msg",names);
+			list.add(map);
+		}
+		return list;
+	}
+
+	/**
+	 * 查看,增加,编辑项目表单页面
+	 */
+	@RequestMapping(value = "removeProjectRecordUsers")
+	@ResponseBody
+	@Transactional(readOnly = false)
+	public Map<String,Object> removeProjectRecordUsers(@RequestParam(required=false) String projectId,@RequestParam(required=false) String userId) {
+		ProjectRecords projectRecords = new ProjectRecords();
+		projectRecords.setId(projectId);
+		projectRecords.setUserId(userId);
+		projectRecords.setDelFlag("1");
+		int count = workProjectUserDao.deleteUsers(projectRecords);
+		Map<String,Object> map = new HashMap<>();
+		if (count == 1){
+			map.put("msg",true);
+		}else {
+			map.put("msg",false);
+		}
+		return map;
+	}
+}

+ 17 - 0
src/main/java/com/jeeplus/modules/projectreportnum/dao/ProjectReportNumDao.java

@@ -0,0 +1,17 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.projectreportnum.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.projectcontentinfo.entity.ProjectReportData;
+import com.jeeplus.modules.projectreportnum.entity.ReportNum;
+import com.jeeplus.modules.worklog.entity.WorkLog;
+
+
+@MyBatisDao
+public interface ProjectReportNumDao extends CrudDao<ReportNum> {
+    int countNum(String userId);
+    void updateNum(String num);
+}

+ 44 - 0
src/main/java/com/jeeplus/modules/projectreportnum/entity/ReportNum.java

@@ -0,0 +1,44 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.projectreportnum.entity;
+
+
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.modules.sys.entity.Area;
+
+import java.util.Date;
+
+
+public class ReportNum extends DataEntity<ReportNum> {
+
+	private static final long serialVersionUID = 1L;
+	private String num;		// 报告号
+	private String state;     //使用状态 (1:已使用 0:未使用)
+	private String userId;   //用户
+
+
+	public String getNum() {
+		return num;
+	}
+
+	public void setNum(String num) {
+		this.num = num;
+	}
+
+	public String getState() {
+		return state;
+	}
+
+	public void setState(String state) {
+		this.state = state;
+	}
+
+	public String getUserId() {
+		return userId;
+	}
+
+	public void setUserId(String userId) {
+		this.userId = userId;
+	}
+}

+ 84 - 0
src/main/java/com/jeeplus/modules/projectreportnum/service/ProjectReportNumService.java

@@ -0,0 +1,84 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.projectreportnum.service;
+
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.service.CrudService;
+import com.jeeplus.modules.officeintroduce.entity.Officeintroduce;
+import com.jeeplus.modules.projectreportnum.dao.ProjectReportNumDao;
+import com.jeeplus.modules.projectreportnum.entity.ReportNum;
+import com.jeeplus.modules.serialnum.service.SerialNumTplService;
+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.util.List;
+
+
+@Service
+@Transactional(readOnly = true)
+public class ProjectReportNumService extends CrudService<ProjectReportNumDao, ReportNum> {
+
+	@Autowired
+	private ProjectReportNumDao projectReportNumDao;
+	@Autowired
+	private SerialNumTplService serialNumTplService;
+
+
+	public ReportNum get(String id) {
+		return super.get(id);
+
+	}
+
+	public int countNum(String userId){
+		return projectReportNumDao.countNum(userId);
+	}
+	
+	public List<ReportNum> findList(ReportNum reportNum) {
+		return super.findList(reportNum);
+	}
+	
+	public Page<ReportNum> findPage(Page<ReportNum> page, ReportNum reportNum) {
+		return super.findPage(page, reportNum);
+	}
+
+	public void updateNum(String num){
+		projectReportNumDao.updateNum(num);
+	}
+
+	
+	@Transactional(readOnly = false)
+	public String  save(String type) {
+		ReportNum reportNum = null;
+		int count = projectReportNumDao.countNum(UserUtils.getUser().getId());
+		if(count>=10){
+			return "最多领取10个报告号";
+		}
+		if(type.equals("one")){
+			String num = serialNumTplService.genSerialNum(UserUtils.getUser().getCompany(), "10");
+			reportNum = new ReportNum();
+			reportNum.setNum(num);
+			reportNum.setState("0");
+			super.save(reportNum);
+		}else {
+             for(int i=0;i<10-count;i++){
+				 String num = serialNumTplService.genSerialNum(UserUtils.getUser().getCompany(), "10");
+				 reportNum = new ReportNum();
+				 reportNum.setNum(num);
+				 reportNum.setState("0");
+				 super.save(reportNum);
+			 }
+		}
+        return "领取成功";
+	}
+	
+	@Transactional(readOnly = false)
+	public void delete(ReportNum reportNum) {
+		super.delete(reportNum);
+	}
+
+	
+	
+}

+ 82 - 0
src/main/java/com/jeeplus/modules/projectreportnum/web/ProjectReportFindController.java

@@ -0,0 +1,82 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.projectreportnum.web;
+
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.utils.FreemarkerUtil;
+import com.jeeplus.common.utils.ImageUtil;
+import com.jeeplus.common.utils.ResponseUtil;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.modules.projectcontentinfo.dao.ProjectReportDataDao;
+import com.jeeplus.modules.projectcontentinfo.entity.ProjectReportData;
+import com.jeeplus.modules.projectrecord.entity.ProjectRecords;
+import com.jeeplus.modules.projectrecord.service.ProjectRecordsService;
+import com.jeeplus.modules.projectreportnum.entity.ReportNum;
+import com.jeeplus.modules.projectreportnum.service.ProjectReportNumService;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.tools.utils.TwoDimensionCode;
+import freemarker.template.Configuration;
+import freemarker.template.Template;
+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.servlet.mvc.support.RedirectAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.net.URLDecoder;
+import java.net.URLEncoder;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+
+@Controller
+@RequestMapping(value = "/projectreportnum/projectReportNum")
+public class ProjectReportFindController extends BaseController {
+
+	@Autowired
+	private ProjectReportNumService projectReportNumService;
+	@Autowired
+	private ProjectReportDataDao projectReportDataDao;
+	@Autowired
+    private ProjectRecordsService projectRecordsService;
+	
+
+
+	@RequestMapping("report")
+	public String report(HttpServletRequest request,Model model) throws Exception{
+		ProjectRecords data = new ProjectRecords();
+    	String num = request.getParameter("number");
+		num = URLDecoder.decode(num,"UTF-8");
+		ProjectReportData projectReportData = projectReportDataDao.findByNum(num);
+		if(projectReportData != null && projectReportData.getProject() != null) {
+			String projectId = projectReportData.getProject().getId();
+			data = projectRecordsService.getQueryProjectUsers(projectId);
+			data.setReportData(projectReportData);
+		}
+		model.addAttribute("projectRecords",data);
+		return "modules/projectreportnum/reportAuditProject";
+	}
+	
+
+
+
+
+	
+
+
+
+	
+
+
+	
+	
+	
+
+}

+ 188 - 0
src/main/java/com/jeeplus/modules/projectreportnum/web/ProjectReportNumController.java

@@ -0,0 +1,188 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.projectreportnum.web;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.Lists;
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.utils.*;
+import com.jeeplus.common.utils.excel.ExportExcel;
+import com.jeeplus.common.utils.excel.ImportExcel;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.modules.projectcontentinfo.dao.ProjectReportDataDao;
+import com.jeeplus.modules.projectcontentinfo.entity.ProjectReportData;
+import com.jeeplus.modules.projectcontentinfo.service.ProjectReportDataService;
+import com.jeeplus.modules.projectrecord.entity.ProjectRecords;
+import com.jeeplus.modules.projectrecord.service.ProjectRecordsService;
+import com.jeeplus.modules.projectreportnum.entity.ReportNum;
+import com.jeeplus.modules.projectreportnum.service.ProjectReportNumService;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.tools.utils.TwoDimensionCode;
+import freemarker.template.Configuration;
+import freemarker.template.Template;
+import net.sf.json.JSONObject;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.ConstraintViolationException;
+import java.io.File;
+import java.net.URLDecoder;
+import java.net.URLEncoder;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+
+@Controller
+@RequestMapping(value = "${adminPath}/projectreportnum/projectReportNum")
+public class ProjectReportNumController extends BaseController {
+
+	@Autowired
+	private ProjectReportNumService projectReportNumService;
+	@Autowired
+	private ProjectReportDataDao projectReportDataDao;
+	@Autowired
+    private ProjectRecordsService projectRecordsService;
+	
+
+	
+	/**
+	 * 列表页面
+	 */
+
+	@RequestMapping(value = {"list", ""})
+	public String list(ReportNum reportNum, HttpServletRequest request, HttpServletResponse response, Model model) {
+		String userId = UserUtils.getUser().getId();
+		reportNum.setUserId(userId);
+		Page<ReportNum> page = projectReportNumService.findPage(new Page<ReportNum>(request, response), reportNum);
+		model.addAttribute("page", page);
+		return "modules/projectreportnum/projectReportNumList";
+	}
+
+
+	@RequestMapping(value = "select")
+	public String select(ReportNum reportNum, HttpServletRequest request, HttpServletResponse response, Model model) {
+		String userId = UserUtils.getUser().getId();
+		reportNum.setUserId(userId);
+		Page<ReportNum> page = projectReportNumService.findPage(new Page<ReportNum>(request, response), reportNum);
+		model.addAttribute("page", page);
+		return "modules/projectreportnum/projectReportNumSel";
+	}
+
+    @RequestMapping(value = "download")
+    public String download(HttpServletRequest request,RedirectAttributes redirectAttributes,HttpServletResponse response){
+		Template template=null;
+        try{
+			String num = request.getParameter("number");
+			String querySite = Global.getConfig("serverDomain")+"/projectreportnum/projectReportNum/report?number="+ URLEncoder.encode(num,"UTF-8");
+			num = URLDecoder.decode(num,"UTF-8");
+        	int index1 = num.indexOf("【");
+        	int index2 = num.indexOf("】");
+        	String repType = num.substring(0,index1);
+        	String repYear = num.substring(index1+1,index2);
+        	String repNum = num.substring(index2+1,num.length());
+        	String pa = this.getClass().getResource("/").getPath();
+        	if(pa.contains("%20")){
+        		pa = pa.replace("%20"," ");
+			}
+			File path = new File(pa+"/freemarker");
+			Configuration cfg = new Configuration();
+			cfg.setDirectoryForTemplateLoading(path);
+			cfg.setDefaultEncoding("UTF-8");
+			template = cfg.getTemplate("current.ftl","UTF-8");
+			Map<String,Object> data  = new HashMap<>();
+			data.put("repType",repType);
+			data.put("repYear",repYear);
+			data.put("repNum",repNum);
+			data.put("querySite","re.xgccpm.com/ccpm_query");
+			String commonFileName = UUID.randomUUID().toString();
+			String tempPath = pa+"/temp/";
+			File temP = new File(tempPath);
+			if(!temP.exists()){
+                temP.mkdirs();
+			}
+			String qrCodePath = tempPath + commonFileName + ".png";
+			TwoDimensionCode.encoderQRCode(querySite, qrCodePath, "png");//执行生成二维码
+			String imageStr = ImageUtil.getImageStr(qrCodePath);
+			data.put("qrcode",imageStr);
+
+			File docFile = new File(tempPath+commonFileName+".doc");
+			FreemarkerUtil.generateFile(data,template,docFile);
+
+			ResponseUtil.docResponse("防伪报告模板.doc",docFile,response);
+
+			if(docFile != null) docFile.delete(); // 删除doc临时文件
+			File imageFile = new File(qrCodePath);
+			if(imageFile.exists() && imageFile.isFile()) {
+				imageFile.delete();//删除二维码图片临时文件
+			}
+		}catch (Exception e){
+			addMessage(redirectAttributes, "下载失败!失败信息:"+e.getMessage());
+		}
+	    return null;
+    }
+
+
+	/**
+	 * 保存记录
+	 */
+    @ResponseBody
+	@RequestMapping(value = "save")
+	public Map save(HttpServletRequest request){
+    	Map map = new HashMap();
+    	try {
+			String type = request.getParameter("type");
+			String msg = projectReportNumService.save(type);//保存
+			map.put("msg",msg);
+			if(msg.length()>5){
+				map.put("code","0");
+			}else {
+				map.put("code","1");
+			}
+		}catch (Exception e){
+    		map.put("msg","领取失败");
+    		map.put("code","0");
+		}
+		return map;
+	}
+
+	@RequestMapping("report")
+	public String report(HttpServletRequest request,Model model) throws Exception{
+		ProjectRecords data = new ProjectRecords();
+    	String num = request.getParameter("number");
+		num = URLDecoder.decode(num,"UTF-8");
+		ProjectReportData projectReportData = projectReportDataDao.findByNum(num);
+		if(projectReportData != null && projectReportData.getProject() != null) {
+			String projectId = projectReportData.getProject().getId();
+			data = projectRecordsService.getQueryProjectUsers(projectId);
+			data.setReportData(projectReportData);
+		}
+		model.addAttribute("projectRecords",data);
+		return "modules/projectreportnum/reportAuditProject";
+	}
+	
+
+
+
+
+	
+
+
+
+	
+
+
+	
+	
+	
+
+}

+ 31 - 0
src/main/java/com/jeeplus/modules/pushinfo/dao/PushinfoDao.java

@@ -0,0 +1,31 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.pushinfo.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.pushinfo.entity.Pushinfo;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 测试DAO接口
+ * @author yangfan
+ * @version 2017-07-28
+ */
+@MyBatisDao
+public interface PushinfoDao extends CrudDao<Pushinfo> {
+
+    /**
+     * 根据ID获取Pushinfo
+     * @param pushinfo
+     * @return
+     */
+    public List<Pushinfo> getByPushId(Pushinfo pushinfo);
+    public List<Pushinfo> findPushList(Pushinfo pushinfo);
+
+    int updateDelflagByPushId(@Param("pushId") String pushId,@Param("delFlag")String delflag);
+    int updateStatusByPushId(@Param("pushId") String pushId,@Param("status")String delflag);
+}

+ 131 - 0
src/main/java/com/jeeplus/modules/pushinfo/entity/Pushinfo.java

@@ -0,0 +1,131 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.pushinfo.entity;
+
+
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+
+/**
+ * 测试Entity
+ * @author yangfan
+ * @version 2017-07-28
+ */
+public class Pushinfo extends DataEntity<Pushinfo> {
+	
+	private static final long serialVersionUID = 1L;
+	private String title;		// 标题
+	private String content;		// 内容
+	private String type;		// 类型
+	private String pushId;		// 推送id
+	private String userId;		// 推送用户id
+    private String pushUserId;		// 接收推送id
+    private String status;
+    private String parentType;
+    private String addcontent;
+    private String companyId;
+    private String mobile;
+
+    public String getMobile() {
+        return mobile;
+    }
+
+    public void setMobile(String mobile) {
+        this.mobile = mobile;
+    }
+
+    public String getCompanyId() {
+        return companyId;
+    }
+    public void setCompanyId(String companyId) {
+        this.companyId = companyId;
+    }
+
+    public String getAddcontent() {
+        return addcontent;
+    }
+
+    public void setAddcontent(String addcontent) {
+        this.addcontent = addcontent;
+    }
+
+    public String getParentType() {
+        return parentType;
+    }
+
+    public void setParentType(String parentType) {
+        this.parentType = parentType;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public Pushinfo() {
+		super();
+	}
+
+	public Pushinfo(String id){
+		super(id);
+	}
+
+	@ExcelField(title="标题", align=2, sort=7)
+	public String getTitle() {
+		return title;
+	}
+
+	public void setTitle(String title) {
+		this.title = title;
+	}
+	
+	@ExcelField(title="内容", align=2, sort=8)
+	public String getContent() {
+		return content;
+	}
+
+	public void setContent(String content) {
+		this.content = content;
+	}
+	
+	@ExcelField(title="类型", align=2, sort=9)
+	public String getType() {
+		return type;
+	}
+
+	public void setType(String type) {
+		this.type = type;
+	}
+	
+	@ExcelField(title="推送id", align=2, sort=10)
+	public String getPushId() {
+		return pushId;
+	}
+
+	public void setPushId(String pushId) {
+		this.pushId = pushId;
+	}
+	
+	@ExcelField(title="推送用户id", align=2, sort=11)
+	public String getUserId() {
+		return userId;
+	}
+
+	public void setUserId(String userId) {
+		this.userId = userId;
+	}
+	
+	@ExcelField(title="接收推送id", align=2, sort=12)
+	public String getPushUserId() {
+		return pushUserId;
+	}
+
+	public void setPushUserId(String pushUserId) {
+		this.pushUserId = pushUserId;
+	}
+	
+}

+ 91 - 0
src/main/java/com/jeeplus/modules/pushinfo/service/PushinfoService.java

@@ -0,0 +1,91 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.pushinfo.service;
+
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.service.CrudService;
+import com.jeeplus.common.utils.JPushClientUtil;
+import com.jeeplus.modules.pushinfo.dao.PushinfoDao;
+import com.jeeplus.modules.pushinfo.entity.Pushinfo;
+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.util.List;
+import java.util.Map;
+
+/**
+ * 测试Service
+ * @author yangfan
+ * @version 2017-07-28
+ */
+@Service
+@Transactional(readOnly = true)
+public class PushinfoService extends CrudService<PushinfoDao, Pushinfo> {
+	@Autowired
+	private PushinfoDao pushinfoDao;
+	public Pushinfo get(String id) {
+		return super.get(id);
+	}
+	public  List<Pushinfo> getByPushId(Pushinfo pushinfo) {
+		return dao.getByPushId(pushinfo);
+	}
+
+	public List<Pushinfo> findList(Pushinfo pushinfo) {
+		return super.findList(pushinfo);
+	}
+	
+	public Page<Pushinfo> findPage(Page<Pushinfo> page, Pushinfo pushinfo) {
+		return super.findPage(page, pushinfo);
+	}
+	public Page<Pushinfo> findPushList(Page<Pushinfo> page, Pushinfo pushinfo) {
+		List<Pushinfo> pages = null;
+		try{
+			pushinfo.setPage(page);
+			pages = pushinfoDao.findPushList(pushinfo);
+			page.setList(pages);
+		}catch (Exception e){
+			logger.info("Exception e:"+e);
+			e.printStackTrace();
+		}
+		return page;
+	}
+
+	@Transactional(readOnly = false)
+	public void save(Pushinfo pushinfo) {
+		super.save(pushinfo);
+	}
+	
+	@Transactional(readOnly = false)
+	public void delete(Pushinfo pushinfo) {
+		super.delete(pushinfo);
+	}
+	
+	@Transactional(readOnly = false)
+	public int updateDelflagByPushId(String pushId,String delflag){
+		return pushinfoDao.updateDelflagByPushId(pushId,delflag);
+	}
+
+	@Transactional(readOnly = false)
+	public int updateStatusByPushId(String pushId,String status){
+		return pushinfoDao.updateStatusByPushId(pushId,status);
+	}
+
+	@Transactional(readOnly = false)
+	public void pushInfoToApp(Pushinfo pushinfo,Map<String,Object> extras){
+		this.save(pushinfo);
+		Pushinfo selectPush = new Pushinfo();
+		selectPush.setPushId(pushinfo.getPushId());
+		selectPush.setPushUserId(UserUtils.getUser().getId());
+		List<Pushinfo> pushinfos = this.findList(selectPush);
+		if (pushinfos!=null && pushinfos.size()!=0){
+			Pushinfo push = pushinfos.get(0);
+			push.setStatus(pushinfo.getStatus());
+			this.save(push);
+		}
+		JPushClientUtil.sendNotificationToAlias(pushinfo.getTitle(), pushinfo.getContent(), extras, pushinfo.getPushUserId());
+	}
+
+}

+ 196 - 0
src/main/java/com/jeeplus/modules/pushinfo/web/PushinfoController.java

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

+ 22 - 0
src/main/java/com/jeeplus/modules/ruralprojectrecords/dao/RuralProjectClientLinkmanDao.java

@@ -0,0 +1,22 @@
+package com.jeeplus.modules.ruralprojectrecords.dao;
+
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.workclientinfo.entity.WorkClientLinkman;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Map;
+
+@MyBatisDao
+public interface RuralProjectClientLinkmanDao {
+
+    public void batchInsert(Map map);
+
+    public void deleteProjectLinkmans(@Param("projectId") String projectId, @Param("isEntrust") int isEntrust);
+
+    /**
+     * 根据姓名和委托方(office)查询联系人详细信息
+     * @param workClientLinkman
+     * @return
+     */
+    public WorkClientLinkman getLinkManByNameAndOffice(WorkClientLinkman workClientLinkman);
+}

+ 23 - 0
src/main/java/com/jeeplus/modules/ruralprojectrecords/dao/RuralProjectRecordsAlterDao.java

@@ -0,0 +1,23 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.ruralprojectrecords.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.ruralprojectrecords.entity.RuralProjectRecordsAlter;
+
+/**
+ * 项目登记DAO接口
+ * @author ppt
+ * @version 2018-05-02
+ */
+@MyBatisDao
+public interface RuralProjectRecordsAlterDao extends CrudDao<RuralProjectRecordsAlter> {
+
+    void updateProcessIdAndStatus(RuralProjectRecordsAlter projectRecords);
+
+    void updateSelectiveById(RuralProjectRecordsAlter projectRecords);
+
+    int countAlter(String projectId);
+}

+ 33 - 0
src/main/java/com/jeeplus/modules/ruralprojectrecords/dao/RuralProjectRecordsDao.java

@@ -0,0 +1,33 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.ruralprojectrecords.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.ruralprojectrecords.entity.RuralProjectRecords;
+
+import java.util.List;
+
+/**
+ * 项目登记DAO接口
+ * @author ppt
+ * @version 2018-05-02
+ */
+@MyBatisDao
+public interface RuralProjectRecordsDao extends CrudDao<RuralProjectRecords> {
+
+
+    void updateProcessIdAndStatus(RuralProjectRecords projectRecords);
+
+    void updateSelectiveById(RuralProjectRecords projectRecords);
+
+    List<RuralProjectRecords> findListByStatus(RuralProjectRecords projectRecords);
+
+    void updateSelectiveByProjectId(RuralProjectRecords records);
+
+    RuralProjectRecords findUseableByProjectId(String projectId);
+    List<RuralProjectRecords> findPageByRe(RuralProjectRecords records);
+    int queryCount(RuralProjectRecords records);
+    int queryCountByStatus(RuralProjectRecords records);
+}

+ 29 - 0
src/main/java/com/jeeplus/modules/ruralprojectrecords/dao/RuralWorkProjectUserDao.java

@@ -0,0 +1,29 @@
+package com.jeeplus.modules.ruralprojectrecords.dao;
+
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.ruralprojectrecords.entity.RuralProjectRecords;
+import com.jeeplus.modules.sys.entity.User;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@MyBatisDao
+public interface RuralWorkProjectUserDao {
+
+    public void batchInsert(Map map);
+
+    public void deleteProjectMembers(@Param("projectId") String projectId, @Param("isMaster") String isMaster);
+    public List<User> isDelFalg(@Param("projectId") String projectId, @Param("delFlag") String delFlag);
+    public int insertUsers(RuralProjectRecords records);
+    public int deleteUsers(RuralProjectRecords records);
+
+    List<User> queryProjectUsers(@Param("projectId") String projectId, @Param("isMaster") String isMaster);
+    List<User> projectUsers(@Param("projectId") String projectId);
+    List<User> queryAllProjectUsers(@Param("projectId") String projectId);
+    void deleteProjectMasterMembers(HashMap<String, Object> map);
+
+    int reInsertUser(RuralProjectRecords projectRecords);
+//    int reInsertUser(@Param("projectId")String projectId,@Param("userId")String userId);
+}

+ 571 - 0
src/main/java/com/jeeplus/modules/ruralprojectrecords/entity/RuralProjectRecords.java

@@ -0,0 +1,571 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.ruralprojectrecords.entity;
+
+import com.google.common.collect.Lists;
+import com.jeeplus.common.persistence.ActEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+import com.jeeplus.modules.projectcontentinfo.entity.ProjectReportData;
+import com.jeeplus.modules.sys.entity.Area;
+import com.jeeplus.modules.sys.entity.Office;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.workclientinfo.entity.WorkClientAttachment;
+import com.jeeplus.modules.workclientinfo.entity.WorkClientLinkman;
+import com.jeeplus.modules.workcontractinfo.entity.WorkContractInfo;
+import org.hibernate.validator.constraints.NotBlank;
+
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 项目登记Entity
+ * @author ppt
+ * @version 2018-05-02
+ */
+public class RuralProjectRecords extends ActEntity<RuralProjectRecords> {
+
+	public static final String SERIAL_BIZCODE ="1";
+	private static final long serialVersionUID = 1L;
+	@NotNull(message = "合同信息不能为空")
+	private WorkContractInfo workContractInfo;		// 合同id
+	private String projectId;		// 项目编号
+	@NotBlank(message = "项目名称不能为空")
+	private String projectName;		// 项目名称
+	private String scaleType;		// 规模类型
+	private String scaleUnit;		// 规模单位
+	private Double scaleQuantity;		// 规模数量
+	private Area area;		// 项目所在地
+	private String projectSite;		// 建设地点
+	private String province;  //项目所在省
+	private String city;  //项目所在市
+	private String county;//项目所在区
+	private String projectStructure;   //工程结构
+	private String onGroundNum;    //地上层数
+	private String underGroundNum;    //地下层数
+	private String buildingScale;    //建筑规模
+	private String measuringUnit;     //规模单位
+	private String projectUse;        //工程用途
+	private Double installFees;      //安装造价
+	private Double buildingFees;      //土建造价
+	private Double buildingPercent;    //土建百分比
+	private Double installPercent;     //安装百分比
+	private Double unitFees;     //单位造价
+	private Double buildingUnitFees;  //土建单位造价
+	private Double installUnitFees;    //安装单位造价
+	private Double totalFees;        //总合同额
+
+	private ProjectReportData reportData;//报告
+
+	public ProjectReportData getReportData() {
+		return reportData;
+	}
+
+	public void setReportData(ProjectReportData reportData) {
+		this.reportData = reportData;
+	}
+
+	@NotNull(message = "委托方联系人不能为空")
+	private List<WorkClientLinkman> workClientLinkmanList;		// 委托方联系人
+	private List<WorkClientLinkman> workConstructionLinkmanList;		// 施工方及联系人
+	@NotBlank(message = "工程概况不能为空")
+	private String projectDesc;		// 工程概况
+	@NotNull(message = "项目负责人不能为空")
+	private List<User> projectLeaders; //项目负责人
+
+	private List<User> projectMembers;  //项目组成员
+
+	private String leaderNameStr;
+	private String leaderIds;
+	private String memberNameStr;
+	private String memberIds;
+
+	private String processInstanceId;
+
+	private Office company;
+	private Office office;
+	private Integer projectStatus;//项目状态
+
+	private String auditType;
+
+	private String alterProcessId;
+	private String userIds;
+	private String delUserIds;
+	private List<User> users;
+	private String userId;
+
+	private String home;
+	private Date beginDate;
+	private Date endDate;
+	private int membercount;
+	private List<WorkClientAttachment> workAttachments = Lists.newArrayList();
+
+	private List<ProjectReportData> projectReportData = Lists.newArrayList();
+
+	public RuralProjectRecords() {
+		super();
+	}
+
+	public RuralProjectRecords(String id){
+		super(id);
+	}
+
+	public WorkContractInfo getWorkContractInfo() {
+		return workContractInfo;
+	}
+
+	public void setWorkContractInfo(WorkContractInfo contract) {
+		this.workContractInfo = contract;
+	}
+	
+	@ExcelField(title="项目编号", align=2, sort=1)
+	public String getProjectId() {
+		return projectId;
+	}
+
+	public void setProjectId(String projectId) {
+		this.projectId = projectId;
+	}
+	
+	@ExcelField(title="项目名称", align=2, sort=2)
+	public String getProjectName() {
+		return projectName;
+	}
+
+	public void setProjectName(String projectName) {
+		this.projectName = projectName;
+	}
+	
+	@ExcelField(title="规模类型", align=2, sort=9)
+	public String getScaleType() {
+		return scaleType;
+	}
+
+	public void setScaleType(String scaleType) {
+		this.scaleType = scaleType;
+	}
+	
+	@ExcelField(title="规模单位", align=2, sort=10)
+	public String getScaleUnit() {
+		return scaleUnit;
+	}
+
+	public void setScaleUnit(String scaleUnit) {
+		this.scaleUnit = scaleUnit;
+	}
+	
+	@ExcelField(title="规模数量", align=2, sort=11)
+	public Double getScaleQuantity() {
+		return scaleQuantity;
+	}
+
+	public void setScaleQuantity(Double scaleQuantity) {
+		this.scaleQuantity = scaleQuantity;
+	}
+	
+	@ExcelField(title="项目所在地", align=2, sort=12)
+	public Area getArea() {
+		return area;
+	}
+
+	public void setArea(Area area) {
+		this.area = area;
+	}
+	
+	@ExcelField(title="建设地点", align=2, sort=13)
+	public String getProjectSite() {
+		return projectSite;
+	}
+
+	public void setProjectSite(String projectSite) {
+		this.projectSite = projectSite;
+	}
+
+	public List<WorkClientLinkman> getWorkClientLinkmanList() {
+		return workClientLinkmanList;
+	}
+
+	public void setWorkClientLinkmanList(List<WorkClientLinkman> workClientLinkmanList) {
+		this.workClientLinkmanList = workClientLinkmanList;
+	}
+
+	@ExcelField(title="工程概况", align=2, sort=16)
+	public String getProjectDesc() {
+		return projectDesc;
+	}
+	@ExcelField(title="特殊要求", align=2, sort=17)
+	public String getRemarks() {
+		return remarks;
+	}
+	@ExcelField(title="创建日期", align=2, sort=18)
+	public Date getCreateDate() {
+		return createDate;
+	}
+
+	public void setProjectDesc(String projectDesc) {
+		this.projectDesc = projectDesc;
+	}
+
+	public List<User> getProjectLeaders() {
+		return projectLeaders;
+	}
+
+	public void setProjectLeaders(List<User> projectLeaders) {
+		this.projectLeaders = projectLeaders;
+	}
+
+	public List<User> getProjectMembers() {
+		return projectMembers;
+	}
+
+	public void setProjectMembers(List<User> projectMembers) {
+		this.projectMembers = projectMembers;
+	}
+
+	public List<WorkClientLinkman> getWorkConstructionLinkmanList() {
+		return workConstructionLinkmanList;
+	}
+
+	public void setWorkConstructionLinkmanList(List<WorkClientLinkman> workConstructionLinkmanList) {
+		this.workConstructionLinkmanList = workConstructionLinkmanList;
+	}
+
+    @ExcelField(title="项目状态", align=2, sort=19,dictType = "audit_state")
+	public Integer getProjectStatus() {
+		return projectStatus;
+	}
+
+	public void setProjectStatus(Integer projectStatus) {
+		this.projectStatus = projectStatus;
+	}
+
+	@ExcelField(title="负责人", align=2, sort=8)
+	public String getLeaderNameStr() {
+		return leaderNameStr;
+	}
+
+	public void setLeaderNameStr(String leaderNameStr) {
+		this.leaderNameStr = leaderNameStr;
+	}
+
+	public String getMemberNameStr() {
+		return memberNameStr;
+	}
+
+	public void setMemberNameStr(String memberNameStr) {
+		this.memberNameStr = memberNameStr;
+	}
+
+	public String getLeaderIds() {
+		return leaderIds;
+	}
+
+	public void setLeaderIds(String leaderIds) {
+		this.leaderIds = leaderIds;
+	}
+
+	public String getMemberIds() {
+		return memberIds;
+	}
+
+	public void setMemberIds(String memberIds) {
+		this.memberIds = memberIds;
+	}
+
+	public String getProcessInstanceId() {
+		return processInstanceId;
+	}
+
+	public void setProcessInstanceId(String processInstanceId) {
+		this.processInstanceId = processInstanceId;
+	}
+
+	public String getAuditType() {
+		return auditType;
+	}
+
+	public void setAuditType(String auditType) {
+		this.auditType = auditType;
+	}
+
+	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 getAlterProcessId() {
+		return alterProcessId;
+	}
+
+	public void setAlterProcessId(String alterProcessId) {
+		this.alterProcessId = alterProcessId;
+	}
+
+	public List<WorkClientAttachment> getWorkAttachments() {
+		return workAttachments;
+	}
+
+	public void setWorkAttachments(List<WorkClientAttachment> workAttachments) {
+		this.workAttachments = workAttachments;
+	}
+
+	public String getUserIds() {
+		return userIds;
+	}
+
+	public void setUserIds(String userIds) {
+		this.userIds = userIds;
+	}
+
+	public String getDelUserIds() {
+		return delUserIds;
+	}
+
+	public void setDelUserIds(String delUserIds) {
+		this.delUserIds = delUserIds;
+	}
+
+	public List<User> getUsers() {
+		return users;
+	}
+
+	public void setUsers(List<User> users) {
+		this.users = users;
+	}
+
+	public String getUserId() {
+		return userId;
+	}
+
+	public void setUserId(String userId) {
+		this.userId = userId;
+	}
+	@ExcelField(title="合同名称", align=2, sort=4)
+	public String getContractName() {
+		if (workContractInfo!=null) {
+			return workContractInfo.getName();
+		}else {
+			return "";
+		}
+	}
+	@ExcelField(title="合同编号", align=2, sort=3)
+	public String getContractNumber() {
+		if (workContractInfo!=null) {
+			return workContractInfo.getContractNum();
+		}else {
+			return "";
+		}
+	}
+	@ExcelField(title="合同金额", align=2, sort=5)
+	public String getContractPrice() {
+		if (workContractInfo!=null) {
+			return workContractInfo.getContractPrice();
+		}else {
+			return "";
+		}
+	}
+	@ExcelField(title="工程分类", align=2, sort=7)
+	public String getContractType() {
+		if (workContractInfo!=null) {
+			return workContractInfo.getConstructionProjectTypeStr();
+		}else {
+			return "";
+		}
+	}
+	@ExcelField(title="主委托方", align=2, sort=6)
+	public String getClientName() {
+		if (workContractInfo!=null && workContractInfo.getClient()!=null){
+			return workContractInfo.getClient().getName();
+		}else {
+			return "";
+		}
+	}
+
+    public String getHome() {
+        return home;
+    }
+
+    public void setHome(String home) {
+        this.home = home;
+    }
+
+    public Date getBeginDate() {
+        return beginDate;
+    }
+
+    public void setBeginDate(Date beginDate) {
+        this.beginDate = beginDate;
+    }
+
+    public Date getEndDate() {
+        return endDate;
+    }
+
+    public void setEndDate(Date endDate) {
+        this.endDate = endDate;
+    }
+
+	public int getMembercount() {
+		return membercount;
+	}
+
+	public void setMembercount(int membercount) {
+		this.membercount = membercount;
+	}
+
+	public String getProvince() {
+		return province;
+	}
+
+	public void setProvince(String province) {
+		this.province = province;
+	}
+
+	public String getCity() {
+		return city;
+	}
+
+	public void setCity(String city) {
+		this.city = city;
+	}
+
+	public String getCounty() {
+		return county;
+	}
+
+	public void setCounty(String county) {
+		this.county = county;
+	}
+
+	public String getProjectStructure() {
+		return projectStructure;
+	}
+
+	public void setProjectStructure(String projectStructure) {
+		this.projectStructure = projectStructure;
+	}
+
+	public String getOnGroundNum() {
+		return onGroundNum;
+	}
+
+	public void setOnGroundNum(String onGroundNum) {
+		this.onGroundNum = onGroundNum;
+	}
+
+	public String getUnderGroundNum() {
+		return underGroundNum;
+	}
+
+	public void setUnderGroundNum(String underGroundNum) {
+		this.underGroundNum = underGroundNum;
+	}
+
+	public String getBuildingScale() {
+		return buildingScale;
+	}
+
+	public void setBuildingScale(String buildingScale) {
+		this.buildingScale = buildingScale;
+	}
+
+	public String getMeasuringUnit() {
+		return measuringUnit;
+	}
+
+	public void setMeasuringUnit(String measuringUnit) {
+		this.measuringUnit = measuringUnit;
+	}
+
+	public String getProjectUse() {
+		return projectUse;
+	}
+
+	public void setProjectUse(String projectUse) {
+		this.projectUse = projectUse;
+	}
+
+	public Double getInstallFees() {
+		return installFees;
+	}
+
+	public void setInstallFees(Double installFees) {
+		this.installFees = installFees;
+	}
+
+	public Double getBuildingFees() {
+		return buildingFees;
+	}
+
+	public void setBuildingFees(Double buildingFees) {
+		this.buildingFees = buildingFees;
+	}
+
+	public Double getBuildingPercent() {
+		return buildingPercent;
+	}
+
+	public void setBuildingPercent(Double buildingPercent) {
+		this.buildingPercent = buildingPercent;
+	}
+
+	public Double getInstallPercent() {
+		return installPercent;
+	}
+
+	public void setInstallPercent(Double installPercent) {
+		this.installPercent = installPercent;
+	}
+
+	public Double getUnitFees() {
+		return unitFees;
+	}
+
+	public void setUnitFees(Double unitFees) {
+		this.unitFees = unitFees;
+	}
+
+	public Double getBuildingUnitFees() {
+		return buildingUnitFees;
+	}
+
+	public void setBuildingUnitFees(Double buildingUnitFees) {
+		this.buildingUnitFees = buildingUnitFees;
+	}
+
+	public Double getInstallUnitFees() {
+		return installUnitFees;
+	}
+
+	public void setInstallUnitFees(Double installUnitFees) {
+		this.installUnitFees = installUnitFees;
+	}
+
+	public Double getTotalFees() {
+		return totalFees;
+	}
+
+	public void setTotalFees(Double totalFees) {
+		this.totalFees = totalFees;
+	}
+
+	public List<ProjectReportData> getProjectReportData() {
+		return projectReportData;
+	}
+
+	public void setProjectReportData(List<ProjectReportData> projectReportData) {
+		this.projectReportData = projectReportData;
+	}
+}

+ 516 - 0
src/main/java/com/jeeplus/modules/ruralprojectrecords/entity/RuralProjectRecordsAlter.java

@@ -0,0 +1,516 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.ruralprojectrecords.entity;
+
+import com.google.common.collect.Lists;
+import com.jeeplus.common.persistence.ActEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+import com.jeeplus.modules.sys.entity.Area;
+import com.jeeplus.modules.sys.entity.Office;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.workclientinfo.entity.WorkClientAttachment;
+import com.jeeplus.modules.workclientinfo.entity.WorkClientLinkman;
+import com.jeeplus.modules.workcontractinfo.entity.WorkContractInfo;
+import org.hibernate.validator.constraints.NotBlank;
+
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 项目登记Entity
+ * @author ppt
+ * @version 2018-05-02
+ */
+public class RuralProjectRecordsAlter extends ActEntity<RuralProjectRecordsAlter> {
+
+	private static final long serialVersionUID = 1L;
+	@NotNull(message = "合同信息不能为空")
+	private WorkContractInfo workContractInfo;		// 合同id
+	private String projectId;		// 项目编号
+	@NotBlank(message = "项目名称不能为空")
+	private String projectName;		// 项目名称
+	private String scaleType;		// 规模类型
+	private String scaleUnit;		// 规模单位
+	private Double scaleQuantity;		// 规模数量
+	private Area area;		// 项目所在地
+	private String projectSite;		// 建设地点
+	private String province;  //项目所在省
+	private String city;  //项目所在市
+	private String county;//项目所在区
+	private String projectStructure;   //工程结构
+	private String onGroundNum;    //地上层数
+	private String underGroundNum;    //地下层数
+	private String buildingScale;    //建筑规模
+	private String measuringUnit;     //规模单位
+	private String projectUse;        //工程用途
+	private Double installFees;      //安装造价
+	private Double buildingFees;      //土建造价
+	private Double buildingPercent;    //土建百分比
+	private Double installPercent;     //安装百分比
+	private Double unitFees;     //单位造价
+	private Double buildingUnitFees;  //土建单位造价
+	private Double installUnitFees;    //安装单位造价
+	private Double totalFees;        //总合同额
+
+	@NotNull(message = "委托方联系人不能为空")
+	private List<WorkClientLinkman> workClientLinkmanList;		// 委托方联系人
+	private List<WorkClientLinkman> workConstructionLinkmanList;		// 施工方及联系人
+	@NotBlank(message = "工程概况不能为空")
+	private String projectDesc;		// 工程概况
+	@NotNull(message = "项目负责人不能为空")
+	private List<User> projectLeaders; //项目负责人
+	private List<User> projectMembers;  //项目组成员
+
+	private String leaderNameStr;
+	private String leaderIds;
+	private String memberNameStr;
+	private String memberIds;
+
+	private String processInstanceId;
+
+	private Office company;
+	private Office office;
+	private int projectStatus;//项目状态
+
+	private String auditType;
+	@NotBlank(message = "变更原因不能为空")
+	private String alterReason;
+
+	private RuralProjectRecords alterBeforeRecords;
+
+	private Date beginDate;
+	private Date endDate;
+
+	private String home;
+
+	private String alterProjectId;
+
+    private List<WorkClientAttachment> workAttachments = Lists.newArrayList();
+
+	public RuralProjectRecordsAlter() {
+		super();
+	}
+
+	public RuralProjectRecordsAlter(String id){
+		super(id);
+	}
+
+	public WorkContractInfo getWorkContractInfo() {
+		return workContractInfo;
+	}
+
+	public void setWorkContractInfo(WorkContractInfo contract) {
+		this.workContractInfo = contract;
+	}
+
+	@ExcelField(title="项目编号", align=2, sort=7)
+	public String getProjectId() {
+		return projectId;
+	}
+
+	public void setProjectId(String projectId) {
+		this.projectId = projectId;
+	}
+
+	@ExcelField(title="项目名称", align=2, sort=8)
+	public String getProjectName() {
+		return projectName;
+	}
+
+	public void setProjectName(String projectName) {
+		this.projectName = projectName;
+	}
+
+	@ExcelField(title="规模类型", align=2, sort=9)
+	public String getScaleType() {
+		return scaleType;
+	}
+
+	public void setScaleType(String scaleType) {
+		this.scaleType = scaleType;
+	}
+
+	@ExcelField(title="规模单位", align=2, sort=10)
+	public String getScaleUnit() {
+		return scaleUnit;
+	}
+
+	public void setScaleUnit(String scaleUnit) {
+		this.scaleUnit = scaleUnit;
+	}
+
+	@ExcelField(title="规模数量", align=2, sort=11)
+	public Double getScaleQuantity() {
+		return scaleQuantity;
+	}
+
+	public void setScaleQuantity(Double scaleQuantity) {
+		this.scaleQuantity = scaleQuantity;
+	}
+
+	@ExcelField(title="项目所在地", align=2, sort=12)
+	public Area getArea() {
+		return area;
+	}
+
+	public void setArea(Area area) {
+		this.area = area;
+	}
+
+	@ExcelField(title="建设地点", align=2, sort=13)
+	public String getProjectSite() {
+		return projectSite;
+	}
+
+	public void setProjectSite(String projectSite) {
+		this.projectSite = projectSite;
+	}
+
+	public List<WorkClientLinkman> getWorkClientLinkmanList() {
+		return workClientLinkmanList;
+	}
+
+	public void setWorkClientLinkmanList(List<WorkClientLinkman> workClientLinkmanList) {
+		this.workClientLinkmanList = workClientLinkmanList;
+	}
+
+	@ExcelField(title="工程概况", align=2, sort=16)
+	public String getProjectDesc() {
+		return projectDesc;
+	}
+
+	public void setProjectDesc(String projectDesc) {
+		this.projectDesc = projectDesc;
+	}
+
+	public List<User> getProjectLeaders() {
+		return projectLeaders;
+	}
+
+	public void setProjectLeaders(List<User> projectLeaders) {
+		this.projectLeaders = projectLeaders;
+	}
+
+	public List<User> getProjectMembers() {
+		return projectMembers;
+	}
+
+	public void setProjectMembers(List<User> projectMembers) {
+		this.projectMembers = projectMembers;
+	}
+
+	public List<WorkClientLinkman> getWorkConstructionLinkmanList() {
+		return workConstructionLinkmanList;
+	}
+
+	public void setWorkConstructionLinkmanList(List<WorkClientLinkman> workConstructionLinkmanList) {
+		this.workConstructionLinkmanList = workConstructionLinkmanList;
+	}
+
+	public int getProjectStatus() {
+		return projectStatus;
+	}
+
+	public void setProjectStatus(int projectStatus) {
+		this.projectStatus = projectStatus;
+	}
+
+	public String getLeaderNameStr() {
+		return leaderNameStr;
+	}
+
+	public void setLeaderNameStr(String leaderNameStr) {
+		this.leaderNameStr = leaderNameStr;
+	}
+
+	public String getMemberNameStr() {
+		return memberNameStr;
+	}
+
+	public void setMemberNameStr(String memberNameStr) {
+		this.memberNameStr = memberNameStr;
+	}
+
+	public String getLeaderIds() {
+		return leaderIds;
+	}
+
+	public void setLeaderIds(String leaderIds) {
+		this.leaderIds = leaderIds;
+	}
+
+	public String getMemberIds() {
+		return memberIds;
+	}
+
+	public void setMemberIds(String memberIds) {
+		this.memberIds = memberIds;
+	}
+
+	public String getProcessInstanceId() {
+		return processInstanceId;
+	}
+
+	public void setProcessInstanceId(String processInstanceId) {
+		this.processInstanceId = processInstanceId;
+	}
+
+	public String getAuditType() {
+		return auditType;
+	}
+
+	public void setAuditType(String auditType) {
+		this.auditType = auditType;
+	}
+
+	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 getAlterReason() {
+		return alterReason;
+	}
+
+	public void setAlterReason(String alterReason) {
+		this.alterReason = alterReason;
+	}
+
+	public Date getBeginDate() {
+		return beginDate;
+	}
+
+	public void setBeginDate(Date beginDate) {
+		this.beginDate = beginDate;
+	}
+
+	public Date getEndDate() {
+		return endDate;
+	}
+
+	public void setEndDate(Date endDate) {
+		this.endDate = endDate;
+	}
+
+    public List<WorkClientAttachment> getWorkAttachments() {
+        return workAttachments;
+    }
+
+    public void setWorkAttachments(List<WorkClientAttachment> workAttachments) {
+        this.workAttachments = workAttachments;
+    }
+
+    public RuralProjectRecords getAlterBeforeRecords() {
+        return alterBeforeRecords;
+    }
+
+    public void setAlterBeforeRecords(RuralProjectRecords alterBeforeRecords) {
+        this.alterBeforeRecords = alterBeforeRecords;
+    }
+
+    public String getHome() {
+        return home;
+    }
+
+    public void setHome(String home) {
+        this.home = home;
+    }
+
+    public String getAlterProjectId() {
+        return alterProjectId;
+    }
+
+    public void setAlterProjectId(String alterProjectId) {
+        this.alterProjectId = alterProjectId;
+    }
+
+	public String getContractNumber() {
+		if (workContractInfo!=null) {
+			return workContractInfo.getContractNum();
+		}else {
+			return "";
+		}
+	}
+
+	public String getContractName() {
+		if (workContractInfo!=null) {
+			return workContractInfo.getName();
+		}else {
+			return "";
+		}
+	}
+
+	public String getContractPrice() {
+		if (workContractInfo!=null) {
+			return workContractInfo.getContractPrice();
+		}else {
+			return "";
+		}
+	}
+
+	public String getClientName() {
+		if (workContractInfo!=null && workContractInfo.getClient()!=null){
+			return workContractInfo.getClient().getName();
+		}else {
+			return "";
+		}
+	}
+
+	public String getContractType() {
+		if (workContractInfo!=null) {
+			return workContractInfo.getConstructionProjectTypeStr();
+		}else {
+			return "";
+		}
+	}
+
+
+	public String getProvince() {
+		return province;
+	}
+
+	public void setProvince(String province) {
+		this.province = province;
+	}
+
+	public String getCity() {
+		return city;
+	}
+
+	public void setCity(String city) {
+		this.city = city;
+	}
+
+	public String getCounty() {
+		return county;
+	}
+
+	public void setCounty(String county) {
+		this.county = county;
+	}
+
+	public String getProjectStructure() {
+		return projectStructure;
+	}
+
+	public void setProjectStructure(String projectStructure) {
+		this.projectStructure = projectStructure;
+	}
+
+	public String getOnGroundNum() {
+		return onGroundNum;
+	}
+
+	public void setOnGroundNum(String onGroundNum) {
+		this.onGroundNum = onGroundNum;
+	}
+
+	public String getUnderGroundNum() {
+		return underGroundNum;
+	}
+
+	public void setUnderGroundNum(String underGroundNum) {
+		this.underGroundNum = underGroundNum;
+	}
+
+	public String getBuildingScale() {
+		return buildingScale;
+	}
+
+	public void setBuildingScale(String buildingScale) {
+		this.buildingScale = buildingScale;
+	}
+
+	public String getMeasuringUnit() {
+		return measuringUnit;
+	}
+
+	public void setMeasuringUnit(String measuringUnit) {
+		this.measuringUnit = measuringUnit;
+	}
+
+	public String getProjectUse() {
+		return projectUse;
+	}
+
+	public void setProjectUse(String projectUse) {
+		this.projectUse = projectUse;
+	}
+
+	public Double getInstallFees() {
+		return installFees;
+	}
+
+	public void setInstallFees(Double installFees) {
+		this.installFees = installFees;
+	}
+
+	public Double getBuildingFees() {
+		return buildingFees;
+	}
+
+	public void setBuildingFees(Double buildingFees) {
+		this.buildingFees = buildingFees;
+	}
+
+	public Double getBuildingPercent() {
+		return buildingPercent;
+	}
+
+	public void setBuildingPercent(Double buildingPercent) {
+		this.buildingPercent = buildingPercent;
+	}
+
+	public Double getInstallPercent() {
+		return installPercent;
+	}
+
+	public void setInstallPercent(Double installPercent) {
+		this.installPercent = installPercent;
+	}
+
+	public Double getUnitFees() {
+		return unitFees;
+	}
+
+	public void setUnitFees(Double unitFees) {
+		this.unitFees = unitFees;
+	}
+
+	public Double getBuildingUnitFees() {
+		return buildingUnitFees;
+	}
+
+	public void setBuildingUnitFees(Double buildingUnitFees) {
+		this.buildingUnitFees = buildingUnitFees;
+	}
+
+	public Double getInstallUnitFees() {
+		return installUnitFees;
+	}
+
+	public void setInstallUnitFees(Double installUnitFees) {
+		this.installUnitFees = installUnitFees;
+	}
+
+	public Double getTotalFees() {
+		return totalFees;
+	}
+
+	public void setTotalFees(Double totalFees) {
+		this.totalFees = totalFees;
+	}
+}

+ 25 - 0
src/main/java/com/jeeplus/modules/ruralprojectrecords/enums/AlterStatusEnum.java

@@ -0,0 +1,25 @@
+package com.jeeplus.modules.ruralprojectrecords.enums;
+
+public enum AlterStatusEnum {
+    TSTORE(1,"暂存"),
+    IN_APRL(2,"变更中"),
+    REJECTED(4,"驳回"),
+    RECALL(3,"撤回"),
+    SIGNED(5,"已变更");
+
+    private int value;
+    private String desc;
+
+    AlterStatusEnum(int val, String desc) {
+        this.value = val;
+        this.desc = desc;
+    }
+
+    public int getValue() {
+        return value;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+}

+ 29 - 0
src/main/java/com/jeeplus/modules/ruralprojectrecords/enums/ProjectStatusEnum.java

@@ -0,0 +1,29 @@
+package com.jeeplus.modules.ruralprojectrecords.enums;
+
+public enum ProjectStatusEnum {
+    TSTORE(1,"暂存"),
+    IN_APRL(2,"审批中"),
+    REJECTED(4,"已驳回"),
+    RECALL(3,"已撤回"),
+    SIGNED(5,"已签"),
+    INVALIDING(6,"作废中"),
+    INVALID(7,"已作废"),
+    ON_CHANGE(8,"变更中"),
+    DONE(9,"已完成");
+
+    private int value;
+    private String desc;
+
+    ProjectStatusEnum(int val, String desc) {
+        this.value = val;
+        this.desc = desc;
+    }
+
+    public int getValue() {
+        return value;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+}

+ 973 - 0
src/main/java/com/jeeplus/modules/ruralprojectrecords/service/RuralProjectRecordsAlterService.java

@@ -0,0 +1,973 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.ruralprojectrecords.service;
+
+import com.google.common.collect.Maps;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.service.CrudService;
+import com.jeeplus.common.utils.Collections3;
+import com.jeeplus.common.utils.MenuStatusEnum;
+import com.jeeplus.modules.act.entity.Act;
+import com.jeeplus.modules.act.service.ActTaskService;
+import com.jeeplus.modules.act.utils.ProcessDefCache;
+import com.jeeplus.modules.ruralprojectrecords.dao.RuralProjectClientLinkmanDao;
+import com.jeeplus.modules.ruralprojectrecords.dao.RuralProjectRecordsAlterDao;
+import com.jeeplus.modules.ruralprojectrecords.dao.RuralWorkProjectUserDao;
+import com.jeeplus.modules.ruralprojectrecords.entity.RuralProjectRecords;
+import com.jeeplus.modules.ruralprojectrecords.entity.RuralProjectRecordsAlter;
+import com.jeeplus.modules.ruralprojectrecords.enums.AlterStatusEnum;
+import com.jeeplus.modules.ruralprojectrecords.enums.ProjectStatusEnum;
+import com.jeeplus.modules.sys.entity.Office;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.service.DictService;
+import com.jeeplus.modules.sys.service.OfficeService;
+import com.jeeplus.modules.sys.utils.DictUtils;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.workactivity.dao.WorkActivityProcessDao;
+import com.jeeplus.modules.workactivity.entity.Activity;
+import com.jeeplus.modules.workactivity.entity.WorkActivityProcess;
+import com.jeeplus.modules.workactivity.service.ActivityService;
+import com.jeeplus.modules.workactivity.service.WorkActivityProcessService;
+import com.jeeplus.modules.workactivitymenu.entity.WorkActivityMenu;
+import com.jeeplus.modules.workactivitymenu.service.WorkActivityMenuService;
+import com.jeeplus.modules.workclientinfo.dao.WorkClientAttachmentDao;
+import com.jeeplus.modules.workclientinfo.dao.WorkClientLinkmanDao;
+import com.jeeplus.modules.workclientinfo.entity.WorkClientAttachment;
+import com.jeeplus.modules.workclientinfo.entity.WorkClientInfo;
+import com.jeeplus.modules.workclientinfo.entity.WorkClientLinkman;
+import com.jeeplus.modules.workcontractinfo.entity.WorkContractInfo;
+import com.jeeplus.modules.workcontractinfo.service.WorkContractInfoService;
+import com.jeeplus.modules.workprojectnotify.entity.WorkProjectNotify;
+import com.jeeplus.modules.workprojectnotify.service.WorkProjectNotifyService;
+import com.jeeplus.modules.workprojectnotify.util.UtilNotify;
+import org.activiti.engine.HistoryService;
+import org.activiti.engine.IdentityService;
+import org.activiti.engine.RuntimeService;
+import org.activiti.engine.history.HistoricTaskInstance;
+import org.activiti.engine.history.HistoricTaskInstanceQuery;
+import org.activiti.engine.runtime.ProcessInstance;
+import org.apache.commons.beanutils.BeanUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 项目登记Service
+ * @author ppt
+ * @version 2018-05-02
+ */
+@Service
+@Transactional(readOnly = true)
+public class RuralProjectRecordsAlterService extends CrudService<RuralProjectRecordsAlterDao, RuralProjectRecordsAlter> {
+
+	@Autowired
+	private RuralWorkProjectUserDao workProjectUserDao;
+	@Autowired
+	private RuralProjectClientLinkmanDao clientLinkmanDao;
+	@Autowired
+	private WorkClientLinkmanDao workClientLinkmanDao;
+	@Autowired
+	private DictService dictService;
+	@Autowired
+	private IdentityService identityService;
+	@Autowired
+	private OfficeService officeService;
+	@Autowired
+	private ActTaskService actTaskService;
+	@Autowired
+	private WorkActivityMenuService workActivityMenuService;
+	@Autowired
+	private RuntimeService runtimeService;
+	@Autowired
+	private WorkActivityProcessService workActivityProcessService;
+	@Autowired
+	private WorkProjectNotifyService workProjectNotifyService;
+	@Autowired
+	private ActivityService activityService;
+    @Autowired
+    protected HistoryService historyService;
+    @Autowired
+	private RuralProjectRecordsService recordsService;
+	@Autowired
+	private WorkContractInfoService contractInfoService;
+    @Autowired
+    private WorkClientAttachmentDao workClientAttachmentDao;
+    @Autowired
+    private WorkActivityProcessDao workActivityProcessDao;
+
+	public RuralProjectRecordsAlter get(String id) {
+		return super.get(id);
+	}
+
+	public List<RuralProjectRecordsAlter> findList(RuralProjectRecordsAlter projectRecords) {
+		return super.findList(projectRecords);
+	}
+
+	public Page<RuralProjectRecordsAlter> findPage(Page<RuralProjectRecordsAlter> page, RuralProjectRecordsAlter projectRecords) {
+		//设置数据权限
+		projectRecords.getSqlMap().put("dsf", dataScopeFilter(projectRecords.getCurrentUser(), "o", "u", "s", MenuStatusEnum.PROJECT_RECORDSALTER.getValue()));
+		projectRecords.setPage(page);
+		List<RuralProjectRecordsAlter> recordsList = findList(projectRecords);
+		//查询负责人信息
+		for (RuralProjectRecordsAlter records : recordsList) {
+			List<User> users = workProjectUserDao.queryProjectUsers(records.getId(), "1");
+			records.setProjectLeaders(users);
+		}
+		page.setList(recordsList);
+		return page;
+	}
+
+	@Transactional(readOnly = false)
+	public void saveProject(RuralProjectRecordsAlter projectRecordsAlter, AlterStatusEnum alterStatus) throws Exception {
+        WorkContractInfo workContractInfo = contractInfoService.get(projectRecordsAlter.getWorkContractInfo().getId());
+		RuralProjectRecords records = recordsService.get(projectRecordsAlter.getAlterBeforeRecords().getId());
+
+		if(records.getProjectStatus()!= ProjectStatusEnum.SIGNED.getValue() && records.getProjectStatus()!= ProjectStatusEnum.ON_CHANGE.getValue()){
+			throw  new Exception("项目状态发生变动,不能发起变更");
+		}else if(records.getProjectStatus()== ProjectStatusEnum.ON_CHANGE.getValue() && AlterStatusEnum.TSTORE.getValue() != projectRecordsAlter.getProjectStatus()
+                && AlterStatusEnum.REJECTED.getValue() != projectRecordsAlter.getProjectStatus()&& AlterStatusEnum.RECALL.getValue() != projectRecordsAlter.getProjectStatus()){
+            throw  new Exception("项目状态发生变动,不能发起变更");
+        }
+        Integer oldStatus = projectRecordsAlter.getProjectStatus();
+        projectRecordsAlter.setProjectStatus(alterStatus.getValue());
+        //更新原有项目状态信息
+        records.setProjectStatus(ProjectStatusEnum.ON_CHANGE.getValue());
+        records.preUpdate();
+        recordsService.updateSelectiveById(records);
+
+        if(StringUtils.isBlank(projectRecordsAlter.getAlterProjectId())){
+            projectRecordsAlter.setAlterProjectId(projectRecordsAlter.getProjectId()+"-变更-"+this.countAlter(projectRecordsAlter.getProjectId()));
+        }
+		User createBy = projectRecordsAlter.getCreateBy();
+		if(createBy != null){
+			createBy = UserUtils.get(createBy.getId());
+		}else {
+		    createBy = UserUtils.getUser();
+        }
+		Office company= new Office();
+        Office office =  new Office();
+        if(StringUtils.isNotBlank((projectRecordsAlter.getWorkContractInfo().getId()))){
+            //有合同状态
+            workContractInfo = contractInfoService.get(projectRecordsAlter.getWorkContractInfo().getId());
+            company.setId(workContractInfo.getCompanyId());
+//			office.setId(workContractInfo.getChargeCompany());
+            office.setId(UserUtils.getUser().getOffice().getId());
+        }else{
+            //无合同
+            company.setId(UserUtils.getUser().getCompany().getId());
+            office.setId(UserUtils.getUser().getOffice().getId());
+        }
+		projectRecordsAlter.setCompany(company);
+		projectRecordsAlter.setOffice(office);
+		super.save(projectRecordsAlter);
+		//保存项目负责人
+		List<User> leaders = projectRecordsAlter.getProjectLeaders();
+		this.saveProjectUsers(projectRecordsAlter.getId(), leaders, true);
+		//保存委托方联系人
+		List<WorkClientLinkman> workClientLinkmanList = projectRecordsAlter.getWorkClientLinkmanList();
+		this.saveLinkmanInfos(projectRecordsAlter.getId(), workClientLinkmanList, true);
+		//保存施工方联系信息
+		List<WorkClientLinkman> constructionLinkmanList = projectRecordsAlter.getWorkConstructionLinkmanList();
+		this.saveLinkmanInfos(projectRecordsAlter.getId(), constructionLinkmanList, false);
+		this.saveAttachments(projectRecordsAlter);
+		if (AlterStatusEnum.TSTORE.getValue()== projectRecordsAlter.getProjectStatus()|| AlterStatusEnum.REJECTED.getValue()==oldStatus)return;
+		//启动审批流程
+		this.startAudit(projectRecordsAlter, projectRecordsAlter.getProcessInstanceId());
+	}
+
+    private int countAlter(String projectId) {
+	    return dao.countAlter(projectId)+1;
+    }
+
+    /**
+	 * 保存委托方和施工方联系人信息
+	 *
+	 * @param projectId
+	 * @param linkmanList
+	 * @param isEntrust   是否委托方
+	 */
+	private void saveLinkmanInfos(String projectId, List<WorkClientLinkman> linkmanList, boolean isEntrust) {
+		assert (projectId != null);
+        if(linkmanList == null || linkmanList.isEmpty()){
+            return;
+        }
+		HashMap<String, Object> map = new HashMap<>(5);
+		map.put("projectId", projectId);
+		map.put("linkmanList", linkmanList);
+		int entrust = 0;
+		if (isEntrust) {
+			entrust = 1;
+		}
+		clientLinkmanDao.deleteProjectLinkmans(projectId, entrust);
+		map.put("isEntrust", entrust);
+		clientLinkmanDao.batchInsert(map);
+	}
+
+	/**
+	 * 保存项目组成员信息
+	 *
+	 * @param projectId
+	 * @param users
+	 * @param isMaster
+	 */
+	private void saveProjectUsers(String projectId, List<User> users, boolean isMaster) {
+		assert (projectId != null);
+		assert (users != null && !users.isEmpty());
+		HashMap<String, Object> map = new HashMap<>(5);
+		List<String> memberIds = new ArrayList<>(users.size());
+		for (User user : users) {
+			memberIds.add(user.getId());
+		}
+		map.put("memberIds", memberIds);
+		map.put("projectId", projectId);
+		String master = null;
+		if (isMaster) {
+			master = "1";
+            workProjectUserDao.deleteProjectMasterMembers(map);
+           /* map.put("isMaster", "0");
+            workProjectUserDao.batchInsert(map);*/
+		} else {
+			master = "0";
+		}
+		workProjectUserDao.deleteProjectMembers(projectId, master);
+		map.put("isMaster", master);
+		workProjectUserDao.batchInsert(map);
+	}
+
+	@Transactional(readOnly = false)
+	public void delete(RuralProjectRecordsAlter projectRecords) {
+		//删除项目负责人
+		workProjectUserDao.deleteProjectMembers(projectRecords.getId(), "1");
+		//删除项目组成员
+//		workProjectUserDao.deleteProjectMembers(projectRecords.getId(), "0");
+		//删除委托方联系人
+		clientLinkmanDao.deleteProjectLinkmans(projectRecords.getId(), 1);
+		//删除施工方联系人
+		clientLinkmanDao.deleteProjectLinkmans(projectRecords.getId(), 0);
+		super.delete(projectRecords);
+		//修改原项目状态
+		if (projectRecords.getAlterBeforeRecords()!=null){
+			RuralProjectRecords records = new RuralProjectRecords();
+			records.preUpdate();
+			records.setId(projectRecords.getAlterBeforeRecords().getId());
+			records.setProjectStatus(ProjectStatusEnum.SIGNED.getValue());
+			recordsService.updateSelectiveById(records);
+		}
+        WorkProjectNotify notify = new WorkProjectNotify();
+        notify.setNotifyId(projectRecords.getId());
+        List<User> users = workProjectNotifyService.readByNotifyId(notify);
+        if (users!=null && users.size()!=0){
+            for (User user:users){
+                UserUtils.pushMeIm(user.getId());
+            }
+        }
+	}
+
+	/**
+	 * 设置项目组成员信息
+	 *
+	 * @param records
+	 */
+	public void queryUserNames(RuralProjectRecordsAlter records) {
+		//查询负责人信息
+		List<User> users = workProjectUserDao.queryProjectUsers(records.getId(), "1");
+		records.setProjectLeaders(users);
+		records.setLeaderNameStr(Collections3.extractToString(users, "name", ","));
+		records.setLeaderIds(Collections3.extractToString(users, "id", ","));
+
+		//查询项目组成员信息
+		List<User> members = workProjectUserDao.isDelFalg(records.getId(), "");
+		records.setProjectMembers(members);
+		records.setMemberNameStr(Collections3.extractToString(members, "name", ","));
+		records.setMemberIds(Collections3.extractToString(members, "id", ","));
+	}
+
+	/**
+	 * 设置联系人信息
+	 *
+	 * @param projectRecords
+	 */
+	public void queryLinkmanInfos(RuralProjectRecordsAlter projectRecords) {
+		List<WorkClientLinkman> clientLinkmanList = workClientLinkmanDao.queryProjectLinkmans(projectRecords.getId(), 1);
+		projectRecords.setWorkClientLinkmanList(clientLinkmanList);
+		List<WorkClientLinkman> constructionLinkmanList = workClientLinkmanDao.queryProjectLinkmans(projectRecords.getId(), 0);
+		projectRecords.setWorkConstructionLinkmanList(constructionLinkmanList);
+	}
+
+	/**
+	 * 启动审批流程
+	 *
+	 * @param projectRecordsAlter
+	 */
+    private void startAudit(RuralProjectRecordsAlter projectRecordsAlter, String processInstanceId) throws Exception {
+        Map<String, Object> variables = new HashMap<String, Object>();
+        identityService.setAuthenticatedUserId(projectRecordsAlter.getCurrentUser().getId());
+        Office office = projectRecordsAlter.getOffice();
+        office = officeService.get(office.getId());
+        projectRecordsAlter.setOffice(office);
+        String contentStr = "项目变更编号:"+projectRecordsAlter.getAlterProjectId()+",项目名称:"+ projectRecordsAlter.getProjectName()+",创建人:"+projectRecordsAlter.getCreateBy().getName()+",所属部门:"+projectRecordsAlter.getOffice().getName();
+        String titleStr = "项目名称:"+ projectRecordsAlter.getProjectName();
+
+        String businessKey = projectRecordsAlter.getId();
+        WorkActivityMenu workActivityMenu = workActivityMenuService.findByParentAndOffice("807c6d4b5623474792fe78ff1fd1cdff", office);
+        // 启动流程
+        String processType = workActivityMenu.getProcessType();
+        StringBuffer buffer = new StringBuffer();
+        Activity activity = new Activity();
+        WorkProjectNotify workProjectNotify = UtilNotify
+                .saveNotify(projectRecordsAlter.getId(),
+                        null,
+                        projectRecordsAlter.getCompany().getId(),
+                        titleStr,
+                        contentStr,
+                        "41",
+                        "0",
+                        "待审批",
+                        ""
+                );
+
+        List<User> users = new ArrayList<>();
+        List<User> bmzrs = UserUtils.getByRoleActivityEnname("bmzr",2,office.getId(),"4",projectRecordsAlter.getCreateBy());
+        if (StringUtils.isNotBlank(workActivityMenu.getId())) {
+            processType = workActivityMenu.getProcessType();
+            workActivityMenu = workActivityMenuService.get(workActivityMenu.getId());
+            List<Activity> activities = workActivityMenu.getActivities();
+            for (Activity a : activities) {
+                String encount = a.getEncount();
+                String enlist = a.getEnlist();
+                if (a.getRole()!=null && StringUtils.isNotBlank(a.getRole().getEnname())){
+                    List enusers = UserUtils.getByRoleActivityEnnames(a.getRole().getEnname(),office.getId(),"8",projectRecordsAlter.getCreateBy());
+                    if (enusers.size()==0){
+                            /*this.delete(projectRecordsAlter);
+                            for (WorkClientAttachment workClientAttachment : projectRecordsAlter.getWorkAttachments()) {
+                                workClientAttachmentDao.delete(workClientAttachment);
+                            }*/
+                        throw new Exception("流程审批人不能为空,角色"+a.getRole().getName()+"下无用户,请联系管理员!");
+                    }
+                    variables.put(enlist, enusers);
+                    variables.put(encount, enusers.size());
+                }
+                if (a.getDelFlag().equals("0") && a.getCount() == 1) {
+                    activity = a;
+                }
+            }
+            buffer.append(activity.getRole().getEnname());
+            if (activity != null && StringUtils.isNotBlank(activity.getId())) {
+                //角色审批
+                if (StringUtils.isNotBlank(activity.getRole().getEnname())) {
+                    users = UserUtils.getByRoleActivityEnnames(activity.getRole().getEnname(),office.getId(),"4",projectRecordsAlter.getCreateBy());
+                }
+                //人员审批
+                if (StringUtils.isNotBlank(activity.getUser().getId())) {
+                    users.add(activity.getUser());
+                }
+            }
+            workProjectNotify.setId("");
+        } else {
+            if (bmzrs==null||bmzrs.size()==0){
+                    /*this.delete(projectRecordsAlter);
+                    if (projectRecordsAlter.getWorkAttachments()!=null) {
+                        for (WorkClientAttachment workClientAttachment : projectRecordsAlter.getWorkAttachments()) {
+                            workClientAttachmentDao.delete(workClientAttachment);
+                        }
+                    }*/
+                throw new Exception("流程审批人不能为空,角色部门负责人下无用户,请联系管理员!");
+            }
+            processType = "projectAlter";
+            variables.put("applyUserId", projectRecordsAlter.getCreateBy().getId());
+            variables.put("bmzrCount",bmzrs.size());
+            variables.put("bmzrList",bmzrs);
+            users.addAll(bmzrs);
+        }
+        List<String> userIds = new ArrayList<>(users.size());
+        for (User u : users){
+            userIds.add(u.getId());
+            workProjectNotify.setUser(u);
+            workProjectNotify.setId("");
+            workProjectNotify.setNotifyRole("部门负责人审批");
+            workProjectNotifyService.save(workProjectNotify);
+            Map<String,Object> extras = new HashMap<>();
+            extras.put("type","7003");
+            extras.put("procDefKey","41");
+            extras.put("id",workProjectNotify.getId());
+            UserUtils.pushInfoToApp(titleStr,contentStr,extras,u.getId());
+        }
+        UserUtils.pushIm(userIds,contentStr);
+
+        variables.put("busId", businessKey);
+        variables.put("type", processType);
+        variables.put("title", "审批单:" + projectRecordsAlter.getProjectName());//设置标题;
+
+        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processType, businessKey, variables);
+        //        projectRecordsAlter.setProcessInstance(processInstance);
+        if (StringUtils.isNotBlank(processInstanceId)) {
+            workActivityProcessService.updateProcessInstanceId(processInstance.getId(),processInstanceId);
+            workActivityProcessService.deleteProcessInstanceId(processInstanceId);
+            workActivityProcessService.deleteProcessIdAuditUsers(processInstanceId);
+        }
+        List<Activity> list = workActivityMenu.getActivities();
+        if (list != null && list.size() != 0) {
+            workActivityProcessService.saveList(list, processInstance.getId());
+        } else {
+            WorkActivityProcess workActivityProcess = new WorkActivityProcess();
+            workActivityProcess.setProcessKey(processType);
+            workActivityProcess.setCount(1);
+            workActivityProcess.setProcessInstanceId(processInstance.getId());
+            workActivityProcess.setIsApproval("0");
+            workActivityProcessService.save(workActivityProcess);
+            workActivityProcessService.insertAuditsByType(bmzrs,processInstance.getId(),1,1);
+
+        }
+        projectRecordsAlter.setProcessInstanceId(processInstance.getId());
+        projectRecordsAlter.setProjectStatus(AlterStatusEnum.IN_APRL.getValue());
+        dao.updateProcessIdAndStatus(projectRecordsAlter);
+        //更新原有项目状态信息
+        RuralProjectRecords records = recordsService.get(projectRecordsAlter.getAlterBeforeRecords().getId());
+        records.setAlterProcessId(processInstance.getId());
+        records.preUpdate();
+        recordsService.updateSelectiveById(records);
+    }
+
+	@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
+	public void updateSelectiveById(RuralProjectRecordsAlter projectRecords) {
+		dao.updateSelectiveById(projectRecords);
+	}
+
+	public RuralProjectRecordsAlter getByProcessInstanceId(String procInsId) {
+		RuralProjectRecordsAlter records = dao.findUniqueByProperty("process_instance_id", procInsId);
+		if(records!=null) {
+            List<User> users = workProjectUserDao.queryProjectUsers(records.getId(), "1");
+            records.setProjectLeaders(users);
+        }
+		return records;
+	}
+
+    /**
+     * @param projectRecordsAlter
+     * @return
+     */
+	@Transactional(readOnly = false)
+	public String auditSave(RuralProjectRecordsAlter projectRecordsAlter, List<User> auditUsers) throws Exception {
+        int projectStatus = projectRecordsAlter.getProjectStatus();
+        String taskDefKey = projectRecordsAlter.getAct().getTaskDefKey();
+        if (!"modifyApply".equals(taskDefKey) && !taskDefKey.contains("audit") ) {
+            actTaskService.claim(projectRecordsAlter.getAct().getTaskId(), UserUtils.getUser().getId());
+            List<User> leaders = projectRecordsAlter.getProjectLeaders();
+            this.saveProjectUsers(projectRecordsAlter.getId(), leaders, true);
+        }else {
+            projectRecordsAlter.getAct().setFlag("yes");
+            saveProject(projectRecordsAlter, AlterStatusEnum.IN_APRL);
+        }
+
+        String comment = "";
+        if ( projectStatus == AlterStatusEnum.REJECTED.getValue()) {
+            comment = ("yes".equals(projectRecordsAlter.getAct().getFlag())?"[重新申请] ":"[已撤销] ");
+        }else {
+            comment = ("yes".equals(projectRecordsAlter.getAct().getFlag())?"[同意] ":"[驳回] ")+ projectRecordsAlter.getAct().getComment();
+        }
+
+        if (!"yes".equals(projectRecordsAlter.getAct().getFlag())) {
+            projectRecordsAlter.setProjectStatus(AlterStatusEnum.REJECTED.getValue());
+        }
+
+        User createUser = UserUtils.get(projectRecordsAlter.getCreateBy().getId());
+
+        Map<String, Object> vars = Maps.newHashMap();
+        String notifyRole = "";
+        //业务逻辑对应的条件表达式
+        User user = null;
+        List<Activity> activitieList = activityService.getByProcessInstanceId(projectRecordsAlter.getProcessInstanceId());
+        WorkActivityMenu workActivityMenu = new WorkActivityMenu();
+        if (activitieList != null && activitieList.size() != 0) {
+            workActivityMenu.setProcessType(activitieList.get(0).getProcessKey());
+            workActivityMenu.setActivities(activitieList);
+        }
+
+        WorkActivityProcess workActivityProcess = new WorkActivityProcess();
+        WorkActivityProcess selectProcess = new WorkActivityProcess();
+        selectProcess.setProcessInstanceId(projectRecordsAlter.getProcessInstanceId());
+        List<WorkActivityProcess> workActivityProcesses = workActivityProcessService.findList(selectProcess);
+        List<Activity> activities = workActivityMenu.getActivities();
+        String  taskCount = "1";
+        String enname = "";
+        Office office = officeService.get(projectRecordsAlter.getOffice().getId());
+        projectRecordsAlter.setOffice(office);
+        String notifyStr = "项目变更编号:"+projectRecordsAlter.getAlterProjectId()+",项目名称:"+ projectRecordsAlter.getProjectName();
+        String title = "项目名称:"+ projectRecordsAlter.getProjectName();
+        int key = 0;
+        if (StringUtils.isNotBlank(workActivityMenu.getProcessType()) && !workActivityMenu.getProcessType().equals("projectAlter")) {
+            key = 1;
+            for (int i = 0; i < workActivityProcesses.size(); i++) {
+                WorkActivityProcess activityProcess = workActivityProcesses.get(i);
+                if (taskDefKey.equals("modifyApply")) {
+                    taskCount = "0";
+                    workActivityProcess.setId("");
+                    workActivityProcess.setCount(0);
+                    if (!"yes".equals(projectRecordsAlter.getAct().getFlag())) {
+                        projectRecordsAlter.setProjectStatus(AlterStatusEnum.RECALL.getValue());
+                        workActivityProcess.setIsApproval("2");
+                        vars.put("pass", false);
+                    } else {
+                        vars.put("pass", true);
+                        workActivityProcess.setIsApproval("1");
+                    }
+                    break;
+                } else {
+                    taskCount = activityProcess.getCount()+"";
+                    workActivityProcess = activityProcess;
+                    if (!workActivityProcess.getIsApproval().equals("0")) {
+                        workActivityProcess.setId("");
+                    }
+                    for (Activity activity : activities) {
+                        if (activity.getCount() == activityProcess.getCount()) {
+                            notifyRole = activity.getName();
+                            break;
+                        }
+                    }
+                    if (!"yes".equals(projectRecordsAlter.getAct().getFlag())) {
+                        notifyRole = "调整项目变更";
+                        projectRecordsAlter.setProjectStatus(AlterStatusEnum.REJECTED.getValue());
+                        workActivityProcess.setIsApproval("2");
+                        String returnBack = "-1";
+                        for (Activity activity : activities) {
+                            if (activity.getCount() == activityProcess.getCount()) {
+                                returnBack = activity.getReturnBack();
+                                break;
+                            }
+                        }
+                        if (returnBack.equals("0")) {
+                            workActivityProcess.setId("");
+                        }
+                        vars.put("pass", false);
+                    } else {
+                        workActivityProcess.setIsApproval("1");
+                        vars.put("pass", true);
+                    }
+                    break;
+                }
+            }
+        }else {
+            workActivityMenu.setProcessType("projectAlter");
+            for (int i = 0; i < workActivityProcesses.size(); i++) {
+                WorkActivityProcess activityProcess = workActivityProcesses.get(i);
+                String count = String.valueOf(activityProcess.getCount());
+                workActivityProcess = activityProcess;
+                if (!workActivityProcess.getIsApproval().equals("0")) {
+                    workActivityProcess.setId("");
+                }
+                // 审核环节
+                if ("bmzr".equals(taskDefKey) && "1".equals(count)) {
+                    taskCount = count;
+                    if ("yes".equals(projectRecordsAlter.getAct().getFlag())) {
+                        workActivityProcess.setIsApproval("1");
+                        vars.put("pass", true);
+                        notifyRole = "审批通过";
+                    } else {
+                        workActivityProcess.setIsApproval("2");
+                        vars.put("pass", false);
+                        user = createUser;
+                        notifyRole = "调整项目变更";
+                    }
+                    break;
+                } else if ("modifyApply".equals(taskDefKey) && "0".equals(count)) {
+                    taskCount = "0";
+                    enname = "bmzr";
+                    workActivityProcess.setCount(0);
+                    if("yes".equals(projectRecordsAlter.getAct().getFlag())){
+                        workActivityProcess.setIsApproval("1");
+                        vars.put("pass",true);
+                        notifyRole = "部门负责人审批";
+                    }else{
+                        workActivityProcess.setIsApproval("2");
+                        projectRecordsAlter.setProjectStatus(AlterStatusEnum.RECALL.getValue());
+                        vars.put("pass",false);
+                    }
+                    break;
+                }
+            }
+        }
+        workActivityProcessService.updateProcess(workActivityProcess,workActivityMenu,key,taskCount, projectRecordsAlter.getProcessInstanceId(),taskDefKey,"modifyApply", projectRecordsAlter.getAct().getFlag(),comment, activities);
+        // 设置意见
+        projectRecordsAlter.getAct().setComment(comment);
+        projectRecordsAlter.preUpdate();
+        // 提交流程任务
+        actTaskService.complete(projectRecordsAlter.getAct().getTaskId(), projectRecordsAlter.getAct().getProcInsId(), projectRecordsAlter.getAct().getComment(), vars);
+        boolean state = actTaskService.isProcessEnd(projectRecordsAlter.getAct().getProcInsId());
+        List<User> users = new ArrayList<>();
+        List<User> userList = new ArrayList<>();
+        if(!state) {
+            users.add(projectRecordsAlter.getCreateBy());
+            if ("yes".equals(projectRecordsAlter.getAct().getFlag())) {
+                projectRecordsAlter.setProjectStatus(AlterStatusEnum.SIGNED.getValue());
+                WorkProjectNotify notify = new WorkProjectNotify();
+                notify.setNotifyId(projectRecordsAlter.getId());
+                userList = workProjectNotifyService.readByNotifyId(notify);
+                workProjectNotifyService
+                        .save(UtilNotify
+                                .saveNotify(projectRecordsAlter.getId(),
+                                        projectRecordsAlter.getCreateBy(),
+                                        projectRecordsAlter.getCompany().getId(),
+                                        title,
+                                        notifyStr,
+                                        "41",
+                                        "0",
+                                        "待通知",
+                                        notifyRole));
+            } else {
+                WorkProjectNotify notify = new WorkProjectNotify();
+                notify.setNotifyId(projectRecordsAlter.getId());
+                userList = workProjectNotifyService.readByNotifyId(notify);
+                if (projectRecordsAlter.getProjectStatus()!= AlterStatusEnum.RECALL.getValue()){
+                    projectRecordsAlter.setProjectStatus(AlterStatusEnum.REJECTED.getValue());
+                    workProjectNotifyService
+                            .save(UtilNotify
+                                    .saveNotify(projectRecordsAlter.getId(),
+                                            projectRecordsAlter.getCreateBy(),
+                                            projectRecordsAlter.getCompany().getId(),
+                                            title,
+                                            notifyStr,
+                                            "41",
+                                            "0",
+                                            "待通知",
+                                            notifyRole));
+                }
+            }
+            workActivityProcessService.deleteProcessIdAuditUsers(projectRecordsAlter.getProcessInstanceId());
+        }else{
+            String str = notifyStr +",创建人:"+projectRecordsAlter.getCreateBy().getName()+",所属部门:"+projectRecordsAlter.getOffice().getName();
+            if (StringUtils.isNotBlank(workActivityMenu.getProcessType()) && !workActivityMenu.getProcessType().equals("projectAlter")) {
+                WorkProjectNotify notify = new WorkProjectNotify();
+                notify.setNotifyId(projectRecordsAlter.getId());
+                userList = workProjectNotifyService.readByNotifyId(notify);
+                WorkProjectNotify workProjectNotify = UtilNotify
+                        .saveNotify(projectRecordsAlter.getId(),
+                                new User(),
+                                projectRecordsAlter.getCompany().getId(),
+                                title,
+                                str,
+                                "41",
+                                "0",
+                                "待审批",
+                                notifyRole);
+                String count = taskDefKey.replace("audit","").replace("task","");
+                List<WorkProjectNotify> workProjectNotifys = activityService.getByFlagAndTaskDefKeyList(
+                        activities,
+                        workProjectNotify,
+                        taskDefKey,
+                        projectRecordsAlter.getAct().getFlag(),
+                        count,
+                        projectRecordsAlter.getCreateBy(),
+                        projectRecordsAlter.getOffice().getId(),
+                        "4");
+                for (WorkProjectNotify workProjectNotify1:workProjectNotifys){
+                    users.add(workProjectNotify1.getUser());
+                    workProjectNotify1.setId("");
+                    workProjectNotify1.setIsNewRecord(false);
+                    workProjectNotifyService.save(workProjectNotify1);
+                }
+            }else {
+                if (!"yes".equals(projectRecordsAlter.getAct().getFlag())) {
+                    WorkProjectNotify notify = new WorkProjectNotify();
+                    notify.setNotifyId(projectRecordsAlter.getId());
+                    userList = workProjectNotifyService.readByNotifyId(notify);
+                    WorkProjectNotify workProjectNotify = UtilNotify
+                            .saveNotify(projectRecordsAlter.getId(),
+                                    user,
+                                    projectRecordsAlter.getCompany().getId(),
+                                    title,
+                                    str,
+                                    "41",
+                                    "0",
+                                    "重新申请",
+                                    notifyRole);
+                    workProjectNotifyService.save(workProjectNotify);
+                } else {
+                    if (StringUtils.isNotBlank(enname)) {
+                        WorkProjectNotify notify = new WorkProjectNotify();
+                        notify.setNotifyId(projectRecordsAlter.getId());
+                        userList = workProjectNotifyService.readByNotifyId(notify);
+                        WorkProjectNotify workProjectNotify = UtilNotify
+                                .saveNotify(projectRecordsAlter.getId(),
+                                        new User(),
+                                        projectRecordsAlter.getCompany().getId(),
+                                        title,
+                                        str,
+                                        "41",
+                                        "0",
+                                        "待审批",
+                                        notifyRole);
+                        for (User user1:auditUsers){
+                            users.add(user1);
+                            workProjectNotify.setUser(user1);
+                            workProjectNotify.setId("");
+                            workProjectNotify.setIsNewRecord(false);
+                            workProjectNotifyService.save(workProjectNotify);
+                            Map<String,Object> extras = new HashMap<>();
+                            extras.put("type","7003");
+                            extras.put("procDefKey","41");
+                            extras.put("id",workProjectNotify.getId());
+                            UserUtils.pushInfoToApp(title,str,extras,user1.getId());
+                        }
+                    }else {
+                        WorkProjectNotify notify = new WorkProjectNotify();
+                        notify.setNotifyId(projectRecordsAlter.getId());
+                        userList = workProjectNotifyService.readByNotifyId(notify);
+                        users.add(projectRecordsAlter.getCreateBy());
+                        workProjectNotifyService
+                                .save(UtilNotify
+                                        .saveNotify(projectRecordsAlter.getId(),
+                                                projectRecordsAlter.getCreateBy(),
+                                                projectRecordsAlter.getCompany().getId(),
+                                                title,
+                                                str,
+                                                "41",
+                                                "0",
+                                                "重新申请",
+                                                notifyRole));
+                    }
+                }
+            }
+        }
+
+        if (StringUtils.isNotBlank(title) && users!=null && users.size()!=0) {
+            List<String> userIds = new ArrayList<>(users.size());
+            for (User u : users) {
+                userIds.add(u.getId());
+            }
+            UserUtils.pushIm(userIds,title);
+        }
+        if (userList!=null && userList.size()!=0) {
+            for (User u : userList) {
+                UserUtils.pushMeIm(u.getId());
+            }
+        }
+
+        if(projectRecordsAlter.getProjectStatus()== AlterStatusEnum.SIGNED.getValue()){
+            //更新原有项目状态信息
+            RuralProjectRecords records = recordsService.get(projectRecordsAlter.getAlterBeforeRecords().getId());
+            recordsService.queryContractInfos(records);
+            recordsService.queryLinkmanInfos(records);
+            recordsService.queryWorkAttachment(records);
+            recordsService.queryUserNames(records);
+            RuralProjectRecords oldRecords = new RuralProjectRecords();
+            BeanUtils.copyProperties(oldRecords,records);
+            oldRecords.setId(null);
+            oldRecords.setProjectStatus(ProjectStatusEnum.INVALID.getValue());
+            recordsService.saveProject(oldRecords, ProjectStatusEnum.INVALID);
+            projectRecordsAlter.setAlterBeforeRecords(oldRecords);
+            String rid = records.getId();
+            //查询当前变更信息
+            this.queryLinkmanInfos(projectRecordsAlter);
+            this.queryUserNames(projectRecordsAlter);
+            this.queryContractInfo(projectRecordsAlter);
+            recordsService.queryWorkAttachment(records);
+            List<WorkClientAttachment> workAttachments = records.getWorkAttachments();
+            BeanUtils.copyProperties(records, projectRecordsAlter);
+            if(workAttachments!=null){
+                records.setWorkAttachments(workAttachments);
+            }
+            this.queryWorkAttachment(projectRecordsAlter);
+            if(projectRecordsAlter.getWorkAttachments()!=null){
+                if(records.getWorkAttachments()==null){
+                    records.setWorkAttachments(new ArrayList<WorkClientAttachment>());
+                }
+                for (WorkClientAttachment workClientAttachment : projectRecordsAlter.getWorkAttachments()) {
+                    workClientAttachment.setId(null);
+                    workClientAttachment.setAttachmentId(null);
+                    records.getWorkAttachments().add(workClientAttachment);
+                }
+            }
+            records.setId(rid);
+            records.setProjectStatus(ProjectStatusEnum.SIGNED.getValue());
+            records.setCreateBy(oldRecords.getCreateBy());
+            records.setCreateDate(oldRecords.getCreateDate());
+            records.preUpdate();
+            recordsService.saveProject(records, ProjectStatusEnum.SIGNED);
+        }
+        dao.updateSelectiveById(projectRecordsAlter);
+        return "保存审核意见成功!";
+
+	}
+
+	public void queryContractInfo(RuralProjectRecordsAlter projectRecords) {
+		WorkContractInfo workContractInfo = contractInfoService.get(projectRecords.getWorkContractInfo().getId());
+		workContractInfo.setConstructionProjectTypeStr(DictUtils.getDictLabel(String.valueOf(workContractInfo.getConstructionProjectType()), "construction_project_type", ""));
+        if(workContractInfo.getWorkClientInfoList()!=null&&!workContractInfo.getWorkClientInfoList().isEmpty()){
+            StringBuilder workClinetInfoIds = new StringBuilder();
+            for (WorkClientInfo workClientInfo : workContractInfo.getWorkClientInfoList()) {
+                workClinetInfoIds.append(workClientInfo.getId()).append(",");
+            }
+            workClinetInfoIds.deleteCharAt(workClinetInfoIds.length()-1);
+            workContractInfo.setWorkClinetInfoIds(workClinetInfoIds.toString());
+        }
+		projectRecords.setWorkContractInfo(workContractInfo);
+	}
+
+	private void notifyProjectLeaders (RuralProjectRecordsAlter projectRecords, User createUser, String str){
+		List<User> projectLeaders = projectRecords.getProjectLeaders();
+		for (User leader : projectLeaders) {
+			WorkProjectNotify workProjectNotify = UtilNotify
+					.saveNotify(projectRecords.getId(),
+							leader,
+							createUser.getComId(),
+							str,
+							projectRecords.getAct().getComment(),
+							"41",
+							"0",
+							"待审批",
+							"");
+			workProjectNotify.setOfficeId(createUser.getOffice().getId());
+			workProjectNotify.preInsert();
+			workProjectNotify.setCreateBy(projectRecords.getCreateBy());
+			workProjectNotifyService.insert(workProjectNotify);
+		}
+	}
+
+    /**
+     * 获取已办任务
+     * @return
+     */
+    public List<RuralProjectRecordsAlter> historicList(Act act){
+        String userId = UserUtils.getUser().getId();
+        HistoricTaskInstanceQuery query = historyService.createHistoricTaskInstanceQuery().finished().taskAssignee(userId);
+        // 设置查询条件
+        if (StringUtils.isNotBlank(act.getProcDefKey())){
+            query.processDefinitionKey(act.getProcDefKey());
+        }
+        if (act.getBeginDate() != null){
+            query.taskCompletedAfter(act.getBeginDate());
+        }
+        if (act.getEndDate() != null){
+            query.taskCompletedBefore(act.getEndDate());
+        }
+        // 查询总数
+        List<HistoricTaskInstance> list = query.list();
+        List<RuralProjectRecordsAlter> list1 = new ArrayList<RuralProjectRecordsAlter>();
+        Office office = UserUtils.getSelectCompany();
+        String companyId = office==null?"":office.getId();
+        for (HistoricTaskInstance histTask : list) {
+			RuralProjectRecordsAlter projectRecords = this.getByProcessInstanceId(histTask.getProcessInstanceId());
+            if (projectRecords != null && projectRecords.getCompany().getId().equals(companyId)) {
+                projectRecords.setCreateBy(UserUtils.get(projectRecords.getCreateBy().getId()));
+                historyService.getHistoricIdentityLinksForProcessInstance(histTask.getProcessInstanceId());
+                act.setHistTask(histTask);
+                act.setVars(histTask.getProcessVariables());
+                act.setProcDef(ProcessDefCache.get(histTask.getProcessDefinitionId()));
+                act.setStatus("finish");
+                projectRecords.setAct(act);
+                List<User> users = workProjectUserDao.queryProjectUsers(projectRecords.getId(), "1");
+                projectRecords.setProjectLeaders(users);
+                list1.add(projectRecords);
+            }
+        }
+//        workReimbursement.setPage(page);
+        return list1;
+    }
+
+    public void queryWorkAttachment(RuralProjectRecordsAlter projectRecords) {
+        WorkClientAttachment attchment = new WorkClientAttachment();
+        attchment.setAttachmentId(projectRecords.getId());
+        List<WorkClientAttachment> attachments = workClientAttachmentDao.findList(attchment);
+        projectRecords.setWorkAttachments(attachments);
+    }
+
+    private void saveAttachments(RuralProjectRecordsAlter projectRecords) {
+        if (projectRecords.getWorkAttachments()!=null && !projectRecords.getWorkAttachments().isEmpty()) {
+            //保存附件信息
+            for (WorkClientAttachment workClientAttachment : projectRecords.getWorkAttachments()) {
+                if (StringUtils.isBlank(workClientAttachment.getId())&&StringUtils.isNotBlank(workClientAttachment.getAttachmentId())) {
+                    continue;
+                }
+                if (StringUtils.isBlank(workClientAttachment.getId())&&StringUtils.isBlank(workClientAttachment.getUrl())) {
+                    continue;
+                }
+                if (WorkClientAttachment.DEL_FLAG_NORMAL.equals(workClientAttachment.getDelFlag())) {
+                    workClientAttachment.setAttachmentId(projectRecords.getId());
+                    workClientAttachment.setAttachmentFlag("82");
+                    workClientAttachment.setAttachmentUser(UserUtils.getUser().getId());
+                    if (StringUtils.isBlank(workClientAttachment.getId()) || "null".equals(workClientAttachment.getId())) {
+                        workClientAttachment.preInsert();
+                        workClientAttachmentDao.insert(workClientAttachment);
+                    } else {
+                        workClientAttachment.preUpdate();
+                        workClientAttachmentDao.update(workClientAttachment);
+                    }
+                } else {
+                    workClientAttachmentDao.delete(workClientAttachment);
+                }
+            }
+        }
+    }
+
+    public void queryProjectAlterDetail(RuralProjectRecordsAlter projectRecordsAlter) {
+        //设置合同信息
+        this.queryContractInfo(projectRecordsAlter);
+        //设置项目组成员
+        this.queryUserNames(projectRecordsAlter);
+        //设置委托方联系人信息
+        this.queryLinkmanInfos(projectRecordsAlter);
+        //设置附件信息
+        this.queryWorkAttachment(projectRecordsAlter);
+    }
+
+    @Transactional(readOnly = false)
+    public void cancelProcess(RuralProjectRecordsAlter projectRecordsAlter) {
+        WorkActivityProcess process = new WorkActivityProcess();
+        process.setProcessInstanceId(projectRecordsAlter.getProcessInstanceId());
+        process.setIsApproval("0");
+        //List<WorkActivityProcess> processList1 = workActivityProcessService.findByProcInsId(process);
+        WorkActivityProcess workActivityProcess = new WorkActivityProcess();
+        workActivityProcess.setProcessInstanceId(projectRecordsAlter.getProcessInstanceId());
+        List<WorkActivityProcess> processList = workActivityProcessService.findList(workActivityProcess);
+        WorkProjectNotify notify = new WorkProjectNotify();
+        notify.setNotifyId(projectRecordsAlter.getId());
+        List<User> userList = workProjectNotifyService.readByNotifyId(notify);
+        if (userList!=null && userList.size()!=0) {
+            for (User u : userList) {
+                User user = UserUtils.get(u.getId());
+                UserUtils.pushIm(u.getId(),"申请人 "+user.getName() +",项目登记审批:"+projectRecordsAlter.getProjectName() +" 强制撤销!");
+                /*List<WebSocket> toUserConns = ChatServerPool.getWebSocketByUser(u.getId());
+                for (WebSocket toUserConn : toUserConns) {
+                    String message = "{\"to\":\""+u.getId()+"\"," +
+                            "\"msg\":\"审批信息 申请人:"+ user.getName()+",项目登记审批:"+projectRecordsAlter.getProjectName() +" 强制撤销!\"," +
+                            "\"useType\":\"sys\"}";
+                    ChatServerPool.sendMessageToUser(toUserConn, message);//同时向本人发送消息
+                    //ChatServerPool.sendMessageToUser(toUserConn, u.getId() + "_sys_审批信息 " + "报销人:" + user.getName() + ",报销编号:" + workReimbursement.getNumber() + " 强制撤销!");//同时向本人发送消息
+                }*/
+            }
+        }
+        if(processList!=null && processList.size()>0) {
+            for (int i = 0; i < processList.size(); i++) {
+                WorkActivityProcess p = processList.get(i);
+                if (StringUtils.isNotBlank(p.getIsApproval()) && "0".equals(p.getIsApproval())) {
+                    p.setIsApproval("-1");
+                    p.setDelFlag("1");
+                    workActivityProcessDao.updateDelFlagAndIsApproval(p);
+                }
+            }
+            WorkActivityProcess pro = new WorkActivityProcess();
+            pro.setId("");
+            pro.setDelFlag("0");
+            pro.preInsert();
+            pro.setRemarks("[强制撤销]");
+            pro.setProcessKey(processList.get(0).getProcessKey());
+            pro.setIsApproval("1");
+            pro.setProcessInstanceId(processList.get(0).getProcessInstanceId());
+            pro.setCount(0);
+            workActivityProcessDao.insert(pro);
+            RuralProjectRecordsAlter projectRecords = new RuralProjectRecordsAlter();
+            projectRecords.setId(projectRecordsAlter.getId());
+            projectRecords.setProjectStatus(AlterStatusEnum.RECALL.getValue());
+            projectRecords.preUpdate();
+            this.updateSelectiveById(projectRecords);
+        }
+    }
+}

+ 0 - 0
src/main/java/com/jeeplus/modules/ruralprojectrecords/service/RuralProjectRecordsService.java


部分文件因为文件数量过多而无法显示