Browse Source

基建项目评审计划安排代码提交

wangqiang 2 years ago
parent
commit
7bbaf88804
38 changed files with 8137 additions and 1 deletions
  1. 101 0
      src/main/java/com/jeeplus/modules/cg/infrastructure/entity/AnnualBatchDisplay.java
  2. 49 0
      src/main/java/com/jeeplus/modules/cg/infrastructure/entity/ConstructionBatch.java
  3. 187 0
      src/main/java/com/jeeplus/modules/cg/infrastructure/entity/InfrastructureBasicInfo.java
  4. 148 0
      src/main/java/com/jeeplus/modules/cg/infrastructure/entity/ReviewPlanArrangement.java
  5. 49 0
      src/main/java/com/jeeplus/modules/cg/infrastructure/mapper/ConstructionBatchMapper.java
  6. 49 0
      src/main/java/com/jeeplus/modules/cg/infrastructure/mapper/InfrastructureBasicInfoMapper.java
  7. 25 0
      src/main/java/com/jeeplus/modules/cg/infrastructure/mapper/ReviewPlanArrangementMapper.java
  8. 166 0
      src/main/java/com/jeeplus/modules/cg/infrastructure/mapper/xml/ConstructionBatchMapper.xml
  9. 240 0
      src/main/java/com/jeeplus/modules/cg/infrastructure/mapper/xml/InfrastructureBasicInfoMapper.xml
  10. 94 0
      src/main/java/com/jeeplus/modules/cg/infrastructure/mapper/xml/ReviewPlanArrangementMapper.xml
  11. 105 0
      src/main/java/com/jeeplus/modules/cg/infrastructure/service/ConstructionBatchService.java
  12. 122 0
      src/main/java/com/jeeplus/modules/cg/infrastructure/service/InfrastructureBasicInfoService.java
  13. 47 0
      src/main/java/com/jeeplus/modules/cg/infrastructure/service/ReviewPlanArrangementService.java
  14. 276 0
      src/main/java/com/jeeplus/modules/cg/infrastructure/util/ChangeTimeUtil.java
  15. 174 0
      src/main/java/com/jeeplus/modules/cg/infrastructure/util/InfrastructureExcelExportUtil.java
  16. 83 0
      src/main/java/com/jeeplus/modules/cg/infrastructure/util/InfrastructureExcelImportUtil.java
  17. 140 0
      src/main/java/com/jeeplus/modules/cg/infrastructure/web/AnnualBatchDisplayController.java
  18. 249 0
      src/main/java/com/jeeplus/modules/cg/infrastructure/web/ConstructionBatchController.java
  19. 2222 0
      src/main/java/com/jeeplus/modules/cg/infrastructure/web/InfrastructureBasicInfoController.java
  20. 169 0
      src/main/java/com/jeeplus/modules/cg/infrastructure/web/TransformerController.java
  21. BIN
      src/main/resources/freemarker/excelmodel/constructionBatch.xlsx
  22. BIN
      src/main/resources/freemarker/excelmodel/infrastructureBasicInfo.xlsx
  23. 1 1
      src/main/resources/properties/jeeplus.properties
  24. 385 0
      src/main/webapp/static/common/js/jquery-editable.js
  25. 312 0
      src/main/webapp/webpage/modules/cg/infrastructure/annualBatchDisplay/annualBatchDisplay.js
  26. 119 0
      src/main/webapp/webpage/modules/cg/infrastructure/annualBatchDisplay/annualBatchDisplay.jsp
  27. 312 0
      src/main/webapp/webpage/modules/cg/infrastructure/annualBatchDisplay/transformer.js
  28. 113 0
      src/main/webapp/webpage/modules/cg/infrastructure/annualBatchDisplay/transformer.jsp
  29. 263 0
      src/main/webapp/webpage/modules/cg/infrastructure/basicInfo/basicInfo.js
  30. 108 0
      src/main/webapp/webpage/modules/cg/infrastructure/basicInfo/basicInfo.jsp
  31. 123 0
      src/main/webapp/webpage/modules/cg/infrastructure/basicInfo/basicInfoAddForm.jsp
  32. 110 0
      src/main/webapp/webpage/modules/cg/infrastructure/basicInfo/basicInfoUpdateForm.jsp
  33. 83 0
      src/main/webapp/webpage/modules/cg/infrastructure/constructionBatch/batchAddForm.jsp
  34. 73 0
      src/main/webapp/webpage/modules/cg/infrastructure/constructionBatch/batchUpdateForm.jsp
  35. 231 0
      src/main/webapp/webpage/modules/cg/infrastructure/constructionBatch/constructionBatch.js
  36. 108 0
      src/main/webapp/webpage/modules/cg/infrastructure/constructionBatch/constructionBatch.jsp
  37. 1001 0
      src/main/webapp/webpage/modules/cg/infrastructure/reviewPlan/reviewPlan.js
  38. 100 0
      src/main/webapp/webpage/modules/cg/infrastructure/reviewPlan/reviewPlan.jsp

+ 101 - 0
src/main/java/com/jeeplus/modules/cg/infrastructure/entity/AnnualBatchDisplay.java

@@ -0,0 +1,101 @@
+package com.jeeplus.modules.cg.infrastructure.entity;
+
+import com.jeeplus.core.persistence.DataEntity;
+
+/**
+ * @author: 王强
+ * @create: 2023-05-09 15:48
+ **/
+public class AnnualBatchDisplay extends DataEntity<AnnualBatchDisplay> {
+    private String preliminaryDesignInternalReview;   //(一)初步设计内审
+    private String preliminaryDesignReviewPlan; //(二)初步设计评审计划
+    private String preliminaryExternalAuditReview;  //(三)初设外审评审
+    private String preliminaryDesignReviewComments;  //(四)初设评审意见
+    private String constructionDrawingReviewPlan;  //(五)施工图评审计划
+    private String constructionDrawingReview;  //(六)施工图评审
+    private String constructionDrawReview;  //(七)施工图评审意见
+    private String batchNumber;     //施工计划批次
+    private String bidOpenTime;     //施工定标日期
+
+    private String year;        //查询使用的年份
+
+    public String getPreliminaryDesignInternalReview() {
+        return preliminaryDesignInternalReview;
+    }
+
+    public void setPreliminaryDesignInternalReview(String preliminaryDesignInternalReview) {
+        this.preliminaryDesignInternalReview = preliminaryDesignInternalReview;
+    }
+
+    public String getPreliminaryDesignReviewPlan() {
+        return preliminaryDesignReviewPlan;
+    }
+
+    public void setPreliminaryDesignReviewPlan(String preliminaryDesignReviewPlan) {
+        this.preliminaryDesignReviewPlan = preliminaryDesignReviewPlan;
+    }
+
+    public String getPreliminaryExternalAuditReview() {
+        return preliminaryExternalAuditReview;
+    }
+
+    public void setPreliminaryExternalAuditReview(String preliminaryExternalAuditReview) {
+        this.preliminaryExternalAuditReview = preliminaryExternalAuditReview;
+    }
+
+    public String getPreliminaryDesignReviewComments() {
+        return preliminaryDesignReviewComments;
+    }
+
+    public void setPreliminaryDesignReviewComments(String preliminaryDesignReviewComments) {
+        this.preliminaryDesignReviewComments = preliminaryDesignReviewComments;
+    }
+
+    public String getConstructionDrawingReviewPlan() {
+        return constructionDrawingReviewPlan;
+    }
+
+    public void setConstructionDrawingReviewPlan(String constructionDrawingReviewPlan) {
+        this.constructionDrawingReviewPlan = constructionDrawingReviewPlan;
+    }
+
+    public String getConstructionDrawingReview() {
+        return constructionDrawingReview;
+    }
+
+    public void setConstructionDrawingReview(String constructionDrawingReview) {
+        this.constructionDrawingReview = constructionDrawingReview;
+    }
+
+    public String getConstructionDrawReview() {
+        return constructionDrawReview;
+    }
+
+    public void setConstructionDrawReview(String constructionDrawReview) {
+        this.constructionDrawReview = constructionDrawReview;
+    }
+
+    public String getBatchNumber() {
+        return batchNumber;
+    }
+
+    public void setBatchNumber(String batchNumber) {
+        this.batchNumber = batchNumber;
+    }
+
+    public String getBidOpenTime() {
+        return bidOpenTime;
+    }
+
+    public void setBidOpenTime(String bidOpenTime) {
+        this.bidOpenTime = bidOpenTime;
+    }
+
+    public String getYear() {
+        return year;
+    }
+
+    public void setYear(String year) {
+        this.year = year;
+    }
+}

+ 49 - 0
src/main/java/com/jeeplus/modules/cg/infrastructure/entity/ConstructionBatch.java

@@ -0,0 +1,49 @@
+package com.jeeplus.modules.cg.infrastructure.entity;
+
+import com.jeeplus.core.persistence.DataEntity;
+
+/**
+ * 基建 - 施工计划批次信息
+ * @author: 王强
+ * @create: 2023-05-08 15:00
+ **/
+public class ConstructionBatch extends DataEntity<ConstructionBatch>{
+
+    private String batchName;       //批次名称
+    private String batchNumber;     //批次编号
+    private String endTime;         //施工图纸收集截止时间
+    private String bidOpenTime;     //拟定开标时间
+
+    public String getBatchName() {
+        return batchName;
+    }
+
+    public void setBatchName(String batchName) {
+        this.batchName = batchName;
+    }
+
+    public String getBatchNumber() {
+        return batchNumber;
+    }
+
+    public void setBatchNumber(String batchNumber) {
+        this.batchNumber = batchNumber;
+    }
+
+    public String getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(String endTime) {
+        this.endTime = endTime;
+    }
+
+    public String getBidOpenTime() {
+        return bidOpenTime;
+    }
+
+    public void setBidOpenTime(String bidOpenTime) {
+        this.bidOpenTime = bidOpenTime;
+    }
+
+}

+ 187 - 0
src/main/java/com/jeeplus/modules/cg/infrastructure/entity/InfrastructureBasicInfo.java

@@ -0,0 +1,187 @@
+package com.jeeplus.modules.cg.infrastructure.entity;
+
+import com.jeeplus.core.persistence.DataEntity;
+
+/**
+ * 基建 - 基础信息
+ * @author: 王强
+ * @create: 2023-05-08 14:00
+ **/
+public class InfrastructureBasicInfo extends DataEntity<InfrastructureBasicInfo> {
+
+    private String stateGridCode;       //国网编码
+    private String projectName;         //项目名称
+    private String projectCode;         //项目编码
+    private String individualProjectName;   //单体项目名称
+    private String voltageLevel;        //电压等级
+    private String projectCategory;     //项目类别
+    private String scale;               //规模
+    private String designUnit;          //设计单位
+    private String constructionUnit;    //施工单位
+    private String controlUnit;         //监理单位
+
+    private String preliminaryDesignInternalReview;   //(一)初步设计内审
+    private String preliminaryDesignReviewPlan; //(二)初步设计评审计划
+    private String preliminaryExternalAuditReview;  //(三)初设外审评审
+    private String preliminaryDesignReviewComments;  //(四)初设评审意见
+    private String constructionDrawingReviewPlan;  //(五)施工图评审计划
+    private String constructionDrawingReview;  //(六)施工图评审
+    private String constructionDrawReview;  //(七)施工图评审意见
+
+
+    private String constructionPlanBatch;  //施工计划批次
+    private String constructionAwardDate;  //施工定标日期
+
+
+    public String getStateGridCode() {
+        return stateGridCode;
+    }
+
+    public void setStateGridCode(String stateGridCode) {
+        this.stateGridCode = stateGridCode;
+    }
+
+    public String getProjectName() {
+        return projectName;
+    }
+
+    public void setProjectName(String projectName) {
+        this.projectName = projectName;
+    }
+
+    public String getProjectCode() {
+        return projectCode;
+    }
+
+    public void setProjectCode(String projectCode) {
+        this.projectCode = projectCode;
+    }
+
+    public String getIndividualProjectName() {
+        return individualProjectName;
+    }
+
+    public void setIndividualProjectName(String individualProjectName) {
+        this.individualProjectName = individualProjectName;
+    }
+
+    public String getVoltageLevel() {
+        return voltageLevel;
+    }
+
+    public void setVoltageLevel(String voltageLevel) {
+        this.voltageLevel = voltageLevel;
+    }
+
+    public String getProjectCategory() {
+        return projectCategory;
+    }
+
+    public void setProjectCategory(String projectCategory) {
+        this.projectCategory = projectCategory;
+    }
+
+    public String getScale() {
+        return scale;
+    }
+
+    public void setScale(String scale) {
+        this.scale = scale;
+    }
+
+    public String getDesignUnit() {
+        return designUnit;
+    }
+
+    public void setDesignUnit(String designUnit) {
+        this.designUnit = designUnit;
+    }
+
+    public String getConstructionUnit() {
+        return constructionUnit;
+    }
+
+    public void setConstructionUnit(String constructionUnit) {
+        this.constructionUnit = constructionUnit;
+    }
+
+    public String getControlUnit() {
+        return controlUnit;
+    }
+
+    public void setControlUnit(String controlUnit) {
+        this.controlUnit = controlUnit;
+    }
+
+    public String getPreliminaryDesignInternalReview() {
+        return preliminaryDesignInternalReview;
+    }
+
+    public void setPreliminaryDesignInternalReview(String preliminaryDesignInternalReview) {
+        this.preliminaryDesignInternalReview = preliminaryDesignInternalReview;
+    }
+
+    public String getPreliminaryDesignReviewPlan() {
+        return preliminaryDesignReviewPlan;
+    }
+
+    public void setPreliminaryDesignReviewPlan(String preliminaryDesignReviewPlan) {
+        this.preliminaryDesignReviewPlan = preliminaryDesignReviewPlan;
+    }
+
+    public String getPreliminaryExternalAuditReview() {
+        return preliminaryExternalAuditReview;
+    }
+
+    public void setPreliminaryExternalAuditReview(String preliminaryExternalAuditReview) {
+        this.preliminaryExternalAuditReview = preliminaryExternalAuditReview;
+    }
+
+    public String getPreliminaryDesignReviewComments() {
+        return preliminaryDesignReviewComments;
+    }
+
+    public void setPreliminaryDesignReviewComments(String preliminaryDesignReviewComments) {
+        this.preliminaryDesignReviewComments = preliminaryDesignReviewComments;
+    }
+
+    public String getConstructionDrawingReviewPlan() {
+        return constructionDrawingReviewPlan;
+    }
+
+    public void setConstructionDrawingReviewPlan(String constructionDrawingReviewPlan) {
+        this.constructionDrawingReviewPlan = constructionDrawingReviewPlan;
+    }
+
+    public String getConstructionDrawingReview() {
+        return constructionDrawingReview;
+    }
+
+    public void setConstructionDrawingReview(String constructionDrawingReview) {
+        this.constructionDrawingReview = constructionDrawingReview;
+    }
+
+    public String getConstructionDrawReview() {
+        return constructionDrawReview;
+    }
+
+    public void setConstructionDrawReview(String constructionDrawReview) {
+        this.constructionDrawReview = constructionDrawReview;
+    }
+
+    public String getConstructionPlanBatch() {
+        return constructionPlanBatch;
+    }
+
+    public void setConstructionPlanBatch(String constructionPlanBatch) {
+        this.constructionPlanBatch = constructionPlanBatch;
+    }
+
+    public String getConstructionAwardDate() {
+        return constructionAwardDate;
+    }
+
+    public void setConstructionAwardDate(String constructionAwardDate) {
+        this.constructionAwardDate = constructionAwardDate;
+    }
+}

+ 148 - 0
src/main/java/com/jeeplus/modules/cg/infrastructure/entity/ReviewPlanArrangement.java

@@ -0,0 +1,148 @@
+package com.jeeplus.modules.cg.infrastructure.entity;
+
+import com.jeeplus.core.persistence.DataEntity;
+
+/**
+ * 基建 - 评审计划安排表
+ * @author: 王强
+ * @create: 2023-05-08 15:07
+ **/
+public class ReviewPlanArrangement extends DataEntity<ReviewPlanArrangement> {
+
+//    private String basicInfoId;     //基础表id
+    private String projectName;   //项目名称
+    private String projectCode;  //项目编码
+    private String isItInvolved; //是否涉及新建变电站
+    private String phase;       //项目阶段
+    private String preliminaryDesignInternalReview;   //(一)初步设计内审
+    private String preliminaryDesignReviewPlan; //(二)初步设计评审计划
+    private String preliminaryExternalAuditReview;  //(三)初设外审评审
+    private String preliminaryDesignReviewComments;  //(四)初设评审意见
+    private String constructionDrawingReviewPlan;  //(五)施工图评审计划
+    private String constructionDrawingReview;  //(六)施工图评审
+    private String constructionDrawReview;  //(七)施工图评审意见
+    private String approvalTime;       //核准时间+24月-施工定标时间<1月
+
+    private String batchNumber;     //施工计划批次
+    private String bidOpenTime;     //施工定标日期
+
+//    public String getBasicInfoId() {
+//        return basicInfoId;
+//    }
+//
+//    public void setBasicInfoId(String basicInfoId) {
+//        this.basicInfoId = basicInfoId;
+//    }
+
+    public String getProjectName() {
+        return projectName;
+    }
+
+    public void setProjectName(String projectName) {
+        this.projectName = projectName;
+    }
+
+    public String getProjectCode() {
+        return projectCode;
+    }
+
+    public void setProjectCode(String projectCode) {
+        this.projectCode = projectCode;
+    }
+
+    public String getIsItInvolved() {
+        return isItInvolved;
+    }
+
+    public void setIsItInvolved(String isItInvolved) {
+        this.isItInvolved = isItInvolved;
+    }
+
+    public String getPhase() {
+        return phase;
+    }
+
+    public void setPhase(String phase) {
+        this.phase = phase;
+    }
+
+    public String getPreliminaryDesignInternalReview() {
+        return preliminaryDesignInternalReview;
+    }
+
+    public void setPreliminaryDesignInternalReview(String preliminaryDesignInternalReview) {
+        this.preliminaryDesignInternalReview = preliminaryDesignInternalReview;
+    }
+
+    public String getPreliminaryDesignReviewPlan() {
+        return preliminaryDesignReviewPlan;
+    }
+
+    public void setPreliminaryDesignReviewPlan(String preliminaryDesignReviewPlan) {
+        this.preliminaryDesignReviewPlan = preliminaryDesignReviewPlan;
+    }
+
+    public String getPreliminaryExternalAuditReview() {
+        return preliminaryExternalAuditReview;
+    }
+
+    public void setPreliminaryExternalAuditReview(String preliminaryExternalAuditReview) {
+        this.preliminaryExternalAuditReview = preliminaryExternalAuditReview;
+    }
+
+    public String getPreliminaryDesignReviewComments() {
+        return preliminaryDesignReviewComments;
+    }
+
+    public void setPreliminaryDesignReviewComments(String preliminaryDesignReviewComments) {
+        this.preliminaryDesignReviewComments = preliminaryDesignReviewComments;
+    }
+
+    public String getConstructionDrawingReviewPlan() {
+        return constructionDrawingReviewPlan;
+    }
+
+    public void setConstructionDrawingReviewPlan(String constructionDrawingReviewPlan) {
+        this.constructionDrawingReviewPlan = constructionDrawingReviewPlan;
+    }
+
+    public String getConstructionDrawingReview() {
+        return constructionDrawingReview;
+    }
+
+    public void setConstructionDrawingReview(String constructionDrawingReview) {
+        this.constructionDrawingReview = constructionDrawingReview;
+    }
+
+    public String getConstructionDrawReview() {
+        return constructionDrawReview;
+    }
+
+    public void setConstructionDrawReview(String constructionDrawReview) {
+        this.constructionDrawReview = constructionDrawReview;
+    }
+
+    public String getApprovalTime() {
+        return approvalTime;
+    }
+
+    public void setApprovalTime(String approvalTime) {
+        this.approvalTime = approvalTime;
+    }
+
+    public String getBatchNumber() {
+        return batchNumber;
+    }
+
+    public void setBatchNumber(String batchNumber) {
+        this.batchNumber = batchNumber;
+    }
+
+    public String getBidOpenTime() {
+        return bidOpenTime;
+    }
+
+    public void setBidOpenTime(String bidOpenTime) {
+        this.bidOpenTime = bidOpenTime;
+    }
+}

+ 49 - 0
src/main/java/com/jeeplus/modules/cg/infrastructure/mapper/ConstructionBatchMapper.java

@@ -0,0 +1,49 @@
+package com.jeeplus.modules.cg.infrastructure.mapper;
+
+import com.jeeplus.core.persistence.BaseMapper;
+import com.jeeplus.core.persistence.annotation.MyBatisMapper;
+import com.jeeplus.modules.cg.infrastructure.entity.ConstructionBatch;
+
+import java.util.List;
+
+/**
+ * 基建 - 施工计划批次信息 - mapper
+ * @author: 王强
+ * @create: 2023-05-08 15:03
+ **/
+@MyBatisMapper
+public interface ConstructionBatchMapper extends BaseMapper<ConstructionBatch> {
+
+    /**
+     * 根据条件查询所有数据
+     * @param param
+     * @return
+     */
+    int getAllInfo(ConstructionBatch param);
+
+    /**
+     * 根据批次编号获取项目信息
+     * @param rm
+     * @return
+     */
+    ConstructionBatch queryByProjectCode(ConstructionBatch rm);
+
+    /**
+     * 批量添加 施工计划批次信息
+     * @param reserveManagementList
+     */
+    void insertList(List<ConstructionBatch> reserveManagementList);
+
+    /**
+     * 导出数据查询
+     * @param basicInfo
+     * @return
+     */
+    List<ConstructionBatch> exportFindList(ConstructionBatch basicInfo);
+
+    /**
+     * 获取所有的施工图纸收集截止时间和拟定开标时间
+     * @return
+     */
+    List<ConstructionBatch> getAllDeadLine();
+}

