Pārlūkot izejas kodu

项目前期阶段

lem 4 gadi atpakaļ
vecāks
revīzija
e66878a1f0
47 mainītis faili ar 8168 papildinājumiem un 0 dzēšanām
  1. 124 0
      src/main/java/com/jeeplus/modules/filing/approvalStage/entity/ApprovalStage.java
  2. 372 0
      src/main/java/com/jeeplus/modules/filing/approvalStage/entity/EarlyStage.java
  3. 260 0
      src/main/java/com/jeeplus/modules/filing/approvalStage/entity/ProjectOverview.java
  4. 150 0
      src/main/java/com/jeeplus/modules/filing/approvalStage/entity/StudyStage.java
  5. 29 0
      src/main/java/com/jeeplus/modules/filing/approvalStage/mapper/ApprovalStageMapper.java
  6. 37 0
      src/main/java/com/jeeplus/modules/filing/approvalStage/mapper/EarlyStageMapper.java
  7. 24 0
      src/main/java/com/jeeplus/modules/filing/approvalStage/mapper/ProjectOverviewMapper.java
  8. 32 0
      src/main/java/com/jeeplus/modules/filing/approvalStage/mapper/StudyStageMapper.java
  9. 172 0
      src/main/java/com/jeeplus/modules/filing/approvalStage/mapper/xml/ApprovalStageMapper.xml
  10. 291 0
      src/main/java/com/jeeplus/modules/filing/approvalStage/mapper/xml/EarlyStageMapper.xml
  11. 196 0
      src/main/java/com/jeeplus/modules/filing/approvalStage/mapper/xml/ProjectOverviewMapper.xml
  12. 195 0
      src/main/java/com/jeeplus/modules/filing/approvalStage/mapper/xml/StudyStageMapper.xml
  13. 79 0
      src/main/java/com/jeeplus/modules/filing/approvalStage/service/ApprovalStageService.java
  14. 80 0
      src/main/java/com/jeeplus/modules/filing/approvalStage/service/EarlyStageService.java
  15. 74 0
      src/main/java/com/jeeplus/modules/filing/approvalStage/service/ProjectOverviewService.java
  16. 75 0
      src/main/java/com/jeeplus/modules/filing/approvalStage/service/StudyStageService.java
  17. 350 0
      src/main/java/com/jeeplus/modules/filing/approvalStage/web/ApprovalStageController.java
  18. 362 0
      src/main/java/com/jeeplus/modules/filing/approvalStage/web/EarlyStageController.java
  19. 247 0
      src/main/java/com/jeeplus/modules/filing/approvalStage/web/ProjectOverviewController.java
  20. 249 0
      src/main/java/com/jeeplus/modules/filing/approvalStage/web/StudyStageController.java
  21. 9 0
      src/main/java/com/jeeplus/modules/filing/basicInformation/mapper/BasicInformationMapper.java
  22. 12 0
      src/main/java/com/jeeplus/modules/filing/basicInformation/mapper/xml/BasicInformationMapper.xml
  23. 4 0
      src/main/java/com/jeeplus/modules/filing/basicInformation/service/BasicInformationService.java
  24. 45 0
      src/main/java/com/jeeplus/modules/filing/filingImages/entity/FilingImages.java
  25. 26 0
      src/main/java/com/jeeplus/modules/filing/filingImages/mapper/FilingImagesMapper.java
  26. 162 0
      src/main/java/com/jeeplus/modules/filing/filingImages/mapper/xml/FilingImagesMapper.xml
  27. 449 0
      src/main/java/com/jeeplus/modules/filing/filingImages/service/FilingImagesService.java
  28. 19 0
      src/main/java/com/jeeplus/modules/filing/filingImages/utils/DownloadZIP.java
  29. 221 0
      src/main/java/com/jeeplus/modules/filing/filingImages/utils/ZipCompressUtil.java
  30. 153 0
      src/main/java/com/jeeplus/modules/filing/filingImages/web/FilingImagesController.java
  31. 156 0
      src/main/webapp/webpage/modules/filing/approvalStage/approvalStageForm.js
  32. 109 0
      src/main/webapp/webpage/modules/filing/approvalStage/approvalStageForm.jsp
  33. 365 0
      src/main/webapp/webpage/modules/filing/approvalStage/approvalStageList.js
  34. 87 0
      src/main/webapp/webpage/modules/filing/approvalStage/approvalStageList.jsp
  35. 237 0
      src/main/webapp/webpage/modules/filing/earlyStage/earlyStageChildForm.jsp
  36. 292 0
      src/main/webapp/webpage/modules/filing/earlyStage/earlyStageForm.jsp
  37. 624 0
      src/main/webapp/webpage/modules/filing/earlyStage/earlyStageList.js
  38. 87 0
      src/main/webapp/webpage/modules/filing/earlyStage/earlyStageList.jsp
  39. 44 0
      src/main/webapp/webpage/modules/filing/filingImages/filingImages.jsp
  40. 213 0
      src/main/webapp/webpage/modules/filing/projectOverview/projectOverviewForm.jsp
  41. 516 0
      src/main/webapp/webpage/modules/filing/projectOverview/projectOverviewList.js
  42. 82 0
      src/main/webapp/webpage/modules/filing/projectOverview/projectOverviewList.jsp
  43. 102 0
      src/main/webapp/webpage/modules/filing/studyStage/studyStageChildForm.jsp
  44. 156 0
      src/main/webapp/webpage/modules/filing/studyStage/studyStageForm.js
  45. 117 0
      src/main/webapp/webpage/modules/filing/studyStage/studyStageForm.jsp
  46. 396 0
      src/main/webapp/webpage/modules/filing/studyStage/studyStageList.js
  47. 87 0
      src/main/webapp/webpage/modules/filing/studyStage/studyStageList.jsp

+ 124 - 0
src/main/java/com/jeeplus/modules/filing/approvalStage/entity/ApprovalStage.java

@@ -0,0 +1,124 @@
+package com.jeeplus.modules.filing.approvalStage.entity;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.google.common.collect.Lists;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+import com.jeeplus.core.persistence.DataEntity;
+import com.jeeplus.modules.filing.basicInformation.entity.BasicInformationChild;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 核准阶段实体类
+ * */
+public class ApprovalStage extends DataEntity<ApprovalStage> {
+    /**
+     * 项目编码
+     * */
+    private String projectCode;
+
+    /**
+     * 单体编码
+     * */
+    private String monomerCode;
+
+    /**
+     * 项目名称
+     * */
+    private String entryName;
+
+    /**
+     * 核准文号
+     * */
+    private String approvalNumber;
+    /**
+     * 核准日期
+     * */
+    private Date dateOfApproval;
+    /**
+     * 核准金额
+     * */
+    private String approvedAmount;
+
+    /**
+     * 核准附件
+     */
+    private String approvedAnnex;
+
+    /**
+     * 子类数据集合
+     * */
+    private List<ApprovalStage> childList = Lists.newArrayList();
+
+    @ExcelField(title="项目编码", align=2, sort=1)
+    public String getProjectCode() {
+        return projectCode;
+    }
+
+    public void setProjectCode(String projectCode) {
+        this.projectCode = projectCode;
+    }
+
+    @ExcelField(title="单体编码", align=2, sort=2)
+    public String getMonomerCode() {
+        return monomerCode;
+    }
+
+    public void setMonomerCode(String monomerCode) {
+        this.monomerCode = monomerCode;
+    }
+
+    @ExcelField(title="项目名称", align=2, sort=3)
+    public String getEntryName() {
+        return entryName;
+    }
+
+    public void setEntryName(String entryName) {
+        this.entryName = entryName;
+    }
+
+    @ExcelField(title="核准文号", align=2, sort=4)
+    public String getApprovalNumber() {
+        return approvalNumber;
+    }
+
+    public void setApprovalNumber(String approvalNumber) {
+        this.approvalNumber = approvalNumber;
+    }
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @ExcelField(title="核准日期", align=2, sort=5)
+    public Date getDateOfApproval() {
+        return dateOfApproval;
+    }
+
+    public void setDateOfApproval(Date dateOfApproval) {
+        this.dateOfApproval = dateOfApproval;
+    }
+
+    @ExcelField(title="核准金额", align=2, sort=6)
+    public String getApprovedAmount() {
+        return approvedAmount;
+    }
+
+    public void setApprovedAmount(String approvedAmount) {
+        this.approvedAmount = approvedAmount;
+    }
+
+    public String getApprovedAnnex() {
+        return approvedAnnex;
+    }
+
+    public void setApprovedAnnex(String approvedAnnex) {
+        this.approvedAnnex = approvedAnnex;
+    }
+
+    public List<ApprovalStage> getChildList() {
+        return childList;
+    }
+
+    public void setChildList(List<ApprovalStage> childList) {
+        this.childList = childList;
+    }
+}

+ 372 - 0
src/main/java/com/jeeplus/modules/filing/approvalStage/entity/EarlyStage.java

@@ -0,0 +1,372 @@
+package com.jeeplus.modules.filing.approvalStage.entity;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+import com.jeeplus.core.persistence.DataEntity;
+
+import java.util.Date;
+
+public class EarlyStage extends DataEntity<EarlyStage> {
+    /**
+     * 项目编码
+     * */
+    private String projectCode;
+
+    /**
+     * 单体编码
+     * */
+    private String monomerCode;
+
+    /**
+     * 项目名称
+     * */
+    private String entryName;
+    /**
+     * 核准文号
+     * */
+    private String approvalNumber;
+    /**
+     * 核准日期
+     * */
+    private Date dateOfApproval;
+    /**
+     * 核准金额
+     * */
+    private String approvedAmount;
+
+    /**
+     * 核准附件
+     */
+    private String approvedAnnex;
+    /**
+     * 可研批复文号
+     * */
+    private String replyNo;
+    /**
+     * 可研批复日期
+     * */
+    private Date approvalDate;
+    /**
+     * 可研静态态投资金额
+     * */
+    private String staticInvestment;
+    /**
+     * 可研动态投资金额
+     * */
+    private String dynamicInvestment;
+
+    /**
+     * 可研附件
+     */
+    private String studyAppendix;
+
+    /**
+     * 父级id
+     */
+    private String parentId;
+
+    /**
+     * 建设规模(变电容量)万伏安
+     * */
+    private String constructionScaleVA;
+    /**
+     * 建设规模(线路长度)千米
+     * */
+    private String constructionScaleKM;
+    /**
+     * 铁塔数量/钢管杆数量
+     * */
+    private String numberOf;
+    /**
+     * 导线型号及双回否型号
+     * */
+    private String conductorType;
+    /**
+     * 导线型号及双回否长度
+     * */
+    private String conductorLength;
+    /**
+     * 变压器来源新购/利旧,主变来源的变电站
+     * */
+    private String theSource;
+    /**
+     * 模块化建设方案
+     * */
+    private String modularConstructionScheme;
+    /**
+     * 工程难点描述
+     * */
+    private String descriptionOf;
+    /**
+     * 里程碑开工日期
+     * */
+    private Date milestoneStartDate;
+    /**
+     * 里程碑投产日期
+     * */
+    private Date milestoneCommissioningDate;
+    /**
+     * 内控开工日期
+     * */
+    private Date startDate;
+    /**
+     * 内控投产日期
+     * */
+    private Date internalControl;
+    /**
+     * 主设备最早到货时间
+     * */
+    private Date earliestArrival;
+    /**
+     * 线路塔材到货计划
+     * */
+    private Date arrivalPlan;
+
+    @ExcelField(title="项目编码", align=2, sort=1)
+    public String getProjectCode() {
+        return projectCode;
+    }
+
+    public void setProjectCode(String projectCode) {
+        this.projectCode = projectCode;
+    }
+
+    @ExcelField(title="单体编码", align=2, sort=2)
+    public String getMonomerCode() {
+        return monomerCode;
+    }
+
+    public void setMonomerCode(String monomerCode) {
+        this.monomerCode = monomerCode;
+    }
+
+    @ExcelField(title="项目名称", align=2, sort=3)
+    public String getEntryName() {
+        return entryName;
+    }
+
+    public void setEntryName(String entryName) {
+        this.entryName = entryName;
+    }
+
+    @ExcelField(title="核准文号", align=2, sort=4)
+    public String getApprovalNumber() {
+        return approvalNumber;
+    }
+
+    public void setApprovalNumber(String approvalNumber) {
+        this.approvalNumber = approvalNumber;
+    }
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @ExcelField(title="核准日期", align=2, sort=5)
+    public Date getDateOfApproval() {
+        return dateOfApproval;
+    }
+
+    public void setDateOfApproval(Date dateOfApproval) {
+        this.dateOfApproval = dateOfApproval;
+    }
+
+    @ExcelField(title="核准金额", align=2, sort=6)
+    public String getApprovedAmount() {
+        return approvedAmount;
+    }
+
+    public void setApprovedAmount(String approvedAmount) {
+        this.approvedAmount = approvedAmount;
+    }
+
+    public String getApprovedAnnex() {
+        return approvedAnnex;
+    }
+
+    public void setApprovedAnnex(String approvedAnnex) {
+        this.approvedAnnex = approvedAnnex;
+    }
+
+    @ExcelField(title="可研批复文号", align=2, sort=7)
+    public String getReplyNo() {
+        return replyNo;
+    }
+
+    public void setReplyNo(String replyNo) {
+        this.replyNo = replyNo;
+    }
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @ExcelField(title="可研批复日期", align=2, sort=8)
+    public Date getApprovalDate() {
+        return approvalDate;
+    }
+
+    public void setApprovalDate(Date approvalDate) {
+        this.approvalDate = approvalDate;
+    }
+
+    @ExcelField(title="可研静态态投资金额", align=2, sort=9)
+    public String getStaticInvestment() {
+        return staticInvestment;
+    }
+
+    public void setStaticInvestment(String staticInvestment) {
+        this.staticInvestment = staticInvestment;
+    }
+
+    @ExcelField(title="可研动态投资金额", align=2, sort=10)
+    public String getDynamicInvestment() {
+        return dynamicInvestment;
+    }
+
+    public void setDynamicInvestment(String dynamicInvestment) {
+        this.dynamicInvestment = dynamicInvestment;
+    }
+
+    public String getStudyAppendix() {
+        return studyAppendix;
+    }
+
+    public void setStudyAppendix(String studyAppendix) {
+        this.studyAppendix = studyAppendix;
+    }
+
+    public String getParentId() {
+        return parentId;
+    }
+
+    public void setParentId(String parentId) {
+        this.parentId = parentId;
+    }
+
+    @ExcelField(title="建设规模(变电容量)万伏安", align=2, sort=11)
+    public String getConstructionScaleVA() {
+        return constructionScaleVA;
+    }
+
+    public void setConstructionScaleVA(String constructionScaleVA) {
+        this.constructionScaleVA = constructionScaleVA;
+    }
+
+    @ExcelField(title="建设规模(线路长度)千米", align=2, sort=12)
+    public String getConstructionScaleKM() {
+        return constructionScaleKM;
+    }
+
+    public void setConstructionScaleKM(String constructionScaleKM) {
+        this.constructionScaleKM = constructionScaleKM;
+    }
+
+    @ExcelField(title="铁塔数量/钢管杆数量", align=2, sort=13)
+    public String getNumberOf() {
+        return numberOf;
+    }
+
+    public void setNumberOf(String numberOf) {
+        this.numberOf = numberOf;
+    }
+
+    @ExcelField(title="导线型号及双回否型号", align=2, sort=14)
+    public String getConductorType() {
+        return conductorType;
+    }
+
+    public void setConductorType(String conductorType) {
+        this.conductorType = conductorType;
+    }
+
+    @ExcelField(title="导线型号及双回否长度", align=2, sort=15)
+    public String getConductorLength() {
+        return conductorLength;
+    }
+
+    public void setConductorLength(String conductorLength) {
+        this.conductorLength = conductorLength;
+    }
+
+    @ExcelField(title="变压器来源新购/利旧,主变来源的变电站", align=2, sort=16)
+    public String getTheSource() {
+        return theSource;
+    }
+
+    public void setTheSource(String theSource) {
+        this.theSource = theSource;
+    }
+
+    @ExcelField(title="模块化建设方案", align=2, sort=17)
+    public String getModularConstructionScheme() {
+        return modularConstructionScheme;
+    }
+
+    public void setModularConstructionScheme(String modularConstructionScheme) {
+        this.modularConstructionScheme = modularConstructionScheme;
+    }
+
+    @ExcelField(title="工程难点描述", align=2, sort=18)
+    public String getDescriptionOf() {
+        return descriptionOf;
+    }
+
+    public void setDescriptionOf(String descriptionOf) {
+        this.descriptionOf = descriptionOf;
+    }
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @ExcelField(title="里程碑开工日期", align=2, sort=19)
+    public Date getMilestoneStartDate() {
+        return milestoneStartDate;
+    }
+
+    public void setMilestoneStartDate(Date milestoneStartDate) {
+        this.milestoneStartDate = milestoneStartDate;
+    }
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @ExcelField(title="里程碑投产日期", align=2, sort=20)
+    public Date getMilestoneCommissioningDate() {
+        return milestoneCommissioningDate;
+    }
+
+    public void setMilestoneCommissioningDate(Date milestoneCommissioningDate) {
+        this.milestoneCommissioningDate = milestoneCommissioningDate;
+    }
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @ExcelField(title="内控开工日期", align=2, sort=21)
+    public Date getStartDate() {
+        return startDate;
+    }
+
+    public void setStartDate(Date startDate) {
+        this.startDate = startDate;
+    }
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @ExcelField(title="内控投产日期", align=2, sort=22)
+    public Date getInternalControl() {
+        return internalControl;
+    }
+
+    public void setInternalControl(Date internalControl) {
+        this.internalControl = internalControl;
+    }
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @ExcelField(title="主设备最早到货时间", align=2, sort=23)
+    public Date getEarliestArrival() {
+        return earliestArrival;
+    }
+
+    public void setEarliestArrival(Date earliestArrival) {
+        this.earliestArrival = earliestArrival;
+    }
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @ExcelField(title="线路塔材到货计划", align=2, sort=24)
+    public Date getArrivalPlan() {
+        return arrivalPlan;
+    }
+
+    public void setArrivalPlan(Date arrivalPlan) {
+        this.arrivalPlan = arrivalPlan;
+    }
+}

+ 260 - 0
src/main/java/com/jeeplus/modules/filing/approvalStage/entity/ProjectOverview.java

@@ -0,0 +1,260 @@
+package com.jeeplus.modules.filing.approvalStage.entity;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.google.common.collect.Lists;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+import com.jeeplus.core.persistence.DataEntity;
+import com.jeeplus.modules.filing.basicInformation.entity.BasicInformationChild;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 可研阶段实体类
+ * */
+public class ProjectOverview extends DataEntity<ProjectOverview> {
+    /**
+     * 项目编码
+     * */
+    private String projectCode;
+
+    /**
+     * 单体编码
+     * */
+    private String monomerCode;
+
+    /**
+     * 项目名称
+     * */
+    private String entryName;
+
+    /**
+     * 建设规模(变电容量)万伏安
+     * */
+    private String constructionScaleVA;
+    /**
+     * 建设规模(线路长度)千米
+     * */
+    private String constructionScaleKM;
+    /**
+     * 铁塔数量/钢管杆数量
+     * */
+    private String numberOf;
+    /**
+     * 导线型号及双回否型号
+     * */
+    private String conductorType;
+    /**
+     * 导线型号及双回否长度
+     * */
+    private String conductorLength;
+    /**
+     * 变压器来源新购/利旧,主变来源的变电站
+     * */
+    private String theSource;
+    /**
+     * 模块化建设方案
+     * */
+    private String modularConstructionScheme;
+    /**
+     * 工程难点描述
+     * */
+    private String descriptionOf;
+    /**
+     * 里程碑开工日期
+     * */
+    private Date milestoneStartDate;
+    /**
+     * 里程碑投产日期
+     * */
+    private Date milestoneCommissioningDate;
+    /**
+     * 内控开工日期
+     * */
+    private Date startDate;
+    /**
+     * 内控投产日期
+     * */
+    private Date internalControl;
+    /**
+     * 主设备最早到货时间
+     * */
+    private Date earliestArrival;
+    /**
+     * 线路塔材到货计划
+     * */
+    private Date arrivalPlan;
+
+
+    /**
+     * 子类数据集合
+     * */
+    private List<ProjectOverview> childList = Lists.newArrayList();
+
+    @ExcelField(title="项目编码", align=2, sort=1)
+    public String getProjectCode() {
+        return projectCode;
+    }
+
+    public void setProjectCode(String projectCode) {
+        this.projectCode = projectCode;
+    }
+
+    @ExcelField(title="单体编码", align=2, sort=2)
+    public String getMonomerCode() {
+        return monomerCode;
+    }
+
+    public void setMonomerCode(String monomerCode) {
+        this.monomerCode = monomerCode;
+    }
+
+    @ExcelField(title="项目名称", align=2, sort=3)
+    public String getEntryName() {
+        return entryName;
+    }
+
+    public void setEntryName(String entryName) {
+        this.entryName = entryName;
+    }
+
+    @ExcelField(title="建设规模(变电容量)万伏安", align=2, sort=4)
+    public String getConstructionScaleVA() {
+        return constructionScaleVA;
+    }
+
+    public void setConstructionScaleVA(String constructionScaleVA) {
+        this.constructionScaleVA = constructionScaleVA;
+    }
+
+    @ExcelField(title="建设规模(线路长度)千米", align=2, sort=5)
+    public String getConstructionScaleKM() {
+        return constructionScaleKM;
+    }
+
+    public void setConstructionScaleKM(String constructionScaleKM) {
+        this.constructionScaleKM = constructionScaleKM;
+    }
+
+    @ExcelField(title="铁塔数量/钢管杆数量", align=2, sort=6)
+    public String getNumberOf() {
+        return numberOf;
+    }
+
+    public void setNumberOf(String numberOf) {
+        this.numberOf = numberOf;
+    }
+
+    @ExcelField(title="导线型号及双回否型号", align=2, sort=7)
+    public String getConductorType() {
+        return conductorType;
+    }
+
+    public void setConductorType(String conductorType) {
+        this.conductorType = conductorType;
+    }
+
+    @ExcelField(title="导线型号及双回否长度", align=2, sort=8)
+    public String getConductorLength() {
+        return conductorLength;
+    }
+
+    public void setConductorLength(String conductorLength) {
+        this.conductorLength = conductorLength;
+    }
+
+    @ExcelField(title="变压器来源新购/利旧,主变来源的变电站", align=2, sort=9)
+    public String getTheSource() {
+        return theSource;
+    }
+
+    public void setTheSource(String theSource) {
+        this.theSource = theSource;
+    }
+
+    @ExcelField(title="模块化建设方案", align=2, sort=10)
+    public String getModularConstructionScheme() {
+        return modularConstructionScheme;
+    }
+
+    public void setModularConstructionScheme(String modularConstructionScheme) {
+        this.modularConstructionScheme = modularConstructionScheme;
+    }
+
+    @ExcelField(title="工程难点描述", align=2, sort=11)
+    public String getDescriptionOf() {
+        return descriptionOf;
+    }
+
+    public void setDescriptionOf(String descriptionOf) {
+        this.descriptionOf = descriptionOf;
+    }
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @ExcelField(title="里程碑开工日期", align=2, sort=12)
+    public Date getMilestoneStartDate() {
+        return milestoneStartDate;
+    }
+
+    public void setMilestoneStartDate(Date milestoneStartDate) {
+        this.milestoneStartDate = milestoneStartDate;
+    }
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @ExcelField(title="里程碑投产日期", align=2, sort=13)
+    public Date getMilestoneCommissioningDate() {
+        return milestoneCommissioningDate;
+    }
+
+    public void setMilestoneCommissioningDate(Date milestoneCommissioningDate) {
+        this.milestoneCommissioningDate = milestoneCommissioningDate;
+    }
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @ExcelField(title="内控开工日期", align=2, sort=14)
+    public Date getStartDate() {
+        return startDate;
+    }
+
+    public void setStartDate(Date startDate) {
+        this.startDate = startDate;
+    }
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @ExcelField(title="内控投产日期", align=2, sort=15)
+    public Date getInternalControl() {
+        return internalControl;
+    }
+
+    public void setInternalControl(Date internalControl) {
+        this.internalControl = internalControl;
+    }
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @ExcelField(title="主设备最早到货时间", align=2, sort=16)
+    public Date getEarliestArrival() {
+        return earliestArrival;
+    }
+
+    public void setEarliestArrival(Date earliestArrival) {
+        this.earliestArrival = earliestArrival;
+    }
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @ExcelField(title="线路塔材到货计划", align=2, sort=17)
+    public Date getArrivalPlan() {
+        return arrivalPlan;
+    }
+
+    public void setArrivalPlan(Date arrivalPlan) {
+        this.arrivalPlan = arrivalPlan;
+    }
+
+    public List<ProjectOverview> getChildList() {
+        return childList;
+    }
+
+    public void setChildList(List<ProjectOverview> childList) {
+        this.childList = childList;
+    }
+}

+ 150 - 0
src/main/java/com/jeeplus/modules/filing/approvalStage/entity/StudyStage.java

@@ -0,0 +1,150 @@
+package com.jeeplus.modules.filing.approvalStage.entity;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.google.common.collect.Lists;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+import com.jeeplus.core.persistence.DataEntity;
+import com.jeeplus.modules.filing.basicInformation.entity.BasicInformationChild;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 项目概述实体类
+ * */
+public class StudyStage extends DataEntity<StudyStage> {
+    /**
+     * 项目编码
+     * */
+    private String projectCode;
+
+    /**
+     * 单体编码
+     * */
+    private String monomerCode;
+
+    /**
+     * 项目名称
+     * */
+    private String entryName;
+
+    /**
+     * 可研批复文号
+     * */
+    private String replyNo;
+    /**
+     * 可研批复日期
+     * */
+    private Date approvalDate;
+    /**
+     * 可研静态态投资金额
+     * */
+    private String staticInvestment;
+    /**
+     * 可研动态投资金额
+     * */
+    private String dynamicInvestment;
+
+    /**
+     * 可研附件
+     */
+    private String studyAppendix;
+
+    /**
+     * 父级id
+     */
+    private String parentId;
+
+    /**
+     * 子类数据集合
+     * */
+    private List<StudyStage> childList = Lists.newArrayList();
+
+    @ExcelField(title="项目编码", align=2, sort=1)
+    public String getProjectCode() {
+        return projectCode;
+    }
+
+    public void setProjectCode(String projectCode) {
+        this.projectCode = projectCode;
+    }
+
+    @ExcelField(title="单体编码", align=2, sort=2)
+    public String getMonomerCode() {
+        return monomerCode;
+    }
+
+    public void setMonomerCode(String monomerCode) {
+        this.monomerCode = monomerCode;
+    }
+
+    @ExcelField(title="项目名称", align=2, sort=3)
+    public String getEntryName() {
+        return entryName;
+    }
+
+    public void setEntryName(String entryName) {
+        this.entryName = entryName;
+    }
+
+    @ExcelField(title="可研批复文号", align=2, sort=4)
+    public String getReplyNo() {
+        return replyNo;
+    }
+
+    public void setReplyNo(String replyNo) {
+        this.replyNo = replyNo;
+    }
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @ExcelField(title="可研批复日期", align=2, sort=5)
+    public Date getApprovalDate() {
+        return approvalDate;
+    }
+
+    public void setApprovalDate(Date approvalDate) {
+        this.approvalDate = approvalDate;
+    }
+
+    @ExcelField(title="可研静态态投资金额", align=2, sort=6)
+    public String getStaticInvestment() {
+        return staticInvestment;
+    }
+
+    public void setStaticInvestment(String staticInvestment) {
+        this.staticInvestment = staticInvestment;
+    }
+
+    @ExcelField(title="可研动态投资金额", align=2, sort=7)
+    public String getDynamicInvestment() {
+        return dynamicInvestment;
+    }
+
+    public void setDynamicInvestment(String dynamicInvestment) {
+        this.dynamicInvestment = dynamicInvestment;
+    }
+
+    public String getStudyAppendix() {
+        return studyAppendix;
+    }
+
+    public void setStudyAppendix(String studyAppendix) {
+        this.studyAppendix = studyAppendix;
+    }
+
+    public String getParentId() {
+        return parentId;
+    }
+
+    public void setParentId(String parentId) {
+        this.parentId = parentId;
+    }
+
+    public List<StudyStage> getChildList() {
+        return childList;
+    }
+
+    public void setChildList(List<StudyStage> childList) {
+        this.childList = childList;
+    }
+}

+ 29 - 0
src/main/java/com/jeeplus/modules/filing/approvalStage/mapper/ApprovalStageMapper.java

@@ -0,0 +1,29 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.filing.approvalStage.mapper;
+
+import com.jeeplus.core.persistence.BaseMapper;
+import com.jeeplus.core.persistence.annotation.MyBatisMapper;
+import com.jeeplus.modules.filing.approvalStage.entity.ApprovalStage;
+import com.jeeplus.modules.filing.basicInformation.entity.BasicInformation;
+
+import java.util.List;
+
+/**
+ * 核准阶段MAPPER接口
+ * @author qy
+ * @version 2021-03-25
+ */
+@MyBatisMapper
+public interface ApprovalStageMapper extends BaseMapper<ApprovalStage> {
+    List<ApprovalStage> findChildList(ApprovalStage entity);
+
+    Integer findByCode(ApprovalStage entity);
+
+
+    /**
+     * 通过id集合查询出所有符合条件的项目基础信息
+     */
+    List<ApprovalStage> findByIdList(List<String> idList);
+}

+ 37 - 0
src/main/java/com/jeeplus/modules/filing/approvalStage/mapper/EarlyStageMapper.java

@@ -0,0 +1,37 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.filing.approvalStage.mapper;
+
+import com.jeeplus.core.persistence.BaseMapper;
+import com.jeeplus.core.persistence.annotation.MyBatisMapper;
+import com.jeeplus.modules.filing.approvalStage.entity.ApprovalStage;
+import com.jeeplus.modules.filing.approvalStage.entity.EarlyStage;
+import com.jeeplus.modules.filing.approvalStage.entity.StudyStage;
+
+import java.util.List;
+
+/**
+ * 项目前期阶段MAPPER接口
+ * @author qy
+ * @version 2021-03-30
+ */
+@MyBatisMapper
+public interface EarlyStageMapper extends BaseMapper<EarlyStage> {
+    List<EarlyStage> findChildList(EarlyStage entity);
+
+    Integer findByCode(EarlyStage entity);
+
+
+    /**
+     * 通过id集合查询出所有符合条件的项目基础信息
+     */
+    List<EarlyStage> findByIdList(List<String> idList);
+
+
+    /**
+     * 通过项目id查询出所有的项目信息
+     * findAllStudy
+     * */
+    List<EarlyStage> findAllStudy(List<String> idList);
+}

+ 24 - 0
src/main/java/com/jeeplus/modules/filing/approvalStage/mapper/ProjectOverviewMapper.java

@@ -0,0 +1,24 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.filing.approvalStage.mapper;
+
+import com.jeeplus.core.persistence.BaseMapper;
+import com.jeeplus.core.persistence.annotation.MyBatisMapper;
+import com.jeeplus.modules.filing.approvalStage.entity.ApprovalStage;
+import com.jeeplus.modules.filing.approvalStage.entity.ProjectOverview;
+
+import java.util.List;
+
+/**
+ * 可研阶段MAPPER接口
+ * @author qy
+ * @version 2021-03-25
+ */
+@MyBatisMapper
+public interface ProjectOverviewMapper extends BaseMapper<ProjectOverview> {
+
+    List<ProjectOverview> findChildList(ProjectOverview entity);
+
+    Integer findByCode(ProjectOverview entity);
+}

+ 32 - 0
src/main/java/com/jeeplus/modules/filing/approvalStage/mapper/StudyStageMapper.java

@@ -0,0 +1,32 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.filing.approvalStage.mapper;
+
+import com.jeeplus.core.persistence.BaseMapper;
+import com.jeeplus.core.persistence.annotation.MyBatisMapper;
+import com.jeeplus.modules.filing.approvalStage.entity.ApprovalStage;
+import com.jeeplus.modules.filing.approvalStage.entity.ProjectOverview;
+import com.jeeplus.modules.filing.approvalStage.entity.StudyStage;
+
+import java.util.List;
+
+/**
+ * 项目概述MAPPER接口
+ * @author qy
+ * @version 2021-03-25
+ */
+@MyBatisMapper
+public interface StudyStageMapper extends BaseMapper<StudyStage> {
+
+    List<StudyStage> findChildList(StudyStage entity);
+
+    Integer findByCode(StudyStage entity);
+
+
+    /**
+     * 通过项目id查询出所有的项目信息
+     * findAllStudy
+     * */
+    List<StudyStage> findAllStudy(List<String> idList);
+}

+ 172 - 0
src/main/java/com/jeeplus/modules/filing/approvalStage/mapper/xml/ApprovalStageMapper.xml

