Parcourir la source

总库word分析报告导出

JiangPengLi il y a 2 mois
Parent
commit
3dcff34e54
18 fichiers modifiés avec 393 ajouts et 112 suppressions
  1. 5 0
      projects-service/src/main/java/com/rtrh/projects/modules/projects/enums/SubInfoStatusEnum.java
  2. 21 0
      projects-service/src/main/java/com/rtrh/projects/modules/projects/mapper/SubHisMapper.java
  3. 19 0
      projects-service/src/main/java/com/rtrh/projects/modules/projects/mapper/SubHisMapper.xml
  4. 2 2
      projects-service/src/main/java/com/rtrh/projects/modules/projects/mapper/SubInfoMapper.java
  5. 1 0
      projects-service/src/main/java/com/rtrh/projects/modules/projects/mapper/SubInfoMapper.xml
  6. 7 4
      projects-service/src/main/java/com/rtrh/projects/modules/projects/mapper/WorkbenchMapper.java
  7. 6 3
      projects-service/src/main/java/com/rtrh/projects/modules/projects/mapper/WorkbenchMapper.xml
  8. 54 0
      projects-service/src/main/java/com/rtrh/projects/modules/projects/po/SubHis.java
  9. 19 0
      projects-service/src/main/java/com/rtrh/projects/modules/projects/service/ISubHisService.java
  10. 4 1
      projects-service/src/main/java/com/rtrh/projects/modules/projects/service/SubInfoService.java
  11. 28 0
      projects-service/src/main/java/com/rtrh/projects/modules/projects/service/impl/SubHisServiceImpl.java
  12. 27 7
      projects-service/src/main/java/com/rtrh/projects/modules/projects/service/impl/SubInfoServiceImpl.java
  13. 0 1
      projects-service/src/main/java/com/rtrh/projects/modules/projects/service/impl/SubRptContServiceImpl.java
  14. 15 0
      projects-service/src/main/java/com/rtrh/projects/modules/projects/vo/SubHisVO.java
  15. 12 4
      projects/src/main/java/com/rtrh/projects/web/controller/reportforms/api/AnnualPlansApiController.java
  16. 171 89
      projects/src/main/java/com/rtrh/projects/web/controller/subject/SubInfoExportController.java
  17. 2 1
      projects/src/main/java/com/rtrh/projects/web/controller/subject/api/SubInfoApiController.java
  18. BIN
      projects/src/main/resources/template/analysis.docx

+ 5 - 0
projects-service/src/main/java/com/rtrh/projects/modules/projects/enums/SubInfoStatusEnum.java