+ 49 - 0
src/main/java/com/jeeplus/modules/cg/infrastructure/mapper/InfrastructureBasicInfoMapper.java

@@ -0,0 +1,49 @@
+package com.jeeplus.modules.cg.infrastructure.mapper;
+
+import com.jeeplus.core.persistence.BaseMapper;
+import com.jeeplus.core.persistence.annotation.MyBatisMapper;
+import com.jeeplus.modules.cg.infrastructure.entity.InfrastructureBasicInfo;
+
+import java.util.List;
+
+/**
+ * 基建基础信息 - mapper
+ * @author: 王强
+ * @create: 2023-05-08 14:20
+ **/
+@MyBatisMapper
+public interface InfrastructureBasicInfoMapper extends BaseMapper<InfrastructureBasicInfo> {
+
+    /**
+     * 根据条件查询所有数据
+     * @param param
+     * @return
+     */
+    int getAllInfo(InfrastructureBasicInfo param);
+
+    /**
+     * 导出数据查询
+     * @param basicInfo
+     * @return
+     */
+    List<InfrastructureBasicInfo> exportFindList(InfrastructureBasicInfo basicInfo);
+
+    /**
+     * 获取所有的  项目储备编号
+     * @return
+     */
+    List<String> getAllProId();
+
+    /**
+     * 根据项目编码获取项目信息
+     * @param rm
+     * @return
+     */
+    InfrastructureBasicInfo queryByProjectCode(InfrastructureBasicInfo rm);
+
+    /**
+     * 批量添加 基建基础信息
+     * @param reserveManagementList
+     */
+    void insertList(List<InfrastructureBasicInfo> reserveManagementList);
+}

+ 25 - 0
src/main/java/com/jeeplus/modules/cg/infrastructure/mapper/ReviewPlanArrangementMapper.java

@@ -0,0 +1,25 @@
+package com.jeeplus.modules.cg.infrastructure.mapper;
+
+import com.jeeplus.core.persistence.BaseMapper;
+import com.jeeplus.core.persistence.annotation.MyBatisMapper;
+import com.jeeplus.modules.cg.infrastructure.entity.ReviewPlanArrangement;
+
+/**
+ * 基建 - 评审计划安排表 - mapper
+ * @author: 王强
+ * @create: 2023-05-08 15:12
+ **/
+@MyBatisMapper
+public interface ReviewPlanArrangementMapper extends BaseMapper<ReviewPlanArrangement> {
+    /**
+     * 根据项目编码去查看是否有对应这条项目的 评审计划安排信息
+     * @param projectCode
+     */
+    ReviewPlanArrangement getByCode(String projectCode);
+
+    /**
+     * 根据项目编码删除评审计划安排信息
+     * @param projectCode
+     */
+    void deleteByCode(String projectCode);
+}

+ 166 - 0
src/main/java/com/jeeplus/modules/cg/infrastructure/mapper/xml/ConstructionBatchMapper.xml

@@ -0,0 +1,166 @@
+<?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.cg.infrastructure.mapper.ConstructionBatchMapper">
+
+    <sql id="ConstructionBatchColumns">
+        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.del_flag AS "delFlag",
+		a.batch_name AS "batchName",
+		a.batch_number AS "batchNumber",
+		a.end_time AS "endTime",
+		a.bid_open_time AS "bidOpenTime"
+    </sql>
+    <insert id="insertList">
+        insert into cg_infrastructure_construction_batch (
+        id,
+        create_by,
+        create_date,
+        update_by,
+        update_date,
+        del_flag,
+        batch_name,
+        batch_number,
+        end_time,
+        bid_open_time
+        )
+        values
+        <foreach collection="list" item="item" index="index" separator="," >
+            (
+            #{item.id},
+            #{item.createBy.id},
+            #{item.createDate},
+            #{item.updateBy.id},
+            #{item.updateDate},
+            #{item.delFlag},
+            #{item.batchName},
+            #{item.batchNumber},
+            #{item.endTime},
+            #{item.bidOpenTime}
+            )
+        </foreach>
+    </insert>
+
+    <insert id="insert">
+        insert into cg_infrastructure_construction_batch (
+        id,
+		create_by,
+		create_date,
+		update_by,
+		update_date,
+		del_flag,
+		batch_name,
+        batch_number,
+        end_time,
+        bid_open_time
+        )
+        values
+            (
+            #{id},
+			#{createBy.id},
+			#{createDate},
+			#{updateBy.id},
+			#{updateDate},
+			#{delFlag},
+			#{batchName},
+            #{batchNumber},
+            #{endTime},
+            #{bidOpenTime}
+            )
+    </insert>
+
+    <update id="update">
+		update
+        cg_infrastructure_construction_batch
+        set
+        update_by = #{updateBy.id},
+        update_date = #{updateDate},
+        batch_name = #{batchName},
+        batch_number = #{batchNumber},
+        end_time = #{endTime},
+        bid_open_time = #{bidOpenTime}
+        where id = #{id}
+	</update>
+
+    <select id="findList" resultType="com.jeeplus.modules.cg.infrastructure.entity.ConstructionBatch">
+        select
+        <include refid="ConstructionBatchColumns"/>
+        from cg_infrastructure_construction_batch a
+        <where>
+            a.del_flag = 0
+            <if test="batchName!=null and batchName!=''">
+                and a.batch_name like concat('%', #{batchName}, '%')
+            </if>
+            <if test="dataScope != null and dataScope != ''">
+                ${dataScope}
+            </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="queryByProjectCode"
+            resultType="com.jeeplus.modules.cg.infrastructure.entity.ConstructionBatch">
+        select
+        <include refid="ConstructionBatchColumns"/>
+        from cg_infrastructure_construction_batch a
+        where a.batch_number = #{batchNumber} and a.del_flag = 0
+    </select>
+    <update id="delete">
+        delete from
+        cg_infrastructure_construction_batch
+        where id = #{id}
+    </update>
+    <select id="get" resultType="com.jeeplus.modules.cg.infrastructure.entity.ConstructionBatch">
+        select
+        <include refid="ConstructionBatchColumns"/>
+        from cg_infrastructure_construction_batch a
+        where a.id = #{id} and a.del_flag = 0
+    </select>
+    <select id="exportFindList" resultType="com.jeeplus.modules.cg.infrastructure.entity.ConstructionBatch">
+        select
+        <include refid="ConstructionBatchColumns"/>
+        from cg_infrastructure_construction_batch a
+        <where>
+            a.del_flag = 0
+            <if test="batchName!=null and batchName!=''">
+                and a.batch_name like concat('%', #{batchName}, '%')
+            </if>
+            <if test="dataScope != null and dataScope != ''">
+                ${dataScope}
+            </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="getAllInfo" resultType="java.lang.Integer">
+        select count(*) from cg_infrastructure_construction_batch a
+        <where>
+            a.del_flag = 0
+            <if test="batchNumber!=null and batchNumber!=''">
+                and a.batch_number like concat('%', #{batchNumber}, '%')
+            </if>
+        </where>
+    </select>
+    <select id="getAllDeadLine" resultType="com.jeeplus.modules.cg.infrastructure.entity.ConstructionBatch">
+        select a.end_time,a.bid_open_time,a.batch_number
+        from cg_infrastructure_construction_batch a
+        where a.del_flag = 0
+        ORDER BY STR_TO_DATE(end_time, '%Y/%m/%d') ASC
+    </select>
+
+</mapper>

+ 240 - 0
src/main/java/com/jeeplus/modules/cg/infrastructure/mapper/xml/InfrastructureBasicInfoMapper.xml

@@ -0,0 +1,240 @@
+<?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.cg.infrastructure.mapper.InfrastructureBasicInfoMapper">
+
+    <sql id="InfrastructureBasicInfoColumns">
+        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.del_flag AS "delFlag",
+		a.state_grid_code AS stateGridCode,
+		a.project_name AS projectName,
+		a.project_code AS projectCode,
+		a.individual_project_name AS individualProjectName,
+		a.voltage_level AS voltageLevel,
+		a.project_category AS projectCategory,
+		a.scale AS scale,
+		a.design_unit AS designUnit,
+		a.construction_unit AS constructionUnit,
+		a.control_unit AS controlUnit,
+		b.preliminary_designInternal_review as preliminaryDesignInternalReview,
+		b.preliminary_design_review_plan as preliminaryDesignReviewPlan,
+		b.preliminary_external_audit_review as preliminaryExternalAuditReview,
+		b.preliminary_design_review_comments as preliminaryDesignReviewComments,
+		b.construction_drawing_review_plan as constructionDrawingReviewPlan,
+		b.construction_drawing_review as constructionDrawingReview,
+		b.construction_draw_review as constructionDrawReview
+    </sql>
+
+	<sql id="basicInfoColumns">
+        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.del_flag AS "delFlag",
+		a.state_grid_code AS stateGridCode,
+		a.project_name AS projectName,
+		a.project_code AS projectCode,
+		a.individual_project_name AS individualProjectName,
+		a.voltage_level AS voltageLevel,
+		a.project_category AS projectCategory,
+		a.scale AS scale,
+		a.design_unit AS designUnit,
+		a.construction_unit AS constructionUnit,
+		a.control_unit AS controlUnit
+    </sql>
+
+	<insert id="insertList">
+		insert into cg_infrastructure_basic_info (
+		id,
+		create_by,
+		create_date,
+		update_by,
+		update_date,
+		del_flag,
+		state_grid_code,
+		project_name,
+		project_code,
+		individual_project_name,
+		voltage_level,
+		project_category,
+		scale,
+		design_unit,
+		construction_unit,
+		control_unit
+		)
+		values
+		<foreach collection="list" item="item" index="index" separator="," >
+			(
+			#{item.id},
+			#{item.createBy.id},
+			#{item.createDate},
+			#{item.updateBy.id},
+			#{item.updateDate},
+			#{item.delFlag},
+			#{item.stateGridCode},
+			#{item.projectName},
+			#{item.projectCode},
+			#{item.individualProjectName},
+			#{item.voltageLevel},
+			#{item.projectCategory},
+			#{item.scale},
+			#{item.designUnit},
+			#{item.constructionUnit},
+			#{item.controlUnit}
+			)
+		</foreach>
+	</insert>
+
+	<insert id="insert">
+        insert into cg_infrastructure_basic_info (
+        id,
+		create_by,
+		create_date,
+		update_by,
+		update_date,
+		del_flag,
+		state_grid_code,
+		project_name,
+		project_code,
+		individual_project_name,
+		voltage_level,
+		project_category,
+		scale,
+		design_unit,
+		construction_unit,
+		control_unit
+        )
+        values
+            (
+            #{id},
+			#{createBy.id},
+			#{createDate},
+			#{updateBy.id},
+			#{updateDate},
+			#{delFlag},
+			#{stateGridCode},
+			#{projectName},
+			#{projectCode},
+			#{individualProjectName},
+			#{voltageLevel},
+			#{projectCategory},
+			#{scale},
+			#{designUnit},
+			#{constructionUnit},
+			#{controlUnit}
+            )
+    </insert>
+
+	<update id="update">
+		update
+        cg_infrastructure_basic_info
+        set
+        update_by = #{updateBy.id},
+        update_date = #{updateDate},
+        state_grid_code = #{stateGridCode},
+		project_name = #{projectName},
+		project_code = #{projectCode},
+		individual_project_name = #{individualProjectName},
+		voltage_level = #{voltageLevel},
+		project_category = #{projectCategory},
+		scale = #{scale},
+		design_unit = #{designUnit},
+		construction_unit = #{constructionUnit},
+		control_unit = #{controlUnit}
+        where id = #{id}
+	</update>
+
+	<select id="findList" resultType="com.jeeplus.modules.cg.infrastructure.entity.InfrastructureBasicInfo">
+		select
+		<include refid="InfrastructureBasicInfoColumns"/>
+		from cg_infrastructure_basic_info a
+		left join cg_infrastructure_review_plan_arrangement b
+		on a.project_code = b.project_code
+		<where>
+			a.del_flag = 0
+			<if test="projectName!=null and projectName!=''">
+				and a.project_name like concat('%', #{projectName}, '%')
+			</if>
+			<if test="dataScope != null and dataScope != ''">
+				${dataScope}
+			</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="exportFindList" resultType="com.jeeplus.modules.cg.infrastructure.entity.InfrastructureBasicInfo">
+		select
+		<include refid="InfrastructureBasicInfoColumns"/>
+		from cg_infrastructure_basic_info a
+		left join cg_infrastructure_review_plan_arrangement b
+		on a.project_code = b.project_code
+		<where>
+			a.del_flag = 0
+			<if test="projectName!=null and projectName!=''">
+				and a.project_name like concat('%', #{projectName}, '%')
+			</if>
+			<if test="dataScope != null and dataScope != ''">
+				${dataScope}
+			</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>
+
+	<update id="delete">
+        delete from
+        cg_infrastructure_basic_info
+        where id = #{id}
+    </update>
+
+	<select id="get" resultType="com.jeeplus.modules.cg.infrastructure.entity.InfrastructureBasicInfo">
+        select
+        <include refid="basicInfoColumns"/>
+        from cg_infrastructure_basic_info a
+        where a.id = #{id} and a.del_flag = 0
+    </select>
+	<select id="getAllProId" resultType="java.lang.String">
+		select project_code from cg_infrastructure_basic_info a where a.del_flag = 0
+	</select>
+	<select id="queryByProjectCode"
+			resultType="com.jeeplus.modules.cg.infrastructure.entity.InfrastructureBasicInfo">
+		select
+		<include refid="InfrastructureBasicInfoColumns"/>
+		from cg_infrastructure_basic_info a
+		left join cg_infrastructure_review_plan_arrangement b
+		on a.project_code = b.project_code
+		where a.project_code = #{projectCode} and a.del_flag = 0
+	</select>
+    <select id="getAllInfo" resultType="java.lang.Integer">
+		select count(*) from cg_infrastructure_basic_info a
+		<where>
+			a.del_flag = 0
+			<if test="stateGridCode!=null and stateGridCode!=''">
+				and a.state_grid_code like concat('%', #{stateGridCode}, '%')
+			</if>
+			<if test="projectName!=null and projectName!=''">
+				and a.project_name like concat('%', #{projectName}, '%')
+			</if>
+			<if test="projectCode != null and projectCode != ''">
+				and a.project_code like concat('%', #{projectCode}, '%')
+			</if>
+		</where>
+	</select>
+</mapper>

+ 94 - 0
src/main/java/com/jeeplus/modules/cg/infrastructure/mapper/xml/ReviewPlanArrangementMapper.xml

@@ -0,0 +1,94 @@
+<?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.cg.infrastructure.mapper.ReviewPlanArrangementMapper">
+
+    <sql id="arrangementColumns">
+        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.del_flag AS "delFlag",
+		a.is_it_involved AS "isItInvolved",
+		a.preliminary_designInternal_review AS "preliminaryDesignInternalReview",
+		a.preliminary_design_review_plan AS "preliminaryDesignReviewPlan",
+		a.preliminary_external_audit_review AS "preliminaryExternalAuditReview",
+		a.preliminary_design_review_comments AS "preliminaryDesignReviewComments",
+		a.construction_drawing_review_plan AS "constructionDrawingReviewPlan",
+		a.construction_drawing_review AS "constructionDrawingReview",
+		a.construction_draw_review AS "constructionDrawReview",
+		IFNULL(a.approval_time,"") as approvalTime,
+		a.project_code AS "projectCode",
+		b.project_name as "projectName"
+    </sql>
+
+    <insert id="insert">
+        insert into cg_infrastructure_review_plan_arrangement (
+        id,
+		create_by,
+		create_date,
+		update_by,
+		update_date,
+		del_flag,
+		is_it_involved,
+		preliminary_designInternal_review,
+		preliminary_design_review_plan,
+		preliminary_external_audit_review,
+		preliminary_design_review_comments,
+		construction_drawing_review_plan,
+		construction_drawing_review,
+		construction_draw_review,
+		approval_time,
+		project_code
+        )
+        values
+            (
+            #{id},
+			#{createBy.id},
+			#{createDate},
+			#{updateBy.id},
+			#{updateDate},
+			#{delFlag},
+			#{isItInvolved},
+            #{preliminaryDesignInternalReview},
+            #{preliminaryDesignReviewPlan},
+            #{preliminaryExternalAuditReview},
+            #{preliminaryDesignReviewComments},
+            #{constructionDrawingReviewPlan},
+            #{constructionDrawingReview},
+            #{constructionDrawReview},
+            #{approvalTime},
+            #{projectCode}
+            )
+    </insert>
+
+    <update id="update">
+		update
+        cg_infrastructure_review_plan_arrangement
+        set
+        update_by = #{updateBy.id},
+        update_date = #{updateDate},
+        is_it_involved = #{isItInvolved},
+		preliminary_designInternal_review = #{preliminaryDesignInternalReview},
+		preliminary_design_review_plan = #{preliminaryDesignReviewPlan},
+		preliminary_external_audit_review = #{preliminaryExternalAuditReview},
+		preliminary_design_review_comments = #{preliminaryDesignReviewComments},
+		construction_drawing_review_plan = #{constructionDrawingReviewPlan},
+		construction_drawing_review = #{constructionDrawingReview},
+		construction_draw_review = #{constructionDrawReview},
+		approval_time = #{approvalTime},
+		project_code = #{projectCode}
+        where project_code = #{projectCode}
+	</update>
+    <delete id="deleteByCode">
+		delete from cg_infrastructure_review_plan_arrangement where project_code = #{projectCode}
+	</delete>
+    <select id="getByCode" resultType="com.jeeplus.modules.cg.infrastructure.entity.ReviewPlanArrangement">
+        select
+        <include refid="arrangementColumns"/>
+        from cg_infrastructure_review_plan_arrangement a
+        left join cg_infrastructure_basic_info b on a.project_code = b.project_code
+        where a.project_code = #{projectCode}
+    </select>
+
+</mapper>

+ 105 - 0
src/main/java/com/jeeplus/modules/cg/infrastructure/service/ConstructionBatchService.java

@@ -0,0 +1,105 @@
+package com.jeeplus.modules.cg.infrastructure.service;
+
+import com.jeeplus.core.persistence.Page;
+import com.jeeplus.core.service.CrudService;
+import com.jeeplus.modules.cg.infrastructure.entity.ConstructionBatch;
+import com.jeeplus.modules.cg.infrastructure.mapper.ConstructionBatchMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+
+/**
+ * @author: 王强  - service
+ * @create: 2023-05-08 15:04
+ **/
+@Service
+@Transactional(readOnly = true)
+public class ConstructionBatchService extends CrudService<ConstructionBatchMapper, ConstructionBatch> {
+
+    @Autowired
+    private ConstructionBatchMapper dao;
+
+    /**
+     * 获取所有的施工图纸收集截止时间
+     * @return
+     */
+    public List<ConstructionBatch> getAllDeadLine(){
+        return dao.getAllDeadLine();
+    }
+
+    /**
+     * 根据条件查询所有数据
+     * @param param
+     * @return
+     */
+    public int getAllInfo(ConstructionBatch param){
+        return dao.getAllInfo(param);
+    }
+
+    public Page<ConstructionBatch> findPage(Page<ConstructionBatch> page, ConstructionBatch batch) {
+        Page<ConstructionBatch> pageList = super.findPage(page, batch);
+        return pageList;
+    }
+
+    /**
+     * 批量添加数据
+     * @param batches
+     */
+    @Transactional(readOnly = false)
+    public void insertList(List<ConstructionBatch> batches){
+        dao.insertList(batches);
+    }
+
+    public List<ConstructionBatch> exportFindList( ConstructionBatch batch) {
+        List<ConstructionBatch> pageList = dao.exportFindList(batch);
+        return pageList;
+    }
+
+    /**
+     * 删除方法
+     * @param basicInfo
+     */
+    @Transactional(readOnly = false)
+    public void delete(ConstructionBatch basicInfo) {
+        super.delete(basicInfo);
+    }
+
+    /**
+     * 修改方法
+     * @param batch
+     */
+    @Transactional(readOnly = false)
+    public void update(ConstructionBatch batch) {
+        super.save(batch);
+    }
+
+    /**
+     * 查询已有的参数数据 并分类返回已存在数据和未存在数据
+     * @param reserveManagement
+     * @return
+     */
+    public Map<String, List<ConstructionBatch>> getExistProjectList(List<ConstructionBatch> reserveManagement){
+        Map<String,List<ConstructionBatch>> map = new HashMap();
+        List<ConstructionBatch> existReserveManagementList = new ArrayList<>();
+        Iterator<ConstructionBatch> iterator = reserveManagement.iterator();
+        while (iterator.hasNext()) {
+            ConstructionBatch rm = iterator.next();
+            //对数据进行处理
+            rm.preInsert();
+            ConstructionBatch reserveManag = dao.queryByProjectCode(rm);
+
+            //数据库中已含有的数据在list中删除并创建一个list加入 区分为已存在数据
+            if (null != reserveManag) {
+                rm.setId(reserveManag.getId());
+                existReserveManagementList.add(rm);
+                iterator.remove();//使用迭代器删除已存在的数据
+            }
+        }
+        map.put("without",reserveManagement);
+        map.put("exist",existReserveManagementList);
+        return map;
+    }
+
+}

+ 122 - 0
src/main/java/com/jeeplus/modules/cg/infrastructure/service/InfrastructureBasicInfoService.java

@@ -0,0 +1,122 @@
+package com.jeeplus.modules.cg.infrastructure.service;
+
+import com.jeeplus.core.persistence.Page;
+import com.jeeplus.core.service.CrudService;
+import com.jeeplus.modules.cg.infrastructure.entity.InfrastructureBasicInfo;
+import com.jeeplus.modules.cg.infrastructure.mapper.InfrastructureBasicInfoMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+
+/**
+ * 基建基础信息 - service
+ * @author: 王强
+ * @create: 2023-05-08 14:23
+ **/
+@Service
+@Transactional(readOnly = true)
+public class InfrastructureBasicInfoService extends CrudService<InfrastructureBasicInfoMapper, InfrastructureBasicInfo> {
+
+    @Autowired
+    private InfrastructureBasicInfoMapper dao;
+
+    /**
+     * 新增方法
+     * @param entity
+     */
+    @Transactional(readOnly = false)
+    public void save(InfrastructureBasicInfo entity) {
+        //查询数据表中是否含有同项目储备编号的数据 若有则进行修改 没有则新增
+        //根据项目储备编号 查询数据
+        if (entity.getIsNewRecord()){
+            entity.preInsert();
+            mapper.insert(entity);
+        }else{
+            entity.preUpdate();
+            mapper.update(entity);
+        }
+    }
+
+    /**
+     * 根据条件查询所有数据
+     * @param param
+     * @return
+     */
+    public int getAllInfo(InfrastructureBasicInfo param){
+        return dao.getAllInfo(param);
+    }
+
+    public Page<InfrastructureBasicInfo> findPage(Page<InfrastructureBasicInfo> page, InfrastructureBasicInfo basicInfo) {
+        Page<InfrastructureBasicInfo> pageList = super.findPage(page, basicInfo);
+        return pageList;
+    }
+
+    public List<InfrastructureBasicInfo> exportFindList( InfrastructureBasicInfo basicInfo) {
+        List<InfrastructureBasicInfo> pageList = dao.exportFindList(basicInfo);
+        return pageList;
+    }
+
+    /**
+     * 修改方法
+     * @param basicInfo
+     */
+    @Transactional(readOnly = false)
+    public void update(InfrastructureBasicInfo basicInfo) {
+        super.save(basicInfo);
+    }
+
+    /**
+     * 批量添加数据
+     * @param basicInfos
+     */
+    @Transactional(readOnly = false)
+    public void insertList(List<InfrastructureBasicInfo> basicInfos){
+        dao.insertList(basicInfos);
+    }
+
+    /**
+     * 查询已有的参数数据 并分类返回已存在数据和未存在数据
+     * @param reserveManagement
+     * @return
+     */
+    public Map<String,List<InfrastructureBasicInfo>> getExistProjectList(List<InfrastructureBasicInfo> reserveManagement){
+        Map<String,List<InfrastructureBasicInfo>> map = new HashMap();
+        List<InfrastructureBasicInfo> existReserveManagementList = new ArrayList<>();
+        Iterator<InfrastructureBasicInfo> iterator = reserveManagement.iterator();
+        while (iterator.hasNext()) {
+            InfrastructureBasicInfo rm = iterator.next();
+            //对数据进行处理
+            rm.preInsert();
+            InfrastructureBasicInfo reserveManag = dao.queryByProjectCode(rm);
+
+            //数据库中已含有的数据在list中删除并创建一个list加入 区分为已存在数据
+            if (null != reserveManag) {
+                rm.setId(reserveManag.getId());
+                existReserveManagementList.add(rm);
+                iterator.remove();//使用迭代器删除已存在的数据
+            }
+        }
+        map.put("without",reserveManagement);
+        map.put("exist",existReserveManagementList);
+        return map;
+    }
+
+    /**
+     * 删除方法
+     * @param basicInfo
+     */
+    @Transactional(readOnly = false)
+    public void delete(InfrastructureBasicInfo basicInfo) {
+        super.delete(basicInfo);
+    }
+
+    /**
+     * 获取所有的  项目储备编号
+     * @return
+     */
+    public List<String> getAllProId(){
+        return dao.getAllProId();
+    }
+}

+ 47 - 0
src/main/java/com/jeeplus/modules/cg/infrastructure/service/ReviewPlanArrangementService.java

@@ -0,0 +1,47 @@
+package com.jeeplus.modules.cg.infrastructure.service;
+
+import com.jeeplus.core.service.CrudService;
+import com.jeeplus.modules.cg.infrastructure.entity.ReviewPlanArrangement;
+import com.jeeplus.modules.cg.infrastructure.mapper.ReviewPlanArrangementMapper;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * 基建 - 评审计划安排表 - service
+ * @author: 王强
+ * @create: 2023-05-08 15:14
+ **/
+@Service
+@Transactional(readOnly = true)
+public class ReviewPlanArrangementService extends CrudService<ReviewPlanArrangementMapper, ReviewPlanArrangement> {
+
+    /**
+     * 新增方法
+     * @param entity
+     */
+    @Transactional(readOnly = false)
+    public void save(ReviewPlanArrangement entity) {
+        //根据项目编码去查看是否有对应这条项目的 评审计划安排信息
+        ReviewPlanArrangement arrangement = mapper.getByCode(entity.getProjectCode());
+        if (null == arrangement) {
+            entity.preInsert();
+            mapper.insert(entity);
+        } else {
+            entity.preUpdate();
+            mapper.update(entity);
+        }
+    }
+
+    /**
+     * 根据项目编码删除评审计划安排信息
+     * @param projectCode
+     */
+    @Transactional(readOnly = false)
+    public void deleteByCode(String projectCode){
+        mapper.deleteByCode(projectCode);
+    }
+
+    public ReviewPlanArrangement getByCode(String code){
+        return mapper.getByCode(code);
+    }
+}

+ 276 - 0
src/main/java/com/jeeplus/modules/cg/infrastructure/util/ChangeTimeUtil.java

@@ -0,0 +1,276 @@
+package com.jeeplus.modules.cg.infrastructure.util;
+
+import com.jeeplus.modules.cg.infrastructure.entity.ConstructionBatch;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 获取变化时间util
+ * @author: 王强
+ * @create: 2023-05-12 08:41
+ **/
+public class ChangeTimeUtil {
+
+    public static ChangeTimeUtil getOne(){
+
+        return new ChangeTimeUtil();
+    }
+
+    public SimpleDateFormat SHORT_DATE_FORMAT = new SimpleDateFormat("yyyy/MM/dd");
+
+    /**
+     * 判断是哪一个时间区间
+     * @param time
+     * @param batches
+     * @return
+     */
+    public ConstructionBatch getTimeInterval(String time, List<ConstructionBatch> batches) throws ParseException {
+        SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy/M/dd");
+
+        // 待判断日期
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
+        LocalDate targetDate = LocalDate.parse(time, formatter);
+
+        for (int i=0;i<batches.size();i++){
+            Date da = inputFormat.parse(batches.get(i).getEndTime());
+            LocalDate startTime = LocalDate.parse(SHORT_DATE_FORMAT.format(da), formatter);
+            if (targetDate.isBefore(startTime)){
+                return batches.get(i);
+            } else {
+                for (int k=i+1;k<batches.size();k++){
+                    da = inputFormat.parse(batches.get(k).getEndTime());
+                    LocalDate startTime2 = LocalDate.parse(SHORT_DATE_FORMAT.format(da), formatter);
+                    if (targetDate.isBefore(startTime2)){
+                        return batches.get(k);
+                    }
+                }
+            }
+        }
+
+        return null;
+    }
+
+    /**
+     * 根据(一)初步设计内审时间获取(二)初步设计评审计划时间
+     * @param internalTime
+     * @return
+     */
+    public String getDesignReview(String internalTime){
+        //下月的15号
+        Calendar calendar = Calendar.getInstance();
+        try {
+            if (internalTime != null && !"".equals(internalTime)){
+                calendar.setTime(SHORT_DATE_FORMAT.parse(internalTime));
+            }
+        }catch (ParseException e){
+            e.printStackTrace();
+        }
+        calendar.set(calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH)+1,calendar.get(Calendar.DAY_OF_MONTH));
+        calendar.set(Calendar.DAY_OF_MONTH,15);
+        return SHORT_DATE_FORMAT.format(calendar.getTime());
+    }
+
+    /**
+     * 根据(二)初步设计评审计划时间获取(三)初设外审评审时间
+     * @param internalTime
+     * @return
+     */
+    public List<String> getExternalReview(String internalTime){
+        List<String> list = new ArrayList<>();
+        //下月的10号 或者是25号
+        Calendar calendar = Calendar.getInstance();
+        try {
+            if (internalTime != null && !"".equals(internalTime)){
+                calendar.setTime(SHORT_DATE_FORMAT.parse(internalTime));
+            }
+        }catch (ParseException e){
+            e.printStackTrace();
+        }
+        calendar.set(calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH)+1,calendar.get(Calendar.DAY_OF_MONTH));
+        calendar.set(Calendar.DAY_OF_MONTH,10);
+        list.add(SHORT_DATE_FORMAT.format(calendar.getTime()));
+        calendar.set(Calendar.DAY_OF_MONTH,25);
+        list.add(SHORT_DATE_FORMAT.format(calendar.getTime()));
+        return list;
+    }
+
+    /**
+     * 根据(三)初设外审评审时间获取(四)初设评审意见时间
+     * @param time
+     * @return
+     */
+    public List<String> getReviewComments(String time){
+        List<String> list = new ArrayList<>();
+        //15天后,或者是30天后
+        Calendar calendar = Calendar.getInstance();
+        try {
+            if (time != null && !"".equals(time)){
+                calendar.setTime(SHORT_DATE_FORMAT.parse(time));
+                //15天
+                calendar.set(calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH),calendar.get(Calendar.DAY_OF_MONTH)+15);
+                list.add(SHORT_DATE_FORMAT.format(calendar.getTime()));
+
+                calendar.setTime(SHORT_DATE_FORMAT.parse(time));
+                //30天
+                calendar.set(calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH),calendar.get(Calendar.DAY_OF_MONTH)+30);
+                list.add(SHORT_DATE_FORMAT.format(calendar.getTime()));
+            }
+        }catch (ParseException e){
+            e.printStackTrace();
+        }
+        return list;
+    }
+
+    /**
+     * 根据(四)初设评审意见时间获取(五)施工图评审计划时间 60天
+     * @param time
+     * @return
+     */
+    public String getReviewPlan(String time){
+        //60天后,若超过20号则为下个月的20号
+        Calendar calendar = Calendar.getInstance();
+        try {
+            if (time != null && !"".equals(time)){
+                calendar.setTime(SHORT_DATE_FORMAT.parse(time));
+                //60天
+                calendar.set(calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH),calendar.get(Calendar.DAY_OF_MONTH)+60);
+
+                String format = SHORT_DATE_FORMAT.format(calendar.getTime());
+                calendar.setTime(SHORT_DATE_FORMAT.parse(format));
+                int day = calendar.get(Calendar.DAY_OF_MONTH);
+                if (day<=20){
+                    calendar.set(Calendar.DAY_OF_MONTH,20);
+                } else {
+                    calendar.set(Calendar.MONTH,calendar.get(Calendar.MONTH)+1);
+                    calendar.set(Calendar.DAY_OF_MONTH,20);
+                }
+                return SHORT_DATE_FORMAT.format(calendar.getTime());
+            }
+        }catch (ParseException e){
+            e.printStackTrace();
+        }
+        return "";
+    }
+
+    /**
+     * 根据(四)初设评审意见时间获取(五)施工图评审计划时间 30天
+     * @param time
+     * @return
+     */
+    public String getReviewPlan2(String time){
+        //30天后,若超过20号则为下个月的20号
+        Calendar calendar = Calendar.getInstance();
+        try {
+            if (time != null && !"".equals(time)){
+                calendar.setTime(SHORT_DATE_FORMAT.parse(time));
+                //30天
+                calendar.set(calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH),calendar.get(Calendar.DAY_OF_MONTH)+30);
+
+                String format = SHORT_DATE_FORMAT.format(calendar.getTime());
+                calendar.setTime(SHORT_DATE_FORMAT.parse(format));
+                int day = calendar.get(Calendar.DAY_OF_MONTH);
+                if (day<=20){
+                    calendar.set(Calendar.DAY_OF_MONTH,20);
+                } else {
+                    calendar.set(Calendar.MONTH,calendar.get(Calendar.MONTH)+1);
+                    calendar.set(Calendar.DAY_OF_MONTH,20);
+                }
+                return SHORT_DATE_FORMAT.format(calendar.getTime());
+            }
+        }catch (ParseException e){
+            e.printStackTrace();
+        }
+        return "";
+    }
+
+    /**
+     * 根据(五)施工图评审计划时间获取(六)施工图评审时间
+     * @param time
+     * @return
+     */
+    public List<String> getDrawingReview(String time){
+        //下个月的10号,或者是25号
+        List<String> list = new ArrayList<>();
+        Calendar calendar = Calendar.getInstance();
+        try {
+            if (time != null && !"".equals(time)){
+                calendar.setTime(SHORT_DATE_FORMAT.parse(time));
+                //10天
+//                calendar.set(calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH)+1,calendar.get(Calendar.DAY_OF_MONTH));
+                calendar.set(Calendar.MONTH,calendar.get(Calendar.MONTH)+1);
+                calendar.set(Calendar.DAY_OF_MONTH,10);
+                list.add(SHORT_DATE_FORMAT.format(calendar.getTime()));
+
+                calendar.setTime(SHORT_DATE_FORMAT.parse(time));
+                //25天
+                calendar.set(calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH)+1,calendar.get(Calendar.DAY_OF_MONTH));
+                calendar.set(Calendar.DAY_OF_MONTH,25);
+                list.add(SHORT_DATE_FORMAT.format(calendar.getTime()));
+            }
+        }catch (ParseException e){
+            e.printStackTrace();
+        }
+        return list;
+    }
+    /**
+     * 根据(六)施工图评审时间时间获取(七)施工图评审意见时间
+     * @param time
+     * @return
+     */
+    public List<String> getDrawReview(String time){
+        //15天后,或者30天后
+        List<String> list = new ArrayList<>();
+        Calendar calendar = Calendar.getInstance();
+        try {
+            if (time != null && !"".equals(time)){
+                calendar.setTime(SHORT_DATE_FORMAT.parse(time));
+                //15天后
+                calendar.set(calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH),calendar.get(Calendar.DAY_OF_MONTH)+15);
+                list.add(SHORT_DATE_FORMAT.format(calendar.getTime()));
+
+                calendar.setTime(SHORT_DATE_FORMAT.parse(time));
+                //30天后
+                calendar.set(calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH),calendar.get(Calendar.DAY_OF_MONTH)+30);
+                list.add(SHORT_DATE_FORMAT.format(calendar.getTime()));
+            }
+        }catch (ParseException e){
+            e.printStackTrace();
+        }
+        return list;
+    }
+
+    /**
+     * 获取当前月份的第一天
+     * @return
+     */
+    public String getMonth(){
+        LocalDate now = LocalDate.now();
+        LocalDate firstDayOfMonth = now.withDayOfMonth(1);
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
+        String formattedDate = firstDayOfMonth.format(formatter);
+        return formattedDate;
+    }
+
+    /**
+     * 获取当前年份所有月份的第一天
+     * @return
+     */
+    public List<String> getMonths(int year){
+        List<String> list = new ArrayList<>();
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
+
+        for (int month = 1; month <= 12; month++) {
+            LocalDate firstDayOfMonth = LocalDate.of(year, month, 1);
+            String formattedDate = firstDayOfMonth.format(formatter);
+            list.add(formattedDate);
+        }
+        return list;
+    }
+}