@@ -0,0 +1,172 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jeeplus.modules.filing.approvalStage.mapper.ApprovalStageMapper">
+    
+	<sql id="approvalStageColumns">
+		a.id AS "id",
+		a.create_by AS "createBy.id",
+		a.create_date AS "createDate",
+		a.update_by AS "updateBy.id",
+		a.update_date AS "updateDate",
+		a.remarks AS "remarks",
+		a.del_flag AS "delFlag",
+		a.projectCode AS "projectCode",
+		a.monomerCode AS "monomerCode",
+		a.entryName AS "entryName",
+		b.approvalNumber AS "approvalNumber",
+		b.dateOfApproval AS "dateOfApproval",
+		b.approvedAmount AS "approvedAmount",
+		b.approvedAnnex AS "approvedAnnex"
+	</sql>
+	
+	<sql id="approvalStageJoins">
+		LEFT JOIN filing_approval_stage b on a.projectCode = b.projectCode
+	</sql>
+	
+    
+	<select id="get" resultType="ApprovalStage" >
+		SELECT 
+			<include refid="approvalStageColumns"/>
+		FROM filing_basic_information a
+		<include refid="approvalStageJoins"/>
+		WHERE a.id = #{id}
+	</select>
+	
+	<select id="findList" resultType="ApprovalStage">
+		SELECT 
+			<include refid="approvalStageColumns"/>
+		FROM filing_basic_information a
+		<include refid="approvalStageJoins"/>
+		<where>
+			a.del_flag = #{DEL_FLAG_NORMAL}
+			${dataScope}
+			and a.parentId = '0'
+			<if test="projectCode != null  and projectCode != ''">
+				and a.projectCode = #{projectCode}
+			</if>
+		</where>
+		<choose>
+			<when test="page !=null and page.orderBy != null and page.orderBy != ''">
+				ORDER BY ${page.orderBy}
+			</when>
+			<otherwise>
+				ORDER BY a.update_date DESC
+			</otherwise>
+		</choose>
+	</select>
+	
+	<select id="findAllList" resultType="ApprovalStage" >
+		SELECT 
+			<include refid="approvalStageColumns"/>
+		FROM filing_basic_information a
+		<include refid="approvalStageJoins"/>
+		<where>
+			a.del_flag = #{DEL_FLAG_NORMAL}
+			${dataScope}
+		</where>		
+		<choose>
+			<when test="page !=null and page.orderBy != null and page.orderBy != ''">
+				ORDER BY ${page.orderBy}
+			</when>
+			<otherwise>
+				ORDER BY a.update_date DESC
+			</otherwise>
+		</choose>
+	</select>
+	
+	<insert id="insert">
+		INSERT INTO filing_approval_stage(
+			id,
+			create_by,
+			create_date,
+			update_by,
+			update_date,
+			remarks,
+			del_flag,
+	  		projectCode,
+			approvalNumber,
+			dateOfApproval,
+			approvedAmount,
+			approvedAnnex
+		) VALUES (
+			#{id},
+			#{createBy.id},
+			#{createDate},
+			#{updateBy.id},
+			#{updateDate},
+			#{remarks},
+			#{delFlag},
+			#{projectCode},
+			#{approvalNumber},
+			#{dateOfApproval},
+			#{approvedAmount},
+		    #{approvedAnnex}
+		)
+	</insert>
+	
+	<update id="update">
+		UPDATE filing_approval_stage SET
+			create_date = #{createDate},
+			update_by = #{updateBy.id},
+			update_date = #{updateDate},
+			remarks = #{remarks},
+			approvalNumber = #{approvalNumber},
+			dateOfApproval = #{dateOfApproval},
+			approvedAmount = #{approvedAmount},
+			approvedAnnex = #{approvedAnnex}
+		WHERE projectCode = #{projectCode}
+	</update>
+	
+	
+	<!--物理删除-->
+	<update id="delete">
+		DELETE FROM filing_approval_stage
+		WHERE id = #{id}
+	</update>
+	
+	<!--逻辑删除-->
+	<update id="deleteByLogic">
+		UPDATE filing_approval_stage SET 
+			del_flag = #{DEL_FLAG_DELETE}
+		WHERE id = #{id}
+	</update>
+	
+	
+	<!-- 根据实体名称和字段名称和字段值获取唯一记录 -->
+	<select id="findUniqueByProperty" resultType="ApprovalStage" statementType="STATEMENT">
+		select * FROM filing_approval_stage  where ${propertyName} = '${value}'
+	</select>
+	<select id="findChildList" resultType="com.jeeplus.modules.filing.approvalStage.entity.ApprovalStage">
+		select
+			a.id AS "id",
+			a.projectCode AS "projectCode",
+			a.monomerCode AS "monomerCode",
+			a.entryName AS "entryName",
+			b.approvalNumber AS "approvalNumber",
+			b.dateOfApproval AS "dateOfApproval",
+			b.approvedAmount AS "approvedAmount"
+		from filing_basic_information a
+				 LEFT JOIN filing_approval_stage b on a.projectCode = b.projectCode
+		<where>
+			<if test="projectCode != null  and projectCode != ''">
+				a.parentId = #{projectCode}
+			</if>
+		</where>
+	</select>
+	<select id="findByCode" resultType="java.lang.Integer">
+		select count(id) from filing_approval_stage
+		where projectCode = #{projectCode}
+	</select>
+	<select id="findByIdList" resultType="com.jeeplus.modules.filing.approvalStage.entity.ApprovalStage">
+		SELECT
+		<include refid="approvalStageColumns"/>
+		FROM filing_basic_information a
+		<include refid="approvalStageJoins"/>
+		WHERE a.id in(
+		<foreach collection="list" index="index" item="item" separator=",">
+			#{item}
+		</foreach>
+		)
+	</select>
+
+</mapper>

+ 291 - 0
src/main/java/com/jeeplus/modules/filing/approvalStage/mapper/xml/EarlyStageMapper.xml

@@ -0,0 +1,291 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jeeplus.modules.filing.approvalStage.mapper.EarlyStageMapper">
+    
+	<sql id="EarlyStageColumns">
+		a.id AS "id",
+		a.create_by AS "createBy.id",
+		a.create_date AS "createDate",
+		a.update_by AS "updateBy.id",
+		a.update_date AS "updateDate",
+		a.remarks AS "remarks",
+		a.del_flag AS "delFlag",
+		a.projectCode AS "projectCode",
+		a.monomerCode AS "monomerCode",
+		a.entryName AS "entryName",
+		b.approvalNumber AS "approvalNumber",
+		b.dateOfApproval AS "dateOfApproval",
+		b.approvedAmount AS "approvedAmount",
+		b.approvedAnnex AS "approvedAnnex",
+		b.replyNo AS "replyNo",
+		b.approvalDate AS "approvalDate",
+		b.staticInvestment AS "staticInvestment",
+		b.dynamicInvestment AS "dynamicInvestment",
+		b.studyAppendix AS "studyAppendix",
+		b.constructionScaleVA AS "constructionScaleVA",
+		b.constructionScaleKM AS "constructionScaleKM",
+		b.numberOf AS "numberOf",
+		b.conductorType AS "conductorType",
+		b.conductorLength AS "conductorLength",
+		b.theSource AS "theSource",
+		b.modularConstructionScheme AS "modularConstructionScheme",
+		b.descriptionOf AS "descriptionOf",
+		b.milestoneStartDate AS "milestoneStartDate",
+		b.milestoneCommissioningDate AS "milestoneCommissioningDate",
+		b.startDate AS "startDate",
+		b.internalControl AS "internalControl",
+		b.earliestArrival AS "earliestArrival",
+		b.arrivalPlan AS "arrivalPlan"
+	</sql>
+	
+	<sql id="EarlyStageJoins">
+		LEFT JOIN filing_approval_stage b on a.projectCode = b.projectCode
+	</sql>
+	
+    
+	<select id="get" resultType="EarlyStage" >
+		SELECT 
+			<include refid="EarlyStageColumns"/>
+		FROM filing_basic_information a
+		<include refid="EarlyStageJoins"/>
+		WHERE a.id = #{id}
+	</select>
+	
+	<select id="findList" resultType="EarlyStage">
+		SELECT 
+			<include refid="EarlyStageColumns"/>
+		FROM filing_basic_information a
+		<include refid="EarlyStageJoins"/>
+		<where>
+			a.del_flag = #{DEL_FLAG_NORMAL}
+			${dataScope}
+			and a.parentId = '0'
+			<if test="projectCode != null  and projectCode != ''">
+				and a.projectCode = #{projectCode}
+			</if>
+		</where>
+		<choose>
+			<when test="page !=null and page.orderBy != null and page.orderBy != ''">
+				ORDER BY ${page.orderBy}
+			</when>
+			<otherwise>
+				ORDER BY a.update_date DESC
+			</otherwise>
+		</choose>
+	</select>
+	
+	<select id="findAllList" resultType="EarlyStage" >
+		SELECT 
+			<include refid="EarlyStageColumns"/>
+		FROM filing_basic_information a
+		<include refid="EarlyStageJoins"/>
+		<where>
+			a.del_flag = #{DEL_FLAG_NORMAL}
+			${dataScope}
+		</where>		
+		<choose>
+			<when test="page !=null and page.orderBy != null and page.orderBy != ''">
+				ORDER BY ${page.orderBy}
+			</when>
+			<otherwise>
+				ORDER BY a.update_date DESC
+			</otherwise>
+		</choose>
+	</select>
+	
+	<insert id="insert">
+		INSERT INTO filing_approval_stage(
+			id,
+			create_by,
+			create_date,
+			update_by,
+			update_date,
+			remarks,
+			del_flag,
+	  		projectCode,
+			approvalNumber,
+			dateOfApproval,
+			approvedAmount,
+			approvedAnnex,
+			replyNo,
+			approvalDate,
+			staticInvestment,
+			dynamicInvestment,
+			studyAppendix,
+			constructionScaleVA,
+			constructionScaleKM,
+			numberOf,
+			conductorType,
+			conductorLength,
+			theSource,
+			modularConstructionScheme,
+			descriptionOf,
+			milestoneStartDate,
+			milestoneCommissioningDate,
+			startDate,
+			internalControl,
+			earliestArrival,
+			arrivalPlan
+		) VALUES (
+			#{id},
+			#{createBy.id},
+			#{createDate},
+			#{updateBy.id},
+			#{updateDate},
+			#{remarks},
+			#{delFlag},
+			#{projectCode},
+			#{approvalNumber},
+			#{dateOfApproval},
+			#{approvedAmount},
+			#{approvedAnnex},
+			#{replyNo},
+			#{approvalDate},
+			#{staticInvestment},
+			#{dynamicInvestment},
+			#{studyAppendix},
+			#{constructionScaleVA},
+			#{constructionScaleKM},
+			#{numberOf},
+			#{conductorType},
+			#{conductorLength},
+			#{theSource},
+			#{modularConstructionScheme},
+			#{descriptionOf},
+			#{milestoneStartDate},
+			#{milestoneCommissioningDate},
+			#{startDate},
+			#{internalControl},
+			#{earliestArrival},
+			#{arrivalPlan}
+		)
+	</insert>
+	
+	<update id="update">
+		UPDATE filing_approval_stage SET
+			create_date = #{createDate},
+			update_by = #{updateBy.id},
+			update_date = #{updateDate},
+			remarks = #{remarks},
+			approvalNumber = #{approvalNumber},
+			dateOfApproval = #{dateOfApproval},
+			approvedAmount = #{approvedAmount},
+			approvedAnnex = #{approvedAnnex},
+			replyNo = #{replyNo},
+			approvalDate = #{approvalDate},
+			staticInvestment = #{staticInvestment},
+			dynamicInvestment = #{dynamicInvestment},
+			studyAppendix = #{studyAppendix},
+			constructionScaleVA = #{constructionScaleVA},
+			constructionScaleKM = #{constructionScaleKM},
+			numberOf = #{numberOf},
+			conductorType = #{conductorType},
+			conductorLength = #{conductorLength},
+			theSource = #{theSource},
+			modularConstructionScheme = #{modularConstructionScheme},
+			descriptionOf = #{descriptionOf},
+			milestoneStartDate = #{milestoneStartDate},
+			milestoneCommissioningDate = #{milestoneCommissioningDate},
+			startDate = #{startDate},
+			internalControl = #{internalControl},
+			earliestArrival = #{earliestArrival},
+			arrivalPlan = #{arrivalPlan}
+		WHERE projectCode = #{projectCode}
+	</update>
+	
+	
+	<!--物理删除-->
+	<update id="delete">
+		DELETE FROM filing_approval_stage
+		WHERE id = #{id}
+	</update>
+	
+	<!--逻辑删除-->
+	<update id="deleteByLogic">
+		UPDATE filing_approval_stage SET 
+			del_flag = #{DEL_FLAG_DELETE}
+		WHERE id = #{id}
+	</update>
+	
+	
+	<!-- 根据实体名称和字段名称和字段值获取唯一记录 -->
+	<select id="findUniqueByProperty" resultType="EarlyStage" statementType="STATEMENT">
+		select * FROM filing_approval_stage  where ${propertyName} = '${value}'
+	</select>
+	<select id="findChildList" resultType="com.jeeplus.modules.filing.approvalStage.entity.EarlyStage">
+		select
+			a.id AS "id",
+			a.projectCode AS "projectCode",
+			a.monomerCode AS "monomerCode",
+			a.entryName AS "entryName",
+			b.approvalNumber AS "approvalNumber",
+			b.dateOfApproval AS "dateOfApproval",
+			b.approvedAmount AS "approvedAmount",
+			b.approvedAnnex AS "approvedAnnex",
+			b.replyNo AS "replyNo",
+			b.approvalDate AS "approvalDate",
+			b.staticInvestment AS "staticInvestment",
+			b.dynamicInvestment AS "dynamicInvestment",
+			b.studyAppendix AS "studyAppendix",
+			b.constructionScaleVA AS "constructionScaleVA",
+			b.constructionScaleKM AS "constructionScaleKM",
+			b.numberOf AS "numberOf",
+			b.conductorType AS "conductorType",
+			b.conductorLength AS "conductorLength",
+			b.theSource AS "theSource",
+			b.modularConstructionScheme AS "modularConstructionScheme",
+			b.descriptionOf AS "descriptionOf",
+			b.milestoneStartDate AS "milestoneStartDate",
+			b.milestoneCommissioningDate AS "milestoneCommissioningDate",
+			b.startDate AS "startDate",
+			b.internalControl AS "internalControl",
+			b.earliestArrival AS "earliestArrival",
+			b.arrivalPlan AS "arrivalPlan"
+		from filing_basic_information a
+				 LEFT JOIN filing_approval_stage b on a.projectCode = b.projectCode
+		<where>
+			<if test="projectCode != null  and projectCode != ''">
+				a.parentId = #{projectCode}
+			</if>
+		</where>
+	</select>
+	<select id="findByCode" resultType="java.lang.Integer">
+		select count(id) from filing_approval_stage
+		where projectCode = #{projectCode}
+	</select>
+	<select id="findByIdList" resultType="com.jeeplus.modules.filing.approvalStage.entity.EarlyStage">
+		SELECT
+		<include refid="EarlyStageColumns"/>
+		FROM filing_basic_information a
+		<include refid="EarlyStageJoins"/>
+		WHERE a.id in(
+		<foreach collection="list" index="index" item="item" separator=",">
+			#{item}
+		</foreach>
+		)
+	</select>
+	<select id="findAllStudy" resultType="com.jeeplus.modules.filing.approvalStage.entity.EarlyStage">
+		SELECT
+		a.id AS "id",
+		a.create_by AS "createBy.id",
+		a.create_date AS "createDate",
+		a.update_by AS "updateBy.id",
+		a.update_date AS "updateDate",
+		a.remarks AS "remarks",
+		a.del_flag AS "delFlag",
+		a.projectCode AS "projectCode",
+		a.monomerCode AS "monomerCode",
+		a.entryName AS "entryName",
+		a.parentId AS "parentId",
+		b.studyAppendix AS "studyAppendix",
+		b.approvedAnnex AS "approvedAnnex"
+		FROM filing_basic_information a
+		LEFT JOIN filing_approval_stage b on a.projectCode = b.projectCode
+		WHERE a.id in(
+		<foreach collection="list" index="index" item="item" separator=",">
+			#{item}
+		</foreach>
+		)
+	</select>
+
+</mapper>

+ 196 - 0
src/main/java/com/jeeplus/modules/filing/approvalStage/mapper/xml/ProjectOverviewMapper.xml

@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jeeplus.modules.filing.approvalStage.mapper.ProjectOverviewMapper">
+    
+	<sql id="projectOverviewColumns">
+		a.id AS "id",
+		a.create_by AS "createBy.id",
+		a.create_date AS "createDate",
+		a.update_by AS "updateBy.id",
+		a.update_date AS "updateDate",
+		a.remarks AS "remarks",
+		a.del_flag AS "delFlag",
+		a.projectCode AS "projectCode",
+		a.monomerCode AS "monomerCode",
+		a.entryName AS "entryName",
+		b.constructionScaleVA AS "constructionScaleVA",
+		b.constructionScaleKM AS "constructionScaleKM",
+		b.numberOf AS "numberOf",
+		b.conductorType AS "conductorType",
+		b.conductorLength AS "conductorLength",
+		b.theSource AS "theSource",
+		b.modularConstructionScheme AS "modularConstructionScheme",
+		b.descriptionOf AS "descriptionOf",
+		b.milestoneStartDate AS "milestoneStartDate",
+		b.milestoneCommissioningDate AS "milestoneCommissioningDate",
+		b.startDate AS "startDate",
+		b.internalControl AS "internalControl",
+		b.earliestArrival AS "earliestArrival",
+		b.arrivalPlan AS "arrivalPlan"
+	</sql>
+	
+	<sql id="projectOverviewJoins">
+		LEFT JOIN filing_approval_stage b on a.projectCode = b.projectCode
+	</sql>
+	
+    
+	<select id="get" resultType="ProjectOverview" >
+		SELECT 
+			<include refid="projectOverviewColumns"/>
+		FROM filing_basic_information a
+		<include refid="projectOverviewJoins"/>
+		WHERE a.id = #{id}
+	</select>
+	
+	<select id="findList" resultType="ProjectOverview" >
+		SELECT 
+			<include refid="projectOverviewColumns"/>
+		FROM filing_basic_information a
+		<include refid="projectOverviewJoins"/>
+		<where>
+			a.del_flag = #{DEL_FLAG_NORMAL}
+			${dataScope}
+			and a.parentId = '0'
+			<if test="projectCode != null  and projectCode != ''">
+				and a.projectCode = #{projectCode}
+			</if>
+		</where>
+		<choose>
+			<when test="page !=null and page.orderBy != null and page.orderBy != ''">
+				ORDER BY ${page.orderBy}
+			</when>
+			<otherwise>
+				ORDER BY a.update_date DESC
+			</otherwise>
+		</choose>
+	</select>
+	
+	<select id="findAllList" resultType="ProjectOverview" >
+		SELECT 
+			<include refid="projectOverviewColumns"/>
+		FROM filing_basic_information a
+		<include refid="projectOverviewJoins"/>
+		<where>
+			a.del_flag = #{DEL_FLAG_NORMAL}
+			${dataScope}
+		</where>		
+		<choose>
+			<when test="page !=null and page.orderBy != null and page.orderBy != ''">
+				ORDER BY ${page.orderBy}
+			</when>
+			<otherwise>
+				ORDER BY a.update_date DESC
+			</otherwise>
+		</choose>
+	</select>
+	
+	<insert id="insert">
+		INSERT INTO filing_approval_stage(
+			id,
+			create_by,
+			create_date,
+			update_by,
+			update_date,
+			remarks,
+			del_flag,
+			projectCode,
+			constructionScaleVA,
+			constructionScaleKM,
+			numberOf,
+			conductorType,
+			conductorLength,
+			theSource,
+			modularConstructionScheme,
+			descriptionOf,
+			milestoneStartDate,
+			milestoneCommissioningDate,
+			startDate,
+			internalControl,
+			earliestArrival,
+			arrivalPlan
+		) VALUES (
+			#{id},
+			#{createBy.id},
+			#{createDate},
+			#{updateBy.id},
+			#{updateDate},
+			#{remarks},
+			#{delFlag},
+			#{projectCode},
+			#{constructionScaleVA},
+			#{constructionScaleKM},
+			#{numberOf},
+			#{conductorType},
+			#{conductorLength},
+			#{theSource},
+			#{modularConstructionScheme},
+			#{descriptionOf},
+			#{milestoneStartDate},
+			#{milestoneCommissioningDate},
+			#{startDate},
+			#{internalControl},
+			#{earliestArrival},
+			#{arrivalPlan}
+		)
+	</insert>
+	
+	<update id="update">
+		UPDATE filing_approval_stage SET
+			create_date = #{createDate},
+			update_by = #{updateBy.id},
+			update_date = #{updateDate},
+			remarks = #{remarks},
+			constructionScaleVA = #{constructionScaleVA},
+			constructionScaleKM = #{constructionScaleKM},
+			numberOf = #{numberOf},
+			conductorType = #{conductorType},
+			conductorLength = #{conductorLength},
+			theSource = #{theSource},
+			modularConstructionScheme = #{modularConstructionScheme},
+			descriptionOf = #{descriptionOf},
+			milestoneStartDate = #{milestoneStartDate},
+			milestoneCommissioningDate = #{milestoneCommissioningDate},
+			startDate = #{startDate},
+			internalControl = #{internalControl},
+			earliestArrival = #{earliestArrival},
+			arrivalPlan = #{arrivalPlan}
+		WHERE projectCode = #{projectCode}
+	</update>
+	
+	
+	<!--物理删除-->
+	<update id="delete">
+		DELETE FROM filing_approval_stage
+		WHERE id = #{id}
+	</update>
+	
+	<!--逻辑删除-->
+	<update id="deleteByLogic">
+		UPDATE filing_approval_stage SET 
+			del_flag = #{DEL_FLAG_DELETE}
+		WHERE id = #{id}
+	</update>
+	
+	
+	<!-- 根据实体名称和字段名称和字段值获取唯一记录 -->
+	<select id="findUniqueByProperty" resultType="ProjectOverview" statementType="STATEMENT">
+		select * FROM filing_approval_stage  where ${propertyName} = '${value}'
+	</select>
+
+	<select id="findChildList" resultType="com.jeeplus.modules.filing.approvalStage.entity.ProjectOverview">
+		select
+		<include refid="projectOverviewColumns"/>
+		FROM filing_basic_information a
+		<include refid="projectOverviewJoins"/>
+		<where>
+			<if test="projectCode != null  and projectCode != ''">
+				a.parentId = #{projectCode}
+			</if>
+		</where>
+	</select>
+	<select id="findByCode" resultType="java.lang.Integer">
+		select count(id) from filing_approval_stage
+		where projectCode = #{projectCode}
+	</select>
+
+</mapper>

+ 195 - 0
src/main/java/com/jeeplus/modules/filing/approvalStage/mapper/xml/StudyStageMapper.xml

@@ -0,0 +1,195 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jeeplus.modules.filing.approvalStage.mapper.StudyStageMapper">
+
+	<sql id="studyStageColumns">
+		a.id AS "id",
+		a.create_by AS "createBy.id",
+		a.create_date AS "createDate",
+		a.update_by AS "updateBy.id",
+		a.update_date AS "updateDate",
+		a.remarks AS "remarks",
+		a.del_flag AS "delFlag",
+		a.projectCode AS "projectCode",
+		a.monomerCode AS "monomerCode",
+		a.entryName AS "entryName",
+		b.replyNo AS "replyNo",
+		b.approvalDate AS "approvalDate",
+		b.staticInvestment AS "staticInvestment",
+		b.dynamicInvestment AS "dynamicInvestment",
+		b.studyAppendix AS "studyAppendix"
+	</sql>
+
+	<sql id="studyStageJoins">
+		LEFT JOIN filing_approval_stage b on a.projectCode = b.projectCode
+	</sql>
+
+
+	<select id="get" resultType="StudyStage" >
+		SELECT
+		<include refid="studyStageColumns"/>
+		FROM filing_basic_information a
+		<include refid="studyStageJoins"/>
+		WHERE a.id = #{id}
+	</select>
+
+	<select id="findList" resultType="StudyStage" >
+		SELECT
+		<include refid="studyStageColumns"/>
+		FROM filing_basic_information a
+		<include refid="studyStageJoins"/>
+		<where>
+			a.del_flag = #{DEL_FLAG_NORMAL}
+			${dataScope}
+			and a.parentId = '0'
+			<if test="projectCode != null  and projectCode != ''">
+				and a.projectCode = #{projectCode}
+			</if>
+		</where>
+		<choose>
+			<when test="page !=null and page.orderBy != null and page.orderBy != ''">
+				ORDER BY ${page.orderBy}
+			</when>
+			<otherwise>
+				ORDER BY a.update_date DESC
+			</otherwise>
+		</choose>
+	</select>
+
+	<select id="findAllList" resultType="StudyStage" >
+		SELECT
+		<include refid="studyStageColumns"/>
+		FROM filing_basic_information a
+		<include refid="studyStageJoins"/>
+		<where>
+			a.del_flag = #{DEL_FLAG_NORMAL}
+			${dataScope}
+		</where>
+		<choose>
+			<when test="page !=null and page.orderBy != null and page.orderBy != ''">
+				ORDER BY ${page.orderBy}
+			</when>
+			<otherwise>
+				ORDER BY a.update_date DESC
+			</otherwise>
+		</choose>
+	</select>
+
+	<insert id="insert">
+		INSERT INTO filing_approval_stage(
+			id,
+		  create_by,
+		  create_date,
+		  update_by,
+		  update_date,
+		  remarks,
+		  del_flag,
+		  projectCode,
+		  replyNo,
+		  approvalDate,
+		  staticInvestment,
+		  dynamicInvestment,
+		  studyAppendix
+		) VALUES (
+					 #{id},
+					 #{createBy.id},
+					 #{createDate},
+					 #{updateBy.id},
+					 #{updateDate},
+					 #{remarks},
+					 #{delFlag},
+					 #{projectCode},
+					 #{replyNo},
+					 #{approvalDate},
+					 #{staticInvestment},
+					 #{dynamicInvestment},
+		             #{studyAppendix}
+				 )
+	</insert>
+
+	<update id="update">
+		UPDATE filing_approval_stage SET
+		 create_date = #{createDate},
+		 update_by = #{updateBy.id},
+		 update_date = #{updateDate},
+		 remarks = #{remarks},
+		 replyNo = #{replyNo},
+		 approvalDate = #{approvalDate},
+		 staticInvestment = #{staticInvestment},
+		 dynamicInvestment = #{dynamicInvestment},
+		 studyAppendix = #{studyAppendix}
+		WHERE projectCode = #{projectCode}
+	</update>
+
+
+	<!--物理删除-->
+	<update id="delete">
+		DELETE FROM filing_approval_stage
+		WHERE id = #{id}
+	</update>
+
+	<!--逻辑删除-->
+	<update id="deleteByLogic">
+		UPDATE filing_approval_stage SET
+			del_flag = #{DEL_FLAG_DELETE}
+		WHERE id = #{id}
+	</update>
+
+
+	<!-- 根据实体名称和字段名称和字段值获取唯一记录 -->
+	<select id="findUniqueByProperty" resultType="StudyStage" statementType="STATEMENT">
+		select * FROM filing_approval_stage  where ${propertyName} = '${value}'
+	</select>
+
+	<select id="findChildList" resultType="com.jeeplus.modules.filing.approvalStage.entity.StudyStage">
+		select
+		a.id AS "id",
+		a.projectCode AS "projectCode",
+		a.monomerCode AS "monomerCode",
+		a.entryName AS "entryName",
+	    a.parentId AS "parentId",
+		b.replyNo AS "replyNo",
+		b.approvalDate AS "approvalDate",
+		b.staticInvestment AS "staticInvestment",
+		b.dynamicInvestment AS "dynamicInvestment",
+		b.studyAppendix AS "studyAppendix"
+		from filing_basic_information a
+		LEFT JOIN filing_approval_stage b on a.projectCode = b.projectCode
+		<where>
+			<if test="projectCode != null  and projectCode != ''">
+				a.parentId = #{projectCode}
+			</if>
+		</where>
+	</select>
+	<select id="findByCode" resultType="java.lang.Integer">
+		select count(id) from filing_approval_stage
+		where projectCode = #{projectCode}
+	</select>
+	<select id="findAllStudy" resultType="com.jeeplus.modules.filing.approvalStage.entity.StudyStage">
+		SELECT
+		a.id AS "id",
+		a.create_by AS "createBy.id",
+		a.create_date AS "createDate",
+		a.update_by AS "updateBy.id",
+		a.update_date AS "updateDate",
+		a.remarks AS "remarks",
+		a.del_flag AS "delFlag",
+		a.projectCode AS "projectCode",
+		a.monomerCode AS "monomerCode",
+		a.entryName AS "entryName",
+	    a.parentId AS "parentId",
+		b.replyNo AS "replyNo",
+		b.approvalDate AS "approvalDate",
+		b.staticInvestment AS "staticInvestment",
+		b.dynamicInvestment AS "dynamicInvestment",
+		b.studyAppendix AS "studyAppendix"
+		FROM filing_basic_information a
+		LEFT JOIN filing_approval_stage b on a.projectCode = b.projectCode
+		WHERE a.id in(
+		<foreach collection="list" index="index" item="item" separator=",">
+			#{item}
+		</foreach>
+		)
+	</select>
+
+</mapper>

+ 79 - 0
src/main/java/com/jeeplus/modules/filing/approvalStage/service/ApprovalStageService.java

@@ -0,0 +1,79 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.filing.approvalStage.service;
+
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.core.persistence.Page;
+import com.jeeplus.core.service.CrudService;
+import com.jeeplus.modules.filing.approvalStage.entity.ApprovalStage;
+import com.jeeplus.modules.filing.approvalStage.mapper.ApprovalStageMapper;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * 核准阶段Service
+ *
+ * @author qy
+ * @version 2021-03-25
+ */
+@Service
+@Transactional(readOnly = true)
+public class ApprovalStageService extends CrudService<ApprovalStageMapper, ApprovalStage> {
+
+
+	@Override
+	public ApprovalStage get(ApprovalStage entity) {
+		return super.get(entity);
+	}
+
+	@Override
+	public List<ApprovalStage> findList(ApprovalStage entity) {
+		return super.findList(entity);
+	}
+
+	@Override
+	public Page<ApprovalStage> findPage(Page<ApprovalStage> page, ApprovalStage entity) {
+		return super.findPage(page, entity);
+	}
+
+	public Page<ApprovalStage> findAllPage(Page<ApprovalStage> page, ApprovalStage entity){
+		dataRuleFilter(entity);
+		entity.setPage(page);
+		page.setList(mapper.findAllList(entity));
+		return page;
+	}
+
+	public Page<ApprovalStage> findChildPage(Page<ApprovalStage> page, ApprovalStage entity) {
+		dataRuleFilter(entity);
+		entity.setPage(page);
+		page.setList(mapper.findChildList(entity));
+		return page;
+	}
+
+
+
+	@Override
+	public void delete(ApprovalStage entity) {
+		super.delete(entity);
+	}
+
+	@Override
+	@Transactional(readOnly = false)
+	public void save(ApprovalStage entity) {
+		Integer byCode = mapper.findByCode(entity);
+		if (0 == byCode || null == byCode) {
+			entity.preInsert();
+			mapper.insert(entity);
+		} else {
+			entity.preUpdate();
+			mapper.update(entity);
+		}
+	}
+
+	public Integer findByCode(ApprovalStage entity) {
+		return mapper.findByCode(entity);
+	}
+}

+ 80 - 0
src/main/java/com/jeeplus/modules/filing/approvalStage/service/EarlyStageService.java

@@ -0,0 +1,80 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.filing.approvalStage.service;
+
+import com.jeeplus.core.persistence.Page;
+import com.jeeplus.core.service.CrudService;
+import com.jeeplus.modules.filing.approvalStage.entity.ApprovalStage;
+import com.jeeplus.modules.filing.approvalStage.entity.EarlyStage;
+import com.jeeplus.modules.filing.approvalStage.mapper.ApprovalStageMapper;
+import com.jeeplus.modules.filing.approvalStage.mapper.EarlyStageMapper;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * 核准阶段Service
+ *
+ * @author qy
+ * @version 2021-03-25
+ */
+@Service
+@Transactional(readOnly = true)
+public class EarlyStageService extends CrudService<EarlyStageMapper, EarlyStage> {
+
+
+	@Override
+	public EarlyStage get(EarlyStage entity) {
+		return super.get(entity);
+	}
+
+	@Override
+	public List<EarlyStage> findList(EarlyStage entity) {
+		return super.findList(entity);
+	}
+
+	@Override
+	public Page<EarlyStage> findPage(Page<EarlyStage> page, EarlyStage entity) {
+		return super.findPage(page, entity);
+	}
+
+	public Page<EarlyStage> findAllPage(Page<EarlyStage> page, EarlyStage entity){
+		dataRuleFilter(entity);
+		entity.setPage(page);
+		page.setList(mapper.findAllList(entity));
+		return page;
+	}
+
+	public Page<EarlyStage> findChildPage(Page<EarlyStage> page, EarlyStage entity) {
+		dataRuleFilter(entity);
+		entity.setPage(page);
+		page.setList(mapper.findChildList(entity));
+		return page;
+	}
+
+
+
+	@Override
+	public void delete(EarlyStage entity) {
+		super.delete(entity);
+	}
+
+	@Override
+	@Transactional(readOnly = false)
+	public void save(EarlyStage entity) {
+		Integer byCode = mapper.findByCode(entity);
+		if (0 == byCode || null == byCode) {
+			entity.preInsert();
+			mapper.insert(entity);
+		} else {
+			entity.preUpdate();
+			mapper.update(entity);
+		}
+	}
+
+	public Integer findByCode(EarlyStage entity) {
+		return mapper.findByCode(entity);
+	}
+}

+ 74 - 0
src/main/java/com/jeeplus/modules/filing/approvalStage/service/ProjectOverviewService.java

@@ -0,0 +1,74 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.filing.approvalStage.service;
+
+import com.jeeplus.core.persistence.Page;
+import com.jeeplus.core.service.CrudService;
+import com.jeeplus.modules.filing.approvalStage.entity.ApprovalStage;
+import com.jeeplus.modules.filing.approvalStage.entity.ProjectOverview;
+import com.jeeplus.modules.filing.approvalStage.mapper.ApprovalStageMapper;
+import com.jeeplus.modules.filing.approvalStage.mapper.ProjectOverviewMapper;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * 可研阶段Service
+ *
+ * @author qy
+ * @version 2021-03-25
+ */
+@Service
+@Transactional(readOnly = true)
+public class ProjectOverviewService extends CrudService<ProjectOverviewMapper, ProjectOverview> {
+
+
+	@Override
+	public ProjectOverview get(String id) {
+		return super.get(id);
+	}
+
+	@Override
+	public List<ProjectOverview> findList(ProjectOverview entity) {
+		return super.findList(entity);
+	}
+
+	@Override
+	public Page<ProjectOverview> findPage(Page<ProjectOverview> page, ProjectOverview entity) {
+		return super.findPage(page, entity);
+	}
+
+	public Page<ProjectOverview> findAllPage(Page<ProjectOverview> page, ProjectOverview entity){
+		dataRuleFilter(entity);
+		entity.setPage(page);
+		page.setList(mapper.findAllList(entity));
+		return page;
+	}
+
+	public Page<ProjectOverview> findChildPage(Page<ProjectOverview> page, ProjectOverview entity) {
+		dataRuleFilter(entity);
+		entity.setPage(page);
+		page.setList(mapper.findChildList(entity));
+		return page;
+	}
+
+	@Override
+	@Transactional(readOnly = false)
+	public void save(ProjectOverview entity) {
+		Integer byCode = mapper.findByCode(entity);
+		if (0 == byCode || null == byCode) {
+			entity.preInsert();
+			mapper.insert(entity);
+		} else {
+			entity.preUpdate();
+			mapper.update(entity);
+		}
+	}
+
+	@Override
+	public void delete(ProjectOverview entity) {
+		super.delete(entity);
+	}
+}

+ 75 - 0
src/main/java/com/jeeplus/modules/filing/approvalStage/service/StudyStageService.java

