Quellcode durchsuchen

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

张维明 vor 2 Monaten
Ursprung
Commit
b03d844871
36 geänderte Dateien mit 1210 neuen und 402 gelöschten Zeilen
  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. 4 0
      projects-service/src/main/java/com/rtrh/projects/modules/projects/po/SubInfoGxj.java
  10. 19 0
      projects-service/src/main/java/com/rtrh/projects/modules/projects/service/ISubHisService.java
  11. 4 1
      projects-service/src/main/java/com/rtrh/projects/modules/projects/service/SubInfoService.java
  12. 28 0
      projects-service/src/main/java/com/rtrh/projects/modules/projects/service/impl/SubHisServiceImpl.java
  13. 27 7
      projects-service/src/main/java/com/rtrh/projects/modules/projects/service/impl/SubInfoServiceImpl.java
  14. 0 1
      projects-service/src/main/java/com/rtrh/projects/modules/projects/service/impl/SubRptContServiceImpl.java
  15. 20 0
      projects-service/src/main/java/com/rtrh/projects/modules/projects/vo/SubHisVO.java
  16. 7 6
      projects-service/src/main/java/com/rtrh/projects/modules/system/dao/SecUserDao.java
  17. 11 8
      projects-service/src/main/java/com/rtrh/projects/modules/system/po/SecUser.hbm.xml
  18. 31 185
      projects-service/src/main/java/com/rtrh/projects/modules/system/po/SecUser.java
  19. 0 1
      projects-service/src/main/java/com/rtrh/projects/modules/system/service/impl/SecUserServiceImpl.java
  20. 20 3
      projects-service/src/main/java/com/rtrh/projects/modules/system/vo/LoginUserVO.java
  21. 3 2
      projects/src/main/java/com/rtrh/projects/outapi/base/JwtUtils.java
  22. 12 4
      projects/src/main/java/com/rtrh/projects/web/controller/reportforms/api/AnnualPlansApiController.java
  23. 149 89
      projects/src/main/java/com/rtrh/projects/web/controller/subject/SubInfoExportController.java
  24. 2 1
      projects/src/main/java/com/rtrh/projects/web/controller/subject/api/SubInfoApiController.java
  25. 0 1
      projects/src/main/java/com/team/security/TeamShiroUser.java
  26. BIN
      projects/src/main/resources/template/analysis.docx
  27. 2 2
      projects/src/main/webapp/asset/css/indexScreen.css
  28. 428 0
      projects/src/main/webapp/asset/lib/echarts/5.6.0/echarts-liquidfill.min.js
  29. 34 0
      projects/src/main/webapp/asset/lib/echarts/5.6.0/echarts.min.js
  30. 78 33
      projects/src/main/webapp/vmodules/leftMenu.jsp
  31. 152 41
      projects/src/main/webapp/vmodules/statics/analysisScreen_four.jsp
  32. 15 1
      projects/src/main/webapp/vmodules/subject/subInfo/tz/cb.jsp
  33. 16 2
      projects/src/main/webapp/vmodules/subject/subInfo/tz/end.jsp
  34. 16 2
      projects/src/main/webapp/vmodules/subject/subInfo/tz/main.jsp
  35. 16 2
      projects/src/main/webapp/vmodules/subject/subInfo/tz/new.jsp
  36. 1 1
      projects/src/main/webapp/vmodules/subject/subInfo/tz/xmzk.jsp

+ 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

@@ -81,10 +81,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;
+
+
+}

+ 4 - 0
projects-service/src/main/java/com/rtrh/projects/modules/projects/po/SubInfoGxj.java

@@ -166,4 +166,8 @@ public class SubInfoGxj extends TableBaseColomn implements Serializable {
     private String preContent;
 
     private String filingDate;
+
+    public BigDecimal getAmtTotal() {
+        return amtTotal == null ? BigDecimal.ZERO : amtTotal;
+    }
 }

+ 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

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

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

@@ -0,0 +1,20 @@
+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;
+
+    public BigDecimal getAmtTotal() {
+        return amtTotal == null ? BigDecimal.ZERO : amtTotal;
+    }
+
+    private String indusKind;
+    private String subjectId;
+}

+ 7 - 6
projects-service/src/main/java/com/rtrh/projects/modules/system/dao/SecUserDao.java

@@ -1,16 +1,16 @@
 package com.rtrh.projects.modules.system.dao;
 
-import java.util.List;
-
+import com.rtrh.common.util.CollectionUtil;
+import com.rtrh.common.util.StringUtil;
+import com.rtrh.core.repository.hibernate.EntityServiceImpl;
+import com.rtrh.projects.modules.system.po.SecUser;
+import com.rtrh.projects.util.TargetDataSource;
 import org.hibernate.criterion.Criterion;
 import org.hibernate.criterion.DetachedCriteria;
 import org.hibernate.criterion.Restrictions;
 import org.springframework.stereotype.Service;
 
-import com.rtrh.common.util.CollectionUtil;
-import com.rtrh.common.util.StringUtil;
-import com.rtrh.core.repository.hibernate.EntityServiceImpl;
-import com.rtrh.projects.modules.system.po.SecUser;
+import java.util.List;
 
 @Service
 public class SecUserDao extends EntityServiceImpl<SecUser> {
@@ -38,4 +38,5 @@ public class SecUserDao extends EntityServiceImpl<SecUser> {
         List<SecUser> list = find(detachedCriteria);
         return CollectionUtil.isEmpty(list) ? null : list.get(0);
     }
+
 }

+ 11 - 8
projects-service/src/main/java/com/rtrh/projects/modules/system/po/SecUser.hbm.xml

@@ -8,6 +8,10 @@
 		<property column="kind_unit" name="kindUnit" not-null="false" type="java.lang.String" />
 		<property column="is_unit" name="isUnit" not-null="false" type="java.lang.Boolean" />
 		<property column="kind" name="kind" not-null="false" type="java.lang.String" />
+		<property column="other_kind" name="otherKind" not-null="false" type="java.lang.String" />
+		<property name="statusSubject" type="java.lang.String">
+			<column name="status_subject" default="0"/>
+		</property>
 		<property column="unit_id" name="unitId" not-null="false" type="java.lang.String" />
 		<property column="unit_dw_id" name="unitDWId" not-null="false" type="java.lang.String" />
 		<property column="depart_id" name="departId" not-null="false" type="java.lang.String" />