@@ -26,6 +26,11 @@ public enum SubInfoStatusEnum {
     public static SubInfoStatusEnum getEnum(String code) {
         return Arrays.stream(values()).filter(x -> x.code.equals(code)).findFirst().orElse(null);
     }
+
+    public static String getCodeByDesc(String desc) {
+        return Arrays.stream(values()).filter(x -> x.desc.equals(desc)).findFirst().map(x -> x.code).orElse(null);
+    }
+
     public static String getDesc(String code) {
         SubInfoStatusEnum anEnum = getEnum(code);
         return anEnum != null ? getEnum(code).desc : null;

+ 21 - 0
projects-service/src/main/java/com/rtrh/projects/modules/projects/mapper/SubHisMapper.java

@@ -0,0 +1,21 @@
+package com.rtrh.projects.modules.projects.mapper;
+
+import com.rtrh.core.repository.mybatis.MyBatisRepository;
+import com.rtrh.projects.modules.projects.vo.SubHisVO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 项目历史表 Mapper 接口
+ * </p>
+ *
+ * @author jiangpengli
+ * @since 2025-02-08
+ */
+@MyBatisRepository
+public interface SubHisMapper {
+
+    List<SubHisVO> queryByMonth(@Param("month") String month);
+}

+ 19 - 0
projects-service/src/main/java/com/rtrh/projects/modules/projects/mapper/SubHisMapper.xml

@@ -0,0 +1,19 @@
+<?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.SubHisMapper" >
+
+    <select id="queryByMonth" resultType="com.rtrh.projects.modules.projects.vo.SubHisVO">
+        select
+            l.id as id,
+            l.sub_id as subId,
+            l.kj_month as kjMonth,
+            l.status as status,
+            l.create_user_id as createUserId,
+            l.create_time as createTime,
+            s.subject_id as subjectId,
+            s.amt_total as amtTotal,
+            s.indus_kind as indusKind
+        from
+            sub_his l join sub_info s on s.sub_id=l.sub_id
+    </select>
+</mapper>

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

@@ -111,8 +111,8 @@ public interface SubInfoMapper {
     
     void batchUpdate(@Param("list") List<SmzkDetailVo> list);
 
-    @Select("SELECT count(1) FROM sub_info where id=#{id} and logic_delete_flag = 0")
-    Integer selectById(@Param("id") String id);
+    @Select("SELECT sub_id subId,status FROM sub_info where id=#{id} and logic_delete_flag = 0")
+    SubInfoGxj selectById(@Param("id") String id);
 
     void removeFour(@Param("id") String id);
 

+ 1 - 0
projects-service/src/main/java/com/rtrh/projects/modules/projects/mapper/SubInfoMapper.xml

@@ -12,6 +12,7 @@
         <foreach collection="list" item="item" separator=";">
             UPDATE sub_info
             SET
+            status = #{item.status},
             sub_name = #{item.subName},
             subject_id = #{item.subjectId},
             content = #{item.content},

+ 7 - 4
projects-service/src/main/java/com/rtrh/projects/modules/projects/mapper/WorkbenchMapper.java

@@ -79,10 +79,13 @@ public interface WorkbenchMapper {
 			@Param("subName")String subName, @Param("loginName")String loginName,@Param("jsdd")String jsdd,
 			@Param("minMoney")BigDecimal minMoney, @Param("maxMoney")BigDecimal maxMoney,@Param("isLock")String isLock, @Param("orderType")String orderType,@Param("subid") String subid);
 	
-	List<Map<String, Object>> pageProjectYearPlan(@Param("year")String year, @Param("status")String status, @Param("xmlx")String xmlx,
-			@Param("xmxz")String xmxz, @Param("hyfl")String hyfl, @Param("unitName")String unitName,
-			@Param("subName")String subName, @Param("loginName")String loginName,@Param("jsdd")String jsdd,
-			@Param("minMoney")BigDecimal minMoney, @Param("maxMoney")BigDecimal maxMoney,@Param("isLock")String isLock, @Param("orderType")String orderType,@Param("subid") String subid, @Param("pageInfo") Page page);
+	// List<Map<String, Object>> pageProjectYearPlan(@Param("year")String year, @Param("status")String status, @Param("xmlx")String xmlx,
+	// 		@Param("xmxz")String xmxz, @Param("hyfl")String hyfl, @Param("unitName")String unitName,
+	// 		@Param("subName")String subName, @Param("loginName")String loginName,@Param("jsdd")String jsdd,
+	// 		@Param("minMoney")BigDecimal minMoney, @Param("maxMoney")BigDecimal maxMoney,@Param("isLock")String isLock, @Param("orderType")String orderType,@Param("subid") String subid, @Param("pageInfo") Page page);
+
+	List<Map<String, Object>> pageProjectYearPlan(@Param("year")String year,@Param("status") String status,
+												  @Param("jsdd") String jsdd,@Param("hyfl") String hyfl,@Param("subName") String subName,@Param("qx") String qx, @Param("orderType") String orderType, @Param("pageInfo") Page page);
 
 	List<Map<String, Object>> getMonthToPlanAmt(@Param("year")String year, @Param("xmlx")String xmlx, @Param("kind")String kind, @Param("loginName")String loginName,
 												 @Param("isZj")String isZj, @Param("jsdd")String jsdd, @Param("minAmt")BigDecimal minAmt,@Param("maxAmt")BigDecimal maxAmt, @Param("kjMonth")String kjMonth,@Param("sortJh")String sortJh,

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

@@ -60,15 +60,18 @@
 	
 	
 	
+	<!--<select id="pageProjectYearPlan" resultType="java.util.Map" statementType="CALLABLE" useCache="false">-->
+	<!--	call total_get_jh_list_pc(#{year}, #{status}, #{xmlx}, #{xmxz}, #{hyfl}, #{unitName}, #{subName}, #{loginName}, #{jsdd},#{minMoney},#{maxMoney},#{isLock}, #{orderType},#{subid}, #{pageInfo.pageNo}, #{pageInfo.pageSize}, #{pageInfo.totalCount,mode=OUT,jdbcType=INTEGER})-->
+	<!--</select>-->
+
 	<select id="pageProjectYearPlan" resultType="java.util.Map" statementType="CALLABLE" useCache="false">
-		call total_get_jh_list_pc(#{year}, #{status}, #{xmlx}, #{xmxz}, #{hyfl}, #{unitName}, #{subName}, #{loginName}, #{jsdd},#{minMoney},#{maxMoney},#{isLock}, #{orderType},#{subid}, #{pageInfo.pageNo}, #{pageInfo.pageSize}, #{pageInfo.totalCount,mode=OUT,jdbcType=INTEGER})
+		call total_get_jh_list_gxj(#{year}, #{status}, #{jsdd}, #{hyfl}, #{subName}, #{qx},
+		    #{orderType},#{pageInfo.pageNo}, #{pageInfo.pageSize},#{pageInfo.totalCount,mode=OUT,jdbcType=INTEGER})
 	</select>
 
 
 
 
-
-
 	<select id="getMonthToPlanAmt" resultType="java.util.Map" statementType="CALLABLE" useCache="false">
 		call total_dp_tzydfx_data2(#{year}, #{xmlx}, #{kind}, #{loginName}, #{isZj}, #{jsdd}, #{minAmt}, #{maxAmt},#{kjMonth}, #{sortJh}, #{sortSj}, #{sortYc}, #{beginMonth}, #{endMonth}, #{hyfl}, #{zjly})
 	</select>

+ 54 - 0
projects-service/src/main/java/com/rtrh/projects/modules/projects/po/SubHis.java

@@ -0,0 +1,54 @@
+package com.rtrh.projects.modules.projects.po;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 项目历史表
+ * </p>
+ *
+ * @author jiangpengli
+ * @since 2025-02-08
+ */
+@Getter
+@Setter
+public class SubHis implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private String id;
+
+    private String subId;
+
+    /**
+     * 年月
+     */
+    private String kjMonth;
+
+
+    /**
+     * 状态 1储备2新建3在建9投产5移除
+     */
+    private String status;
+
+    /**
+     * 创建人登陆名
+     */
+    private String createUserId;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    /**
+     * 删除标记 0 正常 1 删除
+     */
+    private Integer logicDeleteFlag;
+
+
+}

+ 19 - 0
projects-service/src/main/java/com/rtrh/projects/modules/projects/service/ISubHisService.java

@@ -0,0 +1,19 @@
+package com.rtrh.projects.modules.projects.service;
+
+import com.rtrh.projects.modules.projects.po.SubHis;
+import com.rtrh.projects.modules.projects.vo.SubHisVO;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 项目历史表 服务类
+ * </p>
+ *
+ * @author jiangpengli
+ * @since 2025-02-08
+ */
+public interface ISubHisService{
+
+    List<SubHisVO> queryByMonth(String month);
+}

+ 4 - 1
projects-service/src/main/java/com/rtrh/projects/modules/projects/service/SubInfoService.java

@@ -15,6 +15,7 @@ import com.rtrh.projects.modules.projects.vo.export.*;
 import com.rtrh.projects.modules.system.vo.LoginUserVO;
 import com.rtrh.projects.vo.subject.MoveDbParamVo;
 import com.rtrh.projects.vo.subject.SubinfoPreQueryVo;
+import org.apache.ibatis.annotations.Param;
 
 public interface SubInfoService {
 
@@ -416,6 +417,8 @@ public interface SubInfoService {
 
 	List<SubInfoFixCbDetail> exportFixCbDetailExcel(SubInfoQueryTzVO vo,List<String> subjectIds);
 
+	List<SubInfoGxj> queryStatistics(@Param("vo") SubInfoQueryTzVO queryVO);
+
 	List<SubInfoTotalExcel> exportTotalExcelByStatus(SubInfoQueryTzVO vo);
 
 	List<SubInfoFixZjDetail> exportFixZjDetailExcel(SubInfoQueryTzVO vo,List<String> subjectIds);
@@ -452,7 +455,7 @@ public interface SubInfoService {
 
 	List<SmzkDetailVo> exportSmzkDetailExcel(SubInfoQueryTzVO vo, List<String> subjectIds);
 
-    void importXmzkDetailExcel(List<List<Object>> readAll);
+    void importXmzkDetailExcel(List<List<Object>> readAll,LoginUserVO loginUser);
 
 	void removeFour(MoveDbParamVo vo, LoginUserVO loginUser);
 

+ 28 - 0
projects-service/src/main/java/com/rtrh/projects/modules/projects/service/impl/SubHisServiceImpl.java

@@ -0,0 +1,28 @@
+package com.rtrh.projects.modules.projects.service.impl;
+
+import com.rtrh.projects.modules.projects.mapper.SubHisMapper;
+import com.rtrh.projects.modules.projects.service.ISubHisService;
+import com.rtrh.projects.modules.projects.vo.SubHisVO;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * <p>
+ * 项目历史表 服务实现类
+ * </p>
+ *
+ * @author jiangpengli
+ * @since 2025-02-08
+ */
+@Service
+public class SubHisServiceImpl implements ISubHisService {
+    @Resource
+    private SubHisMapper subHisMapper;
+
+    @Override
+    public List<SubHisVO> queryByMonth(String month) {
+        return subHisMapper.queryByMonth(month);
+    }
+}

+ 27 - 7
projects-service/src/main/java/com/rtrh/projects/modules/projects/service/impl/SubInfoServiceImpl.java

@@ -17,7 +17,6 @@ import com.rtrh.projects.modules.projects.service.*;
 import com.rtrh.projects.modules.projects.vo.*;
 import com.rtrh.projects.modules.projects.vo.export.*;
 import com.rtrh.projects.modules.rolemeun.dao.SecRoleDao;
-import com.rtrh.projects.modules.rolemeun.po.SecRole;
 import com.rtrh.projects.modules.system.dao.TSystableDao;
 import com.rtrh.projects.modules.system.po.*;
 import com.rtrh.projects.modules.system.service.ISubInduService;
@@ -27,7 +26,6 @@ import com.rtrh.projects.vo.SubIdVO;
 import com.rtrh.projects.vo.subject.MoveDbParamVo;
 import com.rtrh.projects.vo.subject.SubinfoPreQueryVo;
 import org.apache.commons.lang3.StringUtils;
-import org.hibernate.Query;
 import org.hibernate.criterion.Criterion;
 import org.hibernate.criterion.DetachedCriteria;
 import org.hibernate.criterion.MatchMode;
@@ -54,7 +52,6 @@ import com.rtrh.projects.modules.projects.enums.ProjectStatusEnum;
 import com.rtrh.projects.modules.projects.enums.RptContKindEnum;
 import com.rtrh.projects.modules.projects.enums.StatusEnum;
 import com.rtrh.projects.modules.projects.enums.SubIsHideStatusEnum;
-import com.rtrh.projects.modules.projects.enums.SubPlanStatusEnum;
 import com.rtrh.projects.modules.projects.enums.SubqestionStatus;
 import com.rtrh.projects.modules.projects.vo.export.SubInfoExportVO;
 import com.rtrh.projects.modules.system.SysConstant;
@@ -5479,7 +5476,7 @@ public class SubInfoServiceImpl implements SubInfoService {
 
     @Override
     @TargetDataSource("primary")
-    public void importXmzkDetailExcel(List<List<Object>> readAll) {
+    public void importXmzkDetailExcel(List<List<Object>> readAll,LoginUserVO userVO) {
 
         // 前两行是标题,跳过
         if (readAll != null && readAll.size() >2) {
@@ -5495,7 +5492,9 @@ public class SubInfoServiceImpl implements SubInfoService {
                         xmzhtjDetailVo.setId(readAll.get(i).get(j).toString());
                     }
                     if (j == 2){
-                        xmzhtjDetailVo.setStatus(readAll.get(i).get(j).toString());
+                        // xmzhtjDetailVo.setStatus(readAll.get(i).get(j).toString());
+                        String s = readAll.get(i).get(j).toString();
+                        xmzhtjDetailVo.setStatus(SubInfoStatusEnum.getCodeByDesc(s));
                     }
                     if (j == 3){
                         xmzhtjDetailVo.setSubName(readAll.get(i).get(j).toString());
@@ -5566,6 +5565,7 @@ public class SubInfoServiceImpl implements SubInfoService {
                     tSysTableService.getByKind(SysTableKind.JSDD)
             ).orElse(Collections.emptyList());
 
+            // Map<String, String> subIdStatusMap = new HashMap<>();
             for (int i = 0; i < list.size(); i++) {
 
                 SmzkDetailVo smzkDetailVo = list.get(i);
@@ -5575,9 +5575,24 @@ public class SubInfoServiceImpl implements SubInfoService {
                     throw new RuntimeException("导入失败,第" + (i+3) + "行,项目Id不能为空");
                 }else {
                     // 查找sub_info表,根据id查询,如果不存在报错
-                    Integer count = subInfoMapper.selectById(smzkDetailVo.getId());
-                    if (count == 0){
+                    SubInfoGxj count = subInfoMapper.selectById(smzkDetailVo.getId());
+                    if (count == null){
                         throw new RuntimeException("导入失败,第" + (i+3) + "行,项目Id不存在");
+                    }else {
+                        // subIdStatusMap.put(count.getSubId(), count.getStatus());
+                        if (!Objects.equals(count.getStatus(), smzkDetailVo.getStatus())){
+                            // 记录转库日志
+                            // 移库日志
+                            LogOperate logOperate = new LogOperate();
+                            logOperate.setCreateUserId(userVO.getId());
+                            logOperate.setCreateUserName(userVO.getLoginName());
+                            logOperate.setStatusAfter(smzkDetailVo.getStatus());
+                            logOperate.setStatusFirst(count.getStatus());
+                            logOperate.setSubId(smzkDetailVo.getId());
+                            logOperate.setKind(Integer.parseInt(smzkDetailVo.getStatus()) > Integer.parseInt(count.getStatus()) ? "1" : "0");
+                            logOperate.setTitle(String.format("%s转%s",SubInfoStatusEnum.getDesc(count.getStatus()),SubInfoStatusEnum.getDesc(smzkDetailVo.getStatus())));
+                            logOperateService.save(logOperate);
+                        }
                     }
                 }
 
@@ -5652,6 +5667,11 @@ public class SubInfoServiceImpl implements SubInfoService {
         }
     }
 
+    @Override
+    public List<SubInfoGxj> queryStatistics(SubInfoQueryTzVO queryVO){
+        return subInfoMapper.queryStatistics(queryVO);
+    }
+
     private Map<String, Object> getStringObjectMap(List<WorkBenchVO> list) {
         Map<String, Object> resultMap = new HashMap<>();
         if (CollectionUtil.isNotEmpty(list)){

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

@@ -1982,7 +1982,6 @@ public class SubRptContServiceImpl implements SubRptContService {
 					break;
 			}
 		}
-		// System.err.println(sql);
 		return sql;
 	}
 

+ 15 - 0
projects-service/src/main/java/com/rtrh/projects/modules/projects/vo/SubHisVO.java

@@ -0,0 +1,15 @@
+package com.rtrh.projects.modules.projects.vo;
+
+import com.rtrh.projects.modules.projects.po.SubHis;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class SubHisVO extends SubHis {
+    private BigDecimal amtTotal;
+    private String indusKind;
+    private String subjectId;
+}

+ 12 - 4
projects/src/main/java/com/rtrh/projects/web/controller/reportforms/api/AnnualPlansApiController.java

@@ -3,7 +3,9 @@ package com.rtrh.projects.web.controller.reportforms.api;
 
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
+import cn.hutool.core.collection.CollUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -66,10 +68,16 @@ public class AnnualPlansApiController extends BaseController {
             } else if(OrderType.desc.name().equals(orderType)) {
             	orderType = "2";
             }
-        	
-            List<Map<String, Object>> list= workbenchMapper.pageProjectYearPlan(queryVO.getYear(),queryVO.getStatus(),queryVO.getXmlx(),queryVO.getXmxz(),
-            		queryVO.getHyfl(),queryVO.getUnitName(), queryVO.getSubName(), getCurUser().getLoginName(),
-            		queryVO.getJsdd(), queryVO.getMinMoney(), queryVO.getMaxMoney(), queryVO.getIsLock(), orderType,"", page);
+            List<String> subjectIds = getSubjectIds();
+            String qx = "";
+            if (CollUtil.isNotEmpty(subjectIds)){
+                qx = String.join(",", subjectIds);
+            }
+            // List<Map<String, Object>> list= workbenchMapper.pageProjectYearPlan(queryVO.getYear(),queryVO.getStatus(),queryVO.getXmlx(),queryVO.getXmxz(),
+            // 		queryVO.getHyfl(),queryVO.getUnitName(), queryVO.getSubName(), getCurUser().getLoginName(),
+            // 		queryVO.getJsdd(), queryVO.getMinMoney(), queryVO.getMaxMoney(), queryVO.getIsLock(), orderType,"", page);
+            List<Map<String, Object>> list= workbenchMapper.pageProjectYearPlan(queryVO.getYear(),queryVO.getStatus(),
+                    queryVO.getJsdd(),queryVO.getHyfl(),queryVO.getSubName(),qx,orderType,page);
 //			message.setData(pageList.getList());
             message.add(list, page.getTotalCount());
         } catch (Exception e) {

+ 171 - 89
projects/src/main/java/com/rtrh/projects/web/controller/subject/SubInfoExportController.java

@@ -1,26 +1,19 @@
 package com.rtrh.projects.web.controller.subject;
 
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.math.BigDecimal;
-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;
-import javax.servlet.http.HttpServletResponse;
-
+import cn.afterturn.easypoi.entity.BaseTypeConstants;
 import cn.afterturn.easypoi.excel.ExcelExportUtil;
+import cn.afterturn.easypoi.excel.entity.ExportParams;
+import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
+import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
+import cn.afterturn.easypoi.excel.export.ExcelExportService;
 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.DateField;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.io.IoUtil;
+import cn.hutool.core.net.URLEncodeUtil;
 import cn.hutool.poi.excel.ExcelUtil;
 import com.alibaba.excel.EasyExcel;
 import com.alibaba.excel.EasyExcelFactory;
@@ -28,23 +21,26 @@ import com.alibaba.excel.ExcelWriter;
 import com.alibaba.excel.write.metadata.WriteSheet;
 import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
 import com.google.common.collect.Lists;
+import com.rtrh.common.util.CollectionUtil;
 import com.rtrh.common.util.StringUtil;
+import com.rtrh.core.repository.Page;
 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.*;
 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.*;
 import com.rtrh.projects.modules.projects.vo.export.*;
+import com.rtrh.projects.modules.system.enums.SysTableKind;
+import com.rtrh.projects.modules.system.po.TSystable;
 import com.rtrh.projects.modules.system.service.ISubInduService;
+import com.rtrh.projects.modules.system.service.TSysTableService;
 import com.rtrh.projects.modules.utils.CustomCellWriteWidthStrategy;
 import com.rtrh.projects.modules.utils.DateUtils;
 import com.rtrh.projects.modules.utils.MyStringUtils;
 import com.rtrh.projects.modules.utils.QualificationsDeclareCellWriteHandler;
-//import com.rtrh.projects.modules.utils.StringUtils;
 import com.rtrh.projects.outapi.result.JsonResult;
+import com.rtrh.projects.web.controller.BaseController;
 import com.rtrh.projects.web.log.Log;
 import com.rtrh.projects.web.log.WebLogAspect;
 import com.rtrh.projects.web.util.ExcelStyleUtil;
@@ -63,23 +59,25 @@ import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.ModelMap;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.servlet.ModelAndView;
 
-import com.rtrh.common.util.CollectionUtil;
-import com.rtrh.core.repository.Page;
-import com.rtrh.projects.modules.projects.vo.SubInfoQueryTzVO;
-import com.rtrh.projects.modules.system.enums.SysTableKind;
-import com.rtrh.projects.modules.system.po.TSystable;
-import com.rtrh.projects.modules.system.service.TSysTableService;
-import com.rtrh.projects.web.controller.BaseController;
-
-import cn.afterturn.easypoi.entity.BaseTypeConstants;
-import cn.afterturn.easypoi.excel.entity.ExportParams;
-import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
-import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
-import cn.afterturn.easypoi.excel.export.ExcelExportService;
-import cn.hutool.core.net.URLEncodeUtil;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.net.URLEncoder;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 
 /**
  * 项目信息导出功能
@@ -110,6 +108,8 @@ public class SubInfoExportController extends BaseController {
     private SubPreNewService subPreNewService;
     @Autowired
     private SubRptContService subRptContService;
+    @Autowired
+    private ISubHisService subHisService;
 
     /**
      * 导出汇总表
@@ -1345,45 +1345,53 @@ public class SubInfoExportController extends BaseController {
             data.put("hyStr", hyStr);
 
             // 一、项目转化情况
+            // 查询上月和当前所有项目的状态 用于计算开工率,增长百分点等
+            List<SubHisVO> subHisList = subHisService.queryByMonth(DateUtil.format(DateUtil.offset(new Date(), DateField.MONTH, -1), "yyyyMM"));
+            List<SubInfoGxj> currSubInfoList = subInfoService.queryStatistics(vo);
+
             List<LogOperateVO> logList = logOperateService.queryByYear(year);
-            StatusChangeCountersVO totalCounterVo = new StatusChangeCountersVO();
-            addNum(logList, totalCounterVo);
-            data.put("cbToXjNum", totalCounterVo.cbToXjNum);
-            data.put("xjToZjNum", totalCounterVo.xjToZjNum);
-            data.put("zjToTcNum", totalCounterVo.zjToTcNum);
-            data.put("tcToRgNum", totalCounterVo.tcToRgNum);
-            data.put("xjToCbNum", totalCounterVo.xjToCbNum);
-            data.put("rgToZjNum", totalCounterVo.rgToZjNum);
-
-            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);
-            data.put("lastXjToZjNum", lastCounterVo.xjToZjNum);
-            data.put("lastZjToTcNum", lastCounterVo.zjToTcNum);
-            data.put("lastTcToRgNum", lastCounterVo.tcToRgNum);
-            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 preText = String.format("%s年1-%s月,", year, month);
+            StringBuilder s = buildZhParagraph(preText, logList, month,lastMonth,subHisList,currSubInfoList);
+            data.put("mainZhStr", s);
+
             // 分属地看
+            Map<String, List<SubHisVO>> hisSubjectGroups = subHisList.stream().collect(Collectors.groupingBy(SubHisVO::getSubjectId));
+            Map<String, List<SubInfoGxj>> currSubjectGroups = currSubInfoList.stream().collect(Collectors.groupingBy(SubInfoGxj::getSubjectId));
             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");
+                String tempPreText = String.format("%s年1-%s月,%s", year, month, jsddMap.get(key));
+                StringBuilder s1 = buildZhParagraph(tempPreText, value, month, lastMonth, hisSubjectGroups.getOrDefault(key,new ArrayList<>()), currSubjectGroups.getOrDefault(key,new ArrayList<>()));
+                subjectZhStr.append(s1);
             });
             data.put("subjectZhStr", subjectZhStr);
 
             // 分规模看
+            Map<String, List<SubHisVO>> hisScaleGroups = subHisList.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亿元以上";
+                    })
+                );
+            Map<String, List<SubInfoGxj>> currScaleGroups = currSubInfoList.stream()
+                    .peek(t->{
+                        if (t.getAmtTotal() == null) {
+                            t.setAmtTotal(BigDecimal.ZERO);
+                        }
+                    })
+                .collect(Collectors.groupingBy(transaction -> {
+                        for (Map.Entry<String, BigDecimal> entry : groupBoundaries.entrySet()) {
+                            if (transaction.getAmtTotal().compareTo(entry.getValue()) < 0) {
+                                return entry.getKey();
+                            }
+                        }
+                        return "100亿元以上";
+                    })
+                );
             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) {
@@ -1394,18 +1402,31 @@ public class SubInfoExportController extends BaseController {
             }));
             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");
+                String tempPreText = String.format("%s年1-%s月,%s", year, month, "计划总投资" + key);
+                StringBuilder s1 = buildZhParagraph(tempPreText, value, month, lastMonth, hisScaleGroups.getOrDefault(key,CollUtil.newArrayList()), currScaleGroups.getOrDefault(key,CollUtil.newArrayList()));
+                scaleZhStr.append(s1);
             });
             data.put("scaleZhStr", scaleZhStr);
 
             // 分行业看
+            Map<String, List<SubHisVO>> hisHyGroups = subHisList.stream()
+                    .collect(Collectors.groupingBy(transaction -> {
+                        String code = transaction.getIndusKind();
+                        // 确保code不为空且长度至少为2
+                        if (code == null || code.length() < 2) {
+                            return "未知行业";  // 默认未知行业
+                        }
+                        return code.substring(0, 2);
+                    }));
+            Map<String, List<SubInfoGxj>> currHyGroups = currSubInfoList.stream()
+                    .collect(Collectors.groupingBy(transaction -> {
+                        String code = transaction.getIndusKind();
+                        // 确保code不为空且长度至少为2
+                        if (code == null || code.length() < 2) {
+                            return "未知行业";  // 默认未知行业
+                        }
+                        return code.substring(0, 2);
+                    }));
             Map<String, List<LogOperateVO>> hyZhGroups = logList.stream()
                     .collect(Collectors.groupingBy(transaction -> {
                         String code = transaction.getIndusKind();
@@ -1417,16 +1438,12 @@ public class SubInfoExportController extends BaseController {
                     }));
             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");
+                String tempPreText = String.format("%s年1-%s月,%s", year, month, hyflMap.get(key));
+                StringBuilder s1 = buildZhParagraph(tempPreText, value, month,lastMonth, hisHyGroups.getOrDefault(key,CollUtil.newArrayList()), currHyGroups.getOrDefault(key,CollUtil.newArrayList()));
+                scaleZhStr.append(s1);
             });
             data.put("hyZhStr", hyZhStr);
+
             // 二、存在问题
             // (一)项目落地方面
             data.put("xmldSubNameStr", "、、");
@@ -1451,16 +1468,6 @@ public class SubInfoExportController extends BaseController {
             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);
-            // data.put("currentYearZhStr", currentYearZhStr);
-            // Map<String, List<LogOperate>> collect1 = logList.stream().filter(item -> DateUtil.month(item.getZhDate()) == DateUtil.month(new Date())).collect(Collectors.groupingBy(LogOperate::getTitle));
-            // String currentMonthZhStr = buildZhData(collect1);
-            // data.put("currentMonthZhStr", currentMonthZhStr);
-            // 开工率 = (在建+投产)/(在建+投产+新建)
-            // 投产率 = (投产)/(在建+投产+新建)
-            // 入规率 = 入规/(在建+投产+新建)
         }
 
         WordExportUtil.exportWord07(word, data);
@@ -1470,6 +1477,81 @@ public class SubInfoExportController extends BaseController {
         word.write(response.getOutputStream());
     }
 
+    private StringBuilder buildZhParagraph(String preText, List<LogOperateVO> value, int month,int lastMonth, List<SubHisVO> subHisVOList, List<SubInfoGxj> subInfoGxjList) {
+        StringBuilder zhStrBuilder = new StringBuilder().append("\t");
+        StatusChangeCountersVO tempVo = new StatusChangeCountersVO();
+        addNum(value, tempVo);
+        List<LogOperateVO> currList = value.stream().filter(logOperate -> DateUtil.month(logOperate.getCreateTime()) == DateUtil.month(new Date())).collect(Collectors.toList());
+        StatusChangeCountersVO currTempVo = new StatusChangeCountersVO();
+        addNum(currList, currTempVo);
+
+        String mainText = String.format("储备项目转新建%s个、新建项目转在建%s个、在建项目转投产%s个、投产项目转入规%s个,新建项目降级为储备%s个、入规项目转为在建%s个。" +
+                        "其中,%s月当月,储备项目转新建%s个、新建项目转在建%s个、在建项目转投产%s个、投产项目转入规%s个,新建项目降级为储备%s个、入规项目转为在建%s个。 "
+                , tempVo.cbToXjNum, tempVo.xjToZjNum, tempVo.zjToTcNum, tempVo.tcToRgNum, tempVo.xjToCbNum, tempVo.rgToZjNum,
+                month, currTempVo.cbToXjNum, currTempVo.xjToZjNum, currTempVo.zjToTcNum, currTempVo.tcToRgNum, currTempVo.xjToCbNum, currTempVo.rgToZjNum
+        );
+        // 开工率 = (在建+投产)/(在建+投产+新建)
+        // 投产率 = (投产)/(在建+投产+新建)
+        // 入规率 = 入规/(在建+投产+新建)
+        AtomicReference<Long> rgNum = new AtomicReference<>(0L);
+        Map<String, Long> collect = subInfoGxjList.stream()
+                .peek(subInfoGxj -> {
+                    if (subInfoGxj.getBoolRg()){
+                        rgNum.set(rgNum.get() + 1);
+                    }
+                })
+                .collect(Collectors.groupingBy(SubInfoGxj::getStatus, Collectors.counting()));
+        Long xjNum = collect.getOrDefault(SubInfoStatusEnum.XJ.getCode(), 0L);
+        Long zjNum = collect.getOrDefault(SubInfoStatusEnum.ZJ.getCode(), 0L);
+        Long tcNum = collect.getOrDefault(SubInfoStatusEnum.TC.getCode(), 0L);
+        BigDecimal fm = new BigDecimal(xjNum + zjNum + tcNum);
+        BigDecimal kgl = BigDecimal.ZERO;
+        BigDecimal tcl = BigDecimal.ZERO;
+        BigDecimal rgl = BigDecimal.ZERO;
+        if (fm.compareTo(BigDecimal.ZERO) != 0) {
+           kgl = new BigDecimal((zjNum + tcNum) * 100).divide(fm, 2, RoundingMode.HALF_UP);
+           tcl = new BigDecimal(tcNum * 100).divide(fm, 2, RoundingMode.HALF_UP);
+           rgl = new BigDecimal(rgNum.get() * 100).divide(fm, 2, RoundingMode.HALF_UP);
+        }
+
+        Map<String, Long> statusNumMap = subHisVOList.stream().collect(Collectors.groupingBy(SubHisVO::getStatus, Collectors.counting()));
+        Long lastXjNum = statusNumMap.getOrDefault(SubInfoStatusEnum.XJ.getCode(), 0L);
+        Long lastZjNum = statusNumMap.getOrDefault(SubInfoStatusEnum.ZJ.getCode(), 0L);
+        Long lastTcNum = statusNumMap.getOrDefault(SubInfoStatusEnum.TC.getCode(), 0L);
+        Long lastRgNum = statusNumMap.getOrDefault("r", 0L);
+        BigDecimal lastFm = new BigDecimal(lastXjNum + lastZjNum + lastTcNum);
+        BigDecimal lastKgl = BigDecimal.ZERO;
+        BigDecimal lastTcl = BigDecimal.ZERO;
+        BigDecimal lastRgl = BigDecimal.ZERO;
+        if (lastFm.compareTo(BigDecimal.ZERO) != 0) {
+            lastKgl = new BigDecimal((lastZjNum + lastTcNum) * 100).divide(lastFm, 2, RoundingMode.HALF_UP);
+            lastTcl = new BigDecimal(lastTcNum * 100).divide(lastFm, 2, RoundingMode.HALF_UP);
+            lastRgl = new BigDecimal(lastRgNum * 100).divide(lastFm, 2, RoundingMode.HALF_UP);
+
+        }
+        String postText = String.format("1-%s月,项目开工率%s、投产率%s、入规率%s,较1-(%s)月,分别增长%s、%s、%s个百分点。",
+                month, kgl + "%", tcl + "%", rgl + "%", lastMonth, kgl.subtract(lastKgl), tcl.subtract(lastTcl), rgl.subtract(lastRgl));
+
+        return zhStrBuilder.append(preText).append(mainText).append(postText).append("\n");
+    }
+
+    private StringBuilder buildZhParagraph(String preText, List<LogOperateVO> value, int month) {
+        StringBuilder zhStrBuilder = new StringBuilder().append("\t");
+        StatusChangeCountersVO tempVo = new StatusChangeCountersVO();
+        addNum(value, tempVo);
+        List<LogOperateVO> currList = value.stream().filter(logOperate -> DateUtil.month(logOperate.getCreateTime()) == DateUtil.month(new Date())).collect(Collectors.toList());
+        StatusChangeCountersVO currTempVo = new StatusChangeCountersVO();
+        addNum(currList, currTempVo);
+
+        String mainText = String.format("储备项目转新建%s个、新建项目转在建%s个、在建项目转投产%s个、投产项目转入规%s个,新建项目降级为储备%s个、入规项目转为在建%s个。" +
+                        "其中,%s月当月,储备项目转新建%s个、新建项目转在建%s个、在建项目转投产%s个、投产项目转入规%s个,新建项目降级为储备%s个、入规项目转为在建%s个。 "
+                , tempVo.cbToXjNum, tempVo.xjToZjNum, tempVo.zjToTcNum, tempVo.tcToRgNum, tempVo.xjToCbNum, tempVo.rgToZjNum,
+                month, currTempVo.cbToXjNum, currTempVo.xjToZjNum, currTempVo.zjToTcNum, currTempVo.tcToRgNum, currTempVo.xjToCbNum, currTempVo.rgToZjNum
+        );
+        String postText = "1-%s月,项目开工率%s、投产率%s、入规率%s,较1-(%s)月,分别增长%s、%s、%s个百分点。";
+        return zhStrBuilder.append(preText).append(mainText).append(postText).append("\n");
+    }
+
     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())) {

+ 2 - 1
projects/src/main/java/com/rtrh/projects/web/controller/subject/api/SubInfoApiController.java

@@ -199,7 +199,8 @@ public class SubInfoApiController extends BaseController {
         ExcelReader reader = ExcelUtil.getReader(file.getInputStream());
         List<List<Object>> readAll = reader.read();
         try {
-            subInfoService.importXmzkDetailExcel(readAll);
+            LoginUserVO loginUser = getCurUser().getLoginUser();
+            subInfoService.importXmzkDetailExcel(readAll,loginUser);
         } catch (RuntimeException e) {
             message.addError(e.getMessage());
             return message;

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