@@ -0,0 +1,75 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.filing.approvalStage.service;
+
+import com.jeeplus.core.persistence.Page;
+import com.jeeplus.core.service.CrudService;
+import com.jeeplus.modules.filing.approvalStage.entity.ApprovalStage;
+import com.jeeplus.modules.filing.approvalStage.entity.ProjectOverview;
+import com.jeeplus.modules.filing.approvalStage.entity.StudyStage;
+import com.jeeplus.modules.filing.approvalStage.mapper.ApprovalStageMapper;
+import com.jeeplus.modules.filing.approvalStage.mapper.StudyStageMapper;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * 项目概述Service
+ *
+ * @author qy
+ * @version 2021-03-25
+ */
+@Service
+@Transactional(readOnly = true)
+public class StudyStageService extends CrudService<StudyStageMapper, StudyStage> {
+
+
+	@Override
+	public StudyStage get(StudyStage entity) {
+		return super.get(entity);
+	}
+
+	@Override
+	public List<StudyStage> findList(StudyStage entity) {
+		return super.findList(entity);
+	}
+
+	@Override
+	public Page<StudyStage> findPage(Page<StudyStage> page, StudyStage entity) {
+		return super.findPage(page, entity);
+	}
+
+	public Page<StudyStage> findAllPage(Page<StudyStage> page, StudyStage entity){
+		dataRuleFilter(entity);
+		entity.setPage(page);
+		page.setList(mapper.findAllList(entity));
+		return page;
+	}
+
+	public Page<StudyStage> findChildPage(Page<StudyStage> page, StudyStage entity) {
+		dataRuleFilter(entity);
+		entity.setPage(page);
+		page.setList(mapper.findChildList(entity));
+		return page;
+	}
+
+	@Override
+	public void delete(StudyStage entity) {
+		super.delete(entity);
+	}
+
+	@Override
+	@Transactional(readOnly = false)
+	public void save(StudyStage entity) {
+		Integer byCode = mapper.findByCode(entity);
+		if (0 == byCode || null == byCode) {
+			entity.preInsert();
+			mapper.insert(entity);
+		} else {
+			entity.preUpdate();
+			mapper.update(entity);
+		}
+	}
+}

+ 350 - 0
src/main/java/com/jeeplus/modules/filing/approvalStage/web/ApprovalStageController.java