+ 174 - 0
src/main/java/com/jeeplus/modules/cg/infrastructure/util/InfrastructureExcelExportUtil.java

@@ -0,0 +1,174 @@
+package com.jeeplus.modules.cg.infrastructure.util;
+
+import com.jeeplus.modules.cg.infrastructure.entity.ConstructionBatch;
+import com.jeeplus.modules.cg.infrastructure.entity.InfrastructureBasicInfo;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.xssf.usermodel.XSSFCellStyle;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.*;
+import java.net.URLEncoder;
+import java.util.List;
+
+/**
+ * @author: 王强
+ * @create: 2023-05-09 09:15
+ **/
+public class InfrastructureExcelExportUtil {
+
+    private XSSFCellStyle style = null;
+
+    public static InfrastructureExcelExportUtil getOne(){
+
+        return new InfrastructureExcelExportUtil();
+    }
+
+    /**
+     * 基建 - 基本信息 - 导出数据
+     * @param response
+     * @param workbook
+     * @param list
+     */
+    public void exportBasic(HttpServletResponse response, XSSFWorkbook workbook, List<InfrastructureBasicInfo> list){
+        try {
+            int index = 1;//第一列序号
+            int rowNum = 1;//数据起始列
+            Sheet sheet = workbook.getSheetAt(0);
+            for(int i=0;i<list.size();i++){
+                Row row = sheet.createRow(rowNum+i);
+                Cell cell0 = crateCell(workbook,row,0); //序号
+                Cell cell1 = crateCell(workbook,row,1); //国网编码
+                Cell cell2 = crateCell(workbook,row,2); //项目名称
+                Cell cell3 = crateCell(workbook,row,3); //项目编码
+                Cell cell4 = crateCell(workbook,row,4); //单体项目名称
+                Cell cell5 = crateCell(workbook,row,5); //电压等级
+                Cell cell6 = crateCell(workbook,row,6); //项目类别(变电/线路)
+                Cell cell7 = crateCell(workbook,row,7); //规模
+                Cell cell8 = crateCell(workbook,row,8); //设计单位
+                Cell cell9 = crateCell(workbook,row,9); //施工单位
+                Cell cell10 = crateCell(workbook,row,9); //监理单位
+                Cell cell11 = crateCell(workbook,row,10); //(一)初步设计内审
+                Cell cell12 = crateCell(workbook,row,11); //(二)初步设计评审计划
+                Cell cell13 = crateCell(workbook,row,12); //(三)初设外审评审
+                Cell cell14 = crateCell(workbook,row,13); //(四)初设评审意见
+                Cell cell15 = crateCell(workbook,row,14); //(五)施工图评审计划
+                Cell cell16 = crateCell(workbook,row,15); //(六)施工图评审
+                Cell cell17 = crateCell(workbook,row,16); //(七)施工图评审意见
+                Cell cell18 = crateCell(workbook,row,17); //施工计划批次
+                Cell cell19 = crateCell(workbook,row,18); //施工定标日期
+
+                InfrastructureBasicInfo basicInfo = list.get(i);
+
+                cell0.setCellValue(String.valueOf(index++));
+                cell1.setCellValue(basicInfo.getStateGridCode());
+                cell2.setCellValue(basicInfo.getProjectName());
+                cell3.setCellValue(basicInfo.getProjectCode());
+                cell4.setCellValue(basicInfo.getIndividualProjectName());
+                cell5.setCellValue(basicInfo.getVoltageLevel());
+                cell6.setCellValue(basicInfo.getProjectCategory());
+                cell7.setCellValue(basicInfo.getScale());
+                cell8.setCellValue(basicInfo.getDesignUnit());
+                cell9.setCellValue(basicInfo.getConstructionUnit());
+                cell10.setCellValue(basicInfo.getControlUnit());
+                cell11.setCellValue(basicInfo.getPreliminaryDesignInternalReview());
+                cell12.setCellValue(basicInfo.getPreliminaryDesignReviewPlan());
+                cell13.setCellValue(basicInfo.getPreliminaryExternalAuditReview());
+                cell14.setCellValue(basicInfo.getPreliminaryDesignReviewComments());
+                cell15.setCellValue(basicInfo.getConstructionDrawingReviewPlan());
+                cell16.setCellValue(basicInfo.getConstructionDrawingReview());
+                cell17.setCellValue(basicInfo.getConstructionDrawReview());
+                cell18.setCellValue(basicInfo.getConstructionPlanBatch());
+                cell19.setCellValue(basicInfo.getConstructionAwardDate());
+            }
+
+            String str = URLEncoder.encode("基建项目基本信息.xlsx", "UTF8");
+            response.setHeader("Content-Disposition", "attachment;filename="+str);
+            response.setContentType("application/vnd.ms-excel;charset=UTF-8");
+            OutputStream outputStream = response.getOutputStream();
+            workbook.write(outputStream);
+            outputStream.flush();
+            outputStream.close();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 基建 - 施工计划批次信息 - 导出数据
+     * @param response
+     * @param workbook
+     * @param list
+     */
+    public void exportBatch(HttpServletResponse response, XSSFWorkbook workbook, List<ConstructionBatch> list){
+        try {
+            int index = 1;//第一列序号
+            int rowNum = 1;//数据起始列
+            Sheet sheet = workbook.getSheetAt(0);
+            for(int i=0;i<list.size();i++){
+                Row row = sheet.createRow(rowNum+i);
+                Cell cell0 = crateCell(workbook,row,0); //序号
+                Cell cell1 = crateCell(workbook,row,1); //批次名称
+                Cell cell2 = crateCell(workbook,row,2); //批次编号
+                Cell cell3 = crateCell(workbook,row,3); //施工图纸收集截止时间
+                Cell cell4 = crateCell(workbook,row,4); //拟定开标时间
+
+                ConstructionBatch batch = list.get(i);
+
+                cell0.setCellValue(String.valueOf(index++));
+                cell1.setCellValue(batch.getBatchName());
+                cell2.setCellValue(batch.getBatchNumber());
+                cell3.setCellValue(batch.getEndTime());
+                cell4.setCellValue(batch.getBidOpenTime());
+            }
+
+            String str = URLEncoder.encode("基建项目施工计划批次信息.xlsx", "UTF8");
+            response.setHeader("Content-Disposition", "attachment;filename="+str);
+            response.setContentType("application/vnd.ms-excel;charset=UTF-8");
+            OutputStream outputStream = response.getOutputStream();
+            workbook.write(outputStream);
+            outputStream.flush();
+            outputStream.close();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 创建Cell对象 同时设置style
+     * @param workbook
+     * @param row
+     * @param num
+     * @return
+     */
+    Cell crateCell(XSSFWorkbook workbook,Row row, int num){
+        Cell cell = row.createCell(num);
+        if(style == null){
+            style =workbook.createCellStyle();
+            style.setWrapText(true);
+            style.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
+        }
+        cell.setCellStyle(style);
+        return cell;
+    }
+
+    /**
+     * 传入excel模板名称 获取workbook对象
+     * @param fileName excel模板名称
+     * @return
+     */
+    public  XSSFWorkbook getWorkbook(String fileName){
+        InputStream inputStream = null;
+        XSSFWorkbook workbook = null;
+        try {
+            File file = new File(this.getClass().getResource("/").getPath() + "/freemarker/excelmodel/"+fileName+".xlsx");
+            inputStream = new FileInputStream(file);// 将excel文件转为输入流
+            workbook = new XSSFWorkbook(inputStream);// 创建个workbook,
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return workbook;
+    }
+}

+ 83 - 0
src/main/java/com/jeeplus/modules/cg/infrastructure/util/InfrastructureExcelImportUtil.java

@@ -0,0 +1,83 @@
+package com.jeeplus.modules.cg.infrastructure.util;
+
+import com.jeeplus.modules.cg.infrastructure.entity.ConstructionBatch;
+import com.jeeplus.modules.cg.infrastructure.entity.InfrastructureBasicInfo;
+import com.jeeplus.modules.sg.managementcenter.materialproject.util.ImportUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.ss.usermodel.Row;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author: 王强
+ * @create: 2023-05-08 15:32
+ **/
+public class InfrastructureExcelImportUtil {
+
+    /**
+     * 基建 - 基础信息 - 导入数据
+     *
+     * @param importUtil
+     * @return List<BudgetStats> 导入表格数据
+     */
+    public static List<InfrastructureBasicInfo> getBudgetUtil(ImportUtil importUtil, List<String> proIdList) throws Exception {
+        int lastRow = importUtil.getLastDataRowNum();
+        List<InfrastructureBasicInfo> list = new ArrayList<InfrastructureBasicInfo>();
+        InfrastructureBasicInfo basicInfo = null;
+
+        for(int i=1; i<=lastRow;i++) {
+            basicInfo = new InfrastructureBasicInfo();
+            Row row = importUtil.getRow(i);
+
+            //获取项目编码
+            String projectReserveId = (String) importUtil.getCellValue(row, 3);
+            if (StringUtils.isNotBlank(projectReserveId)) {
+
+                basicInfo.setStateGridCode((String) importUtil.getCellValue(row, 1));
+                basicInfo.setProjectName((String) importUtil.getCellValue(row, 2));
+                basicInfo.setProjectCode((String) importUtil.getCellValue(row, 3));
+                basicInfo.setIndividualProjectName((String) importUtil.getCellValue(row, 4));
+                basicInfo.setVoltageLevel((String) importUtil.getCellValue(row, 5));
+                basicInfo.setProjectCategory((String) importUtil.getCellValue(row, 6));
+                basicInfo.setScale((String) importUtil.getCellValue(row, 7));
+                basicInfo.setDesignUnit((String) importUtil.getCellValue(row, 8));
+                basicInfo.setConstructionUnit((String) importUtil.getCellValue(row, 9));
+                basicInfo.setControlUnit((String) importUtil.getCellValue(row, 10));
+
+                list.add(basicInfo);
+            }
+        }
+        return list;
+    }
+
+    /**
+     * 基建 - 施工计划批次信息 - 导入数据
+     *
+     * @param importUtil
+     * @return List<BudgetStats> 导入表格数据
+     */
+    public static List<ConstructionBatch> getBatchUtil(ImportUtil importUtil) throws Exception {
+        int lastRow = importUtil.getLastDataRowNum();
+        List<ConstructionBatch> list = new ArrayList<ConstructionBatch>();
+        ConstructionBatch batch = null;
+
+        for(int i=1; i<=lastRow;i++) {
+            batch = new ConstructionBatch();
+            Row row = importUtil.getRow(i);
+
+            //获取批次编号
+            String projectReserveId = (String) importUtil.getCellValue(row, 2);
+            if (StringUtils.isNotBlank(projectReserveId)) {
+
+                batch.setBatchName((String) importUtil.getCellValue(row, 1));
+                batch.setBatchNumber((String) importUtil.getCellValue(row, 2));
+                batch.setEndTime((String) importUtil.getCellValue(row, 3));
+                batch.setBidOpenTime((String) importUtil.getCellValue(row, 4));
+
+                list.add(batch);
+            }
+        }
+        return list;
+    }
+}

+ 140 - 0
src/main/java/com/jeeplus/modules/cg/infrastructure/web/AnnualBatchDisplayController.java

@@ -0,0 +1,140 @@
+package com.jeeplus.modules.cg.infrastructure.web;
+
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.core.persistence.Page;
+import com.jeeplus.core.web.BaseController;
+import com.jeeplus.modules.cg.infrastructure.entity.AnnualBatchDisplay;
+import com.jeeplus.modules.cg.infrastructure.entity.ConstructionBatch;
+import com.jeeplus.modules.cg.infrastructure.service.ConstructionBatchService;
+import com.jeeplus.modules.cg.infrastructure.util.ChangeTimeUtil;
+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.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 全年批次展示controller
+ * @author: 王强
+ * @create: 2023-05-09 15:34
+ **/
+@Controller
+@RequestMapping(value = "${adminPath}/cg/infrastructure/annualBatchDisplay")
+public class AnnualBatchDisplayController extends BaseController {
+
+    @Autowired
+    private ConstructionBatchService batchService;
+
+    public static final SimpleDateFormat SHORT_DATE_FORMAT = new SimpleDateFormat("yyyy/MM/dd");
+
+    /**
+     * 基建 - 全年批次信息展示 - 非新建变电站 - 列表页面
+     * @param arrangement
+     * @param model
+     * @return
+     */
+    @RequiresPermissions("cg:infrastructure:annualBatchDisplay:list")
+    @RequestMapping(value = "budgetList")
+    public String budgetList(AnnualBatchDisplay arrangement, Model model) {
+        model.addAttribute("arrangement", arrangement);
+        return "modules/cg/infrastructure/annualBatchDisplay/annualBatchDisplay";
+    }
+
+    /**
+     * 基建 - 非新建变电站 - 列表数据
+     * @param basicInfo
+     * @param request
+     * @param response
+     * @param model
+     * @return
+     */
+    @ResponseBody
+    @RequiresPermissions("cg:infrastructure:annualBatchDisplay:list")
+    @RequestMapping(value = "list")
+    public Map<String, Object> basicData(AnnualBatchDisplay basicInfo, HttpServletRequest request, HttpServletResponse response, Model model) throws ParseException {
+
+        Page<AnnualBatchDisplay> page = new Page<>(request,response);
+        List<AnnualBatchDisplay> list = new ArrayList<>();
+
+        //获取所有的施工图纸收集截止时间
+        List<ConstructionBatch> batchList = batchService.getAllDeadLine();
+
+        ChangeTimeUtil util = ChangeTimeUtil.getOne();
+
+        List<String> months = new ArrayList<>();;
+        if (StringUtils.isNotBlank(basicInfo.getYear())){
+            Integer year = Integer.parseInt(basicInfo.getYear());
+            months = util.getMonths(year);
+        }else {
+            int year = LocalDate.now().getYear();
+            months = util.getMonths(year);
+        }
+
+        for (int v = 0;v<months.size();v++){
+            AnnualBatchDisplay display = new AnnualBatchDisplay();
+            display.setPreliminaryDesignInternalReview(months.get(v));
+            display.setPreliminaryDesignReviewPlan(util.getDesignReview(display.getPreliminaryDesignInternalReview()));
+            List<String> auditList = util.getExternalReview(display.getPreliminaryDesignReviewPlan());
+
+            for (int i=0;i<auditList.size();i++){
+                display = new AnnualBatchDisplay();
+                display.setPreliminaryDesignInternalReview(months.get(v));
+                display.setPreliminaryDesignReviewPlan(util.getDesignReview(display.getPreliminaryDesignInternalReview()));
+                display.setPreliminaryExternalAuditReview(auditList.get(i));
+                List<String> comments = util.getReviewComments(auditList.get(i));
+                for (int j=0;j<comments.size();j++){
+                    display = new AnnualBatchDisplay();
+                    display.setPreliminaryDesignInternalReview(months.get(v));
+                    display.setPreliminaryDesignReviewPlan(util.getDesignReview(display.getPreliminaryDesignInternalReview()));
+                    display.setPreliminaryExternalAuditReview(auditList.get(i));
+                    display.setPreliminaryDesignReviewComments(comments.get(j));
+                    display.setConstructionDrawingReviewPlan(util.getReviewPlan2(comments.get(j)));
+                    List<String> drawReview = util.getDrawingReview(display.getConstructionDrawingReviewPlan());
+                    for (int k=0;k<drawReview.size();k++){
+                        display = new AnnualBatchDisplay();
+                        display.setPreliminaryDesignInternalReview(months.get(v));
+                        display.setPreliminaryDesignReviewPlan(util.getDesignReview(display.getPreliminaryDesignInternalReview()));
+                        display.setPreliminaryExternalAuditReview(auditList.get(i));
+                        display.setPreliminaryDesignReviewComments(comments.get(j));
+                        display.setConstructionDrawingReviewPlan(util.getReviewPlan2(comments.get(j)));
+                        display.setConstructionDrawingReview(drawReview.get(k));
+                        List<String> stringList = util.getDrawReview(drawReview.get(k));
+                        for (int z=0;z<stringList.size();z++){
+                            display = new AnnualBatchDisplay();
+                            display.setPreliminaryDesignInternalReview(months.get(v));
+                            display.setPreliminaryDesignReviewPlan(util.getDesignReview(display.getPreliminaryDesignInternalReview()));
+                            display.setPreliminaryExternalAuditReview(auditList.get(i));
+                            display.setPreliminaryDesignReviewComments(comments.get(j));
+                            display.setConstructionDrawingReviewPlan(util.getReviewPlan2(comments.get(j)));
+                            display.setConstructionDrawingReview(drawReview.get(k));
+                            display.setConstructionDrawReview(stringList.get(z));
+                            ConstructionBatch timeInterval = util.getTimeInterval(stringList.get(z),batchList);
+                            if (null != timeInterval) {
+                                display.setBatchNumber(timeInterval.getBatchNumber());
+                                display.setBidOpenTime(timeInterval.getBidOpenTime());
+                            }
+                            list.add(display);
+                        }
+                    }
+
+                }
+            }
+            list.add(null);
+        }
+
+        page.setList(list);
+
+        return getBootstrapData(page);
+    }
+
+}

+ 249 - 0
src/main/java/com/jeeplus/modules/cg/infrastructure/web/ConstructionBatchController.java

@@ -0,0 +1,249 @@
+package com.jeeplus.modules.cg.infrastructure.web;
+
+import com.jeeplus.common.json.AjaxJson;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.core.persistence.Page;
+import com.jeeplus.core.web.BaseController;
+import com.jeeplus.modules.cg.infrastructure.entity.ConstructionBatch;
+import com.jeeplus.modules.cg.infrastructure.service.ConstructionBatchService;
+import com.jeeplus.modules.cg.infrastructure.util.InfrastructureExcelExportUtil;
+import com.jeeplus.modules.cg.infrastructure.util.InfrastructureExcelImportUtil;
+import com.jeeplus.modules.sg.managementcenter.materialproject.util.ImportUtil;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+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.text.ParseException;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 基建 - 施工计划批次信息 - controller
+ * @author: 王强
+ * @create: 2023-05-09 10:53
+ **/
+@Controller
+@RequestMapping(value = "${adminPath}/cg/infrastructure/constructionBatch")
+public class ConstructionBatchController extends BaseController {
+
+    @Autowired
+    private ConstructionBatchService batchService;
+
+    @ModelAttribute
+    public ConstructionBatch get(@RequestParam(required = false) String id) {
+        ConstructionBatch entity = null;
+        if (StringUtils.isNotBlank(id)) {
+            entity = batchService.get(id);
+        }
+        if (entity == null) {
+            entity = new ConstructionBatch();
+        }
+        return entity;
+    }
+
+    /**
+     * 增加,编辑表单页面
+     * @param batch
+     * @param model
+     * @return
+     */
+    @RequiresPermissions(value={"cg:infrastructure:constructionBatch:add","cg:infrastructure:constructionBatch:edit"},logical= Logical.OR)
+    @RequestMapping(value = "form")
+    public String form(ConstructionBatch batch, Model model) {
+        model.addAttribute("batch", batch);
+        //判断id是否为空 如果未空则为新增 否则为修改
+        if(StringUtils.isBlank(batch.getId())){
+            return "modules/cg/infrastructure/constructionBatch/batchAddForm";
+        }
+        return "modules/cg/infrastructure/constructionBatch/batchUpdateForm";
+    }
+
+    /**
+     * 保存表单
+     * @param batch
+     * @return
+     */
+    @ResponseBody
+    @RequiresPermissions(value={"cg:infrastructure:constructionBatch:add"},logical=Logical.OR)
+    @RequestMapping(value = "save")
+    public AjaxJson save(ConstructionBatch batch){
+        AjaxJson j = new AjaxJson();
+        /**
+         * 后台hibernate-validation插件校验
+         */
+        String errMsg = beanValidator(batch);
+        if (StringUtils.isNotBlank(errMsg)){
+            j.setSuccess(false);
+            j.setMsg(errMsg);
+            return j;
+        }
+        ConstructionBatch constructionBatch = new ConstructionBatch();
+
+        constructionBatch.setBatchNumber(batch.getBatchNumber());
+        int count = batchService.getAllInfo(constructionBatch);
+        if (count > 0 ){
+            j.setSuccess(false);
+            j.setMsg( "批次编号为" + batch.getBatchNumber() + "的施工计划批次信息已存在,不对数据进行保存!");
+            return j;
+        }
+
+        //新增或编辑表单保存
+        batchService.save(batch);//保存
+        j.setSuccess(true);
+        j.setMsg("保存基建项目基本信息成功");
+        return j;
+    }
+
+    /**
+     * 修改表单
+     * @param batch
+     * @return
+     */
+    @ResponseBody
+    @RequiresPermissions(value={"cg:infrastructure:constructionBatch:edit"},logical=Logical.OR)
+    @RequestMapping(value = "update")
+    public AjaxJson update(ConstructionBatch batch) {
+        AjaxJson j = new AjaxJson();
+        /**
+         * 后台hibernate-validation插件校验
+         */
+        String errMsg = beanValidator(batch);
+        if (StringUtils.isNotBlank(errMsg)){
+            j.setSuccess(false);
+            j.setMsg(errMsg);
+            return j;
+        }
+        //新增或编辑表单保存
+        batchService.update(batch);
+        j.setSuccess(true);
+        j.setMsg("修改基建项目基本信息成功");
+        return j;
+    }
+
+    /**
+     * 基建 - 施工计划批次信息 - 列表页面
+     * @param batch
+     * @param model
+     * @return
+     */
+    @RequiresPermissions("cg:infrastructure:constructionBatch:list")
+    @RequestMapping(value = "budgetList")
+    public String budgetList(ConstructionBatch batch, Model model) {
+        model.addAttribute("batch", batch);
+        return "modules/cg/infrastructure/constructionBatch/constructionBatch";
+    }
+
+    /**
+     * 基建 - 施工计划批次信息 - 列表数据
+     * @param batch
+     * @param request
+     * @param response
+     * @param model
+     * @return
+     */
+    @ResponseBody
+    @RequiresPermissions("cg:infrastructure:constructionBatch:list")
+    @RequestMapping(value = "list")
+    public Map<String, Object> basicData(ConstructionBatch batch, HttpServletRequest request, HttpServletResponse response, Model model) throws ParseException {
+
+
+        Page<ConstructionBatch> page = batchService.findPage(new Page<ConstructionBatch>(request, response), batch);
+        return getBootstrapData(page);
+    }
+
+    /**
+     * 删除表单
+     */
+    @ResponseBody
+    @RequiresPermissions(value={"cg:infrastructure:constructionBatch:del"},logical= Logical.OR)
+    @RequestMapping(value = "deleteAll")
+    public AjaxJson delete(String ids){
+        AjaxJson j = new AjaxJson();
+        String idArray[] =ids.split(",");
+        for(String id : idArray){
+            try {
+                //删除前判断该项目是否在流程中
+                ConstructionBatch batch = batchService.get(id);
+                batchService.delete(batch);
+            }catch (Exception e){
+                j.setSuccess(false);
+                j.setMsg("存在关联数据,无法删除!" + e);
+                return j;
+            }
+
+        }
+        j.setMsg("删除储备项目基本信息成功");
+        return j;
+    }
+
+    /**
+     *  导入Excel数据
+     */
+    @ResponseBody
+    @RequiresPermissions("cg:infrastructure:constructionBatch:import")
+    @RequestMapping(value = "import")
+    public AjaxJson importBasic(@RequestParam("file") MultipartFile file, HttpServletResponse response, HttpServletRequest request) {
+        AjaxJson j = new AjaxJson();
+        try {
+            ImportUtil importUtil = new ImportUtil(file, 0, 1);
+
+            //获取导入表格所有数据
+            List<ConstructionBatch> batches = InfrastructureExcelImportUtil.getBatchUtil(importUtil);
+
+            //查询已有的参数数据 并分类返回已存在数据和未存在数据
+            Map map = batchService.getExistProjectList(batches);
+            //未存在数据
+            List<ConstructionBatch> withoutList = (List<ConstructionBatch>) map.get("without");
+            //已存在数据
+            List<ConstructionBatch> existList = (List<ConstructionBatch>) map.get("exist");
+
+            //对未存在的数据进行批量导入
+            if(withoutList.size()>0){
+                batchService.insertList(withoutList);
+            }
+
+            //对已存在的数据进行修改
+            if(existList.size()>0){
+                for (ConstructionBatch batch : existList) {
+                    batchService.update(batch);
+                }
+            }
+            int i = withoutList.size() + existList.size();
+            j.setMsg("已成功导入" + i + "条项目储备信息记录");
+
+        } catch (Exception e) {
+            j.setSuccess(false);
+            j.setMsg("导入储备项目概预算信息失败!失败信息:" + e.getMessage());
+        }
+        return j;
+    }
+
+    //导出excel
+    @ResponseBody
+    @RequiresPermissions("cg:infrastructure:constructionBatch:export")
+    @RequestMapping(value = "export")
+    public void exportExcel(ConstructionBatch batch, HttpServletRequest request, HttpServletResponse response) {
+        List<ConstructionBatch> list = batchService.exportFindList(batch);
+        //生成序列号
+        int i = 1;
+        for (ConstructionBatch s : list) {
+            s.setId(String.valueOf(i));
+            i++;
+        }
+
+        InfrastructureExcelExportUtil util = InfrastructureExcelExportUtil.getOne();
+        XSSFWorkbook workbook = util.getWorkbook("constructionBatch");
+        util.exportBatch(response,workbook,list);
+    }
+
+}

File diff suppressed because it is too large
+ 2222 - 0
src/main/java/com/jeeplus/modules/cg/infrastructure/web/InfrastructureBasicInfoController.java


+ 169 - 0
src/main/java/com/jeeplus/modules/cg/infrastructure/web/TransformerController.java

@@ -0,0 +1,169 @@
+package com.jeeplus.modules.cg.infrastructure.web;
+
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.core.persistence.Page;
+import com.jeeplus.core.web.BaseController;
+import com.jeeplus.modules.cg.infrastructure.entity.AnnualBatchDisplay;
+import com.jeeplus.modules.cg.infrastructure.entity.ConstructionBatch;
+import com.jeeplus.modules.cg.infrastructure.service.ConstructionBatchService;
+import com.jeeplus.modules.cg.infrastructure.util.ChangeTimeUtil;
+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.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+
+/**
+ * 基建 - 评审计划安排表
+ * @author: 王强
+ * @create: 2023-05-10 16:57
+ **/
+@Controller
+@RequestMapping(value = "${adminPath}/cg/infrastructure/transformer")
+public class TransformerController extends BaseController {
+
+    @Autowired
+    private ConstructionBatchService batchService;
+
+    public static final SimpleDateFormat SHORT_DATE_FORMAT = new SimpleDateFormat("yyyy/MM/dd");
+
+    /**
+     * 基建 - 全年批次信息展示 - 新建变电站 - 列表页面
+     * @param arrangement
+     * @param model
+     * @return
+     */
+    @RequiresPermissions("cg:infrastructure:transformer:list")
+    @RequestMapping(value = "budgetList")
+    public String budgetList(AnnualBatchDisplay arrangement, Model model) {
+        model.addAttribute("arrangement", arrangement);
+        return "modules/cg/infrastructure/annualBatchDisplay/transformer";
+    }
+
+    /**
+     * 基建 - 新建变电站 - 列表数据
+     * @param basicInfo
+     * @param request
+     * @param response
+     * @param model
+     * @return
+     */
+    @ResponseBody
+    @RequiresPermissions("cg:infrastructure:transformer:list")
+    @RequestMapping(value = "list")
+    public Map<String, Object> basicData(AnnualBatchDisplay basicInfo, HttpServletRequest request, HttpServletResponse response, Model model) throws ParseException {
+
+        Page<AnnualBatchDisplay> page = new Page<>(request,response);
+        List<AnnualBatchDisplay> list = new ArrayList<>();
+        //获取所有的施工图纸收集截止时间
+        List<ConstructionBatch> batchList = batchService.getAllDeadLine();
+
+        ChangeTimeUtil util = ChangeTimeUtil.getOne();
+
+        List<String> months = new ArrayList<>();;
+        if (StringUtils.isNotBlank(basicInfo.getYear())){
+            Integer year = Integer.parseInt(basicInfo.getYear());
+            months = util.getMonths(year);
+        }else {
+            int year = LocalDate.now().getYear();
+            months = util.getMonths(year);
+        }
+        for (int v = 0;v<months.size();v++){
+            AnnualBatchDisplay display = new AnnualBatchDisplay();
+            display.setPreliminaryDesignInternalReview(months.get(v));
+            display.setPreliminaryDesignReviewPlan(util.getDesignReview(display.getPreliminaryDesignInternalReview()));
+            List<String> auditList = util.getExternalReview(display.getPreliminaryDesignReviewPlan());
+
+            for (int i=0;i<auditList.size();i++){
+                display = new AnnualBatchDisplay();
+                display.setPreliminaryDesignInternalReview(months.get(v));
+                display.setPreliminaryDesignReviewPlan(util.getDesignReview(display.getPreliminaryDesignInternalReview()));
+                display.setPreliminaryExternalAuditReview(auditList.get(i));
+                List<String> comments = util.getReviewComments(auditList.get(i));
+                for (int j=0;j<comments.size();j++){
+                    display = new AnnualBatchDisplay();
+                    display.setPreliminaryDesignInternalReview(months.get(v));
+                    display.setPreliminaryDesignReviewPlan(util.getDesignReview(display.getPreliminaryDesignInternalReview()));
+                    display.setPreliminaryExternalAuditReview(auditList.get(i));
+                    display.setPreliminaryDesignReviewComments(comments.get(j));
+                    display.setConstructionDrawingReviewPlan(util.getReviewPlan(comments.get(j)));
+                    List<String> drawReview = util.getDrawingReview(display.getConstructionDrawingReviewPlan());
+                    for (int k=0;k<drawReview.size();k++){
+                        display = new AnnualBatchDisplay();
+                        display.setPreliminaryDesignInternalReview(months.get(v));
+                        display.setPreliminaryDesignReviewPlan(util.getDesignReview(display.getPreliminaryDesignInternalReview()));
+                        display.setPreliminaryExternalAuditReview(auditList.get(i));
+                        display.setPreliminaryDesignReviewComments(comments.get(j));
+                        display.setConstructionDrawingReviewPlan(util.getReviewPlan(comments.get(j)));
+                        display.setConstructionDrawingReview(drawReview.get(k));
+                        List<String> stringList = util.getDrawReview(drawReview.get(k));
+                        for (int z=0;z<stringList.size();z++){
+                            display = new AnnualBatchDisplay();
+                            display.setPreliminaryDesignInternalReview(months.get(v));
+                            display.setPreliminaryDesignReviewPlan(util.getDesignReview(display.getPreliminaryDesignInternalReview()));
+                            display.setPreliminaryExternalAuditReview(auditList.get(i));
+                            display.setPreliminaryDesignReviewComments(comments.get(j));
+                            display.setConstructionDrawingReviewPlan(util.getReviewPlan(comments.get(j)));
+                            display.setConstructionDrawingReview(drawReview.get(k));
+                            display.setConstructionDrawReview(stringList.get(z));
+                            ConstructionBatch timeInterval = getTimeInterval(stringList.get(z),batchList);
+                            if (null != timeInterval) {
+                                display.setBatchNumber(timeInterval.getBatchNumber());
+                                display.setBidOpenTime(timeInterval.getBidOpenTime());
+                            }
+                            list.add(display);
+                        }
+                    }
+
+                }
+            }
+            list.add(null);
+        }
+
+        page.setList(list);
+
+        return getBootstrapData(page);
+    }
+
+    /**
+     * 判断是哪一个时间区间
+     * @param time
+     * @param batches
+     * @return
+     */
+    public ConstructionBatch getTimeInterval(String time,List<ConstructionBatch> batches) throws ParseException {
+        SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy/M/dd");
+
+        // 待判断日期
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
+        LocalDate targetDate = LocalDate.parse(time, formatter);
+
+        for (int i=0;i<batches.size();i++){
+            Date da = inputFormat.parse(batches.get(i).getEndTime());
+            LocalDate startTime = LocalDate.parse(SHORT_DATE_FORMAT.format(da), formatter);
+            if (targetDate.isBefore(startTime)){
+                return batches.get(i);
+            } else {
+                for (int k=i+1;k<batches.size();k++){
+                    da = inputFormat.parse(batches.get(k).getEndTime());
+                    LocalDate startTime2 = LocalDate.parse(SHORT_DATE_FORMAT.format(da), formatter);
+                    if (targetDate.isBefore(startTime2)){
+                        return batches.get(k);
+                    }
+                }
+            }
+        }
+
+        return null;
+    }
+
+}

BIN
src/main/resources/freemarker/excelmodel/constructionBatch.xlsx


BIN
src/main/resources/freemarker/excelmodel/infrastructureBasicInfo.xlsx


+ 1 - 1
src/main/resources/properties/jeeplus.properties

@@ -139,4 +139,4 @@ spring.http.multipart.max-request-size=100MB
 domain.url=
 #\u6587\u4EF6\u4E0A\u4F20\u524D\u7F00\u8BBE\u7F6E
 #linux.file.store.prefix=/data/nginx/file
-linux.file.store.prefix=/home/nginx/file
+linux.file.store.prefix=/home/nginx/file

+ 385 - 0
src/main/webapp/static/common/js/jquery-editable.js

@@ -0,0 +1,385 @@
+/*
+* jQuery plugin that makes elements editable
+*
+* @author Victor Jonsson (http://victorjonsson.se/)
+* @website https://github.com/victorjonsson/jquery-editable/
+* @license GPLv2 http://www.gnu.org/licenses/gpl-2.0.html
+* @version 1.3.6.dev
+* @donations http://victorjonsson.se/donations/
+*/
+(function($, window) {
+
+    'use strict';
+
+    var $win = $(window), // Reference to window
+
+        // Reference to textarea
+        $textArea = false,
+
+        // Reference to currently edit element
+        $currentlyEdited = false,
+
+        // Some constants
+        EVENT_ATTR = 'data-edit-event',
+        IS_EDITING_ATTR = 'data-is-editing',
+        EMPTY_ATTR = 'data-is-empty',
+        DBL_TAP_EVENT = 'dbltap',
+        SUPPORTS_TOUCH = 'ontouchend' in window,
+        TINYMCE_INSTALLED = 'tinyMCE' in window && typeof window.tinyMCE.init == 'function',
+
+        // reference to old is function
+        oldjQueryIs = $.fn.is,
+
+        /*
+         * Function responsible of triggering double tap event
+         */
+        lastTap = 0,
+        tapper = function() {
+            var now = new Date().getTime();
+            if( (now-lastTap) < 250 ) {
+                $(this).trigger(DBL_TAP_EVENT);
+            }
+            lastTap = now;
+        },
+
+        /**
+         * Event listener that largens font size
+         */
+        keyHandler = function(e) {
+            if( e.keyCode == 13 && e.data.closeOnEnter ) {
+                $currentlyEdited.editable('close');
+            }
+            else if( e.keyCode == 27 ) {
+                $textArea.val($currentlyEdited.attr('orig-text'));
+                $currentlyEdited.editable('close');
+            }
+            else if( e.data.toggleFontSize && (e.metaKey && (e.keyCode == 38 || e.keyCode == 40)) ) {
+                var fontSize = parseInt($textArea.css('font-size'), 10);
+                fontSize += e.keyCode == 40 ? -1 : 1;
+                $textArea.css('font-size', fontSize+'px');
+                return false;
+            }
+        },
+
+        /**
+         * Adjusts the height of the textarea to remove scroll
+         * @todo This way of doing it does not make the textarea smaller when the number of text lines gets smaller
+         */
+        adjustTextAreaHeight = function() {
+            if( $textArea[0].scrollHeight !== parseInt($textArea.attr('data-scroll'), 10) ) {
+                $textArea.css('height', $textArea[0].scrollHeight +'px');
+                $textArea.attr('data-scroll', $textArea[0].scrollHeight);
+            }
+        },
+
+        /**
+         * @param {jQuery} $el
+         * @param {String} newText
+         */
+        resetElement = function($el, newText, emptyMessage) {
+            $el.removeAttr(IS_EDITING_ATTR);
+
+            if (newText.length == 0 && emptyMessage) {
+                $el.html(emptyMessage);
+                $el.attr(EMPTY_ATTR, 'empty');
+            } else {
+                $el.html( newText );
+                $el.removeAttr(EMPTY_ATTR);
+            }
+            $textArea.remove();
+        },
+
+
+        /**
+         * Function creating editor
+         */
+        elementEditor = function($el, opts) {
+
+            if( $el.is(':editing') )
+                return;
+
+            $currentlyEdited = $el;
+            $el.attr(IS_EDITING_ATTR, '1');
+
+            if ($el.is(':empty')) {
+                $el.removeAttr(EMPTY_ATTR);
+                $el.html('');
+            }
+
+            var defaultText = $.trim( $el.html() ),
+                defaultFontSize = $el.css('font-size'),
+                elementHeight = $el.height(),
+                textareaStyle = 'width: 96%; padding:0; margin:0; border:0; background:none;'+
+                    'font-family: '+$el.css('font-family')+'; font-size: '+$el.css('font-size')+';'+
+                    'font-weight: '+$el.css('font-weight')+';';
+
+            $el.attr('orig-text', defaultText);
+            if( opts.lineBreaks ) {
+                defaultText = defaultText.replace(/<br( |)(|\/)>/g, '\n');
+            }
+
+            $textArea = $('<textarea></textarea>');
+            $el.text('');
+
+            if( navigator.userAgent.match(/webkit/i) !== null ) {
+                textareaStyle = document.defaultView.getComputedStyle($el.get(0), "").cssText;
+            }
+
+            // The editor should always be static
+            textareaStyle += 'position: static';
+
+            /*
+              TINYMCE EDITOR
+             */
+            if( opts.tinyMCE !== false ) {
+                var id = 'editable-area-'+(new Date().getTime());
+                $textArea
+                    .val(defaultText)
+                    .appendTo($el)
+                    .attr('id', id);
+
+                if( typeof opts.tinyMCE != 'object' )
+                    opts.tinyMCE = {};
+
+                opts.tinyMCE.mode = 'exact';
+                opts.tinyMCE.elements = id;
+                opts.tinyMCE.width = $el.innerWidth();
+                opts.tinyMCE.height = $el.height() + 200;
+                opts.tinyMCE.theme_advanced_resize_vertical = true;
+
+                opts.tinyMCE.setup = function (ed) {
+                    ed.onInit.add(function(editor, evt) {
+                        var editorWindow = editor.getWin();
+                        var hasPressedKey = false;
+                        var editorBlur = function() {
+
+                            var newText = $(editor.getDoc()).find('body').html();
+                            if( $(newText).get(0).nodeName == $el.get(0).nodeName ) {
+                                newText = $(newText).html();
+                            }
+
+                            // Update element and remove editor
+                            resetElement($el, newText, opts.emptyMessage);
+                            editor.remove();
+                            $textArea = false;
+                            $win.unbind('click', editorBlur);
+                            $currentlyEdited = false;
+
+                            // Run callback
+                            if( typeof opts.callback == 'function' ) {
+                                opts.callback({
+                                    content : newText == defaultText || !hasPressedKey ? false : newText,
+                                    fontSize : false,
+                                    $el : $el
+                                });
+                            }
+                        };
+
+                        // Blur editor when user clicks outside the editor
+                        setTimeout(function() {
+                            $win.bind('click', editorBlur);
+                        }, 500);
+
+                        // Create a dummy textarea that will called upon when
+                        // programmatically interacting with the editor
+                        $textArea = $('<textarea></textarea>');
+                        $textArea.bind('blur', editorBlur);
+
+                        editorWindow.onkeydown = function() {
+                            hasPressedKey = true;
+                        };
+
+                        editorWindow.focus();
+                    });
+                };
+
+                tinyMCE.init(opts.tinyMCE);
+            }
+
+            /*
+             TEXTAREA EDITOR
+             */
+            else {
+
+                if( opts.toggleFontSize || opts.closeOnEnter ) {
+                    $win.bind('keydown', opts, keyHandler);
+                }
+                $win.bind('keyup', adjustTextAreaHeight);
+
+                $textArea
+                    .val(defaultText)
+                    .blur(function() {
+
+                        $currentlyEdited = false;
+
+                        // Get new text and font size
+                        var newText = $.trim( $textArea.val() ),
+                            newFontSize = $textArea.css('font-size');
+                        if( opts.lineBreaks ) {
+                            newText = newText.replace(new RegExp('\n','g'), '<br />');
+                        }
+
+                        // Update element
+                        resetElement($el, newText, opts.emptyMessage);
+                        if( newFontSize != defaultFontSize ) {
+                            $el.css('font-size', newFontSize);
+                        }
+
+                        // remove textarea and size toggles
+                        $win.unbind('keydown', keyHandler);
+                        $win.unbind('keyup', adjustTextAreaHeight);
+
+                        // Run callback
+                        if( typeof opts.callback == 'function' ) {
+                            opts.callback({
+                                content : newText == defaultText ? false : newText,
+                                fontSize : newFontSize == defaultFontSize ? false : newFontSize,
+                                $el : $el
+                            });
+                        }
+                    })
+                    .attr('style', textareaStyle)
+                    .appendTo($el)
+                    .css({
+                        margin: 0,
+                        padding: 0,
+                        height : elementHeight +'px',
+                        overflow : 'hidden'
+                    })
+                    .css(opts.editorStyle)
+                    .focus()
+                    .get(0).select();
+
+                adjustTextAreaHeight();
+
+            }
+
+            $el.trigger('edit', [$textArea]);
+        },
+
+        /**
+         * Event listener
+         */
+        editEvent = function(event) {
+
+            if( $currentlyEdited !== false && !$currentlyEdited.children("textarea").is(clickedElement)) {
+                // Not closing the currently open editor before opening a new
+                // editor makes things go crazy
+                $currentlyEdited.editable('close');
+                elementEditor($(this), event.data);
+            }
+            else {
+                elementEditor($(this), event.data);
+            }
+            return false;
+        };
+
+    /**
+     * Jquery plugin that makes elments editable
+     * @param {Object|String} [opts] Either callback function or the string 'destroy' if wanting to remove the editor event
+     * @return {jQuery|Boolean}
+     */
+    $.fn.editable = function(opts) {
+
+        if(typeof opts == 'string') {
+
+            if( this.is(':editable') ) {
+
+                switch (opts) {
+                    case 'open':
+                        if( !this.is(':editing') ) {
+                            this.trigger(this.attr(EVENT_ATTR));
+                        }
+                        break;
+                    case 'close':
+                        if( this.is(':editing') ) {
+                            $textArea.trigger('blur');
+                        }
+                        break;
+                    case 'destroy':
+                        if( this.is(':editing') ) {
+                            $textArea.trigger('blur');
+                        }
+                        this.unbind(this.attr(EVENT_ATTR));
+                        this.removeAttr(EVENT_ATTR);
+                        break;
+                    default:
+                        console.warn('Unknown command "'+opts+'" for jquery.editable');
+                }
+
+            } else {
+                console.error('Calling .editable() on an element that is not editable, call .editable() first');
+            }
+        }
+        else {
+
+            if( this.is(':editable') ) {
+                console.warn('Making an already editable element editable, call .editable("destroy") first');
+                this.editable('destroy');
+            }
+
+            opts = $.extend({
+                event : 'dblclick',
+                touch : true,
+                lineBreaks : true,
+                toggleFontSize : true,
+                closeOnEnter : false,
+                emptyMessage : false,
+                tinyMCE : false,
+                editorStyle : {}
+            }, opts);
+
+            if( opts.tinyMCE !== false && !TINYMCE_INSTALLED ) {
+                console.warn('Trying to use tinyMCE as editor but id does not seem to be installed');
+                opts.tinyMCE = false;
+            }
+
+            if( SUPPORTS_TOUCH && opts.touch ) {
+                opts.event = DBL_TAP_EVENT;
+                this.unbind('touchend', tapper);
+                this.bind('touchend', tapper);
+            }
+            else {
+                opts.event += '.textEditor';
+            }
+
+            this.bind(opts.event, opts, editEvent);
+            this.attr(EVENT_ATTR, opts.event);
+
+            // If it is empty to start with, apply the empty message
+            if (this.html().length == 0 && opts.emptyMessage) {
+                this.html(opts.emptyMessage);
+                this.attr(EMPTY_ATTR, 'empty');
+            } else {
+                this.removeAttr(EMPTY_ATTR);
+            }
+        }
+
+        return this;
+    };
+
+    /**
+     * Add :editable :editing to $.is()
+     * @param {Object} statement
+     * @return {*}
+     */
+    $.fn.is = function(statement) {
+        if( typeof statement == 'string' && statement.indexOf(':') === 0) {
+            if( statement == ':editable' ) {
+                return this.attr(EVENT_ATTR) !== undefined;
+            } else if( statement == ':editing' ) {
+                return this.attr(IS_EDITING_ATTR) !== undefined;
+            } else if( statement == ':empty' ) {
+                return this.attr(EMPTY_ATTR) !== undefined;
+            }
+        }
+        return oldjQueryIs.apply(this, arguments);
+    };
+
+    // The latest element clicked
+    var clickedElement;
+    $(document).mousedown(function(e) {
+        clickedElement = $(e.target);
+    });
+
+})(jQuery, window);

+ 312 - 0
src/main/webapp/webpage/modules/cg/infrastructure/annualBatchDisplay/annualBatchDisplay.js

@@ -0,0 +1,312 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+    <script >
+    $(document).ready(function () {
+        $('#projectTable').bootstrapTable({
+            //请求方法
+            method: 'post',
+            //类型json
+            dataType: "json",
+            contentType: "application/x-www-form-urlencoded",
+            //显示检索按钮
+            showSearch: true,
+            //显示刷新按钮
+            showRefresh: true,
+            //显示切换手机试图按钮
+            showToggle: true,
+            //显示 内容列下拉框
+            showColumns: true,
+            //显示到处按钮
+            showExport: true,
+            //显示切换分页按钮
+            showPaginationSwitch: true,
+            //最低显示2行
+            minimumCountColumns: 2,
+            //是否显示行间隔色
+            striped: true,
+            //是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*)
+            cache: false,
+            //是否显示分页(*)
+            pagination: true,
+            //排序方式
+            sortOrder: "asc",
+            //初始化加载第一页,默认第一页
+            pageNumber: 1,
+            //每页的记录行数(*)
+            pageSize: 25,
+            //可供选择的每页的行数(*)
+            pageList: [5, 10, 25, 50, 100],
+            //这个接口需要处理bootstrap table传递的固定参数,并返回特定格式的json数据
+            url: "${ctx}/cg/infrastructure/annualBatchDisplay/list",
+            //默认值为 '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}/cg/infrastructure/infrastructureBasicInfo/delete?id=" + row.id, function (data) {
+                            if (data.success) {
+                                $('#projectTable').bootstrapTable('refresh');
+                                jp.success(data.msg);
+                            } else {
+                                jp.error(data.msg);
+                            }
+                        })
+                    });
+                }
+            },
+
+            onClickRow: function (row, $el) {
+            },
+            onLoadSuccess: function () {  //加载成功时执行
+                var data = $("#projectTable").bootstrapTable('getData', true)
+                //合并单元格
+                mergeTable($('#projectTable'),"preliminaryDesignInternalReview");
+                mergeTable($('#projectTable'),"preliminaryDesignReviewPlan");
+                mergeTable($('#projectTable'),"preliminaryExternalAuditReview");
+                mergeTable($('#projectTable'),"preliminaryDesignReviewComments");
+                mergeTable($('#projectTable'),"constructionDrawingReviewPlan");
+                mergeTable($('#projectTable'),"constructionDrawingReview");
+                // mergeCells(data, "preliminaryDesignInternalReview", 1, $('#projectTable'));
+                // mergeCells(data, "preliminaryDesignReviewPlan", 1, $('#projectTable'));
+                // mergeCells(data, "preliminaryExternalAuditReview", 1, $('#projectTable'));
+                // mergeCells(data, "preliminaryDesignReviewComments", 1, $('#projectTable'));
+                // mergeCells(data, "constructionDrawingReviewPlan", 1, $('#projectTable'));
+                // mergeCells(data, "constructionDrawingReview", 1, $('#projectTable'));
+            },
+            onShowSearch: function () {
+                $("#search-collapse").slideToggle();
+            },
+            columns:
+                [
+                    [
+                        {"title":"非新建变电站批次信息","colspan":9,width: "1800px"},
+                    ],
+                    [
+                        {field:'preliminaryDesignInternalReview',title: '(一)初步设计内审',valign:"middle", align:"center"},
+                        {field:'preliminaryDesignReviewPlan',title: '(二)初步设计评审计划',valign:"middle",align: "center"},
+                        {field:'preliminaryExternalAuditReview',title: '(三)初设外审评审',valign:"middle",align: "center"},
+                        {field:'preliminaryDesignReviewComments',title: '(四)初设评审意见',valign:"middle",align: "center"},
+                        {field:'constructionDrawingReviewPlan',title: '(五)施工图评审计划',valign:"middle",align: "center"},
+                        {field:'constructionDrawingReview',title: '(六)施工图评审',valign:"middle",align: "center"},
+                        {field:'constructionDrawReview',title: '(七)施工图评审意见',valign:"middle",align: "center"},
+                        {field:'batchNumber',title: '施工计划批次',valign:"middle",align: "center"},
+                        {field:'bidOpenTime',title: '施工定标日期',valign:"middle",align: "center"},
+                    ]
+                ]
+        });
+
+
+        if (navigator.userAgent.match(/(iPhone|iPod|Android|ios)/i)) {//如果是移动端
+            $('#projectTable').bootstrapTable("toggleView");
+        }
+
+        $('#projectTable').on('check.bs.table uncheck.bs.table load-success.bs.table ' +
+            'check-all.bs.table uncheck-all.bs.table', function () {
+            $('#remove').prop('disabled', !$('#projectTable').bootstrapTable('getSelections').length);
+            $('#view,#edit,#jlEdit').prop('disabled', $('#projectTable').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) {
+                    var iframeWin = layero.find('iframe')[0]; //得到iframe页的窗口对象,执行iframe页的方法:iframeWin.method();
+                    iframeWin.contentWindow.importExcel('${ctx}/cg/infrastructure/constructionBatch/import', function (data) {
+                        if (data.success) {
+                            jp.success(data.msg);
+                            refresh();
+                        } else {
+                            jp.error(data.msg);
+                        }
+                        jp.close(index);
+                    });//调用保存事件
+                    return false;
+                },
+                btn2: function (index) {
+                    //  jp.close(index);
+                }
+            });
+        });
+
+        $("#btnExport").click(function () {
+            var projectReserveId = $("#projectReserveId").val();
+            var projectName = $("#projectName").val();
+            jp.downloadFile('${ctx}/cg/infrastructure/constructionBatch/export?projectReserveId=' + projectReserveId + '&projectName=' + projectName);
+        });
+
+        $("#search").click("click", function () {// 绑定查询按扭
+            $('#projectTable').bootstrapTable('refresh');
+        });
+
+        $("#reset").click("click", function () {// 绑定查询按扭
+            $("#searchForm  input").val("");
+            $("#searchForm  select").val("2023");
+            $("#searchForm  .select-item").html("");
+            $('#projectTable').bootstrapTable('refresh');
+        });
+
+        $('#beginBeginDate').datetimepicker({
+            format: "YYYY-MM-DD HH:mm:ss"
+        });
+        $('#endBeginDate').datetimepicker({
+            format: "YYYY-MM-DD HH:mm:ss"
+        });
+        $('#endDate').datetimepicker({
+            format: "YYYY-MM-DD HH:mm:ss"
+        });
+    });
+
+/**
+ * 合并单元格
+ * @param data 原始数据(在服务端完成排序)
+ * @param fieldName 合并属性名称
+ * @param colspan  合并列
+ * @param target  目标表格对象
+ */
+// function mergeCells(data,fieldName,colspan,target){
+//     //声明一个map计算相同属性值在data对象出现的次数和
+//     var sortMap = {};
+//     for(var i = 0 ; i < data.length ; i++){
+//         for(var prop in data[i]){
+//             if(prop == fieldName){
+//                 var key = data[i][prop]
+//                 if(sortMap.hasOwnProperty(key)){
+//                     sortMap[key] = sortMap[key] * 1 + 1;
+//                 } else {
+//                     sortMap[key] = 1;
+//                 }
+//                 break;
+//             }
+//
+//         }
+//     }
+//     for(var prop in sortMap){
+//         console.log(prop,sortMap[prop])
+//     }
+//     var index = 0;
+//     for(var prop in sortMap){
+//         var count = sortMap[prop] * 1;
+//         $(target).bootstrapTable('mergeCells',{index:index, field:fieldName, colspan: colspan, rowspan: count});
+//         index += count;
+//     }
+// }
+
+function mergeTable(bstable, fieldname) {
+    var rows = bstable.bootstrapTable('getData');
+    var rowspan = 0;
+    var index = 0;
+    var first_yjzbmc = '';
+    $.each(rows, function (i, row) {
+        if (i == 0) {
+            first_yjzbmc = row[fieldname];
+            rowspan = 1;
+            index = i;
+        } else {
+            if (first_yjzbmc === row[fieldname]) {
+                rowspan++;
+            }
+            else {
+                $(bstable).bootstrapTable('mergeCells', { index: index, field: fieldname, colspan: 1, rowspan: rowspan });
+                first_yjzbmc = row[fieldname];
+                rowspan = 1;
+                index = i;
+            }
+            if (i == (rows.length - 1)) {
+                $(bstable).bootstrapTable('mergeCells', { index: index, field: fieldname, colspan: 1, rowspan: rowspan });
+            }
+        }
+    });
+}
+
+function getIdSelections() {
+    return $.map($("#projectTable").bootstrapTable('getSelections'), function (row) {
+        return row.id
+    });
+}
+//表格超出宽度鼠标悬停显示td内容
+function paramsMatter(value,row,index,field) {
+    var span = document.createElement('span');
+    span.setAttribute('title',value);
+    span.innerHTML = value;
+    return span.outerHTML;
+}
+
+
+//刷新列表
+function refresh() {
+    $('#projectTable').bootstrapTable('refresh');
+}
+
+function add() {
+    jp.openSaveDialog('新增储备项目基本信息', "${ctx}/cg/infrastructure/constructionBatch/form", '800px', '500px');
+}
+
+
+function edit(id) {//没有权限时,不显示确定按钮
+    if (id == undefined) {
+        id = getIdSelections();
+    }
+    jp.openSaveDialog('编辑储备项目基本信息', "${ctx}/cg/infrastructure/constructionBatch/form?id=" + id, '800px', '500px');
+}
+
+function view(id) {//没有权限时,不显示确定按钮
+    if (id == undefined) {
+        id = getIdSelections();
+    }
+    jp.openViewDialog('查看储备项目基本信息', "${ctx}/cg/reservemanagementcenter/reserveManage/view?id=" + id, '800px', '500px');
+}
+
+function deleteAll(){
+
+    jp.confirm('确认要删除该储备项目基本信息吗?', function(){
+        jp.loading();
+        jp.get("${ctx}/cg/infrastructure/constructionBatch/deleteAll?ids=" + getIdSelections(), function(data){
+            if(data.success){
+                $('#projectTable').bootstrapTable('refresh');
+                jp.success(data.msg);
+            }else{
+                jp.error(data.msg);
+            }
+        })
+
+    })
+}
+//转换日期格式(时间戳转换为datetime格式)
+function changeDateFormat(cellval) {
+    var dateVal = cellval + "";
+    if (cellval != null) {
+        var date = new Date(parseInt(dateVal.replace("/Date(", "").replace(")/", ""), 10));
+        var month = date.getMonth() + 1 < 10 ? "0" + (date.getMonth() + 1) : date.getMonth() + 1;
+        var currentDate = date.getDate() < 10 ? "0" + date.getDate() : date.getDate();
+
+        /*var hours = date.getHours() < 10 ? "0" + date.getHours() : date.getHours();
+        var minutes = date.getMinutes() < 10 ? "0" + date.getMinutes() : date.getMinutes();
+        var seconds = date.getSeconds() < 10 ? "0" + date.getSeconds() : date.getSeconds();*/
+
+        return date.getFullYear() + "-" + month + "-" + currentDate /*+ " " + hours + ":" + minutes + ":" + seconds*/;
+    }
+}
+
+</script>