@@ -20,12 +24,11 @@
 		<property column="edit" name="edit" not-null="false" type="java.lang.Boolean" />
 		<property column="is_lead" name="isLead" not-null="false" type="java.lang.Boolean" />
 		<property column="create_user_id" name="createUserId" not-null="false" type="java.lang.String" />
-        <property column="create_user_name" name="createUserName" not-null="false" type="java.lang.String" />
-        <property column="create_time" name="createTime" not-null="false" type="java.util.Date" />
-        <property column="last_update_user_id" name="lastUpdateUserId" not-null="false" type="java.lang.String" />
-        <property column="last_update_user_name" name="lastUpdateUserName" not-null="false" type="java.lang.String" />
-        <property column="update_time" name="updateTime" not-null="false" type="java.util.Date" />
-        <property column="logic_delete_flag" name="logicDeleteFlag" not-null="false" type="java.lang.Boolean" />
-		<property column="status_subject" name="statusSubject" not-null="false" type="java.lang.String"/>
+		<property column="create_user_name" name="createUserName" not-null="false" type="java.lang.String" />
+		<property column="create_time" name="createTime" not-null="false" type="java.util.Date" />
+		<property column="last_update_user_id" name="lastUpdateUserId" not-null="false" type="java.lang.String" />
+		<property column="last_update_user_name" name="lastUpdateUserName" not-null="false" type="java.lang.String" />
+		<property column="update_time" name="updateTime" not-null="false" type="java.util.Date" />
+		<property column="logic_delete_flag" name="logicDeleteFlag" not-null="false" type="java.lang.Boolean" />
 	</class>
-</hibernate-mapping>
+</hibernate-mapping>

+ 31 - 185
projects-service/src/main/java/com/rtrh/projects/modules/system/po/SecUser.java

@@ -2,8 +2,13 @@ package com.rtrh.projects.modules.system.po;
 
 import java.io.Serializable;
 import java.util.Date;
+import java.util.List;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.rtrh.projects.modules.rolemeun.po.SecRole;
+import lombok.Data;
+
+import javax.persistence.Transient;
 
 /**
  * 用户信息
@@ -11,6 +16,7 @@ import com.fasterxml.jackson.annotation.JsonFormat;
  *
  */
 @SuppressWarnings("serial")
