Преглед изворни кода

项目总库分析报告word导出、4库明细导出

JiangPengLi пре 2 месеци
родитељ
комит
f33e476c2e
18 измењених фајлова са 766 додато и 224 уклоњено
  1. 8 3
      projects-service/src/main/java/com/rtrh/projects/modules/projects/mapper/JUnitMapper.xml
  2. 4 3
      projects-service/src/main/java/com/rtrh/projects/modules/projects/mapper/LogOperateMapper.xml
  3. 2 0
      projects-service/src/main/java/com/rtrh/projects/modules/projects/mapper/RptContMapper.java
  4. 16 0
      projects-service/src/main/java/com/rtrh/projects/modules/projects/mapper/RptContMapper.xml
  5. 2 0
      projects-service/src/main/java/com/rtrh/projects/modules/projects/mapper/SubPreNewMapper.java
  6. 11 0
      projects-service/src/main/java/com/rtrh/projects/modules/projects/mapper/SubPreNewMapper.xml
  7. 71 63
      projects-service/src/main/java/com/rtrh/projects/modules/projects/po/SubInfo.hbm.xml
  8. 2 0
      projects-service/src/main/java/com/rtrh/projects/modules/projects/service/SubPreNewService.java
  9. 2 0
      projects-service/src/main/java/com/rtrh/projects/modules/projects/service/SubRptContService.java
  10. 6 0
      projects-service/src/main/java/com/rtrh/projects/modules/projects/service/impl/SubPreNewServiceImpl.java
  11. 6 0
      projects-service/src/main/java/com/rtrh/projects/modules/projects/service/impl/SubRptContServiceImpl.java
  12. 46 0
      projects-service/src/main/java/com/rtrh/projects/modules/projects/utils/ExcelEntityConverter.java
  13. 5 1
      projects-service/src/main/java/com/rtrh/projects/modules/projects/vo/LogOperateVO.java
  14. 81 7
      projects-service/src/main/java/com/rtrh/projects/modules/projects/vo/export/SubInfoXjVO.java
  15. 63 6
      projects-service/src/main/java/com/rtrh/projects/modules/projects/vo/export/SubInfoZjVO.java
  16. 408 109
      projects/src/main/java/com/rtrh/projects/web/controller/subject/SubInfoExportController.java
  17. 32 31
      projects/src/main/webapp/vmodules/leftMenu.jsp
  18. 1 1
      projects/src/main/webapp/vmodules/subject/subInfo/editSubInfo.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

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

@@ -37,11 +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.subject_id AS subjectId,
+            s.amt_total AS amtTotal
         FROM
-            t_log_operate log left join sub_info s on log.sub_id=s.id
+            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 - 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);
 }

+ 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(...); // 设置自定义样式处理器
+    }
+}

+ 5 - 1
projects-service/src/main/java/com/rtrh/projects/modules/projects/vo/LogOperateVO.java

@@ -3,8 +3,10 @@ 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;
 
 /**
@@ -15,9 +17,11 @@ import java.util.Date;
  * @author jiangpengli
  * @since 2025-01-06
  */
-@EqualsAndHashCode(callSuper = true)
 @Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
 public class LogOperateVO extends LogOperate {
     private String subjectId;
     private String indusKind;
+    private BigDecimal amtTotal;
 }

+ 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;
+    }
 }

+ 408 - 109
projects/src/main/java/com/rtrh/projects/web/controller/subject/SubInfoExportController.java

@@ -16,6 +16,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 +31,8 @@ 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;
@@ -67,9 +66,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;
@@ -108,6 +104,11 @@ public class SubInfoExportController extends BaseController {
     private HttpServletResponse response;
     @Autowired
     private ILogOperateService logOperateService;
+    @Autowired
+    private SubPreNewService subPreNewService;
+    @Autowired
+    private SubRptContService subRptContService;
+
     /**
      * 导出汇总表
      *
@@ -872,12 +873,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);
@@ -892,93 +1134,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);
     }
 
     /**
@@ -1093,36 +1363,64 @@ public class SubInfoExportController extends BaseController {
             data.put("lastXjToCbNum", lastCounterVo.xjToCbNum);
             data.put("lastRgToZjNum", lastCounterVo.rgToZjNum);
 
-            // 分属地看
-            Map<String, List<LogOperateVO>> subjectZhGroups = logList.stream().collect(Collectors.groupingBy(LogOperateVO::getSubjectId));
+
             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个百分点。";
+            // 分属地看
+            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, totalCounterVo.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"));
             });
-
             data.put("subjectZhStr", subjectZhStr);
+
             // 分规模看
-            Map<String, List<LogOperateVO>> scaleZhGroups = logList.stream().collect(Collectors.groupingBy(LogOperateVO::getSubjectId));
-            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, "0%", "0%", "0%", lastMonth, "0", "0", "0"
-            );
+            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"
+                ));
+            });
             data.put("scaleZhStr", scaleZhStr);
+
             // 分行业看
-            Map<String, List<LogOperateVO>> hyZhGroups = logList.stream().collect(Collectors.groupingBy(LogOperateVO::getSubjectId));
-            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, "0%", "0%", "0%", lastMonth, "0", "0", "0"
-            );
+            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"
+                ));
+            });
             data.put("hyZhStr", hyZhStr);
             // 二、存在问题
             // (一)项目落地方面
@@ -1311,6 +1609,7 @@ public class SubInfoExportController extends BaseController {
             }
             // 添加前计算合并行
             allSize.add(exportList.size() + 2);
+            allSize.add(2);
             exportList.addAll(hyList);
             index++;
         }
@@ -1329,8 +1628,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);

+ 32 - 31
projects/src/main/webapp/vmodules/leftMenu.jsp

@@ -212,39 +212,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'
+                        }
+
                     ]
                 },
                 {

+ 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="请输入"