+ 119 - 0
src/main/webapp/webpage/modules/cg/infrastructure/annualBatchDisplay/annualBatchDisplay.jsp

@@ -0,0 +1,119 @@
+<%@ 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="annualBatchDisplay.js" %>
+	<style type="text/css">
+		.table {
+			table-layout: fixed;
+			/*word-break: break-all;*/
+			word-wrap: break-word;
+			text-align: center;
+		}
+		.table th{
+			text-align: center;
+			/*vertical-align: middle !important;*/
+		}
+		.table td{
+			text-align: center;
+			vertical-align: middle !important;
+			width: 100%;
+			white-space: nowrap;
+			overflow: hidden;
+			text-overflow: ellipsis;
+			word-wrap:break-word;
+		}
+		/*.table th, .table td {*/
+		/*	text-align: center;*/
+		/*	vertical-align: middle !important;*/
+		/*	!*width: 200px;*!*/
+		/*	!*white-space: nowrap;*!*/
+		/*}*/
+		.fixed-table-container table {
+			/*width: auto;*/
+			table-layout: fixed;
+		}
+		.bootstrap-table .table thead>tr>th {
+			padding: 0;
+			margin: 0;
+			width: 1000px;
+		}
+	</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="arrangement" 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="batchName" htmlEscape="false" maxlength="100"  class=" form-control"/>
+						</div>
+						--%>
+						<div class="col-xs-12 col-sm-6 col-md-4" class="form-control">
+							<label for="year" class="label-item single-overflow pull-left">选择年份:</label>
+							<select name="year" id="year">
+								<% for (int i = 2023; i <= 2033; i++) { %>
+								<option value="<%= i %>"><%= i %></option>
+								<% } %>
+							</select>
+						</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">
+				<%--<shiro:hasPermission name="cg:infrastructure:constructionBatch:add">
+					<button id="add" class="btn btn-primary" onclick="add()">
+						<i class="glyphicon glyphicon-plus"></i> 新增
+					</button>
+				</shiro:hasPermission>
+				<shiro:hasPermission name="cg:infrastructure:constructionBatch:edit">
+					<button id="edit" class="btn btn-primary" onclick="edit()">
+						<i class="glyphicon glyphicon-edit"></i> 修改 <!--专职修改-->
+					</button>
+				</shiro:hasPermission>
+				<shiro:hasPermission name="cg:infrastructure:constructionBatch:del">
+					<button id="remove" class="btn btn-danger" onclick="deleteAll()">
+						<i class="glyphicon glyphicon-remove"></i> 删除
+					</button>
+				</shiro:hasPermission>
+				<shiro:hasPermission name="cg:infrastructure:constructionBatch:import">
+					<button id="btnImport" class="btn btn-info">
+						<i class="fa fa-folder-open-o"></i> 导入  <!--专职导入-->
+					</button>
+				</shiro:hasPermission>
+				<shiro:hasPermission name="cg:infrastructure:constructionBatch:export">
+					<button id="btnExport" class="btn btn-warning">
+						<i class="fa fa-file-excel-o"></i> 导出
+					</button>
+				</shiro:hasPermission>--%>
+			</div>
+			<!-- 表格 -->
+			<table id="projectTable" style="table-layout:fixed" class="table" data-toolbar="#toolbar"></table>
+
+		</div>
+	</div>
+</div>
+</body>
+</html>