+@Data
 public class SecUser implements Serializable {
 
 	/**
@@ -37,9 +43,15 @@ public class SecUser implements Serializable {
 	 */
 	private Boolean isUnit;
 	/**
-	 * 角色
+	 *  默认角色
 	 */
 	private String kind;
+
+	/**
+	 * 可切换角色
+	 */
+	private String otherKind;
+
 	/**
 	 * 对应的责任单位j_unit对应的id
 	 */
@@ -81,10 +93,7 @@ public class SecUser implements Serializable {
 	 * 最后跟新人
 	 */
 	private String lastUpdateUserName;
-	/**
-	 * 是否被删除
-	 */
-	private boolean logicDeleteFlag = false;
+
 	/**
 	 * 电话
 	 */
@@ -102,9 +111,14 @@ public class SecUser implements Serializable {
 
 	/**
 	 * 是否可以查看所有项目
-	 * @see com.rtrh.projects.modules.system.enums.ProjectSta
+	 *
 	 */
 	private String statusProj;
+
+	/**
+	 * 是否能查看所有市区县项目
+	 */
+	private String statusSubject;
 	/**
 	 * 是否可编辑
 	 */
@@ -115,20 +129,6 @@ public class SecUser implements Serializable {
 	 */
 	private Boolean isLead;
 
-	/**
-	 * 工信局数据权限 1 查看所有区域项目
-	 */
-	private String statusSubject;
-
-
-	public String getStatusSubject() {
-		return statusSubject;
-	}
-
-	public void setStatusSubject(String statusSubject) {
-		this.statusSubject = statusSubject;
-	}
-
 
 	/**
 	 * 职务
@@ -136,174 +136,20 @@ public class SecUser implements Serializable {
 	private String job;
 
 
-	public String getJob() {
-		return job;
-	}
-
-	public void setJob(String job) {
-		this.job = job;
-	}
-
-	public Boolean getUnit() {
-		return isUnit;
-	}
-
-	public void setUnit(Boolean unit) {
-		isUnit = unit;
-	}
-
-	public Boolean getIsLead() {
-		return isLead;
-	}
-
-	public void setIsLead(Boolean lead) {
-		isLead = lead;
-	}
-
-	public String getEmail() {
-		return email;
-	}
-
-	public void setEmail(String email) {
-		this.email = email;
-	}
-
-	public String getStatusUnit() {
-		return statusUnit;
-	}
-
-	public void setStatusUnit(String statusUnit) {
-		this.statusUnit = statusUnit;
-	}
-
-	public String getStatusProj() {
-		return statusProj;
-	}
-
-	public void setStatusProj(String statusProj) {
-		this.statusProj = statusProj;
-	}
-
-	public String getSimCode() {
-		return simCode;
-	}
-
-	public void setSimCode(String simCode) {
-		this.simCode = simCode;
-	}
-
-	public String getId() {
-		return id;
-	}
-	public void setId(String id) {
-		this.id = id;
-	}
-	public String getKind() {
-		return kind;
-	}
-	public void setKind(String kind) {
-		this.kind = kind;
-	}
-	public String getUnitId() {
-		return unitId;
-	}
-	public void setUnitId(String unitId) {
-		this.unitId = unitId;
-	}
-	public String getRemark() {
-		return remark;
-	}
-	public void setRemark(String remark) {
-		this.remark = remark;
-	}
-	public String getCreateUserId() {
-		return createUserId;
-	}
-	public void setCreateUserId(String createUserId) {
-		this.createUserId = createUserId;
-	}
-	public String getCreateUserName() {
-		return createUserName;
-	}
-	public void setCreateUserName(String createUserName) {
-		this.createUserName = createUserName;
-	}
-	public Date getCreateTime() {
-		return createTime;
-	}
-	public void setCreateTime(Date createTime) {
-		this.createTime = createTime;
-	}
-	public Date getUpdateTime() {
-		return updateTime;
-	}
-	public void setUpdateTime(Date updateTime) {
-		this.updateTime = updateTime;
-	}
-	public String getLastUpdateUserId() {
-		return lastUpdateUserId;
-	}
-	public void setLastUpdateUserId(String lastUpdateUserId) {
-		this.lastUpdateUserId = lastUpdateUserId;
-	}
-	public String getLastUpdateUserName() {
-		return lastUpdateUserName;
-	}
-	public void setLastUpdateUserName(String lastUpdateUserName) {
-		this.lastUpdateUserName = lastUpdateUserName;
-	}
-	public boolean isLogicDeleteFlag() {
-		return logicDeleteFlag;
-	}
-	public void setLogicDeleteFlag(boolean logicDeleteFlag) {
-		this.logicDeleteFlag = logicDeleteFlag;
-	}
-	public String getLogin() {
-		return login;
-	}
-	public void setLogin(String login) {
-		this.login = login;
-	}
-	public String getTitle() {
-		return title;
-	}
-	public void setTitle(String title) {
-		this.title = title;
-	}
-	public String getKindUnit() {
-		return kindUnit;
-	}
-	public void setKindUnit(String kindUnit) {
-		this.kindUnit = kindUnit;
-	}
-	public Boolean getIsUnit() {
-		return isUnit;
-	}
-	public void setIsUnit(Boolean isUnit) {
-		this.isUnit = isUnit;
-	}
-
-	public String getDepartId() {
-		return departId;
-	}
+	/**
+	 * 是否被删除
+	 */
+	private Boolean logicDeleteFlag;
 
-	public void setDepartId(String departId) {
-		this.departId = departId;
-	}
 
-	public Boolean getEdit() {
-		return edit;
-	}
+	/**
+	 *用户的所有角色
+	 */
+	@Transient
+	private List<SecRole> allRole;
 
-	public void setEdit(Boolean edit) {
-		this.edit = edit;
-	}
 
-	public String getUnitDWId() {
-		return unitDWId;
-	}
+	@Transient
+	private String  oldPassword;
 
-	public void setUnitDWId(String unitDWId) {
-		this.unitDWId = unitDWId;
-	}
 }

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

@@ -19,7 +19,6 @@ import org.hibernate.criterion.Restrictions;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.util.Collections;
 import java.util.List;
 
 @Service

+ 20 - 3
projects-service/src/main/java/com/rtrh/projects/modules/system/vo/LoginUserVO.java

@@ -1,10 +1,16 @@
 package com.rtrh.projects.modules.system.vo;
 
 import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.rtrh.projects.modules.rolemeun.po.SecRole;
 import lombok.Getter;
 import lombok.Setter;
 
+import javax.persistence.Transient;
+
 @Setter
 @Getter
 @SuppressWarnings("serial")
@@ -24,6 +30,11 @@ public class LoginUserVO implements Serializable {
 	 * 角色id
 	 */
 	private String kind;
+
+	/**
+	 * 角色id
+	 */
+	private String otherKind;
 	/**
 	 * 所属单位id
 	 */
@@ -60,14 +71,20 @@ public class LoginUserVO implements Serializable {
 	 * 是否查看所有项目
 	 */
 	private String statusProj;
-	
+
 	/**
 	 * 是否可编辑
 	 */
 	private Boolean edit;
 
+
+
 	/**
-	 * 工信局数据权限 1 查看所有区域项目
+	 *用户的所有角色
 	 */
-	private String statusSubject;
+	@Transient
+	private List<SecRole> allRole;
+
+	@Transient
+	private String  oldPassword;
 }

+ 3 - 2
projects/src/main/java/com/rtrh/projects/outapi/base/JwtUtils.java

@@ -6,6 +6,7 @@ import java.util.concurrent.TimeoutException;
 
 import javax.servlet.http.HttpServletRequest;
 
+import com.rtrh.projects.modules.system.service.SecUserService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
@@ -56,7 +57,7 @@ public class JwtUtils {
     @Autowired
     private XMemcachedClient memcachedClient;
     @Autowired
-    private SecUserDao secUserDao;
+    private SecUserService secUserService;
 
 
     /**
@@ -147,7 +148,7 @@ public class JwtUtils {
             if (!token.equals(redisToken)) return false;*/
             //用户验证是否存在(避免账户合并后的问题)
         	String userId = getUserIdByToken(token);
-            SecUser user = secUserDao.findById(userId);
+            SecUser user = secUserService.getByFgwId(userId);
             if(user == null) {
             	throw new UserNotLoginException();
             }

+ 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) {

+ 149 - 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,48 @@ 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()
+                .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 +1397,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 +1433,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 +1463,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 +1472,64 @@ 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 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;

+ 0 - 1
projects/src/main/java/com/team/security/TeamShiroUser.java

@@ -23,7 +23,6 @@ public class TeamShiroUser extends LoginUserVO implements Serializable {
 		this.password = commUser.getPassword();
 		this.userLocale = userLocale;
 		vo = new LoginUserVO();
-		setStatusSubject(secUser.getStatusSubject());
 		setEmail(secUser.getEmail());
 		setLoginName(commUser.getLoginname());
 		setId(commUser.getId());

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


+ 2 - 2
projects/src/main/webapp/asset/css/indexScreen.css

@@ -631,8 +631,8 @@ body {
   margin-top: calc(80 / 1080 * calc(100vh));
 }
 .main .main-right .main-right-top .bie-echarts {
-  width: calc(330 / 1920 * calc(100vw));
-  height: calc(188 / 1080 * calc(100vh));
+  width: calc(350 / 1920 * calc(100vw));
+  height: calc(208 / 1080 * calc(100vh));
   position: relative;
   z-index: 2;
 }

+ 428 - 0
projects/src/main/webapp/asset/lib/echarts/5.6.0/echarts-liquidfill.min.js

@@ -0,0 +1,428 @@
+!function(e, t) {
+    "object" == typeof exports && "object" == typeof module ? module.exports = t(require("echarts")) : "function" == typeof define && define.amd ? define(["echarts"], t) : "object" == typeof exports ? exports["echarts-liquidfill"] = t(require("echarts")) : e["echarts-liquidfill"] = t(e.echarts)
+}(self, (function(e) {
+    return ( () => {
+        "use strict";
+        var t = {
+            245: (e, t, a) => {
+                a.r(t);
+                var i = a(83);
+                i.extendSeriesModel({
+                    type: "series.liquidFill",
+                    optionUpdated: function() {
+                        var e = this.option;
+                        e.gridSize = Math.max(Math.floor(e.gridSize), 4)
+                    },
+                    getInitialData: function(e, t) {
+                        var a = i.helper.createDimensions(e.data, {
+                            coordDimensions: ["value"]
+                        })
+                          , r = new i.List(a,this);
+                        return r.initData(e.data),
+                        r
+                    },
+                    defaultOption: {
+                        color: ["#294D99", "#156ACF", "#1598ED", "#45BDFF"],
+                        center: ["50%", "50%"],
+                        radius: "50%",
+                        amplitude: "8%",
+                        waveLength: "80%",
+                        phase: "auto",
+                        period: "auto",
+                        direction: "right",
+                        shape: "circle",
+                        waveAnimation: !0,
+                        animationEasing: "linear",
+                        animationEasingUpdate: "linear",
+                        animationDuration: 2e3,
+                        animationDurationUpdate: 1e3,
+                        outline: {
+                            show: !0,
+                            borderDistance: 8,
+                            itemStyle: {
+                                color: "none",
+                                borderColor: "#294D99",
+                                borderWidth: 8,
+                                shadowBlur: 20,
+                                shadowColor: "rgba(0, 0, 0, 0.25)"
+                            }
+                        },
+                        backgroundStyle: {
+                            color: "#E3F7FF"
+                        },
+                        itemStyle: {
+                            opacity: .95,
+                            shadowBlur: 50,
+                            shadowColor: "rgba(0, 0, 0, 0.4)"
+                        },
+                        label: {
+                            show: !0,
+                            color: "#294D99",
+                            insideColor: "#fff",
+                            fontSize: 50,
+                            fontWeight: "bold",
+                            align: "center",
+                            baseline: "middle",
+                            position: "inside"
+                        },
+                        emphasis: {
+                            itemStyle: {
+                                opacity: .8
+                            }
+                        }
+                    }
+                });
+                const r = i.graphic.extendShape({
+                    type: "ec-liquid-fill",
+                    shape: {
+                        waveLength: 0,
+                        radius: 0,
+                        radiusY: 0,
+                        cx: 0,
+                        cy: 0,
+                        waterLevel: 0,
+                        amplitude: 0,
+                        phase: 0,
+                        inverse: !1
+                    },
+                    buildPath: function(e, t) {
+                        null == t.radiusY && (t.radiusY = t.radius);
+                        for (var a = Math.max(2 * Math.ceil(2 * t.radius / t.waveLength * 4), 8); t.phase < 2 * -Math.PI; )
+                            t.phase += 2 * Math.PI;
+                        for (; t.phase > 0; )
+                            t.phase -= 2 * Math.PI;
+                        var i = t.phase / Math.PI / 2 * t.waveLength
+                          , r = t.cx - t.radius + i - 2 * t.radius;
+                        e.moveTo(r, t.waterLevel);
+                        for (var l = 0, o = 0; o < a; ++o) {
+                            var s = o % 4
+                              , h = n(o * t.waveLength / 4, s, t.waveLength, t.amplitude);
+                            e.bezierCurveTo(h[0][0] + r, -h[0][1] + t.waterLevel, h[1][0] + r, -h[1][1] + t.waterLevel, h[2][0] + r, -h[2][1] + t.waterLevel),
+                            o === a - 1 && (l = h[2][0])
+                        }
+                        t.inverse ? (e.lineTo(l + r, t.cy - t.radiusY),
+                        e.lineTo(r, t.cy - t.radiusY),
+                        e.lineTo(r, t.waterLevel)) : (e.lineTo(l + r, t.cy + t.radiusY),
+                        e.lineTo(r, t.cy + t.radiusY),
+                        e.lineTo(r, t.waterLevel)),
+                        e.closePath()
+                    }
+                });
+                function n(e, t, a, i) {
+                    return 0 === t ? [[e + .5 * a / Math.PI / 2, i / 2], [e + .5 * a / Math.PI, i], [e + a / 4, i]] : 1 === t ? [[e + .5 * a / Math.PI / 2 * (Math.PI - 2), i], [e + .5 * a / Math.PI / 2 * (Math.PI - 1), i / 2], [e + a / 4, 0]] : 2 === t ? [[e + .5 * a / Math.PI / 2, -i / 2], [e + .5 * a / Math.PI, -i], [e + a / 4, -i]] : [[e + .5 * a / Math.PI / 2 * (Math.PI - 2), -i], [e + .5 * a / Math.PI / 2 * (Math.PI - 1), -i / 2], [e + a / 4, 0]]
+                }
+                var l = function(e, t) {
+                    switch (e) {
+                    case "center":
+                    case "middle":
+                        e = "50%";
+                        break;
+                    case "left":
+                    case "top":
+                        e = "0%";
+                        break;
+                    case "right":
+                    case "bottom":
+                        e = "100%"
+                    }
+                    return "string" == typeof e ? (a = e,
+                    a.replace(/^\s+|\s+$/g, "")).match(/%$/) ? parseFloat(e) / 100 * t : parseFloat(e) : null == e ? NaN : +e;
+                    var a
+                };
+                function o(e) {
+                    return e && 0 === e.indexOf("path://")
+                }
+                i.extendChartView({
+                    type: "liquidFill",
+                    render: function(e, t, a) {
+                        var n = this
+                          , s = this.group;
+                        s.removeAll();
+                        var h = e.getData()
+                          , d = h.getItemModel(0)
+                          , p = d.get("center")
+                          , u = d.get("radius")
+                          , c = a.getWidth()
+                          , g = a.getHeight()
+                          , v = Math.min(c, g)
+                          , f = 0
+                          , y = 0
+                          , m = e.get("outline.show");
+                        m && (f = e.get("outline.borderDistance"),
+                        y = l(e.get("outline.itemStyle.borderWidth"), v));
+                        var w, b, x, M = l(p[0], c), P = l(p[1], g), I = !1, S = e.get("shape");
+                        "container" === S ? (I = !0,
+                        b = [(w = [c / 2, g / 2])[0] - y / 2, w[1] - y / 2],
+                        x = [l(f, c), l(f, g)],
+                        u = [Math.max(b[0] - x[0], 0), Math.max(b[1] - x[1], 0)]) : (b = (w = l(u, v) / 2) - y / 2,
+                        x = l(f, v),
+                        u = Math.max(b - x, 0)),
+                        m && (Y().style.lineWidth = y,
+                        s.add(Y()));
+                        var L = I ? 0 : M - u
+                          , C = I ? 0 : P - u
+                          , T = null;
+                        s.add(function() {
+                            var t = E(u);
+                            t.setStyle(e.getModel("backgroundStyle").getItemStyle()),
+                            t.style.fill = null,
+                            t.z2 = 5;
+                            var a = E(u);
+                            a.setStyle(e.getModel("backgroundStyle").getItemStyle()),
+                            a.style.stroke = null;
+                            var r = new i.graphic.Group;
+                            return r.add(t),
+                            r.add(a),
+                            r
+                        }());
+                        var D = this._data
+                          , F = [];
+                        function E(e, t) {
+                            if (S) {
+                                if (o(S)) {
+                                    var a = i.graphic.makePath(S.slice(7), {})
+                                      , r = a.getBoundingRect()
+                                      , n = r.width
+                                      , l = r.height;
+                                    n > l ? (l *= 2 * e / n,
+                                    n = 2 * e) : (n *= 2 * e / l,
+                                    l = 2 * e);
+                                    var s = t ? 0 : M - n / 2
+                                      , h = t ? 0 : P - l / 2;
+                                    return a = i.graphic.makePath(S.slice(7), {}, new i.graphic.BoundingRect(s,h,n,l)),
+                                    t && (a.x = -n / 2,
+                                    a.y = -l / 2),
+                                    a
+                                }
+                                if (I) {
+                                    var d = t ? -e[0] : M - e[0]
+                                      , p = t ? -e[1] : P - e[1];
+                                    return i.helper.createSymbol("rect", d, p, 2 * e[0], 2 * e[1])
+                                }
+                                return d = t ? -e : M - e,
+                                p = t ? -e : P - e,
+                                "pin" === S ? p += e : "arrow" === S && (p -= e),
+                                i.helper.createSymbol(S, d, p, 2 * e, 2 * e)
+                            }
+                            return new i.graphic.Circle({
+                                shape: {
+                                    cx: t ? 0 : M,
+                                    cy: t ? 0 : P,
+                                    r: e
+                                }
+                            })
+                        }
+                        function Y() {
+                            var t = E(w);
+                            return t.style.fill = null,
+                            t.setStyle(e.getModel("outline.itemStyle").getItemStyle()),
+                            t
+                        }
+                        function k(t, a, n) {
+                            var o = I ? u[0] : u
+                              , s = I ? g / 2 : u
+                              , d = h.getItemModel(t)
+                              , p = d.getModel("itemStyle")
+                              , c = d.get("phase")
+                              , v = l(d.get("amplitude"), 2 * s)
+                              , f = l(d.get("waveLength"), 2 * o)
+                              , y = s - h.get("value", t) * s * 2;
+                            c = n ? n.shape.phase : "auto" === c ? t * Math.PI / 4 : c;
+                            var m = p.getItemStyle();
+                            if (!m.fill) {
+                                var w = e.get("color")
+                                  , b = t % w.length;
+                                m.fill = w[b]
+                            }
+                            var x = new r({
+                                shape: {
+                                    waveLength: f,
+                                    radius: o,
+                                    radiusY: s,
+                                    cx: 2 * o,
+                                    cy: 0,
+                                    waterLevel: y,
+                                    amplitude: v,
+                                    phase: c,
+                                    inverse: a
+                                },
+                                style: m,
+                                x: M,
+                                y: P
+                            });
+                            x.shape._waterLevel = y;
+                            var S = d.getModel("emphasis.itemStyle").getItemStyle();
+                            S.lineWidth = 0,
+                            x.ensureState("emphasis").style = S,
+                            i.helper.enableHoverEmphasis(x);
+                            var L = E(u, !0);
+                            return L.setStyle({
+                                fill: "white"
+                            }),
+                            x.setClipPath(L),
+                            x
+                        }
+                        function q(e, t, a) {
+                            var i = h.getItemModel(e)
+                              , r = i.get("period")
+                              , n = i.get("direction")
+                              , l = h.get("value", e)
+                              , o = i.get("phase");
+                            o = a ? a.shape.phase : "auto" === o ? e * Math.PI / 4 : o;
+                            var s, d;
+                            s = "auto" === r ? 0 === (d = h.count()) ? 5e3 : 5e3 * (.2 + (d - e) / d * .8) : "function" == typeof r ? r(l, e) : r;
+                            var p = 0;
+                            "right" === n || null == n ? p = Math.PI : "left" === n ? p = -Math.PI : "none" === n ? p = 0 : console.error("Illegal direction value for liquid fill."),
+                            "none" !== n && i.get("waveAnimation") && t.animate("shape", !0).when(0, {
+                                phase: o
+                            }).when(s / 2, {
+                                phase: p + o
+                            }).when(s, {
+                                phase: 2 * p + o
+                            }).during((function() {
+                                T && T.dirty(!0)
+                            }
+                            )).start()
+                        }
+                        h.diff(D).add((function(t) {
+                            var a = k(t, !1)
+                              , r = a.shape.waterLevel;
+                            a.shape.waterLevel = I ? g / 2 : u,
+                            i.graphic.initProps(a, {
+                                shape: {
+                                    waterLevel: r
+                                }
+                            }, e),
+                            a.z2 = 2,
+                            q(t, a, null),
+                            s.add(a),
+                            h.setItemGraphicEl(t, a),
+                            F.push(a)
+                        }
+                        )).update((function(t, a) {
+                            for (var r = D.getItemGraphicEl(a), l = k(t, !1, r), d = {}, p = ["amplitude", "cx", "cy", "phase", "radius", "radiusY", "waterLevel", "waveLength"], u = 0; u < p.length; ++u) {
+                                var c = p[u];
+                                l.shape.hasOwnProperty(c) && (d[c] = l.shape[c])
+                            }
+                            var v = {}
+                              , f = ["fill", "opacity", "shadowBlur", "shadowColor"];
+                            for (u = 0; u < f.length; ++u)
+                                c = f[u],
+                                l.style.hasOwnProperty(c) && (v[c] = l.style[c]);
+                            I && (d.radiusY = g / 2),
+                            i.graphic.updateProps(r, {
+                                shape: d,
+                                x: l.x,
+                                y: l.y
+                            }, e),
+                            e.isUniversalTransitionEnabled && e.isUniversalTransitionEnabled() ? i.graphic.updateProps(r, {
+                                style: v
+                            }, e) : r.useStyle(v);
+                            var y = r.getClipPath()
+                              , m = l.getClipPath();
+                            r.setClipPath(l.getClipPath()),
+                            r.shape.inverse = l.inverse,
+                            y && m && n._shape === S && !o(S) && i.graphic.updateProps(m, {
+                                shape: y.shape
+                            }, e, {
+                                isFrom: !0
+                            }),
+                            q(t, r, r),
+                            s.add(r),
+                            h.setItemGraphicEl(t, r),
+                            F.push(r)
+                        }
+                        )).remove((function(e) {
+                            var t = D.getItemGraphicEl(e);
+                            s.remove(t)
+                        }
+                        )).execute(),
+                        d.get("label.show") && s.add(function(t) {
+                            var a = d.getModel("label");
+                            var r, n, l, o = {
+                                z2: 10,
+                                shape: {
+                                    x: L,
+                                    y: C,
+                                    width: 2 * (I ? u[0] : u),
+                                    height: 2 * (I ? u[1] : u)
+                                },
+                                style: {
+                                    fill: "transparent"
+                                },
+                                textConfig: {
+                                    position: a.get("position") || "inside"
+                                },
+                                silent: !0
+                            }, s = {
+                                style: {
+                                    text: (r = e.getFormattedLabel(0, "normal"),
+                                    n = 100 * h.get("value", 0),
+                                    l = h.getName(0) || e.name,
+                                    isNaN(n) || (l = n.toFixed(0) + "%"),
+                                    null == r ? l : r),
+                                    textAlign: a.get("align"),
+                                    textVerticalAlign: a.get("baseline")
+                                }
+                            };
+                            Object.assign(s.style, i.helper.createTextStyle(a));
+                            var p = new i.graphic.Rect(o)
+                              , c = new i.graphic.Rect(o);
+                            c.disableLabelAnimation = !0,
+                            p.disableLabelAnimation = !0;
+                            var g = new i.graphic.Text(s)
+                              , v = new i.graphic.Text(s);
+                            p.setTextContent(g),
+                            c.setTextContent(v);
+                            var f = a.get("insideColor");
+                            v.style.fill = f;
+                            var y = new i.graphic.Group;
+                            y.add(p),
+                            y.add(c);
+                            var m = E(u, !0);
+                            return (T = new i.graphic.CompoundPath({
+                                shape: {
+                                    paths: t
+                                },
+                                x: M,
+                                y: P
+                            })).setClipPath(m),
+                            c.setClipPath(T),
+                            y
+                        }(F)),
+                        this._shape = S,
+                        this._data = h
+                    },
+                    dispose: function() {}
+                })
+            }
+            ,
+            83: t => {
+                t.exports = e
+            }
+        }
+          , a = {};
+        function i(e) {
+            if (a[e])
+                return a[e].exports;
+            var r = a[e] = {
+                exports: {}
+            };
+            return t[e](r, r.exports, i),
+            r.exports
+        }
+        return i.r = e => {
+            "undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, {
+                value: "Module"
+            }),
+            Object.defineProperty(e, "__esModule", {
+                value: !0
+            })
+        }
+        ,
+        i(245)
+    }
+    )()
+}
+));
+//# sourceMappingURL=echarts-liquidfill.min.js.map

Datei-Diff unterdrückt, da er zu groß ist
+ 34 - 0
projects/src/main/webapp/asset/lib/echarts/5.6.0/echarts.min.js


+ 78 - 33
projects/src/main/webapp/vmodules/leftMenu.jsp

@@ -3,6 +3,49 @@
 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
 <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
 <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
+<style>
+    .layui-layout-admin.frame
+        .layui-side .layui-nav .layui-nav-item.layui-nav-itemed
+        .layui-nav-child dd > a {
+        display: flex;
+        justify-content: space-between;
+        width: 100%;
+    }
+    .layui-layout-admin.frame
+        .layui-side .layui-nav .layui-nav-item.layui-nav-itemed
+        .layui-nav-child dd > a .layui-icon {
+        text-indent: 0;
+    }
+    .layui-layout-admin.frame
+        .layui-side .layui-nav .layui-nav-item.layui-nav-itemed
+        dd.layui-nav-itemed > a {
+        background: linear-gradient(85deg, #0073E9 0%, #4CA5FF 100%);
+    }
+    .layui-layout-admin.frame
+        .layui-side .layui-nav .layui-nav-item.layui-nav-itemed
+        dd.layui-nav-itemed > a:hover {
+        color: #fff !important;
+    }
+    .layui-layout-admin.frame
+        .layui-side .layui-nav .layui-nav-child > dd {
+        padding: 1px 0 0 10px;
+    }
+    .layui-layout-admin.frame
+        .layui-side .layui-nav
+        .layui-nav-item.layui-nav-itemed
+        .layui-nav-child > dd
+        .layui-icon {
+        transform: rotate(0deg)
+    }
+    .layui-layout-admin.frame
+        .layui-side .layui-nav
+        .layui-nav-item.layui-nav-itemed
+        .layui-nav-child > dd.layui-nav-itemed
+        .layui-icon {
+        color: #fff;
+        transform: rotate(-180deg);
+    }
+</style>
 <!-- 左侧导航区域 -->
 <div id="leftMenu" class="layui-side left_menu" :class="{close: collapse}">
     <!-- <div class="top_menu" @click="changeSide" v-if="collapse"></div> -->
@@ -33,7 +76,10 @@
                     >
                         <a :title="it.txt" href="javascript:;"
                            @click="onSelectItem(index,ind)"
-                        >{{it.txt}}</a>
+                        >
+                            {{it.txt}}
+                            <i class="layui-icon layui-icon-down" v-if="it.child != null"></i>
+                        </a>
 
                         <!-- 三级菜单 -->
                         <dl class="layui-nav-child" v-if="it.child != null">
@@ -186,40 +232,39 @@
                             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'
+                                }
 
+                            ]
+                        },
                     ]
                 },
                 {

+ 152 - 41
projects/src/main/webapp/vmodules/statics/analysisScreen_four.jsp

@@ -609,8 +609,8 @@
 
 </div>
 
-<script src="https://cdn.jsdelivr.net/npm/echarts@5.6.0/dist/echarts.min.js"></script>
-<script src="https://cdn.jsdelivr.net/npm/echarts-liquidfill@3.1.0/dist/echarts-liquidfill.min.js"></script>
+<script src="${WebSite.asset}/lib/echarts/5.6.0/echarts.min.js"></script>
+<script src="${WebSite.asset}/lib/echarts/5.6.0/echarts-liquidfill.min.js"></script>
 <script>
     var checkRate=0; //备案核准率
     var openRate=0;  //开工率
@@ -722,9 +722,10 @@
         }, function(res) {
             // 绑定数据到页面
             if (res.success) {
+                console.log('res.data: ', res.data)
                 hyData = res.data.map(item => ({
                     value: item.zb, // 使用 amt 作为 value
-                    name: item.title, // 使用 title 作为 name
+                    name: item.title + (item.id ? '_' + item.id : ''), // 使用 title 作为 name
                 }));
 
                 initHy();
@@ -892,79 +893,189 @@
                 trigger: 'item',
                 formatter: '{b}: {c} ({d}%)'
             },
+            color: ['#1b9b06', '#dc1718', '#9908d7', '#faca1e',
+                '#FEE23D', '#249766', '#FF2123', '#C13DFF',],
             series: [
                 {
-                    name: '饼图示例',
+                    name: '饼图',
                     type: 'pie',
-                    radius: ['50%', '80%'],
-                    avoidLabelOverlap: false,
+                    radius: ['35%', '65%'],
+                    center: ['50%', '50%'],
+                    avoidLabelOverlap: true,
                     labelLine: {
-                        length: 5,
-                        length2: 30,
+                        length: 15,
                         // maxSurfaceAngle: 80
+                        showAbove: true,
+                        lineStyle: {
+                            width: 2,
+                            color: '#59c9ff',
+                            shadowColor: '#555',
+                            shadowBlur: 1,
+                            shadowOffsetY: 1
+                        }
                     },
-                    color: ['#FEE23D', '#249766', '#FF2123', '#C13DFF',],
-
                     label: {
-                        // alignTo: 'edge',
+                        alignTo: 'edge',
                         position: 'outside',
                         // margin: 2,
                         formatter: '{data|{c}}{unit| %}\n{name|{b}}',
-                        minMargin: 0,
                         edgeDistance: 0,
-                        lineHeight: 15,
                         rich: {
                             data: {
-                                fontSize: 18,
+                                fontSize: 14,
                                 color: '#fff'
                             },
                             unit: {
-                                fontSize: 12,
+                                fontSize: 10,
                                 color: '#fff'
                             },
                             name: {
-                                fontSize: 12,
+                                fontSize: 11,
                                 color: '#fff'
                             }
                         }
                     },
-
+                    labelLayout: {
+                      moveOverlap: 'shiftY',
+                    },
                     itemStyle: {
-                        // borderWidth: 5,
-                        // borderColor: '#2971e0',
+                        // borderWidth: 1,
+                        // borderColor: '#7e7e7e',
                     },
-                    data: hyData,
-                    emphasis: {
-                        itemStyle: {
-                            shadowBlur: 200,
-                            shadowOffsetX: 0,
-                            shadowOffsetY: 0,
-                            shadowColor: '#296edf'
+                    data: hyData.map((item, index) => (
+                        {
+                            ...item,
+                            itemStyle: {
+                                color: [
+                                    {
+                                        type: 'radial',
+                                        x: 0.5,
+                                        y: 0.5,
+                                        r: 0.5,
+                                        colorStops: [
+                                            {offset: 0, color: '#1bb705'},
+                                            {offset: 1, color: '#157c09'}
+                                        ]
+                                    },
+                                    {
+                                        type: 'radial',
+                                        x: 0.5,
+                                        y: 0.5,
+                                        r: 0.5,
+                                        colorStops: [
+                                            {offset: 0, color: '#f72122'},
+                                            {offset: 1, color: '#a00104'}
+                                        ]
+                                    },
+                                    {
+                                        type: 'radial',
+                                        x: 0.5,
+                                        y: 0.5,
+                                        r: 0.5,
+                                        colorStops: [
+                                            {offset: 0, color: '#55109f'},
+                                            {offset: 1, color: '#540b94'}
+                                        ]
+                                    },
+                                    {
+                                        type: 'radial',
+                                        x: 0.5,
+                                        y: 0.5,
+                                        r: 0.5,
+                                        colorStops: [
+                                            {offset: 0, color: '#fcd62c'},
+                                            {offset: 1, color: '#f4b70c'}
+                                        ]
+                                    },
+                                ][index]
+                            }
                         }
+                    )),
+                    emphasis: {
+                        // itemStyle: {
+                        //     shadowBlur: 200,
+                        //     shadowOffsetX: 0,
+                        //     shadowOffsetY: 0,
+                        //     shadowColor: '#296edf'
+                        // }
                     },
-
                 }
                 , {
-                    name: '外边框',
+                    name: '内圈',
                     type: 'pie',
-                    clockWise: false,
-                    radius: ['83%', '83%'],//边框大小
-                    center: ['50%', '50%'],//边框位置
-                    // radius: ['80%', '85%'],
-                    data: [{
-                        value: 10,
-                        itemStyle: {
-                            normal: {
-                                borderWidth: 4,//设置边框粗细
-                                borderColor: '#2971e0'//边框颜色
+                    radius: ['25%', '35%'],//边框大小
+                    center: ['50%', '50%'],
+                    label: {
+                        show: false
+                    },
+                    itemStyle: {
+                        shadowBlur: 5,
+                        shadowColor: '#142213'
+                    },
+                    data: hyData.map((item, index) => (
+                        {
+                            ...item,
+                            itemStyle: {
+                                color: [
+                                    {
+                                        type: 'linear',
+                                        x: 0,
+                                        y: 0,
+                                        x2: 1,
+                                        y2: -1,
+                                        colorStops: [
+                                            { offset: 0, color: '#0d5e2a' },
+                                            { offset: 1, color: '#0c4e22' }
+                                        ]
+                                    },
+                                    {
+                                        type: 'linear',
+                                        x: 0,
+                                        y: 0,
+                                        x2: 1,
+                                        y2: -1,
+                                        colorStops: [
+                                            { offset: 0, color: '#80152d' },
+                                            { offset: 1, color: '#720a23' }
+                                        ]
+                                    },
+                                    {
+                                        type: 'linear',
+                                        x: 0,
+                                        y: 0,
+                                        x2: 1,
+                                        y2: -1,
+                                        colorStops: [
+                                            { offset: 0, color: '#55109f' },
+                                            { offset: 1, color: '#540b94' }
+                                        ]
+                                    },
+                                    {
+                                        type: 'linear',
+                                        x: 0,
+                                        y: 0,
+                                        x2: 1,
+                                        y2: -1,
+                                        colorStops: [
+                                            { offset: 0, color: '#a27f25' },
+                                            { offset: 1, color: '#ae821d' }
+                                        ]
+                                    },
+                                ][index]
                             }
                         }
-                    }]
+                    )),
+                    emphasis: {
+                        disabled: true,
+                        scale: false,
+                        label: {
+                            show: false
+                        }
+                    },
                 },
             ],
-
         };
-
+        console.log('option: ', option);
         myChart5.setOption(option);
         // 监听窗口大小变化,动态调整图表大小
         window.addEventListener('resize', function() {

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

@@ -335,6 +335,7 @@
         <span title="编辑" lay-event="toEditSubInfo" class="no-wrap">&nbsp;编辑</span>
         {{#} }}
         <span title="转库" lay-event="move" class="no-wrap">转库</span>
+        <span title="移出4库" lay-event="removeFour" class="no-wrap">移出4库</span>
     </div>
 </script>
 
@@ -602,7 +603,7 @@
                                 return row.progress ? '<span class="cut" title="' + row.progress + '">' + row.progress + '</span>' : '';
                             }},
                         {field: 'remark', title: '备注', minWidth: 200},
-                        {title: '操作', width: 150, toolbar: '#toolBar', fixed: 'right'},
+                        {title: '操作', width: 200, toolbar: '#toolBar', fixed: 'right'},
                     ]],
                     fixed: true,
                     height: $(window).height() - $('#table1').offset().top - 50,
@@ -733,6 +734,19 @@
                     $(".top-breadcrumb").html(e.data.topBreadcrumb)
                 }
             },
+            removeFour(obj){
+                let self = this;
+                App.msg.confirm(`是否移除`, () => {
+                    App.postJson("/api/subject/subInfo/removeFour", {id: obj.data.id}, (res) => {
+                        if (res.success) {
+                            App.msg.success("移除成功");
+                            self.getData()
+                        } else {
+                            App.msg.error(res.message || "移除失败,请重试");
+                        }
+                    })
+                })
+            },
         }
     });
 </script>

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

