Parcourir la source

Merge branch 'master' of http://8.137.121.180:10880/longping/subject_gxj

张维明 il y a 4 mois
Parent
commit
c67e8cd7e6
33 fichiers modifiés avec 1191 ajouts et 506 suppressions
  1. 8 3
      projects-service/src/main/java/com/rtrh/projects/modules/projects/mapper/JUnitMapper.xml
  2. 2 1
      projects-service/src/main/java/com/rtrh/projects/modules/projects/mapper/LogOperateMapper.java
  3. 6 3
      projects-service/src/main/java/com/rtrh/projects/modules/projects/mapper/LogOperateMapper.xml
  4. 2 0
      projects-service/src/main/java/com/rtrh/projects/modules/projects/mapper/RptContMapper.java
  5. 16 0
      projects-service/src/main/java/com/rtrh/projects/modules/projects/mapper/RptContMapper.xml
  6. 2 0
      projects-service/src/main/java/com/rtrh/projects/modules/projects/mapper/SubPreNewMapper.java
  7. 11 0
      projects-service/src/main/java/com/rtrh/projects/modules/projects/mapper/SubPreNewMapper.xml
  8. 71 63
      projects-service/src/main/java/com/rtrh/projects/modules/projects/po/SubInfo.hbm.xml
  9. 2 1
      projects-service/src/main/java/com/rtrh/projects/modules/projects/service/ILogOperateService.java
  10. 2 0
      projects-service/src/main/java/com/rtrh/projects/modules/projects/service/SubPreNewService.java
  11. 2 0
      projects-service/src/main/java/com/rtrh/projects/modules/projects/service/SubRptContService.java
  12. 2 1
      projects-service/src/main/java/com/rtrh/projects/modules/projects/service/impl/LogOperateServiceImpl.java
  13. 6 3
      projects-service/src/main/java/com/rtrh/projects/modules/projects/service/impl/SubInfoServiceImpl.java
  14. 6 0
      projects-service/src/main/java/com/rtrh/projects/modules/projects/service/impl/SubPreNewServiceImpl.java
  15. 6 0
      projects-service/src/main/java/com/rtrh/projects/modules/projects/service/impl/SubRptContServiceImpl.java
  16. 46 0
      projects-service/src/main/java/com/rtrh/projects/modules/projects/utils/ExcelEntityConverter.java
  17. 27 0
      projects-service/src/main/java/com/rtrh/projects/modules/projects/vo/LogOperateVO.java
  18. 3 1
      projects-service/src/main/java/com/rtrh/projects/modules/projects/vo/export/SmzkDetailVo.java
  19. 81 7
      projects-service/src/main/java/com/rtrh/projects/modules/projects/vo/export/SubInfoXjVO.java
  20. 63 6
      projects-service/src/main/java/com/rtrh/projects/modules/projects/vo/export/SubInfoZjVO.java
  21. 744 336
      projects/src/main/java/com/rtrh/projects/web/controller/subject/SubInfoExportController.java
  22. BIN
      projects/src/main/resources/template/analysis.docx
  23. 69 67
      projects/src/main/webapp/vmodules/leftMenu.jsp
  24. 1 1
      projects/src/main/webapp/vmodules/project/projectInfo.jsp
  25. 1 1
      projects/src/main/webapp/vmodules/subject/subInfo/editSubInfo.jsp
  26. 2 2
      projects/src/main/webapp/vmodules/subject/subInfo/tz/cb.jsp
  27. 2 2
      projects/src/main/webapp/vmodules/subject/subInfo/tz/end.jsp
  28. 2 2
      projects/src/main/webapp/vmodules/subject/subInfo/tz/main.jsp
  29. 2 2
      projects/src/main/webapp/vmodules/subject/subInfo/tz/new.jsp
  30. 1 1
      projects/src/main/webapp/vmodules/subject/subInfo/tz/year_extend.jsp
  31. 1 1
      projects/src/main/webapp/vmodules/subject/subInfo/tz/year_new.jsp
  32. 1 1
      projects/src/main/webapp/vmodules/subject/subInfo/tz/year_reserve.jsp
  33. 1 1
      projects/src/main/webapp/vmodules/subject/subInfo/tz/year_sum.jsp

+ 8 - 3
projects-service/src/main/java/com/rtrh/projects/modules/projects/mapper/JUnitMapper.xml

@@ -130,8 +130,14 @@
 
     <!-- Query for other statusUnit values -->
     <select id="getListByIdOtherStatus" resultType="hashmap">
-        <include refid="baseSelect"/>
-        <where>
+        SELECT
+        a.id, a.title, a.kind_unit kindUnit, a.reason, a.area, a.amt, a.date_found dateFound,
+        a.group_code1, a.group_code2, a.trust_code trustCode, a.`status`, a.name_jur1 nameJur1,
+        a.sim_code simCode, b.title unitKindName, c.title unitPropName
+        FROM j_unit a
+        LEFT JOIN t_systable b ON a.unit_kind_id = b.id
+        LEFT JOIN t_systable c ON a.unit_prop_id = c.id
+        WHERE a.logic_delete_flag = 0 AND a.kind = 1
             <if test="id != null and id != ''">
                 AND (a.id IN (
                 SELECT d.unit_id FROM sub_info d WHERE d.main_id = #{id}
@@ -159,7 +165,6 @@
             <if test="status != null and status != ''">
                 AND a.status = #{status}
             </if>
-        </where>
     </select>
     <select id="getUnitByKind" resultType="com.rtrh.projects.modules.system.po.JUnit">
         SELECT

+ 2 - 1
projects-service/src/main/java/com/rtrh/projects/modules/projects/mapper/LogOperateMapper.java

@@ -2,6 +2,7 @@ package com.rtrh.projects.modules.projects.mapper;
 
 import com.rtrh.core.repository.mybatis.MyBatisRepository;
 import com.rtrh.projects.modules.projects.po.LogOperate;
+import com.rtrh.projects.modules.projects.vo.LogOperateVO;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -19,5 +20,5 @@ public interface LogOperateMapper {
 
     void save(@Param("log") LogOperate logOperate);
 
-    List<LogOperate> queryByYear(@Param("year") int year);
+    List<LogOperateVO> queryByYear(@Param("year") int year);
 }

+ 6 - 3
projects-service/src/main/java/com/rtrh/projects/modules/projects/mapper/LogOperateMapper.xml

@@ -20,7 +20,7 @@
                     #{log.title}
                     )
     </insert>
-    <select id="queryByYear" resultType="com.rtrh.projects.modules.projects.po.LogOperate">
+    <select id="queryByYear" resultType="com.rtrh.projects.modules.projects.vo.LogOperateVO">
         SELECT
             log.id AS id,
             log.userid AS userid,
@@ -37,9 +37,12 @@
             log.create_user_id AS createUserId,
             log.create_user_name AS createUserName,
             log.create_time AS createTime,
-            log.logic_delete_flag AS logicDeleteFlag
+            log.logic_delete_flag AS logicDeleteFlag,
+            s.indus_kind AS indusKind,
+            s.subject_id AS subjectId,
+            s.amt_total AS amtTotal
         FROM
-            t_log_operate log
+            t_log_operate log join sub_info s on log.sub_id=s.id
     </select>
 
 </mapper>

+ 2 - 0
projects-service/src/main/java/com/rtrh/projects/modules/projects/mapper/RptContMapper.java

@@ -76,4 +76,6 @@ public interface RptContMapper {
             "rt_date as rtDate,\n" +
             "is_rt as isRt from sub_rpt_cont where sub_id = #{subId} and year = #{year} and logic_delete_flag = '0' and kind = '1'")
     List<RptCont> getContBySubId(@Param("subId") String subId, @Param("year") String year);
+
+    List<RptCont> listByYear(@Param("year") int year);
 }

+ 16 - 0
projects-service/src/main/java/com/rtrh/projects/modules/projects/mapper/RptContMapper.xml