+ 312 - 0
src/main/webapp/webpage/modules/cg/infrastructure/annualBatchDisplay/transformer.js

@@ -0,0 +1,312 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+    <script >
+    $(document).ready(function () {
+        $('#projectTable').bootstrapTable({
+            //请求方法
+            method: 'post',
+            //类型json
+            dataType: "json",
+            contentType: "application/x-www-form-urlencoded",
+            //显示检索按钮
+            showSearch: true,
+            //显示刷新按钮
+            showRefresh: true,
+            //显示切换手机试图按钮
+            showToggle: true,
+            //显示 内容列下拉框
+            showColumns: true,
+            //显示到处按钮
+            showExport: true,
+            //显示切换分页按钮
+            showPaginationSwitch: true,
+            //最低显示2行
+            minimumCountColumns: 2,
+            //是否显示行间隔色
+            striped: true,
+            //是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*)
+            cache: false,
+            //是否显示分页(*)
+            pagination: true,
+            //排序方式
+            sortOrder: "asc",
+            //初始化加载第一页,默认第一页
+            pageNumber: 1,
+            //每页的记录行数(*)
+            pageSize: 25,
+            //可供选择的每页的行数(*)
+            pageList: [5, 10, 25, 50, 100],
+            //这个接口需要处理bootstrap table传递的固定参数,并返回特定格式的json数据
+            url: "${ctx}/cg/infrastructure/transformer/list",
+            //默认值为 '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}/cg/infrastructure/infrastructureBasicInfo/delete?id=" + row.id, function (data) {
+                            if (data.success) {
+                                $('#projectTable').bootstrapTable('refresh');
+                                jp.success(data.msg);
+                            } else {
+                                jp.error(data.msg);
+                            }
+                        })
+                    });
+                }
+            },
+
+            onClickRow: function (row, $el) {
+            },
+            onLoadSuccess: function () {  //加载成功时执行
+                var data = $("#projectTable").bootstrapTable('getData', true)
+                //合并单元格
+                mergeTable($('#projectTable'),"preliminaryDesignInternalReview");
+                mergeTable($('#projectTable'),"preliminaryDesignReviewPlan");
+                mergeTable($('#projectTable'),"preliminaryExternalAuditReview");
+                mergeTable($('#projectTable'),"preliminaryDesignReviewComments");
+                mergeTable($('#projectTable'),"constructionDrawingReviewPlan");
+                mergeTable($('#projectTable'),"constructionDrawingReview");
+                // mergeCells(data, "preliminaryDesignInternalReview", 1, $('#projectTable'));
+                // mergeCells(data, "preliminaryDesignReviewPlan", 1, $('#projectTable'));
+                // mergeCells(data, "preliminaryExternalAuditReview", 1, $('#projectTable'));
+                // mergeCells(data, "preliminaryDesignReviewComments", 1, $('#projectTable'));
+                // mergeCells(data, "constructionDrawingReviewPlan", 1, $('#projectTable'));
+                // mergeCells(data, "constructionDrawingReview", 1, $('#projectTable'));
+            },
+            onShowSearch: function () {
+                $("#search-collapse").slideToggle();
+            },
+            columns:
+                [
+                    [
+                        {"title":"非新建变电站批次信息","colspan":9,width: "1800px"},
+                    ],
+                    [
+                        {field:'preliminaryDesignInternalReview',title: '(一)初步设计内审',valign:"middle", align:"center"},
+                        {field:'preliminaryDesignReviewPlan',title: '(二)初步设计评审计划',valign:"middle",align: "center"},
+                        {field:'preliminaryExternalAuditReview',title: '(三)初设外审评审',valign:"middle",align: "center"},
+                        {field:'preliminaryDesignReviewComments',title: '(四)初设评审意见',valign:"middle",align: "center"},
+                        {field:'constructionDrawingReviewPlan',title: '(五)施工图评审计划',valign:"middle",align: "center"},
+                        {field:'constructionDrawingReview',title: '(六)施工图评审',valign:"middle",align: "center"},
+                        {field:'constructionDrawReview',title: '(七)施工图评审意见',valign:"middle",align: "center"},
+                        {field:'batchNumber',title: '施工计划批次',valign:"middle",align: "center"},
+                        {field:'bidOpenTime',title: '施工定标日期',valign:"middle",align: "center"},
+                    ]
+                ]
+        });
+
+
+        if (navigator.userAgent.match(/(iPhone|iPod|Android|ios)/i)) {//如果是移动端
+            $('#projectTable').bootstrapTable("toggleView");
+        }
+
+        $('#projectTable').on('check.bs.table uncheck.bs.table load-success.bs.table ' +
+            'check-all.bs.table uncheck-all.bs.table', function () {
+            $('#remove').prop('disabled', !$('#projectTable').bootstrapTable('getSelections').length);
+            $('#view,#edit,#jlEdit').prop('disabled', $('#projectTable').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) {
+                    var iframeWin = layero.find('iframe')[0]; //得到iframe页的窗口对象,执行iframe页的方法:iframeWin.method();
+                    iframeWin.contentWindow.importExcel('${ctx}/cg/infrastructure/constructionBatch/import', function (data) {
+                        if (data.success) {
+                            jp.success(data.msg);
+                            refresh();
+                        } else {
+                            jp.error(data.msg);
+                        }
+                        jp.close(index);
+                    });//调用保存事件
+                    return false;
+                },
+                btn2: function (index) {
+                    //  jp.close(index);
+                }
+            });
+        });
+
+        $("#btnExport").click(function () {
+            var projectReserveId = $("#projectReserveId").val();
+            var projectName = $("#projectName").val();
+            jp.downloadFile('${ctx}/cg/infrastructure/constructionBatch/export?projectReserveId=' + projectReserveId + '&projectName=' + projectName);
+        });
+
+        $("#search").click("click", function () {// 绑定查询按扭
+            $('#projectTable').bootstrapTable('refresh');
+        });
+
+        $("#reset").click("click", function () {// 绑定查询按扭
+            $("#searchForm  input").val("");
+            $("#searchForm  select").val("2023");
+            $("#searchForm  .select-item").html("");
+            $('#projectTable').bootstrapTable('refresh');
+        });
+
+        $('#beginBeginDate').datetimepicker({
+            format: "YYYY-MM-DD HH:mm:ss"
+        });
+        $('#endBeginDate').datetimepicker({
+            format: "YYYY-MM-DD HH:mm:ss"
+        });
+        $('#endDate').datetimepicker({
+            format: "YYYY-MM-DD HH:mm:ss"
+        });
+    });
+
+/**
+ * 合并单元格
+ * @param data 原始数据(在服务端完成排序)
+ * @param fieldName 合并属性名称
+ * @param colspan  合并列
+ * @param target  目标表格对象
+ */
+// function mergeCells(data,fieldName,colspan,target){
+//     //声明一个map计算相同属性值在data对象出现的次数和
+//     var sortMap = {};
+//     for(var i = 0 ; i < data.length ; i++){
+//         for(var prop in data[i]){
+//             if(prop == fieldName){
+//                 var key = data[i][prop]
+//                 if(sortMap.hasOwnProperty(key)){
+//                     sortMap[key] = sortMap[key] * 1 + 1;
+//                 } else {
+//                     sortMap[key] = 1;
+//                 }
+//                 break;
+//             }
+//
+//         }
+//     }
+//     for(var prop in sortMap){
+//         console.log(prop,sortMap[prop])
+//     }
+//     var index = 0;
+//     for(var prop in sortMap){
+//         var count = sortMap[prop] * 1;
+//         $(target).bootstrapTable('mergeCells',{index:index, field:fieldName, colspan: colspan, rowspan: count});
+//         index += count;
+//     }
+// }
+
+function mergeTable(bstable, fieldname) {
+    var rows = bstable.bootstrapTable('getData');
+    var rowspan = 0;
+    var index = 0;
+    var first_yjzbmc = '';
+    $.each(rows, function (i, row) {
+        if (i == 0) {
+            first_yjzbmc = row[fieldname];
+            rowspan = 1;
+            index = i;
+        } else {
+            if (first_yjzbmc === row[fieldname]) {
+                rowspan++;
+            }
+            else {
+                $(bstable).bootstrapTable('mergeCells', { index: index, field: fieldname, colspan: 1, rowspan: rowspan });
+                first_yjzbmc = row[fieldname];
+                rowspan = 1;
+                index = i;
+            }
+            if (i == (rows.length - 1)) {
+                $(bstable).bootstrapTable('mergeCells', { index: index, field: fieldname, colspan: 1, rowspan: rowspan });
+            }
+        }
+    });
+}
+
+function getIdSelections() {
+    return $.map($("#projectTable").bootstrapTable('getSelections'), function (row) {
+        return row.id
+    });
+}
+//表格超出宽度鼠标悬停显示td内容
+function paramsMatter(value,row,index,field) {
+    var span = document.createElement('span');
+    span.setAttribute('title',value);
+    span.innerHTML = value;
+    return span.outerHTML;
+}
+
+
+//刷新列表
+function refresh() {
+    $('#projectTable').bootstrapTable('refresh');
+}
+
+function add() {
+    jp.openSaveDialog('新增储备项目基本信息', "${ctx}/cg/infrastructure/constructionBatch/form", '800px', '500px');
+}
+
+
+function edit(id) {//没有权限时,不显示确定按钮
+    if (id == undefined) {
+        id = getIdSelections();
+    }
+    jp.openSaveDialog('编辑储备项目基本信息', "${ctx}/cg/infrastructure/constructionBatch/form?id=" + id, '800px', '500px');
+}
+
+function view(id) {//没有权限时,不显示确定按钮
+    if (id == undefined) {
+        id = getIdSelections();
+    }
+    jp.openViewDialog('查看储备项目基本信息', "${ctx}/cg/reservemanagementcenter/reserveManage/view?id=" + id, '800px', '500px');
+}
+
+function deleteAll(){
+
+    jp.confirm('确认要删除该储备项目基本信息吗?', function(){
+        jp.loading();
+        jp.get("${ctx}/cg/infrastructure/constructionBatch/deleteAll?ids=" + getIdSelections(), function(data){
+            if(data.success){
+                $('#projectTable').bootstrapTable('refresh');
+                jp.success(data.msg);
+            }else{
+                jp.error(data.msg);
+            }
+        })
+
+    })
+}
+//转换日期格式(时间戳转换为datetime格式)
+function changeDateFormat(cellval) {
+    var dateVal = cellval + "";
+    if (cellval != null) {
+        var date = new Date(parseInt(dateVal.replace("/Date(", "").replace(")/", ""), 10));
+        var month = date.getMonth() + 1 < 10 ? "0" + (date.getMonth() + 1) : date.getMonth() + 1;
+        var currentDate = date.getDate() < 10 ? "0" + date.getDate() : date.getDate();
+
+        /*var hours = date.getHours() < 10 ? "0" + date.getHours() : date.getHours();
+        var minutes = date.getMinutes() < 10 ? "0" + date.getMinutes() : date.getMinutes();
+        var seconds = date.getSeconds() < 10 ? "0" + date.getSeconds() : date.getSeconds();*/
+
+        return date.getFullYear() + "-" + month + "-" + currentDate /*+ " " + hours + ":" + minutes + ":" + seconds*/;
+    }
+}
+
+</script>