@@ -542,6 +542,7 @@
         <span title="编辑" lay-event="toEditSubInfo" class="no-wrap">&nbsp;编辑</span>
         {{#} }}
         <span title="入规" lay-event="rg" class="no-wrap">入规</span>
+        <span title="移出4库" lay-event="removeFour" class="no-wrap">移出4库</span>
     </div>
 </script>
 <script>
@@ -896,7 +897,7 @@
                                 return row.progress ? '<span class="cut" title="' + row.progress + '">' + row.progress + '</span>' : '';
                             }},
                         {field: 'remark', title: '备注', minWidth: 150},
-                        {title: '操作', width: 150, toolbar: '#toolBar', fixed: 'right'},
+                        {title: '操作', width: 200, toolbar: '#toolBar', fixed: 'right'},
                     ]],
                     fixed: true,
                     height: window.screen.availHeight - 470,
@@ -1188,7 +1189,20 @@
                 if (e.data.topBreadcrumb) {
                     $(".top-breadcrumb").html(e.data.topBreadcrumb)
                 }
-            }
+            },
+            removeFour(obj){
+                let self = this;
+                App.msg.confirm(`是否移除`, () => {
+                    App.postJson("/api/subject/subInfo/removeFour", {id: obj.data.id}, (res) => {
+                        if (res.success) {
+                            App.msg.success("移除成功");
+                            self.getData()
+                        } else {
+                            App.msg.error(res.message || "移除失败,请重试");
+                        }
+                    })
+                })
+            },
         }
     });
 </script>

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