@@ -0,0 +1,16 @@
+<?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.rtrh.projects.modules.projects.mapper.RptContMapper" >
+
+	<select id="listByYear" resultType="com.rtrh.projects.modules.projects.po.RptCont">
+		SELECT
+			sub_id as subId,
+			num_bl as numBl,
+			kj_month as kjMonth
+		FROM
+			sub_rpt_cont
+		WHERE
+			kind = '1'
+		  	AND kj_month LIKE concat(#{year}, '%')
+	</select>
+</mapper>

+ 2 - 0
projects-service/src/main/java/com/rtrh/projects/modules/projects/mapper/SubPreNewMapper.java

@@ -32,4 +32,6 @@ public interface SubPreNewMapper {
     SubPreNew findById(@Param("id") String id);
 
     void update(SubPreNew preNew);
+
+    List<SubPreNew> findList();
 }

+ 11 - 0
projects-service/src/main/java/com/rtrh/projects/modules/projects/mapper/SubPreNewMapper.xml

@@ -442,6 +442,17 @@
         WHERE
             id = #{id}
     </select>
+    <select id="findList" resultType="com.rtrh.projects.modules.projects.po.SubPreNew">
+        SELECT
+            sub_id subId,
+            date_confirm dateConfirm,
+            pre_flow_id preFlowId
+        FROM
+            sub_pre_new
+        WHERE
+            `status` = '1'
+            AND status_conf = '2'
+    </select>
 
     <insert id="saveBatch" parameterType="java.util.List">
         INSERT INTO sub_pre_new (

+ 71 - 63
projects-service/src/main/java/com/rtrh/projects/modules/projects/po/SubInfo.hbm.xml

@@ -5,93 +5,101 @@
 		<id column="id" name="id" type="java.lang.String"><generator class="assigned"/></id>
         <property column="remark" name="remark" not-null="false" type="java.lang.String" />
         <property column="unit_id" name="unitId" not-null="false" type="java.lang.String" />
-        <property column="main_id" name="mainId" not-null="false" type="java.lang.String" />
-        <property column="approve_id" name="approveId" not-null="false" type="java.lang.String" />
-        <property column="approve_departid" name="approveDepartid" not-null="false" type="java.lang.String" />
-        <property column="is_approve_fgw" name="isApproveFgw" not-null="false" type="java.lang.String" />
-        <property column="approve_departid2" name="approveDepartid2" not-null="false" type="java.lang.String" />
+        <!--<property column="main_id" name="mainId" not-null="false" type="java.lang.String" />-->
+        <!--<property column="approve_id" name="approveId" not-null="false" type="java.lang.String" />-->
+        <!--<property column="approve_departid" name="approveDepartid" not-null="false" type="java.lang.String" />-->
+        <!--<property column="is_approve_fgw" name="isApproveFgw" not-null="false" type="java.lang.String" />-->
+        <!--<property column="approve_departid2" name="approveDepartid2" not-null="false" type="java.lang.String" />-->
         <property column="sub_code" name="subCode" not-null="false" type="java.lang.String" />
         <property column="sub_name" name="subName" not-null="false" type="java.lang.String" />
         <property column="kind" name="kind" not-null="false" type="java.lang.String" />
         <property column="abc" name="abc" not-null="false" type="java.lang.String" />
-        <property column="is3_kg" name="is3Kg" not-null="false" type="java.lang.String" />
-        <property column="score" name="score" not-null="false" type="java.lang.Integer" />
-        <property column="sort" name="sort" not-null="false" type="java.lang.Integer" />
-        <property column="sort1" name="sort1" not-null="false" type="java.lang.Integer" />
-        <property column="camera_num" name="cameraNum" not-null="false" type="java.lang.Integer" />
-        <property column="employ_numbers" name="employNumbers" not-null="false" type="java.lang.Integer" />
-        <property column="assess_reason" name="assessReason" not-null="false" type="java.lang.String" />
+        <!--<property column="is3_kg" name="is3Kg" not-null="false" type="java.lang.String" />-->
+        <!--<property column="score" name="score" not-null="false" type="java.lang.Integer" />-->
+        <!--<property column="sort" name="sort" not-null="false" type="java.lang.Integer" />-->
+        <!--<property column="sort1" name="sort1" not-null="false" type="java.lang.Integer" />-->
+        <!--<property column="camera_num" name="cameraNum" not-null="false" type="java.lang.Integer" />-->
+        <!--<property column="employ_numbers" name="employNumbers" not-null="false" type="java.lang.Integer" />-->
+        <!--<property column="assess_reason" name="assessReason" not-null="false" type="java.lang.String" />-->
         <property column="indus_kind" name="indusKind" not-null="false" type="java.lang.String" />
-        <property column="longitude" name="longitude" not-null="false" type="java.lang.String" />
-        <property column="latitude" name="latitude" not-null="false" type="java.lang.String" />
-        <property column="work_space_img" name="workSpaceImg" not-null="false" type="java.lang.String" />
-        <property column="prop_kind" name="propKind" not-null="false" type="java.lang.String" />
+        <!--<property column="longitude" name="longitude" not-null="false" type="java.lang.String" />-->
+        <!--<property column="latitude" name="latitude" not-null="false" type="java.lang.String" />-->
+        <!--<property column="work_space_img" name="workSpaceImg" not-null="false" type="java.lang.String" />-->
+        <!--<property column="prop_kind" name="propKind" not-null="false" type="java.lang.String" />-->
         <property column="amt_total" name="amtTotal" not-null="false" type="java.math.BigDecimal" />
-        <property column="amt_ly1" name="amtLy1" not-null="false" type="java.math.BigDecimal" />
-        <property column="amt_ly2" name="amtLy2" not-null="false" type="java.math.BigDecimal" />
-        <property column="amt_ly3" name="amtLy3" not-null="false" type="java.math.BigDecimal" />
-        <property column="amt_ly4" name="amtLy4" not-null="false" type="java.math.BigDecimal" />
-        <property column="amt_ly5" name="amtLy5" not-null="false" type="java.math.BigDecimal" />
-        <property column="amt_ly6" name="amtLy6" not-null="false" type="java.math.BigDecimal" />
-        <property column="amt_ly7" name="amtLy7" not-null="false" type="java.math.BigDecimal" />
-        <property column="amt_comptotal" name="amtComptotal" not-null="false" type="java.math.BigDecimal" />
-        <property column="amt_year" name="amtYear" not-null="false" type="java.math.BigDecimal" />
-        <property column="amt_comp" name="amtComp" not-null="false" type="java.math.BigDecimal" />
-        <property column="num_total" name="numTotal" not-null="false" type="java.math.BigDecimal" />
-        <property column="num_comp" name="numComp" not-null="false" type="java.math.BigDecimal" />
+
+
+        <!--<property column="amt_ly1" name="amtLy1" not-null="false" type="java.math.BigDecimal" />-->
+        <!--<property column="amt_ly2" name="amtLy2" not-null="false" type="java.math.BigDecimal" />-->
+        <!--<property column="amt_ly3" name="amtLy3" not-null="false" type="java.math.BigDecimal" />-->
+        <!--<property column="amt_ly4" name="amtLy4" not-null="false" type="java.math.BigDecimal" />-->
+        <!--<property column="amt_ly5" name="amtLy5" not-null="false" type="java.math.BigDecimal" />-->
+        <!--<property column="amt_ly6" name="amtLy6" not-null="false" type="java.math.BigDecimal" />-->
+        <!--<property column="amt_ly7" name="amtLy7" not-null="false" type="java.math.BigDecimal" />-->
+
+        <!--<property column="amt_comptotal" name="amtComptotal" not-null="false" type="java.math.BigDecimal" />-->
+        <!--<property column="amt_year" name="amtYear" not-null="false" type="java.math.BigDecimal" />-->
+        <!--<property column="amt_comp" name="amtComp" not-null="false" type="java.math.BigDecimal" />-->
+        <!--<property column="num_total" name="numTotal" not-null="false" type="java.math.BigDecimal" />-->
+        <!--<property column="num_comp" name="numComp" not-null="false" type="java.math.BigDecimal" />-->
+
         <property column="begin_date" name="beginDate" not-null="false" type="java.util.Date" />
         <property column="end_date" name="endDate" not-null="false" type="java.util.Date" />
         <property column="content" name="content" not-null="false" type="java.lang.String" />
         <property column="addre" name="addre" not-null="false" type="java.lang.String" />
         <property column="subject_id" name="subjectId" not-null="false" type="java.lang.String" />
         <property column="kind_nature" name="kindNature" not-null="false" type="java.lang.String" />
-        <property column="is_rk" name="isRk" not-null="false" type="java.lang.String" />
-        <property column="is_hide" name="isHide" not-null="false" type="java.lang.String" />
+        <!--<property column="is_rk" name="isRk" not-null="false" type="java.lang.String" />-->
+        <!--<property column="is_hide" name="isHide" not-null="false" type="java.lang.String" />-->
         <property column="name_zrr" name="nameZrr" not-null="false" type="java.lang.String" />
         <property column="name_lead" name="nameLead" not-null="false" type="java.lang.String" />
         <property column="tel_lead" name="telLead" not-null="false" type="java.lang.String" />
         <property column="tel" name="tel" not-null="false" type="java.lang.String" />
-        <property column="conf_time" name="confTime" not-null="false" type="java.util.Date" />
+        <!--<property column="conf_time" name="confTime" not-null="false" type="java.util.Date" />-->
         <property column="status" name="status" not-null="false" type="java.lang.String" />
-            <property name="statusZd" type="java.lang.String">
-                    <column name="status_zd" default="0"/>
-            </property>
-            <property name="statusZj" type="java.lang.String">
-                    <column name="status_zj" default="1"/>
-            </property>
-            <property name="stateFix" type="java.lang.String">
-                    <column name="state_fix" default="1"/>
-            </property>
-            <property name="isFix" type="java.lang.String">
-                    <column name="is_fix" default="0"/>
-            </property>
-        <property column="status_sp" name="statusSp" not-null="false" type="java.lang.String" />
-        <property column="name_sp" name="nameSp" not-null="false" type="java.lang.String" />
-        <property column="date_sp" name="dateSp" not-null="false" type="java.util.Date" />
-        <property column="name_sp_fgw" name="nameSpFgw" not-null="false" type="java.lang.String" />
-        <property column="date_sp_fgw" name="dateSpFgw" not-null="false" type="java.util.Date" />
-        <property column="reason" name="reason" not-null="false" type="java.lang.String" />
-        <property column="reason_no_rk" name="reasonNoRk" not-null="false" type="java.lang.String" />
-        <property column="reason_no_amt" name="reasonNoAmt" not-null="false" type="java.lang.String" />
-        <property column="reason_no_kg" name="reasonNoKg" not-null="false" type="java.lang.String" />
-        <property column="reason_q" name="reasonq" not-null="false" type="java.lang.String" />
-        <property column="reason_jd" name="reasonJd" not-null="false" type="java.lang.String" />
-        <property column="status_jh" name="statusJh" not-null="false" type="java.lang.String" />
-        <property column="num_stage" name="numStage" not-null="false" type="java.lang.Integer" />
+            <!--<property name="statusZd" type="java.lang.String">-->
+            <!--        <column name="status_zd" default="0"/>-->
+            <!--</property>-->
+            <!--<property name="statusZj" type="java.lang.String">-->
+            <!--        <column name="status_zj" default="1"/>-->
+            <!--</property>-->
+            <!--<property name="stateFix" type="java.lang.String">-->
+            <!--        <column name="state_fix" default="1"/>-->
+            <!--</property>-->
+            <!--<property name="isFix" type="java.lang.String">-->
+            <!--        <column name="is_fix" default="0"/>-->
+            <!--</property>-->
+        <!--<property column="status_sp" name="statusSp" not-null="false" type="java.lang.String" />-->
+        <!--<property column="name_sp" name="nameSp" not-null="false" type="java.lang.String" />-->
+        <!--<property column="date_sp" name="dateSp" not-null="false" type="java.util.Date" />-->
+        <!--<property column="name_sp_fgw" name="nameSpFgw" not-null="false" type="java.lang.String" />-->
+        <!--<property column="date_sp_fgw" name="dateSpFgw" not-null="false" type="java.util.Date" />-->
+
+        <!--<property column="reason" name="reason" not-null="false" type="java.lang.String" />-->
+        <!--<property column="reason_no_rk" name="reasonNoRk" not-null="false" type="java.lang.String" />-->
+        <!--<property column="reason_no_amt" name="reasonNoAmt" not-null="false" type="java.lang.String" />-->
+        <!--<property column="reason_no_kg" name="reasonNoKg" not-null="false" type="java.lang.String" />-->
+        <!--<property column="reason_q" name="reasonq" not-null="false" type="java.lang.String" />-->
+        <!--<property column="reason_jd" name="reasonJd" not-null="false" type="java.lang.String" />-->
+
+        <!--<property column="status_jh" name="statusJh" not-null="false" type="java.lang.String" />-->
+        <!--<property column="num_stage" name="numStage" not-null="false" type="java.lang.Integer" />-->
         <property column="create_time" name="createTime" not-null="false" type="java.util.Date" />
         <property column="create_user_id" name="createUserId" not-null="false" type="java.lang.String" />
-        <property column="last_update_userId" name="lastUpdateUserId" not-null="false" type="java.lang.String" />
-        <property column="status_fgw" name="statusFgw" not-null="false" type="java.lang.String" />
-        <property column="name_fgw" name="nameFgw" not-null="false" type="java.lang.String" />
-        <property column="date_fgw" name="dateFgw" not-null="false" type="java.util.Date" />
+        <!--<property column="last_update_userId" name="lastUpdateUserId" not-null="false" type="java.lang.String" />-->
+
+        <!--<property column="status_fgw" name="statusFgw" not-null="false" type="java.lang.String" />-->
+        <!--<property column="name_fgw" name="nameFgw" not-null="false" type="java.lang.String" />-->
+        <!--<property column="date_fgw" name="dateFgw" not-null="false" type="java.util.Date" />-->
+
         <property column="last_update_time" name="lastUpdateTime" not-null="false" type="java.util.Date" />
         <property column="logic_delete_flag" name="logicDeleteFlag" not-null="false" type="java.lang.Integer" />
-        <property column="yb_content" name="ybContent" not-null="false" type="java.lang.String" />
+        <!--<property column="yb_content" name="ybContent" not-null="false" type="java.lang.String" />-->
         <property column="progress" name="progress" not-null="false" type="java.lang.String" />
         <property column="unit_desc" name="unitDesc" not-null="false" type="java.lang.String" />
-        <property column="indus_name" name="indusName" not-null="false" type="java.lang.String" />
+        <!--<property column="indus_name" name="indusName" not-null="false" type="java.lang.String" />-->
 
-        <property column="subject_name" name="subjectName" not-null="false" type="java.lang.String" />
+        <!--<property column="subject_name" name="subjectName" not-null="false" type="java.lang.String" />-->
         <property column="rt_date" name="rtDate" not-null="false" type="java.util.Date" />
         <property column="cb_status" name="cbStatus" not-null="false" type="java.lang.String" />
         <property column="qy_date" name="qyDate" not-null="false" type="java.util.Date" />

+ 2 - 1
projects-service/src/main/java/com/rtrh/projects/modules/projects/service/ILogOperateService.java

@@ -1,6 +1,7 @@
 package com.rtrh.projects.modules.projects.service;
 
 import com.rtrh.projects.modules.projects.po.LogOperate;
+import com.rtrh.projects.modules.projects.vo.LogOperateVO;
 
 import java.util.List;
 
@@ -16,5 +17,5 @@ public interface ILogOperateService {
 
     void save(LogOperate logOperate);
 
-    List<LogOperate> queryByYear(int year);
+    List<LogOperateVO> queryByYear(int year);
 }

+ 2 - 0
projects-service/src/main/java/com/rtrh/projects/modules/projects/service/SubPreNewService.java

@@ -203,4 +203,6 @@ public interface SubPreNewService {
 	SubPreNew findById(String id);
 
 	void update(SubPreNew preNew);
+
+	List<SubPreNew> findList();
 }

+ 2 - 0
projects-service/src/main/java/com/rtrh/projects/modules/projects/service/SubRptContService.java

@@ -181,4 +181,6 @@ public interface SubRptContService {
 	List<RptCont> selectNewestMonthReport(List<String> ids);
 
 	RptCont getBySubIdAndMonthFgw(String subId, String year, String week, RptContKindEnum contKindEnum);
+
+	List<RptCont> listByYear(int thisYear);
 }

+ 2 - 1
projects-service/src/main/java/com/rtrh/projects/modules/projects/service/impl/LogOperateServiceImpl.java

@@ -3,6 +3,7 @@ package com.rtrh.projects.modules.projects.service.impl;
 import com.rtrh.projects.modules.projects.mapper.LogOperateMapper;
 import com.rtrh.projects.modules.projects.po.LogOperate;
 import com.rtrh.projects.modules.projects.service.ILogOperateService;
+import com.rtrh.projects.modules.projects.vo.LogOperateVO;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
@@ -27,7 +28,7 @@ public class LogOperateServiceImpl implements ILogOperateService {
     }
 
     @Override
-    public List<LogOperate> queryByYear(int year) {
+    public List<LogOperateVO> queryByYear(int year) {
         return logOperateMapper.queryByYear(year);
     }
 }

+ 6 - 3
projects-service/src/main/java/com/rtrh/projects/modules/projects/service/impl/SubInfoServiceImpl.java

@@ -4880,9 +4880,10 @@ public class SubInfoServiceImpl implements SubInfoService {
         subInduService.queryAll(null).stream()
                 .filter(e -> e.getCode().equals(subInfo.getIndusKind()))
                 .findFirst().ifPresent(e-> subInfo.setIndusName(e.getTitle()));
-        sysTableService.getByKind(SysTableKind.JSXZ).stream()
-                .filter(e -> e.getCode().equals(subInfo.getStatus()))
-                .findFirst().ifPresent(e-> subInfo.setStatusName(e.getTitle()));
+        subInfo.setStatusName(SubInfoStatusEnum.getDesc(subInfo.getStatus()));
+        // sysTableService.getByKind(SysTableKind.JSXZ).stream()
+        //         .filter(e -> e.getCode().equals(subInfo.getStatus()))
+        //         .findFirst().ifPresent(e-> subInfo.setStatusName(e.getTitle()));
         sysTableService.getByKind(SysTableKind.JSDD).stream()
                 .filter(e -> e.getCode().equals(subInfo.getSubjectId()))
                 .findFirst().ifPresent(e-> subInfo.setSubjectName(e.getTitle()));
@@ -5436,6 +5437,8 @@ public class SubInfoServiceImpl implements SubInfoService {
                     e.setStatus("在建");
                 } else if (status.equals("9")) {
                     e.setStatus("投产");
+                }else if (status.equals("5")) {
+                    e.setStatus("移除项目");
                 }else {
                     e.setStatus("");
                 }

+ 6 - 0
projects-service/src/main/java/com/rtrh/projects/modules/projects/service/impl/SubPreNewServiceImpl.java

@@ -1604,6 +1604,12 @@ public class SubPreNewServiceImpl implements SubPreNewService {
         subPreNewMapper.update(preNew);
     }
 
+    @Override
+    @TargetDataSource("secondary")
+    public List<SubPreNew> findList() {
+        return subPreNewMapper.findList();
+    }
+
     @Override
     public Page pageQueryCbToXjData(Page page, LoginUserVO vo, PreWarnDataQueryVO queryVO) {
         Map<String, Object> map = new HashMap<>();

+ 6 - 0
projects-service/src/main/java/com/rtrh/projects/modules/projects/service/impl/SubRptContServiceImpl.java

@@ -1990,4 +1990,10 @@ public class SubRptContServiceImpl implements SubRptContService {
 	public RptCont getBySubIdAndMonthFgw(String subId, String year, String week, RptContKindEnum contKindEnum) {
 		return rptContMapper.getBySubIdAndMonth(subId, year, week, contKindEnum.getCode());
 	}
+
+	@Override
+	@TargetDataSource("secondary")
+	public List<RptCont> listByYear(int year) {
+		return rptContMapper.listByYear(year);
+	}
 }

+ 46 - 0
projects-service/src/main/java/com/rtrh/projects/modules/projects/utils/ExcelEntityConverter.java

@@ -0,0 +1,46 @@
+package com.rtrh.projects.modules.projects.utils;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.List;
+
+public class ExcelEntityConverter {
+
+    /**
+     * 根据实体类中的 @Excel 注解生成 List<ExcelExportEntity>
+     * @param clazz 导出实体类的 Class 对象
+     * @return 包含 ExcelExportEntity 的列表
+     */
+    public static List<ExcelExportEntity> convertToExcelExportEntity(Class<?> clazz) {
+        List<ExcelExportEntity> beanList = new ArrayList<>();
+        Field[] declaredFields = clazz.getDeclaredFields();
+
+        for (Field f : declaredFields) {
+            Excel annotation = f.getAnnotation(Excel.class);
+            if (annotation != null) {
+                String comment = annotation.name();
+                Double width = annotation.width();
+                ExcelExportEntity entity = new ExcelExportEntity(comment, f.getName(), width.intValue());
+                annotationParams(annotation, entity); // 如果有其他注解参数需要处理
+                beanList.add(entity);
+            }
+        }
+
+        return beanList;
+    }
+
+    /**
+     * 处理 Excel 注解中的其他参数(如果有的话)
+     * @param annotation Excel 注解对象
+     * @param entity ExcelExportEntity 对象
+     */
+    private static void annotationParams(Excel annotation, ExcelExportEntity entity) {
+        // 这里可以根据具体需求进一步设置 ExcelExportEntity 的属性
+        // 例如:设置是否合并单元格、样式等
+        // entity.setNeedMerge(annotation.merge()); // 示例
+        // entity.setCellStyleHandler(...); // 设置自定义样式处理器
+    }
+}

+ 27 - 0
projects-service/src/main/java/com/rtrh/projects/modules/projects/vo/LogOperateVO.java

@@ -0,0 +1,27 @@
+package com.rtrh.projects.modules.projects.vo;
+
+import com.rtrh.projects.modules.projects.po.LogOperate;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * <p>
+ * 操作日志表
+ * </p>
+ *
+ * @author jiangpengli
+ * @since 2025-01-06
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class LogOperateVO extends LogOperate {
+    private String subjectId;
+    private String indusKind;
+    private BigDecimal amtTotal;
+}

+ 3 - 1
projects-service/src/main/java/com/rtrh/projects/modules/projects/vo/export/SmzkDetailVo.java

@@ -1,5 +1,6 @@
 package com.rtrh.projects.modules.projects.vo.export;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 
 import java.math.BigDecimal;
@@ -26,8 +27,9 @@ public class SmzkDetailVo {
 
     private String cbStatus;  //项目库
 
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
     private Date beginDate; //计划开始日期
-
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
     private Date endDate;   //计划投产日期
 
     private String progress;    //进展情况

+ 81 - 7
projects-service/src/main/java/com/rtrh/projects/modules/projects/vo/export/SubInfoXjVO.java

@@ -1,21 +1,95 @@
 package com.rtrh.projects.modules.projects.vo.export;
 
 import cn.afterturn.easypoi.excel.annotation.Excel;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
+import cn.afterturn.easypoi.excel.annotation.ExcelCollection;
+import cn.afterturn.easypoi.excel.annotation.ExcelEntity;
+import lombok.*;
 
+import java.math.BigDecimal;
 import java.util.Date;
+import java.util.List;
 
 @Data
-@EqualsAndHashCode(callSuper = true)
-public class SubInfoXjVO extends SubInfoBaseDetailVo{
+public class SubInfoXjVO {
+    @Excel(name = "序号")
+    private String index;
 
-    @Excel(name = "预计开工时间", format = "yyyy年MM月", width = 15.0, orderNum = "5")
+    @Excel(name = "项目名称",  width = 20.0)
+    private String subName;
+
+    @Excel(name = "项目所在地",  width = 15.0)
+    private String subjectName;
+
+    @Excel(name = "项目建设内容", width = 70.0)
+    private String content;
+
+    @Excel(name = "计划总投资(亿元)", width = 20.0)
+    private BigDecimal amtTotal;
+
+    @Excel(name = "预计开工时间", format = "yyyy年MM月", width = 15.0)
     private Date beginDate;
 
-    @Excel(name = "前期手续办理情况", orderNum = "6", width = 50.0)
+    @ExcelCollection(name = "前期手续办理情况(已取得的填写已取得,无需办理的填写“/”,未取得的需填写预计取得时间**年**月)")
+    private List<PreNewInfo> preNewInfo;
+
+    @Excel(name = "前期手续办理情况",  width = 50.0)
     private String preContent;
 
-    @Excel(name = "备注", orderNum = "7",width = 30.0)
+    @Excel(name = "牵头部门",  width = 30.0)
+    private String deptName;
+
+    @Excel(name = "责任领导",  width = 30.0)
+    private String leader;
+
+    @Excel(name = "备注",width = 30.0)
     private String remark;
+
+    @Getter
+    @Setter
+    @ToString
+    public static class PreNewInfo {
+        //    备案(核准)
+        @Excel(name = "备案(核准)", format = "yyyy年MM月")
+        private Date record;
+
+        //    用地预审与选址意见书
+        @Excel(name = "用地预审与选址意见书", format = "yyyy年MM月")
+        private Date prePlan;
+
+        //    环评批复
+        @Excel(name = "环评批复",   format = "yyyy年MM月")
+        private Date envPlan;
+
+        //    能评批复
+        @Excel(name = "能评批复",format = "yyyy年MM月")
+        private Date energyPlan;
+
+        //    安评批复
+        @Excel(name = "安评批复", format = "yyyy年MM月")
+        private Date safePlan;
+
+        //    水土保持批复
+        @Excel(name = "水土保持批复",  format = "yyyy年MM月")
+        private Date soilPlan;
+
+        //    建设用地规划许可证
+        @Excel(name = "建设用地规划许可证",format = "yyyy年MM月")
+        private Date planPermit;
+
+        //    土地证
+        @Excel(name = "土地证",  format = "yyyy年MM月")
+        private Date landPermit;
+
+        //    建设工程规划许可证
+        @Excel(name = "建设工程规划许可证", format = "yyyy年MM月")
+        private Date proPlanPermit;
+
+        //    施工图联合审查
+        @Excel(name = "施工图联合审查",  format = "yyyy年MM月")
+        private Date unionPlanPermit;
+
+        //    施工许可证
+        @Excel(name = "施工许可证",   format = "yyyy年MM月")
+        private Date workPermit;
+    }
 }

+ 63 - 6
projects-service/src/main/java/com/rtrh/projects/modules/projects/vo/export/SubInfoZjVO.java

@@ -1,30 +1,87 @@
 package com.rtrh.projects.modules.projects.vo.export;
 
 import cn.afterturn.easypoi.excel.annotation.Excel;
+import cn.afterturn.easypoi.excel.annotation.ExcelCollection;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import lombok.Getter;
+import lombok.Setter;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.Date;
+import java.util.List;
 
 @Data
-@EqualsAndHashCode(callSuper = true)
-public class SubInfoZjVO extends SubInfoBaseDetailVo {
+public class SubInfoZjVO{
+    @Excel(name = "序号")
+    private String index;
 
-    @Excel(name = "建成投产时间", format = "yyyy年MM月", width = 15.0, orderNum = "5")
+    @Excel(name = "项目名称", width = 20.0)
+    private String subName;
+
+    @Excel(name = "项目所在地", width = 15.0)
+    private String subjectName;
+
+    @Excel(name = "项目建设内容", width = 70.0)
+    private String content;
+
+    @Excel(name = "计划总投资(亿元)",  width = 20.0)
+    private BigDecimal amtTotal;
+
+
+    @Excel(name = "建成投产时间", format = "yyyy年MM月", width = 15.0)
     private Date endDate;
 
-    @Excel(name = "年度投资(亿元)", orderNum = "6")
+    @ExcelCollection(name = "2025年1-12月项目工程进度(每月完成工程量)")
+    private List<MonthNumBl> monthNumBlList;
+
+    @Excel(name = "年度投资(亿元)")
     private BigDecimal yearPlanAmt;
 
-    @Excel(name = "进展情况", width = 30.0, orderNum = "7")
+    @Excel(name = "进展情况", width = 30.0)
     private String progress;
 
-    @Excel(name = "备注", width = 30.0, orderNum = "8")
+    @Excel(name = "牵头部门", width = 30.0)
+    private String deptName;
+
+    @Excel(name = "责任领导", width = 30.0)
+    private String leader;
+
+    @Excel(name = "备注", width = 30.0)
     private String remark;
 
     public BigDecimal getYearPlanAmt() {
         return this.yearPlanAmt != null ? this.yearPlanAmt.divide(new BigDecimal(10000), 2, RoundingMode.HALF_UP) : null;
     }
+
+    @Getter
+    @Setter
+    @EqualsAndHashCode
+    public static class MonthNumBl{
+        @Excel(name = "1月")
+        private String month1;
+        @Excel(name = "2月")
+        private String month2;
+        @Excel(name = "3月")
+        private String month3;
+        @Excel(name = "4月")
+        private String month4;
+        @Excel(name = "5月")
+        private String month5;
+        @Excel(name = "6月")
+        private String month6;
+        @Excel(name = "7月")
+        private String month7;
+        @Excel(name = "8月")
+        private String month8;
+        @Excel(name = "9月")
+        private String month9;
+        @Excel(name = "10月")
+        private String month10;
+        @Excel(name = "11月")
+        private String month11;
+        @Excel(name = "12月")
+        private String month12;
+    }
 }

+ 744 - 336
projects/src/main/java/com/rtrh/projects/web/controller/subject/SubInfoExportController.java

@@ -8,6 +8,7 @@ import java.math.RoundingMode;
 import java.net.URLEncoder;
 import java.text.SimpleDateFormat;
 import java.util.*;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 import javax.servlet.ServletOutputStream;
@@ -16,6 +17,7 @@ import javax.servlet.http.HttpServletResponse;
 import cn.afterturn.easypoi.excel.ExcelExportUtil;
 import cn.afterturn.easypoi.word.WordExportUtil;
 import cn.afterturn.easypoi.word.entity.MyXWPFDocument;
+import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.io.IoUtil;
@@ -30,10 +32,9 @@ import com.rtrh.common.util.StringUtil;
 import com.rtrh.projects.modules.projects.dao.SubSourceDao;
 import com.rtrh.projects.modules.projects.enums.ProjectStatusEnum;
 import com.rtrh.projects.modules.projects.enums.SubInfoStatusEnum;
-import com.rtrh.projects.modules.projects.po.LogOperate;
-import com.rtrh.projects.modules.projects.po.SubIndu;
-import com.rtrh.projects.modules.projects.po.SubInfoGxj;
-import com.rtrh.projects.modules.projects.service.ILogOperateService;
+import com.rtrh.projects.modules.projects.po.*;
+import com.rtrh.projects.modules.projects.service.*;
+import com.rtrh.projects.modules.projects.vo.LogOperateVO;
 import com.rtrh.projects.modules.projects.vo.StatusChangeCountersVO;
 import com.rtrh.projects.modules.projects.vo.SubInfoTotalExcel;
 import com.rtrh.projects.modules.projects.vo.export.*;
@@ -57,6 +58,7 @@ import org.apache.poi.xssf.streaming.SXSSFWorkbook;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.apache.poi.xwpf.usermodel.XWPFDocument;
 import org.apache.poi.xwpf.usermodel.XWPFParagraph;
+import org.apache.poi.xwpf.usermodel.XWPFRun;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
@@ -66,9 +68,6 @@ import org.springframework.web.servlet.ModelAndView;
 
 import com.rtrh.common.util.CollectionUtil;
 import com.rtrh.core.repository.Page;
-import com.rtrh.projects.modules.projects.service.SubInfoExportService;
-import com.rtrh.projects.modules.projects.service.SubInfoQueryService;
-import com.rtrh.projects.modules.projects.service.SubInfoService;
 import com.rtrh.projects.modules.projects.vo.SubInfoQueryTzVO;
 import com.rtrh.projects.modules.system.enums.SysTableKind;
 import com.rtrh.projects.modules.system.po.TSystable;
@@ -107,6 +106,11 @@ public class SubInfoExportController extends BaseController {
     private HttpServletResponse response;
     @Autowired
     private ILogOperateService logOperateService;
+    @Autowired
+    private SubPreNewService subPreNewService;
+    @Autowired
+    private SubRptContService subRptContService;
+
     /**
      * 导出汇总表
      *
@@ -871,12 +875,253 @@ public class SubInfoExportController extends BaseController {
 
         return result.toString();
     }
+
+    /**
+     * 新建库 导出明细
+     *
+     */
+    @PostMapping("/exportNewDetailExcel")
+    public void exportNewDetailExcel(@RequestBody SubInfoQueryTzVO queryVO) {
+        queryVO.setSubjectAuthIds(getSubjectIds());
+        List<SubInfoGxj> list = subInfoQueryService.queryAll(getCurUser().getLoginUser(), queryVO);
+        // 行业字典
+        Map<String, String> hyDictMap = subInduService.queryParentAll().stream().collect(Collectors.toMap(SubIndu::getCode, SubIndu::getTitle));
+        // 按行业分组
+        Map<String, List<SubInfoGxj>> groupMap = list.stream()
+                .collect(Collectors.groupingBy(e -> {
+                    if (StringUtils.isNotBlank(e.getIndusKind())){
+                        return e.getIndusKind().substring(0, 2);
+                    }
+                    return "未知行业";
+                }));
+        // 查询手续
+        List<SubPreNew> subPreNewList = subPreNewService.findList();
+        Map<String, List<SubPreNew>> subIdGroups = subPreNewList.stream().collect(Collectors.groupingBy(SubPreNew::getSubId));
+
+        ExportParams exportParams = new ExportParams("“四个一批”工业项目表(新建项目库)","新建项目库",ExcelType.XSSF);
+        exportParams.setStyle(ExcelStyleUtil.class);
+
+        List<SubInfoXjVO> exportList = new ArrayList<>();
+        // 合计行
+        SubInfoXjVO hjCount = BeanUtils.instantiateClass(SubInfoXjVO.class);
+        hjCount.setIndex(String.format("合计(%s个)", list.size()));
+        BigDecimal total = list.stream().reduce(BigDecimal.ZERO, (a, b) -> a.add(b.getAmtTotal()), BigDecimal::add);
+        hjCount.setAmtTotal(convertAmount(total));
+        exportList.add(hjCount);
+
+        int index = 1;
+        List<Integer> allSize = new ArrayList<>();
+        for (Map.Entry<String, List<SubInfoGxj>> entry : groupMap.entrySet()) {
+            String key = entry.getKey();
+            List<SubInfoGxj> value = entry.getValue();
+            List<SubInfoXjVO> hyList = new ArrayList<>();
+            // 行业合计行
+            SubInfoXjVO hyCount = BeanUtils.instantiateClass(SubInfoXjVO.class);
+            hyCount.setIndex(String.format("%s、%s( %s个 )", toChineseNumber(index), hyDictMap.getOrDefault(key, key), value.size()));
+            BigDecimal reduce = value.stream().reduce(BigDecimal.ZERO, (a, b) -> a.add(b.getAmtTotal()), BigDecimal::add);
+            hyCount.setAmtTotal(convertAmount(reduce));
+            // 每条数据行
+            hyList.add(hyCount);
+            for (int i = 0; i < value.size(); i++) {
+                SubInfoGxj subInfoGxj = value.get(i);
+                SubInfoXjVO vo = BeanUtils.instantiateClass(SubInfoXjVO.class);
+                BeanUtils.copyProperties(subInfoGxj, vo);
+                vo.setAmtTotal(convertAmount(subInfoGxj.getAmtTotal()));
+                vo.setIndex(i + 1 + "");
+                SubInfoXjVO.PreNewInfo preNewInfo = new SubInfoXjVO.PreNewInfo();
+                vo.setPreNewInfo(Collections.singletonList(preNewInfo));
+                List<SubPreNew> preNews = subIdGroups.get(subInfoGxj.getSubId());
+                if (CollUtil.isNotEmpty(preNews)){
+                    preNews.forEach(e -> {
+                        if ("3".equals(e.getPreFlowId()) || "5".equals(e.getPreFlowId())) {
+                            preNewInfo.setRecord(e.getDateConfirm());
+                        } else if ("2".equals(e.getPreFlowId())) {
+                            preNewInfo.setPrePlan(e.getDateConfirm());
+                        } else if ("13".equals(e.getPreFlowId())) {
+                            preNewInfo.setProPlanPermit(e.getDateConfirm());
+                        } else if ("14".equals(e.getPreFlowId())) {
+                            preNewInfo.setWorkPermit(e.getDateConfirm());
+                        }
+                    });
+                }
+                hyList.add(vo);
+            }
+            // 添加前计算行业类型合并行
+            allSize.add(exportList.size() + 3);
+            // 合计(832个)行
+            allSize.add(3);
+            exportList.addAll(hyList);
+            index++;
+        }
+        Workbook workbook = ExcelExportUtil.exportExcel(exportParams, SubInfoXjVO.class, exportList);
+        extracted(response, list, workbook, allSize);
+    }
+
+    /**
+     * 在建库 导出明细
+     */
+    @PostMapping("/exportMainDetailExcel")
+    public void exportMainDetailExcel(@RequestBody SubInfoQueryTzVO queryVO) {
+        queryVO.setSubjectAuthIds(getSubjectIds());
+        List<SubInfoGxj> list = subInfoQueryService.queryAll(getCurUser().getLoginUser(), queryVO);
+        // 行业字典
+        Map<String, String> hyDictMap = subInduService.queryParentAll().stream().collect(Collectors.toMap(SubIndu::getCode, SubIndu::getTitle));
+        // 按行业分组
+        Map<String, List<SubInfoGxj>> groupMap = list.stream()
+                .collect(Collectors.groupingBy(e -> {
+                    if (StringUtils.isNotBlank(e.getIndusKind())){
+                        return e.getIndusKind().substring(0, 2);
+                    }
+                    return "未知行业";
+                }));
+
+        ExportParams exportParams = new ExportParams("“四个一批”工业项目表(在建项目库)","在建项目库",ExcelType.XSSF);
+        exportParams.setStyle(ExcelStyleUtil.class);
+        List<SubInfoZjVO> exportList = new ArrayList<>();
+        // 合计行
+        SubInfoZjVO hjCount = BeanUtils.instantiateClass(SubInfoZjVO.class);
+        hjCount.setIndex(String.format("合计(%s个)", list.size()));
+        BigDecimal total = list.stream().reduce(BigDecimal.ZERO, (a, b) -> a.add(b.getAmtTotal()), BigDecimal::add);
+        hjCount.setAmtTotal(convertAmount(total));
+        exportList.add(hjCount);
+
+        // 每月工程完成量
+        int year = DateUtil.thisYear();
+        List<RptCont> rptContList = subRptContService.listByYear(year);
+        Map<String, List<RptCont>> rptContGroup = rptContList.stream().collect(Collectors.groupingBy(RptCont::getSubId));
+
+        int index = 1;
+        List<Integer> allSize = new ArrayList<>();
+        for (Map.Entry<String, List<SubInfoGxj>> entry : groupMap.entrySet()) {
+            String key = entry.getKey();
+            List<SubInfoGxj> value = entry.getValue();
+            List<SubInfoZjVO> hyList = new ArrayList<>();
+            // 行业合计行
+            SubInfoZjVO hyCount = BeanUtils.instantiateClass(SubInfoZjVO.class);
+            hyCount.setIndex(String.format("%s、%s( %s个 )", toChineseNumber(index), hyDictMap.getOrDefault(key, key), value.size()));
+            BigDecimal reduce = value.stream().reduce(BigDecimal.ZERO, (a, b) -> a.add(b.getAmtTotal()), BigDecimal::add);
+            hyCount.setAmtTotal(convertAmount(reduce));
+            // 每条数据行
+            hyList.add(hyCount);
+            for (int i = 0; i < value.size(); i++) {
+                SubInfoGxj subInfoGxj = value.get(i);
+                SubInfoZjVO vo = BeanUtils.instantiateClass(SubInfoZjVO.class);
+                BeanUtils.copyProperties(subInfoGxj, vo);
+                vo.setAmtTotal(convertAmount(subInfoGxj.getAmtTotal()));
+                vo.setIndex(i + 1 + "");
+
+                // 每月完成工程量
+                List<RptCont> subRptConts = rptContGroup.get(subInfoGxj.getSubId());
+                if (CollUtil.isNotEmpty(subRptConts)) {
+                    SubInfoZjVO.MonthNumBl monthNumBl = new SubInfoZjVO.MonthNumBl();
+                    Map<String, BigDecimal> map = subRptConts.stream().collect(Collectors.toMap(RptCont::getKjMonth, RptCont::getNumBl, (a, b) -> a));
+                    monthNumBl.setMonth1(map.getOrDefault(DateUtil.thisYear() + "01", BigDecimal.ZERO) + "%");
+                    monthNumBl.setMonth2(map.getOrDefault(DateUtil.thisYear() + "02", BigDecimal.ZERO) + "%");
+                    monthNumBl.setMonth3(map.getOrDefault(DateUtil.thisYear() + "03", BigDecimal.ZERO) + "%");
+                    monthNumBl.setMonth4(map.getOrDefault(DateUtil.thisYear() + "04", BigDecimal.ZERO) + "%");
+                    monthNumBl.setMonth5(map.getOrDefault(DateUtil.thisYear() + "05", BigDecimal.ZERO) + "%");
+                    monthNumBl.setMonth6(map.getOrDefault(DateUtil.thisYear() + "06", BigDecimal.ZERO) + "%");
+                    monthNumBl.setMonth7(map.getOrDefault(DateUtil.thisYear() + "07", BigDecimal.ZERO) + "%");
+                    monthNumBl.setMonth8(map.getOrDefault(DateUtil.thisYear() + "08", BigDecimal.ZERO) + "%");
+                    monthNumBl.setMonth9(map.getOrDefault(DateUtil.thisYear() + "09", BigDecimal.ZERO) + "%");
+                    monthNumBl.setMonth10(map.getOrDefault(DateUtil.thisYear() + "10", BigDecimal.ZERO) + "%");
+                    monthNumBl.setMonth11(map.getOrDefault(DateUtil.thisYear() + "11", BigDecimal.ZERO) + "%");
+                    monthNumBl.setMonth12(map.getOrDefault(DateUtil.thisYear() + "12", BigDecimal.ZERO) + "%");
+                    vo.setMonthNumBlList(Collections.singletonList(monthNumBl));
+                } else {
+                    SubInfoZjVO.MonthNumBl monthNumBl = new SubInfoZjVO.MonthNumBl();
+                    monthNumBl.setMonth1(BigDecimal.ZERO + "%");
+                    monthNumBl.setMonth2(BigDecimal.ZERO + "%");
+                    monthNumBl.setMonth3(BigDecimal.ZERO + "%");
+                    monthNumBl.setMonth4(BigDecimal.ZERO + "%");
+                    monthNumBl.setMonth5(BigDecimal.ZERO + "%");
+                    monthNumBl.setMonth6(BigDecimal.ZERO + "%");
+                    monthNumBl.setMonth7(BigDecimal.ZERO + "%");
+                    monthNumBl.setMonth8(BigDecimal.ZERO + "%");
+                    monthNumBl.setMonth9(BigDecimal.ZERO + "%");
+                    monthNumBl.setMonth10(BigDecimal.ZERO + "%");
+                    monthNumBl.setMonth11(BigDecimal.ZERO + "%");
+                    monthNumBl.setMonth12(BigDecimal.ZERO + "%");
+                    vo.setMonthNumBlList(Collections.singletonList(monthNumBl));
+                }
+                hyList.add(vo);
+            }
+            // 添加前计算合并行
+            allSize.add(exportList.size() + 3);
+            allSize.add(3);
+            exportList.addAll(hyList);
+            index++;
+        }
+        // 构建表头
+        List<ExcelExportEntity> entityList = new ArrayList<ExcelExportEntity>(){{
+            add(new ExcelExportEntity("序号", "index", 12));
+            add(new ExcelExportEntity("项目名称", "subName", 20));
+            add(new ExcelExportEntity("项目所在地", "subjectName", 15));
+            add(new ExcelExportEntity("项目建设内容", "content", 70));
+            add(new ExcelExportEntity("计划总投资(亿元)", "amtTotal", 20));
+            add(new ExcelExportEntity("建成投产时间", "endDate", 15));
+
+            ExcelExportEntity monthNumBlEntity = new ExcelExportEntity(year + "年1-12月项目工程进度(每月完成工程量)", "monthNumBlList", 12);
+            List<ExcelExportEntity> subHeadEntities = new ArrayList<ExcelExportEntity>(){{
+                add(new ExcelExportEntity("1月", "month1"));
+                add(new ExcelExportEntity("2月", "month2"));
+                add(new ExcelExportEntity("3月", "month3"));
+                add(new ExcelExportEntity("4月", "month4"));
+                add(new ExcelExportEntity("5月", "month5"));
+                add(new ExcelExportEntity("6月", "month6"));
+                add(new ExcelExportEntity("7月", "month7"));
+                add(new ExcelExportEntity("8月", "month8"));
+                add(new ExcelExportEntity("9月", "month9"));
+                add(new ExcelExportEntity("10月", "month10"));
+                add(new ExcelExportEntity("11月", "month11"));
+                add(new ExcelExportEntity("12月", "month12"));
+            }};
+            monthNumBlEntity.setList(subHeadEntities);
+            add(monthNumBlEntity);
+
+            add(new ExcelExportEntity("年度投资(亿元)", "yearPlanAmt", 12));
+            add(new ExcelExportEntity("进展情况", "progress", 30));
+            add(new ExcelExportEntity("牵头部门", "deptName", 30));
+            add(new ExcelExportEntity("责任领导", "leader", 15));
+            add(new ExcelExportEntity("备注", "remark", 15));
+        }};
+        List<Map<String, Object>> collect = exportList.stream().map(e->{
+            Map<String, Object> map = BeanUtil.beanToMap(e);
+            Object o = map.get("endDate");
+            if (o != null) {
+                map.put("endDate", DateUtil.format((Date) o, "yyyy年MM月"));
+            }
+            return map;
+        }).collect(Collectors.toList());
+
+        Workbook workbook = ExcelExportUtil.exportExcel(exportParams, entityList, collect);
+        extracted(response, list, workbook, allSize);
+    }
+
     /**
      * 4库/总库 导出明细
      *
      */
     @PostMapping("/exportDetailExcel")
     public void exportDetailExcel(@RequestBody SubInfoQueryTzVO queryVO) {
+        WebLogAspect.content.set(String.format("页面:【项目四库管理-%s库】,执行操作:导出明细", StringUtils.isBlank(queryVO.getStatus()) ? "项目总" : SubInfoStatusEnum.getDesc(queryVO.getStatus())));
+        if (SubInfoStatusEnum.CB.getCode().equals(queryVO.getStatus())) {
+            exportCbDetailExcel(queryVO);
+        }else if (SubInfoStatusEnum.XJ.getCode().equals(queryVO.getStatus())){
+            exportNewDetailExcel(queryVO);
+        }else if (SubInfoStatusEnum.ZJ.getCode().equals(queryVO.getStatus())){
+            exportMainDetailExcel(queryVO);
+        } else if (SubInfoStatusEnum.TC.getCode().equals(queryVO.getStatus())) {
+            exportTcDetailExcel(queryVO);
+        } else {
+            exportZkDetailExcel(queryVO);
+        }
+    }
+
+    /**
+     * 总库 导出明细
+     */
+    private void exportZkDetailExcel(SubInfoQueryTzVO queryVO) {
         WebLogAspect.content.set(String.format("页面:【项目四库管理-%s库】,执行操作:导出明细", StringUtils.isBlank(queryVO.getStatus()) ? "项目总" : SubInfoStatusEnum.getDesc(queryVO.getStatus())));
         queryVO.setSubjectAuthIds(getSubjectIds());
         List<SubInfoGxj> list = subInfoQueryService.queryAll(getCurUser().getLoginUser(), queryVO);
@@ -891,93 +1136,121 @@ public class SubInfoExportController extends BaseController {
                     return "未知行业";
                 }));
         Workbook workbook;
-        if (SubInfoStatusEnum.CB.getCode().equals(queryVO.getStatus())) {
-            ExportParams exportParams = new ExportParams("“四个一批”工业项目表(储备项目库)", "储备项目库", ExcelType.XSSF);
-            exportParams.setStyle(ExcelStyleUtil.class);
-            exportDetail(response, exportParams, SubInfoCbVO.class, list, hyDictMap, groupMap);
-        }else if (SubInfoStatusEnum.XJ.getCode().equals(queryVO.getStatus())){
-            ExportParams exportParams = new ExportParams("“四个一批”工业项目表(新建项目库)","新建项目库",ExcelType.XSSF);
-            exportParams.setStyle(ExcelStyleUtil.class);
-            exportDetail(response, exportParams, SubInfoXjVO.class, list, hyDictMap, groupMap);
-        }else if (SubInfoStatusEnum.ZJ.getCode().equals(queryVO.getStatus())){
-            ExportParams exportParams = new ExportParams("“四个一批”工业项目表(在建项目库)","在建项目库",ExcelType.XSSF);
-            exportParams.setStyle(ExcelStyleUtil.class);
-            exportDetail(response, exportParams, SubInfoZjVO.class, list, hyDictMap, groupMap);
-        } else if (SubInfoStatusEnum.TC.getCode().equals(queryVO.getStatus())) {
-            List<SubInfoTcVO> exportList = new ArrayList<>();
-            // 合计行
-            SubInfoTcVO hjCount = new SubInfoTcVO();
-            hjCount.setIndex(String.format("合计(%s个)", list.size()));
-            exportList.add(hjCount);
-
-            int index = 1;
-            List<Integer> allSize = new ArrayList<>();
-            for (Map.Entry<String, List<SubInfoGxj>> entry : groupMap.entrySet()) {
-                String key = entry.getKey();
-                List<SubInfoGxj> value = entry.getValue();
-                List<SubInfoTcVO> hyList = new ArrayList<>();
-                // 行业合计行
-                SubInfoTcVO hyCount = new SubInfoTcVO();
-                hyCount.setIndex(String.format("%s、%s( %s个 )", toChineseNumber(index), hyDictMap.getOrDefault(key, key), value.size()));
-                // 每条数据行
-                hyList.add(hyCount);
-                for (int i = 0; i < value.size(); i++) {
-                    SubInfoGxj subInfoGxj = value.get(i);
-                    SubInfoTcVO vo = new SubInfoTcVO();
-                    BeanUtils.copyProperties(subInfoGxj, vo);
-                    // BigDecimal divide = subInfoGxj.getAmtTotal() != null ? subInfoGxj.getAmtTotal().divide(BigDecimal.valueOf(10000), 2, RoundingMode.HALF_UP) : BigDecimal.ZERO;
-                    // vo.setAmtTotal(divide);
-                    vo.setIndex(i + 1 + "");
-                    hyList.add(vo);
-                }
-                // 添加前计算合并行
-                allSize.add(exportList.size() + 2);
-                exportList.addAll(hyList);
-                index++;
+        // 项目总库
+        List<SubInfoZkVO> exportList = new ArrayList<>();
+        // 合计行
+        SubInfoZkVO hjCount = new SubInfoZkVO();
+        hjCount.setIndex(String.format("合计(%s个)", list.size()));
+        exportList.add(hjCount);
+
+        int index = 1;
+        List<Integer> allSize = new ArrayList<>();
+        for (Map.Entry<String, List<SubInfoGxj>> entry : groupMap.entrySet()) {
+            String key = entry.getKey();
+            List<SubInfoGxj> value = entry.getValue();
+            List<SubInfoZkVO> hyList = new ArrayList<>();
+            // 行业合计行
+            SubInfoZkVO hyCount = new SubInfoZkVO();
+            hyCount.setIndex(String.format("%s、%s( %s个 )", toChineseNumber(index), hyDictMap.getOrDefault(key, key), value.size()));
+            // 每条数据行
+            hyList.add(hyCount);
+            for (int i = 0; i < value.size(); i++) {
+                SubInfoGxj subInfoGxj = value.get(i);
+                SubInfoZkVO vo = new SubInfoZkVO();
+                BeanUtils.copyProperties(subInfoGxj, vo);
+                vo.setAmtTotal(convertAmount(subInfoGxj.getAmtTotal()));
+                vo.setIndex(i + 1 + "");
+                hyList.add(vo);
             }
-            ExportParams exportParams = new ExportParams("“四个一批”工业项目表(投产项目库)", "投产项目库", ExcelType.XSSF);
-            exportParams.setStyle(ExcelStyleUtil.class);
-            // 设置默认样式(这里设置所有单元格都有边框)
-            workbook = ExcelExportUtil.exportExcel(exportParams, SubInfoTcVO.class, exportList);
-            extracted(response, list, workbook, allSize);
-        } else {
-            // 项目总库
-            List<SubInfoZkVO> exportList = new ArrayList<>();
-            // 合计行
-            SubInfoZkVO hjCount = new SubInfoZkVO();
-            hjCount.setIndex(String.format("合计(%s个)", list.size()));
-            exportList.add(hjCount);
-
-            int index = 1;
-            List<Integer> allSize = new ArrayList<>();
-            for (Map.Entry<String, List<SubInfoGxj>> entry : groupMap.entrySet()) {
-                String key = entry.getKey();
-                List<SubInfoGxj> value = entry.getValue();
-                List<SubInfoZkVO> hyList = new ArrayList<>();
-                // 行业合计行
-                SubInfoZkVO hyCount = new SubInfoZkVO();
-                hyCount.setIndex(String.format("%s、%s( %s个 )", toChineseNumber(index), hyDictMap.getOrDefault(key, key), value.size()));
-                // 每条数据行
-                hyList.add(hyCount);
-                for (int i = 0; i < value.size(); i++) {
-                    SubInfoGxj subInfoGxj = value.get(i);
-                    SubInfoZkVO vo = new SubInfoZkVO();
-                    BeanUtils.copyProperties(subInfoGxj, vo);
-                    vo.setAmtTotal(convertAmount(subInfoGxj.getAmtTotal()));
-                    vo.setIndex(i + 1 + "");
-                    hyList.add(vo);
-                }
-                // 添加前计算合并行
-                allSize.add(exportList.size() + 2);
-                exportList.addAll(hyList);
-                index++;
+            // 添加前计算合并行
+            allSize.add(exportList.size() + 2);
+            allSize.add(2);
+            exportList.addAll(hyList);
+            index++;
+        }
+        ExportParams exportParams = new ExportParams("“四个一批”工业项目表(项目总库)", "项目总库", ExcelType.XSSF);
+        exportParams.setStyle(ExcelStyleUtil.class);
+        // exportParams.setHeight((short) -1);
+        workbook = ExcelExportUtil.exportExcel(exportParams, SubInfoZkVO.class, exportList);
+        extracted(response, list, workbook, allSize);
+    }
+
+    /**
+     * 投产 导出明细
+     */
+    private void exportTcDetailExcel(SubInfoQueryTzVO queryVO) {
+        WebLogAspect.content.set(String.format("页面:【项目四库管理-%s库】,执行操作:导出明细", StringUtils.isBlank(queryVO.getStatus()) ? "项目总" : SubInfoStatusEnum.getDesc(queryVO.getStatus())));
+        queryVO.setSubjectAuthIds(getSubjectIds());
+        List<SubInfoGxj> list = subInfoQueryService.queryAll(getCurUser().getLoginUser(), queryVO);
+        // 行业字典
+        Map<String, String> hyDictMap = subInduService.queryParentAll().stream().collect(Collectors.toMap(SubIndu::getCode, SubIndu::getTitle));
+        // 按行业分组
+        Map<String, List<SubInfoGxj>> groupMap = list.stream()
+                .collect(Collectors.groupingBy(e -> {
+                    if (StringUtils.isNotBlank(e.getIndusKind())){
+                        return e.getIndusKind().substring(0, 2);
+                    }
+                    return "未知行业";
+                }));
+        Workbook workbook;
+        List<SubInfoTcVO> exportList = new ArrayList<>();
+        // 合计行
+        SubInfoTcVO hjCount = new SubInfoTcVO();
+        hjCount.setIndex(String.format("合计(%s个)", list.size()));
+        exportList.add(hjCount);
+
+        int index = 1;
+        List<Integer> allSize = new ArrayList<>();
+        for (Map.Entry<String, List<SubInfoGxj>> entry : groupMap.entrySet()) {
+            String key = entry.getKey();
+            List<SubInfoGxj> value = entry.getValue();
+            List<SubInfoTcVO> hyList = new ArrayList<>();
+            // 行业合计行
+            SubInfoTcVO hyCount = new SubInfoTcVO();
+            hyCount.setIndex(String.format("%s、%s( %s个 )", toChineseNumber(index), hyDictMap.getOrDefault(key, key), value.size()));
+            // 每条数据行
+            hyList.add(hyCount);
+            for (int i = 0; i < value.size(); i++) {
+                SubInfoGxj subInfoGxj = value.get(i);
+                SubInfoTcVO vo = new SubInfoTcVO();
+                BeanUtils.copyProperties(subInfoGxj, vo);
+                // BigDecimal divide = subInfoGxj.getAmtTotal() != null ? subInfoGxj.getAmtTotal().divide(BigDecimal.valueOf(10000), 2, RoundingMode.HALF_UP) : BigDecimal.ZERO;
+                // vo.setAmtTotal(divide);
+                vo.setIndex(i + 1 + "");
+                hyList.add(vo);
             }
-            ExportParams exportParams = new ExportParams("“四个一批”工业项目表(项目总库)", "项目总库", ExcelType.XSSF);
-            exportParams.setStyle(ExcelStyleUtil.class);
-            // exportParams.setHeight((short) -1);
-            workbook = ExcelExportUtil.exportExcel(exportParams, SubInfoZkVO.class, exportList);
-            extracted(response, list, workbook, allSize);
+            // 添加前计算合并行
+            allSize.add(exportList.size() + 2);
+            allSize.add(2);
+            exportList.addAll(hyList);
+            index++;
         }
+        ExportParams exportParams = new ExportParams("“四个一批”工业项目表(投产项目库)", "投产项目库", ExcelType.XSSF);
+        exportParams.setStyle(ExcelStyleUtil.class);
+        // 设置默认样式(这里设置所有单元格都有边框)
+        workbook = ExcelExportUtil.exportExcel(exportParams, SubInfoTcVO.class, exportList);
+        extracted(response, list, workbook, allSize);
+    }
+
+    /**
+     * 储备库 导出明细
+     */
+    private void exportCbDetailExcel(SubInfoQueryTzVO queryVO) {
+        queryVO.setSubjectAuthIds(getSubjectIds());
+        List<SubInfoGxj> list = subInfoQueryService.queryAll(getCurUser().getLoginUser(), queryVO);
+        // 行业字典
+        Map<String, String> hyDictMap = subInduService.queryParentAll().stream().collect(Collectors.toMap(SubIndu::getCode, SubIndu::getTitle));
+        // 按行业分组
+        Map<String, List<SubInfoGxj>> groupMap = list.stream()
+                .collect(Collectors.groupingBy(e -> {
+                    if (StringUtils.isNotBlank(e.getIndusKind())){
+                        return e.getIndusKind().substring(0, 2);
+                    }
+                    return "未知行业";
+                }));
+        ExportParams exportParams = new ExportParams("“四个一批”工业项目表(储备项目库)", "储备项目库", ExcelType.XSSF);
+        exportParams.setStyle(ExcelStyleUtil.class);
+        exportDetail(response, exportParams, SubInfoCbVO.class, list, hyDictMap, groupMap);
     }
 
     /**
@@ -1009,7 +1282,7 @@ public class SubInfoExportController extends BaseController {
             statusGroupList.forEach((key, value) -> {
                 SubInfoStatusEnum anEnum = SubInfoStatusEnum.getEnum(key);
                 String statusRate = new BigDecimal(value.size()).multiply(new BigDecimal(100)).divide(new BigDecimal(list.size()), 2, RoundingMode.HALF_UP) + "%";
-                BigDecimal totalAmt = value.stream().map(SubInfoTotalExcel::getAmtTotal).reduce(BigDecimal.ZERO, BigDecimal::add);
+                BigDecimal totalAmt = value.stream().map(SubInfoTotalExcel::getAmtTotal).reduce(BigDecimal.ZERO, BigDecimal::add).divide(new BigDecimal(10000), 2, RoundingMode.HALF_UP);
                 String format = String.format("%s项目%s个,占工业项目总数的%s,计划总投资%s亿元;", anEnum.getDesc(), value.size(), statusRate, totalAmt);
                 statusStrBuilder.append(format);
             });
@@ -1021,7 +1294,7 @@ public class SubInfoExportController extends BaseController {
             Map<String, List<SubInfoTotalExcel>> subjectGroupList = list.stream().collect(Collectors.groupingBy(SubInfoTotalExcel::getSubjectId));
             subjectGroupList.forEach((key, value) -> {
                 String rate = new BigDecimal(value.size()).multiply(new BigDecimal(100)).divide(new BigDecimal(list.size()), 2, RoundingMode.HALF_UP) + "%";
-                BigDecimal totalAmt = value.stream().map(SubInfoTotalExcel::getAmtTotal).reduce(BigDecimal.ZERO, BigDecimal::add);
+                BigDecimal totalAmt = value.stream().map(SubInfoTotalExcel::getAmtTotal).reduce(BigDecimal.ZERO, BigDecimal::add).divide(new BigDecimal(10000), 2, RoundingMode.HALF_UP);
                 String format = String.format("%s%s个,占工业项目总数的%s,计划总投资%s亿元;", jsddMap.get(key), value.size(), rate, totalAmt);
                 subjectStrBuilder.append(format);
             });
@@ -1044,7 +1317,7 @@ public class SubInfoExportController extends BaseController {
             }));
             scaleGroupList.forEach((key, value) -> {
                 String rate = new BigDecimal(value.size()).multiply(new BigDecimal(100)).divide(new BigDecimal(list.size()), 2, RoundingMode.HALF_UP) + "%";
-                BigDecimal totalAmt = value.stream().map(SubInfoTotalExcel::getAmtTotal).reduce(BigDecimal.ZERO, BigDecimal::add);
+                BigDecimal totalAmt = value.stream().map(SubInfoTotalExcel::getAmtTotal).reduce(BigDecimal.ZERO, BigDecimal::add).divide(new BigDecimal(10000), 2, RoundingMode.HALF_UP);
                 String format = String.format("计划总投资%s项目%s个,占工业项目总数的%s,计划总投资%s亿元;", key, value.size(), rate, totalAmt);
                 scaleStrBuilder.append(format);
             });
@@ -1064,7 +1337,7 @@ public class SubInfoExportController extends BaseController {
                     }));
             hyGroupList.forEach((key, value) -> {
                 String rate = new BigDecimal(value.size()).multiply(new BigDecimal(100)).divide(new BigDecimal(list.size()), 2, RoundingMode.HALF_UP) + "%";
-                BigDecimal totalAmt = value.stream().map(SubInfoTotalExcel::getAmtTotal).reduce(BigDecimal.ZERO, BigDecimal::add);
+                BigDecimal totalAmt = value.stream().map(SubInfoTotalExcel::getAmtTotal).reduce(BigDecimal.ZERO, BigDecimal::add).divide(new BigDecimal(10000), 2, RoundingMode.HALF_UP);
                 String format = String.format("%s项目%s个,占工业项目总数的%s,计划总投资%s亿元;", hyflMap.getOrDefault(key, key), value.size(), rate, totalAmt);
                 hyStrBuilder.append(format);
             });
@@ -1072,7 +1345,7 @@ public class SubInfoExportController extends BaseController {
             data.put("hyStr", hyStr);
 
             // 一、项目转化情况
-            List<LogOperate> logList = logOperateService.queryByYear(year);
+            List<LogOperateVO> logList = logOperateService.queryByYear(year);
             StatusChangeCountersVO totalCounterVo = new StatusChangeCountersVO();
             addNum(logList, totalCounterVo);
             data.put("cbToXjNum", totalCounterVo.cbToXjNum);
@@ -1082,7 +1355,7 @@ public class SubInfoExportController extends BaseController {
             data.put("xjToCbNum", totalCounterVo.xjToCbNum);
             data.put("rgToZjNum", totalCounterVo.rgToZjNum);
 
-            List<LogOperate> lastLogList = logList.stream().filter(logOperate -> DateUtil.month(logOperate.getCreateTime()) < DateUtil.month(new Date())).collect(Collectors.toList());
+            List<LogOperateVO> lastLogList = logList.stream().filter(logOperate -> DateUtil.month(logOperate.getCreateTime()) < DateUtil.month(new Date())).collect(Collectors.toList());
             StatusChangeCountersVO lastCounterVo = new StatusChangeCountersVO();
             addNum(lastLogList, lastCounterVo);
             data.put("lastCbToXjNum", lastCounterVo.cbToXjNum);
@@ -1092,54 +1365,92 @@ public class SubInfoExportController extends BaseController {
             data.put("lastXjToCbNum", lastCounterVo.xjToCbNum);
             data.put("lastRgToZjNum", lastCounterVo.rgToZjNum);
 
-            // 分属地看
+
             String text = "%s年1-%s月,%s储备项目转新建%s个、新建项目转在建%s个、在建项目转投产%s个、投产项目转入规%s个,新建项目降级为储备%s个、入规项目转为在建%s个。" +
                     "其中,%s月当月,储备项目转新建%s个、新建项目转在建%s个、在建项目转投产%s个、投产项目转入规%s个,新建项目降级为储备%s个、入规项目转为在建%s个。" +
                     "1-%s月,项目开工率%s、投产率%s、入规率%s,较1-(%s)月,分别增长%s、%s、%s个百分点。";
-            String subjectZhStr = String.format(text,
-                    year, month, "subjectName", totalCounterVo.cbToXjNum, totalCounterVo.xjToZjNum, totalCounterVo.zjToTcNum, totalCounterVo.tcToRgNum, totalCounterVo.xjToCbNum, totalCounterVo.rgToZjNum,
-                    month, totalCounterVo.cbToXjNum, totalCounterVo.xjToZjNum, totalCounterVo.zjToTcNum, totalCounterVo.tcToRgNum, totalCounterVo.xjToCbNum, totalCounterVo.rgToZjNum,
-                    month, "kgl", "tcl", "rgl", lastMonth, "1", "2", "3"
-            );
+            // 分属地看
+            Map<String, List<LogOperateVO>> subjectZhGroups = logList.stream().collect(Collectors.groupingBy(LogOperateVO::getSubjectId));
+            StringBuilder subjectZhStr = new StringBuilder();
+            subjectZhGroups.forEach((key, value) -> {
+                StatusChangeCountersVO tempVo = new StatusChangeCountersVO();
+                addNum(value, tempVo);
+                subjectZhStr.append(String.format(text,
+                        year, month, jsddMap.get(key), tempVo.cbToXjNum, tempVo.xjToZjNum, tempVo.zjToTcNum, tempVo.tcToRgNum, tempVo.xjToCbNum, tempVo.rgToZjNum,
+                        month, tempVo.cbToXjNum, tempVo.xjToZjNum, tempVo.zjToTcNum, tempVo.tcToRgNum, tempVo.xjToCbNum, tempVo.rgToZjNum,
+                        month, "0%", "0%", "0%", lastMonth, "0", "0", "0"));
+                subjectZhStr.append("\n").append("\t");
+            });
             data.put("subjectZhStr", subjectZhStr);
+
             // 分规模看
-            String scaleZhStr = String.format(text,
-                    year, month, "计划总投资100亿元以上", totalCounterVo.cbToXjNum, totalCounterVo.xjToZjNum, totalCounterVo.zjToTcNum, totalCounterVo.tcToRgNum, totalCounterVo.xjToCbNum, totalCounterVo.rgToZjNum,
-                    month, totalCounterVo.cbToXjNum, totalCounterVo.xjToZjNum, totalCounterVo.zjToTcNum, totalCounterVo.tcToRgNum, totalCounterVo.xjToCbNum, totalCounterVo.rgToZjNum,
-                    month, "kgl", "tcl", "rgl", lastMonth, "1", "2", "3"
-            );
+            Map<String, List<LogOperateVO>> scaleZhGroups = logList.stream().collect(Collectors.groupingBy(transaction -> {
+                for (Map.Entry<String, BigDecimal> entry : groupBoundaries.entrySet()) {
+                    if (transaction.getAmtTotal().compareTo(entry.getValue()) < 0) {
+                        return entry.getKey();
+                    }
+                }
+                return "100亿元以上";
+            }));
+            StringBuilder scaleZhStr = new StringBuilder();
+            scaleZhGroups.forEach((key, value) -> {
+                StatusChangeCountersVO tempVo = new StatusChangeCountersVO();
+                addNum(value, tempVo);
+                scaleZhStr.append(String.format(text,
+                        year, month, "计划总投资" + key, tempVo.cbToXjNum, tempVo.xjToZjNum, tempVo.zjToTcNum, tempVo.tcToRgNum, tempVo.xjToCbNum, tempVo.rgToZjNum,
+                        month, tempVo.cbToXjNum, tempVo.xjToZjNum, tempVo.zjToTcNum, tempVo.tcToRgNum, tempVo.xjToCbNum, tempVo.rgToZjNum,
+                        month, "0%", "0%", "0%", lastMonth, "0", "0", "0"
+                ));
+                scaleZhStr.append("\n").append("\t");
+            });
             data.put("scaleZhStr", scaleZhStr);
+
             // 分行业看
-            String hyZhStr = String.format(text,
-                    year, month, "制造业", totalCounterVo.cbToXjNum, totalCounterVo.xjToZjNum, totalCounterVo.zjToTcNum, totalCounterVo.tcToRgNum, totalCounterVo.xjToCbNum, totalCounterVo.rgToZjNum,
-                    month, totalCounterVo.cbToXjNum, totalCounterVo.xjToZjNum, totalCounterVo.zjToTcNum, totalCounterVo.tcToRgNum, totalCounterVo.xjToCbNum, totalCounterVo.rgToZjNum,
-                    month, "kgl", "tcl", "rgl", lastMonth, "1", "2", "3"
-            );
+            Map<String, List<LogOperateVO>> hyZhGroups = logList.stream()
+                    .collect(Collectors.groupingBy(transaction -> {
+                        String code = transaction.getIndusKind();
+                        // 确保code不为空且长度至少为2
+                        if (code == null || code.length() < 2) {
+                            return "未知行业";  // 默认未知行业
+                        }
+                        return code.substring(0, 2);
+                    }));
+            StringBuilder hyZhStr = new StringBuilder();
+            hyZhGroups.forEach((key, value) -> {
+                StatusChangeCountersVO tempVo = new StatusChangeCountersVO();
+                addNum(value, tempVo);
+                hyZhStr.append(String.format(text,
+                        year, month, hyflMap.get(key), tempVo.cbToXjNum, tempVo.xjToZjNum, tempVo.zjToTcNum, tempVo.tcToRgNum, tempVo.xjToCbNum, tempVo.rgToZjNum,
+                        month, tempVo.cbToXjNum, tempVo.xjToZjNum, tempVo.zjToTcNum, tempVo.tcToRgNum, tempVo.xjToCbNum, tempVo.rgToZjNum,
+                        month, "0%", "0%", "0%", lastMonth, "0", "0", "0"
+                ));
+                hyZhStr.append("\n").append("\t");
+            });
             data.put("hyZhStr", hyZhStr);
             // 二、存在问题
             // (一)项目落地方面
-            data.put("xmldSubNameStr", "a项目、b项目、c项目");
-            data.put("xmldNum", 3);
-            data.put("xmldMonthNum", 3);
+            data.put("xmldSubNameStr", "、、");
+            data.put("xmldNum", 0);
+            data.put("xmldMonthNum", 0);
             // (二)前期手续方面
-            data.put("qqsxNum", 3);
-            data.put("qqsxHpNames", "a项目、b项目、c项目");
-            data.put("qqsxHpNum", 3);
-            data.put("qqsxNpNames", "a项目、b项目、c项目");
-            data.put("qqsxNpNum", 3);
-            data.put("qqsxYdNames", "a项目、b项目、c项目");
-            data.put("qqsxYdNum", 3);
+            data.put("qqsxNum", 0);
+            data.put("qqsxHpNames", "、、");
+            data.put("qqsxHpNum", 0);
+            data.put("qqsxNpNames", "、、");
+            data.put("qqsxNpNum", 0);
+            data.put("qqsxYdNames", "、、");
+            data.put("qqsxYdNum", 0);
             // (三)工程建设方面
-            data.put("gcjsNum", 3);
-            data.put("gcjsZjzhNames", "a项目b项目c项目");
-            data.put("gcjsZjzhNum", 3);
-            data.put("gcjsAqsgNames", "a项目b项目c项目");
+            data.put("gcjsNum", 0);
+            data.put("gcjsZjzhNames", "、、");
+            data.put("gcjsZjzhNum", 0);
+            data.put("gcjsAqsgNames", "、、");
             // (四)升规入统方面
-            data.put("sgrtNum", 3);
-            data.put("sgrtCqNames", "a项目b项目c项目");
-            data.put("sgrtCqNum", 3);
-            data.put("sgrtZlzhNames", "a项目b项目c项目");
-            data.put("sgrtZlzhNum", 3);
+            data.put("sgrtNum", 0);
+            data.put("sgrtCqNames", "、、");
+            data.put("sgrtCqNum", 0);
+            data.put("sgrtZlzhNames", "、、");
+            data.put("sgrtZlzhNum", 0);
 
             // Map<String, List<LogOperate>> collect = logList.stream().collect(Collectors.groupingBy(LogOperate::getTitle));
             // String currentYearZhStr = buildZhData(collect);
@@ -1153,12 +1464,13 @@ public class SubInfoExportController extends BaseController {
         }
 
         WordExportUtil.exportWord07(word, data);
+        addBreakInCell(word.getParagraphs());
         response.setHeader("content-disposition","attachment;filename="+new String("analysis".getBytes(),"ISO8859-1"));
-        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+        response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
         word.write(response.getOutputStream());
     }
 
-    private void addNum(List<LogOperate> lastLogList, StatusChangeCountersVO vo) {
+    private void addNum(List<LogOperateVO> lastLogList, StatusChangeCountersVO vo) {
         for (LogOperate logOperate : lastLogList) {
             if (SubInfoStatusEnum.CB.getCode().equals(logOperate.getStatusFirst()) && SubInfoStatusEnum.XJ.getCode().equals(logOperate.getStatusAfter())) {
                 ++vo.cbToXjNum;
@@ -1181,16 +1493,25 @@ public class SubInfoExportController extends BaseController {
         }
     }
 
-
-    private String buildZhData(Map<String, List<LogOperate>> collect) {
-        StringBuilder zhStrBuilder = new StringBuilder();
-        collect.forEach((key, value) -> {
-            zhStrBuilder.append(key).append(value.size()).append("个、");
-        });
-        return zhStrBuilder.toString().replaceAll("、$", "。");
+    public static void addBreakInCell(List<XWPFParagraph> paragraphs) {
+        for (XWPFParagraph p : paragraphs) {
+            for (XWPFRun run : p.getRuns()) {//XWPFRun对象定义具有一组公共属性的文本区域
+                if(run.getText(0)!= null && run.getText(0).contains("\n")) {
+                    String[] lines = run.getText(0).split("\n");
+                    if(lines.length > 0) {
+                        run.setText(lines[0], 0); // set first line into XWPFRun
+                        for(int i=1;i<lines.length;i++){
+                            // add break and insert new text
+                            run.addBreak();//中断
+//                              run.addCarriageReturn();//回车符,但是不起作用
+                            run.setText(lines[i]);
+                        }
+                    }
+                }
+            }
+        }
     }
 
-
     /**
      * 导出重点项目储备明细表
      *
@@ -1226,7 +1547,7 @@ public class SubInfoExportController extends BaseController {
             writer.addHeaderAlias("content", "项目建设内容");
             writer.addHeaderAlias("amtTotal", "计划总投资(万元)");
             writer.addHeaderAlias("indusKind", "行业分类");
-            writer.addHeaderAlias("cbStatus", "状态[正在谋划,正在洽谈,已签约,已备案/已核准]");
+            writer.addHeaderAlias("cbStatus", "状态[正在谋划,正在洽谈,\n已签约,已备案/已核准]");
             writer.addHeaderAlias("beginDate", "计划开始日期");
             writer.addHeaderAlias("endDate", "计划投产日期");
             writer.addHeaderAlias("progress", "项目进展情况");
@@ -1241,15 +1562,28 @@ public class SubInfoExportController extends BaseController {
             cellStyle.setAlignment(HorizontalAlignment.LEFT);
 
             // 设置每列的默认宽度
-            int defaultColumnWidth = 40; // 默认宽度为20个字符
-            for (int i = 0; i < 11; i++) {
-                if (i == 0) {
-                    sheet.setColumnWidth(i, 4 * 256); // 序号列宽度为20个字符
-                    continue;
-                }
-                sheet.setColumnWidth(i, defaultColumnWidth * 256); // 其他列保持默认宽度
-            }
+            // int defaultColumnWidth = 40; // 默认宽度为20个字符
+            // for (int i = 0; i < 11; i++) {
+            //     if (i == 0) {
+            //         sheet.setColumnWidth(i, 4 * 256); // 序号列宽度为20个字符
+            //         continue;
+            //     }
+            //     sheet.setColumnWidth(i, defaultColumnWidth * 256); // 其他列保持默认宽度
+            // }
 
+            sheet.setColumnWidth(0, 4 * 256);
+            sheet.setColumnWidth(1, 40 * 256);
+            sheet.setColumnWidth(2, 14 * 256);
+            sheet.setColumnWidth(3, 40 * 256);
+            sheet.setColumnWidth(4, 12 * 256);
+            sheet.setColumnWidth(5, 40 * 256);
+            sheet.setColumnWidth(6, 20 * 256);
+            sheet.setColumnWidth(7, 12 * 256);
+            sheet.setColumnWidth(8, 20 * 256);
+            sheet.setColumnWidth(9, 14 * 256);
+            sheet.setColumnWidth(10, 14 * 256);
+            sheet.setColumnWidth(11, 14 * 256);
+            sheet.setColumnWidth(12, 14 * 256);
 
 
             //根据合并行进行合并
@@ -1257,8 +1591,19 @@ public class SubInfoExportController extends BaseController {
                 subInfoTotalExcel.get(i).setNumber(i);
             }
 
+            List<Map<String, Object>> list = subInfoTotalExcel.stream().map(item -> {
+                Map<String, Object> map = BeanUtil.beanToMap(item);
+                if (map.get("beginDate") != null) {
+                    map.put("beginDate", DateUtil.format(item.getBeginDate(), "yyyy-MM-dd"));
+                }
+                if (map.get("endDate") != null) {
+                    map.put("endDate", DateUtil.format(item.getBeginDate(), "yyyy-MM-dd"));
+                }
+                return map;
+            }).collect(Collectors.toList());
+
             //写入行业明细行
-            writer.write(subInfoTotalExcel, true);
+            writer.write(list, true);
             // 输出到客户端
             writer.flush(out, true);
 
@@ -1303,6 +1648,7 @@ public class SubInfoExportController extends BaseController {
             }
             // 添加前计算合并行
             allSize.add(exportList.size() + 2);
+            allSize.add(2);
             exportList.addAll(hyList);
             index++;
         }
@@ -1321,8 +1667,8 @@ public class SubInfoExportController extends BaseController {
         // 合并单元格
         CellStyle nonCenterCellStyle = createNonCenterBoldCellStyle(workbook);
         Sheet sheet = workbook.getSheetAt(0);
-        allSize.add(2);
-        for (Integer row : allSize) {
+        // allSize.add(2);
+        for (Integer row : new HashSet<>(allSize)) {
             sheet.addMergedRegion(new CellRangeAddress(row, row, 0, 3));
             // 获取合并区域的左上角单元格并设置样式
             Row mergedRow = sheet.getRow(row);
@@ -1380,13 +1726,10 @@ public class SubInfoExportController extends BaseController {
     }
 
     /**
-     * 4库导出总表
-     *
-     * @param response
-     * @param vo
+     * 四库、总库导出总表
      */
     @PostMapping("/exportTotalExcelByStatus")
-    @Log("4库导出总表")
+    @Log("导出总表")
     public void exportTotalExcelByStatus(@RequestBody SubInfoQueryTzVO vo) {
         WebLogAspect.content.set(String.format("页面:【项目四库管理-%s库】,执行操作:导出汇总",
                 StringUtils.isBlank(vo.getStatus()) ? "项目总" : SubInfoStatusEnum.getDesc(vo.getStatus())));
@@ -1397,193 +1740,258 @@ public class SubInfoExportController extends BaseController {
         Map<String, String> jsddMap = jsddDict.stream().collect(Collectors.toMap(TSystable::getCode, TSystable::getTitle));
         Map<String, String> jsddTitleMap = jsddDict.stream().collect(Collectors.toMap(TSystable::getTitle, TSystable::getCode));
         Map<String, String> hyflMap = subInduService.queryParentAll().stream().collect(Collectors.toMap(SubIndu::getCode, SubIndu::getTitle));
-        // 0.项目总库导出总表
-        if (StringUtils.isBlank(vo.getStatus())){
-            // 0.1 按区域构建表头
-            List<String> subjectIds = list.stream().map(SubInfoTotalExcel::getSubjectId).distinct().collect(Collectors.toList());
-            // 创建主表头
-            List<ExcelExportEntity> entityList = new ArrayList<>();
-            // 添加表头
-            ExcelExportEntity lbEntity = new ExcelExportEntity("项目类别", "subjectName");
-            entityList.add(lbEntity);
-
-            ExcelExportEntity hj = new ExcelExportEntity("合计", "hj");
-            List<ExcelExportEntity> subHeadEntities = new ArrayList<>();
-            subHeadEntities.add(getExcelExportEntity("项目个数", "count", 12));
-            subHeadEntities.add(getExcelExportEntity("计划总投资(亿元)", "amt", 20));
-            hj.setList(subHeadEntities);
-            entityList.add(hj);
-
-            // 创建for循环,循环5次
-            List<String> newSubjectIds = new ArrayList<>();
-            if (subjectIds.contains(jsddTitleMap.get("伊州区"))){
-                newSubjectIds.add(jsddTitleMap.get("伊州区"));
-            }
-            if (subjectIds.contains(jsddTitleMap.get("巴里坤县"))){
-                newSubjectIds.add(jsddTitleMap.get("巴里坤县"));
-            }
-            if (subjectIds.contains(jsddTitleMap.get("伊吾县"))){
-                newSubjectIds.add(jsddTitleMap.get("伊吾县"));
-            }
-            if (subjectIds.contains(jsddTitleMap.get("高新区"))){
-                newSubjectIds.add(jsddTitleMap.get("高新区"));
-            }
-            if (subjectIds.contains(jsddTitleMap.get("市本级"))){
-                newSubjectIds.add(jsddTitleMap.get("市本级"));
-            }
-
-
-            for (String subjectId : newSubjectIds) {
-                ExcelExportEntity jsdd = null;
-                if (jsddMap.get(subjectId).equals("市本级")) {
-                    jsdd = new ExcelExportEntity("其他", subjectId);
-                }else {
-                    jsdd = new ExcelExportEntity(jsddMap.get(subjectId), subjectId);
+        if (StringUtils.isBlank(vo.getStatus())) {
+            // 项目总库导出总表
+            exportZkTotal(list, jsddMap, jsddTitleMap);
+        } else {
+            // 四库导出总表
+            exportFourDbTotal(vo, list, jsddMap, hyflMap);
+        }
+    }
+
+    /**
+     * 项目总库导出总表
+     */
+    private void exportFourDbTotal(SubInfoQueryTzVO vo, List<SubInfoTotalExcel> list, Map<String, String> jsddMap, Map<String, String> hyflMap) {
+        // 处理数据
+        List<SubInfoTotalInfoVO> exportData = new ArrayList<>();
+        if (CollectionUtil.isNotEmpty(list)) {
+            // 1.按属地划分
+            List<SubInfoTotalInfoVO> ddList = new ArrayList<SubInfoTotalInfoVO>() {{
+                jsddMap.forEach((k, v) -> {
+                    add(new SubInfoTotalInfoVO("按属地划分", v, 0, BigDecimal.ZERO));
+                });
+            }};
+            Map<String, SubInfoTotalInfoVO> ddGroup = list.stream()
+                    .collect(Collectors.groupingBy(SubInfoTotalExcel::getSubjectId))
+                    .entrySet().stream()
+                    .map(entry -> new SubInfoTotalInfoVO(
+                            "按属地划分",
+                            jsddMap.getOrDefault(entry.getKey(), entry.getKey()),
+                            entry.getValue().size(),
+                            entry.getValue().stream()
+                                    .map(SubInfoTotalExcel::getAmtTotal)
+                                    .reduce(BigDecimal.ZERO, BigDecimal::add)
+                                    .divide(new BigDecimal("10000"), 2, RoundingMode.HALF_UP)
+                    ))
+                    .collect(Collectors.toMap(SubInfoTotalInfoVO::getTypeItem, Function.identity()));
+            ddList = ddList.stream().map(e -> {
+                if (ddGroup.get(e.getTypeItem()) != null) {
+                    return ddGroup.get(e.getTypeItem());
+                } else {
+                    return e;
                 }
-                List<ExcelExportEntity> ddHead = new ArrayList<>();
-                ddHead.add(getExcelExportEntity("项目个数", "count", 12));
-                ddHead.add(getExcelExportEntity("计划总投资(亿元)", "amt", 20));
-                jsdd.setList(ddHead);
-                entityList.add(jsdd);
-            }
-            // 0.2 构建数据
-            Map<String, List<SubInfoTotalExcel>> statusGroup = list.stream().collect(Collectors.groupingBy(SubInfoTotalExcel::getStatus));
-            List<Map<String,Object>> dataList = new ArrayList<>();
-            // 0.2.1 储备项目
-            List<SubInfoTotalExcel> cb = statusGroup.getOrDefault(SubInfoStatusEnum.CB.getCode(),new ArrayList<>());
-            List<SubInfoTotalExcel> xj = statusGroup.getOrDefault(SubInfoStatusEnum.XJ.getCode(),new ArrayList<>());
-            List<SubInfoTotalExcel> zj = statusGroup.getOrDefault(SubInfoStatusEnum.ZJ.getCode(),new ArrayList<>());
-            List<SubInfoTotalExcel> tc = statusGroup.getOrDefault(SubInfoStatusEnum.TC.getCode(),new ArrayList<>());
-
-            fillRowData(subjectIds, dataList, cb, SubInfoStatusEnum.CB.getDesc() + "项目");
-            fillRowData(subjectIds, dataList, xj, SubInfoStatusEnum.XJ.getDesc() + "项目");
-            fillRowData(subjectIds, dataList, zj, SubInfoStatusEnum.ZJ.getDesc() + "项目");
-            fillRowData(subjectIds, dataList, tc, SubInfoStatusEnum.TC.getDesc() + "项目");
-            fillRowData(subjectIds, dataList, list, "合计");
-
-
-            // 3.导出
-            ExportParams exportParams = new ExportParams("哈密市“四个一批”工业项目库总体情况", "项目库总体情况", ExcelType.XSSF);
+            }).collect(Collectors.toList());
+
+            // 2.按金额划分 定义分组边界
+            Map<String, BigDecimal> groupBoundaries = new LinkedHashMap<>();
+            groupBoundaries.put("10亿元以下", new BigDecimal("100000"));
+            groupBoundaries.put("10-50亿元", new BigDecimal("500000"));
+            groupBoundaries.put("50-100亿元", new BigDecimal("1000000"));
+            // 默认
+            List<SubInfoTotalInfoVO> amtList = new ArrayList<SubInfoTotalInfoVO>() {{
+                add(new SubInfoTotalInfoVO("按金额划分", "10亿元以下", 0, BigDecimal.ZERO));
+                add(new SubInfoTotalInfoVO("按金额划分", "10-50亿元", 0, BigDecimal.ZERO));
+                add(new SubInfoTotalInfoVO("按金额划分", "50-100亿元", 0, BigDecimal.ZERO));
+                add(new SubInfoTotalInfoVO("按金额划分", "100亿元以上", 0, BigDecimal.ZERO));
+            }};
+            Map<String, SubInfoTotalInfoVO> amtGroup = list.stream()
+                    .collect(Collectors.groupingBy(transaction -> {
+                        for (Map.Entry<String, BigDecimal> entry : groupBoundaries.entrySet()) {
+                            if (transaction.getAmtTotal().compareTo(entry.getValue()) < 0) {
+                                return entry.getKey();
+                            }
+                        }
+                        return "100亿元以上"; // 超过最高范围的默认分组
+                    }))
+                    .entrySet().stream()
+                    .map(entry -> new SubInfoTotalInfoVO(
+                            "按金额划分",
+                            entry.getKey(),
+                            entry.getValue().size(),
+                            entry.getValue().stream()
+                                    .map(SubInfoTotalExcel::getAmtTotal)
+                                    .reduce(BigDecimal.ZERO, BigDecimal::add)
+                                    .divide(new BigDecimal("10000"), 2, RoundingMode.HALF_UP)
+                    ))
+                    .collect(Collectors.toMap(SubInfoTotalInfoVO::getTypeItem, Function.identity()));
+            amtList = amtList.stream().map(e -> {
+                if (amtGroup.get(e.getTypeItem()) != null) {
+                    return amtGroup.get(e.getTypeItem());
+                } else {
+                    return e;
+                }
+            }).collect(Collectors.toList());
+
+            // 3.按行业划分
+            List<SubInfoTotalInfoVO> hyList = new ArrayList<SubInfoTotalInfoVO>() {{
+                hyflMap.forEach((k, v) -> {
+                    add(new SubInfoTotalInfoVO("按行业划分", v, 0, BigDecimal.ZERO));
+                });
+            }};
+            Map<String, SubInfoTotalInfoVO> hyGroup = list.stream()
+                    .collect(Collectors.groupingBy(transaction -> {
+                        String code = transaction.getInduskind();
+                        // 确保code不为空且长度至少为2
+                        if (code == null || code.length() < 2) {
+                            return "未知行业";  // 默认未知行业
+                        }
+                        return code.substring(0, 2);
+                    }))
+                    .entrySet().stream()
+                    .map(entry -> new SubInfoTotalInfoVO(
+                                    "按行业划分",
+                                    hyflMap.getOrDefault(entry.getKey(), entry.getKey()),
+                                    entry.getValue().size(),
+                                    entry.getValue().stream()
+                                            .map(SubInfoTotalExcel::getAmtTotal)
+                                            .reduce(BigDecimal.ZERO, BigDecimal::add)
+                                            .divide(new BigDecimal("10000"), 2, RoundingMode.HALF_UP)
+                            )
+                    )
+                    .collect(Collectors.toMap(SubInfoTotalInfoVO::getTypeItem, Function.identity()));
+            hyList = hyList.stream().map(e -> {
+                if (hyGroup.get(e.getTypeItem()) != null) {
+                    return hyGroup.get(e.getTypeItem());
+                } else {
+                    return e;
+                }
+            }).collect(Collectors.toList());
+            if (hyGroup.get("未知行业") != null) {
+                hyList.add(hyGroup.get("未知行业"));
+            }
+
+            exportData.addAll(ddList);
+            exportData.addAll(amtList);
+            exportData.addAll(hyList);
+            BigDecimal reduce = list.stream().map(SubInfoTotalExcel::getAmtTotal).reduce(BigDecimal.ZERO, BigDecimal::add);
+            exportData.add(new SubInfoTotalInfoVO("合计", "合计", list.size(), reduce.divide(new BigDecimal("10000"), 2, RoundingMode.HALF_UP)));
+            // 4.导出
+            ExportParams exportParams = null;
+            if (vo.getStatus().equals("1")){
+                exportParams = new ExportParams("“四个一批”储备项目库基本情况","“四个一批”储备项目库基本情况", ExcelType.XSSF);
+            }else if (vo.getStatus().equals("2")){
+                exportParams = new ExportParams("“四个一批”新建项目库基本情况","“四个一批”新建项目库基本情况", ExcelType.XSSF);
+            }else if (vo.getStatus().equals("3")){
+                exportParams = new ExportParams("“四个一批”在建项目库基本情况","“四个一批”在建项目库基本情况", ExcelType.XSSF);
+            }else if (vo.getStatus().equals("9")){
+                exportParams = new ExportParams("“四个一批”投产库基本情况","“四个一批”投产库基本情况", ExcelType.XSSF);
+            }else {
+                exportParams = new ExportParams("“四个一批”项目库基本情况","“四个一批”项目库基本情况", ExcelType.XSSF);
+            }
             exportParams.setStyle(ExcelStyleUtil.class);
-            Workbook workbook = ExcelExportUtil.exportExcel(exportParams, entityList, dataList);
+            int mergeTotalStartRow = exportData.size() + 1;
+            Workbook workbook = ExcelExportUtil.exportExcel(exportParams, SubInfoTotalInfoVO.class, exportData);
             response.setContentType("application/xlsx;charset=utf-8");
-            response.setHeader("Content-Disposition", "attachment; filename=" + URLEncodeUtil.encode("项目库总体情况") + System.currentTimeMillis() + ".xlsx");
+            response.setHeader("Content-Disposition", "attachment; filename=" + URLEncodeUtil.encode("项目明细表") + System.currentTimeMillis() + ".xlsx");
+            Sheet sheet = workbook.getSheetAt(0);
+            // 合并单元格
+            sheet.addMergedRegion(new CellRangeAddress(1, 1, 0, 1));
+
+            if (ddList.size() > 1){
+                sheet.addMergedRegion(new CellRangeAddress(2, ddList.size() + 1, 0, 0));
+            }
+            if (amtList.size() > 1){
+                sheet.addMergedRegion(new CellRangeAddress(ddList.size() + 2, ddList.size() + amtList.size() + 1, 0, 0));
+            }
+            if (hyList.size() > 1) {
+                sheet.addMergedRegion(new CellRangeAddress(ddList.size() + amtList.size() + 2, ddList.size() + amtList.size() + hyList.size() + 1, 0, 0));
+            }
+
+            sheet.addMergedRegion(new CellRangeAddress(mergeTotalStartRow, mergeTotalStartRow, 0, 1));
 
             try (OutputStream outputStream = response.getOutputStream()) {
                 workbook.write(outputStream);
+                workbook.close();
             } catch (IOException e) {
                 e.printStackTrace();
-            }finally {
-                try {
-                    workbook.close();
-                } catch (IOException e) {
-                    e.printStackTrace();
-                }
             }
-        }else {
-            // 处理数据
-            List<SubInfoTotalInfoVO> exportData = new ArrayList<>();
-            if (CollectionUtil.isNotEmpty(list)) {
-                // 1.按属地分
-                List<SubInfoTotalInfoVO> ddList = list.stream()
-                        .collect(Collectors.groupingBy(SubInfoTotalExcel::getSubjectId))
-                        .entrySet().stream()
-                        .map(entry -> new SubInfoTotalInfoVO(
-                                "按属地分",
-                                jsddMap.getOrDefault(entry.getKey(), entry.getKey()),
-                                entry.getValue().size(),
-                                entry.getValue().stream()
-                                        .map(SubInfoTotalExcel::getAmtTotal)
-                                        .reduce(BigDecimal.ZERO, BigDecimal::add)
-                                        .divide(new BigDecimal("10000"), 2, RoundingMode.HALF_UP)
-                        ))
-                        .collect(Collectors.toList());
-
-                // 2.按金额分 定义分组边界
-                Map<String, BigDecimal> groupBoundaries = new LinkedHashMap<>();
-                groupBoundaries.put("10亿元以下", new BigDecimal("100000"));
-                groupBoundaries.put("10-50亿元", new BigDecimal("500000"));
-                groupBoundaries.put("50-100亿元", new BigDecimal("1000000"));
-                List<SubInfoTotalInfoVO> amtList = list.stream()
-                        .collect(Collectors.groupingBy(transaction -> {
-                            for (Map.Entry<String, BigDecimal> entry : groupBoundaries.entrySet()) {
-                                if (transaction.getAmtTotal().compareTo(entry.getValue()) < 0) {
-                                    return entry.getKey();
-                                }
-                            }
-                            return "100亿元以上"; // 超过最高范围的默认分组
-                        }))
-                        .entrySet().stream()
-                        .map(entry -> new SubInfoTotalInfoVO(
-                                "按金额分",
-                                entry.getKey(),
-                                entry.getValue().size(),
-                                entry.getValue().stream()
-                                        .map(SubInfoTotalExcel::getAmtTotal)
-                                        .reduce(BigDecimal.ZERO, BigDecimal::add)
-                                        .divide(new BigDecimal("10000"), 2, RoundingMode.HALF_UP)
-                        ))
-                        .collect(Collectors.toList());
-
-                // 3.按行业分
-                List<SubInfoTotalInfoVO> hyList = list.stream()
-                        .collect(Collectors.groupingBy(transaction ->{
-                            String code = transaction.getInduskind();
-                            // 确保code不为空且长度至少为2
-                            if (code == null || code.length() < 2) {
-                                return "未知行业";  // 默认未知行业
-                            }
-                            return code.substring(0, 2);
-                        }))
-                        .entrySet().stream()
-                        .map(entry -> new SubInfoTotalInfoVO(
-                                        "按行业分",
-                                        hyflMap.getOrDefault(entry.getKey(),entry.getKey()),
-                                        entry.getValue().size(),
-                                        entry.getValue().stream()
-                                                .map(SubInfoTotalExcel::getAmtTotal)
-                                                .reduce(BigDecimal.ZERO, BigDecimal::add)
-                                                .divide(new BigDecimal("10000"), 2, RoundingMode.HALF_UP)
-                                )
-                        )
-                        .collect(Collectors.toList());
-                exportData.addAll(ddList);
-                exportData.addAll(amtList);
-                exportData.addAll(hyList);
-                BigDecimal reduce = list.stream().map(SubInfoTotalExcel::getAmtTotal).reduce(BigDecimal.ZERO, BigDecimal::add);
-                exportData.add(new SubInfoTotalInfoVO("合计", "合计", list.size(), reduce.divide(new BigDecimal("10000"), 2, RoundingMode.HALF_UP)));
-                // 4.导出
-                ExportParams exportParams = null;
-                if (vo.getStatus().equals("1")){
-                    exportParams = new ExportParams("“四个一批”储备项目库基本情况","“四个一批”储备项目库基本情况", ExcelType.XSSF);
-                }else if (vo.getStatus().equals("2")){
-                    exportParams = new ExportParams("“四个一批”新建项目库基本情况","“四个一批”新建项目库基本情况", ExcelType.XSSF);
-                }else if (vo.getStatus().equals("3")){
-                    exportParams = new ExportParams("“四个一批”在建项目库基本情况","“四个一批”在建项目库基本情况", ExcelType.XSSF);
-                }else if (vo.getStatus().equals("9")){
-                    exportParams = new ExportParams("“四个一批”投产库基本情况","“四个一批”投产库基本情况", ExcelType.XSSF);
-                }else {
-                    exportParams = new ExportParams("“四个一批”项目库基本情况","“四个一批”项目库基本情况", ExcelType.XSSF);
-                }
-                exportParams.setStyle(ExcelStyleUtil.class);
-                int mergeTotalStartRow = exportData.size() + 1;
-                Workbook workbook = ExcelExportUtil.exportExcel(exportParams, SubInfoTotalInfoVO.class, exportData);
-                response.setContentType("application/xlsx;charset=utf-8");
-                response.setHeader("Content-Disposition", "attachment; filename=" + URLEncodeUtil.encode("项目明细表") + System.currentTimeMillis() + ".xlsx");
-                Sheet sheet = workbook.getSheetAt(0);
-                // 合并单元格
-                sheet.addMergedRegion(new CellRangeAddress(1, 1, 0, 1));
-                sheet.addMergedRegion(new CellRangeAddress(2, ddList.size() + 1, 0, 0));
-                sheet.addMergedRegion(new CellRangeAddress(ddList.size() + 2, ddList.size() + amtList.size() + 1, 0, 0));
-                sheet.addMergedRegion(new CellRangeAddress(ddList.size() + amtList.size() + 2, ddList.size() + amtList.size() + hyList.size() + 1, 0, 0));
-                sheet.addMergedRegion(new CellRangeAddress(mergeTotalStartRow, mergeTotalStartRow, 0, 1));
+        }
+    }
 
-                try (OutputStream outputStream = response.getOutputStream()) {
-                    workbook.write(outputStream);
-                    workbook.close();
-                } catch (IOException e) {
-                    e.printStackTrace();
-                }
+    /**
+     * 四库导出总表
+     */
+    private void exportZkTotal(List<SubInfoTotalExcel> list, Map<String, String> jsddMap, Map<String, String> jsddTitleMap) {
+        // 0.1 按区域构建表头
+        List<String> subjectIds = list.stream().map(SubInfoTotalExcel::getSubjectId).distinct().collect(Collectors.toList());
+        // 创建主表头
+        List<ExcelExportEntity> entityList = new ArrayList<>();
+        // 添加表头
+        ExcelExportEntity lbEntity = new ExcelExportEntity("项目类别", "subjectName");
+        entityList.add(lbEntity);
+
+        ExcelExportEntity hj = new ExcelExportEntity("合计", "hj");
+        List<ExcelExportEntity> subHeadEntities = new ArrayList<>();
+        subHeadEntities.add(getExcelExportEntity("项目个数", "count", 12));
+        subHeadEntities.add(getExcelExportEntity("计划总投资(亿元)", "amt", 20));
+        hj.setList(subHeadEntities);
+        entityList.add(hj);
+
+        // 创建for循环,循环5次
+        List<String> newSubjectIds = new ArrayList<>();
+        if (subjectIds.contains(jsddTitleMap.get("伊州区"))){
+            newSubjectIds.add(jsddTitleMap.get("伊州区"));
+        }
+        if (subjectIds.contains(jsddTitleMap.get("巴里坤县"))){
+            newSubjectIds.add(jsddTitleMap.get("巴里坤县"));
+        }
+        if (subjectIds.contains(jsddTitleMap.get("伊吾县"))){
+            newSubjectIds.add(jsddTitleMap.get("伊吾县"));
+        }
+        if (subjectIds.contains(jsddTitleMap.get("高新区"))){
+            newSubjectIds.add(jsddTitleMap.get("高新区"));
+        }
+        if (subjectIds.contains(jsddTitleMap.get("市本级"))){
+            newSubjectIds.add(jsddTitleMap.get("市本级"));
+        }
+
+
+        for (String subjectId : newSubjectIds) {
+            ExcelExportEntity jsdd = null;
+            if (jsddMap.get(subjectId).equals("市本级")) {
+                jsdd = new ExcelExportEntity("其他", subjectId);
+            }else {
+                jsdd = new ExcelExportEntity(jsddMap.get(subjectId), subjectId);
+            }
+            List<ExcelExportEntity> ddHead = new ArrayList<>();
+            ddHead.add(getExcelExportEntity("项目个数", "count", 12));
+            ddHead.add(getExcelExportEntity("计划总投资(亿元)", "amt", 20));
+            jsdd.setList(ddHead);
+            entityList.add(jsdd);
+        }
+        // 0.2 构建数据
+        Map<String, List<SubInfoTotalExcel>> statusGroup = list.stream().collect(Collectors.groupingBy(SubInfoTotalExcel::getStatus));
+        List<Map<String,Object>> dataList = new ArrayList<>();
+        // 0.2.1 储备项目
+        List<SubInfoTotalExcel> cb = statusGroup.getOrDefault(SubInfoStatusEnum.CB.getCode(),new ArrayList<>());
+        List<SubInfoTotalExcel> xj = statusGroup.getOrDefault(SubInfoStatusEnum.XJ.getCode(),new ArrayList<>());
+        List<SubInfoTotalExcel> zj = statusGroup.getOrDefault(SubInfoStatusEnum.ZJ.getCode(),new ArrayList<>());
+        List<SubInfoTotalExcel> tc = statusGroup.getOrDefault(SubInfoStatusEnum.TC.getCode(),new ArrayList<>());
+
+        fillRowData(subjectIds, dataList, cb, SubInfoStatusEnum.CB.getDesc() + "项目");
+        fillRowData(subjectIds, dataList, xj, SubInfoStatusEnum.XJ.getDesc() + "项目");
+        fillRowData(subjectIds, dataList, zj, SubInfoStatusEnum.ZJ.getDesc() + "项目");
+        fillRowData(subjectIds, dataList, tc, SubInfoStatusEnum.TC.getDesc() + "项目");
+        fillRowData(subjectIds, dataList, list, "合计");
+
+
+        // 3.导出
+        ExportParams exportParams = new ExportParams("哈密市“四个一批”工业项目库总体情况", "项目库总体情况", ExcelType.XSSF);
+        exportParams.setStyle(ExcelStyleUtil.class);
+        Workbook workbook = ExcelExportUtil.exportExcel(exportParams, entityList, dataList);
+        response.setContentType("application/xlsx;charset=utf-8");
+        response.setHeader("Content-Disposition", "attachment; filename=" + URLEncodeUtil.encode("项目库总体情况") + System.currentTimeMillis() + ".xlsx");
+
+        try (OutputStream outputStream = response.getOutputStream()) {
+            workbook.write(outputStream);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }finally {
+            try {
+                workbook.close();
+            } catch (IOException e) {
+                e.printStackTrace();
             }
         }
     }

BIN
projects/src/main/resources/template/analysis.docx


+ 69 - 67
projects/src/main/webapp/vmodules/leftMenu.jsp

@@ -12,42 +12,6 @@
     </div>
     <div class="expand_collapse_btn" @click="changeSide"></div>
     <div class="layui-side-scroll">
-<%--        <ul class="layui-nav layui-nav-tree" lay-filter="test">--%>
-<%--            <li :class="['layui-nav-item', {'layui-nav-itemed layui-nav-itemed-hand': Number(active) === index}]"--%>
-<%--                v-for="(item, index) in navLs" :key="index" v-if="menuCode.indexOf(item.code) >= 0"--%>
-<%--            >--%>
-<%--                <a :title="item.txt" @click="onSelectItem(index)" href="javascript:;">--%>
-<%--                    <div class="left">--%>
-<%--                        <i class='icon'--%>
-<%--                           :class="Number(active) === index ? item.activeIcon : item.icon"--%>
-<%--                        ></i>{{item.txt}}--%>
-<%--                    </div>--%>
-<%--                    <i class="layui-icon layui-icon-down"></i>--%>
-<%--                </a>--%>
-
-<%--                <!-- 二级菜单 -->--%>
-<%--                <dl class="layui-nav-child" v-if="item.child != null">--%>
-<%--                    <dd v-if="menuCode.indexOf(it.code) >= 0"--%>
-<%--                        v-for="(it, ind) in item.child" :key="'inner_' + ind"--%>
-<%--                        :class="{'layui-this': it.code === curSelectedMenu}"--%>
-<%--                    >--%>
-<%--                        <a :title="it.txt" href="javascript:;"--%>
-<%--                           @click="onSelectItem(index, ind)"--%>
-<%--                        >{{it.txt}}</a>--%>
-
-<%--                        <!-- 三级菜单 -->--%>
-<%--                        <dl class="layui-nav-child" v-if="it.child != null">--%>
-<%--                            <dd v-for="(third, thirdInd) in it.child" :key="'third_' + thirdInd"--%>
-<%--                            >--%>
-<%--                                <a :title="third.txt" href="javascript:;"--%>
-<%--                                   @click="onSelectItem(ind, thirdInd)"--%>
-<%--                                >{{third.txt}}</a>--%>
-<%--                            </dd>--%>
-<%--                        </dl>--%>
-<%--                    </dd>--%>
-<%--                </dl>--%>
-<%--            </li>--%>
-<%--        </ul>--%>
         <ul class="layui-nav layui-nav-tree" lay-filter="test">
             <li :class="['layui-nav-item', {'layui-nav-itemed layui-nav-itemed-hand': Number(active) === index}]"
                 v-for="(item, index) in navLs" :key="index" v-if="menuCode.indexOf(item.code) >= 0"
@@ -70,6 +34,16 @@
                         <a :title="it.txt" href="javascript:;"
                            @click="onSelectItem(index,ind)"
                         >{{it.txt}}</a>
+
+                        <!-- 三级菜单 -->
+                        <dl class="layui-nav-child" v-if="it.child != null">
+                            <dd v-for="(third, thirdInd) in it.child" :key="'third_' + thirdInd"
+                            >
+                                <a :title="third.txt" href="javascript:;"
+                                   @click="onSelectItem2(index, ind, thirdInd)"
+                                >{{third.txt}}</a>
+                            </dd>
+                        </dl>
                     </dd>
                 </dl>
             </li>
@@ -212,39 +186,40 @@
                             code: '303',
                             url: 'subject/subInfo/pre'/* ?type=qx */
                         },
-                        {
-                            icon: 'icon_zjfwk_active',
-                            activeIcon: 'icon_zjfwk_active',
-                            txt: '智联工地',
-                            code: '7',
-                            child: [
-                                {
-                                    code: '702',
-                                    txt: '项目地图',
-                                    url: 'smart/query'
-                                    //url: 'register/underConstruction'
-                                },
-                                {
-                                    code: '703',
-                                    txt: '实时视频',
-                                    url: 'smart/vedio'
-                                    //url: 'register/underConstruction'
-                                },
-                                {
-                                    txt: '周调度图片',
-                                    code: '706',
-                                    url: 'graphicProgress/list'
-                                    // url: 'register/underConstruction'
-                                },
-                                {
-                                    txt: '月航拍全景',
-                                    code: '707',
-                                    url: 'aerial/list'
-                                    // url: 'register/underConstruction'
-                                }
 
-                            ]
+                    ]
+                },
+                {
+                    icon: 'icon_zjfwk_active',
+                    activeIcon: 'icon_zjfwk_active',
+                    txt: '智联工地',
+                    code: '7',
+                    child: [
+                        {
+                            code: '702',
+                            txt: '项目地图',
+                            url: 'smart/query'
+                            //url: 'register/underConstruction'
+                        },
+                        {
+                            code: '703',
+                            txt: '实时视频',
+                            url: 'smart/vedio'
+                            //url: 'register/underConstruction'
                         },
+                        {
+                            txt: '周调度图片',
+                            code: '706',
+                            url: 'graphicProgress/list'
+                            // url: 'register/underConstruction'
+                        },
+                        {
+                            txt: '月航拍全景',
+                            code: '707',
+                            url: 'aerial/list'
+                            // url: 'register/underConstruction'
+                        }
+
                     ]
                 },
                 {
@@ -532,6 +507,33 @@
                     this.topBreadcrumb = this.navLs[index].txt
                 }
             },
+            onSelectItem2: function (index, ind,thirdInd) {
+                this.active = index;
+                if (thirdInd != undefined) {
+                    var chooseNode = this.navLs[index]["child"][ind]["child"][thirdInd];
+                    if (chooseNode.url) {
+                        if (chooseNode.before && typeof (chooseNode.before) == 'function') {
+                            chooseNode.before();
+                        }
+                        window.location.hash = index + "_" + ind;
+                        var parentNodeText = this.navLs[index]["child"][ind].txt;
+                        this.curSelectedMenu = this.navLs[index]["child"][ind].child?.[thirdInd].code ?? ''
+                        $("#rightContent").attr("src", App.getUrl(chooseNode.url));
+                        const htmlStr = '<span style="margin-right: 5px; color: #dde1e6;">' + parentNodeText + ' /</span>' + chooseNode.txt
+                        this.topBreadcrumb = htmlStr
+                    } else {
+                        App.msg.warn("正在建设中");
+                    }
+                } else if (this.navLs[index]["child"][ind].url) {
+                    var chooseNode = this.navLs[index]["child"][ind];
+                    if (chooseNode.before && typeof (chooseNode.before) == 'function') {
+                        chooseNode.before();
+                    }
+                    window.location.hash = ind;
+                    $("#rightContent").attr("src", App.getUrl(this.navLs[index]["child"][ind].url));
+                    this.topBreadcrumb = this.navLs[index]["child"][ind].txt
+                }
+            },
             onChangeActive: function (index) {
                 this.tabActive = index
             },

+ 1 - 1
projects/src/main/webapp/vmodules/project/projectInfo.jsp

@@ -133,7 +133,7 @@
                     <td style="width: 40%">${sunInfo.subName }</td>
                 </tr>
                 <tr>
-                    <td class="label" style="width: 10%">建设性质</td>
+                    <td class="label" style="width: 10%">4库状态</td>
                     <td style="width: 40%">${sunInfo.statusName }</td>
                     <td class="label" style="width: 10%">所属行业</td>
                     <td style="width: 40%">${sunInfo.indusName }</td>

+ 1 - 1
projects/src/main/webapp/vmodules/subject/subInfo/editSubInfo.jsp

@@ -109,7 +109,7 @@
                     <div class="layui-row">
                         <div class="layui-col-xs6 layui-col-sm6">
                             <div class="layui-form-item">
-                                <label class="layui-form-label required"
+                                <label class="layui-form-label"
                                 >项目代码</label>
                                 <div class="layui-input-block">
                                     <input type="text" placeholder="请输入"

+ 2 - 2
projects/src/main/webapp/vmodules/subject/subInfo/tz/cb.jsp

@@ -284,10 +284,10 @@
                         <img src="${WebSite.asset}/css/images/left/export.svg"/>
                         <span>导出</span>
                     </div>
-                    <div class="export-item" v-if="showExport" :style="{ top: '-93px' }">
+                    <div class="export-item" v-if="showExport" :style="{ top: '-62px' }">
                         <button type="button" class="" @click="exportDetailExcel">导出明细</button>
                         <button type="button" class="" @click="exportTotalExcel">导出总表</button>
-                        <button type="button" class="" @click="exportMoreExcel">自定义导出</button>
+<%--                        <button type="button" class="" @click="exportMoreExcel">自定义导出</button>--%>
                     </div>
                 </div>
                 <table id="table1" lay-filter="test"></table>

+ 2 - 2
projects/src/main/webapp/vmodules/subject/subInfo/tz/end.jsp

@@ -313,10 +313,10 @@
                         <img src="${WebSite.asset}/css/images/left/export.svg"/>
                         <span>导出</span>
                     </div>
-                    <div class="export-item" v-if="showExport" :style="{ top: '-93px' }">
+                    <div class="export-item" v-if="showExport" :style="{ top: '-62px' }">
                         <button type="button" class="" @click="exportDetailExcel">导出明细</button>
                         <button type="button" class="" @click="exportTotalExcel">导出总表</button>
-                        <button type="button" class="" @click="exportMoreExcel">自定义导出</button>
+<%--                        <button type="button" class="" @click="exportMoreExcel">自定义导出</button>--%>
                     </div>
                 </div>
 

+ 2 - 2
projects/src/main/webapp/vmodules/subject/subInfo/tz/main.jsp

@@ -374,10 +374,10 @@
                         <img src="${WebSite.asset}/css/images/left/export.svg"/>
                         <span>导出</span>
                     </div>
-                    <div class="export-item" v-if="showExport" :style="{ top: '-93px' }">
+                    <div class="export-item" v-if="showExport" :style="{ top: '-62px' }">
                         <button type="button" class="" @click="exportDetailExcel">导出明细</button>
                         <button type="button" class="" @click="exportTotalExcel">导出总表</button>
-                        <button type="button" class="" @click="exportMoreExcel">自定义导出</button>
+<%--                        <button type="button" class="" @click="exportMoreExcel">自定义导出</button>--%>
                     </div>
                 </div>
                 <table id="table1" lay-filter="test" style="position: relative;"></table>

+ 2 - 2
projects/src/main/webapp/vmodules/subject/subInfo/tz/new.jsp

@@ -276,10 +276,10 @@
                         <img src="${WebSite.asset}/css/images/left/export.svg"/>
                         <span>导出</span>
                     </div>
-                    <div class="export-item" v-if="showExport" :style="{ top: '-93px' }">
+                    <div class="export-item" v-if="showExport" :style="{ top: '-62px' }">
                         <button type="button" class="" @click="exportDetailExcel">导出明细</button>
                         <button type="button" class="" @click="exportTotalExcel">导出总表</button>
-                        <button type="button" class="" @click="exportMoreExcel">自定义导出</button>
+<%--                        <button type="button" class="" @click="exportMoreExcel">自定义导出</button>--%>
                     </div>
                 </div>
                 <table id="table1" lay-filter="test"></table>

+ 1 - 1
projects/src/main/webapp/vmodules/subject/subInfo/tz/year_extend.jsp

@@ -284,7 +284,7 @@
                         <img src="${WebSite.asset}/css/images/left/export.svg"/>
                         <span>导出</span>
                     </div>
-                    <div class="export-item" v-if="showExport" :style="{ top: '-93px' }">
+                    <div class="export-item" v-if="showExport" :style="{ top: '-62px' }">
                         <button type="button" class="" @click="exportFixDetailExcel">项目明细导出</button>
                         <button type="button" class="" @click="exportFixTotalExcel">项目汇总导出</button>
                     </div>

+ 1 - 1
projects/src/main/webapp/vmodules/subject/subInfo/tz/year_new.jsp

@@ -281,7 +281,7 @@
                         <img src="${WebSite.asset}/css/images/left/export.svg"/>
                         <span>导出</span>
                     </div>
-                    <div class="export-item" v-if="showExport" :style="{ top: '-93px' }">
+                    <div class="export-item" v-if="showExport" :style="{ top: '-62px' }">
                         <button type="button" class="" @click="exportFixDetailExcel">项目明细导出</button>
                         <button type="button" class="" @click="exportFixTotalExcel">项目汇总导出</button>
                     </div>

+ 1 - 1
projects/src/main/webapp/vmodules/subject/subInfo/tz/year_reserve.jsp

@@ -345,7 +345,7 @@
                         <img src="${WebSite.asset}/css/images/left/export.svg"/>
                         <span>导出</span>
                     </div>
-                    <div class="export-item" v-if="showExport" :style="{ top: '-93px' }">
+                    <div class="export-item" v-if="showExport" :style="{ top: '-62px' }">
                         <button type="button" class="" @click="exportFixDetailExcel">项目明细导出</button>
                         <button type="button" class="" @click="exportFixTotalExcel">项目汇总导出</button>
                     </div>

+ 1 - 1
projects/src/main/webapp/vmodules/subject/subInfo/tz/year_sum.jsp

@@ -298,7 +298,7 @@
                         <img src="${WebSite.asset}/css/images/left/export.svg"/>
                         <span>导出</span>
                     </div>
-                    <div class="export-item" v-if="showExport" :style="{ top: '-93px' }">
+                    <div class="export-item" v-if="showExport" :style="{ top: '-62px' }">
                         <button type="button" class="" @click="exportFixDetailExcel">项目明细导出</button>
                         <button type="button" class="" @click="exportFixTotalExcel">项目汇总导出</button>
                     </div>