+ 113 - 0
src/main/webapp/webpage/modules/cg/infrastructure/annualBatchDisplay/transformer.jsp

@@ -0,0 +1,113 @@
+<%@ 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="transformer.js" %>
+	<style type="text/css">
+		.table {
+			table-layout: fixed;
+			/*word-break: break-all;*/
+			word-wrap: break-word;
+			text-align: center;
+		}
+		.table th{
+			text-align: center;
+			/*vertical-align: middle !important;*/
+		}
+		.table td{
+			text-align: center;
+			vertical-align: middle !important;
+			width: 100%;
+			white-space: nowrap;
+			overflow: hidden;
+			text-overflow: ellipsis;
+			word-wrap:break-word;
+		}
+		/*.table th, .table td {*/
+		/*	text-align: center;*/
+		/*	vertical-align: middle !important;*/
+		/*	!*width: 200px;*!*/
+		/*	!*white-space: nowrap;*!*/
+		/*}*/
+		.fixed-table-container table {
+			/*width: auto;*/
+			table-layout: fixed;
+		}
+		.bootstrap-table .table thead>tr>th {
+			padding: 0;
+			margin: 0;
+			width: 1000px;
+		}
+	</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="arrangement" class="form form-horizontal well clearfix">
+						<div class="col-xs-12 col-sm-6 col-md-4" class="form-control">
+							<label for="year" class="label-item single-overflow pull-left">选择年份:</label>
+							<select name="year" id="year">
+								<% for (int i = 2023; i <= 2033; i++) { %>
+								<option value="<%= i %>"><%= i %></option>
+								<% } %>
+							</select>
+						</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">
+				<%--<shiro:hasPermission name="cg:infrastructure:constructionBatch:add">
+					<button id="add" class="btn btn-primary" onclick="add()">
+						<i class="glyphicon glyphicon-plus"></i> 新增
+					</button>
+				</shiro:hasPermission>
+				<shiro:hasPermission name="cg:infrastructure:constructionBatch:edit">
+					<button id="edit" class="btn btn-primary" onclick="edit()">
+						<i class="glyphicon glyphicon-edit"></i> 修改 <!--专职修改-->
+					</button>
+				</shiro:hasPermission>
+				<shiro:hasPermission name="cg:infrastructure:constructionBatch:del">
+					<button id="remove" class="btn btn-danger" onclick="deleteAll()">
+						<i class="glyphicon glyphicon-remove"></i> 删除
+					</button>
+				</shiro:hasPermission>
+				<shiro:hasPermission name="cg:infrastructure:constructionBatch:import">
+					<button id="btnImport" class="btn btn-info">
+						<i class="fa fa-folder-open-o"></i> 导入  <!--专职导入-->
+					</button>
+				</shiro:hasPermission>
+				<shiro:hasPermission name="cg:infrastructure:constructionBatch:export">
+					<button id="btnExport" class="btn btn-warning">
+						<i class="fa fa-file-excel-o"></i> 导出
+					</button>
+				</shiro:hasPermission>--%>
+			</div>
+			<!-- 表格 -->
+			<table id="projectTable" style="table-layout:fixed" class="table" data-toolbar="#toolbar"></table>
+
+		</div>
+	</div>
+</div>
+</body>
+</html>