@@ -696,6 +696,7 @@
         <span title="编辑" lay-event="toEditSubInfo" class="no-wrap">&nbsp;编辑</span>
         {{#} }}
         <span title="转库" lay-event="move" class="no-wrap">转库</span>
+        <span title="移出4库" lay-event="removeFour" class="no-wrap">移出4库</span>
     </div>
 </script>
 <script type="text/html" id="moveForm">
@@ -1167,7 +1168,7 @@
                                 return row.progress ? '<span class="cut" title="' + row.progress + '">' + row.progress + '</span>' : '';
                             }},
                         {field: 'remark', title: '备注', width: 200},
-                        {title: '操作', width: 150, toolbar: '#toolBar', fixed: 'right'},
+                        {title: '操作', width: 200, toolbar: '#toolBar', fixed: 'right'},
                     ]],
                     fixed: true,
                     height: window.screen.availHeight - 470,
@@ -1493,7 +1494,20 @@
                 if (e.data.topBreadcrumb) {
                     $(".top-breadcrumb").html(e.data.topBreadcrumb)
                 }
-            }
+            },
+            removeFour(obj){
+                let self = this;
+                App.msg.confirm(`是否移除`, () => {
+                    App.postJson("/api/subject/subInfo/removeFour", {id: obj.data.id}, (res) => {
+                        if (res.success) {
+                            App.msg.success("移除成功");
+                            self.getData()
+                        } else {
+                            App.msg.error(res.message || "移除失败,请重试");
+                        }
+                    })
+                })
+            },
         }
     });
 </script>

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