@@ -0,0 +1,350 @@
+package com.jeeplus.modules.filing.approvalStage.web;
+
+import com.google.common.collect.Lists;
+import com.jeeplus.common.json.AjaxJson;
+import com.jeeplus.common.utils.DateUtils;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.utils.excel.ExportExcel;
+import com.jeeplus.common.utils.excel.ImportExcel;
+import com.jeeplus.core.persistence.Page;
+import com.jeeplus.core.web.BaseController;
+import com.jeeplus.modules.filing.approvalStage.entity.ApprovalStage;
+import com.jeeplus.modules.filing.approvalStage.service.ApprovalStageService;
+import com.jeeplus.modules.filing.filingImages.entity.FilingImages;
+import com.jeeplus.modules.filing.filingImages.service.FilingImagesService;
+import org.apache.shiro.authz.annotation.Logical;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.*;
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+
+/**
+ * 核准阶段Controller
+ * @author qy
+ * @version 2021-03-24
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/filing/approvalStage")
+public class ApprovalStageController extends BaseController {
+
+	@Autowired
+	private ApprovalStageService approvalStageService;
+
+	@Autowired
+	private FilingImagesService filingImagesService;
+
+	@ModelAttribute
+	public ApprovalStage get(@RequestParam(required=false) String id) {
+		ApprovalStage entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = approvalStageService.get(id);
+		}
+		if (entity == null){
+			entity = new ApprovalStage();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 核准阶段列表页面
+	 */
+	@RequiresPermissions("test:filing:approvalStage:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(ApprovalStage approvalStage, Model model) {
+		model.addAttribute("approvalStage", approvalStage);
+		return "modules/filing/approvalStage/approvalStageList";
+	}
+	
+		/**
+	 * 核准阶段列表数据
+	 */
+	@ResponseBody
+	@RequiresPermissions("test:filing:approvalStage:list")
+	@RequestMapping(value = "data")
+	public Map<String, Object> data(ApprovalStage approvalStage, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<ApprovalStage> page = approvalStageService.findPage(new Page<ApprovalStage>(request, response,-1), approvalStage);
+		return getBootstrapData(page);
+	}
+
+	/**
+	 * 查看,增加,核准阶段表单页面
+	 */
+	@RequiresPermissions(value={"test:filing:approvalStage:view","test:filing:approvalStage:add","test:filing:approvalStage:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(ApprovalStage approvalStage, Model model) {
+		model.addAttribute("approvalStage", approvalStage);
+		return "modules/filing/approvalStage/approvalStageForm";
+	}
+
+	
+	/**
+	 * 保存核准阶段
+	 */
+	@ResponseBody
+	@RequiresPermissions(value={"test:filing:approvalStage:add","test:filing:approvalStage:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	public AjaxJson save(ApprovalStage approvalStage, Model model) throws Exception{
+		AjaxJson j = new AjaxJson();
+		/**
+		 * 后台hibernate-validation插件校验
+		 */
+		String errMsg = beanValidator(approvalStage);
+		if (StringUtils.isNotBlank(errMsg)){
+			j.setSuccess(false);
+			j.setMsg(errMsg);
+			return j;
+		}
+		//新增或编辑表单保存
+		approvalStageService.save(approvalStage);//保存
+		j.setSuccess(true);
+		j.setMsg("保存核准阶段成功");
+		return j;
+	}
+
+	/**
+	 * 保存核准阶段
+	 */
+	@ResponseBody
+	@RequiresPermissions(value={"test:filing:approvalStage:add","test:filing:approvalStage:edit"},logical=Logical.OR)
+	@RequestMapping(value = "updateSave")
+	public AjaxJson updateSave(ApprovalStage approvalStage, Model model) throws Exception{
+		AjaxJson j = new AjaxJson();
+		/**
+		 * 后台hibernate-validation插件校验
+		 */
+		String errMsg = beanValidator(approvalStage);
+		if (StringUtils.isNotBlank(errMsg)){
+			j.setSuccess(false);
+			j.setMsg(errMsg);
+			return j;
+		}
+		//新增或编辑表单保存
+		approvalStageService.save(approvalStage);//保存
+		j.setSuccess(true);
+		j.setMsg("保存核准阶段成功");
+		return j;
+	}
+
+
+	/**
+	 * 删除核准阶段
+	 */
+	@ResponseBody
+	@RequiresPermissions("test:filing:approvalStage:del")
+	@RequestMapping(value = "delete")
+	public AjaxJson delete(ApprovalStage approvalStage) {
+		AjaxJson j = new AjaxJson();
+		approvalStageService.delete(approvalStage);
+		j.setMsg("删除核准阶段成功");
+		return j;
+	}
+	
+	/**
+	 * 批量删除核准阶段
+	 */
+	@ResponseBody
+	@RequiresPermissions("test:filing:approvalStage:del")
+	@RequestMapping(value = "deleteAll")
+	public AjaxJson deleteAll(String ids) {
+		AjaxJson j = new AjaxJson();
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			approvalStageService.delete(approvalStageService.get(id));
+		}
+		j.setMsg("删除核准阶段成功");
+		return j;
+	}
+	
+	/**
+	 * 导出excel文件
+	 */
+	@ResponseBody
+	@RequiresPermissions("test:filing:approvalStage:export")
+    @RequestMapping(value = "export")
+    public AjaxJson exportFile(ApprovalStage approvalStage, HttpServletRequest request, HttpServletResponse response) {
+		AjaxJson j = new AjaxJson();
+		try {
+            String fileName = "核准阶段"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            Page<ApprovalStage> page = approvalStageService.findAllPage(new Page<ApprovalStage>(request, response, -1), approvalStage);
+    		new ExportExcel("核准阶段", ApprovalStage.class).setDataList(page.getList()).write(response, fileName).dispose();
+    		j.setSuccess(true);
+    		j.setMsg("导出成功!");
+    		return j;
+		} catch (Exception e) {
+			j.setSuccess(false);
+			j.setMsg("导出核准阶段记录失败!失败信息:"+e.getMessage());
+		}
+			return j;
+    }
+
+	@ResponseBody
+	@RequestMapping(value = "exportFiles")
+	public void exportFiles(String ids, HttpServletResponse servletResponse) {
+		AjaxJson j = new AjaxJson();
+		List<FilingImages> allList = new ArrayList<>();
+		if (null != ids && !"".equals(ids)) {
+			String idArray[] = ids.split(",");
+			for (String id : idArray) {
+				//获取选择项目的信息及附件信息
+				List<FilingImages> approvalStage = filingImagesService.findByProjectId(id);
+				for (FilingImages f :
+						approvalStage) {
+					if (f.getImgPath().contains("|")) {
+						String[] split = f.getImgPath().split("\\|");
+						for (int i = 0; i < split.length; i++) {
+							String s = split[i];
+							FilingImages filingImages = new FilingImages();
+							filingImages.setImgPath(s);
+							filingImages.setProjectCode(f.getProjectCode());
+							filingImages.setPurpose(f.getPurpose());
+							allList.add(filingImages);
+						}
+					} else {
+						allList.add(f);
+					}
+				}
+			}
+		} else {
+			//获取所有项目的信息及附件
+			allList = filingImagesService.findAllList(new FilingImages());
+		}
+
+		File srcfile[] = new File[allList.size()];
+		for (int i = 0; i < allList.size(); i++) { //这里是在模拟添加文件  修改为自己要压缩的文件
+			String imgPath = allList.get(i).getImgPath();
+			if (null != imgPath && !"".equals(imgPath)) {
+				srcfile[i] = new File(imgPath);
+			}
+		}
+		String zipname = "test" + ".zip";
+		File zip = new File(zipname);// 压缩文件
+		if (zip.exists()) {
+			try {
+				zip.createNewFile();
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+		}
+		ZipFiles(srcfile, zip);
+		/*try {
+			// 获取压缩文件流
+			InputStream zipStream = new FileInputStream(new File("/附件下载.zip"));
+			// 下载文件名中文处理
+			String downZipFileName = URLEncoder.encode("附件下载.zip".substring("附件下载.zip".lastIndexOf("/") + 1), "UTF-8");
+			// 下载到浏览器
+			servletResponse.setHeader("Content-disposition", "attachment; filename*=UTF-8''" + downZipFileName);
+			BufferedOutputStream bufferedOs = new BufferedOutputStream(servletResponse.getOutputStream());
+			byte[] buffer = new byte[10240];
+			int bytesRead = 0;
+			while ((bytesRead = zipStream.read(buffer)) != -1) {
+				bufferedOs.write(buffer, 0, bytesRead);
+			}
+			bufferedOs.flush();
+			bufferedOs.close();
+			zipStream.close();
+		} catch (Exception e) {
+			e.printStackTrace();
+		}*/
+	}
+
+
+	/**
+	  文件压缩
+	 */
+	private static void ZipFiles(java.io.File[] srcfile, java.io.File zipfile) {
+		byte[] buf=new byte[1024];
+		ZipOutputStream out=null;
+		try {
+			out=new ZipOutputStream(new FileOutputStream(
+					zipfile));
+			for (int i=0; i < srcfile.length; i++) {
+				FileInputStream in=new FileInputStream(srcfile[i]);
+				out.putNextEntry(new ZipEntry(srcfile[i].getName()));
+				int len;
+				while ((len=in.read(buf)) > 0) {
+					out.write(buf, 0, len);
+				}
+				out.closeEntry();
+				in.close();
+			}
+			out.close();
+		} catch (IOException e) {
+			e.printStackTrace();
+		} finally {
+			try {
+				out.close();
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		}
+	}
+
+    
+    @ResponseBody
+    @RequestMapping(value = "detail")
+	public Map<String, Object> detail(ApprovalStage approvalStage, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<ApprovalStage> page = approvalStageService.findChildPage(new Page<ApprovalStage>(request, response), approvalStage);
+		return getBootstrapData(page);
+	}
+	
+
+	/**
+	 * 导入Excel数据
+	 */
+	@ResponseBody
+	@RequiresPermissions("test:filing:approvalStage:import")
+    @RequestMapping(value = "import")
+   	public AjaxJson importFile(@RequestParam("file")MultipartFile file, HttpServletResponse response, HttpServletRequest request) {
+		AjaxJson j = new AjaxJson();
+		try {
+			ImportExcel ei = new ImportExcel(file, 1, 0);
+			List<ApprovalStage> list = ei.getDataList(ApprovalStage.class);
+			for (ApprovalStage approvalStage :
+					list) {
+				approvalStageService.save(approvalStage);
+			}
+			j.setMsg( "已成功导入条核准阶段记录");
+		} catch (Exception e) {
+			j.setSuccess(false);
+			j.setMsg("导入核准阶段失败!失败信息:"+e.getMessage());
+		}
+		return j;
+    }
+	
+	/**
+	 * 下载导入核准阶段数据模板
+	 */
+	@ResponseBody
+	@RequiresPermissions("test:filing:approvalStage:import")
+    @RequestMapping(value = "import/template")
+     public AjaxJson importFileTemplate(HttpServletResponse response) {
+		AjaxJson j = new AjaxJson();
+		try {
+            String fileName = "核准阶段数据导入模板.xlsx";
+    		List<ApprovalStage> list = Lists.newArrayList(); 
+    		new ExportExcel("核准阶段数据", ApprovalStage.class, 1).setDataList(list).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			j.setSuccess(false);
+			j.setMsg( "导入模板下载失败!失败信息:"+e.getMessage());
+		}
+		return j;
+    }
+	
+
+}

+ 362 - 0
src/main/java/com/jeeplus/modules/filing/approvalStage/web/EarlyStageController.java

@@ -0,0 +1,362 @@
+package com.jeeplus.modules.filing.approvalStage.web;
+
+import com.google.common.collect.Lists;
+import com.jeeplus.common.json.AjaxJson;
+import com.jeeplus.common.utils.DateUtils;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.utils.excel.ExportExcel;
+import com.jeeplus.common.utils.excel.ImportExcel;
+import com.jeeplus.core.persistence.Page;
+import com.jeeplus.core.web.BaseController;
+import com.jeeplus.modules.filing.approvalStage.entity.EarlyStage;
+import com.jeeplus.modules.filing.approvalStage.service.EarlyStageService;
+import com.jeeplus.modules.filing.filingImages.entity.FilingImages;
+import com.jeeplus.modules.filing.filingImages.service.FilingImagesService;
+import org.apache.shiro.authz.annotation.Logical;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+
+/**
+ * 项目前期阶段Controller
+ * @author qy
+ * @version 2021-03-24
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/filing/earlyStage")
+public class EarlyStageController extends BaseController {
+
+	@Autowired
+	private EarlyStageService earlyStageService;
+
+	@Autowired
+	private FilingImagesService filingImagesService;
+
+	@ModelAttribute
+	public EarlyStage get(@RequestParam(required=false) String id) {
+		EarlyStage entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = earlyStageService.get(id);
+		}
+		if (entity == null){
+			entity = new EarlyStage();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 核准阶段列表页面
+	 */
+	@RequiresPermissions("test:filing:earlyStage:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(EarlyStage earlyStage, Model model) {
+		model.addAttribute("earlyStage", earlyStage);
+		return "modules/filing/earlyStage/earlyStageList";
+	}
+	
+		/**
+	 * 核准阶段列表数据
+	 */
+	@ResponseBody
+	@RequiresPermissions("test:filing:earlyStage:list")
+	@RequestMapping(value = "data")
+	public Map<String, Object> data(EarlyStage earlyStage, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<EarlyStage> page = earlyStageService.findPage(new Page<EarlyStage>(request, response,-1), earlyStage);
+		return getBootstrapData(page);
+	}
+
+	/**
+	 * 查看,增加,核准阶段表单页面
+	 */
+	@RequiresPermissions(value={"test:filing:earlyStage:view","test:filing:earlyStage:add","test:filing:earlyStage:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(EarlyStage earlyStage, Model model) {
+		model.addAttribute("earlyStage", earlyStage);
+		return "modules/filing/earlyStage/earlyStageForm";
+	}
+
+
+	/**
+	 * 查看,增加,核准阶段表单页面-字类数据列表
+	 */
+	@RequiresPermissions(value={"test:filing:earlyStage:view","test:filing:earlyStage:add","test:filing:earlyStage:edit"},logical=Logical.OR)
+	@RequestMapping(value = "childForm")
+	public String childForm(EarlyStage earlyStage, Model model) {
+		model.addAttribute("earlyStage", earlyStage);
+		return "modules/filing/earlyStage/earlyStageChildForm";
+	}
+	
+	/**
+	 * 保存核准阶段
+	 */
+	@ResponseBody
+	@RequiresPermissions(value={"test:filing:earlyStage:add","test:filing:earlyStage:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	public AjaxJson save(EarlyStage earlyStage, Model model) throws Exception{
+		AjaxJson j = new AjaxJson();
+		/**
+		 * 后台hibernate-validation插件校验
+		 */
+		String errMsg = beanValidator(earlyStage);
+		if (StringUtils.isNotBlank(errMsg)){
+			j.setSuccess(false);
+			j.setMsg(errMsg);
+			return j;
+		}
+		//新增或编辑表单保存
+		earlyStageService.save(earlyStage);//保存
+		j.setSuccess(true);
+		j.setMsg("保存核准阶段成功");
+		return j;
+	}
+
+	/**
+	 * 保存核准阶段
+	 */
+	@ResponseBody
+	@RequiresPermissions(value={"test:filing:earlyStage:add","test:filing:earlyStage:edit"},logical=Logical.OR)
+	@RequestMapping(value = "updateSave")
+	public AjaxJson updateSave(EarlyStage earlyStage, Model model) throws Exception{
+		AjaxJson j = new AjaxJson();
+		/**
+		 * 后台hibernate-validation插件校验
+		 */
+		String errMsg = beanValidator(earlyStage);
+		if (StringUtils.isNotBlank(errMsg)){
+			j.setSuccess(false);
+			j.setMsg(errMsg);
+			return j;
+		}
+		//新增或编辑表单保存
+		earlyStageService.save(earlyStage);//保存
+		j.setSuccess(true);
+		j.setMsg("保存核准阶段成功");
+		return j;
+	}
+
+
+	/**
+	 * 删除核准阶段
+	 */
+	@ResponseBody
+	@RequiresPermissions("test:filing:earlyStage:del")
+	@RequestMapping(value = "delete")
+	public AjaxJson delete(EarlyStage earlyStage) {
+		AjaxJson j = new AjaxJson();
+		earlyStageService.delete(earlyStage);
+		j.setMsg("删除核准阶段成功");
+		return j;
+	}
+	
+	/**
+	 * 批量删除核准阶段
+	 */
+	@ResponseBody
+	@RequiresPermissions("test:filing:earlyStage:del")
+	@RequestMapping(value = "deleteAll")
+	public AjaxJson deleteAll(String ids) {
+		AjaxJson j = new AjaxJson();
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			earlyStageService.delete(earlyStageService.get(id));
+		}
+		j.setMsg("删除核准阶段成功");
+		return j;
+	}
+	
+	/**
+	 * 导出excel文件
+	 */
+	@ResponseBody
+	@RequiresPermissions("test:filing:earlyStage:export")
+    @RequestMapping(value = "export")
+    public AjaxJson exportFile(EarlyStage earlyStage, HttpServletRequest request, HttpServletResponse response) {
+		AjaxJson j = new AjaxJson();
+		try {
+            String fileName = "核准阶段"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            Page<EarlyStage> page = earlyStageService.findAllPage(new Page<EarlyStage>(request, response, -1), earlyStage);
+    		new ExportExcel("核准阶段", EarlyStage.class).setDataList(page.getList()).write(response, fileName).dispose();
+    		j.setSuccess(true);
+    		j.setMsg("导出成功!");
+    		return j;
+		} catch (Exception e) {
+			j.setSuccess(false);
+			j.setMsg("导出核准阶段记录失败!失败信息:"+e.getMessage());
+		}
+			return j;
+    }
+
+	@ResponseBody
+	@RequestMapping(value = "exportFiles")
+	public void exportFiles(String ids, HttpServletResponse servletResponse) {
+		AjaxJson j = new AjaxJson();
+		List<FilingImages> allList = new ArrayList<>();
+		if (null != ids && !"".equals(ids)) {
+			String idArray[] = ids.split(",");
+			for (String id : idArray) {
+				//获取选择项目的信息及附件信息
+				List<FilingImages> earlyStage = filingImagesService.findByProjectId(id);
+				for (FilingImages f :
+						earlyStage) {
+					if (f.getImgPath().contains("|")) {
+						String[] split = f.getImgPath().split("\\|");
+						for (int i = 0; i < split.length; i++) {
+							String s = split[i];
+							FilingImages filingImages = new FilingImages();
+							filingImages.setImgPath(s);
+							filingImages.setProjectCode(f.getProjectCode());
+							filingImages.setPurpose(f.getPurpose());
+							allList.add(filingImages);
+						}
+					} else {
+						allList.add(f);
+					}
+				}
+			}
+		} else {
+			//获取所有项目的信息及附件
+			allList = filingImagesService.findAllList(new FilingImages());
+		}
+
+		File srcfile[] = new File[allList.size()];
+		for (int i = 0; i < allList.size(); i++) { //这里是在模拟添加文件  修改为自己要压缩的文件
+			String imgPath = allList.get(i).getImgPath();
+			if (null != imgPath && !"".equals(imgPath)) {
+				srcfile[i] = new File(imgPath);
+			}
+		}
+		String zipname = "test" + ".zip";
+		File zip = new File(zipname);// 压缩文件
+		if (zip.exists()) {
+			try {
+				zip.createNewFile();
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+		}
+		ZipFiles(srcfile, zip);
+		/*try {
+			// 获取压缩文件流
+			InputStream zipStream = new FileInputStream(new File("/附件下载.zip"));
+			// 下载文件名中文处理
+			String downZipFileName = URLEncoder.encode("附件下载.zip".substring("附件下载.zip".lastIndexOf("/") + 1), "UTF-8");
+			// 下载到浏览器
+			servletResponse.setHeader("Content-disposition", "attachment; filename*=UTF-8''" + downZipFileName);
+			BufferedOutputStream bufferedOs = new BufferedOutputStream(servletResponse.getOutputStream());
+			byte[] buffer = new byte[10240];
+			int bytesRead = 0;
+			while ((bytesRead = zipStream.read(buffer)) != -1) {
+				bufferedOs.write(buffer, 0, bytesRead);
+			}
+			bufferedOs.flush();
+			bufferedOs.close();
+			zipStream.close();
+		} catch (Exception e) {
+			e.printStackTrace();
+		}*/
+	}
+
+
+	/**
+	  文件压缩
+	 */
+	private static void ZipFiles(File[] srcfile, File zipfile) {
+		byte[] buf=new byte[1024];
+		ZipOutputStream out=null;
+		try {
+			out=new ZipOutputStream(new FileOutputStream(
+					zipfile));
+			for (int i=0; i < srcfile.length; i++) {
+				FileInputStream in=new FileInputStream(srcfile[i]);
+				out.putNextEntry(new ZipEntry(srcfile[i].getName()));
+				int len;
+				while ((len=in.read(buf)) > 0) {
+					out.write(buf, 0, len);
+				}
+				out.closeEntry();
+				in.close();
+			}
+			out.close();
+		} catch (IOException e) {
+			e.printStackTrace();
+		} finally {
+			try {
+				out.close();
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		}
+	}
+
+    
+    @ResponseBody
+    @RequestMapping(value = "detail")
+	public Map<String, Object> detail(EarlyStage earlyStage, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<EarlyStage> page = earlyStageService.findChildPage(new Page<EarlyStage>(request, response), earlyStage);
+		return getBootstrapData(page);
+	}
+	
+
+	/**
+	 * 导入Excel数据
+	 */
+	@ResponseBody
+	@RequiresPermissions("test:filing:earlyStage:import")
+    @RequestMapping(value = "import")
+   	public AjaxJson importFile(@RequestParam("file")MultipartFile file, HttpServletResponse response, HttpServletRequest request) {
+		AjaxJson j = new AjaxJson();
+		try {
+			ImportExcel ei = new ImportExcel(file, 1, 0);
+			List<EarlyStage> list = ei.getDataList(EarlyStage.class);
+			for (EarlyStage earlyStage :
+					list) {
+				earlyStageService.save(earlyStage);
+			}
+			j.setMsg( "已成功导入条核准阶段记录");
+		} catch (Exception e) {
+			j.setSuccess(false);
+			j.setMsg("导入核准阶段失败!失败信息:"+e.getMessage());
+		}
+		return j;
+    }
+	
+	/**
+	 * 下载导入核准阶段数据模板
+	 */
+	@ResponseBody
+	@RequiresPermissions("test:filing:earlyStage:import")
+    @RequestMapping(value = "import/template")
+     public AjaxJson importFileTemplate(HttpServletResponse response) {
+		AjaxJson j = new AjaxJson();
+		try {
+            String fileName = "核准阶段数据导入模板.xlsx";
+    		List<EarlyStage> list = Lists.newArrayList(); 
+    		new ExportExcel("核准阶段数据", EarlyStage.class, 1).setDataList(list).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			j.setSuccess(false);
+			j.setMsg( "导入模板下载失败!失败信息:"+e.getMessage());
+		}
+		return j;
+    }
+	
+
+}

+ 247 - 0
src/main/java/com/jeeplus/modules/filing/approvalStage/web/ProjectOverviewController.java

@@ -0,0 +1,247 @@
+package com.jeeplus.modules.filing.approvalStage.web;
+
+import com.google.common.collect.Lists;
+import com.jeeplus.common.json.AjaxJson;
+import com.jeeplus.common.utils.DateUtils;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.utils.excel.ExportExcel;
+import com.jeeplus.common.utils.excel.ImportExcel;
+import com.jeeplus.core.persistence.Page;
+import com.jeeplus.core.web.BaseController;
+import com.jeeplus.modules.filing.approvalStage.entity.ProjectOverview;
+import com.jeeplus.modules.filing.approvalStage.entity.StudyStage;
+import com.jeeplus.modules.filing.approvalStage.service.ProjectOverviewService;
+import org.apache.shiro.authz.annotation.Logical;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 项目概述Controller
+ * @author qy
+ * @version 2021-03-29
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/filing/projectOverview")
+public class ProjectOverviewController extends BaseController {
+
+	@Autowired
+	private ProjectOverviewService projectOverviewService;
+	
+	@ModelAttribute
+	public ProjectOverview get(@RequestParam(required=false) String id) {
+		ProjectOverview entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = projectOverviewService.get(id);
+		}
+		if (entity == null){
+			entity = new ProjectOverview();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 项目概述列表页面
+	 */
+	@RequiresPermissions("test:filing:projectOverview:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(ProjectOverview projectOverview, Model model) {
+		model.addAttribute("projectOverview", projectOverview);
+		return "modules/filing/projectOverview/projectOverviewList";
+	}
+	
+		/**
+	 * 项目概述列表数据
+	 */
+	@ResponseBody
+	@RequiresPermissions("test:filing:projectOverview:list")
+	@RequestMapping(value = "data")
+	public Map<String, Object> data(ProjectOverview projectOverview, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<ProjectOverview> page = projectOverviewService.findPage(new Page<ProjectOverview>(request, response,-1), projectOverview);
+		return getBootstrapData(page);
+	}
+
+	/**
+	 * 查看,增加,项目概述表单页面-父项目
+	 */
+	@RequiresPermissions(value={"test:filing:projectOverview:view","test:filing:projectOverview:add","test:filing:projectOverview:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(ProjectOverview projectOverview, Model model) {
+		model.addAttribute("projectOverview", projectOverview);
+		return "modules/filing/projectOverview/projectOverviewForm";
+	}
+
+	/**
+	 * 查看,增加,项目概述表单页面-子项目
+	 */
+	@RequiresPermissions(value={"test:filing:projectOverview:view","test:filing:projectOverview:add","test:filing:projectOverview:edit"},logical=Logical.OR)
+	@RequestMapping(value = "childForm")
+	public String childForm(ProjectOverview projectOverview, Model model) {
+		model.addAttribute("projectOverview", projectOverview);
+		return "modules/filing/projectOverview/studyStageChildForm";
+	}
+	
+	/**
+	 * 保存项目概述
+	 */
+	@ResponseBody
+	@RequiresPermissions(value={"test:filing:projectOverview:add","test:filing:projectOverview:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	public AjaxJson save(ProjectOverview projectOverview, Model model) throws Exception{
+		AjaxJson j = new AjaxJson();
+		/**
+		 * 后台hibernate-validation插件校验
+		 */
+		String errMsg = beanValidator(projectOverview);
+		if (StringUtils.isNotBlank(errMsg)){
+			j.setSuccess(false);
+			j.setMsg(errMsg);
+			return j;
+		}
+		//新增或编辑表单保存
+		projectOverviewService.save(projectOverview);//保存
+		j.setSuccess(true);
+		j.setMsg("保存项目概述成功");
+		return j;
+	}
+
+	/**
+	 * 保存项目概述
+	 */
+	@ResponseBody
+	@RequiresPermissions(value={"test:filing:projectOverview:add","test:filing:projectOverview:edit"},logical=Logical.OR)
+	@RequestMapping(value = "updateSave")
+	public AjaxJson updateSave(ProjectOverview projectOverview, Model model) throws Exception{
+		AjaxJson j = new AjaxJson();
+		/**
+		 * 后台hibernate-validation插件校验
+		 */
+		String errMsg = beanValidator(projectOverview);
+		if (StringUtils.isNotBlank(errMsg)){
+			j.setSuccess(false);
+			j.setMsg(errMsg);
+			return j;
+		}
+		//新增或编辑表单保存
+		projectOverviewService.save(projectOverview);//保存
+		j.setSuccess(true);
+		j.setMsg("保存项目概述成功");
+		return j;
+	}
+
+
+	/**
+	 * 删除项目概述
+	 */
+	@ResponseBody
+	@RequiresPermissions("test:filing:projectOverview:del")
+	@RequestMapping(value = "delete")
+	public AjaxJson delete(ProjectOverview projectOverview) {
+		AjaxJson j = new AjaxJson();
+		projectOverviewService.delete(projectOverview);
+		j.setMsg("删除项目概述成功");
+		return j;
+	}
+	
+	/**
+	 * 批量删除项目概述
+	 */
+	@ResponseBody
+	@RequiresPermissions("test:filing:projectOverview:del")
+	@RequestMapping(value = "deleteAll")
+	public AjaxJson deleteAll(String ids) {
+		AjaxJson j = new AjaxJson();
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			projectOverviewService.delete(projectOverviewService.get(id));
+		}
+		j.setMsg("删除项目概述成功");
+		return j;
+	}
+	
+	/**
+	 * 导出excel文件
+	 */
+	@ResponseBody
+	@RequiresPermissions("test:filing:projectOverview:export")
+    @RequestMapping(value = "export")
+    public AjaxJson exportFile(ProjectOverview projectOverview, HttpServletRequest request, HttpServletResponse response) {
+		AjaxJson j = new AjaxJson();
+		try {
+            String fileName = "项目概述"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            Page<ProjectOverview> page = projectOverviewService.findAllPage(new Page<ProjectOverview>(request, response, -1), projectOverview);
+    		new ExportExcel("项目概述", ProjectOverview.class).setDataList(page.getList()).write(response, fileName).dispose();
+    		j.setSuccess(true);
+    		j.setMsg("导出成功!");
+    		return j;
+		} catch (Exception e) {
+			j.setSuccess(false);
+			j.setMsg("导出项目概述记录失败!失败信息:"+e.getMessage());
+		}
+			return j;
+    }
+    
+    @ResponseBody
+    @RequestMapping(value = "detail")
+	public Map<String, Object> detail(ProjectOverview projectOverview, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<ProjectOverview> page = projectOverviewService.findChildPage(new Page<ProjectOverview>(request, response), projectOverview);
+		return getBootstrapData(page);
+	}
+	
+
+	/**
+	 * 导入Excel数据
+	 */
+	@ResponseBody
+	@RequiresPermissions("test:filing:projectOverview:import")
+    @RequestMapping(value = "import")
+   	public AjaxJson importFile(@RequestParam("file")MultipartFile file, HttpServletResponse response, HttpServletRequest request) {
+		AjaxJson j = new AjaxJson();
+		try {
+			ImportExcel ei = new ImportExcel(file, 1, 0);
+			List<ProjectOverview> list = ei.getDataList(ProjectOverview.class);
+			for (ProjectOverview projectOverview :
+					list) {
+				projectOverviewService.save(projectOverview);
+			}
+			j.setMsg( "已成功导入条项目概述记录");
+		} catch (Exception e) {
+			j.setSuccess(false);
+			j.setMsg("导入项目概述失败!失败信息:"+e.getMessage());
+		}
+		return j;
+    }
+	
+	/**
+	 * 下载导入项目概述模板
+	 */
+	@ResponseBody
+	@RequiresPermissions("test:filing:projectOverview:import")
+    @RequestMapping(value = "import/template")
+     public AjaxJson importFileTemplate(HttpServletResponse response) {
+		AjaxJson j = new AjaxJson();
+		try {
+            String fileName = "项目概述导入模板.xlsx";
+    		List<StudyStage> list = Lists.newArrayList();
+    		new ExportExcel("项目概述", ProjectOverview.class, 1).setDataList(list).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			j.setSuccess(false);
+			j.setMsg( "导入模板下载失败!失败信息:"+e.getMessage());
+		}
+		return j;
+    }
+	
+
+}

+ 249 - 0
src/main/java/com/jeeplus/modules/filing/approvalStage/web/StudyStageController.java

@@ -0,0 +1,249 @@
+package com.jeeplus.modules.filing.approvalStage.web;
+
+import com.google.common.collect.Lists;
+import com.jeeplus.common.json.AjaxJson;
+import com.jeeplus.common.utils.DateUtils;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.utils.excel.ExportExcel;
+import com.jeeplus.common.utils.excel.ImportExcel;
+import com.jeeplus.core.persistence.Page;
+import com.jeeplus.core.web.BaseController;
+import com.jeeplus.modules.filing.approvalStage.entity.ProjectOverview;
+import com.jeeplus.modules.filing.approvalStage.entity.StudyStage;
+import com.jeeplus.modules.filing.approvalStage.service.ProjectOverviewService;
+import com.jeeplus.modules.filing.approvalStage.service.ProjectOverviewService;
+import com.jeeplus.modules.filing.approvalStage.service.StudyStageService;
+import org.apache.shiro.authz.annotation.Logical;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 可研阶段Controller
+ * @author qy
+ * @version 2021-03-24
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/filing/studyStage")
+public class StudyStageController extends BaseController {
+
+	@Autowired
+	private StudyStageService studyStageService;
+	
+	@ModelAttribute
+	public StudyStage get(@RequestParam(required=false) String id) {
+		StudyStage entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = studyStageService.get(id);
+		}
+		if (entity == null){
+			entity = new StudyStage();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 可研阶段列表页面
+	 */
+	@RequiresPermissions("test:filing:studyStage:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(StudyStage studyStage, Model model) {
+		model.addAttribute("studyStage", studyStage);
+		return "modules/filing/studyStage/studyStageList";
+	}
+	
+		/**
+	 * 可研阶段列表数据
+	 */
+	@ResponseBody
+	@RequiresPermissions("test:filing:studyStage:list")
+	@RequestMapping(value = "data")
+	public Map<String, Object> data(StudyStage studyStage, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<StudyStage> page = studyStageService.findPage(new Page<StudyStage>(request, response,-1), studyStage);
+		return getBootstrapData(page);
+	}
+
+	/**
+	 * 查看,增加,可研阶段表单页面-父项目
+	 */
+	@RequiresPermissions(value={"test:filing:studyStage:view","test:filing:studyStage:add","test:filing:studyStage:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(StudyStage studyStage, Model model) {
+		model.addAttribute("studyStage", studyStage);
+		return "modules/filing/studyStage/studyStageForm";
+	}
+
+	/**
+	 * 查看,增加,可研阶段表单页面-子项目
+	 */
+	@RequiresPermissions(value={"test:filing:studyStage:view","test:filing:studyStage:add","test:filing:studyStage:edit"},logical=Logical.OR)
+	@RequestMapping(value = "childForm")
+	public String childForm(StudyStage studyStage, Model model) {
+		model.addAttribute("studyStage", studyStage);
+		return "modules/filing/studyStage/studyStageChildForm";
+	}
+	
+	/**
+	 * 保存可研阶段
+	 */
+	@ResponseBody
+	@RequiresPermissions(value={"test:filing:studyStage:add","test:filing:studyStage:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	public AjaxJson save(StudyStage studyStage, Model model) throws Exception{
+		AjaxJson j = new AjaxJson();
+		/**
+		 * 后台hibernate-validation插件校验
+		 */
+		String errMsg = beanValidator(studyStage);
+		if (StringUtils.isNotBlank(errMsg)){
+			j.setSuccess(false);
+			j.setMsg(errMsg);
+			return j;
+		}
+		//新增或编辑表单保存
+		studyStageService.save(studyStage);//保存
+		j.setSuccess(true);
+		j.setMsg("保存可研阶段成功");
+		return j;
+	}
+
+	/**
+	 * 保存可研阶段
+	 */
+	@ResponseBody
+	@RequiresPermissions(value={"test:filing:studyStage:add","test:filing:studyStage:edit"},logical=Logical.OR)
+	@RequestMapping(value = "updateSave")
+	public AjaxJson updateSave(StudyStage studyStage, Model model) throws Exception{
+		AjaxJson j = new AjaxJson();
+		/**
+		 * 后台hibernate-validation插件校验
+		 */
+		String errMsg = beanValidator(studyStage);
+		if (StringUtils.isNotBlank(errMsg)){
+			j.setSuccess(false);
+			j.setMsg(errMsg);
+			return j;
+		}
+		//新增或编辑表单保存
+		studyStageService.save(studyStage);//保存
+		j.setSuccess(true);
+		j.setMsg("保存可研阶段成功");
+		return j;
+	}
+
+
+	/**
+	 * 删除可研阶段
+	 */
+	@ResponseBody
+	@RequiresPermissions("test:filing:studyStage:del")
+	@RequestMapping(value = "delete")
+	public AjaxJson delete(StudyStage studyStage) {
+		AjaxJson j = new AjaxJson();
+		studyStageService.delete(studyStage);
+		j.setMsg("删除可研阶段成功");
+		return j;
+	}
+	
+	/**
+	 * 批量删除可研阶段
+	 */
+	@ResponseBody
+	@RequiresPermissions("test:filing:studyStage:del")
+	@RequestMapping(value = "deleteAll")
+	public AjaxJson deleteAll(String ids) {
+		AjaxJson j = new AjaxJson();
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			studyStageService.delete(studyStageService.get(id));
+		}
+		j.setMsg("删除可研阶段成功");
+		return j;
+	}
+	
+	/**
+	 * 导出excel文件
+	 */
+	@ResponseBody
+	@RequiresPermissions("test:filing:studyStage:export")
+    @RequestMapping(value = "export")
+    public AjaxJson exportFile(StudyStage studyStage, HttpServletRequest request, HttpServletResponse response) {
+		AjaxJson j = new AjaxJson();
+		try {
+            String fileName = "可研阶段"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            Page<StudyStage> page = studyStageService.findAllPage(new Page<StudyStage>(request, response, -1), studyStage);
+    		new ExportExcel("可研阶段", StudyStage.class).setDataList(page.getList()).write(response, fileName).dispose();
+    		j.setSuccess(true);
+    		j.setMsg("导出成功!");
+    		return j;
+		} catch (Exception e) {
+			j.setSuccess(false);
+			j.setMsg("导出可研阶段记录失败!失败信息:"+e.getMessage());
+		}
+			return j;
+    }
+    
+    @ResponseBody
+    @RequestMapping(value = "detail")
+	public Map<String, Object> detail(StudyStage studyStage, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<StudyStage> page = studyStageService.findChildPage(new Page<StudyStage>(request, response), studyStage);
+		return getBootstrapData(page);
+	}
+	
+
+	/**
+	 * 导入Excel数据
+	 */
+	@ResponseBody
+	@RequiresPermissions("test:filing:studyStage:import")
+    @RequestMapping(value = "import")
+   	public AjaxJson importFile(@RequestParam("file")MultipartFile file, HttpServletResponse response, HttpServletRequest request) {
+		AjaxJson j = new AjaxJson();
+		try {
+			ImportExcel ei = new ImportExcel(file, 1, 0);
+			List<StudyStage> list = ei.getDataList(StudyStage.class);
+			for (StudyStage studyStage :
+					list) {
+				studyStageService.save(studyStage);
+			}
+			j.setMsg( "已成功导入条可研阶段记录");
+		} catch (Exception e) {
+			j.setSuccess(false);
+			j.setMsg("导入可研阶段失败!失败信息:"+e.getMessage());
+		}
+		return j;
+    }
+	
+	/**
+	 * 下载导入可研阶段数据模板
+	 */
+	@ResponseBody
+	@RequiresPermissions("test:filing:studyStage:import")
+    @RequestMapping(value = "import/template")
+     public AjaxJson importFileTemplate(HttpServletResponse response) {
+		AjaxJson j = new AjaxJson();
+		try {
+            String fileName = "可研阶段数据导入模板.xlsx";
+    		List<StudyStage> list = Lists.newArrayList();
+    		new ExportExcel("可研阶段数据", StudyStage.class, 1).setDataList(list).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			j.setSuccess(false);
+			j.setMsg( "导入模板下载失败!失败信息:"+e.getMessage());
+		}
+		return j;
+    }
+	
+
+}

+ 9 - 0
src/main/java/com/jeeplus/modules/filing/basicInformation/mapper/BasicInformationMapper.java

@@ -53,4 +53,13 @@ public interface BasicInformationMapper extends BaseMapper<BasicInformation> {
      * 父类修改项目编码后字类自动更新对应父级id
      * */
     void updateChildParent(BasicInformationChild basicInformationChild);
+
+    List<BasicInformation> findChildByCode(String projectCode);
+
+    /**
+     * 查询所有父级集合的id
+     * */
+    List<String> findALlId();
+
+
 }

+ 12 - 0
src/main/java/com/jeeplus/modules/filing/basicInformation/mapper/xml/BasicInformationMapper.xml

@@ -272,5 +272,17 @@
         FROM filing_basic_information
         where projectCode = #{projectCode}
     </select>
+    <select id="findChildByCode"
+            resultType="com.jeeplus.modules.filing.basicInformation.entity.BasicInformation">
+    select id
+    from filing_basic_information
+    where parentId = #{projectCode}
+    </select>
+    <select id="findALlId" resultType="java.lang.String">
+        select id
+        from filing_basic_information
+        where parentId = '0'
+    </select>
+
 
 </mapper>

+ 4 - 0
src/main/java/com/jeeplus/modules/filing/basicInformation/service/BasicInformationService.java

@@ -182,4 +182,8 @@ public class BasicInformationService extends CrudService<BasicInformationMapper,
 			mapper.update(entity);
 		}
 	}
+
+	public List<String> findAllId() {
+		return mapper.findALlId();
+	}
 }

+ 45 - 0
src/main/java/com/jeeplus/modules/filing/filingImages/entity/FilingImages.java

@@ -0,0 +1,45 @@
+package com.jeeplus.modules.filing.filingImages.entity;
+
+import com.jeeplus.core.persistence.DataEntity;
+
+/**
+ * 图片管理
+ * */
+public class FilingImages extends DataEntity<FilingImages> {
+    /**
+     * 文件用途
+     * */
+    private String purpose;
+    /**
+     * 项目编号
+     * */
+    private String projectCode;
+    /**
+     * 上传地址
+     * */
+    private String imgPath;
+
+    public String getPurpose() {
+        return purpose;
+    }
+
+    public void setPurpose(String purpose) {
+        this.purpose = purpose;
+    }
+
+    public String getProjectCode() {
+        return projectCode;
+    }
+
+    public void setProjectCode(String projectCode) {
+        this.projectCode = projectCode;
+    }
+
+    public String getImgPath() {
+        return imgPath;
+    }
+
+    public void setImgPath(String imgPath) {
+        this.imgPath = imgPath;
+    }
+}

+ 26 - 0
src/main/java/com/jeeplus/modules/filing/filingImages/mapper/FilingImagesMapper.java

@@ -0,0 +1,26 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.filing.filingImages.mapper;
+
+import com.jeeplus.core.persistence.BaseMapper;
+import com.jeeplus.core.persistence.annotation.MyBatisMapper;
+import com.jeeplus.modules.filing.approvalStage.entity.ApprovalStage;
+import com.jeeplus.modules.filing.filingImages.entity.FilingImages;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 图片管理MAPPER接口
+ * @author qy
+ * @version 2021-03-25
+ */
+@MyBatisMapper
+public interface FilingImagesMapper extends BaseMapper<FilingImages> {
+    List<FilingImages> findByProjectId(String id);
+
+    List<String> findAllPurpose(String projectCode);
+
+    List<FilingImages> findAllUpload(@Param("projectCode") String projectCode, @Param("purpose") String purpose);
+}

+ 162 - 0
src/main/java/com/jeeplus/modules/filing/filingImages/mapper/xml/FilingImagesMapper.xml

@@ -0,0 +1,162 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jeeplus.modules.filing.filingImages.mapper.FilingImagesMapper">
+
+    <sql id="basicColumns">
+        a.id AS "id",
+		a.create_by AS "createBy.id",
+		a.create_date AS "createDate",
+		a.update_by AS "updateBy.id",
+		a.update_date AS "updateDate",
+		a.remarks AS "remarks",
+		a.del_flag AS "delFlag",
+		a.purpose AS "purpose",
+		a.projectCode AS "projectCode",
+		a.imgPath AS "imgPath"
+    </sql>
+
+    <sql id="basicOneColumns">
+        a.id AS "id",
+		a.create_by AS "createBy.id",
+		a.create_date AS "createDate",
+		a.update_by AS "updateBy.id",
+		a.update_date AS "updateDate",
+		a.remarks AS "remarks",
+		a.del_flag AS "delFlag",
+		a.parentId AS "parentId",
+		a.projectCode AS "projectCode",
+		a.monomerCode AS "monomerCode",
+		a.entryName AS "entryName",
+		a.emphasis AS "emphasis"
+    </sql>
+
+    <sql id="testBasicJoins">
+        LEFT JOIN filing_basic_year b ON a.projectCode = b.projectCode
+    </sql>
+
+
+
+    <select id="get" resultType="FilingImages">
+        SELECT
+        <include refid="basicColumns"/>
+        FROM filing_upload_images a
+        WHERE a.id = #{id}
+    </select>
+    
+    <select id="findByProjectId" resultType="com.jeeplus.modules.filing.filingImages.entity.FilingImages">
+        select
+        <include refid="basicColumns"/>
+        from filing_upload_images a
+        where a.projectCode =
+        (select projectCode from filing_basic_information b where b.id = #{id})
+    </select>
+
+    <select id="findList" resultType="FilingImages">
+        SELECT
+        <include refid="basicColumns"/>
+        FROM filing_upload_images a
+        <where>
+            a.del_flag = #{DEL_FLAG_NORMAL}
+            ${dataScope}
+            <if test="projectCode != null  and projectCode != ''">
+                and a.projectCode = #{projectCode}
+            </if>
+            <if test="purpose != null  and purpose != ''">
+                and a.purpose = #{purpose}
+            </if>
+        </where>
+        ORDER BY a.update_date DESC
+    </select>
+
+    <select id="findAllList" resultType="FilingImages">
+        SELECT
+        <include refid="basicColumns"/>
+        FROM filing_basic_information a
+        <where>
+            a.del_flag = #{DEL_FLAG_NORMAL}
+            ${dataScope}
+        </where>
+        <choose>
+            <when test="page !=null and page.orderBy != null and page.orderBy != ''">
+                ORDER BY ${page.orderBy}
+            </when>
+            <otherwise>
+                ORDER BY a.update_date DESC
+            </otherwise>
+        </choose>
+    </select>
+
+    <insert id="insert">
+        INSERT INTO filing_upload_images(id,
+                                         create_by,
+                                         create_date,
+                                         update_by,
+                                         update_date,
+                                         remarks,
+                                         del_flag,
+                                         purpose,
+                                         projectCode,
+                                         imgPath)
+        VALUES (#{id},
+                #{createBy.id},
+                #{createDate},
+                #{updateBy.id},
+                #{updateDate},
+                #{remarks},
+                #{delFlag},
+                #{purpose},
+                #{projectCode},
+                #{imgPath})
+    </insert>
+
+
+    <update id="update">
+        UPDATE filing_upload_images
+        SET create_date = #{createDate},
+            update_by   = #{updateBy.id},
+            update_date = #{updateDate},
+            remarks     = #{remarks},
+            purpose = #{purpose},
+            projectCode = #{projectCode},
+            imgPath = #{imgPath}
+        WHERE id = #{id}
+    </update>
+
+
+    <!--物理删除-->
+    <update id="delete">
+        DELETE
+        FROM filing_upload_images
+        WHERE id = #{id}
+    </update>
+
+
+    <!--逻辑删除-->
+    <update id="deleteByLogic">
+        UPDATE filing_upload_images
+        SET del_flag = #{DEL_FLAG_DELETE}
+        WHERE id = #{id}
+    </update>
+
+    <!-- 根据实体名称和字段名称和字段值获取唯一记录 -->
+    <select id="findUniqueByProperty" resultType="FilingImages" statementType="STATEMENT">
+        select *
+        FROM filing_basic_information
+        where ${propertyName} = '${value}'
+    </select>
+    <select id="findAllPurpose" resultType="java.lang.String">
+        select
+        a.purpose
+        from filing_upload_images a
+        where a.projectCode = #{projectCode}
+        GROUP BY purpose
+    </select>
+    <select id="findAllUpload" resultType="com.jeeplus.modules.filing.filingImages.entity.FilingImages">
+        select
+        <include refid="basicColumns"/>
+        from filing_upload_images a
+        where projectCode = #{projectCode}
+        and purpose = #{purpose}
+    </select>
+
+</mapper>

+ 449 - 0
src/main/java/com/jeeplus/modules/filing/filingImages/service/FilingImagesService.java

@@ -0,0 +1,449 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.filing.filingImages.service;
+
+import com.google.common.collect.Lists;
+import com.jeeplus.common.config.Global;
+import com.jeeplus.core.persistence.Page;
+import com.jeeplus.core.service.CrudService;
+import com.jeeplus.core.web.Servlets;
+import com.jeeplus.modules.filing.approvalStage.entity.ApprovalStage;
+import com.jeeplus.modules.filing.approvalStage.entity.EarlyStage;
+import com.jeeplus.modules.filing.approvalStage.entity.StudyStage;
+import com.jeeplus.modules.filing.approvalStage.mapper.ApprovalStageMapper;
+import com.jeeplus.modules.filing.approvalStage.mapper.EarlyStageMapper;
+import com.jeeplus.modules.filing.approvalStage.mapper.StudyStageMapper;
+import com.jeeplus.modules.filing.basicInformation.entity.BasicInformation;
+import com.jeeplus.modules.filing.basicInformation.mapper.BasicInformationMapper;
+import com.jeeplus.modules.filing.filingImages.entity.FilingImages;
+import com.jeeplus.modules.filing.filingImages.mapper.FilingImagesMapper;
+import com.jeeplus.modules.filing.filingImages.utils.ZipCompressUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 图片管理Service
+ *
+ * @author qy
+ * @version 2021-03-25
+ */
+@Service
+@Transactional(readOnly = true)
+public class FilingImagesService extends CrudService<FilingImagesMapper, FilingImages> {
+
+    @Autowired
+    private BasicInformationMapper basicInformationMapper;
+
+
+    @Autowired
+    private ApprovalStageMapper approvalStageMapper;
+
+
+    @Autowired
+    private EarlyStageMapper earlyStageMapper;
+
+    @Autowired
+    private StudyStageMapper studyStageMapper;
+
+    public List<FilingImages> findByProjectId(String id) {
+        return mapper.findByProjectId(id);
+    }
+
+
+
+    /**
+     * 通过项目id导出项目的核准附件
+     *
+     * @param idList
+     */
+    public String exportApproved(List<String> idList) throws Exception {
+        //设置下载的压缩包名(固定字符+时间戳)
+        long timeMillis = System.currentTimeMillis();
+        String fileLocality = "项目附件_" + timeMillis;
+        //判定当前系统
+        String path = Global.getAttachmentDir2();
+        path = path + "/" + fileLocality;
+        //检查该路径对应的目录是否存在. 如果不存在则创建目录
+        File dir = new File(path);
+        if (!dir.exists()) {
+            dir.mkdirs();
+        }
+        //通过id查询出所有的项目信息
+        List<ApprovalStage> byIdList = approvalStageMapper.findByIdList(idList);
+        //循环遍历,判断项目是否存在
+        for (ApprovalStage a :
+                byIdList) {
+            File dirFile = null;
+            List<FilingImages> filingImagesList = null;
+            List<FilingImages> exportList = new ArrayList<>();
+            String downloadPath = path + "/" + a.getProjectCode();
+            String approvedAnnex = a.getApprovedAnnex();
+            if (null!=approvedAnnex && !"".equals(approvedAnnex)) {
+                dirFile = new File(downloadPath + "/核准阶段");
+                if (approvedAnnex.contains("|")) {
+                    String[] split = approvedAnnex.split("\\|");
+                    for (int i = 0; i < split.length; i++) {
+                        FilingImages filingImages = new FilingImages();
+                        filingImages.setImgPath(split[i]);
+                        filingImages.setProjectCode(a.getProjectCode());
+                        filingImages.setPurpose("核准附件");
+                        exportList.add(filingImages);
+                    }
+                } else {
+                    FilingImages filingImages = new FilingImages();
+                    filingImages.setImgPath(approvedAnnex);
+                    filingImages.setProjectCode(a.getProjectCode());
+                    filingImages.setPurpose("核准附件");
+                    exportList.add(filingImages);
+                }
+                if (exportList.size() > 0) {
+                    this.disposeFileList(exportList, dirFile.getPath());
+                }
+            }
+        }
+        //处理完之后进行打包压缩并删除之前的文件
+        ZipCompressUtil zipUtil = new ZipCompressUtil();
+        File resultFile = new File(path);
+        File file = zipUtil.zipCompress(resultFile, true);
+        return file.getPath();
+    }
+
+
+    /**
+     * 项目相应文件批量下载并压缩
+     *
+     * @param idList
+     */
+    public String exportStudy(List<String> idList) throws Exception {
+        //设置下载的压缩包名(固定字符+时间戳)
+        long timeMillis = System.currentTimeMillis();
+        String fileLocality = "项目附件_" + timeMillis;
+        //判定当前系统
+        String path = Global.getAttachmentDir2();
+        path = path + "/" + fileLocality;
+        //检查该路径对应的目录是否存在. 如果不存在则创建目录
+        File dir = new File(path);
+        if (!dir.exists()) {
+            dir.mkdirs();
+        }
+
+        List<StudyStage> allList = new ArrayList<>();
+        //通过id查询出所有的项目信息
+        List<StudyStage> byIdList = studyStageMapper.findAllStudy(idList);
+
+        for (StudyStage a :
+                byIdList) {
+            allList.add(a);
+            List<StudyStage> childList = studyStageMapper.findChildList(a);
+            if (childList.size() > 0) {
+                for (StudyStage b :
+                        childList) {
+                    allList.add(b);
+                }
+            }
+        }
+
+        //循环遍历,判断项目是否存在
+        for (StudyStage a :
+                allList) {
+            File dirFile = null;
+            List<FilingImages> filingImagesList = null;
+            List<FilingImages> exportList = new ArrayList<>();
+            String downloadPath = path + "/" + a.getProjectCode();
+            String studyAppendix = a.getStudyAppendix();
+            if (null!=studyAppendix && !"".equals(studyAppendix)) {
+                dirFile = new File(downloadPath + "/可研阶段");
+                if (studyAppendix.contains("|")) {
+                    String[] split = studyAppendix.split("\\|");
+                    for (int i = 0; i < split.length; i++) {
+                        FilingImages filingImages = new FilingImages();
+                        filingImages.setImgPath(split[i]);
+                        filingImages.setProjectCode(a.getProjectCode());
+                        filingImages.setPurpose("可研附件");
+                        exportList.add(filingImages);
+                    }
+                } else {
+                    FilingImages filingImages = new FilingImages();
+                    filingImages.setImgPath(studyAppendix);
+                    filingImages.setProjectCode(a.getProjectCode());
+                    filingImages.setPurpose("可研附件");
+                    exportList.add(filingImages);
+                }
+                if (exportList.size() > 0) {
+                    this.disposeFileList(exportList, dirFile.getPath());
+                }
+            }
+        }
+        //处理完之后进行打包压缩并删除之前的文件
+        ZipCompressUtil zipUtil = new ZipCompressUtil();
+        File resultFile = new File(path);
+        File file = zipUtil.zipCompress(resultFile, true);
+        return file.getPath();
+    }
+
+
+    /**
+     * 项目相应文件批量下载并压缩
+     *
+     * @param idList
+     */
+    public String exportStudyStage(List<String> idList,String purpose) throws Exception {
+        //设置下载的压缩包名(固定字符+时间戳)
+        long timeMillis = System.currentTimeMillis();
+        String fileLocality = "项目附件_" + timeMillis;
+        //判定当前系统
+        String path = Global.getAttachmentDir2();
+        path = path + "/" + fileLocality;
+        //检查该路径对应的目录是否存在. 如果不存在则创建目录
+        File dir = new File(path);
+        if (!dir.exists()) {
+            dir.mkdirs();
+        }
+        List<String> allIdList = new ArrayList<>();
+        //通过id查询出
+        //通过id查询出所有有关联的id
+        for (String projectId : idList) {
+            allIdList.add(projectId);
+            BasicInformation one = basicInformationMapper.findOne(projectId);
+            List<BasicInformation> childByCode = null;
+            try {
+                childByCode = basicInformationMapper.findChildByCode(one.getProjectCode());
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            for (BasicInformation b :
+                    childByCode) {
+                allIdList.add(b.getId());
+            }
+        }
+
+        //遍历项目id并查询对应数据信息
+        for (String projectId : allIdList) {
+            //通过id查询项目信息
+            BasicInformation one = basicInformationMapper.findOne(projectId);
+            String projectCode = one.getProjectCode();
+            //通过项目信息获取附件信息
+            List<String> byCode = mapper.findAllPurpose(projectCode);
+            File dirFile = null;
+            List<FilingImages> filingImagesList = null;
+            List<FilingImages> exportList = new ArrayList<>();
+            String downloadPath = path + "/" + one.getProjectCode();
+            for (String a :
+                    byCode) {
+                switch (a) {
+                    case "核准附件":
+                        dirFile = new File(downloadPath + "/核准阶段");
+                        filingImagesList = Lists.newArrayList();
+                        filingImagesList = mapper.findAllUpload(one.getProjectCode(), a);
+                        for (FilingImages filing :
+                                filingImagesList) {
+                            if (filing.getImgPath().contains("|")) {
+                                String[] split = filing.getImgPath().split("\\|");
+                                for (int i = 0; i < split.length; i++) {
+                                    FilingImages filingImages = new FilingImages();
+                                    filingImages.setImgPath(split[i]);
+                                    filingImages.setProjectCode(filing.getProjectCode());
+                                    filingImages.setPurpose(filing.getPurpose());
+                                    exportList.add(filingImages);
+                                }
+
+                            } else {
+                                exportList.add(filing);
+                            }
+                        }
+                        this.disposeFileList(exportList, dirFile.getPath());
+                        break;
+                    case "可研附件":
+                        dirFile = new File(downloadPath + "/可研阶段");
+                        filingImagesList = Lists.newArrayList();
+                        filingImagesList = mapper.findAllUpload(one.getProjectCode(), a);
+                        for (FilingImages filing :
+                                filingImagesList) {
+                            if (filing.getImgPath().contains("|")) {
+                                String[] split = filing.getImgPath().split("\\|");
+                                for (int i = 0; i < split.length; i++) {
+                                    FilingImages filingImages = new FilingImages();
+                                    filingImages.setImgPath(split[i]);
+                                    filingImages.setProjectCode(filing.getProjectCode());
+                                    filingImages.setPurpose(filing.getPurpose());
+                                    exportList.add(filingImages);
+                                }
+
+                            } else {
+                                exportList.add(filing);
+                            }
+                        }
+                        this.disposeFileList(exportList, dirFile.getPath());
+                        break;
+                    case "初设附件":
+                        dirFile = new File(downloadPath + "/初设阶段");
+                        break;
+                }
+            }
+
+        }
+        //处理完之后进行打包压缩并删除之前的文件
+        ZipCompressUtil zipUtil = new ZipCompressUtil();
+        File resultFile = new File(path);
+        File file = zipUtil.zipCompress(resultFile, true);
+        return file.getPath();
+    }
+
+
+    /**
+     * 处理文件信息
+     *
+     * @param downloadPath
+     */
+    public void disposeFileList(List<FilingImages> filingImages, String downloadPath) throws IOException {
+        ZipCompressUtil zipCompressUtil = new ZipCompressUtil();
+        for (FilingImages info : filingImages) {
+            zipCompressUtil.downloadRuralProject(info.getImgPath().substring(0, info.getImgPath().lastIndexOf("/")), info.getImgPath().substring(info.getImgPath().lastIndexOf("/") + 1, info.getImgPath().length()), downloadPath);
+        }
+    }
+
+    /**
+     * 下载压缩文件
+     *
+     * @param filePath
+     * @param response
+     */
+    public void downloadZipFile(String filePath, HttpServletResponse response) {
+        File file = new File(filePath);
+        // 取得文件名。
+        String fileName = file.getName();
+        InputStream in = null;
+        try {
+            fileName = URLEncoder.encode(fileName, "UTF8");
+            in = new FileInputStream(file);
+            response.reset();//重置 响应头
+            response.setCharacterEncoding("UTF-8");
+            response.setContentType("application/x-download");
+            response.setHeader("Content-disposition", "attachment; filename=" + fileName);
+
+            byte[] b = new byte[1024];
+            int len;
+            while ((len = in.read(b)) > 0) {
+                response.getOutputStream().write(b, 0, len);
+            }
+            in.close();
+            response.getOutputStream().close();
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        } finally {
+            //路径是个文件且不为空时删除文件
+            if (file.isFile() && file.exists()) {
+                file.delete();
+            }
+        }
+    }
+
+
+    /**
+     * 通过项目id导出项目的核准附件
+     *
+     * @param idList
+     */
+    public String exportEarlyStage(List<String> idList) throws Exception {
+        //设置下载的压缩包名(固定字符+时间戳)
+        long timeMillis = System.currentTimeMillis();
+        String fileLocality = "项目附件_" + timeMillis;
+        //判定当前系统
+        String path = Global.getAttachmentDir2();
+        path = path + "/" + fileLocality;
+        //检查该路径对应的目录是否存在. 如果不存在则创建目录
+        File dir = new File(path);
+        if (!dir.exists()) {
+            dir.mkdirs();
+        }
+
+        List<EarlyStage> allList = new ArrayList<>();
+        //通过id查询出所有的项目信息
+        List<EarlyStage> byIdList = earlyStageMapper.findAllStudy(idList);
+
+        for (EarlyStage a :
+                byIdList) {
+            allList.add(a);
+            List<EarlyStage> childList = earlyStageMapper.findChildList(a);
+            if (childList.size() > 0) {
+                for (EarlyStage b :
+                        childList) {
+                    allList.add(b);
+                }
+            }
+        }
+        //循环遍历,判断项目是否存在
+        for (EarlyStage a :
+                allList) {
+            File dirFile = null;
+            File dirFile2 = null;
+            List<FilingImages> filingImagesList = null;
+            List<FilingImages> exportList = new ArrayList<>();
+            List<FilingImages> exportList2 = new ArrayList<>();
+            String downloadPath = path + "/" + a.getProjectCode();
+            String approvedAnnex = a.getApprovedAnnex();
+            if (null!=approvedAnnex && !"".equals(approvedAnnex)) {
+                dirFile = new File(downloadPath + "/核准阶段");
+                if (approvedAnnex.contains("|")) {
+                    String[] split = approvedAnnex.split("\\|");
+                    for (int i = 0; i < split.length; i++) {
+                        FilingImages filingImages = new FilingImages();
+                        filingImages.setImgPath(split[i]);
+                        filingImages.setProjectCode(a.getProjectCode());
+                        filingImages.setPurpose("核准附件");
+                        exportList.add(filingImages);
+                    }
+                } else {
+                    FilingImages filingImages = new FilingImages();
+                    filingImages.setImgPath(approvedAnnex);
+                    filingImages.setProjectCode(a.getProjectCode());
+                    filingImages.setPurpose("核准附件");
+                    exportList.add(filingImages);
+                }
+            }
+            String studyAppendix = a.getStudyAppendix();
+            if (null!=studyAppendix && !"".equals(studyAppendix)) {
+                dirFile2 = new File(downloadPath + "/可研阶段");
+                if (studyAppendix.contains("|")) {
+                    String[] split = studyAppendix.split("\\|");
+                    for (int i = 0; i < split.length; i++) {
+                        FilingImages filingImages = new FilingImages();
+                        filingImages.setImgPath(split[i]);
+                        filingImages.setProjectCode(a.getProjectCode());
+                        filingImages.setPurpose("核准附件");
+                        exportList2.add(filingImages);
+                    }
+                } else {
+                    FilingImages filingImages = new FilingImages();
+                    filingImages.setImgPath(studyAppendix);
+                    filingImages.setProjectCode(a.getProjectCode());
+                    filingImages.setPurpose("可研附件");
+                    exportList2.add(filingImages);
+                }
+            }
+            if (exportList.size() > 0) {
+                this.disposeFileList(exportList, dirFile.getPath());
+            }
+            if (exportList2.size() > 0) {
+                this.disposeFileList(exportList2, dirFile2.getPath());
+            }
+        }
+        //处理完之后进行打包压缩并删除之前的文件
+        ZipCompressUtil zipUtil = new ZipCompressUtil();
+        File resultFile = new File(path);
+        File file = zipUtil.zipCompress(resultFile, true);
+        return file.getPath();
+    }
+
+}

+ 19 - 0
src/main/java/com/jeeplus/modules/filing/filingImages/utils/DownloadZIP.java

@@ -0,0 +1,19 @@
+package com.jeeplus.modules.filing.filingImages.utils;
+
+import org.activiti.editor.language.json.converter.util.CollectionUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.*;
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.tools.zip.ZipEntry;
+import org.apache.tools.zip.ZipFile;
+import org.apache.tools.zip.ZipOutputStream;
+
+
+public class DownloadZIP {
+
+}

+ 221 - 0
src/main/java/com/jeeplus/modules/filing/filingImages/utils/ZipCompressUtil.java

@@ -0,0 +1,221 @@
+package com.jeeplus.modules.filing.filingImages.utils;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import org.apache.commons.fileupload.util.Streams;
+import org.apache.tools.zip.ZipEntry;
+import org.apache.tools.zip.ZipOutputStream;
+/**
+ *
+ * 文件压缩成zip
+ *
+ */
+public class ZipCompressUtil {
+
+    /**
+     *
+     * 将文件夹及文件夹包含的内容压缩成zip文件
+     * (为了解决中文乱码的问题,ZipOutputStream用org.apache.tools.zip.*)
+     *
+     * @param inputFile 源文件
+     * @param delFlag 删除源文件标记
+     * @return File 压缩后的文件
+     */
+    public File zipCompress(File inputFile, boolean delFlag) throws Exception{
+        File zipFile = null;
+        //创建zip输出流
+        //为了解决中文乱码的问题,ZipOutputStream用org.apache.tools.zip.*
+        //不要用 java.util.zip.*
+        ZipOutputStream zos = null;
+        if(inputFile != null && inputFile.exists()) {
+            try {
+                String path = inputFile.getCanonicalPath();
+                String zipFileName = path + ".zip";
+                zipFile = new File(zipFileName);
+                if(zipFile.exists()) {
+                    zipFile.delete();
+                }
+                zipFile.createNewFile();//创建文件
+                zos = new ZipOutputStream(new FileOutputStream(zipFile));
+                //解决中文乱码问题,指定编码GBK
+                zos.setEncoding("GBK");
+                //压缩文件或文件夹
+                this.compressFile(zos, inputFile, inputFile.getName());
+            }catch(Exception e) {
+                System.out.println("文件压缩异常:" + e);
+                throw e;
+            }finally {
+                try {
+                    if(zos != null) {
+                        //先调用outputStream的flush()再关闭流;
+                        //流如果未正常关闭,则会在解压的时候出现压缩文件损坏的现象
+                        zos.flush();
+                        zos.close();
+                    }
+
+                    if(delFlag) {
+                        //递归删除源文件及源文件夹
+                        this.deleteFile(inputFile);
+                    }
+                }catch(Exception ex) {
+                    System.out.println("输出流关闭异常:" + ex);
+                }
+            }
+        }
+
+        return zipFile;
+    }
+
+    /**
+     * 压缩文件或文件夹
+     * (ZipEntry 使用org.apache.tools.zip.*,不要用 java.util.zip.*)
+     *
+     * @param zos zip输出流
+     * @param sourceFile 源文件
+     * @param baseName 父路径
+     * @throws Exception 异常
+     */
+    private void compressFile(ZipOutputStream zos, File sourceFile, String baseName) throws Exception{
+        if(!sourceFile.exists()) {
+            return;
+        }
+
+        //若路径为目录(文件夹)
+        if(sourceFile.isDirectory()) {
+            //取出文件夹中的文件(或子文件夹)
+            File[] fileList = sourceFile.listFiles();
+            //若文件夹为空,则创建一个目录进入点
+            if(fileList.length == 0) {
+                //文件名称后跟File.separator表示这是一个文件夹
+                zos.putNextEntry(new ZipEntry(baseName + File.separator));
+                //若文件夹非空,则递归调用compressFile,对文件夹中的每个文件或每个文件夹进行压缩
+            }else {
+                for(int i = 0; i < fileList.length; i++) {
+                    this.compressFile(zos, fileList[i],
+                            baseName + File.separator + fileList[i].getName());
+                }
+            }
+
+            //若为文件,则先创建目录进入点,再将文件写入zip文件中
+        }else {
+            ZipEntry ze = new ZipEntry(baseName);
+            //设置ZipEntry的最后修改时间为源文件的最后修改时间
+            ze.setTime(sourceFile.lastModified());
+            zos.putNextEntry(ze);
+
+            FileInputStream fis = new FileInputStream(sourceFile);
+            this.copyStream(fis, zos);
+            try {
+                if(fis != null) {
+                    fis.close();
+                }
+            }catch(Exception e) {
+                System.out.println("输入流关闭异常:" + e);
+            }
+        }
+    }
+
+    /**
+     * 流拷贝
+     *
+     * @param in 输入流
+     * @param out 输出流
+     * @throws IOException
+     */
+    private void copyStream(InputStream in, OutputStream out) throws IOException{
+        int bufferLength = 1024 * 100;
+        synchronized(in) {
+            synchronized(out) {
+                int count = 0;
+                byte[] buffer = new byte[bufferLength];
+                while((count = in.read(buffer, 0, bufferLength)) != -1) {
+                    out.write(buffer, 0, count);
+                }
+                out.flush();
+            }
+        }
+    }
+
+    /**
+     * 递归删除文件夹中的目录及文件
+     *
+     * @param sourceFile
+     * @throws Exception
+     */
+    private void deleteFile(File sourceFile) throws Exception{
+        //如果路径为目录
+        if(sourceFile.isDirectory()) {
+            //取出文件夹中的文件或子文件夹
+            File[] fList = sourceFile.listFiles();
+            if(fList.length == 0) {
+                sourceFile.delete();
+            }else {
+                for(int i = 0; i < fList.length; i++) {
+                    this.deleteFile(fList[i]);
+                }
+                sourceFile.delete();
+            }
+            //如果为文件则直接删除
+        }else {
+            sourceFile.delete();
+        }
+    }
+
+    /**
+     *     当前路径下若已有同名文件又不愿意覆盖,
+     *     则依次追加后缀
+     *
+     * @param path
+     * @param docName
+     * @return
+     * @throws Exception
+     */
+    private File createFile(String path, final String docName) throws Exception{
+        //创建目标文件
+        File destFile = new File(path, docName);
+        //如果路径下存在同名文件又不愿意覆盖,
+        //那么则依次给文件加后缀(2)、(3)……
+        if(destFile.exists()) {
+            int i = 1;
+            do {
+                ++i;
+                //按“.”分割
+                String[] doc = docName.split("\\.");
+                destFile = new File(path, doc[0] + "(" + i + ")" + "." + doc[1]);
+
+                //直到文件创建成功则跳出循环
+            }while(!destFile.createNewFile());
+        }else {
+            destFile.createNewFile();
+        }
+        return destFile;
+    }
+
+
+    /**
+     * 下载文件
+     * @return              字节数组
+     */
+    public byte[] downloadRuralProject(String path, String downloadFile,String downLoadFilePath) throws IOException {
+        File dirFile = new File(downLoadFilePath);
+        if (!dirFile.exists()) {
+            dirFile.mkdirs();
+        }
+        String wPath = path+"/"+downloadFile;
+        File fileurl = new File(wPath);
+        //将文件读入文件流
+        InputStream inStream = new FileInputStream(fileurl);
+
+        File file = new File(downLoadFilePath,downloadFile);
+        //将下载保存到文件。
+        FileOutputStream out = new FileOutputStream(file);
+        Streams.copy(inStream, out, true);
+        return null;
+    }
+}
+

+ 153 - 0
src/main/java/com/jeeplus/modules/filing/filingImages/web/FilingImagesController.java

@@ -0,0 +1,153 @@
+package com.jeeplus.modules.filing.filingImages.web;
+
+import com.google.common.collect.Lists;
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.json.AjaxJson;
+import com.jeeplus.common.utils.DateUtils;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.utils.excel.ExportExcel;
+import com.jeeplus.common.utils.excel.ImportExcel;
+import com.jeeplus.core.persistence.Page;
+import com.jeeplus.core.web.BaseController;
+import com.jeeplus.modules.filing.basicInformation.service.BasicInformationService;
+import com.jeeplus.modules.filing.filingImages.entity.FilingImages;
+import com.jeeplus.modules.filing.filingImages.service.FilingImagesService;
+import com.jeeplus.modules.filing.filingImages.utils.ZipCompressUtil;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 图片管理Controller
+ * @author qy
+ * @version 2021-03-25
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/filing/filingImages")
+public class FilingImagesController extends BaseController {
+
+	@Autowired
+	private FilingImagesService filingImagesService;
+
+	@Autowired
+	private BasicInformationService basicInformationService;
+
+	@ModelAttribute
+	public FilingImages get(@RequestParam(required=false) String id) {
+		FilingImages entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = filingImagesService.get(id);
+		}
+		if (entity == null){
+			entity = new FilingImages();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 核准阶段列表页面
+	 */
+	@RequestMapping(value = {"list", ""})
+	public String list(FilingImages filingImages, Model model) {
+		model.addAttribute("filingImages", filingImages);
+		return "modules/filing/filingImages/filingImages";
+	}
+	
+		/**
+	 * 核准阶段列表数据
+	 */
+	@ResponseBody
+	@RequestMapping(value = "data")
+	public Map<String, Object> data(FilingImages filingImages, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<FilingImages> page = filingImagesService.findPage(new Page<FilingImages>(request, response,-1), filingImages);
+		if (Global.SYS_TYPE.equals("2")) {
+			List<FilingImages> list = page.getList();
+			for (FilingImages upload:
+					list) {
+				upload.setImgPath("http://" + request.getServerName()  +upload.getImgPath());
+			}
+		}
+		return getBootstrapData(page);
+	}
+
+	/**
+	 * 项目相应文件批量下载并压缩
+	 */
+	@RequestMapping(value = "exportStudy")
+	public String exportStudy(HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		String listIds = request.getParameter("ids");
+		List<String> idList = new ArrayList<>();
+		if (null != listIds && !"".equals(listIds)) {
+			idList = Arrays.asList(listIds.split(","));
+		} else {
+			idList = basicInformationService.findAllId();
+		}
+		try {
+			String filePath = filingImagesService.exportStudy(idList);
+			filingImagesService.downloadZipFile(filePath,response);
+			return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "批量下载项目文件失败!");
+		}
+		return "redirect:"+Global.getAdminPath()+"/filing/studyStage/";
+	}
+
+	/**
+	 * 项目相应文件批量下载并压缩
+	 */
+	@RequestMapping(value = "exportApproval")
+	public String exportApproval(HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		String listIds = request.getParameter("ids");
+		List<String> idList = new ArrayList<>();
+		if (null != listIds && !"".equals(listIds)) {
+			idList = Arrays.asList(listIds.split(","));
+		} else {
+			idList = basicInformationService.findAllId();
+		}
+		try {
+			String filePath = filingImagesService.exportApproved(idList);
+			filingImagesService.downloadZipFile(filePath,response);
+			return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "批量下载项目文件失败!");
+		}
+		return "redirect:"+Global.getAdminPath()+"/filing/approvalStage/";
+	}
+
+
+	/**
+	 * 项目相应文件批量下载并压缩
+	 */
+	@RequestMapping(value = "exportEarlyStage")
+	public String exportEarlyStage(HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		String listIds = request.getParameter("ids");
+		List<String> idList = new ArrayList<>();
+		if (null != listIds && !"".equals(listIds)) {
+			idList = Arrays.asList(listIds.split(","));
+		} else {
+			idList = basicInformationService.findAllId();
+		}
+		try {
+			String filePath = filingImagesService.exportEarlyStage(idList);
+			filingImagesService.downloadZipFile(filePath,response);
+			return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "批量下载项目文件失败!");
+		}
+		return "redirect:"+Global.getAdminPath()+"/filing/earlyStage/";
+	}
+}

+ 156 - 0
src/main/webapp/webpage/modules/filing/approvalStage/approvalStageForm.js

@@ -0,0 +1,156 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+<script>
+$(document).ready(function() {
+	var projectCode = $("#projectCode").val();
+	// alert(procInsId);
+	$('#engineeringTable').bootstrapTable({
+		//请求方法
+		method: 'post',
+		//类型json
+		dataType: "json",
+		contentType: "application/x-www-form-urlencoded",
+		//显示检索按钮
+		showSearch: false,
+		//显示刷新按钮
+		showRefresh: false,
+		//显示切换手机试图按钮
+		showToggle: false,
+		//显示 内容列下拉框
+		showColumns: false,
+		//显示到处按钮
+		showExport: false,
+		//显示切换分页按钮
+		showPaginationSwitch: false,
+		//最低显示2行
+		minimumCountColumns: 2,
+		//是否显示行间隔色
+		striped: true,
+		//是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*)
+		cache: false,
+		//是否显示分页(*)
+		pagination: true,
+		//排序方式
+		sortOrder: "asc",
+		//初始化加载第一页,默认第一页
+		pageNumber:1,
+		//每页的记录行数(*)
+		pageSize: 10,
+		//可供选择的每页的行数(*)
+		pageList: [10, 25, 50, 100],
+		//这个接口需要处理bootstrap table传递的固定参数,并返回特定格式的json数据
+		url: "${ctx}/filing/filingImages/data?projectCode="+projectCode+"&purpose=核准附件",
+		//默认值为 'limit',传给服务端的参数为:limit, offset, search, sort, order Else
+		//queryParamsType:'',
+		////查询参数,每次调用是会带上这个参数,可自定义
+		queryParams : function(params) {
+			var searchParam = $("#searchForm").serializeJSON();
+			searchParam.pageNo = params.limit === undefined? "1" :params.offset/params.limit+1;
+			searchParam.pageSize = params.limit === undefined? -1 : params.limit;
+			searchParam.orderBy = params.sort === undefined? "" : params.sort+ " "+  params.order;
+			return searchParam;
+		},
+		//分页方式:client客户端分页,server服务端分页(*)
+		sidePagination: "server",
+		contextMenuTrigger:"right",//pc端 按右键弹出菜单
+		contextMenuTriggerMobile:"press",//手机端 弹出菜单,click:单击, press:长按。
+		contextMenu: '#context-menu',
+		onContextMenuItem: function(row, $el){
+			if($el.data("item") == "edit"){
+				edit(row.id);
+			}else if($el.data("item") == "view"){
+				view(row.id);
+			} else if($el.data("item") == "delete"){
+				jp.confirm('确认要删除该图片管理记录吗?', function(){
+					jp.loading();
+					jp.get("${ctx}/test/pic/testPic/delete?id="+row.id, function(data){
+						if(data.success){
+							$('#testPicTable').bootstrapTable('refresh');
+							jp.success(data.msg);
+						}else{
+							jp.error(data.msg);
+						}
+					})
+
+				});
+
+			}
+		},
+
+		onClickRow: function(row, $el){
+		},
+		onShowSearch: function () {
+			$("#search-collapse").slideToggle();
+		},
+		columns: [{
+			checkbox: true
+		}
+			, {
+				field: 'imgPath',
+				title: '文件路径',
+				sortable: true,
+				sortName: 'imgPath',
+				formatter:function(value, row , index){
+					var valueArray = value.split("|");
+					var labelArray = [];
+					for(var i =0 ; i<valueArray.length; i++){
+						if(!/\.(gif|jpg|jpeg|png|GIF|JPG|PNG)$/.test(valueArray[i]))
+						{
+							labelArray[i] = "<a href=\""+valueArray[i]+"\" url=\""+valueArray[i]+"\" target=\"_blank\">"+decodeURIComponent(valueArray[i].substring(valueArray[i].lastIndexOf("/")+1))+"</a>"
+						}else{
+							labelArray[i] = '<img   onclick="jp.showPic(\''+valueArray[i]+'\')"'+' height="50px" src="'+valueArray[i]+'">';
+						}
+					}
+					return labelArray.join(" ");
+				}
+
+			},{
+				field: 'purpose',
+				title: '上传用途',
+				sortable: true,
+				sortName: 'purpose',
+			}]
+	});
+
+	$('#engineeringTable').on('check.bs.table uncheck.bs.table load-success.bs.table ' +
+		'check-all.bs.table uncheck-all.bs.table', function () {
+		$('#remove').prop('disabled', ! $('#engineeringTable').bootstrapTable('getSelections').length);
+		$('#view,#edit').prop('disabled', $('#engineeringTable').bootstrapTable('getSelections').length!=1);
+	});
+
+
+
+})
+
+function getIdSelections() {
+	return $.map($("#engineeringTable").bootstrapTable('getSelections'), function (row) {
+		return row.id
+	});
+}
+
+function deleteAll(){
+	jp.confirm('确认要删除该图片管理记录吗?', function(){
+		jp.loading();
+		console.log(getIdSelections());
+		jp.get("${ctx}/filing/filingImages/deleteAll?ids=" + getIdSelections(), function(data){
+			if(data.success){
+				$('#engineeringTable').bootstrapTable('refresh');
+				jp.success(data.msg);
+			}else{
+				jp.error(data.msg);
+			}
+		})
+	})
+}
+
+function refresh(){
+	$('#engineeringTable').bootstrapTable('refresh');
+}
+
+function add(){//没有权限时,不显示确定按钮
+	var projectCode = $('#projectCode').val();
+	jp.openSaveDialog('模块清单', "${ctx}/filing/filingImages/form?projectCode="+projectCode+"&purpose=核准附件", '800px', '500px');
+	jp.refresh();
+}
+
+
+</script>

+ 109 - 0
src/main/webapp/webpage/modules/filing/approvalStage/approvalStageForm.jsp

@@ -0,0 +1,109 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+<%@ include file="/webpage/include/taglib.jsp"%>
+<html>
+<head>
+	<title>核准阶段管理</title>
+	<meta name="decorator" content="ani"/>
+	<%@include file="approvalStageForm.js"%>
+	<%@ include file="/webpage/include/bootstraptable.jsp" %>
+	<style type="text/css">
+		/* 下边两行是去掉input 输入框右边的上下箭头按钮*/
+		.deal::-webkit-inner-spin-button {
+			-webkit-appearance: none !important;
+		}
+		.deal::-webkit-outer-spin-button {
+			-webkit-appearance: none !important;
+		}
+		input[type="number"]{
+			-moz-appearance:textfield;
+		}
+	</style>
+	<script type="text/javascript">
+
+		$(document).ready(function() {
+	        $('#dateOfApproval').datetimepicker({
+				 format: "YYYY-MM-DD"
+		    });
+		});
+
+		function save() {
+            var isValidate = jp.validateForm('#inputForm');//校验表单
+            if(!isValidate){
+                return false;
+			}else{
+                jp.loading();
+                jp.post("${ctx}/filing/approvalStage/save",$('#inputForm').serialize(),function(data){
+                    if(data.success){
+                        jp.getParent().refresh();
+                        var dialogIndex = parent.layer.getFrameIndex(window.name); // 获取窗口索引
+                        parent.layer.close(dialogIndex);
+                        jp.success(data.msg)
+
+                    }else{
+                        jp.error(data.msg);
+                    }
+                })
+			}
+
+        }
+
+		function noFue(val){
+			document.getElementById('approvedAmount').value = val >= 0 ? val : 0;
+		}
+
+	</script>
+</head>
+<body class="bg-white">
+		<form:form id="inputForm" modelAttribute="approvalStage" action="${ctx}/filing/basicInformation/save" method="post" class="form-horizontal">
+		<form:hidden path="id"/>
+		<table class="table table-bordered">
+		   <tbody>
+				<tr>
+					<td class="width-15 active"><label class="pull-right">项目编码:</label></td>
+					<td class="width-35">
+						<form:input path="projectCode" readonly="true" htmlEscape="false"  class="form-control"/>
+					</td>
+					<td class="width-15 active"><label class="pull-right">单体编码:</label></td>
+					<td class="width-35">
+						<form:input path="monomerCode" readonly="true" htmlEscape="false"  class="form-control"/>
+					</td>
+				</tr>
+				<tr>
+					<td class="width-15 active"><label class="pull-right">项目名称:</label></td>
+					<td class="width-35">
+						<form:input path="entryName" readonly="true" htmlEscape="false" class="form-control"/>
+					</td>
+					<td class="width-15 active"><label class="pull-right">核准文号:</label></td>
+					<td class="width-35">
+						<form:input path="approvalNumber" htmlEscape="false" class="form-control"/>
+					</td>
+				</tr>
+				<tr>
+					<td class="width-15 active"><label class="pull-right">核准日期:</label></td>
+					<td class="width-35">
+						<div class='input-group form_datetime' id='dateOfApproval'>
+							<input type='text'  name="dateOfApproval" class="form-control"  value="<fmt:formatDate value="${approvalStage.dateOfApproval}" pattern="yyyy-MM-dd"/>"/>
+							<span class="input-group-addon">
+			                        <span class="glyphicon glyphicon-calendar"></span>
+			                    </span>
+						</div>
+					</td>
+					</td>
+					<td class="width-15 active"><label class="pull-right">核准金额:</label></td>
+					<td class="width-35">
+						<form:input type="number" onblur="noFue(this.value)" path="approvedAmount" htmlEscape="false" rows="4" class="form-control"/>
+					</td>
+		  		</tr>
+				<tr>
+					<td class="width-15 active"><label class="pull-right">核准附件:</label></td>
+					<td class="width-35">
+						<sys:fileUpload path="approvedAnnex"  value="${approvalStage.approvedAnnex}" type="*" uploadPath="/photo"  readonly="false"/></td>
+					</td>
+					</td>
+				</tr>
+		 	</tbody>
+		</table>
+		</div>
+		</form:form>
+</body>
+</html>

+ 365 - 0
src/main/webapp/webpage/modules/filing/approvalStage/approvalStageList.js

@@ -0,0 +1,365 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+<script>
+$(document).ready(function() {
+	$('#basicTable').bootstrapTable({
+		  //请求方法
+               method: 'post',
+               //类型json
+               dataType: "json",
+               contentType: "application/x-www-form-urlencoded",
+               //显示检索按钮
+	       showSearch: true,
+               //显示刷新按钮
+               showRefresh: true,
+               //显示切换手机试图按钮
+               showToggle: true,
+               //显示 内容列下拉框
+    	       showColumns: true,
+    	       //显示到处按钮
+    	       showExport: true,
+    	       //显示切换分页按钮
+    	       showPaginationSwitch: true,
+    	       //显示详情按钮
+    	       detailView: true,
+    	       	//显示详细内容函数
+	           // detailFormatter: "detailFormatter",
+    	       //最低显示2行
+    	       minimumCountColumns: 2,
+               //是否显示行间隔色
+               striped: true,
+               //是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*)
+               cache: false,
+               //是否显示分页(*)
+               pagination: true,
+                //排序方式
+               sortOrder: "asc",
+               //初始化加载第一页,默认第一页
+               pageNumber:1,
+               //每页的记录行数(*)
+               pageSize: 10,
+               //可供选择的每页的行数(*)
+               pageList: [10, 25, 50, 100],
+               //这个接口需要处理bootstrap table传递的固定参数,并返回特定格式的json数据
+               url: "${ctx}/filing/approvalStage/data",
+               //默认值为 'limit',传给服务端的参数为:limit, offset, search, sort, order Else
+               //queryParamsType:'',
+               ////查询参数,每次调用是会带上这个参数,可自定义
+               queryParams : function(params) {
+               	var searchParam = $("#searchForm").serializeJSON();
+               	searchParam.pageNo = params.limit === undefined? "1" :params.offset/params.limit+1;
+               	searchParam.pageSize = params.limit === undefined? -1 : params.limit;
+               	searchParam.orderBy = params.sort === undefined? "" : params.sort+ " "+  params.order;
+                   return searchParam;
+               },
+               //分页方式:client客户端分页,server服务端分页(*)
+               sidePagination: "server",
+               contextMenuTrigger:"right",//pc端 按右键弹出菜单
+               contextMenuTriggerMobile:"press",//手机端 弹出菜单,click:单击, press:长按。
+               contextMenu: '#context-menu',
+               onContextMenuItem: function(row, $el){
+                   if($el.data("item") == "edit"){
+                   		edit(row.id);
+                   }else if($el.data("item") == "view"){
+                       view(row.id);
+                   } else if($el.data("item") == "delete"){
+                        jp.confirm('确认要删除该核准阶段记录吗?', function(){
+                       	jp.loading();
+                       	jp.get("${ctx}/filing/approvalStage/delete?id="+row.id, function(data){
+                   	  		if(data.success){
+                   	  			$('#basicTable').bootstrapTable('refresh');
+                   	  			jp.success(data.msg);
+                   	  		}else{
+                   	  			jp.error(data.msg);
+                   	  		}
+                   	  	})
+
+                   	});
+
+                   }
+               },
+		/*		onPostBody:function(){
+					window.rowProps = undefined;
+					_table_rowspan("#basicTable" , 1);
+					_table_rowspan("#basicTable" , 2);
+					_table_rowspan("#basicTable" , 3);
+					_table_rowspan("#basicTable" , 4);
+					_table_rowspan("#basicTable" , 5);
+					return true;
+				},*/
+               onClickRow: function(row, $el){
+               },
+               	onShowSearch: function () {
+			$("#search-collapse").slideToggle();
+		},
+               columns: [{
+		        checkbox: true
+
+		    }
+			,{
+		        field: 'projectCode',
+		        title: '项目编码',
+			    width: '100px',
+		        sortable: true,
+		        sortName: 'projectCode'
+		        ,formatter:function(value, row , index){
+			   if(value == null || value ==""){
+				   value = "-";
+			   }
+			   <c:choose>
+				   <c:when test="${fns:hasPermission('test:filing:approvalStage:edit')}">
+				      return "<a href='javascript:edit(\""+row.id+"\")'>"+value+"</a>";
+			      </c:when>
+				  <c:when test="${fns:hasPermission('test:filing:approvalStage:view')}">
+				      return "<a href='javascript:view(\""+row.id+"\")'>"+value+"</a>";
+			      </c:when>
+				  <c:otherwise>
+				      return value;
+			      </c:otherwise>
+			   </c:choose>
+
+		        }
+		    }
+			,{
+		        field: 'monomerCode',
+		        title: '单体编码',
+		        sortable: true,
+			   width: '100px',
+		        sortName: 'monomerCode'
+
+		    }
+			,{
+		        field: 'entryName',
+		        title: '项目名称',
+					   width: '100px',
+		        sortable: true,
+		        sortName: 'entryName'
+
+		    }
+			,{
+		        field: 'approvalNumber',
+		        title: '核准文号',
+					   width: '100px',
+		        sortable: true,
+		        sortName: 'approvalNumber'
+		    }
+			,{
+		        field: 'dateOfApproval',
+		        title: '核准日期',
+					   width: '100px',
+		        sortable: true,
+		        sortName: 'dateOfApproval'
+
+		    }
+				   ,{
+					   field: 'approvedAmount',
+					   title: '核准金额',
+					   width: '100px',
+					   sortable: true,
+					   sortName: 'approvedAmount'
+				   }
+		     ],
+		onExpandRow: function (index, row, $detail) {
+			initSubTable(index, row, $detail);
+		}
+		});
+
+	//初始化子表格(无线循环)
+	initSubTable = function (index, row, $detail) {
+		var parentid = row.projectCode;
+		var cur_table = $detail.html('<table></table>').find('table');
+		$(cur_table).bootstrapTable({
+			url: '${ctx}/filing/approvalStage/detail',
+			method: 'post',
+			//类型json
+			dataType: "json",
+			contentType: "application/x-www-form-urlencoded",
+			queryParams : function(params) {
+				var searchParam = $("#searchForm").serializeJSON();
+				searchParam.pageNo = params.limit === undefined? "1" :params.offset/params.limit+1;
+				searchParam.pageSize = params.limit === undefined? -1 : params.limit;
+				searchParam.orderBy = params.sort === undefined? "" : params.sort+ " "+  params.order;
+				searchParam.projectCode = parentid;
+				return searchParam;
+			},
+			striped: true, //是否显示行间隔色
+			pagination: false,//显示分页
+			sidePagination: "server",
+			pageNumber:1,
+			pageSize: 10,
+			pageList: [10, 25],
+			columns: [{
+				field: 'projectCode',
+				title: '项目编码',
+				width: '164px'
+			}, {
+				field: 'monomerCode',
+				title: '单体编码',
+				width: '100px'
+			}, {
+				field: 'entryName',
+				title: '项目名称',
+				width: '100px',
+			},{
+				field: 'approvalNumber',
+				title: '核准文号',
+				width: '100px',
+				sortable: true,
+				sortName: 'approvalNumber'
+			}
+				,{
+					field: 'dateOfApproval',
+					title: '核准日期',
+					width: '100px',
+					sortable: true,
+					sortName: 'dateOfApproval'
+
+				}
+				,{
+					field: 'approvedAmount',
+					title: '核准金额',
+					width: '100px',
+					sortable: true,
+					sortName: 'approvedAmount'
+				}]
+		});
+	};
+
+		  
+	  if(navigator.userAgent.match(/(iPhone|iPod|Android|ios)/i)){//如果是移动端
+
+		 
+		  $('#basicTable').bootstrapTable("toggleView");
+		}
+	  
+	  $('#basicTable').on('check.bs.table uncheck.bs.table load-success.bs.table ' +
+                'check-all.bs.table uncheck-all.bs.table', function () {
+            $('#remove').prop('disabled', ! $('#basicTable').bootstrapTable('getSelections').length);
+            $('#view,#edit').prop('disabled', $('#basicTable').bootstrapTable('getSelections').length!=1);
+        });
+		  
+		$("#btnImport").click(function(){
+			jp.open({
+			    type: 2,
+                area: [500, 200],
+                auto: true,
+			    title:"导入数据",
+			    content: "${ctx}/tag/importExcel" ,
+			    btn: ['下载模板','确定', '关闭'],
+				btn1: function(index, layero){
+					  jp.downloadFile('${ctx}/filing/approvalStage/import/template');
+				  },
+			    btn2: function(index, layero){
+						var iframeWin = layero.find('iframe')[0]; //得到iframe页的窗口对象,执行iframe页的方法:iframeWin.method();
+						iframeWin.contentWindow.importExcel('${ctx}/filing/approvalStage/import', function (data) {
+							if(data.success){
+								jp.success(data.msg);
+								refresh();
+							}else{
+								jp.error(data.msg);
+							}
+                            jp.close(index);
+                        });//调用保存事件
+                    return false;
+				  },
+				 
+				  btn3: function(index){ 
+					  jp.close(index);
+	    	       }
+			}); 
+		});
+	  $("#export").click(function(){//导出Excel文件
+			jp.downloadFile('${ctx}/filing/approvalStage/export');
+	  });
+
+	$("#exportFiles").bind("click", function () {
+		$("#searchForm").attr("action","${ctx}/filing/filingImages/exportApproval?ids="+ getIdSelections());
+		$("#searchForm").submit();
+		return true;
+	});
+
+	/*$("#exportFiles").click(function(){//导出Excel文件
+		jp.downloadFile('${ctx}/filing/approvalStage/exportFiles?ids=' + getIdSelections());
+	});*/
+
+	  $("#search").click("click", function() {// 绑定查询按扭
+		  $('#basicTable').bootstrapTable('refresh');
+		});
+
+	  $("#open").click(function () {
+		  $("#basicTable").bootstrapTable('expandAllRows');
+	  })
+
+		$("#close").click(function (row) {
+			$('#basicTable').bootstrapTable('refresh');
+		})
+
+	 $("#reset").click("click", function() {// 绑定查询按扭
+		  $("#searchForm  input").val("");
+		  $("#searchForm  select").val("");
+		   $("#searchForm  .select-item").html("");
+		  $('#basicTable').bootstrapTable('refresh');
+		});
+		
+				$('#beginInDate').datetimepicker({
+					 format: "YYYY-MM-DD HH:mm:ss"
+				});
+				$('#endInDate').datetimepicker({
+					 format: "YYYY-MM-DD HH:mm:ss"
+				});
+		
+	});
+		
+  function getIdSelections() {
+        return $.map($("#basicTable").bootstrapTable('getSelections'), function (row) {
+            return row.id
+        });
+    }
+  
+  function deleteAll(){
+
+		jp.confirm('确认要删除该核准阶段记录吗?', function(){
+			jp.loading();  	
+			jp.get("${ctx}/filing/approvalStage/deleteAll?ids=" + getIdSelections(), function(data){
+         	  		if(data.success){
+         	  			$('#basicTable').bootstrapTable('refresh');
+         	  			jp.success(data.msg);
+         	  		}else{
+         	  			jp.error(data.msg);
+         	  		}
+         	  	})
+          	   
+		})
+  }
+  
+    //刷新列表
+  function refresh() {
+      $('#basicTable').bootstrapTable('refresh');
+  }
+  function add(){
+	  jp.openSaveDialog('新增核准阶段', "${ctx}/filing/approvalStage/form",'1000px', '800px');
+  }
+  
+   function edit(id){//没有权限时,不显示确定按钮
+       if(id == undefined){
+	      id = getIdSelections();
+	}
+	jp.openSaveDialog('编辑核准阶段', "${ctx}/filing/approvalStage/form?id=" + id, '800px', '500px');
+  }
+
+ function view(id){//没有权限时,不显示确定按钮
+      if(id == undefined){
+             id = getIdSelections();
+      }
+        jp.openViewDialog('查看核准阶段', "${ctx}/filing/approvalStage/form?id=" + id, '800px', '500px');
+ }
+
+
+	function addRow(list, idx, tpl, row){
+		$(list).append(Mustache.render(tpl, {
+			idx: idx, delBtn: true, row: row
+		}));
+	}
+			
+</script>
+
+

+ 87 - 0
src/main/webapp/webpage/modules/filing/approvalStage/approvalStageList.jsp

@@ -0,0 +1,87 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+<%@ include file="/webpage/include/taglib.jsp" %>
+<html>
+<head>
+    <title>票务代理管理</title>
+    <meta http-equiv="Content-type" content="text/html; charset=utf-8">
+    <meta name="decorator" content="ani"/>
+    <%@ include file="/webpage/include/bootstraptable.jsp" %>
+    <%@include file="/webpage/include/treeview.jsp" %>
+    <%@include file="approvalStageList.js" %>
+    <style type="text/css">
+        .table {
+            table-layout: fixed;
+            word-break: break-all;
+            word-wrap: break-word;
+            text-align: center;
+        }
+
+        .table th, .table td {
+            text-align: center;
+            vertical-align: middle !important;
+        }
+    </style>
+</head>
+<body>
+<div class="wrapper wrapper-content">
+    <div class="panel panel-primary">
+        <div class="panel-heading">
+            <h3 class="panel-title">基础信息列表</h3>
+        </div>
+        <div class="panel-body">
+            <!-- 搜索 -->
+            <div id="search-collapse" class="collapse">
+                <div class="accordion-inner">
+                    <form:form id="searchForm" modelAttribute="approvalStage"
+                               class="form form-horizontal well clearfix">
+                        <div class="col-xs-12 col-sm-6 col-md-4">
+                            <label class="label-item single-overflow pull-left" title="项目编码:">项目编码:</label>
+                            <form:input path="projectCode" htmlEscape="false" maxlength="257"  class=" form-control"/>
+                        </div>
+                        <div class="col-xs-12 col-sm-6 col-md-4">
+                            <div style="margin-top:26px">
+                                <a id="search" class="btn btn-primary btn-rounded  btn-bordered btn-sm"><i
+                                        class="fa fa-search"></i> 查询</a>
+                                <a id="reset" class="btn btn-primary btn-rounded  btn-bordered btn-sm"><i
+                                        class="fa fa-refresh"></i> 重置</a>
+                            </div>
+                        </div>
+                    </form:form>
+                </div>
+            </div>
+
+            <!-- 工具栏 -->
+            <div id="toolbar">
+                <button id="open" class="btn btn-primary" >
+                    <i class="glyphicon glyphicon-list"></i> 全部展开
+                </button>
+                <button id="close" class="btn btn-primary">
+                    <i class="glyphicon glyphicon-minus"></i> 全部折叠
+                </button>
+                <shiro:hasPermission name="test:filing:approvalStage:edit">
+                    <button id="edit" class="btn btn-success" disabled onclick="edit()">
+                        <i class="glyphicon glyphicon-edit"></i> 修改
+                    </button>
+                </shiro:hasPermission>
+                <shiro:hasPermission name="test:filing:approvalStage:import">
+                    <button id="btnImport" class="btn btn-info"><i class="fa fa-folder-open-o"></i> 导入</button>
+                </shiro:hasPermission>
+                <shiro:hasPermission name="test:filing:approvalStage:export">
+                    <button id="export" class="btn btn-warning">
+                        <i class="fa fa-file-excel-o"></i> 导出
+                    </button>
+                </shiro:hasPermission>
+                <shiro:hasPermission name="test:filing:approvalStage:export">
+                <button id="exportFiles" class="btn btn-warning">
+                    <i class="fa fa-file-excel-o"></i> 导出附件
+                </button>
+                </shiro:hasPermission>
+            </div>
+
+            <!-- 表格 -->
+            <table id="basicTable" data-toolbar="#toolbar"></table>
+        </div>
+    </div>
+</div>
+</body>
+</html>

+ 237 - 0
src/main/webapp/webpage/modules/filing/earlyStage/earlyStageChildForm.jsp

@@ -0,0 +1,237 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+<%@ include file="/webpage/include/taglib.jsp"%>
+<html>
+<head>
+	<title>项目前期阶段管理</title>
+	<meta name="decorator" content="ani"/>
+	<%@ include file="/webpage/include/bootstraptable.jsp" %>
+	<style type="text/css">
+		/* 下边两行是去掉input 输入框右边的上下箭头按钮*/
+		.deal::-webkit-inner-spin-button {
+			-webkit-appearance: none !important;
+		}
+		.deal::-webkit-outer-spin-button {
+			-webkit-appearance: none !important;
+		}
+		input[type="number"]{
+			-moz-appearance:textfield;
+		}
+	</style>
+	<script type="text/javascript">
+
+		$(document).ready(function() {
+	        $('#dateOfApproval').datetimepicker({
+				 format: "YYYY-MM-DD"
+		    });
+			$('#approvalDate').datetimepicker({
+				format: "YYYY-MM-DD"
+			});
+			$('#milestoneStartDate').datetimepicker({
+				format: "YYYY-MM-DD"
+			});
+			$('#milestoneCommissioningDate').datetimepicker({
+				format: "YYYY-MM-DD"
+			});
+			$('#startDate').datetimepicker({
+				format: "YYYY-MM-DD"
+			});
+			$('#internalControl').datetimepicker({
+				format: "YYYY-MM-DD"
+			});
+			$('#earliestArrival').datetimepicker({
+				format: "YYYY-MM-DD"
+			});
+			$('#arrivalPlan').datetimepicker({
+				format: "YYYY-MM-DD"
+			});
+		});
+
+		function save() {
+            var isValidate = jp.validateForm('#inputForm');//校验表单
+            if(!isValidate){
+                return false;
+			}else{
+                jp.loading();
+                jp.post("${ctx}/filing/earlyStage/save",$('#inputForm').serialize(),function(data){
+                    if(data.success){
+                        jp.getParent().refresh();
+                        var dialogIndex = parent.layer.getFrameIndex(window.name); // 获取窗口索引
+                        parent.layer.close(dialogIndex);
+                        jp.success(data.msg)
+
+                    }else{
+                        jp.error(data.msg);
+                    }
+                })
+			}
+
+        }
+
+		function noFue(val){
+			document.getElementById('approvedAmount').value = val >= 0 ? val : 0;
+		}
+
+		function noFue2(val){
+			document.getElementById('staticInvestment').value = val >= 0 ? val : 0;
+		}
+
+		function noFue3(val){
+			document.getElementById('dynamicInvestment').value = val >= 0 ? val : 0;
+		}
+
+		function noFue4(val){
+			document.getElementById('constructionScaleVA').value = val >= 0 ? val : 0;
+		}
+
+		function noFue5(val){
+			document.getElementById('constructionScaleKM').value = val >= 0 ? val : 0;
+		}
+
+		function noFue6(val){
+			document.getElementById('numberOf').value = val >= 0 ? val : 0;
+		}
+
+	</script>
+</head>
+<body class="bg-white">
+		<form:form id="inputForm" modelAttribute="earlyStage" action="${ctx}/filing/basicInformation/save" method="post" class="form-horizontal">
+		<form:hidden path="id"/>
+		<table class="table table-bordered">
+		   <tbody>
+				<tr>
+					<td class="width-15 active"><label class="pull-right">项目编码:</label></td>
+					<td class="width-35">
+						<form:input path="projectCode" readonly="true" htmlEscape="false"  class="form-control"/>
+					</td>
+					<td class="width-15 active"><label class="pull-right">单体编码:</label></td>
+					<td class="width-35">
+						<form:input path="monomerCode" readonly="true" htmlEscape="false"  class="form-control"/>
+					</td>
+				</tr>
+				<tr>
+					<td class="width-15 active"><label class="pull-right">可研静态态投资金额:</label></td>
+					<td class="width-35">
+						<form:input type="number" onblur="noFue2(this.value)" path="staticInvestment" htmlEscape="false" rows="4" class="form-control"/>
+					</td>
+					<td class="width-15 active"><label class="pull-right">可研动态投资金额:</label></td>
+					<td class="width-35">
+						<form:input type="number" onblur="noFue3(this.value)" path="dynamicInvestment" htmlEscape="false" rows="4" class="form-control"/>
+					</td>
+				</tr>
+				<tr>
+					<td class="width-15 active"><label class="pull-right">可研附件:</label></td>
+					<td class="width-35">
+						<sys:fileUpload path="studyAppendix"  value="${earlyStage.studyAppendix}" type="*" uploadPath="/photo"  readonly="false"/></td>
+					</td>
+					<td class="width-15 active"><label class="pull-right">建设规模(变电容量)万伏安:</label></td>
+					<td class="width-35">
+						<form:input type="number" onblur="noFue4(this.value)" path="constructionScaleVA" htmlEscape="false" rows="4" class="form-control"/>
+					</td>
+				</tr>
+				<tr>
+					<td class="width-15 active"><label class="pull-right">建设规模(线路长度)千米:</label></td>
+					<td class="width-35">
+						<form:input type="number" onblur="noFue5(this.value)" path="constructionScaleKM" htmlEscape="false" rows="4" class="form-control"/>
+					</td>
+					<td class="width-15 active"><label class="pull-right">铁塔数量/钢管杆数量:</label></td>
+					<td class="width-35">
+						<form:input type="number" onblur="noFue6(this.value)" path="numberOf" htmlEscape="false" rows="4" class="form-control"/>
+					</td>
+				</tr>
+				<tr>
+					<td class="width-15 active"><label class="pull-right">导线型号及双回否型号:</label></td>
+					<td class="width-35">
+						<form:input path="conductorType" htmlEscape="false" class="form-control"/>
+					</td>
+					<td class="width-15 active"><label class="pull-right">导线型号及双回否长度:</label></td>
+					<td class="width-35">
+						<form:input path="conductorLength"  htmlEscape="false" class="form-control"/>
+					</td>
+				</tr>
+				<tr>
+					<td class="width-15 active"><label class="pull-right">变压器来源新购/利旧,主变来源的变电站:</label></td>
+					<td class="width-35">
+						<form:input path="theSource" htmlEscape="false" class="form-control"/>
+					</td>
+					<td class="width-15 active"><label class="pull-right">模块化建设方案:</label></td>
+					<td class="width-35">
+						<form:input path="modularConstructionScheme"  htmlEscape="false" class="form-control"/>
+					</td>
+				</tr>
+				<tr>
+					<td class="width-15 active"><label class="pull-right">工程难点描述:</label></td>
+					<td class="width-35">
+						<form:input path="descriptionOf"  htmlEscape="false" class="form-control"/>
+					</td>
+					<td class="width-15 active"><label class="pull-right">里程碑开工日期:</label></td>
+					<td class="width-35">
+						<div class='input-group form_datetime' id='milestoneStartDate'>
+							<input type='text'  name="milestoneStartDate" class="form-control"  value="<fmt:formatDate value="${earlyStage.milestoneStartDate}" pattern="yyyy-MM-dd"/>"/>
+							<span class="input-group-addon">
+			                        <span class="glyphicon glyphicon-calendar"></span>
+			                    </span>
+						</div>
+					</td>
+					</td>
+				</tr>
+				<tr>
+					<td class="width-15 active"><label class="pull-right">里程碑投产日期:</label></td>
+					<td class="width-35">
+						<div class='input-group form_datetime' id='milestoneCommissioningDate'>
+							<input type='text'  name="milestoneCommissioningDate" class="form-control"  value="<fmt:formatDate value="${earlyStage.milestoneCommissioningDate}" pattern="yyyy-MM-dd"/>"/>
+							<span class="input-group-addon">
+			                        <span class="glyphicon glyphicon-calendar"></span>
+			                    </span>
+						</div>
+					</td>
+					<td class="width-15 active"><label class="pull-right">内控开工日期:</label></td>
+					<td class="width-35">
+						<div class='input-group form_datetime' id='startDate'>
+							<input type='text'  name="startDate" class="form-control"  value="<fmt:formatDate value="${earlyStage.startDate}" pattern="yyyy-MM-dd"/>"/>
+							<span class="input-group-addon">
+			                        <span class="glyphicon glyphicon-calendar"></span>
+			                    </span>
+						</div>
+					</td>
+					</td>
+				</tr>
+				<tr>
+
+					<td class="width-15 active"><label class="pull-right">内控投产日期:</label></td>
+					<td class="width-35">
+						<div class='input-group form_datetime' id='internalControl'>
+							<input type='text'  name="internalControl" class="form-control"  value="<fmt:formatDate value="${earlyStage.internalControl}" pattern="yyyy-MM-dd"/>"/>
+							<span class="input-group-addon">
+			                        <span class="glyphicon glyphicon-calendar"></span>
+			                    </span>
+						</div>
+					</td>
+					<td class="width-15 active"><label class="pull-right">主设备最早到货时间:</label></td>
+					<td class="width-35">
+						<div class='input-group form_datetime' id='earliestArrival'>
+							<input type='text'  name="earliestArrival" class="form-control"  value="<fmt:formatDate value="${earlyStage.earliestArrival}" pattern="yyyy-MM-dd"/>"/>
+							<span class="input-group-addon">
+			                        <span class="glyphicon glyphicon-calendar"></span>
+			                    </span>
+						</div>
+					</td>
+					</td>
+				</tr>
+				<tr>
+					<td class="width-15 active"><label class="pull-right">线路塔材到货计划:</label></td>
+					<td class="width-35">
+						<div class='input-group form_datetime' id='arrivalPlan'>
+							<input type='text'  name="arrivalPlan" class="form-control"  value="<fmt:formatDate value="${earlyStage.arrivalPlan}" pattern="yyyy-MM-dd"/>"/>
+							<span class="input-group-addon">
+			                        <span class="glyphicon glyphicon-calendar"></span>
+			                    </span>
+						</div>
+					</td>
+					</td>
+				</tr>
+		 	</tbody>
+		</table>
+		</div>
+		</form:form>
+</body>
+</html>

+ 292 - 0
src/main/webapp/webpage/modules/filing/earlyStage/earlyStageForm.jsp

@@ -0,0 +1,292 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+<%@ include file="/webpage/include/taglib.jsp"%>
+<html>
+<head>
+	<title>项目前期阶段管理</title>
+	<meta name="decorator" content="ani"/>
+	<%@ include file="/webpage/include/bootstraptable.jsp" %>
+	<style type="text/css">
+		/* 下边两行是去掉input 输入框右边的上下箭头按钮*/
+		.deal::-webkit-inner-spin-button {
+			-webkit-appearance: none !important;
+		}
+		.deal::-webkit-outer-spin-button {
+			-webkit-appearance: none !important;
+		}
+		input[type="number"]{
+			-moz-appearance:textfield;
+		}
+	</style>
+	<script type="text/javascript">
+
+		$(document).ready(function() {
+	        $('#dateOfApproval').datetimepicker({
+				 format: "YYYY-MM-DD"
+		    });
+			$('#approvalDate').datetimepicker({
+				format: "YYYY-MM-DD"
+			});
+			$('#milestoneStartDate').datetimepicker({
+				format: "YYYY-MM-DD"
+			});
+			$('#milestoneCommissioningDate').datetimepicker({
+				format: "YYYY-MM-DD"
+			});
+			$('#startDate').datetimepicker({
+				format: "YYYY-MM-DD"
+			});
+			$('#internalControl').datetimepicker({
+				format: "YYYY-MM-DD"
+			});
+			$('#earliestArrival').datetimepicker({
+				format: "YYYY-MM-DD"
+			});
+			$('#arrivalPlan').datetimepicker({
+				format: "YYYY-MM-DD"
+			});
+		});
+
+		function save() {
+            var isValidate = jp.validateForm('#inputForm');//校验表单
+            if(!isValidate){
+                return false;
+			}else{
+                jp.loading();
+                jp.post("${ctx}/filing/earlyStage/save",$('#inputForm').serialize(),function(data){
+                    if(data.success){
+                        jp.getParent().refresh();
+                        var dialogIndex = parent.layer.getFrameIndex(window.name); // 获取窗口索引
+                        parent.layer.close(dialogIndex);
+                        jp.success(data.msg)
+
+                    }else{
+                        jp.error(data.msg);
+                    }
+                })
+			}
+
+        }
+
+		function noFue(val){
+			document.getElementById('approvedAmount').value = val >= 0 ? val : 0;
+		}
+
+		function noFue2(val){
+			document.getElementById('staticInvestment').value = val >= 0 ? val : 0;
+		}
+
+		function noFue3(val){
+			document.getElementById('dynamicInvestment').value = val >= 0 ? val : 0;
+		}
+
+		function noFue4(val){
+			document.getElementById('constructionScaleVA').value = val >= 0 ? val : 0;
+		}
+
+		function noFue5(val){
+			document.getElementById('constructionScaleKM').value = val >= 0 ? val : 0;
+		}
+
+		function noFue6(val){
+			document.getElementById('numberOf').value = val >= 0 ? val : 0;
+		}
+
+	</script>
+</head>
+<body class="bg-white">
+		<form:form id="inputForm" modelAttribute="earlyStage" action="${ctx}/filing/basicInformation/save" method="post" class="form-horizontal">
+		<form:hidden path="id"/>
+		<table class="table table-bordered">
+		   <tbody>
+				<tr>
+					<td class="width-15 active"><label class="pull-right">项目编码:</label></td>
+					<td class="width-35">
+						<form:input path="projectCode" readonly="true" htmlEscape="false"  class="form-control"/>
+					</td>
+					<td class="width-15 active"><label class="pull-right">单体编码:</label></td>
+					<td class="width-35">
+						<form:input path="monomerCode" readonly="true" htmlEscape="false"  class="form-control"/>
+					</td>
+				</tr>
+				<tr>
+					<td class="width-15 active"><label class="pull-right">项目名称:</label></td>
+					<td class="width-35">
+						<form:input path="entryName" readonly="true" htmlEscape="false" class="form-control"/>
+					</td>
+					<td class="width-15 active"><label class="pull-right">核准文号:</label></td>
+					<td class="width-35">
+						<form:input path="approvalNumber" htmlEscape="false" class="form-control"/>
+					</td>
+				</tr>
+				<tr>
+					<td class="width-15 active"><label class="pull-right">核准日期:</label></td>
+					<td class="width-35">
+						<div class='input-group form_datetime' id='dateOfApproval'>
+							<input type='text'  name="dateOfApproval" class="form-control"  value="<fmt:formatDate value="${earlyStage.dateOfApproval}" pattern="yyyy-MM-dd"/>"/>
+							<span class="input-group-addon">
+			                        <span class="glyphicon glyphicon-calendar"></span>
+			                    </span>
+						</div>
+					</td>
+					</td>
+					<td class="width-15 active"><label class="pull-right">核准金额:</label></td>
+					<td class="width-35">
+						<form:input type="number" onblur="noFue(this.value)" path="approvedAmount" htmlEscape="false" rows="4" class="form-control"/>
+					</td>
+		  		</tr>
+				<tr>
+					<td class="width-15 active"><label class="pull-right">核准附件:</label></td>
+					<td class="width-35">
+						<sys:fileUpload path="approvedAnnex"  value="${earlyStage.approvedAnnex}" type="*" uploadPath="/photo"  readonly="false"/></td>
+					</td>
+					</td>
+					<td class="width-15 active"><label class="pull-right">可研批复文号:</label></td>
+					<td class="width-35">
+						<form:input path="replyNo" htmlEscape="false" class="form-control"/>
+					</td>
+				</tr>
+				<tr>
+					<td class="width-15 active"><label class="pull-right">可研批复日期:</label></td>
+					<td class="width-35">
+						<div class='input-group form_datetime' id='approvalDate'>
+							<input type='text'  name="approvalDate" class="form-control"  value="<fmt:formatDate value="${earlyStage.approvalDate}" pattern="yyyy-MM-dd"/>"/>
+							<span class="input-group-addon">
+			                        <span class="glyphicon glyphicon-calendar"></span>
+			                    </span>
+						</div>
+					</td>
+					</td>
+					<td class="width-15 active"><label class="pull-right">可研静态态投资金额:</label></td>
+					<td class="width-35">
+						<form:input type="number" onblur="noFue2(this.value)" path="staticInvestment" htmlEscape="false" rows="4" class="form-control"/>
+					</td>
+				</tr>
+				<tr>
+
+					<td class="width-15 active"><label class="pull-right">可研动态投资金额:</label></td>
+					<td class="width-35">
+						<form:input type="number" onblur="noFue3(this.value)" path="dynamicInvestment" htmlEscape="false" rows="4" class="form-control"/>
+					</td>
+					<td class="width-15 active"><label class="pull-right">可研附件:</label></td>
+					<td class="width-35">
+						<sys:fileUpload path="studyAppendix"  value="${earlyStage.studyAppendix}" type="*" uploadPath="/photo"  readonly="false"/></td>
+					</td>
+				</tr>
+				<tr>
+
+					<td class="width-15 active"><label class="pull-right">建设规模(变电容量)万伏安:</label></td>
+					<td class="width-35">
+						<form:input type="number" onblur="noFue4(this.value)" path="constructionScaleVA" htmlEscape="false" rows="4" class="form-control"/>
+					</td>
+					<td class="width-15 active"><label class="pull-right">建设规模(线路长度)千米:</label></td>
+					<td class="width-35">
+						<form:input type="number" onblur="noFue5(this.value)" path="constructionScaleKM" htmlEscape="false" rows="4" class="form-control"/>
+					</td>
+				</tr>
+				<tr>
+
+					<td class="width-15 active"><label class="pull-right">铁塔数量/钢管杆数量:</label></td>
+					<td class="width-35">
+						<form:input type="number" onblur="noFue6(this.value)" path="numberOf" htmlEscape="false" rows="4" class="form-control"/>
+					</td>
+					<td class="width-15 active"><label class="pull-right">导线型号及双回否型号:</label></td>
+					<td class="width-35">
+						<form:input path="conductorType" htmlEscape="false" class="form-control"/>
+					</td>
+				</tr>
+				<tr>
+
+					<td class="width-15 active"><label class="pull-right">导线型号及双回否长度:</label></td>
+					<td class="width-35">
+						<form:input path="conductorLength"  htmlEscape="false" class="form-control"/>
+					</td>
+					<td class="width-15 active"><label class="pull-right">变压器来源新购/利旧,主变来源的变电站:</label></td>
+					<td class="width-35">
+						<form:input path="theSource" htmlEscape="false" class="form-control"/>
+					</td>
+				</tr>
+				<tr>
+
+					<td class="width-15 active"><label class="pull-right">模块化建设方案:</label></td>
+					<td class="width-35">
+						<form:input path="modularConstructionScheme"  htmlEscape="false" class="form-control"/>
+					</td>
+					<td class="width-15 active"><label class="pull-right">工程难点描述:</label></td>
+					<td class="width-35">
+						<form:input path="descriptionOf"  htmlEscape="false" class="form-control"/>
+					</td>
+				</tr>
+				<tr>
+
+					<td class="width-15 active"><label class="pull-right">里程碑开工日期:</label></td>
+					<td class="width-35">
+						<div class='input-group form_datetime' id='milestoneStartDate'>
+							<input type='text'  name="milestoneStartDate" class="form-control"  value="<fmt:formatDate value="${earlyStage.milestoneStartDate}" pattern="yyyy-MM-dd"/>"/>
+							<span class="input-group-addon">
+			                        <span class="glyphicon glyphicon-calendar"></span>
+			                    </span>
+						</div>
+					</td>
+					</td>
+					<td class="width-15 active"><label class="pull-right">里程碑投产日期:</label></td>
+					<td class="width-35">
+						<div class='input-group form_datetime' id='milestoneCommissioningDate'>
+							<input type='text'  name="milestoneCommissioningDate" class="form-control"  value="<fmt:formatDate value="${earlyStage.milestoneCommissioningDate}" pattern="yyyy-MM-dd"/>"/>
+							<span class="input-group-addon">
+			                        <span class="glyphicon glyphicon-calendar"></span>
+			                    </span>
+						</div>
+					</td>
+				</tr>
+				<tr>
+					<td class="width-15 active"><label class="pull-right">内控开工日期:</label></td>
+					<td class="width-35">
+						<div class='input-group form_datetime' id='startDate'>
+							<input type='text'  name="startDate" class="form-control"  value="<fmt:formatDate value="${earlyStage.startDate}" pattern="yyyy-MM-dd"/>"/>
+							<span class="input-group-addon">
+			                        <span class="glyphicon glyphicon-calendar"></span>
+			                    </span>
+						</div>
+					</td>
+					</td>
+					<td class="width-15 active"><label class="pull-right">内控投产日期:</label></td>
+					<td class="width-35">
+						<div class='input-group form_datetime' id='internalControl'>
+							<input type='text'  name="internalControl" class="form-control"  value="<fmt:formatDate value="${earlyStage.internalControl}" pattern="yyyy-MM-dd"/>"/>
+							<span class="input-group-addon">
+			                        <span class="glyphicon glyphicon-calendar"></span>
+			                    </span>
+						</div>
+					</td>
+				</tr>
+
+				<tr>
+
+					</td>
+					<td class="width-15 active"><label class="pull-right">主设备最早到货时间:</label></td>
+					<td class="width-35">
+						<div class='input-group form_datetime' id='earliestArrival'>
+							<input type='text'  name="earliestArrival" class="form-control"  value="<fmt:formatDate value="${earlyStage.earliestArrival}" pattern="yyyy-MM-dd"/>"/>
+							<span class="input-group-addon">
+			                        <span class="glyphicon glyphicon-calendar"></span>
+			                    </span>
+						</div>
+					</td>
+					</td>
+					<td class="width-15 active"><label class="pull-right">线路塔材到货计划:</label></td>
+					<td class="width-35">
+						<div class='input-group form_datetime' id='arrivalPlan'>
+							<input type='text'  name="arrivalPlan" class="form-control"  value="<fmt:formatDate value="${earlyStage.arrivalPlan}" pattern="yyyy-MM-dd"/>"/>
+							<span class="input-group-addon">
+			                        <span class="glyphicon glyphicon-calendar"></span>
+			                    </span>
+						</div>
+					</td>
+					</td>
+				</tr>
+		 	</tbody>
+		</table>
+		</div>
+		</form:form>
+</body>
+</html>

+ 624 - 0
src/main/webapp/webpage/modules/filing/earlyStage/earlyStageList.js

@@ -0,0 +1,624 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+<script>
+$(document).ready(function() {
+	$('#basicTable').bootstrapTable({
+		  //请求方法
+               method: 'post',
+               //类型json
+               dataType: "json",
+               contentType: "application/x-www-form-urlencoded",
+               //显示检索按钮
+	       showSearch: true,
+               //显示刷新按钮
+               showRefresh: true,
+               //显示切换手机试图按钮
+               showToggle: true,
+               //显示 内容列下拉框
+    	       showColumns: true,
+    	       //显示到处按钮
+    	       showExport: true,
+    	       //显示切换分页按钮
+    	       showPaginationSwitch: true,
+    	       //显示详情按钮
+    	       detailView: true,
+    	       	//显示详细内容函数
+	           // detailFormatter: "detailFormatter",
+    	       //最低显示2行
+    	       minimumCountColumns: 2,
+               //是否显示行间隔色
+               striped: true,
+               //是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*)
+               cache: false,
+               //是否显示分页(*)
+               pagination: true,
+                //排序方式
+               sortOrder: "asc",
+               //初始化加载第一页,默认第一页
+               pageNumber:1,
+               //每页的记录行数(*)
+               pageSize: 10,
+               //可供选择的每页的行数(*)
+               pageList: [10, 25, 50, 100],
+               //这个接口需要处理bootstrap table传递的固定参数,并返回特定格式的json数据
+               url: "${ctx}/filing/earlyStage/data",
+               //默认值为 'limit',传给服务端的参数为:limit, offset, search, sort, order Else
+               //queryParamsType:'',
+               ////查询参数,每次调用是会带上这个参数,可自定义
+               queryParams : function(params) {
+               	var searchParam = $("#searchForm").serializeJSON();
+               	searchParam.pageNo = params.limit === undefined? "1" :params.offset/params.limit+1;
+               	searchParam.pageSize = params.limit === undefined? -1 : params.limit;
+               	searchParam.orderBy = params.sort === undefined? "" : params.sort+ " "+  params.order;
+                   return searchParam;
+               },
+               //分页方式:client客户端分页,server服务端分页(*)
+               sidePagination: "server",
+               contextMenuTrigger:"right",//pc端 按右键弹出菜单
+               contextMenuTriggerMobile:"press",//手机端 弹出菜单,click:单击, press:长按。
+               contextMenu: '#context-menu',
+               onContextMenuItem: function(row, $el){
+                   if($el.data("item") == "edit"){
+                   		edit(row.id);
+                   }else if($el.data("item") == "view"){
+                       view(row.id);
+                   } else if($el.data("item") == "delete"){
+                        jp.confirm('确认要删除该核准阶段记录吗?', function(){
+                       	jp.loading();
+                       	jp.get("${ctx}/filing/earlyStage/delete?id="+row.id, function(data){
+                   	  		if(data.success){
+                   	  			$('#basicTable').bootstrapTable('refresh');
+                   	  			jp.success(data.msg);
+                   	  		}else{
+                   	  			jp.error(data.msg);
+                   	  		}
+                   	  	})
+
+                   	});
+
+                   }
+               },
+		/*		onPostBody:function(){
+					window.rowProps = undefined;
+					_table_rowspan("#basicTable" , 1);
+					_table_rowspan("#basicTable" , 2);
+					_table_rowspan("#basicTable" , 3);
+					_table_rowspan("#basicTable" , 4);
+					_table_rowspan("#basicTable" , 5);
+					return true;
+				},*/
+               onClickRow: function(row, $el){
+               },
+               	onShowSearch: function () {
+			$("#search-collapse").slideToggle();
+		},
+               columns: [{
+		        checkbox: true
+
+		    }
+			,{
+		        field: 'projectCode',
+		        title: '项目编码',
+			    width: '100px',
+		        sortable: true,
+		        sortName: 'projectCode'
+		        ,formatter:function(value, row , index){
+			   if(value == null || value ==""){
+				   value = "-";
+			   }
+			   <c:choose>
+				   <c:when test="${fns:hasPermission('test:filing:approvalStage:edit')}">
+				      return "<a href='javascript:edit(\""+row.id+"\")'>"+value+"</a>";
+			      </c:when>
+				  <c:when test="${fns:hasPermission('test:filing:approvalStage:view')}">
+				      return "<a href='javascript:view(\""+row.id+"\")'>"+value+"</a>";
+			      </c:when>
+				  <c:otherwise>
+				      return value;
+			      </c:otherwise>
+			   </c:choose>
+
+		        }
+		    }
+			,{
+		        field: 'monomerCode',
+		        title: '单体编码',
+		        sortable: true,
+			   width: '100px',
+		        sortName: 'monomerCode'
+
+		    }
+			,{
+		        field: 'entryName',
+		        title: '项目名称',
+					   width: '100px',
+		        sortable: true,
+		        sortName: 'entryName'
+
+		    }
+			,{
+		        field: 'approvalNumber',
+		        title: '核准文号',
+					   width: '100px',
+		        sortable: true,
+		        sortName: 'approvalNumber'
+		    }
+			,{
+		        field: 'dateOfApproval',
+		        title: '核准日期',
+					   width: '100px',
+		        sortable: true,
+		        sortName: 'dateOfApproval'
+
+		    }
+				   ,{
+					   field: 'approvedAmount',
+					   title: '核准金额',
+					   width: '100px',
+					   sortable: true,
+					   sortName: 'approvedAmount'
+				   },{
+					   field: 'replyNo',
+					   title: '可研批复<br/>文号',
+					   width: '100px',
+					   sortable: true,
+					   sortName: 'replyNo'
+				   }
+				   ,{
+					   field: 'approvalDate',
+					   title: '可研批复<br/>日期',
+					   width: '100px',
+					   sortable: true,
+					   sortName: 'approvalDate'
+
+				   }
+				   ,{
+					   field: 'staticInvestment',
+					   title: '可研静态<br/>投资金额',
+					   width: '100px',
+					   sortable: true,
+					   sortName: 'staticInvestment'
+				   },{
+					   field: 'dynamicInvestment',
+					   title: '可研动态<br/>投资金额',
+					   width: '100px',
+					   sortable: true,
+					   sortName: 'dynamicInvestment'
+				   },{
+					   field: 'constructionScaleVA',
+					   title: '建设规模<br/>(变电容量)<br/>万伏安',
+					   width: '150px',
+					   sortable: true,
+					   sortName: 'constructionScaleVA'
+				   }
+				   ,{
+					   field: 'constructionScaleKM',
+					   title: '建设规模<br/>(线路长度)<br/>千米',
+					   width: '150px',
+					   sortable: true,
+					   sortName: 'constructionScaleKM'
+
+				   }
+				   ,{
+					   field: 'numberOf',
+					   title: '铁塔数量<br/>/钢管杆数量',
+					   width: '150px',
+					   sortable: true,
+					   sortName: 'numberOf'
+				   },{
+					   field: 'conductorType',
+					   title: '导线型号<br/>及双回否型号',
+					   width: '150px',
+					   sortable: true,
+					   sortName: 'conductorType'
+				   },{
+					   field: 'conductorLength',
+					   title: '导线型号<br/>及双回否长度',
+					   width: '150px',
+					   sortable: true,
+					   sortName: 'conductorLength'
+				   },{
+					   field: 'theSource',
+					   title: '变压器来源<br/>新购/利旧,<br/>主变来源的<br/>变电站',
+					   width: '150px',
+					   sortable: true,
+					   sortName: 'theSource'
+				   },{
+					   field: 'modularConstructionScheme',
+					   title: '模块化<br/>建设方案',
+					   width: '150px',
+					   sortable: true,
+					   sortName: 'modularConstructionScheme'
+				   },{
+					   field: 'descriptionOf',
+					   title: '工程难点<br/>描述',
+					   width: '150px',
+					   sortable: true,
+					   sortName: 'descriptionOf'
+				   },{
+					   field: 'milestoneStartDate',
+					   title: '里程碑<br/>开工日期',
+					   width: '150px',
+					   sortable: true,
+					   sortName: 'milestoneStartDate'
+				   },{
+					   field: 'milestoneCommissioningDate',
+					   title: '里程碑<br/>投产日期',
+					   width: '150px',
+					   sortable: true,
+					   sortName: 'milestoneCommissioningDate'
+				   },{
+					   field: 'startDate',
+					   title: '内控开工<br/>日期',
+					   width: '150px',
+					   sortable: true,
+					   sortName: 'startDate'
+				   },{
+					   field: 'internalControl',
+					   title: '内控投产<br/>日期',
+					   width: '150px',
+					   sortable: true,
+					   sortName: 'internalControl'
+				   },{
+					   field: 'earliestArrival',
+					   title: '主设备<br/>最早到货<br/>时间',
+					   width: '150px',
+					   sortable: true,
+					   sortName: 'earliestArrival'
+				   },{
+					   field: 'arrivalPlan',
+					   title: '线路塔材<br/>到货计划',
+					   width: '150px',
+					   sortable: true,
+					   sortName: 'arrivalPlan'
+				   }
+		     ],
+		onExpandRow: function (index, row, $detail) {
+			initSubTable(index, row, $detail);
+		}
+		});
+
+	//初始化子表格(无线循环)
+	initSubTable = function (index, row, $detail) {
+		var parentid = row.projectCode;
+		var cur_table = $detail.html('<table></table>').find('table');
+		$(cur_table).bootstrapTable({
+			url: '${ctx}/filing/earlyStage/detail',
+			method: 'post',
+			//类型json
+			dataType: "json",
+			contentType: "application/x-www-form-urlencoded",
+			queryParams : function(params) {
+				var searchParam = $("#searchForm").serializeJSON();
+				searchParam.pageNo = params.limit === undefined? "1" :params.offset/params.limit+1;
+				searchParam.pageSize = params.limit === undefined? -1 : params.limit;
+				searchParam.orderBy = params.sort === undefined? "" : params.sort+ " "+  params.order;
+				searchParam.projectCode = parentid;
+				return searchParam;
+			},
+			striped: true, //是否显示行间隔色
+			pagination: false,//显示分页
+			sidePagination: "server",
+			pageNumber:1,
+			pageSize: 10,
+			pageList: [10, 25],
+			columns: [{
+				field: 'projectCode',
+				title: '项目编码',
+				width: '100px',
+				sortable: true,
+				sortName: 'projectCode'
+				,formatter:function(value, row , index){
+					if(value == null || value ==""){
+						value = "-";
+					}
+				<c:choose>
+					<c:when test="${fns:hasPermission('test:filing:approvalStage:edit')}">
+						return "<a href='javascript:editChild(\""+row.id+"\")'>"+value+"</a>";
+					</c:when>
+					<c:otherwise>
+						return value;
+					</c:otherwise>
+				</c:choose>
+				}
+			}
+				,{
+					field: 'monomerCode',
+					title: '单体编码',
+					sortable: true,
+					width: '100px',
+					sortName: 'monomerCode'
+
+				}
+				,{
+					field: 'entryName',
+					title: '项目名称',
+					width: '100px',
+					sortable: true,
+					sortName: 'entryName'
+
+				}
+				,{
+					field: 'approvalNumber',
+					title: '核准文号',
+					width: '100px',
+					sortable: true,
+					sortName: 'approvalNumber'
+				}
+				,{
+					field: 'dateOfApproval',
+					title: '核准日期',
+					width: '100px',
+					sortable: true,
+					sortName: 'dateOfApproval'
+
+				}
+				,{
+					field: 'approvedAmount',
+					title: '核准金额',
+					width: '100px',
+					sortable: true,
+					sortName: 'approvedAmount'
+				},{
+					field: 'replyNo',
+					title: '可研批复文号',
+					width: '100px',
+					sortable: true,
+					sortName: 'replyNo'
+				}
+				,{
+					field: 'approvalDate',
+					title: '可研批复日期',
+					width: '100px',
+					sortable: true,
+					sortName: 'approvalDate'
+
+				}
+				,{
+					field: 'staticInvestment',
+					title: '可研静态态投资金额',
+					width: '100px',
+					sortable: true,
+					sortName: 'staticInvestment'
+				},{
+					field: 'dynamicInvestment',
+					title: '可研动态投资金额',
+					width: '100px',
+					sortable: true,
+					sortName: 'dynamicInvestment'
+				},{
+					field: 'constructionScaleVA',
+					title: '建设规模<br/>(变电容量)<br/>万伏安',
+					width: '150px',
+					sortable: true,
+					sortName: 'constructionScaleVA'
+				}
+				,{
+					field: 'constructionScaleKM',
+					title: '建设规模<br/>(线路长度)<br/>千米',
+					width: '150px',
+					sortable: true,
+					sortName: 'constructionScaleKM'
+
+				}
+				,{
+					field: 'numberOf',
+					title: '铁塔数量<br/>/钢管杆数量',
+					width: '150px',
+					sortable: true,
+					sortName: 'numberOf'
+				},{
+					field: 'conductorType',
+					title: '导线型号<br/>及双回否型号',
+					width: '150px',
+					sortable: true,
+					sortName: 'conductorType'
+				},{
+					field: 'conductorLength',
+					title: '导线型号<br/>及双回否长度',
+					width: '150px',
+					sortable: true,
+					sortName: 'conductorLength'
+				},{
+					field: 'theSource',
+					title: '变压器来源<br/>新购/利旧,<br/>主变来源的<br/>变电站',
+					width: '150px',
+					sortable: true,
+					sortName: 'theSource'
+				},{
+					field: 'modularConstructionScheme',
+					title: '模块化<br/>建设方案',
+					width: '150px',
+					sortable: true,
+					sortName: 'modularConstructionScheme'
+				},{
+					field: 'descriptionOf',
+					title: '工程难点<br/>描述',
+					width: '150px',
+					sortable: true,
+					sortName: 'descriptionOf'
+				},{
+					field: 'milestoneStartDate',
+					title: '里程碑<br/>开工日期',
+					width: '150px',
+					sortable: true,
+					sortName: 'milestoneStartDate'
+				},{
+					field: 'milestoneCommissioningDate',
+					title: '里程碑<br/>投产日期',
+					width: '150px',
+					sortable: true,
+					sortName: 'milestoneCommissioningDate'
+				},{
+					field: 'startDate',
+					title: '内控开工<br/>日期',
+					width: '150px',
+					sortable: true,
+					sortName: 'startDate'
+				},{
+					field: 'internalControl',
+					title: '内控投产<br/>日期',
+					width: '150px',
+					sortable: true,
+					sortName: 'internalControl'
+				},{
+					field: 'earliestArrival',
+					title: '主设备<br/>最早到货<br/>时间',
+					width: '150px',
+					sortable: true,
+					sortName: 'earliestArrival'
+				},{
+					field: 'arrivalPlan',
+					title: '线路塔材<br/>到货计划',
+					width: '150px',
+					sortable: true,
+					sortName: 'arrivalPlan'
+				}]
+		});
+	};
+
+		  
+	  if(navigator.userAgent.match(/(iPhone|iPod|Android|ios)/i)){//如果是移动端
+
+		 
+		  $('#basicTable').bootstrapTable("toggleView");
+		}
+	  
+	  $('#basicTable').on('check.bs.table uncheck.bs.table load-success.bs.table ' +
+                'check-all.bs.table uncheck-all.bs.table', function () {
+            $('#remove').prop('disabled', ! $('#basicTable').bootstrapTable('getSelections').length);
+            $('#view,#edit').prop('disabled', $('#basicTable').bootstrapTable('getSelections').length!=1);
+        });
+		  
+		$("#btnImport").click(function(){
+			jp.open({
+			    type: 2,
+                area: [500, 200],
+                auto: true,
+			    title:"导入数据",
+			    content: "${ctx}/tag/importExcel" ,
+			    btn: ['下载模板','确定', '关闭'],
+				btn1: function(index, layero){
+					  jp.downloadFile('${ctx}/filing/earlyStage/import/template');
+				  },
+			    btn2: function(index, layero){
+						var iframeWin = layero.find('iframe')[0]; //得到iframe页的窗口对象,执行iframe页的方法:iframeWin.method();
+						iframeWin.contentWindow.importExcel('${ctx}/filing/earlyStage/import', function (data) {
+							if(data.success){
+								jp.success(data.msg);
+								refresh();
+							}else{
+								jp.error(data.msg);
+							}
+                            jp.close(index);
+                        });//调用保存事件
+                    return false;
+				  },
+				 
+				  btn3: function(index){ 
+					  jp.close(index);
+	    	       }
+			}); 
+		});
+	  $("#export").click(function(){//导出Excel文件
+			jp.downloadFile('${ctx}/filing/earlyStage/export');
+	  });
+
+	$("#exportFiles").bind("click", function () {
+		$("#searchForm").attr("action","${ctx}/filing/filingImages/exportEarlyStage?ids="+ getIdSelections());
+		$("#searchForm").submit();
+		return true;
+	});
+
+	/*$("#exportFiles").click(function(){//导出Excel文件
+		jp.downloadFile('${ctx}/filing/earlyStage/exportFiles?ids=' + getIdSelections());
+	});*/
+
+	  $("#search").click("click", function() {// 绑定查询按扭
+		  $('#basicTable').bootstrapTable('refresh');
+		});
+
+	  $("#open").click(function () {
+		  $("#basicTable").bootstrapTable('expandAllRows');
+	  })
+
+		$("#close").click(function (row) {
+			$('#basicTable').bootstrapTable('refresh');
+		})
+
+	 $("#reset").click("click", function() {// 绑定查询按扭
+		  $("#searchForm  input").val("");
+		  $("#searchForm  select").val("");
+		   $("#searchForm  .select-item").html("");
+		  $('#basicTable').bootstrapTable('refresh');
+		});
+		
+				$('#beginInDate').datetimepicker({
+					 format: "YYYY-MM-DD HH:mm:ss"
+				});
+				$('#endInDate').datetimepicker({
+					 format: "YYYY-MM-DD HH:mm:ss"
+				});
+		
+	});
+		
+  function getIdSelections() {
+        return $.map($("#basicTable").bootstrapTable('getSelections'), function (row) {
+            return row.id
+        });
+    }
+  
+  function deleteAll(){
+
+		jp.confirm('确认要删除该核准阶段记录吗?', function(){
+			jp.loading();  	
+			jp.get("${ctx}/filing/earlyStage/deleteAll?ids=" + getIdSelections(), function(data){
+         	  		if(data.success){
+         	  			$('#basicTable').bootstrapTable('refresh');
+         	  			jp.success(data.msg);
+         	  		}else{
+         	  			jp.error(data.msg);
+         	  		}
+         	  	})
+          	   
+		})
+  }
+  
+    //刷新列表
+  function refresh() {
+      $('#basicTable').bootstrapTable('refresh');
+  }
+  function add(){
+	  jp.openSaveDialog('新增核准阶段', "${ctx}/filing/earlyStage/form",'1000px', '800px');
+  }
+  
+   function edit(id){//没有权限时,不显示确定按钮
+       if(id == undefined){
+	      id = getIdSelections();
+	}
+	jp.openSaveDialog('编辑核准阶段', "${ctx}/filing/earlyStage/form?id=" + id, '800px', '500px');
+  }
+
+	function editChild(id){//没有权限时,不显示确定按钮
+		if(id == undefined){
+			id = getIdSelections();
+		}
+		jp.openSaveDialog('编辑核准阶段', "${ctx}/filing/earlyStage/childForm?id=" + id, '800px', '500px');
+	}
+
+ function view(id){//没有权限时,不显示确定按钮
+      if(id == undefined){
+             id = getIdSelections();
+      }
+        jp.openViewDialog('查看核准阶段', "${ctx}/filing/earlyStage/form?id=" + id, '800px', '500px');
+ }
+
+
+	function addRow(list, idx, tpl, row){
+		$(list).append(Mustache.render(tpl, {
+			idx: idx, delBtn: true, row: row
+		}));
+	}
+			
+</script>
+
+

+ 87 - 0
src/main/webapp/webpage/modules/filing/earlyStage/earlyStageList.jsp

@@ -0,0 +1,87 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+<%@ include file="/webpage/include/taglib.jsp" %>
+<html>
+<head>
+    <title>项目前期阶段管理</title>
+    <meta http-equiv="Content-type" content="text/html; charset=utf-8">
+    <meta name="decorator" content="ani"/>
+    <%@ include file="/webpage/include/bootstraptable.jsp" %>
+    <%@include file="/webpage/include/treeview.jsp" %>
+    <%@include file="earlyStageList.js" %>
+    <style type="text/css">
+        .table {
+            table-layout: fixed;
+            word-break: break-all;
+            word-wrap: break-word;
+            text-align: center;
+        }
+
+        .table th, .table td {
+            text-align: center;
+            vertical-align: middle !important;
+        }
+    </style>
+</head>
+<body>
+<div class="wrapper wrapper-content">
+    <div class="panel panel-primary">
+        <div class="panel-heading">
+            <h3 class="panel-title">项目前期阶段信息列表</h3>
+        </div>
+        <div class="panel-body">
+            <!-- 搜索 -->
+            <div id="search-collapse" class="collapse">
+                <div class="accordion-inner">
+                    <form:form id="searchForm" modelAttribute="earlyStage"
+                               class="form form-horizontal well clearfix">
+                        <div class="col-xs-12 col-sm-6 col-md-4">
+                            <label class="label-item single-overflow pull-left" title="项目编码:">项目编码:</label>
+                            <form:input path="projectCode" htmlEscape="false" maxlength="257"  class=" form-control"/>
+                        </div>
+                        <div class="col-xs-12 col-sm-6 col-md-4">
+                            <div style="margin-top:26px">
+                                <a id="search" class="btn btn-primary btn-rounded  btn-bordered btn-sm"><i
+                                        class="fa fa-search"></i> 查询</a>
+                                <a id="reset" class="btn btn-primary btn-rounded  btn-bordered btn-sm"><i
+                                        class="fa fa-refresh"></i> 重置</a>
+                            </div>
+                        </div>
+                    </form:form>
+                </div>
+            </div>
+
+            <!-- 工具栏 -->
+            <div id="toolbar">
+                <button id="open" class="btn btn-primary" >
+                    <i class="glyphicon glyphicon-list"></i> 全部展开
+                </button>
+                <button id="close" class="btn btn-primary">
+                    <i class="glyphicon glyphicon-minus"></i> 全部折叠
+                </button>
+                <shiro:hasPermission name="test:filing:approvalStage:edit">
+                    <button id="edit" class="btn btn-success" disabled onclick="edit()">
+                        <i class="glyphicon glyphicon-edit"></i> 修改
+                    </button>
+                </shiro:hasPermission>
+                <shiro:hasPermission name="test:filing:approvalStage:import">
+                    <button id="btnImport" class="btn btn-info"><i class="fa fa-folder-open-o"></i> 导入</button>
+                </shiro:hasPermission>
+                <shiro:hasPermission name="test:filing:approvalStage:export">
+                    <button id="export" class="btn btn-warning">
+                        <i class="fa fa-file-excel-o"></i> 导出
+                    </button>
+                </shiro:hasPermission>
+                <shiro:hasPermission name="test:filing:approvalStage:export">
+                <button id="exportFiles" class="btn btn-warning">
+                    <i class="fa fa-file-excel-o"></i> 导出附件
+                </button>
+                </shiro:hasPermission>
+            </div>
+
+            <!-- 表格 -->
+            <table id="basicTable" data-toolbar="#toolbar"></table>
+        </div>
+    </div>
+</div>
+</body>
+</html>

+ 44 - 0
src/main/webapp/webpage/modules/filing/filingImages/filingImages.jsp

@@ -0,0 +1,44 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+<%@ include file="/webpage/include/taglib.jsp"%>
+<html>
+<head>
+	<title>上传文件页面</title>
+	<meta name="decorator" content="ani"/>
+	<script type="text/javascript">
+		function save() {
+		    let mdImg = $("#mdImg").val();
+			if (mdImg != '') {
+				jp.loading();
+				jp.post("${ctx}/filing/filingImages/save", $('#inputForm').serialize(), function (data) {
+					if (data.success) {
+						jp.getParent().refresh();
+						let dialogIndex = parent.layer.getFrameIndex(window.name); // 获取窗口索引
+						parent.layer.close(dialogIndex);
+						jp.success(data.msg)
+					} else {
+						jp.error(data.msg);
+					}
+				});
+			} else {
+				jp.error("请选择文件");
+			}
+        }
+	</script>
+</head>
+<body class="bg-white">
+		<form:form id="inputForm" modelAttribute="filingImages" class="form-horizontal">
+		<form:hidden path="projectCode"/>
+		<form:hidden path="purpose"/>
+		<table class="table table-bordered">
+			<tbody>
+				<tr>
+					<td class="width-15 active"><label class="pull-right"><font color="red">*</font>上传附件:</label></td>
+					<td class="width-35">
+						<sys:fileUpload  path="imgPath" fileNumLimit="50" fileSizeLimit="50"  value="${filingImages.imgPath}"  uploadPath="/filing"></sys:fileUpload>
+					</td>
+				</tr>
+			</tbody>
+		</table>
+	</form:form>
+</body>
+</html>

+ 213 - 0
src/main/webapp/webpage/modules/filing/projectOverview/projectOverviewForm.jsp

@@ -0,0 +1,213 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+<%@ include file="/webpage/include/taglib.jsp"%>
+<html>
+<head>
+	<title>可研阶段管理</title>
+	<meta name="decorator" content="ani"/>
+	<%@ include file="/webpage/include/bootstraptable.jsp" %>
+	<style type="text/css">
+		/* 下边两行是去掉input 输入框右边的上下箭头按钮*/
+		.deal::-webkit-inner-spin-button {
+			-webkit-appearance: none !important;
+		}
+		.deal::-webkit-outer-spin-button {
+			-webkit-appearance: none !important;
+		}
+		input[type="number"]{
+			-moz-appearance:textfield;
+		}
+	</style>
+	<script type="text/javascript">
+
+		$(document).ready(function() {
+	        $('#milestoneStartDate').datetimepicker({
+				 format: "YYYY-MM-DD"
+		    });
+			$('#milestoneCommissioningDate').datetimepicker({
+				format: "YYYY-MM-DD"
+			});
+			$('#startDate').datetimepicker({
+				format: "YYYY-MM-DD"
+			});
+			$('#internalControl').datetimepicker({
+				format: "YYYY-MM-DD"
+			});
+			$('#earliestArrival').datetimepicker({
+				format: "YYYY-MM-DD"
+			});
+			$('#arrivalPlan').datetimepicker({
+				format: "YYYY-MM-DD"
+			});
+		});
+
+		function save() {
+            var isValidate = jp.validateForm('#inputForm');//校验表单
+            if(!isValidate){
+                return false;
+			}else{
+                jp.loading();
+                jp.post("${ctx}/filing/projectOverview/save",$('#inputForm').serialize(),function(data){
+                    if(data.success){
+                        jp.getParent().refresh();
+                        var dialogIndex = parent.layer.getFrameIndex(window.name); // 获取窗口索引
+                        parent.layer.close(dialogIndex);
+                        jp.success(data.msg)
+
+                    }else{
+                        jp.error(data.msg);
+                    }
+                })
+			}
+
+        }
+
+		function noFue(val){
+			document.getElementById('constructionScaleVA').value = val >= 0 ? val : 0;
+		}
+
+		function noFue2(val){
+			document.getElementById('constructionScaleKM').value = val >= 0 ? val : 0;
+		}
+
+		function noFue3(val){
+			document.getElementById('numberOf').value = val >= 0 ? val : 0;
+		}
+
+
+
+	</script>
+</head>
+<body class="bg-white">
+		<form:form id="inputForm" modelAttribute="projectOverview" action="${ctx}/filing/projectOverview/save" method="post" class="form-horizontal">
+		<form:hidden path="id"/>
+		<table class="table table-bordered">
+		   <tbody>
+				<tr>
+					<td class="width-15 active"><label class="pull-right">项目编码:</label></td>
+					<td class="width-35">
+						<form:input path="projectCode" readonly="true" htmlEscape="false"  class="form-control"/>
+					</td>
+					<td class="width-15 active"><label class="pull-right">单体编码:</label></td>
+					<td class="width-35">
+						<form:input path="monomerCode" readonly="true" htmlEscape="false"  class="form-control"/>
+					</td>
+				</tr>
+				<tr>
+					<td class="width-15 active"><label class="pull-right">项目名称:</label></td>
+					<td class="width-35">
+						<form:input path="entryName" readonly="true" htmlEscape="false" class="form-control"/>
+					</td>
+					<td class="width-15 active"><label class="pull-right">建设规模(变电容量)万伏安:</label></td>
+					<td class="width-35">
+						<form:input type="number" onblur="noFue(this.value)" path="constructionScaleVA" htmlEscape="false" rows="4" class="form-control"/>
+					</td>
+				</tr>
+				<tr>
+					<td class="width-15 active"><label class="pull-right">建设规模(线路长度)千米:</label></td>
+					<td class="width-35">
+						<form:input type="number" onblur="noFue2(this.value)" path="constructionScaleKM" htmlEscape="false" rows="4" class="form-control"/>
+					</td>
+					<td class="width-15 active"><label class="pull-right">铁塔数量/钢管杆数量:</label></td>
+					<td class="width-35">
+						<form:input type="number" onblur="noFue3(this.value)" path="numberOf" htmlEscape="false" rows="4" class="form-control"/>
+					</td>
+				</tr>
+				<tr>
+					<td class="width-15 active"><label class="pull-right">导线型号及双回否型号:</label></td>
+					<td class="width-35">
+						<form:input path="conductorType" htmlEscape="false" class="form-control"/>
+					</td>
+					<td class="width-15 active"><label class="pull-right">导线型号及双回否长度:</label></td>
+					<td class="width-35">
+						<form:input path="conductorLength"  htmlEscape="false" class="form-control"/>
+					</td>
+				</tr>
+				<tr>
+					<td class="width-15 active"><label class="pull-right">变压器来源新购/利旧,主变来源的变电站:</label></td>
+					<td class="width-35">
+						<form:input path="theSource" htmlEscape="false" class="form-control"/>
+					</td>
+					<td class="width-15 active"><label class="pull-right">模块化建设方案:</label></td>
+					<td class="width-35">
+						<form:input path="modularConstructionScheme"  htmlEscape="false" class="form-control"/>
+					</td>
+				</tr>
+				<tr>
+					<td class="width-15 active"><label class="pull-right">工程难点描述:</label></td>
+					<td class="width-35">
+						<form:input path="descriptionOf"  htmlEscape="false" class="form-control"/>
+					</td>
+					<td class="width-15 active"><label class="pull-right">里程碑开工日期:</label></td>
+					<td class="width-35">
+						<div class='input-group form_datetime' id='milestoneStartDate'>
+							<input type='text'  name="milestoneStartDate" class="form-control"  value="<fmt:formatDate value="${projectOverview.milestoneStartDate}" pattern="yyyy-MM-dd"/>"/>
+							<span class="input-group-addon">
+			                        <span class="glyphicon glyphicon-calendar"></span>
+			                    </span>
+						</div>
+					</td>
+					</td>
+				</tr>
+				<tr>
+					<td class="width-15 active"><label class="pull-right">里程碑投产日期:</label></td>
+					<td class="width-35">
+						<div class='input-group form_datetime' id='milestoneCommissioningDate'>
+							<input type='text'  name="milestoneCommissioningDate" class="form-control"  value="<fmt:formatDate value="${projectOverview.milestoneCommissioningDate}" pattern="yyyy-MM-dd"/>"/>
+							<span class="input-group-addon">
+			                        <span class="glyphicon glyphicon-calendar"></span>
+			                    </span>
+						</div>
+					</td>
+					</td>
+					<td class="width-15 active"><label class="pull-right">内控开工日期:</label></td>
+					<td class="width-35">
+						<div class='input-group form_datetime' id='startDate'>
+							<input type='text'  name="startDate" class="form-control"  value="<fmt:formatDate value="${projectOverview.startDate}" pattern="yyyy-MM-dd"/>"/>
+							<span class="input-group-addon">
+			                        <span class="glyphicon glyphicon-calendar"></span>
+			                    </span>
+						</div>
+					</td>
+					</td>
+		  		</tr>
+
+				<tr>
+					<td class="width-15 active"><label class="pull-right">内控投产日期:</label></td>
+					<td class="width-35">
+						<div class='input-group form_datetime' id='internalControl'>
+							<input type='text'  name="internalControl" class="form-control"  value="<fmt:formatDate value="${projectOverview.internalControl}" pattern="yyyy-MM-dd"/>"/>
+							<span class="input-group-addon">
+			                        <span class="glyphicon glyphicon-calendar"></span>
+			                    </span>
+						</div>
+					</td>
+					</td>
+					<td class="width-15 active"><label class="pull-right">主设备最早到货时间:</label></td>
+					<td class="width-35">
+						<div class='input-group form_datetime' id='earliestArrival'>
+							<input type='text'  name="earliestArrival" class="form-control"  value="<fmt:formatDate value="${projectOverview.earliestArrival}" pattern="yyyy-MM-dd"/>"/>
+							<span class="input-group-addon">
+			                        <span class="glyphicon glyphicon-calendar"></span>
+			                    </span>
+						</div>
+					</td>
+					</td>
+				</tr>
+				<tr>
+					<td class="width-15 active"><label class="pull-right">线路塔材到货计划:</label></td>
+					<td class="width-35">
+						<div class='input-group form_datetime' id='arrivalPlan'>
+							<input type='text'  name="arrivalPlan" class="form-control"  value="<fmt:formatDate value="${projectOverview.arrivalPlan}" pattern="yyyy-MM-dd"/>"/>
+							<span class="input-group-addon">
+			                        <span class="glyphicon glyphicon-calendar"></span>
+			                    </span>
+						</div>
+					</td>
+					</td>
+				</tr>
+		 	</tbody>
+		</table>
+		</div>
+		</form:form>
+</body>
+</html>

+ 516 - 0
src/main/webapp/webpage/modules/filing/projectOverview/projectOverviewList.js

@@ -0,0 +1,516 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+<script>
+$(document).ready(function() {
+	$('#basicTable').bootstrapTable({
+		  //请求方法
+               method: 'post',
+               //类型json
+               dataType: "json",
+               contentType: "application/x-www-form-urlencoded",
+               //显示检索按钮
+	       showSearch: true,
+               //显示刷新按钮
+               showRefresh: true,
+               //显示切换手机试图按钮
+               showToggle: true,
+               //显示 内容列下拉框
+    	       showColumns: true,
+    	       //显示到处按钮
+    	       showExport: true,
+    	       //显示切换分页按钮
+    	       showPaginationSwitch: true,
+    	       //显示详情按钮
+    	       detailView: true,
+    	       	//显示详细内容函数
+	           // detailFormatter: "detailFormatter",
+    	       //最低显示2行
+    	       minimumCountColumns: 2,
+               //是否显示行间隔色
+               striped: true,
+               //是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*)
+               cache: false,
+               //是否显示分页(*)
+               pagination: true,
+                //排序方式
+               sortOrder: "asc",
+               //初始化加载第一页,默认第一页
+               pageNumber:1,
+               //每页的记录行数(*)
+               pageSize: 10,
+               //可供选择的每页的行数(*)
+               pageList: [10, 25, 50, 100],
+               //这个接口需要处理bootstrap table传递的固定参数,并返回特定格式的json数据
+               url: "${ctx}/filing/projectOverview/data",
+               //默认值为 'limit',传给服务端的参数为:limit, offset, search, sort, order Else
+               //queryParamsType:'',
+               ////查询参数,每次调用是会带上这个参数,可自定义
+               queryParams : function(params) {
+               	var searchParam = $("#searchForm").serializeJSON();
+               	searchParam.pageNo = params.limit === undefined? "1" :params.offset/params.limit+1;
+               	searchParam.pageSize = params.limit === undefined? -1 : params.limit;
+               	searchParam.orderBy = params.sort === undefined? "" : params.sort+ " "+  params.order;
+                   return searchParam;
+               },
+               //分页方式:client客户端分页,server服务端分页(*)
+               sidePagination: "server",
+               contextMenuTrigger:"right",//pc端 按右键弹出菜单
+               contextMenuTriggerMobile:"press",//手机端 弹出菜单,click:单击, press:长按。
+               contextMenu: '#context-menu',
+               onContextMenuItem: function(row, $el){
+                   if($el.data("item") == "edit"){
+                   		edit(row.id);
+                   }else if($el.data("item") == "view"){
+                       view(row.id);
+                   } else if($el.data("item") == "delete"){
+                        jp.confirm('确认要删除该核准阶段记录吗?', function(){
+                       	jp.loading();
+                       	jp.get("${ctx}/filing/projectOverview/delete?id="+row.id, function(data){
+                   	  		if(data.success){
+                   	  			$('#basicTable').bootstrapTable('refresh');
+                   	  			jp.success(data.msg);
+                   	  		}else{
+                   	  			jp.error(data.msg);
+                   	  		}
+                   	  	})
+
+                   	});
+
+                   }
+               },
+		/*		onPostBody:function(){
+					window.rowProps = undefined;
+					_table_rowspan("#basicTable" , 1);
+					_table_rowspan("#basicTable" , 2);
+					_table_rowspan("#basicTable" , 3);
+					_table_rowspan("#basicTable" , 4);
+					_table_rowspan("#basicTable" , 5);
+					return true;
+				},*/
+               onClickRow: function(row, $el){
+               },
+               	onShowSearch: function () {
+			$("#search-collapse").slideToggle();
+		},
+               columns: [{
+		        checkbox: true
+
+		    }
+			,{
+		        field: 'projectCode',
+		        title: '项目编码',
+			    width: '100px',
+		        sortable: true,
+		        sortName: 'projectCode'
+		        ,formatter:function(value, row , index){
+			   if(value == null || value ==""){
+				   value = "-";
+			   }
+			   <c:choose>
+				   <c:when test="${fns:hasPermission('test:filing:approvalStage:edit')}">
+				      return "<a href='javascript:edit(\""+row.id+"\")'>"+value+"</a>";
+			      </c:when>
+				  <c:when test="${fns:hasPermission('test:filing:approvalStage:view')}">
+				      return "<a href='javascript:view(\""+row.id+"\")'>"+value+"</a>";
+			      </c:when>
+				  <c:otherwise>
+				      return value;
+			      </c:otherwise>
+			   </c:choose>
+
+		        }
+		    }
+			,{
+		        field: 'monomerCode',
+		        title: '单体编码',
+		        sortable: true,
+			   width: '100px',
+		        sortName: 'monomerCode'
+
+		    }
+			,{
+		        field: 'entryName',
+		        title: '项目名称',
+					   width: '100px',
+		        sortable: true,
+		        sortName: 'entryName'
+
+		    }
+			,{
+		        field: 'constructionScaleVA',
+		        title: '建设规模<br/>(变电容量)<br/>万伏安',
+					   width: '150px',
+		        sortable: true,
+		        sortName: 'constructionScaleVA'
+		    }
+			,{
+		        field: 'constructionScaleKM',
+		        title: '建设规模<br/>(线路长度)<br/>千米',
+					   width: '150px',
+		        sortable: true,
+		        sortName: 'constructionScaleKM'
+
+		    }
+				   ,{
+					   field: 'numberOf',
+					   title: '铁塔数量<br/>/钢管杆数量',
+					   width: '150px',
+					   sortable: true,
+					   sortName: 'numberOf'
+				   },{
+					   field: 'conductorType',
+					   title: '导线型号<br/>及双回否型号',
+					   width: '150px',
+					   sortable: true,
+					   sortName: 'conductorType'
+				   },{
+					   field: 'conductorLength',
+					   title: '导线型号<br/>及双回否长度',
+					   width: '150px',
+					   sortable: true,
+					   sortName: 'conductorLength'
+				   },{
+					   field: 'theSource',
+					   title: '变压器来源<br/>新购/利旧,<br/>主变来源的<br/>变电站',
+					   width: '150px',
+					   sortable: true,
+					   sortName: 'theSource'
+				   },{
+					   field: 'modularConstructionScheme',
+					   title: '模块化<br/>建设方案',
+					   width: '150px',
+					   sortable: true,
+					   sortName: 'modularConstructionScheme'
+				   },{
+					   field: 'descriptionOf',
+					   title: '工程难点<br/>描述',
+					   width: '150px',
+					   sortable: true,
+					   sortName: 'descriptionOf'
+				   },{
+					   field: 'milestoneStartDate',
+					   title: '里程碑<br/>开工日期',
+					   width: '150px',
+					   sortable: true,
+					   sortName: 'milestoneStartDate'
+				   },{
+					   field: 'milestoneCommissioningDate',
+					   title: '里程碑<br/>投产日期',
+					   width: '150px',
+					   sortable: true,
+					   sortName: 'milestoneCommissioningDate'
+				   },{
+					   field: 'startDate',
+					   title: '内控开工<br/>日期',
+					   width: '150px',
+					   sortable: true,
+					   sortName: 'startDate'
+				   },{
+					   field: 'internalControl',
+					   title: '内控投产<br/>日期',
+					   width: '150px',
+					   sortable: true,
+					   sortName: 'internalControl'
+				   },{
+					   field: 'earliestArrival',
+					   title: '主设备<br/>最早到货<br/>时间',
+					   width: '150px',
+					   sortable: true,
+					   sortName: 'earliestArrival'
+				   },{
+					   field: 'arrivalPlan',
+					   title: '线路塔材<br/>到货计划',
+					   width: '150px',
+					   sortable: true,
+					   sortName: 'arrivalPlan'
+				   }
+		     ],
+		onExpandRow: function (index, row, $detail) {
+			initSubTable(index, row, $detail);
+		}
+		});
+
+	//初始化子表格(无线循环)
+	initSubTable = function (index, row, $detail) {
+		var parentid = row.projectCode;
+		var cur_table = $detail.html('<table></table>').find('table');
+		$(cur_table).bootstrapTable({
+			url: '${ctx}/filing/projectOverview/detail',
+			method: 'post',
+			//类型json
+			dataType: "json",
+			contentType: "application/x-www-form-urlencoded",
+			queryParams : function(params) {
+				var searchParam = $("#searchForm").serializeJSON();
+				searchParam.pageNo = params.limit === undefined? "1" :params.offset/params.limit+1;
+				searchParam.pageSize = params.limit === undefined? -1 : params.limit;
+				searchParam.orderBy = params.sort === undefined? "" : params.sort+ " "+  params.order;
+				searchParam.projectCode = parentid;
+				return searchParam;
+			},
+			striped: true, //是否显示行间隔色
+			pagination: false,//显示分页
+			sidePagination: "server",
+			pageNumber:1,
+			pageSize: 10,
+			pageList: [10, 25],
+			columns: [{
+				field: 'projectCode',
+				title: '项目编码',
+				width: '164px',
+				formatter:function(value, row , index){
+					if(value == null || value ==""){
+						value = "-";
+					}
+				<c:choose>
+					<c:when test="${fns:hasPermission('test:filing:approvalStage:edit')}">
+					return "<a href='javascript:edit(\""+row.id+"\")'>"+value+"</a>";
+				</c:when>
+					<c:otherwise>
+					return value;
+				</c:otherwise>
+					</c:choose>
+
+				}
+			}, {
+				field: 'monomerCode',
+				title: '单体编码',
+				width: '100px'
+			}, {
+				field: 'entryName',
+				title: '项目名称',
+				width: '100px',
+			},{
+				field: 'constructionScaleVA',
+				title: '建设规模<br/>(变电容量)<br/>万伏安',
+				width: '150px',
+				sortable: true,
+				sortName: 'constructionScaleVA'
+			}
+				,{
+					field: 'constructionScaleKM',
+					title: '建设规模<br/>(线路长度)<br/>千米',
+					width: '150px',
+					sortable: true,
+					sortName: 'constructionScaleKM'
+
+				}
+				,{
+					field: 'numberOf',
+					title: '铁塔数量<br/>/钢管杆数量',
+					width: '150px',
+					sortable: true,
+					sortName: 'numberOf'
+				},{
+					field: 'conductorType',
+					title: '导线型号<br/>及双回否型号',
+					width: '150px',
+					sortable: true,
+					sortName: 'conductorType'
+				},{
+					field: 'conductorLength',
+					title: '导线型号<br/>及双回否长度',
+					width: '150px',
+					sortable: true,
+					sortName: 'conductorLength'
+				},{
+					field: 'theSource',
+					title: '变压器来源<br/>新购/利旧,<br/>主变来源的<br/>变电站',
+					width: '150px',
+					sortable: true,
+					sortName: 'theSource'
+				},{
+					field: 'modularConstructionScheme',
+					title: '模块化<br/>建设方案',
+					width: '150px',
+					sortable: true,
+					sortName: 'modularConstructionScheme'
+				},{
+					field: 'descriptionOf',
+					title: '工程难点<br/>描述',
+					width: '150px',
+					sortable: true,
+					sortName: 'descriptionOf'
+				},{
+					field: 'milestoneStartDate',
+					title: '里程碑<br/>开工日期',
+					width: '150px',
+					sortable: true,
+					sortName: 'milestoneStartDate'
+				},{
+					field: 'milestoneCommissioningDate',
+					title: '里程碑<br/>投产日期',
+					width: '150px',
+					sortable: true,
+					sortName: 'milestoneCommissioningDate'
+				},{
+					field: 'startDate',
+					title: '内控开工<br/>日期',
+					width: '150px',
+					sortable: true,
+					sortName: 'startDate'
+				},{
+					field: 'internalControl',
+					title: '内控投产<br/>日期',
+					width: '150px',
+					sortable: true,
+					sortName: 'internalControl'
+				},{
+					field: 'earliestArrival',
+					title: '主设备<br/>最早到货<br/>时间',
+					width: '150px',
+					sortable: true,
+					sortName: 'earliestArrival'
+				},{
+					field: 'arrivalPlan',
+					title: '线路塔材<br/>到货计划',
+					width: '150px',
+					sortable: true,
+					sortName: 'arrivalPlan'
+				}]
+		});
+	};
+
+		  
+	  if(navigator.userAgent.match(/(iPhone|iPod|Android|ios)/i)){//如果是移动端
+
+		 
+		  $('#basicTable').bootstrapTable("toggleView");
+		}
+	  
+	  $('#basicTable').on('check.bs.table uncheck.bs.table load-success.bs.table ' +
+                'check-all.bs.table uncheck-all.bs.table', function () {
+            $('#remove').prop('disabled', ! $('#basicTable').bootstrapTable('getSelections').length);
+            $('#view,#edit').prop('disabled', $('#basicTable').bootstrapTable('getSelections').length!=1);
+        });
+		  
+		$("#btnImport").click(function(){
+			jp.open({
+			    type: 2,
+                area: [500, 200],
+                auto: true,
+			    title:"导入数据",
+			    content: "${ctx}/tag/importExcel" ,
+			    btn: ['下载模板','确定', '关闭'],
+				btn1: function(index, layero){
+					  jp.downloadFile('${ctx}/filing/projectOverview/import/template');
+				  },
+			    btn2: function(index, layero){
+						var iframeWin = layero.find('iframe')[0]; //得到iframe页的窗口对象,执行iframe页的方法:iframeWin.method();
+						iframeWin.contentWindow.importExcel('${ctx}/filing/projectOverview/import', function (data) {
+							if(data.success){
+								jp.success(data.msg);
+								refresh();
+							}else{
+								jp.error(data.msg);
+							}
+                            jp.close(index);
+                        });//调用保存事件
+                    return false;
+				  },
+				 
+				  btn3: function(index){ 
+					  jp.close(index);
+	    	       }
+			}); 
+		});
+	  $("#export").click(function(){//导出Excel文件
+			jp.downloadFile('${ctx}/filing/projectOverview/export');
+	  });
+
+	$("#exportFiles").bind("click", function () {
+		$("#searchForm").attr("action","${ctx}/filing/filingImages/exportStudy?ids="+ getIdSelections());
+		$("#searchForm").submit();
+		return true;
+	});
+
+	  $("#search").click("click", function() {// 绑定查询按扭
+		  $('#basicTable').bootstrapTable('refresh');
+		});
+
+	  $("#open").click(function () {
+		  $("#basicTable").bootstrapTable('expandAllRows');
+	  })
+
+		$("#close").click(function (row) {
+			$('#basicTable').bootstrapTable('refresh');
+		})
+
+	 $("#reset").click("click", function() {// 绑定查询按扭
+		  $("#searchForm  input").val("");
+		  $("#searchForm  select").val("");
+		   $("#searchForm  .select-item").html("");
+		  $('#basicTable').bootstrapTable('refresh');
+		});
+		
+				$('#beginInDate').datetimepicker({
+					 format: "YYYY-MM-DD HH:mm:ss"
+				});
+				$('#endInDate').datetimepicker({
+					 format: "YYYY-MM-DD HH:mm:ss"
+				});
+		
+	});
+		
+  function getIdSelections() {
+        return $.map($("#basicTable").bootstrapTable('getSelections'), function (row) {
+            return row.id
+        });
+    }
+  
+  function deleteAll(){
+
+		jp.confirm('确认要删除该核准阶段记录吗?', function(){
+			jp.loading();  	
+			jp.get("${ctx}/filing/projectOverview/deleteAll?ids=" + getIdSelections(), function(data){
+         	  		if(data.success){
+         	  			$('#basicTable').bootstrapTable('refresh');
+         	  			jp.success(data.msg);
+         	  		}else{
+         	  			jp.error(data.msg);
+         	  		}
+         	  	})
+          	   
+		})
+  }
+  
+    //刷新列表
+  function refresh() {
+      $('#basicTable').bootstrapTable('refresh');
+  }
+  function add(){
+	  jp.openSaveDialog('新增核准阶段', "${ctx}/filing/projectOverview/form",'1000px', '800px');
+  }
+  
+   function edit(id){//没有权限时,不显示确定按钮
+       if(id == undefined){
+	      id = getIdSelections();
+	}
+	jp.openSaveDialog('编辑核准阶段', "${ctx}/filing/projectOverview/form?id=" + id, '800px', '500px');
+  }
+
+  //editChild
+
+function editChild(id){//没有权限时,不显示确定按钮
+	if(id == undefined){
+		id = getIdSelections();
+	}
+	jp.openSaveDialog('编辑核准阶段', "${ctx}/filing/projectOverview/childForm?id=" + id, '800px', '500px');
+}
+
+ function view(id){//没有权限时,不显示确定按钮
+      if(id == undefined){
+             id = getIdSelections();
+      }
+        jp.openViewDialog('查看核准阶段', "${ctx}/filing/projectOverview/form?id=" + id, '800px', '500px');
+ }
+
+
+	function addRow(list, idx, tpl, row){
+		$(list).append(Mustache.render(tpl, {
+			idx: idx, delBtn: true, row: row
+		}));
+	}
+			
+</script>
+
+

+ 82 - 0
src/main/webapp/webpage/modules/filing/projectOverview/projectOverviewList.jsp

@@ -0,0 +1,82 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+<%@ include file="/webpage/include/taglib.jsp" %>
+<html>
+<head>
+    <title>可研阶段管理</title>
+    <meta http-equiv="Content-type" content="text/html; charset=utf-8">
+    <meta name="decorator" content="ani"/>
+    <%@ include file="/webpage/include/bootstraptable.jsp" %>
+    <%@include file="/webpage/include/treeview.jsp" %>
+    <%@include file="projectOverviewList.js" %>
+    <style type="text/css">
+        .table {
+            table-layout: fixed;
+            word-break: break-all;
+            word-wrap: break-word;
+            text-align: center;
+        }
+
+        .table th, .table td {
+            text-align: center;
+            vertical-align: middle !important;
+        }
+    </style>
+</head>
+<body>
+<div class="wrapper wrapper-content">
+    <div class="panel panel-primary">
+        <div class="panel-heading">
+            <h3 class="panel-title">基础信息列表</h3>
+        </div>
+        <div class="panel-body">
+            <!-- 搜索 -->
+            <div id="search-collapse" class="collapse">
+                <div class="accordion-inner">
+                    <form:form id="searchForm" modelAttribute="projectOverview"
+                               class="form form-horizontal well clearfix">
+                        <div class="col-xs-12 col-sm-6 col-md-4">
+                            <label class="label-item single-overflow pull-left" title="项目编码:">项目编码:</label>
+                            <form:input path="projectCode" htmlEscape="false" maxlength="257"  class=" form-control"/>
+                        </div>
+                        <div class="col-xs-12 col-sm-6 col-md-4">
+                            <div style="margin-top:26px">
+                                <a id="search" class="btn btn-primary btn-rounded  btn-bordered btn-sm"><i
+                                        class="fa fa-search"></i> 查询</a>
+                                <a id="reset" class="btn btn-primary btn-rounded  btn-bordered btn-sm"><i
+                                        class="fa fa-refresh"></i> 重置</a>
+                            </div>
+                        </div>
+                    </form:form>
+                </div>
+            </div>
+
+            <!-- 工具栏 -->
+            <div id="toolbar">
+                <button id="open" class="btn btn-primary" >
+                    <i class="glyphicon glyphicon-list"></i> 全部展开
+                </button>
+                <button id="close" class="btn btn-primary">
+                    <i class="glyphicon glyphicon-minus"></i> 全部折叠
+                </button>
+                <shiro:hasPermission name="test:filing:studyStage:edit">
+                    <button id="edit" class="btn btn-success" disabled onclick="edit()">
+                        <i class="glyphicon glyphicon-edit"></i> 修改
+                    </button>
+                </shiro:hasPermission>
+                <shiro:hasPermission name="test:filing:studyStage:import">
+                    <button id="btnImport" class="btn btn-info"><i class="fa fa-folder-open-o"></i> 导入</button>
+                </shiro:hasPermission>
+                <shiro:hasPermission name="test:filing:studyStage:export">
+                    <button id="export" class="btn btn-warning">
+                        <i class="fa fa-file-excel-o"></i> 导出
+                    </button>
+                </shiro:hasPermission>
+            </div>
+
+            <!-- 表格 -->
+            <table id="basicTable" data-toolbar="#toolbar"></table>
+        </div>
+    </div>
+</div>
+</body>
+</html>

+ 102 - 0
src/main/webapp/webpage/modules/filing/studyStage/studyStageChildForm.jsp

@@ -0,0 +1,102 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+<%@ include file="/webpage/include/taglib.jsp"%>
+<html>
+<head>
+	<title>可研阶段管理</title>
+	<meta name="decorator" content="ani"/>
+	<%@include file="studyStageForm.js"%>
+	<%@ include file="/webpage/include/bootstraptable.jsp" %>
+	<style type="text/css">
+		/* 下边两行是去掉input 输入框右边的上下箭头按钮*/
+		.deal::-webkit-inner-spin-button {
+			-webkit-appearance: none !important;
+		}
+		.deal::-webkit-outer-spin-button {
+			-webkit-appearance: none !important;
+		}
+		input[type="number"]{
+			-moz-appearance:textfield;
+		}
+	</style>
+	<script type="text/javascript">
+
+		$(document).ready(function() {
+	        $('#dateOfApproval').datetimepicker({
+				 format: "YYYY-MM-DD"
+		    });
+		});
+
+		function save() {
+            var isValidate = jp.validateForm('#inputForm');//校验表单
+            if(!isValidate){
+                return false;
+			}else{
+                jp.loading();
+                jp.post("${ctx}/filing/studyStage/save",$('#inputForm').serialize(),function(data){
+                    if(data.success){
+                        jp.getParent().refresh();
+                        var dialogIndex = parent.layer.getFrameIndex(window.name); // 获取窗口索引
+                        parent.layer.close(dialogIndex);
+                        jp.success(data.msg)
+
+                    }else{
+                        jp.error(data.msg);
+                    }
+                })
+			}
+
+        }
+
+		function noFue(val){
+			document.getElementById('approvedAmount').value = val >= 0 ? val : 0;
+		}
+
+		function noFue2(val){
+			document.getElementById('dynamicInvestment').value = val >= 0 ? val : 0;
+		}
+
+	</script>
+</head>
+<body class="bg-white">
+		<form:form id="inputForm" modelAttribute="studyStage" action="${ctx}/filing/studyStage/save" method="post" class="form-horizontal">
+		<form:hidden path="id"/>
+		<table class="table table-bordered">
+		   <tbody>
+				<tr>
+					<td class="width-15 active"><label class="pull-right">项目编码:</label></td>
+					<td class="width-35">
+						<form:input path="projectCode" readonly="true" htmlEscape="false"  class="form-control"/>
+					</td>
+					<td class="width-15 active"><label class="pull-right">单体编码:</label></td>
+					<td class="width-35">
+						<form:input path="monomerCode" readonly="true" htmlEscape="false"  class="form-control"/>
+					</td>
+				</tr>
+				<tr>
+					<td class="width-15 active"><label class="pull-right">项目名称:</label></td>
+					<td class="width-35">
+						<form:input path="entryName" readonly="true" htmlEscape="false" class="form-control"/>
+					</td>
+					<td class="width-15 active"><label class="pull-right">可研静态态投资金额:</label></td>
+					<td class="width-35">
+						<form:input type="number" onblur="noFue(this.value)" path="staticInvestment" htmlEscape="false" rows="4" class="form-control"/>
+					</td>
+		  		</tr>
+
+				<tr>
+					<td class="width-15 active"><label class="pull-right">可研动态投资金额:</label></td>
+					<td class="width-35">
+						<form:input type="number" onblur="noFue2(this.value)" path="dynamicInvestment" htmlEscape="false" rows="4" class="form-control"/>
+					</td>
+					<td class="width-15 active"><label class="pull-right">可研附件:</label></td>
+					<td class="width-35">
+						<sys:fileUpload path="studyAppendix"  value="${studyStage.studyAppendix}" type="*" uploadPath="/photo"  readonly="false"/></td>
+					</td>
+				</tr>
+		 	</tbody>
+		</table>
+		</div>
+		</form:form>
+
+</body>
+</html>

+ 156 - 0
src/main/webapp/webpage/modules/filing/studyStage/studyStageForm.js

@@ -0,0 +1,156 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+<script>
+$(document).ready(function() {
+	var projectCode = $("#projectCode").val();
+	// alert(procInsId);
+	$('#engineeringTable').bootstrapTable({
+		//请求方法
+		method: 'post',
+		//类型json
+		dataType: "json",
+		contentType: "application/x-www-form-urlencoded",
+		//显示检索按钮
+		showSearch: false,
+		//显示刷新按钮
+		showRefresh: false,
+		//显示切换手机试图按钮
+		showToggle: false,
+		//显示 内容列下拉框
+		showColumns: false,
+		//显示到处按钮
+		showExport: false,
+		//显示切换分页按钮
+		showPaginationSwitch: false,
+		//最低显示2行
+		minimumCountColumns: 2,
+		//是否显示行间隔色
+		striped: true,
+		//是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*)
+		cache: false,
+		//是否显示分页(*)
+		pagination: true,
+		//排序方式
+		sortOrder: "asc",
+		//初始化加载第一页,默认第一页
+		pageNumber:1,
+		//每页的记录行数(*)
+		pageSize: 10,
+		//可供选择的每页的行数(*)
+		pageList: [10, 25, 50, 100],
+		//这个接口需要处理bootstrap table传递的固定参数,并返回特定格式的json数据
+		url: "${ctx}/filing/filingImages/data?projectCode="+projectCode+"&purpose=可研附件",
+		//默认值为 'limit',传给服务端的参数为:limit, offset, search, sort, order Else
+		//queryParamsType:'',
+		////查询参数,每次调用是会带上这个参数,可自定义
+		queryParams : function(params) {
+			var searchParam = $("#searchForm").serializeJSON();
+			searchParam.pageNo = params.limit === undefined? "1" :params.offset/params.limit+1;
+			searchParam.pageSize = params.limit === undefined? -1 : params.limit;
+			searchParam.orderBy = params.sort === undefined? "" : params.sort+ " "+  params.order;
+			return searchParam;
+		},
+		//分页方式:client客户端分页,server服务端分页(*)
+		sidePagination: "server",
+		contextMenuTrigger:"right",//pc端 按右键弹出菜单
+		contextMenuTriggerMobile:"press",//手机端 弹出菜单,click:单击, press:长按。
+		contextMenu: '#context-menu',
+		onContextMenuItem: function(row, $el){
+			if($el.data("item") == "edit"){
+				edit(row.id);
+			}else if($el.data("item") == "view"){
+				view(row.id);
+			} else if($el.data("item") == "delete"){
+				jp.confirm('确认要删除该图片管理记录吗?', function(){
+					jp.loading();
+					jp.get("${ctx}/test/pic/testPic/delete?id="+row.id, function(data){
+						if(data.success){
+							$('#testPicTable').bootstrapTable('refresh');
+							jp.success(data.msg);
+						}else{
+							jp.error(data.msg);
+						}
+					})
+
+				});
+
+			}
+		},
+
+		onClickRow: function(row, $el){
+		},
+		onShowSearch: function () {
+			$("#search-collapse").slideToggle();
+		},
+		columns: [{
+			checkbox: true
+		}
+			, {
+				field: 'imgPath',
+				title: '文件路径',
+				sortable: true,
+				sortName: 'imgPath',
+				formatter:function(value, row , index){
+					var valueArray = value.split("|");
+					var labelArray = [];
+					for(var i =0 ; i<valueArray.length; i++){
+						if(!/\.(gif|jpg|jpeg|png|GIF|JPG|PNG)$/.test(valueArray[i]))
+						{
+							labelArray[i] = "<a href=\""+valueArray[i]+"\" url=\""+valueArray[i]+"\" target=\"_blank\">"+decodeURIComponent(valueArray[i].substring(valueArray[i].lastIndexOf("/")+1))+"</a>"
+						}else{
+							labelArray[i] = '<img   onclick="jp.showPic(\''+valueArray[i]+'\')"'+' height="50px" src="'+valueArray[i]+'">';
+						}
+					}
+					return labelArray.join(" ");
+				}
+
+			},{
+				field: 'purpose',
+				title: '上传用途',
+				sortable: true,
+				sortName: 'purpose',
+			}]
+	});
+
+	$('#engineeringTable').on('check.bs.table uncheck.bs.table load-success.bs.table ' +
+		'check-all.bs.table uncheck-all.bs.table', function () {
+		$('#remove').prop('disabled', ! $('#engineeringTable').bootstrapTable('getSelections').length);
+		$('#view,#edit').prop('disabled', $('#engineeringTable').bootstrapTable('getSelections').length!=1);
+	});
+
+
+
+})
+
+function getIdSelections() {
+	return $.map($("#engineeringTable").bootstrapTable('getSelections'), function (row) {
+		return row.id
+	});
+}
+
+function deleteAll(){
+	jp.confirm('确认要删除该图片管理记录吗?', function(){
+		jp.loading();
+		console.log(getIdSelections());
+		jp.get("${ctx}/filing/filingImages/deleteAll?ids=" + getIdSelections(), function(data){
+			if(data.success){
+				$('#engineeringTable').bootstrapTable('refresh');
+				jp.success(data.msg);
+			}else{
+				jp.error(data.msg);
+			}
+		})
+
+	})
+}
+
+function refresh(){
+	$('#engineeringTable').bootstrapTable('refresh');
+}
+
+function add(){//没有权限时,不显示确定按钮
+	var projectCode = $('#projectCode').val();
+	jp.openSaveDialog('模块清单', "${ctx}/filing/filingImages/form?projectCode="+projectCode+"&purpose=可研附件", '800px', '500px');
+}
+
+
+</script>

+ 117 - 0
src/main/webapp/webpage/modules/filing/studyStage/studyStageForm.jsp

@@ -0,0 +1,117 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+<%@ include file="/webpage/include/taglib.jsp"%>
+<html>
+<head>
+	<title>可研阶段管理</title>
+	<meta name="decorator" content="ani"/>
+	<%@include file="studyStageForm.js"%>
+	<%@ include file="/webpage/include/bootstraptable.jsp" %>
+	<style type="text/css">
+		/* 下边两行是去掉input 输入框右边的上下箭头按钮*/
+		.deal::-webkit-inner-spin-button {
+			-webkit-appearance: none !important;
+		}
+		.deal::-webkit-outer-spin-button {
+			-webkit-appearance: none !important;
+		}
+		input[type="number"]{
+			-moz-appearance:textfield;
+		}
+	</style>
+	<script type="text/javascript">
+
+		$(document).ready(function() {
+	        $('#approvalDate').datetimepicker({
+				 format: "YYYY-MM-DD"
+		    });
+		});
+
+		function save() {
+            var isValidate = jp.validateForm('#inputForm');//校验表单
+            if(!isValidate){
+                return false;
+			}else{
+                jp.loading();
+                jp.post("${ctx}/filing/studyStage/save",$('#inputForm').serialize(),function(data){
+                    if(data.success){
+                        jp.getParent().refresh();
+                        var dialogIndex = parent.layer.getFrameIndex(window.name); // 获取窗口索引
+                        parent.layer.close(dialogIndex);
+                        jp.success(data.msg)
+
+                    }else{
+                        jp.error(data.msg);
+                    }
+                })
+			}
+
+        }
+
+		function noFue(val){
+			document.getElementById('staticInvestment').value = val >= 0 ? val : 0;
+		}
+
+		function noFue2(val){
+			document.getElementById('dynamicInvestment').value = val >= 0 ? val : 0;
+		}
+
+	</script>
+</head>
+<body class="bg-white">
+		<form:form id="inputForm" modelAttribute="studyStage" action="${ctx}/filing/studyStage/save" method="post" class="form-horizontal">
+		<form:hidden path="id"/>
+		<table class="table table-bordered">
+		   <tbody>
+				<tr>
+					<td class="width-15 active"><label class="pull-right">项目编码:</label></td>
+					<td class="width-35">
+						<form:input path="projectCode" readonly="true" htmlEscape="false"  class="form-control"/>
+					</td>
+					<td class="width-15 active"><label class="pull-right">单体编码:</label></td>
+					<td class="width-35">
+						<form:input path="monomerCode" readonly="true" htmlEscape="false"  class="form-control"/>
+					</td>
+				</tr>
+				<tr>
+					<td class="width-15 active"><label class="pull-right">项目名称:</label></td>
+					<td class="width-35">
+						<form:input path="entryName" readonly="true" htmlEscape="false" class="form-control"/>
+					</td>
+					<td class="width-15 active"><label class="pull-right">可研批复文号:</label></td>
+					<td class="width-35">
+						<form:input path="replyNo" htmlEscape="false" class="form-control"/>
+					</td>
+				</tr>
+				<tr>
+					<td class="width-15 active"><label class="pull-right">可研批复日期:</label></td>
+					<td class="width-35">
+						<div class='input-group form_datetime' id='approvalDate'>
+							<input type='text'  name="approvalDate" class="form-control"  value="<fmt:formatDate value="${studyStage.approvalDate}" pattern="yyyy-MM-dd"/>"/>
+							<span class="input-group-addon">
+			                        <span class="glyphicon glyphicon-calendar"></span>
+			                    </span>
+						</div>
+					</td>
+					</td>
+					<td class="width-15 active"><label class="pull-right">可研静态态投资金额:</label></td>
+					<td class="width-35">
+						<form:input type="number" onblur="noFue(this.value)" path="staticInvestment" htmlEscape="false" rows="4" class="form-control"/>
+					</td>
+		  		</tr>
+
+				<tr>
+					<td class="width-15 active"><label class="pull-right">可研动态投资金额:</label></td>
+					<td class="width-35">
+						<form:input type="number" onblur="noFue2(this.value)" path="dynamicInvestment" htmlEscape="false" rows="4" class="form-control"/>
+					</td>
+					<td class="width-15 active"><label class="pull-right">可研附件:</label></td>
+					<td class="width-35">
+						<sys:fileUpload path="studyAppendix"  value="${studyStage.studyAppendix}" type="*" uploadPath="/photo"  readonly="false"/></td>
+					</td>
+				</tr>
+		 	</tbody>
+		</table>
+		</div>
+		</form:form>
+</body>
+</html>

+ 396 - 0
src/main/webapp/webpage/modules/filing/studyStage/studyStageList.js

@@ -0,0 +1,396 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+<script>
+$(document).ready(function() {
+	$('#basicTable').bootstrapTable({
+		  //请求方法
+               method: 'post',
+               //类型json
+               dataType: "json",
+               contentType: "application/x-www-form-urlencoded",
+               //显示检索按钮
+	       showSearch: true,
+               //显示刷新按钮
+               showRefresh: true,
+               //显示切换手机试图按钮
+               showToggle: true,
+               //显示 内容列下拉框
+    	       showColumns: true,
+    	       //显示到处按钮
+    	       showExport: true,
+    	       //显示切换分页按钮
+    	       showPaginationSwitch: true,
+    	       //显示详情按钮
+    	       detailView: true,
+    	       	//显示详细内容函数
+	           // detailFormatter: "detailFormatter",
+    	       //最低显示2行
+    	       minimumCountColumns: 2,
+               //是否显示行间隔色
+               striped: true,
+               //是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*)
+               cache: false,
+               //是否显示分页(*)
+               pagination: true,
+                //排序方式
+               sortOrder: "asc",
+               //初始化加载第一页,默认第一页
+               pageNumber:1,
+               //每页的记录行数(*)
+               pageSize: 10,
+               //可供选择的每页的行数(*)
+               pageList: [10, 25, 50, 100],
+               //这个接口需要处理bootstrap table传递的固定参数,并返回特定格式的json数据
+               url: "${ctx}/filing/studyStage/data",
+               //默认值为 'limit',传给服务端的参数为:limit, offset, search, sort, order Else
+               //queryParamsType:'',
+               ////查询参数,每次调用是会带上这个参数,可自定义
+               queryParams : function(params) {
+               	var searchParam = $("#searchForm").serializeJSON();
+               	searchParam.pageNo = params.limit === undefined? "1" :params.offset/params.limit+1;
+               	searchParam.pageSize = params.limit === undefined? -1 : params.limit;
+               	searchParam.orderBy = params.sort === undefined? "" : params.sort+ " "+  params.order;
+                   return searchParam;
+               },
+               //分页方式:client客户端分页,server服务端分页(*)
+               sidePagination: "server",
+               contextMenuTrigger:"right",//pc端 按右键弹出菜单
+               contextMenuTriggerMobile:"press",//手机端 弹出菜单,click:单击, press:长按。
+               contextMenu: '#context-menu',
+               onContextMenuItem: function(row, $el){
+                   if($el.data("item") == "edit"){
+                   		edit(row.id);
+                   }else if($el.data("item") == "view"){
+                       view(row.id);
+                   } else if($el.data("item") == "delete"){
+                        jp.confirm('确认要删除该核准阶段记录吗?', function(){
+                       	jp.loading();
+                       	jp.get("${ctx}/filing/studyStage/delete?id="+row.id, function(data){
+                   	  		if(data.success){
+                   	  			$('#basicTable').bootstrapTable('refresh');
+                   	  			jp.success(data.msg);
+                   	  		}else{
+                   	  			jp.error(data.msg);
+                   	  		}
+                   	  	})
+
+                   	});
+
+                   }
+               },
+		/*		onPostBody:function(){
+					window.rowProps = undefined;
+					_table_rowspan("#basicTable" , 1);
+					_table_rowspan("#basicTable" , 2);
+					_table_rowspan("#basicTable" , 3);
+					_table_rowspan("#basicTable" , 4);
+					_table_rowspan("#basicTable" , 5);
+					return true;
+				},*/
+               onClickRow: function(row, $el){
+               },
+               	onShowSearch: function () {
+			$("#search-collapse").slideToggle();
+		},
+               columns: [{
+		        checkbox: true
+
+		    }
+			,{
+		        field: 'projectCode',
+		        title: '项目编码',
+			    width: '100px',
+		        sortable: true,
+		        sortName: 'projectCode'
+		        ,formatter:function(value, row , index){
+			   if(value == null || value ==""){
+				   value = "-";
+			   }
+			   <c:choose>
+				   <c:when test="${fns:hasPermission('test:filing:approvalStage:edit')}">
+				      return "<a href='javascript:edit(\""+row.id+"\")'>"+value+"</a>";
+			      </c:when>
+				  <c:when test="${fns:hasPermission('test:filing:approvalStage:view')}">
+				      return "<a href='javascript:view(\""+row.id+"\")'>"+value+"</a>";
+			      </c:when>
+				  <c:otherwise>
+				      return value;
+			      </c:otherwise>
+			   </c:choose>
+
+		        }
+		    }
+			,{
+		        field: 'monomerCode',
+		        title: '单体编码',
+		        sortable: true,
+			   width: '100px',
+		        sortName: 'monomerCode'
+
+		    }
+			,{
+		        field: 'entryName',
+		        title: '项目名称',
+					   width: '100px',
+		        sortable: true,
+		        sortName: 'entryName'
+
+		    }
+			,{
+		        field: 'replyNo',
+		        title: '可研批复文号',
+					   width: '100px',
+		        sortable: true,
+		        sortName: 'replyNo'
+		    }
+			,{
+		        field: 'approvalDate',
+		        title: '可研批复日期',
+					   width: '100px',
+		        sortable: true,
+		        sortName: 'approvalDate'
+
+		    }
+				   ,{
+					   field: 'staticInvestment',
+					   title: '可研静态态投资金额',
+					   width: '100px',
+					   sortable: true,
+					   sortName: 'staticInvestment'
+				   },{
+					   field: 'dynamicInvestment',
+					   title: '可研动态投资金额',
+					   width: '100px',
+					   sortable: true,
+					   sortName: 'dynamicInvestment'
+				   }
+		     ],
+		onExpandRow: function (index, row, $detail) {
+			initSubTable(index, row, $detail);
+		}
+		});
+
+	//初始化子表格(无线循环)
+	initSubTable = function (index, row, $detail) {
+		var parentid = row.projectCode;
+		var cur_table = $detail.html('<table></table>').find('table');
+		$(cur_table).bootstrapTable({
+			url: '${ctx}/filing/studyStage/detail',
+			method: 'post',
+			//类型json
+			dataType: "json",
+			contentType: "application/x-www-form-urlencoded",
+			queryParams : function(params) {
+				var searchParam = $("#searchForm").serializeJSON();
+				searchParam.pageNo = params.limit === undefined? "1" :params.offset/params.limit+1;
+				searchParam.pageSize = params.limit === undefined? -1 : params.limit;
+				searchParam.orderBy = params.sort === undefined? "" : params.sort+ " "+  params.order;
+				searchParam.projectCode = parentid;
+				return searchParam;
+			},
+			striped: true, //是否显示行间隔色
+			pagination: false,//显示分页
+			sidePagination: "server",
+			pageNumber:1,
+			pageSize: 10,
+			pageList: [10, 25],
+			columns: [{
+				field: 'projectCode',
+				title: '项目编码',
+				width: '164px',
+				formatter:function(value, row , index){
+					if(value == null || value ==""){
+						value = "-";
+					}
+				<c:choose>
+					<c:when test="${fns:hasPermission('test:filing:approvalStage:edit')}">
+					return "<a href='javascript:editChild(\""+row.id+"\")'>"+value+"</a>";
+				</c:when>
+					<c:otherwise>
+					return value;
+				</c:otherwise>
+					</c:choose>
+
+				}
+			}, {
+				field: 'monomerCode',
+				title: '单体编码',
+				width: '100px'
+			}, {
+				field: 'entryName',
+				title: '项目名称',
+				width: '100px',
+			},{
+				field: 'replyNo',
+				title: '可研批复文号',
+				width: '100px',
+				sortable: true,
+				sortName: 'replyNo'
+			}
+				,{
+					field: 'approvalDate',
+					title: '可研批复日期',
+					width: '100px',
+					sortable: true,
+					sortName: 'approvalDate'
+
+				}
+				,{
+					field: 'staticInvestment',
+					title: '可研静态态投资金额',
+					width: '100px',
+					sortable: true,
+					sortName: 'staticInvestment'
+				},{
+					field: 'dynamicInvestment',
+					title: '可研动态投资金额',
+					width: '100px',
+					sortable: true,
+					sortName: 'dynamicInvestment'
+				}]
+		});
+	};
+
+		  
+	  if(navigator.userAgent.match(/(iPhone|iPod|Android|ios)/i)){//如果是移动端
+
+		 
+		  $('#basicTable').bootstrapTable("toggleView");
+		}
+	  
+	  $('#basicTable').on('check.bs.table uncheck.bs.table load-success.bs.table ' +
+                'check-all.bs.table uncheck-all.bs.table', function () {
+            $('#remove').prop('disabled', ! $('#basicTable').bootstrapTable('getSelections').length);
+            $('#view,#edit').prop('disabled', $('#basicTable').bootstrapTable('getSelections').length!=1);
+        });
+		  
+		$("#btnImport").click(function(){
+			jp.open({
+			    type: 2,
+                area: [500, 200],
+                auto: true,
+			    title:"导入数据",
+			    content: "${ctx}/tag/importExcel" ,
+			    btn: ['下载模板','确定', '关闭'],
+				btn1: function(index, layero){
+					  jp.downloadFile('${ctx}/filing/studyStage/import/template');
+				  },
+			    btn2: function(index, layero){
+						var iframeWin = layero.find('iframe')[0]; //得到iframe页的窗口对象,执行iframe页的方法:iframeWin.method();
+						iframeWin.contentWindow.importExcel('${ctx}/filing/studyStage/import', function (data) {
+							if(data.success){
+								jp.success(data.msg);
+								refresh();
+							}else{
+								jp.error(data.msg);
+							}
+                            jp.close(index);
+                        });//调用保存事件
+                    return false;
+				  },
+				 
+				  btn3: function(index){ 
+					  jp.close(index);
+	    	       }
+			}); 
+		});
+	  $("#export").click(function(){//导出Excel文件
+			jp.downloadFile('${ctx}/filing/studyStage/export');
+	  });
+
+	$("#exportFiles").bind("click", function () {
+		$("#searchForm").attr("action","${ctx}/filing/filingImages/exportStudy?ids="+ getIdSelections());
+		$("#searchForm").submit();
+		return true;
+	});
+
+	  $("#search").click("click", function() {// 绑定查询按扭
+		  $('#basicTable').bootstrapTable('refresh');
+		});
+
+	  $("#open").click(function () {
+		  $("#basicTable").bootstrapTable('expandAllRows');
+	  })
+
+		$("#close").click(function (row) {
+			$('#basicTable').bootstrapTable('refresh');
+		})
+
+	 $("#reset").click("click", function() {// 绑定查询按扭
+		  $("#searchForm  input").val("");
+		  $("#searchForm  select").val("");
+		   $("#searchForm  .select-item").html("");
+		  $('#basicTable').bootstrapTable('refresh');
+		});
+		
+				$('#beginInDate').datetimepicker({
+					 format: "YYYY-MM-DD HH:mm:ss"
+				});
+				$('#endInDate').datetimepicker({
+					 format: "YYYY-MM-DD HH:mm:ss"
+				});
+		
+	});
+		
+  function getIdSelections() {
+        return $.map($("#basicTable").bootstrapTable('getSelections'), function (row) {
+            return row.id
+        });
+    }
+  
+  function deleteAll(){
+
+		jp.confirm('确认要删除该核准阶段记录吗?', function(){
+			jp.loading();  	
+			jp.get("${ctx}/filing/studyStage/deleteAll?ids=" + getIdSelections(), function(data){
+         	  		if(data.success){
+         	  			$('#basicTable').bootstrapTable('refresh');
+         	  			jp.success(data.msg);
+         	  		}else{
+         	  			jp.error(data.msg);
+         	  		}
+         	  	})
+          	   
+		})
+  }
+  
+    //刷新列表
+  function refresh() {
+      $('#basicTable').bootstrapTable('refresh');
+  }
+  function add(){
+	  jp.openSaveDialog('新增核准阶段', "${ctx}/filing/studyStage/form",'1000px', '800px');
+  }
+  
+   function edit(id){//没有权限时,不显示确定按钮
+       if(id == undefined){
+	      id = getIdSelections();
+	}
+	jp.openSaveDialog('编辑核准阶段', "${ctx}/filing/studyStage/form?id=" + id, '800px', '500px');
+  }
+
+  //editChild
+
+function editChild(id){//没有权限时,不显示确定按钮
+	if(id == undefined){
+		id = getIdSelections();
+	}
+	jp.openSaveDialog('编辑核准阶段', "${ctx}/filing/studyStage/childForm?id=" + id, '800px', '500px');
+}
+
+ function view(id){//没有权限时,不显示确定按钮
+      if(id == undefined){
+             id = getIdSelections();
+      }
+        jp.openViewDialog('查看核准阶段', "${ctx}/filing/studyStage/form?id=" + id, '800px', '500px');
+ }
+
+
+	function addRow(list, idx, tpl, row){
+		$(list).append(Mustache.render(tpl, {
+			idx: idx, delBtn: true, row: row
+		}));
+	}
+			
+</script>
+
+

+ 87 - 0
src/main/webapp/webpage/modules/filing/studyStage/studyStageList.jsp

@@ -0,0 +1,87 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+<%@ include file="/webpage/include/taglib.jsp" %>
+<html>
+<head>
+    <title>可研阶段管理</title>
+    <meta http-equiv="Content-type" content="text/html; charset=utf-8">
+    <meta name="decorator" content="ani"/>
+    <%@ include file="/webpage/include/bootstraptable.jsp" %>
+    <%@include file="/webpage/include/treeview.jsp" %>
+    <%@include file="studyStageList.js" %>
+    <style type="text/css">
+        .table {
+            table-layout: fixed;
+            word-break: break-all;
+            word-wrap: break-word;
+            text-align: center;
+        }
+
+        .table th, .table td {
+            text-align: center;
+            vertical-align: middle !important;
+        }
+    </style>
+</head>
+<body>
+<div class="wrapper wrapper-content">
+    <div class="panel panel-primary">
+        <div class="panel-heading">
+            <h3 class="panel-title">基础信息列表</h3>
+        </div>
+        <div class="panel-body">
+            <!-- 搜索 -->
+            <div id="search-collapse" class="collapse">
+                <div class="accordion-inner">
+                    <form:form id="searchForm" modelAttribute="studyStage"
+                               class="form form-horizontal well clearfix">
+                        <div class="col-xs-12 col-sm-6 col-md-4">
+                            <label class="label-item single-overflow pull-left" title="项目编码:">项目编码:</label>
+                            <form:input path="projectCode" htmlEscape="false" maxlength="257"  class=" form-control"/>
+                        </div>
+                        <div class="col-xs-12 col-sm-6 col-md-4">
+                            <div style="margin-top:26px">
+                                <a id="search" class="btn btn-primary btn-rounded  btn-bordered btn-sm"><i
+                                        class="fa fa-search"></i> 查询</a>
+                                <a id="reset" class="btn btn-primary btn-rounded  btn-bordered btn-sm"><i
+                                        class="fa fa-refresh"></i> 重置</a>
+                            </div>
+                        </div>
+                    </form:form>
+                </div>
+            </div>
+
+            <!-- 工具栏 -->
+            <div id="toolbar">
+                <button id="open" class="btn btn-primary" >
+                    <i class="glyphicon glyphicon-list"></i> 全部展开
+                </button>
+                <button id="close" class="btn btn-primary">
+                    <i class="glyphicon glyphicon-minus"></i> 全部折叠
+                </button>
+                <shiro:hasPermission name="test:filing:studyStage:edit">
+                    <button id="edit" class="btn btn-success" disabled onclick="edit()">
+                        <i class="glyphicon glyphicon-edit"></i> 修改
+                    </button>
+                </shiro:hasPermission>
+                <shiro:hasPermission name="test:filing:studyStage:import">
+                    <button id="btnImport" class="btn btn-info"><i class="fa fa-folder-open-o"></i> 导入</button>
+                </shiro:hasPermission>
+                <shiro:hasPermission name="test:filing:studyStage:export">
+                    <button id="export" class="btn btn-warning">
+                        <i class="fa fa-file-excel-o"></i> 导出
+                    </button>
+                </shiro:hasPermission>
+                <shiro:hasPermission name="test:filing:studyStage:export">
+                    <button id="exportFiles" class="btn btn-warning">
+                        <i class="fa fa-file-excel-o"></i> 导出附件
+                    </button>
+                </shiro:hasPermission>
+            </div>
+
+            <!-- 表格 -->
+            <table id="basicTable" data-toolbar="#toolbar"></table>
+        </div>
+    </div>
+</div>
+</body>
+</html>