+ 263 - 0
src/main/webapp/webpage/modules/cg/infrastructure/basicInfo/basicInfo.js

@@ -0,0 +1,263 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+    <script >
+    $(document).ready(function () {
+        $('#projectTable').bootstrapTable({
+            //请求方法
+            method: 'post',
+            //类型json
+            dataType: "json",
+            contentType: "application/x-www-form-urlencoded",
+            //显示检索按钮
+            showSearch: true,
+            //显示刷新按钮
+            showRefresh: true,
+            //显示切换手机试图按钮
+            showToggle: true,
+            //显示 内容列下拉框
+            showColumns: true,
+            //显示到处按钮
+            showExport: true,
+            //显示切换分页按钮
+            showPaginationSwitch: true,
+            //最低显示2行
+            minimumCountColumns: 2,
+            //是否显示行间隔色
+            striped: true,
+            //是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*)
+            cache: false,
+            //是否显示分页(*)
+            pagination: true,
+            //排序方式
+            sortOrder: "asc",
+            //初始化加载第一页,默认第一页
+            pageNumber: 1,
+            //每页的记录行数(*)
+            pageSize: 25,
+            //可供选择的每页的行数(*)
+            pageList: [5, 10, 25, 50, 100],
+            //这个接口需要处理bootstrap table传递的固定参数,并返回特定格式的json数据
+            url: "${ctx}/cg/infrastructure/infrastructureBasicInfo/list",
+            //默认值为 '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}/cg/infrastructure/infrastructureBasicInfo/delete?id=" + row.id, function (data) {
+                            if (data.success) {
+                                $('#projectTable').bootstrapTable('refresh');
+                                jp.success(data.msg);
+                            } else {
+                                jp.error(data.msg);
+                            }
+                        })
+                    });
+                }
+            },
+
+            onClickRow: function (row, $el) {
+            },
+            onShowSearch: function () {
+                $("#search-collapse").slideToggle();
+            },
+            columns:
+                [
+                    [
+                        {checkbox:true,width: 36},
+                        {"title":"基建项目基本信息","colspan":19,width: "3800px"},
+                    ],
+                    [
+                        {checkbox:true,width: 36},
+                        {field:'stateGridCode',title: '国网编码',valign:"middle",align: "center"},
+                        {field:'projectName',title: '项目名称',valign:"middle",align: "center",
+                            formatter:function(value, row , index){
+
+                                if(value == null || value ==""){
+                                    value = "-";
+                                }
+                            <c:choose>
+                                <c:when test="${fns:hasPermission('cg:infrastructure:reviewPlan:list')}">
+                                return "<a href='javascript:view(\""+row.id+"\")'>"+value+"</a>";
+                            </c:when>
+                                <c:otherwise>
+                                return value;
+                            </c:otherwise>
+                                </c:choose>
+                            }
+                        },
+                        {field:'projectCode',title: '项目编码',valign:"middle",align: "center"},
+                        {field:'individualProjectName',title: '单体项目名称',valign:"middle",align: "center"
+                        },
+                        {field:'voltageLevel',title: '电压等级',valign:"middle",align: "center"},
+                        {field:'projectCategory',title: '项目类别(变电/线路)',valign:"middle",align: "center"},
+                        {field:'scale',title: '规模',valign:"middle",align: "center"},
+                        {field:'designUnit',title: '设计单位',valign:"middle",align: "center"},
+                        {field:'constructionUnit',title: '施工单位',valign:"middle",align: "center"},
+                        {field:'controlUnit',title: '监理单位',valign:"middle",align: "center"},
+                        {field:'preliminaryDesignInternalReview',title: '(一)初步设计内审',valign:"middle",align: "center"},
+                        {field:'preliminaryDesignReviewPlan',title: '(二)初步设计评审计划',valign:"middle",align: "center"},
+                        {field:'preliminaryExternalAuditReview',title: '(三)初设外审评审',valign:"middle",align: "center"},
+                        {field:'preliminaryDesignReviewComments',title: '(四)初设评审意见',valign:"middle",align: "center"},
+                        {field:'constructionDrawingReviewPlan',title: '(五)施工图评审计划',valign:"middle",align: "center"},
+                        {field:'constructionDrawingReview',title: '(六)施工图评审',valign:"middle",align: "center"},
+                        {field:'constructionDrawReview',title: '(七)施工图评审意见',valign:"middle",align: "center"},
+                        {field:'constructionPlanBatch',title: '施工计划批次',valign:"middle",align: "center"},
+                        {field:'constructionAwardDate',title: '施工定标日期',valign:"middle",align: "center"},
+                    ]
+                ]
+        });
+
+
+        if (navigator.userAgent.match(/(iPhone|iPod|Android|ios)/i)) {//如果是移动端
+            $('#projectTable').bootstrapTable("toggleView");
+        }
+
+        $('#projectTable').on('check.bs.table uncheck.bs.table load-success.bs.table ' +
+            'check-all.bs.table uncheck-all.bs.table', function () {
+            $('#remove').prop('disabled', !$('#projectTable').bootstrapTable('getSelections').length);
+            $('#view,#edit,#jlEdit').prop('disabled', $('#projectTable').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) {
+                    var iframeWin = layero.find('iframe')[0]; //得到iframe页的窗口对象,执行iframe页的方法:iframeWin.method();
+                    iframeWin.contentWindow.importExcel('${ctx}/cg/infrastructure/infrastructureBasicInfo/import', function (data) {
+                        if (data.success) {
+                            jp.success(data.msg);
+                            refresh();
+                        } else {
+                            jp.error(data.msg);
+                        }
+                        jp.close(index);
+                    });//调用保存事件
+                    return false;
+                },
+                btn2: function (index) {
+                    //  jp.close(index);
+                }
+            });
+        });
+
+        $("#btnExport").click(function () {
+            var projectReserveId = $("#projectReserveId").val();
+            var projectName = $("#projectName").val();
+            jp.downloadFile('${ctx}/cg/infrastructure/infrastructureBasicInfo/export?projectReserveId=' + projectReserveId + '&projectName=' + projectName);
+        });
+
+        $("#search").click("click", function () {// 绑定查询按扭
+            $('#projectTable').bootstrapTable('refresh');
+        });
+
+        $("#reset").click("click", function () {// 绑定查询按扭
+            $("#searchForm  input").val("");
+            $("#searchForm  select").val("");
+            $("#searchForm  .select-item").html("");
+            $('#projectTable').bootstrapTable('refresh');
+        });
+
+        $('#beginBeginDate').datetimepicker({
+            format: "YYYY-MM-DD HH:mm:ss"
+        });
+        $('#endBeginDate').datetimepicker({
+            format: "YYYY-MM-DD HH:mm:ss"
+        });
+        $('#endDate').datetimepicker({
+            format: "YYYY-MM-DD HH:mm:ss"
+        });
+    });
+
+function getIdSelections() {
+    return $.map($("#projectTable").bootstrapTable('getSelections'), function (row) {
+        return row.id
+    });
+}
+//表格超出宽度鼠标悬停显示td内容
+function paramsMatter(value,row,index,field) {
+    var span = document.createElement('span');
+    span.setAttribute('title',value);
+    span.innerHTML = value;
+    return span.outerHTML;
+}
+
+//刷新列表
+function refresh() {
+    $('#projectTable').bootstrapTable('refresh');
+}
+
+function add() {
+    jp.openSaveDialog('新增储备项目基本信息', "${ctx}/cg/infrastructure/infrastructureBasicInfo/form", '800px', '500px');
+}
+
+
+function edit(id) {//没有权限时,不显示确定按钮
+    if (id == undefined) {
+        id = getIdSelections();
+    }
+    jp.openSaveDialog('编辑储备项目基本信息', "${ctx}/cg/infrastructure/infrastructureBasicInfo/form?id=" + id, '800px', '500px');
+}
+
+function view(id) {//没有权限时,不显示确定按钮
+    if (id == undefined) {
+        id = getIdSelections();
+    }
+    // jp.openSaveDialog('评审计划安排', "${ctx}/cg/infrastructure/infrastructureBasicInfo/view?id=" + id, '1000px', '800px');
+    jp.openTab("${ctx}/cg/infrastructure/infrastructureBasicInfo/view?id=" + id,"评审计划安排信息",false);
+}
+
+function deleteAll(){
+
+    jp.confirm('确认要删除该储备项目基本信息吗?', function(){
+        jp.loading();
+        jp.get("${ctx}/cg/infrastructure/infrastructureBasicInfo/deleteAll?ids=" + getIdSelections(), function(data){
+            if(data.success){
+                $('#projectTable').bootstrapTable('refresh');
+                jp.success(data.msg);
+            }else{
+                jp.error(data.msg);
+            }
+        })
+
+    })
+}
+//转换日期格式(时间戳转换为datetime格式)
+function changeDateFormat(cellval) {
+    var dateVal = cellval + "";
+    if (cellval != null) {
+        var date = new Date(parseInt(dateVal.replace("/Date(", "").replace(")/", ""), 10));
+        var month = date.getMonth() + 1 < 10 ? "0" + (date.getMonth() + 1) : date.getMonth() + 1;
+        var currentDate = date.getDate() < 10 ? "0" + date.getDate() : date.getDate();
+
+        /*var hours = date.getHours() < 10 ? "0" + date.getHours() : date.getHours();
+        var minutes = date.getMinutes() < 10 ? "0" + date.getMinutes() : date.getMinutes();
+        var seconds = date.getSeconds() < 10 ? "0" + date.getSeconds() : date.getSeconds();*/
+
+        return date.getFullYear() + "-" + month + "-" + currentDate /*+ " " + hours + ":" + minutes + ":" + seconds*/;
+    }
+}
+
+</script>
+

+ 108 - 0
src/main/webapp/webpage/modules/cg/infrastructure/basicInfo/basicInfo.jsp

@@ -0,0 +1,108 @@
+<%@ 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="basicInfo.js" %>
+	<style type="text/css">
+		.table {
+			table-layout: fixed;
+			/*word-break: break-all;*/
+			word-wrap: break-word;
+			text-align: center;
+		}
+		.table th{
+			text-align: center;
+			/*vertical-align: middle !important;*/
+		}
+		.table td{
+			text-align: center;
+			vertical-align: middle !important;
+			width: 100%;
+			white-space: nowrap;
+			overflow: hidden;
+			text-overflow: ellipsis;
+			word-wrap:break-word;
+		}
+		/*.table th, .table td {*/
+		/*	text-align: center;*/
+		/*	vertical-align: middle !important;*/
+		/*	!*width: 200px;*!*/
+		/*	!*white-space: nowrap;*!*/
+		/*}*/
+		.fixed-table-container table {
+			/*width: auto;*/
+			table-layout: fixed;
+		}
+		.bootstrap-table .table thead>tr>th {
+			padding: 0;
+			margin: 0;
+			width: 3000px;
+		}
+	</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="basicInfo" 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="projectName" htmlEscape="false" maxlength="100"  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">
+				<shiro:hasPermission name="cg:infrastructure:infrastructureBasicInfo:add">
+					<button id="add" class="btn btn-primary" onclick="add()">
+						<i class="glyphicon glyphicon-plus"></i> 新增
+					</button>
+				</shiro:hasPermission>
+				<shiro:hasPermission name="cg:infrastructure:infrastructureBasicInfo:edit">
+					<button id="edit" class="btn btn-primary" onclick="edit()">
+						<i class="glyphicon glyphicon-edit"></i> 修改 <!--专职修改-->
+					</button>
+				</shiro:hasPermission>
+				<shiro:hasPermission name="cg:infrastructure:infrastructureBasicInfo:del">
+					<button id="remove" class="btn btn-danger" onclick="deleteAll()">
+						<i class="glyphicon glyphicon-remove"></i> 删除
+					</button>
+				</shiro:hasPermission>
+				<shiro:hasPermission name="cg:infrastructure:infrastructureBasicInfo:import">
+					<button id="btnImport" class="btn btn-info">
+						<i class="fa fa-folder-open-o"></i> 导入  <!--专职导入-->
+					</button>
+				</shiro:hasPermission>
+				<shiro:hasPermission name="cg:infrastructure:infrastructureBasicInfo:export">
+					<button id="btnExport" class="btn btn-warning">
+						<i class="fa fa-file-excel-o"></i> 导出
+					</button>
+				</shiro:hasPermission>
+			</div>
+			<!-- 表格 -->
+			<table id="projectTable" style="table-layout:fixed" class="table" data-toolbar="#toolbar"></table>
+
+		</div>
+	</div>
+</div>
+</body>
+</html>

+ 123 - 0
src/main/webapp/webpage/modules/cg/infrastructure/basicInfo/basicInfoAddForm.jsp

@@ -0,0 +1,123 @@
+<%@ 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">
+
+		$(document).ready(function() {
+
+	        $('#beginDate').datetimepicker({
+				 format: "YYYY-MM-DD HH:mm:ss"
+		    });
+	        $('#endDate').datetimepicker({
+				 format: "YYYY-MM-DD HH:mm:ss"
+		    });
+		});
+		function save() {
+
+			var stateGridCode = $("#stateGridCode").val();
+			var projectName = $("#projectName").val();
+			var projectCode = $("#projectCode").val();
+			var projectCategory = $("#projectCategory").val();
+
+			if (null==stateGridCode||""==stateGridCode){
+				jp.error("请填写国网编码!");
+			}else if(null==projectName||""==projectName){
+				jp.error("请填写项目名称!");
+			}else if (null==projectCode||""==projectCode){
+				jp.error("请填写项目编码!")
+			}else if (null==projectCategory||""==projectCategory){
+				jp.error("请填写项目类别!")
+			} else {
+				var isValidate = jp.validateForm('#inputForm');//校验表单
+				if(!isValidate){
+					return false;
+				}else{
+					jp.loading();
+					jp.post("${ctx}/cg/infrastructure/infrastructureBasicInfo/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);
+						}
+					})
+				}
+			}
+
+
+        }
+	</script>
+</head>
+<body class="bg-white">
+	<form:form id="inputForm" modelAttribute="basicInfo" class="form-horizontal">
+	<form:hidden path="id"/>
+	<table class="table table-bordered">
+		<tbody>
+		<tr>
+			<td colspan="4" class="width-15 active"><label class="">基建项目基本信息:</label></td>
+		</tr>
+		<tr>
+			<td class="width-15 active"><label class=""><font color="red">*</font>国网编码:</label></td>
+			<td class="width-35">
+				<form:input path="stateGridCode" htmlEscape="false" class="form-control"/>
+			</td>
+			<td class="width-15 active"><label class=""><font color="red">*</font>项目名称:</label></td>
+			<td class="width-35">
+				<form:input path="projectName" htmlEscape="false" class="form-control"/>
+			</td>
+		</tr>
+		<tr>
+			<td class="width-15 active"><label class=""><font color="red">*</font>项目编码:</label></td>
+			<td class="width-35">
+				<form:input path="projectCode" htmlEscape="false" class="form-control"/>
+			</td>
+			<td class="width-15 active"><label class="">单体项目名称:</label></td>
+			<td class="width-35">
+				<form:input path="individualProjectName" htmlEscape="false" class="form-control"/>
+			</td>
+		</tr>
+		<tr>
+			<td class="width-15 active"><label class="">电压等级:</label></td>
+			<td class="width-35">
+				<form:input path="voltageLevel" htmlEscape="false" class="form-control"/>
+			</td>
+			<td class="width-15 active"><label class=""><font color="red">*</font>项目类别(变电/线路):</label></td>
+			<td class="width-35">
+				<select id="projectCategory" name="projectCategory"  class="form-control">
+					<option value="">请选择</option>
+					<option value="变电">变电</option>
+					<option value="线路">线路</option>
+				</select>
+			</td>
+		</tr>
+		<tr>
+			<td class="width-15 active"><label class="">规模:</label></td>
+			<td class="width-35">
+				<form:input path="scale" htmlEscape="false" class="form-control"/>
+			</td>
+			<td class="width-15 active"><label class="">设计单位:</label></td>
+			<td class="width-35">
+				<form:input path="designUnit" htmlEscape="false" class="form-control"/>
+			</td>
+		</tr>
+		<tr>
+			<td class="width-15 active"><label class="">施工单位:</label></td>
+			<td class="width-35">
+				<form:input path="constructionUnit" htmlEscape="false" class="form-control"/>
+			</td>
+			<td class="width-15 active"><label class="">监理单位:</label></td>
+			<td class="width-35">
+				<form:input path="controlUnit" htmlEscape="false" class="form-control"/>
+			</td>
+		</tr>
+		</tbody>
+	</table>
+</form:form>
+</body>
+</html>

+ 110 - 0
src/main/webapp/webpage/modules/cg/infrastructure/basicInfo/basicInfoUpdateForm.jsp