@@ -474,6 +474,7 @@
         <span title="编辑" lay-event="toEditSubInfo" class="no-wrap">&nbsp;编辑</span>
         {{#} }}
         <span title="转库" lay-event="move" class="no-wrap">转库</span>
+        <span title="移出4库" lay-event="removeFour" class="no-wrap">移出4库</span>
     </div>
 </script>
 
@@ -1001,7 +1002,7 @@
                         {field: 'preProceNum', title: '预计开工时间', width: 100, templet: '#date'},
                           {field: 'xmbaStatus', title: '前期手续办理情况', width: 160, templet: '#preInfo'},
                         {field: 'remark', title: '备注', width: 245, templet: '#remark'},
-                        {title: '操作', width: 150, toolbar: '#toolBar', fixed: 'right'},
+                        {title: '操作', width: 200, toolbar: '#toolBar', fixed: 'right'},
                     ]],
                     fixed: true,
                     height: window.screen.availHeight - 450,
@@ -1288,7 +1289,20 @@
                 if (e.data.topBreadcrumb) {
                     $(".top-breadcrumb").html(e.data.topBreadcrumb)
                 }
-            }
+            },
+            removeFour(obj){
+                let self = this;
+                App.msg.confirm(`是否移除`, () => {
+                    App.postJson("/api/subject/subInfo/removeFour", {id: obj.data.id}, (res) => {
+                        if (res.success) {
+                            App.msg.success("移除成功");
+                            self.getData()
+                        } else {
+                            App.msg.error(res.message || "移除失败,请重试");
+                        }
+                    })
+                })
+            },
         }
     });
 </script>

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

@@ -993,7 +993,7 @@
                         {field: 'endDate', title: '计划完工日期', minWidth: 100,
                             templet: (d)=> `<span class="new-roman">` +  d.endDate + `</span>`
                         },
-                        {title: '操作', minWidth: 150, toolbar: '#toolBar', fixed: 'right'},
+                        {title: '操作', width: 200, toolbar: '#toolBar', fixed: 'right'},
                     ]],
                     fixed: true,
                     height: $(window).height() - $('#table1').offset().top - 50,

Einige Dateien werden nicht angezeigt, da zu viele Dateien in diesem Diff geändert wurden.