@@ -0,0 +1,110 @@
+<%@ 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">
+
+		$(document).ready(function() {
+
+	        $('#beginDate').datetimepicker({
+				 format: "YYYY-MM-DD HH:mm:ss"
+		    });
+	        $('#endDate').datetimepicker({
+				 format: "YYYY-MM-DD HH:mm:ss"
+		    });
+		});
+		function save() {
+			var projectCategory = $("#projectCategory").val();
+			var isValidate = jp.validateForm('#inputForm');//校验表单
+			if(!isValidate){
+				return false;
+			}else if (null==projectCategory||""==projectCategory){
+				jp.error("请填写项目类别!")
+			} else{
+				jp.loading();
+				jp.post("${ctx}/cg/infrastructure/infrastructureBasicInfo/update",$('#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);
+					}
+				})
+			}
+
+        }
+	</script>
+</head>
+<body class="bg-white">
+	<form:form id="inputForm" modelAttribute="basicInfo" class="form-horizontal">
+	<form:hidden path="id"/>
+	<table class="table table-bordered">
+		<tbody>
+		<tr>
+			<td colspan="4" class="width-15 active"><label class="">基建项目基本信息:</label></td>
+		</tr>
+		<tr>
+			<td class="width-15 active"><label class=""><font color="red">*</font>国网编码:</label></td>
+			<td class="width-35">
+				<form:input path="stateGridCode" htmlEscape="false" readonly="true" class="form-control"/>
+			</td>
+			<td class="width-15 active"><label class=""><font color="red">*</font>项目名称:</label></td>
+			<td class="width-35">
+				<form:input path="projectName" htmlEscape="false" class="form-control"/>
+			</td>
+		</tr>
+		<tr>
+			<td class="width-15 active"><label class=""><font color="red">*</font>项目编码:</label></td>
+			<td class="width-35">
+				<form:input path="projectCode" htmlEscape="false" readonly="true" class="form-control"/>
+			</td>
+			<td class="width-15 active"><label class="">单体项目名称:</label></td>
+			<td class="width-35">
+				<form:input path="individualProjectName" htmlEscape="false" class="form-control"/>
+			</td>
+		</tr>
+		<tr>
+			<td class="width-15 active"><label class="">电压等级:</label></td>
+			<td class="width-35">
+				<form:input path="voltageLevel" htmlEscape="false" class="form-control"/>
+			</td>
+			<td class="width-15 active"><label class=""><font color="red">*</font>项目类别(变电/线路):</label></td>
+			<td class="width-35">
+				<select id="projectCategory" name="projectCategory"  class="form-control">
+					<option value="">请选择</option>
+					<option value="变电"<c:if test="${basicInfo.projectCategory=='变电'}">selected</c:if>>变电</option>
+					<option value="线路"<c:if test="${basicInfo.projectCategory=='线路'}">selected</c:if>>线路</option>
+<%--					<option value="线路">线路</option>--%>
+				</select>
+			</td>
+		</tr>
+		<tr>
+			<td class="width-15 active"><label class="">规模:</label></td>
+			<td class="width-35">
+				<form:input path="scale" htmlEscape="false" class="form-control"/>
+			</td>
+			<td class="width-15 active"><label class="">设计单位:</label></td>
+			<td class="width-35">
+				<form:input path="designUnit" htmlEscape="false" class="form-control"/>
+			</td>
+		</tr>
+		<tr>
+			<td class="width-15 active"><label class="">施工单位:</label></td>
+			<td class="width-35">
+				<form:input path="constructionUnit" htmlEscape="false" class="form-control"/>
+			</td>
+			<td class="width-15 active"><label class="">监理单位:</label></td>
+			<td class="width-35">
+				<form:input path="controlUnit" htmlEscape="false" class="form-control"/>
+			</td>
+		</tr>
+		</tbody>
+	</table>
+</form:form>
+</body>
+</html>

+ 83 - 0
src/main/webapp/webpage/modules/cg/infrastructure/constructionBatch/batchAddForm.jsp

@@ -0,0 +1,83 @@
+<%@ 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">
+
+		$(document).ready(function() {
+
+	        $('#beginDate').datetimepicker({
+				 format: "YYYY-MM-DD HH:mm:ss"
+		    });
+	        $('#endDate').datetimepicker({
+				 format: "YYYY-MM-DD HH:mm:ss"
+		    });
+		});
+		function save() {
+
+			var batchName = $("#batchName").val();
+			var batchNumber = $("#batchNumber").val();
+
+			if (null==batchName||""==batchName){
+				jp.error("请填写批次名称!");
+			}else if(null==batchNumber||""==batchNumber){
+				jp.error("请填写批次编号!");
+			} else {
+				var isValidate = jp.validateForm('#inputForm');//校验表单
+				if(!isValidate){
+					return false;
+				}else{
+					jp.loading();
+					jp.post("${ctx}/cg/infrastructure/constructionBatch/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);
+						}
+					})
+				}
+			}
+
+
+        }
+	</script>
+</head>
+<body class="bg-white">
+	<form:form id="inputForm" modelAttribute="batch" class="form-horizontal">
+	<form:hidden path="id"/>
+	<table class="table table-bordered">
+		<tbody>
+		<tr>
+			<td colspan="4" class="width-15 active"><label class="">施工计划批次信息:</label></td>
+		</tr>
+		<tr>
+			<td class="width-15 active"><label class=""><font color="red">*</font>批次名称:</label></td>
+			<td class="width-35">
+				<form:input path="batchName" htmlEscape="false" class="form-control"/>
+			</td>
+			<td class="width-15 active"><label class=""><font color="red">*</font>批次编号:</label></td>
+			<td class="width-35">
+				<form:input path="batchNumber" htmlEscape="false" class="form-control"/>
+			</td>
+		</tr>
+		<tr>
+			<td class="width-15 active"><label class=""><font color="red">*</font>施工图纸收集截止时间:</label></td>
+			<td class="width-35">
+				<form:input path="endTime" htmlEscape="false" class="form-control"/>
+			</td>
+			<td class="width-15 active"><label class=""><font color="red">*</font>拟定开标时间:</label></td>
+			<td class="width-35">
+				<form:input path="bidOpenTime" htmlEscape="false" class="form-control"/>
+			</td>
+		</tr>
+		</tbody>
+	</table>
+</form:form>
+</body>
+</html>

+ 73 - 0
src/main/webapp/webpage/modules/cg/infrastructure/constructionBatch/batchUpdateForm.jsp

@@ -0,0 +1,73 @@
+<%@ 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">
+
+		$(document).ready(function() {
+
+	        $('#beginDate').datetimepicker({
+				 format: "YYYY-MM-DD HH:mm:ss"
+		    });
+	        $('#endDate').datetimepicker({
+				 format: "YYYY-MM-DD HH:mm:ss"
+		    });
+		});
+		function save() {
+
+			var isValidate = jp.validateForm('#inputForm');//校验表单
+			if(!isValidate){
+				return false;
+			}else{
+				jp.loading();
+				jp.post("${ctx}/cg/infrastructure/constructionBatch/update",$('#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);
+					}
+				})
+			}
+
+        }
+	</script>
+</head>
+<body class="bg-white">
+	<form:form id="inputForm" modelAttribute="batch" class="form-horizontal">
+	<form:hidden path="id"/>
+	<table class="table table-bordered">
+		<tbody>
+		<tr>
+			<td colspan="4" class="width-15 active"><label class="">施工计划批次信息:</label></td>
+		</tr>
+		<tr>
+			<td class="width-15 active"><label class=""><font color="red">*</font>批次名称:</label></td>
+			<td class="width-35">
+				<form:input path="batchName" htmlEscape="false" readonly="true" class="form-control"/>
+			</td>
+			<td class="width-15 active"><label class=""><font color="red">*</font>批次编号:</label></td>
+			<td class="width-35">
+				<form:input path="batchNumber" htmlEscape="false" readonly="true" class="form-control"/>
+			</td>
+		</tr>
+		<tr>
+			<td class="width-15 active"><label class=""><font color="red">*</font>施工图纸收集截止时间:</label></td>
+			<td class="width-35">
+				<form:input path="endTime" htmlEscape="false" class="form-control"/>
+			</td>
+			<td class="width-15 active"><label class=""><font color="red">*</font>拟定开标时间:</label></td>
+			<td class="width-35">
+				<form:input path="bidOpenTime" htmlEscape="false" class="form-control"/>
+			</td>
+		</tr>
+		</tbody>
+	</table>
+</form:form>
+</body>
+</html>

+ 231 - 0
src/main/webapp/webpage/modules/cg/infrastructure/constructionBatch/constructionBatch.js

@@ -0,0 +1,231 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+    <script >
+    $(document).ready(function () {
+        $('#projectTable').bootstrapTable({
+            //请求方法
+            method: 'post',
+            //类型json
+            dataType: "json",
+            contentType: "application/x-www-form-urlencoded",
+            //显示检索按钮
+            showSearch: true,
+            //显示刷新按钮
+            showRefresh: true,
+            //显示切换手机试图按钮
+            showToggle: true,
+            //显示 内容列下拉框
+            showColumns: true,
+            //显示到处按钮
+            showExport: true,
+            //显示切换分页按钮
+            showPaginationSwitch: true,
+            //最低显示2行
+            minimumCountColumns: 2,
+            //是否显示行间隔色
+            striped: true,
+            //是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*)
+            cache: false,
+            //是否显示分页(*)
+            pagination: true,
+            //排序方式
+            sortOrder: "asc",
+            //初始化加载第一页,默认第一页
+            pageNumber: 1,
+            //每页的记录行数(*)
+            pageSize: 25,
+            //可供选择的每页的行数(*)
+            pageList: [5, 10, 25, 50, 100],
+            //这个接口需要处理bootstrap table传递的固定参数,并返回特定格式的json数据
+            url: "${ctx}/cg/infrastructure/constructionBatch/list",
+            //默认值为 '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}/cg/infrastructure/infrastructureBasicInfo/delete?id=" + row.id, function (data) {
+                            if (data.success) {
+                                $('#projectTable').bootstrapTable('refresh');
+                                jp.success(data.msg);
+                            } else {
+                                jp.error(data.msg);
+                            }
+                        })
+                    });
+                }
+            },
+
+            onClickRow: function (row, $el) {
+            },
+            onShowSearch: function () {
+                $("#search-collapse").slideToggle();
+            },
+            columns:
+                [
+                    [
+                        {checkbox:true,width: 36},
+                        {"title":"施工计划批次信息","colspan":4,width: "1226px"},
+                    ],
+                    [
+                        {checkbox:true,width: 36},
+                        {field:'batchName',title: '批次名称',valign:"middle",align: "center"},
+                        {field:'batchNumber',title: '批次编号',valign:"middle",align: "center"},
+                        {field:'endTime',title: '施工图纸收集截止时间',valign:"middle",align: "center"},
+                        {field:'bidOpenTime',title: '拟定开标时间',valign:"middle",align: "center"},
+                    ]
+                ]
+        });
+
+
+        if (navigator.userAgent.match(/(iPhone|iPod|Android|ios)/i)) {//如果是移动端
+            $('#projectTable').bootstrapTable("toggleView");
+        }
+
+        $('#projectTable').on('check.bs.table uncheck.bs.table load-success.bs.table ' +
+            'check-all.bs.table uncheck-all.bs.table', function () {
+            $('#remove').prop('disabled', !$('#projectTable').bootstrapTable('getSelections').length);
+            $('#view,#edit,#jlEdit').prop('disabled', $('#projectTable').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) {
+                    var iframeWin = layero.find('iframe')[0]; //得到iframe页的窗口对象,执行iframe页的方法:iframeWin.method();
+                    iframeWin.contentWindow.importExcel('${ctx}/cg/infrastructure/constructionBatch/import', function (data) {
+                        if (data.success) {
+                            jp.success(data.msg);
+                            refresh();
+                        } else {
+                            jp.error(data.msg);
+                        }
+                        jp.close(index);
+                    });//调用保存事件
+                    return false;
+                },
+                btn2: function (index) {
+                    //  jp.close(index);
+                }
+            });
+        });
+
+        $("#btnExport").click(function () {
+            var projectReserveId = $("#projectReserveId").val();
+            var projectName = $("#projectName").val();
+            jp.downloadFile('${ctx}/cg/infrastructure/constructionBatch/export?projectReserveId=' + projectReserveId + '&projectName=' + projectName);
+        });
+
+        $("#search").click("click", function () {// 绑定查询按扭
+            $('#projectTable').bootstrapTable('refresh');
+        });
+
+        $("#reset").click("click", function () {// 绑定查询按扭
+            $("#searchForm  input").val("");
+            $("#searchForm  select").val("");
+            $("#searchForm  .select-item").html("");
+            $('#projectTable').bootstrapTable('refresh');
+        });
+
+        $('#beginBeginDate').datetimepicker({
+            format: "YYYY-MM-DD HH:mm:ss"
+        });
+        $('#endBeginDate').datetimepicker({
+            format: "YYYY-MM-DD HH:mm:ss"
+        });
+        $('#endDate').datetimepicker({
+            format: "YYYY-MM-DD HH:mm:ss"
+        });
+    });
+
+function getIdSelections() {
+    return $.map($("#projectTable").bootstrapTable('getSelections'), function (row) {
+        return row.id
+    });
+}
+//表格超出宽度鼠标悬停显示td内容
+function paramsMatter(value,row,index,field) {
+    var span = document.createElement('span');
+    span.setAttribute('title',value);
+    span.innerHTML = value;
+    return span.outerHTML;
+}
+
+//刷新列表
+function refresh() {
+    $('#projectTable').bootstrapTable('refresh');
+}
+
+function add() {
+    jp.openSaveDialog('新增储备项目基本信息', "${ctx}/cg/infrastructure/constructionBatch/form", '800px', '500px');
+}
+
+
+function edit(id) {//没有权限时,不显示确定按钮
+    if (id == undefined) {
+        id = getIdSelections();
+    }
+    jp.openSaveDialog('编辑储备项目基本信息', "${ctx}/cg/infrastructure/constructionBatch/form?id=" + id, '800px', '500px');
+}
+
+function view(id) {//没有权限时,不显示确定按钮
+    if (id == undefined) {
+        id = getIdSelections();
+    }
+    jp.openViewDialog('查看储备项目基本信息', "${ctx}/cg/reservemanagementcenter/reserveManage/view?id=" + id, '800px', '500px');
+}
+
+function deleteAll(){
+
+    jp.confirm('确认要删除该储备项目基本信息吗?', function(){
+        jp.loading();
+        jp.get("${ctx}/cg/infrastructure/constructionBatch/deleteAll?ids=" + getIdSelections(), function(data){
+            if(data.success){
+                $('#projectTable').bootstrapTable('refresh');
+                jp.success(data.msg);
+            }else{
+                jp.error(data.msg);
+            }
+        })
+
+    })
+}
+//转换日期格式(时间戳转换为datetime格式)
+function changeDateFormat(cellval) {
+    var dateVal = cellval + "";
+    if (cellval != null) {
+        var date = new Date(parseInt(dateVal.replace("/Date(", "").replace(")/", ""), 10));
+        var month = date.getMonth() + 1 < 10 ? "0" + (date.getMonth() + 1) : date.getMonth() + 1;
+        var currentDate = date.getDate() < 10 ? "0" + date.getDate() : date.getDate();
+
+        /*var hours = date.getHours() < 10 ? "0" + date.getHours() : date.getHours();
+        var minutes = date.getMinutes() < 10 ? "0" + date.getMinutes() : date.getMinutes();
+        var seconds = date.getSeconds() < 10 ? "0" + date.getSeconds() : date.getSeconds();*/
+
+        return date.getFullYear() + "-" + month + "-" + currentDate /*+ " " + hours + ":" + minutes + ":" + seconds*/;
+    }
+}
+
+</script>
+

+ 108 - 0
src/main/webapp/webpage/modules/cg/infrastructure/constructionBatch/constructionBatch.jsp

@@ -0,0 +1,108 @@
+<%@ 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="constructionBatch.js" %>
+	<style type="text/css">
+		.table {
+			table-layout: fixed;
+			/*word-break: break-all;*/
+			word-wrap: break-word;
+			text-align: center;
+		}
+		.table th{
+			text-align: center;
+			/*vertical-align: middle !important;*/
+		}
+		.table td{
+			text-align: center;
+			vertical-align: middle !important;
+			width: 100%;
+			white-space: nowrap;
+			overflow: hidden;
+			text-overflow: ellipsis;
+			word-wrap:break-word;
+		}
+		/*.table th, .table td {*/
+		/*	text-align: center;*/
+		/*	vertical-align: middle !important;*/
+		/*	!*width: 200px;*!*/
+		/*	!*white-space: nowrap;*!*/
+		/*}*/
+		.fixed-table-container table {
+			/*width: auto;*/
+			table-layout: fixed;
+		}
+		.bootstrap-table .table thead>tr>th {
+			padding: 0;
+			margin: 0;
+			width: 1000px;
+		}
+	</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="batch" 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="batchName" htmlEscape="false" maxlength="100"  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">
+				<shiro:hasPermission name="cg:infrastructure:constructionBatch:add">
+					<button id="add" class="btn btn-primary" onclick="add()">
+						<i class="glyphicon glyphicon-plus"></i> 新增
+					</button>
+				</shiro:hasPermission>
+				<shiro:hasPermission name="cg:infrastructure:constructionBatch:edit">
+					<button id="edit" class="btn btn-primary" onclick="edit()">
+						<i class="glyphicon glyphicon-edit"></i> 修改 <!--专职修改-->
+					</button>
+				</shiro:hasPermission>
+				<shiro:hasPermission name="cg:infrastructure:constructionBatch:del">
+					<button id="remove" class="btn btn-danger" onclick="deleteAll()">
+						<i class="glyphicon glyphicon-remove"></i> 删除
+					</button>
+				</shiro:hasPermission>
+				<shiro:hasPermission name="cg:infrastructure:constructionBatch:import">
+					<button id="btnImport" class="btn btn-info">
+						<i class="fa fa-folder-open-o"></i> 导入  <!--专职导入-->
+					</button>
+				</shiro:hasPermission>
+				<shiro:hasPermission name="cg:infrastructure:constructionBatch:export">
+					<button id="btnExport" class="btn btn-warning">
+						<i class="fa fa-file-excel-o"></i> 导出
+					</button>
+				</shiro:hasPermission>
+			</div>
+			<!-- 表格 -->
+			<table id="projectTable" style="table-layout:fixed" class="table" data-toolbar="#toolbar"></table>
+
+		</div>
+	</div>
+</div>
+</body>
+</html>

File diff suppressed because it is too large
+ 1001 - 0
src/main/webapp/webpage/modules/cg/infrastructure/reviewPlan/reviewPlan.js


+ 100 - 0
src/main/webapp/webpage/modules/cg/infrastructure/reviewPlan/reviewPlan.jsp

@@ -0,0 +1,100 @@
+<%@ 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"/>
+	<%--	<script src="${ctxStatic}/common/js/jquery-editable.js"></script>--%>
+	<%@ include file="/webpage/include/bootstraptable.jsp"%>
+	<%@include file="/webpage/include/treeview.jsp" %>
+	<%@include file="reviewPlan.js" %>
+	<script type="text/javascript">
+
+		$(document).ready(function() {
+			$('#disclosureFinishDate').datetimepicker({
+				format: "YYYY-MM-DD"
+			});
+		});
+		function save() {
+			// 获取表格数据  第一行
+			var tableData = $('#projectTable').bootstrapTable('getData')[0];
+			// tableData.basicInfoId = document.getElementById("id").value
+			console.log('tableData', tableData)
+			// 将数据封装成 JSON 格式
+			var jsonData = JSON.stringify(tableData);
+			console.log('jsonData', jsonData)
+			$.ajax({
+				url: '${ctx}/cg/infrastructure/infrastructureBasicInfo/reviewSave',
+				type: 'POST',
+				data: JSON.stringify(tableData),
+				contentType: 'application/json',
+				success: function(data) {
+					//处理返回结果
+					jp.getParent().refresh();
+					var dialogIndex = parent.layer.getFrameIndex(window.name); // 获取窗口索引
+					parent.layer.close(dialogIndex);
+					jp.success(data.msg)
+				},
+				error: function (data) {
+					jp.error(data.msg);
+				}
+			})
+
+
+		}
+	</script>
+	<style type="text/css">
+		.table {
+			table-layout: fixed;
+			/*word-break: break-all;*/
+			word-wrap: break-word;
+			text-align: center;
+		}
+		.table th{
+			text-align: center;
+			/*vertical-align: middle !important;*/
+		}
+		.table td{
+			text-align: center;
+			vertical-align: middle !important;
+			width: 100%;
+			white-space: nowrap;
+			overflow: hidden;
+			text-overflow: ellipsis;
+			word-wrap:break-word;
+		}
+		/*.table th, .table td {*/
+		/*	text-align: center;*/
+		/*	vertical-align: middle !important;*/
+		/*	!*width: 200px;*!*/
+		/*	!*white-space: nowrap;*!*/
+		/*}*/
+		.fixed-table-container table {
+			/*width: auto;*/
+			table-layout: fixed;
+		}
+		.bootstrap-table .table thead>tr>th {
+			padding: 0;
+			margin: 0;
+			width: 3000px;
+		}
+		.column-highlight {
+			color: red;
+		}
+	</style>
+</head>
+<body class="bg-white">
+<form:form id="inputForm" modelAttribute="arrangement" class="form-horizontal">
+	<form:hidden path="id"/>
+	<!-- 表格 -->
+	<table id="projectTable" style="table-layout:fixed" class="table" data-toolbar="#toolbar"></table>
+
+	<!-- 表格 -->
+	<table id="projectTable2" style="table-layout:fixed" class="table" data-toolbar="#toolbar"></table>
+
+	<!-- 表格 -->
+	<table id="projectTable3" style="table-layout:fixed" class="table" data-toolbar="#toolbar"></table>
+</form:form>
+</body>
+</html>